Model Element |
|||||||||||||||||||||||||||||||||||||||||||||||
Description |
|||||||||||||||||||||||||||||||||||||||||||||||
Force_FlexModal defines a distributed force on a flexible body. The distributed load has two components:
|
|||||||||||||||||||||||||||||||||||||||||||||||
Format |
|||||||||||||||||||||||||||||||||||||||||||||||
<Force_FlexModal id = "integer" flex_body_id = "integer"
{ case_idx | case_id = "integer" scale_expr = "string"
usrsub_param_string = "User(par_1, ... par_N)" usrsub_dll_name = "string" [ usrsub_fnc_name = "string" force_sub = "TRUE" | "FALSE" ] usrsub_param_string = "User(par_1, ... par_N)" interpreter = "string" script_name = "string" [ usrsub_fnc_name = "string" force_sub = "TRUE" | "FALSE" ] } /> |
|||||||||||||||||||||||||||||||||||||||||||||||
Attributes |
|||||||||||||||||||||||||||||||||||||||||||||||
id |
Specifies the element identification number of the Force_FlexModal element. This number should be unique among all Force_FlexModal elements. This parameter is mandatory. Range: integer > 0 |
||||||||||||||||||||||||||||||||||||||||||||||
flex_body_id |
Specifies the ID of the flexible body on which this force acts. This parameter is mandatory. Range: integer > 0 |
||||||||||||||||||||||||||||||||||||||||||||||
case_idx |
Specifies the modal load case number that is used to define the shape of the distributed load. Load cases are stored in the XML input deck in a Reference_FlexData modeling element. A separate ModeLoad block within the Reference_FlexData contains all the load cases. Range: integer >= 0 |
||||||||||||||||||||||||||||||||||||||||||||||
case_id |
Specifies the modal load case ID that is used to define the shape of the distributed load. Load cases are stored in the XML input deck in a Reference_FlexData modeling element. A separate ModeLoad block within the Reference_FlexData contains all the load cases. The difference between an ID and an Index is that indices are required to be contiguous whereas IDs are not. Range: integer > 0 |
||||||||||||||||||||||||||||||||||||||||||||||
scale_expr |
Specifies an expression evaluated to a scalar quantity. The load case is multiplied by the run-time value of the expression to generate the distributed load acting on the flexible body. Scale_expr can be a constant, a function of time or a function of state. It is required to be continuous. |
||||||||||||||||||||||||||||||||||||||||||||||
usrsub_param_string |
This keyword defines a list of parameters that are passed from the data file to the user-written subroutine. Use this keyword only when a user-written subroutine is to be defined. |
||||||||||||||||||||||||||||||||||||||||||||||
usrsub_fnc_name |
This keyword specifies name of the function that contains the definition of the distributed force. This function may be written in Fortran, C, C++ or Python. |
||||||||||||||||||||||||||||||||||||||||||||||
usrsub_dll_name |
Specifies the path and name of the DLL or shared library containing the user subroutine. MotionSolve uses this information to load the user subroutine in the DLL at run time. |
||||||||||||||||||||||||||||||||||||||||||||||
force_sub |
A Boolean that specifies whether the user subroutine returns a shape that is to be scaled or the actual force itself. Range: “TRUE” or “FALSE” |
||||||||||||||||||||||||||||||||||||||||||||||
interpreter |
Specifies the interpreted language that the user script is written in. Range: “Matlab” or “Python” |
||||||||||||||||||||||||||||||||||||||||||||||
script_name |
Specifies the path and name of the user-written script that contains the routine specified by usrsub_fnc_name. |
||||||||||||||||||||||||||||||||||||||||||||||
Comments |
|||||||||||||||||||||||||||||||||||||||||||||||
The finite element package responsible for creating the flexible body generates the mode shapes through a process known as component mode synthesis. Since it knows about the modes of the flexible body it is able to transform a NODAL load description to a MODAL load description. The process for creating distributed forces in HyperWorks is illustrated in Figure 1 below. Figure-1: The Process For Creating And Analyzing Distributed Loads in HyperWorks
This method can be used when the modal load shape has been parameterized in terms of quantities available in the multi-body model. In this scenario, you just need to specify the flexible body on which the modal force acts, the load case that you wish to use, and an expression defining the scale factor. The example below illustrates this option.
<Force_FlexModal id = “101” flex_body_id = “34” case_idx = “4” scale_expr = “Pi*Pitch(1015)*Vx(1015)*Vx(1015)” />
This method is used when the scale factor is not a simple expression as shown in option-1. In this case, the complex calculations for determining the scale factor may be embedded in a Python script or a compiled Fortran/C function. The example below illustrates how Force_FlexModal is specified in a Python script.
<Force_FlexModal id = “101” flex_body_id = “34” usrsub_param_string = “User(1015)” interpreter = “Python” usrsub_fnc_name = “Lift_and_Drag” script_name = “/Users/MotionSolve/Example/lift.py” force_sub = “FALSE” /> The user subroutine returns two quantities:
MotionSolve uses the above information to apply the distributed load to the flexible body. You are allowed to use SYSFNC and SYSARY to access the instantaneous state of the system and use it to define the scale factor.
This method is used when load shape is not available in the Flex-H3D file. This could be for a variety of reasons - one of these is that your finite element solver does not know how to generate a Flex-H3D file. The distributed load is calculated as:
The user subroutine returns two quantities:
MotionSolve uses the above information to apply the distributed load to the flexible body. The example below illustrates how Force_FlexModal is specified in the case when the user subroutine is written in a compiled language like Fortran, C or C++.
<Force_FlexModal id = “101” flex_body_id = “34” usrsub_param_string = “User(1015)” usrsub_fnc_name = “Lift_and_Drag” usrsub_dll_name = “/Users/MotionSolve/Example/lift.so” force_sub = “FALSE” />
MotionSolve uses the above information to apply the distributed load to the flexible body. The example below illustrates how Force_FlexModal is specified in the case when the user subroutine is written in Python.
<Force_FlexModal id = “101” flex_body_id = “34” usrsub_param_string = “User(1015)” interpreter = “Python” usrsub_fnc_name = “Lift_and_Drag” script_name = “/Users/MotionSolve/Example/lift.py” force_sub = “FALSE” />
|
|||||||||||||||||||||||||||||||||||||||||||||||
Example |
|||||||||||||||||||||||||||||||||||||||||||||||
A distributed load acting on a rectangular plate is used as an example to explain how the process illustrated in Figure-1 is implemented. Figure-2 below is the schematic of the system to be analyzed. Figure-2: The Plate Model The FE Input file corresponding to the plate and the distributed load is shown in Figure-3.
ASET1 123 111 121 1 11 ASET1 123456 61
FORCE 7 56 01.0 0.0 0.0 -506.72 FORCE 7 67 01.0 0.0 0.0 -506.72 FORCE 7 78 01.0 0.0 0.0 -506.72 FORCE 7 89 01.0 0.0 0.0 -506.72 FORCE 7 100 01.0 0.0 0.0 -506.72 FORCE 7 11 01.0 0.0 0.0 -253.36 FORCE 7 1 01.0 0.0 0.0 -253.36 FORCE 7 121 01.0 0.0 0.0 -253.36 FORCE 7 111 01.0 0.0 0.0 -253.36
CMSMETH 8 CB 29 LOADSET BOTH 7
The total number of models calculated for this case will be 48. There will be 4*3 + 1*6 static modes corresponding to the two sets of the ASET1 card defined. One additional static mode corresponding to the LOADSET and 29 dynamic modes as requested in the CMSMETH card.
Number of Modes = 4*3 + 1*6 + 1 + 29 = 48
RADIOSS performs its analysis and generates a Flex-H3D file that defines the modal flex body. In addition to the standard CMS data, the Flex-H3D file also contains the distributed load - now defined in the modal domain. MotionSolve reads the Flex-H3D file and places the modal load definition in the ModeLoad section of the Reference_FlexData block. This is shown in Figure 3 below. Figure-3: The ModeLoad section of Reference_FlexData Block in the XML Input File The ModeLoad section in the Reference_FlexData block of the MotionSolve XML input file specifies the different load-cases that are available for use. The plate model has 3 load-cases. Each load-case has an ID or an Index.
The load-case represents a load shape, it needs to be scaled by a scale factor to obtain the true load on the plate. Each load-case consists of 6+N numbers.
Figure 4 shows the z-displacement of Node 61, which is located at the center of the plate. Since a constant load is acting on the plate and damping included, the expectation should be that the oscillations of any node should eventually be dissipated. This is exactly what is seen. Figure-4: The Z Displacement And Velocity Of Node 61 Compared To A Reference Result Figure 5 shows the deformation contour of the plate at T=0.45s. Figure-5: The Z deformation contour of the plate |
Model Element |
|
Description |
|
MFORCE defines a distributed force on a flexible body (CMS) in MotionSolve. |
|
Declaration |
|
def MFORCE(id, LABEL= “”, FLEX_BODY=”” , CASE_INDEX= “”, SCALE= "", ROUTINE= "", FUNCTION= "", FORCE= "", INTERPRETER= "", SCRIPT= ""): |
|
Attributes |
|
id |
Element identification number (integer>0). This number is unique among all MFORCE elements. |
LABEL |
The name of the MFORCE element. |
FLEX_BODY |
Defines the ID of a flex body on which the modal load is applied. |
CASE_INDEX |
Specifies the modal load case number that is used to define the shape of the distributed load. |
SCALE |
Specify an expression for the scale factor to be applied to the load case referenced by CASE_INDEX. |
ROUTINE |
Specify an alternative library and name for the user subroutine MFOSUB. |
FUNCTION |
Specify user-defined constants that are passed to the MFOSUB. |
FORCE |
A string that specifies whether the user subroutine returns a shape that is to be scaled or the actual force itself. Set this to USER to specify that the MFOSUB returns the actual force. |
INTERPRETER |
Specifies the interpreted language that the user script is written in. Valid choices are MATLAB or PYTHON. |
SCRIPT |
Specifies the path and name of the user written script that contains the routine. |
CommentsSee Force_FlexModal |
|
ExampleThe example below shows a definition of a MFORCE. MFORCE(1,LABEL="MFORCE_1",FLEX_BODY=30102,CASE_INDEX=1,SCALE="1.0+0.2*sin(360d*time)+0.1*sin(360d*time*3)") |
See Also: