この資料はオープンCAE勉強会@岐阜で公開されているFS氏ご提供の「SALOME-Mecaの使用法解説:4.0 部品の連結」をSalome-Meca 2020を用いてモデル作成、メッシュ生成、解析条件設定、解析実行、結果処理を行いました。
はじめに
複数のSolidを連結(結合)してAssyを作り、Assyの線形解析をする問題を考えます。
複数の部品を配置した後、連結する箇所を定義して連結し解析します。連結部で荷重や変位を相手側に伝え構造解析を行います。
この問題は、複雑な部品を組み合わせてAssyを作って解析するには、都合のよい方法ですが、連結部の誤差が発生します。連結部の誤差をなくすためには、複合材(連結部で節点を共有するモデル)のモデルを作り解析しますが、複雑な部品の場合、複合材のモデルを作るのは、難しくなります。
部品間の隙間がないモデルの場合
部品を組み合わせてAssyを作りますが、これら部品間の隙間が0の場合で解析します。モデルは、複合材モデルで解析した「multi-bar-1.stp」を使います。
解析は、~/CAE/Assy/というフォルダーを作り、この中で解析します。
モデルの読み込み
モデルは、2ヶのSolidで構成される「multi-bar-1.stp」を読み込みます。
BaseとBarを配置しています。Baseの下面を固定して、Barの上面に荷重を掛けてひずませます。複合材で解析した方法と同じ方法で解析します。
Entityの作成
解析に使用するFaceやVolumeを定義します。
まず、読み込んだモデルを分離します。メニューバーの「New Entity」「Explode」でSub-shapes selection画面で、Main Objectに読み込んだモデルが設定されていることを確認し、Sub-shapes TypeをSolidに変更して分離します。
上のVolumeを「Bar」、下のVolumeを「Base」に名前を変更します。
次に、BaseとBarをグループ化します。この後、Baseの下面を「fix」、上面(連結面)を「contBase」という名前でグループ化します。Barの下面(連結面)を「contBar」、上面を「press」でグループ化します。
この状態での、Object Browserツリーの構造は、下記。
グループ名 | 備考 |
---|---|
Base | Solid1(Base) |
fix | 固定面 |
contBase | Baseの連結面 |
Bar | Solid2(Base) |
contBar | Barの連結面 |
press | 荷重を負荷する面 |
メッシュの作成
SalomeをMesh画面に変えて、メニューバーの「Mesh」「Create Mesh」でメッシュを切ります。(Create Mesh画面内のGeometryが「multi-bar-1.stp_1」に設定されていることを確認します。)
メッシュは、複合材モデルと比較するために、複合材モデルとまったく同じ方法でメッシュを切ります。
- 四面体で高次のメッシュ
- Max Size=3
Object Browserの「Mesh_1」を右クリックし「Create Groups from Geometry」から、Geometryで設定したグループをメッシュに再設定します。
以下の画面が、今回の設定内容
メッシュ部分を拡大すると、部品を連結させた場合、部品の境界面で節点を共有しておらず、完全に分離されたモデルになっている事が判ります。
Aster Codeの作成
Salome画面をMeshからAsterStudyに変えます。
code_asterのversion選択では、「stable」を選択します。
メニューバー上の「Operations」「Add Stage with Assitant」「Isotropic liner elasticity」をクリックして、通常の線形解析を実施し、Aster Codeを作成します。(fix面を固定し、press面に0.1MPaの圧力をかけます。Aster Codeの結果File名は、「~/CAE/Assy/multi-bar-1.rmed」としました。材料定数は、あとで編集するので適当な値を入力しておきます。)
でき上がったAster Codeを連結問題が解ける様に編集します。
「DATA Settins」画面、「CurrentCase」>「Stage_1」からコンセプト名「mecabc」のAFFE_CHAR_MECAをダブルクリックして編集します。
「LIAISON_MAIL」を選択し、境界条件に連結コマンドを追加します。
「0 items」横のアイコンをクリックして、行を追加します。
追加された行の「Edit」をクリックし、「GROUP_MA_MAIT」を選択し、「Edit」から連結する相手(Bar)を選択します。
同様に、「GROUP_MA_ESCL」を選択し、「Edit」からBarと連結する面(contBase)を選択します。
以上で連結の定義は、終了。ツリーの構造は、下記。
mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DX=0.0,
DY=0.0,
DZ=0.0,
GROUP_MA=('fix', )),
LIAISON_MAIL=_F(GROUP_MA_ESCL=('contBase', ), # 連結の定義、連結面
GROUP_MA_MAIT=('Bar', )), # 連結する相手の部品
MODELE=model)
連結の定義は、「LIAISON_MAIL」コマンドで定義します。上記の例では、BarとcontBaseを連結させています。
ついでに材料定数も、複合材モデルで確認した定数と同じ定数に変更しておきます。ツリーの構造は、下記。
Aluminum = DEFI_MATERIAU(ELAS=_F(E=70600.0,
NU=0.345))
steel = DEFI_MATERIAU(ELAS=_F(E=212000.0,
NU=0.293))
materfl = AFFE_MATERIAU(AFFE=(_F(GROUP_MA=('Base', ),
MATER=(Aluminum, )),
_F(GROUP_MA=('Bar', ),
MATER=(steel, ))),
MODELE=model)
「フロッピィ」のアイコンをクリックして保存します。
計算開始
通常通りに、計算開始させます。
途中、警告がでますが計算は正常にされている(エラーの発生はない)ようなので、ここでは、無視しておきます。
(警告の内容については、4項「連結の定義方法」参照。)
この方法は、もともとDoc:CAETutorials「9 Salome & Code-Aster JML's Tutorials (CAELinux beta 2)」で公開されている「JMLtutorials.zip」内の「caelinux4.pdf」と同じ方法をとっています。
tutorialの方法は、Salomeで1次メッシュを作り、Aster Codeで2次メッシュに変換して新たなメッシュを作り、このメッシュに再度グループ名を定義し、連結(接触)問題を解いているので、Aster Codeが複雑になっています。今回の方法は、Salomeで2次メッシュを作って、そのまま連結コマンドを追加するだけなので、編集は少なくて済みます。
実行に関して、連結させたモデルでは、複合材モデルに比べて、多少計算時間がかかります。
結果の確認
今回の結果を、複合材のモデルと比較します。
複合材モデルと少し違った結果になる。やはり連結させたモデルは、連結部に少し誤差が出てしまう。連結モデルは、contBase面全体でBarと連結させた為、contBase面全体がひずんでいる。→詳細は4項参照。
部品間に隙間があるモデルの場合
前記したモデルは、2ヶの部品間に隙間なく(隙間ゼロ)配置されたモデルを作りで解析したので、2ヶの部品間に意識的に隙間を設けて配置した場合も解析できるかどうか確認します。(複数の部品を作りこれらを配置してAssyとした時、通常は、部品間に微妙な隙間や食い込みが生じてしまう。)
部品間の隙間がないモデルを保存した後、部品間に隙間があるモデルの解析用に別名で保存します。
モデルの作成
現状のモデルに対し、Barを0.5mm分Z方向に移動させてBaseとBarに0.5mm分の隙間を空けます。
Salome画面をGeometry画面に変更します。
Barを0.5mm分Z方向に移動
メニューバー上の「Operation」「Transformation」「Translation」を選択。
Nameを「Bar0.5」に設定、Objectsを「Bar」に設定、Dzを0.5に設定し、「Apply and Close」ボタンをクリック。
この状態で、Solidは、「Bar」「Bar0.5」「Base」の3ヶ存在する事になります。
複合モデル(Compound)の作成
「Bar0.5」と「Base」のSolidを使って、新しい複合(Compound)モデルを作ります。メニューバー上の「New Entity」「Build」「Compound」を選択します。
Objectsを「Base」と「Bar0.5」を選択(ctlキーを押したままクリックして選択)します。テキストボックス内には、「2_Objects」と表示されます。
これで、Compound_1と言うobjectがツリーに追加されます。
Compound_1を右クリックして、「Show only」を選択して表示させ、モデルを水平にすると、少し隙間が空いたモデルになっていることが確認できます。
Entity の作成
Compound_1の下に必要なグループを作成します。
下記のように作成した。この名前は、前回解析した名前と同じ名前になっているがツリーが異なっているの
で同じ名前でも構わない。(解析は、Compound_1を使うので、この下に解析時に必要になってくるFaceなどを定義しておく必要があります。)
メッシュの作成
同様にメッシュを作成します。Objectは、「Compound_1」になることに注意。
Object Browserツリー上にMesh_2が新しくでき上がります。
Aster Codeの作成
Geometry は「Compound_1」、メッシュは「Mesh_2」となることに注意します。
境界条件は、Baseの下面(fix)を固定し、Bar の上面(press)を0.1mm 押し下げる条件にします。(BaseとBar に0.5mmの隙間を設けたので、Barを0.1mm押し下げても Baseに接触しない値に設定します。)
変位は、fix面を固定(XYZ 方向は0)、press面をZ方向に-0.1(XY 方向は 0)で指定。圧力は、適当な面に適当な値を入力しておく。(圧力の境界条件は、あとで削除します。)
結果ファイルは、新しく作成して保存しておきます。ファイル名は、multi-bar-1-1.rmedとしました。
Aster Codeの編集
境界条件(AFFE_CHAR_MECA)は、PRES_REPを削除し、連結(LIAISON_MAIL)を追加します。材料定数は、両部品とも、E:130300MPa、NU:0.343の値を入れました。
最終的にツリーの構造は、下記。
mecabc = AFFE_CHAR_MECA(DDL_IMPO=(_F(DX=0.0,
DY=0.0,
DZ=-0.1,
GROUP_MA=('press', )), # Z方向に-0.1mm変位させる
_F(DX=0.0,
DY=0.0,
DZ=0.0,
GROUP_MA=('fix', ))), # 固定
LIAISON_MAIL=_F(GROUP_MA_ESCL=('ContBase', ), # 連結する相手の面
GROUP_MA_MAIT=('Bar', )), # 連結する部品
MODELE=model)
連結する部品に連結する相手の面が含まれるように、MAITとESCLを決めます。(面が部品からはみでないよ
うにします。)この様に決めると、警告がでない。逆(面が部品からはみでる)に、決めると警告がでます。
詳細は、4項参照。
計算開始、結果の確認
前回と同様な方法で計算開始します。
警告はでますが、計算は、エラーなく無事終了します。
隙間が0.5mmあるものに対して、0.1mm下げるので、普通に考えると、接触せず、応力は発生しないはずですが、部品を連結している為、連結部で荷重や変位がそのまま相手側に伝わり、解析するので、応力が発生しています。
その他(負荷面の形状を規制する方法)
荷重を掛けたり変位させたりして負荷をかける場合、負荷面の形状を保ちながら負荷を掛けたい時には、下記のように境界条件を設定します。
今回の連結問題は、Doc:CAETutorials「9 Salome & Code-Aster JML's Tutorials (CAELinux beta 2)」で公開されている「JMLtutorials.zip」内の「caelinux4.pdf」を参考にして、解析しています。この資料内に負荷面の形状をを変化させず変形させる事例があったので、ここで確認します。
平面を保ちながら荷重を掛ける時(平面の形は変化する)
Barの突き出た端面に荷重を掛ける。この時、端面の平面を保ちながら荷重を掛けます。(平らな平面で端面を押すイメージ。平面で押すため、端面は平面を保ちながら変形していきます。)
端面を「EndFace」と言う名前でグループ化しておきます。
この時のAFFE_CHAR_MECAのツリー構造は、下記。
mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DX=0.0,
DY=0.0,
DZ=0.0,
GROUP_MA=('fix', )), # 固定
FORCE_FACE=_F(FX=0.1,
GROUP_MA=('EndFace', )),
LIAISON_MAIL=_F(GROUP_MA_ESCL=('ContBase', ), # 連結する相手の面
GROUP_MA_MAIT=('Bar', )), # 連結する部品
LIAISON_UNIF=_F(DDL=('DX', ), # 端面のX方向(荷重を掛ける方向)の寸法を等しくする
GROUP_MA=('EndFace', )),
MODELE=model)
LIAISON_UNIFコマンドを使って、この指定を行っており、上記の内容で、EndFaceは平面を保ったまま変位していくことになります。上記内容は、X方向しか規定していない為、EndFaceは平面のままですが、YZ方向には変形しますので、平面の形は変化します。
平面の形状を保ちながら荷重を掛ける時
EndFaceの形そのものを保ちながら変形させたいのであれば、DXだけ出なく全方向(DX,DY,DZ)で規定すれば、形を保ったまま変形します。
規制なし(500,000倍)
DXを規制(500,000倍)
DX、DY、DZを規制(500,000倍)
平面の形状を保ち変化
連結の定義方法
部品を連結させる時に、どの面をESCLに、どの部品をMAITにすればよいか(定義方法)を確認します。
右図のモデル「cube-pole.stp」で連結させるグループの全組合せで計算できるかどうかを確認します。
この結果が下表の結果となりました。この結果から、最終的には下記の方法で決定すれば、エラーやアラームが発生しません。
考え方は、大きな本体部品に、小さい接着部品を連結させると考えて、本体の部品と小さい部品の接着面を定義します。(接着面に接着剤をつけて本体に接着すると考え、この時に接着剤がはみでない様に部品(MAIT)と接着面(ESCL)を定義すればよい。)
指定方法は、
オペラント | 対象 | 意味 |
---|---|---|
LIAISON_MAIL | 連結コマンド | |
GROUP_MA_MAIT | Cube | 連結する本体の部品Cube(Volume) |
GROUP_MA_ESCL | ContPole | 本体に接着する部品Poleの接着面(Face) |
とすればよいことになります。
No. | GROUP_MA_MAIT | GROUP_MA_ESCL | 結果 |
---|---|---|---|
1 | Pole | Cube | エラー発生 |
2 | Pole | ContCube | 計算できる(警告はでます) |
3 | ContPole | Cube | エラー発生 |
4 | ContPole | ContCube | エラー発生 |
5 | Cube | Pole | 計算できる(警告はでます) |
6 | Cube | ContPole | 計算できる(警告なし) |
7 | ContCube | Pole | エラー発生 |
8 | ContCube | ContPole | エラー発生 |
2項「部品間の隙間がないモデルの場合」の例は、Base、Barのどちらを本体側にしても、接着面が部品からはみでてしまうので警告は必ず発生します。従って、正しくは、Baseを MAITにし、Bar側の接触面のみを新たに定義してESCLとして、解析する事になります。
また、2-6項の変位のコンター図を見ても明らかな様に、contBase面とBarを連結させた為、contBase面全体とBarが連結されており、contBase面が一様に変形している。→ここでも誤差が生じていることになります。やはり、Bar側の接触面のみをESCLとして定義して解析すべきか。
境界条件の設定方法のまとめ
今回、「AFFE_CHR_MECA」コマンドで連結を定義したので、このコマンドの使い方についてまとめてみます。
区分 | オペラント | 対象 | 意味 | |
---|---|---|---|---|
荷重 | 点に働く荷重 | FORCE_NODALE | GROUP_NO | 1点当たりの荷重 |
線に働く荷重 | FORCE_ARETE | GROUP_MA | 単位長さ当たりの荷重 | |
面に働く荷重 | FORCE_FACE | GROUP_MA | 単位面積当たりの荷重 | |
体積に働く荷重 | FORCE_INTERNE | 単位体積当たりの荷重 | ||
GROUP_MA | 密度の値にすると 1G の加速度が働くことと等価。 | |||
TOUT | 自重のたわみを計算できます | |||
圧力 | PRES_REP | GROUP_MA | 面に垂直方向に働く圧力 | |
変位 | 各部 | DDL_IMPO | GROUP_NO | 変位 |
GROUP_MA | ||||
関係 | 連結 | LIAISON_MAIL | 部品同士を連結 | |
GROUP_MA_MAIT | 本体の部品(Volume) | |||
GROUP_MA_ESCL | 小さい部品の接着面(Face) | |||
変形の規制 | LIAISON_UNIF | GROUP_MA | 定義したグループは規制した方向に変形しません。 | |
DX,DY,DZ | 全方向で規制すると、そのグループは変形しません。 | |||
(形状を保ったまま変形します) |
ソースコード
DEBUT(LANG='FR')
mesh = LIRE_MAILLAGE(FORMAT='MED',
UNITE=20)
model = AFFE_MODELE(AFFE=_F(MODELISATION=('3D', ),
PHENOMENE='MECANIQUE',
TOUT='OUI'),
MAILLAGE=mesh)
Aluminum = DEFI_MATERIAU(ELAS=_F(E=70600.0,
NU=0.345))
steel = DEFI_MATERIAU(ELAS=_F(E=212000.0,
NU=0.293))
materfl = AFFE_MATERIAU(AFFE=(_F(GROUP_MA=('Base', ),
MATER=(Aluminum, )),
_F(GROUP_MA=('Bar', ),
MATER=(steel, ))),
MODELE=model)
mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DX=0.0,
DY=0.0,
DZ=0.0,
GROUP_MA=('fix', )),
LIAISON_MAIL=_F(GROUP_MA_ESCL=('contBase', ),
GROUP_MA_MAIT=('Bar', )),
MODELE=model)
mecach = AFFE_CHAR_MECA(MODELE=model,
PRES_REP=_F(GROUP_MA=('press', ),
PRES=0.1))
result = MECA_STATIQUE(CHAM_MATER=materfl,
EXCIT=(_F(CHARGE=mecabc),
_F(CHARGE=mecach)),
MODELE=model)
result = CALC_CHAMP(reuse=result,
CHAM_MATER=materfl,
CONTRAINTE=('SIGM_ELNO', 'SIGM_NOEU'),
CRITERES=('SIEQ_ELNO', 'SIEQ_NOEU'),
MODELE=model,
RESULTAT=result)
IMPR_RESU(FORMAT='MED',
RESU=_F(MAILLAGE=mesh,
NOM_CHAM=('DEPL', 'SIEQ_NOEU', 'SIGM_NOEU'),
RESULTAT=result),
UNITE=80)
FIN()
DEBUT(LANG='FR')
mesh = LIRE_MAILLAGE(FORMAT='MED',
UNITE=20)
model = AFFE_MODELE(AFFE=_F(MODELISATION=('3D', ),
PHENOMENE='MECANIQUE',
TOUT='OUI'),
MAILLAGE=mesh)
mater = DEFI_MATERIAU(ELAS=_F(E=130300.0,
NU=0.343))
materfl = AFFE_MATERIAU(AFFE=_F(MATER=(mater, ),
TOUT='OUI'),
MODELE=model)
mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DX=0.0,
DY=0.0,
DZ=0.0,
GROUP_MA=('fix', )),
LIAISON_MAIL=_F(GROUP_MA_ESCL=('ContCube', ),
GROUP_MA_MAIT=('Pole', )),
MODELE=model)
mecach = AFFE_CHAR_MECA(MODELE=model,
PRES_REP=_F(GROUP_MA=('press', ),
PRES=0.1))
result = MECA_STATIQUE(CHAM_MATER=materfl,
EXCIT=(_F(CHARGE=mecabc),
_F(CHARGE=mecach)),
MODELE=model)
result = CALC_CHAMP(reuse=result,
CHAM_MATER=materfl,
CONTRAINTE=('SIGM_ELNO', 'SIGM_NOEU'),
CRITERES=('SIEQ_ELNO', 'SIEQ_NOEU'),
MODELE=model,
RESULTAT=result)
IMPR_RESU(FORMAT='MED',
RESU=_F(MAILLAGE=mesh,
NOM_CHAM=('DEPL', 'SIEQ_NOEU', 'SIGM_NOEU'),
RESULTAT=result),
UNITE=80)
FIN()