Force: FlexModal
Model ElementForce_FlexModalは、弾性体上の分布力を定義します。
説明
- 剛体成分。これが作用する弾性体を加速させる傾向があります。
- モード成分。これが作用する弾性体を変形させる傾向があります。
フォーマット
<Force_FlexModal
Id = "integer"
flex_body_id = "integer"
{
case_idx | case_id = "integer"
scale_expr = "string"
[
usrsub_dll_name = "string"
usrsub_fnc_name = "string”
usrsub_param_string = "User(par_1, ... par_N)"
|
Interpreter = { "PYTHON" | "MATLAB" }
script_name = "string"
usrsub_fnc_name = "string"
usrsub_param_string = "User(par_1, ... par_N)"
]
[
force_sub = "TRUE" | "FALSE"
]
}
/>
属性
- id
- Force_FlexModal要素の要素識別番号を指定します。この番号は、すべてのForce_FlexModal要素の中で一意である必要があります。このパラメータは必須です。
- flex_body_id
- この力が作用する弾性体のIDを指定します。このパラメータは必須です。
- case_idx
- 分布荷重の形状を定義するために使用されるモード荷重ケース番号を指定します。荷重ケースは、Reference_FlexDataモデリング要素内のXML入力デックに格納されます。Reference_FlexData内の別個のModeLoadブロックに、すべての荷重ケースが含まれています。
- case_id
- 分布荷重の形状を定義するために使用されるモード荷重ケースIDを指定します。荷重ケースは、Reference_FlexDataモデリング要素内のXML入力デックに格納されます。Reference_FlexData内の別個のModeLoadブロックに、すべての荷重ケースが含まれています。IDとインデックスの違いは、インデックスは連続している必要がありますが、IDはその必要がないことです。
- scale_expr
- スカラー量に評価される式を指定します。荷重ケースがこの式の実行時の値で乗算されることで、弾性体に作用する分布荷重が生成されます。scale_exprには、定数、時間の関数、または状態の関数を指定できます。これは連続している必要があります。
- usrsub_param_string
- このキーワードは、データファイルからユーザー作成サブルーチンに渡されるパラメータのリストを定義します。このキーワードは、ユーザー作成サブルーチンを定義する場合にのみ使用します。
- usrsub_fnc_name
- このキーワードは、分布力の定義を含む関数の名前を指定します。この関数は、Fortran、C、C++、またはPythonで記述できます。
- usrsub_dll_name
- ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンを読み込みます。
- force_sub
- ユーザーサブルーチンが、実際の力を返すべきか(TRUE)、それともスケーリングされる形状を返すべきか(FALSE)を指定するブール値です。
- interpreter
- ユーザースクリプトが記述されたインタープリタ型言語を指定します。
- script_name
- usrsub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。
例
ここでは、長方形プレートに作用する分布荷重を例として使用し、図 5で示しているプロセスの実装方法を説明します。 図 1 は、解析対象システムの概略図です。

図 1. プレートモデル
このプレートと分布荷重に対応するFE入力ファイルを図 2に示します。
- 5つの取り付け節点、4つのコーナー節点(1、11、111、121)、および1つの中心節点(61)が定義されています。
ASET1 123 111 121 1 11 ASET1 123456 61
- 次のようにポイント荷重がすべての節点に適用されます。
- コーナー節点上の負のZ軸に沿って、253.36Nの力が適用されます。
- プレートのエッジ上の節点に沿った負のZ軸に沿って、506.72Nの力が適用されます。
- すべての内部節点に対して、1013.4Nの力が適用されます。
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カードでCraig-BamptonのCMSオプションが選択され、力がLOADSETとして適用されます。
CMSMETH 8 CB 29 LOADSET BOTH 7
このケースで計算されるモードの総数は48になります。定義された2セットのASET1カードに対応する4*3 + 1*6個の静的モードが存在します。LOADSETに対応する1つの追加の静的モードと、CMSMETHカード内で要求された29個の動的モードがあります。
モード数= 4*3 + 1*6 + 1 + 29 = 48
- CMSMETHカードのLOADSET部分で定義された荷重がモード空間に投影され、MBDソルバーで使用されるFlex H3Dファイルにモード荷重情報が書き込まれます。
OptiStructは解析を実行して、モード弾性体を定義するFlex H3Dファイルを生成します。Flex H3Dファイルには、標準のCMSデータに加えて、現在モード領域内で定義されている分布荷重も含まれています。MotionSolveはFlex H3Dファイルを読み取り、Reference_FlexDataブロックのModeLoadセクションにモード荷重定義を配置します。これを図 2に示します。

MotionSolve XML入力ファイルのReference_FlexDataブロック内のModeLoadセクションでは、使用できるさまざまな荷重ケースが指定されています。プレートモデルには3つの荷重ケースがあります。各荷重ケースには、IDまたはインデックスが割り当てられています。
- ModeLoadデータがAdams MNFから取得された場合は、荷重ケースのインデックスを使用できます。
- このデータがFlex H3Dファイルから取得された場合は、荷重ケースのIDを使用できます。この例では、荷重ケースはOptiStructから取得されたため、荷重ケースのIDを使用できます。
荷重ケースは荷重形状を表します。プレートにかかる実際の荷重を取得するには、これをスケールファクターによってスケーリングする必要があります。各荷重ケースは6+N個の数字からなります。
- 先頭の6個の数字(黄赤色でハイライト表示)は剛体の荷重です。プレートモデルでは、FZ、TX、TYはゼロでない値です。
- 続くN個の数字は、各モードの運動方程式に対する寄与度です。プレートは42個のモードによって表されていたため、この例ではN=42です。
図 3 は、プレートの中心に配置されている節点61のz方向の変位を示しています。一定の荷重がプレートに作用しており、減衰が含まれているため、どの節点の振動も最終的には消失することが予想されます。これは表示されているとおりです。
図 3. 基準結果と比較した節点61のZ方向の変位と速度
図 4 は、T=0.45sにおけるプレートの変形コンターを示しています。

図 4. プレートのZ方向の変形コンター
コメント
- Force_FlexModalを使用すると、弾性体に分布荷重を適用できます。この分布荷重となり得るのは、空力荷重、液体圧、熱荷重、電磁力、または弾性体全体に広がる任意の力生成メカニズムです(不均一な減衰や粘弾性など)。この要素を使用して、2つのボディ間の接触力をモデル化することもできます。最後のシナリオでは、Force_FlexModalは、接触に関わっている弾性体の1つに作用している分布力を表します。
- 力はモード領域内で定義されます。力を定義し、その影響を計算するには、この方法が効率的です。ただしこの場合は、有限要素パッケージ内で、分布荷重が物理領域(力が初期定義された場所)から実行されるモード領域に変換される必要があります。
弾性体の作成を担う有限要素パッケージは、区分モード合成として知られるプロセスを通じてモード形状を生成します。このパッケージは弾性体のモードについてわかっているため、NODAL荷重記述をMODAL荷重記述に変換できます。
HyperWorksで分布力を作成するプロセスを図 5に示します。
図 5. HyperWorksで分布荷重を作成し、解析するプロセス - 弾性体のモード形状として
を定義し、弾性体に作用する節点荷重として
を定義した場合、弾性体上の等価モード荷重
は次のように定義されます:
には、弾性体を記述するモード一式の一部しか含まれていないため、
で表される量は、節点からモードへの変換時に失われます。CMS手法が正しく使用された場合、残差
は少量です。
- 節点からモードベースへの変換を行っても、弾性体に作用する合成力は失われません。この合成力は、通常剛体のモーションを弾性体に与えます。
- ユーザーサブルーチンによって返される荷重ケースまたは荷重ベクトルの最初の6つの成分には、この剛性力が含まれています。これらは次のように定義されます:
- 1 = 弾性体のLPRFマーカーのX軸に沿って作用する力
- 2 = 弾性体のLPRFマーカーのY軸に沿って作用する力
- 3 = 弾性体のLPRFマーカーのZ軸に沿って作用する力
- 4 = 弾性体のLPRFマーカーのX軸周りに作用するトルク
- 5 = 弾性体のLPRFマーカーのY軸周りに作用するトルク
- 6 = 弾性体のLPRFマーカーのZ軸周りに作用するトルク
- 分布力が熱荷重やモード減衰力などの内部荷重を表している場合、荷重ケースの最初の6つの成分(剛体成分)はゼロです。
- Force_FlexModalは非常に多くの用途に適用できます。これは、分布荷重を定義するための多くのオプションを提供します。これらについて以下に説明します。
- オプション1:時間または状態に依存する式で定義されたスケールファクター
この方法は、モード荷重形状がマルチボディモデルで使用できる値としてパラメータ化されている場合に使用できます。このシナリオでは、指定する必要があるのは、モード力が作用する弾性体、使用する荷重ケース、およびスケールファクターを定義する式だけです。次の例は、このオプションを示しています。
<Force_FlexModal id = "101" flex_body_id = "34" case_idx = "4" scale_expr = "Pi*Pitch(1015)*Vx(1015)*Vx(1015)" />
- オプション2:ユーザーサブルーチンで定義されたスケールファクター
この方法は、スケールファクターがオプション1のようにシンプルな式ではない場合に使用されます。このケースでは、スケールファクターを決定するための複雑な計算を、PythonスクリプトやコンパイルされたFortran/C関数に埋め込むことができます。次の例は、PythonスクリプトでForce_FlexModalを指定する方法を示しています。
<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" />
ユーザーサブルーチンは次の2つの値を返します:- 荷重ケースのインデックス
- スケールファクター
MotionSolveは上記の情報を使用して、分布荷重を弾性体に適用します。SYSFNCとSYSARYを使用して、システムの瞬間的な状態にアクセスし、これを使用してスケールファクターを定義できます。
- オプション3:ユーザーサブルーチンでの分布荷重の形状とスケールの定義 この方法は、荷重形状がFlex H3Dファイルに含まれていない場合に使用されます。これにはさまざまな理由が考えられますが、理由の1つとしては、お使いの有限要素ソルバーがFlex H3Dファイルの生成方法を知らないことが挙げられます。分布荷重は次の式によって計算されます:
。ここで、qはシステム状態、xは分布荷重が作用する空間領域、tは独立変数である時間です。
ユーザーサブルーチンは次の2つの値を返します:
- スケールファクター、Scale(q,t)。SYSFNCとSYSARYを使用して、システムの瞬間的な状態にアクセスし、これを使用してスケールファクターを定義できます。
- 荷重形状、Shape(x,t)。これは、システム状態の関数にはできません。これは、空間領域と時間のみの関数である必要があります。
MotionSolveは上記の情報を使用して、分布荷重を弾性体に適用します。次の例は、ユーザーサブルーチンがFortran、C、C++のようなコンパイルされた言語で記述されている場合に、Force_FlexModalを指定する方法を示しています。
<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は上記の情報を使用して、分布荷重を弾性体に適用します。次の例は、ユーザーサブルーチンがPythonで記述されている場合に、Force_FlexModalを指定する方法を示しています。
<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" />
- 結果はH3Dファイルに書き込まれ、HyperViewで可視化できます。
- オプション1:時間または状態に依存する式で定義されたスケールファクター