Salome-Meca 2020を用いた複合材の設定（SSLV）

# はじめに

複合材とは、材質の異なる形状のものが組み合わさって構成されるモデルであり、その材質が異なる境界面では、モデルの節点が共有されており、全体としてのモデルは、Solidが1ヶになるという考え方。
この様な複合材のモデルを考えて、解析してみます。

この資料は[オープンCAE勉強会＠岐阜](http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?OpenCAE%20Users%20Wiki)で公開されているFS氏ご提供の「[SALOME-Mecaの使用法解説](http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?SALOME-Meca%A4%CE%BB%C8%CD%D1%CB%A1%B2%F2%C0%E2)：3.0 複合材料の設定」をSalome-Meca 2020を用いて実行しました。

# モデルの読み込み

2種類の材料で構成されるモデル（multi-bar-1.stp）をGeometryモジュールから読み込みます（「File」>「Import」>「STEP」）。
単位変換のWarning画面では、「No」を選択します。
このモデルは、CADで2ヶのパーツで構成されるモデルを作ってあります。
フォルダーは、~/CAE/multi-P/と言うフォルダーを作り、この中で解析します。

# Salome側での処理

2ヶのパーツで構成されるモデルをSalome側でいったん、Fuseコマンドで1ヶのモデルにします。
その後、Partitionコマンドで、再び2ヶに分割します。
Partitionコマンドで分割されたモデルは、メッシュを切った時、境界の節点は共有され、モデル全体としては、1ヶのモデルになります。
もともと、1ヶのパーツをSalomeのPartitionコマンドで分割すると、節点を共有するモデルができます。
2ヶのパーツで構成されるモデルを作り、このままメッシュを切ると、分割されたパーツのままメッシュが切られます（境界面で節点が共有されず分離された2ヶのモデルになります）。
CAD側でFuseコマンドで一体にしたモデルにしても良いが、こうすると、SalomeでPartitionを切るとき境界面がなくなっている為、Partitionが切り難くなってしまいます。

この為、2ヶのパーツをCAD側で作り、Salome側で一体にします（2ヶのパーツならば、境界面がはっきりしている為、境界面が定義し易く、Partitionが切りやすい）。

## オブジェクトの分離

Object Browser ツリー上のmulti-bar-1.stp_1を選択後、メニューバー上の「New Entity」＞「Explode」を選択します。
Sub-shapes Typeを「solid」に変更し、「Apply and Close」を選択します。

![2021-03-07-13-08-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f4209414-de68-10a0-d18f-382438c357a6.png)

## 境界面の定義

Object Browser ツリー上のmulti-bar-1.stp_1を選択後、メニューバー上の「New Entity」＞「Group」＞「Create]で現れた画面上で、Shape Type：Faceを選択、Name：Bound-1（任意で可）、Main Shapeが「multi-bar-1.stp_1」になっている事を確認後、「Select Sub Shapes」ボタンをクリックして、モデルの境界面（Baseの上面）をクリックします。
「Add」ボタンをクリックして、「OK」をクリックします。
ここまでで、Object Browserツリーの構成は、下記。

![2021-03-07-13-15-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/7532b5e0-ca1d-de84-5cc0-f13e0b306add.png)

## モデルをFuse

2ヶのモデルをFuseコマンドで一体のモデルにします。
メニューバー上の「Operations」＞「Boolean」＞「Fuse」で現れた画面上で「Product 1」と「Product 2」のObjectを選択して（ctrlキーを押しながら）、「Apply and Close」で、Fuseコマンドで一体化したモデルを作ります。

![2021-03-07-13-21-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/8a145d04-f782-1df9-4484-81bd513bfe3d.png)

Fuseコマンドで一体化した場合には、正しく一体化されたかどうかを以下の手順で確認します（2ヶのパーツの境界面に隙間があると一体化できません。
通常Fuseコマンドは、2ヶのパーツが食い込んだ状態でFuseして一体化します。
今回は、2ヶのパーツの隙間0の状態のモデルで一体化しています）。
確認は、Salomeのメニューバー上の「Measures」＞「What is」を選択、現れたWhatis Informations画面の表示内容を確認して、Solidが1ヶになっている事を確認します。
もし、Fuseコマンドで一体化できていない場合は、Solidの個数が複数個表示されています。
この様な場合は、2ヶのパーツの境界面に隙間ができているためであり、この隙間を無くす（少し食い込みができるようにします。）様に、モデルを再度作成します。

## モデルを分割

一体にしたモデルを、Partitionコマンドで境界面から2ヶに分割します。
メニューバー上の「Operations」＞「Partition」で現れた画面上から、
* Objects：Fuse_1（Fuseコマンドで一体化したモデル）
* Tool Object：Bound-1（分割する境界面）
を入力して、「Apply and Close」をクリックします。
これで一体のモデルが境界面から2ヶに分割されます。

![2021-03-07-13-27-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/2972f363-f109-7e6b-884e-ced35a895fed.png)

## 境界条件を設定する箇所の定義

境界条件としては、Baseの下面を固定し、Topの上面に0.1MPaの圧力をかける事にします。
したがって、Baseの下面をグループ化して、「fix」という名前で定義し、Topの上面を「load」と言う名前で定義します。
これら定義する面をメッシュを切るモデル（Partition_1）の下に追加します。
さらに、「Base」と「Top」で材料が異なる為、これら「Base」「Top」のVolumeもPartition_1の下に追加します（Volume名で材質を設定するため）。

ここまででObject Browserツリーの構造は、下記。

![2021-03-07-13-32-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/37777dde-c276-27f8-e14f-bc5116b23a37.png)

## メッシュの作成

Mesh画面に移行して、「Mesh」＞「Create Mash」で、メッシュを切ります。
メッシュは、「均一なメッシュで高次のメッシュに設定しました。
高次のメッシュの方が、節点の数が多いので、要素の数の割りに精度が高くなる為。「Max Length＝3」に設定しました。
メッシュの数：12,858ヶ
節点の数： 20,423ヶ
境界面を拡大すると、境界面で節点を共有（Solidが1ヶのモデル）している事がわかります。（下図参照）

![2021-03-07-13-40-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/4d5ff9e8-bf0d-a1aa-6a0d-850673e49952.png)

![2021-03-07-13-41-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/661f4228-cba0-26f1-c7a6-23534e3ca06d.png)

「Mesh_1」を右クリックし、「Create Groups from Geometry」を選択します。
この手順は、Geometryモジュールで追加したグループがメッシュでも使用するために必要です。

Geometryモジュールで作成した4つのグループを選択すると、次図のようにグループ名が追加されます。

![2021-03-14-08-40-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/8181b3b2-363e-b806-17c0-b7a3d0a34193.png)

「Apply and Close」をクリックします。

# コマンドファイルの作成

## Assistantを用いてコマンドファイルのひな形を作成

Salomeの画面を「Mesh」から「AsterStudy」に変えます。
code_asterのバージョン選択では、「stabel（Version 14.6）」を選択します。

メニューバー上の「Operations」＞「Add Stage with Assistant」＞「Isotropic Linear elasticity（等方性線形弾性）」をクリックします。

* 「Mesh_1」が選択されていることを確認し、「Next>」をクリック、
* 「3D」が選択されていることを確認し、「Next>」をクリック、
* E（ヤング率）に「70600」MPa、と$\nu$（ポアソン比）に「0.345」を入力し、「Next」ボタンをクリック、
* 境界条件を入力
   * 境界条件の追加ボタンをクリック
   * Group:fix を選択
   * DX:0 DY:0 DZ=0 を入力（固定部）
   * 「Next」ボタンをクリック
* 圧力条件を入力
   * 圧力条件の追加ボタンをクリック
   * Group:loadを選択
   * Pressure=0.1を入力
   * 「Next」ボタンをクリック
* 結果ファイル名を設定
   * フォルダー（~/CAE/multi-P）に
   * 「multi-bar-1.rmed」として設定
   * 「Finish」ボタンをクリックしてアシスタント設定は完了

## コマンドファイルの編集

ここまでの操作で、モデルの材質が均一な場合の解析ができる事になります。
しかし、BaseとTopで材料定数を変える必要があるので、次の操作で材料定数を変えます。

## 材料の定義

2種類の材料を定義します。
柔らかい材料（Aluminum）と硬い材料（Steel）を定義します。

|材料名|ヤング率 $E$ （MPa）|ポアソン比 $\nu$ |
|:--|--:|--:|
|Aluminum|70,600|0.345|
|Steel|212,000|0.293|

コンセプト名「mater」の「DEFI_MATERIAU」を選択し、右クリックメニューから、「Edit」を選択します。
アシスタントで柔らかい材料（Aluminum）の材料定数を設定しましたので、材料のコンセプト名をデフォルトの「mater」から「Aluminum」に変更します。
「OK」をクリックします。

![2021-03-14-08-58-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/b18dd239-2f73-225a-ddc4-b25fc6790cfa.png)

新規に硬い材料（Steel）を定義します。
ドロップダウンリストより、「Material」＞「DEFI_MATERIAU」を選択します。

材料のコンセプト名をデフォルトの「mater」から「Steel」に変更します。
材料モデルから「ELAS（等方性弾性材料）」をチェックし、「Edit...」をクリックします。

![2021-03-14-09-03-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/382e5438-cc13-c62c-1c23-6a00261fe77c.png)

E（ヤング率）に「212000」MPa、と$\nu$（ポアソン比）に「0.293」を入力し、「OK」をクリック。
「OK」をクリックし、材料設定の追加を終了します。

![2021-03-14-09-06-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/ba5f6671-f812-6474-2007-f92f50157f4a.png)

## 材料の割り当て

コンセプト名「materfl」の「AFFE_MATERIAU」を選択し、右クリックメニューから、「Edit」を選択します。

「AFFE」を展開し、「MATER=(Aluminum),...」をクリックします。

![2021-03-14-09-30-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/b4365c90-f626-9252-2b46-15638b9d934e.png)

材料の割り当てのチェックを「TOUT（全体）」から、「GROUP_MA」に変更し、
「Edit...」ボタンをクリックし、「Base」を選択します。
「OK」をクリックし、「Aluminum」の割り当てを終了します。

![2021-03-14-09-31-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/5f4f3dad-0333-e9a2-85ae-06c1cf6cd0cd.png)

「1 items」横のアイコンをクリックして、行を追加します。
追加した行の「Edit...」をクリックします。

![2021-03-14-09-41-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/5d6c7276-9074-67b1-1e12-bd7c1f0951f2.png)

先の柔らかい材料（Aluminum）の割り当てと同様に、グループ「Top」に硬い材料（Steel）を割り当てます。

![2021-03-14-09-43-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/abed4f95-d95a-499a-227a-7c501e814820.png)

ドロップダウンリストの「Post Processing」をクリックし、「CALC_CHAMP」を選択します。

開いたパネルで、「reuse the input object」にチェックします。
「MODEL」と「CHAM_MATER」にチェックします。

![2021-02-28-12-25-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/5d74ea3c-0eeb-4203-9e6c-70addc2f4025.png)


「CONTRAINTE」をチェックし、「0 items」横のアイコンをを2度クリックして、行を追加します。
それぞれにリストからSIGM_ELNO」と「SIGM_NOEU」を追加します。

同様に、「CRITERIA」をチェックし、「0 items」横のアイコンをを2度クリックして、行を追加します。
それぞれにリストから「SIEQ ELNO」と「SIEQ NOEU」を追加します。

「OK」をクリックして、後処理をコマンドファイルに追加します。

![2021-03-07-08-51-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/5bd774f7-ef2b-1e80-1dbd-64e2a48cd83b.png)

最後に、必要な結果を出力ファイルに書き込むため、「DATA Settins」画面、「CurrentCase」＞「Stage_1」＞「Output」の「Set output results」を右クリックし「Edit」を選択します。

「Results」の「1 item」を展開し、「Result=result」をクリックすると、パネルが開きます。

![2021-02-28-12-49-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f1b26f4e-b797-fb37-5c7e-53332f89d5a6.png)

「Mesh」にチェックを入れ、「mesh」が選択されていることを確認します。

スライドバーを下げ、「NOM_CHAM」を選択し、「0 items」横のアイコンをを3度クリックして、行を追加します。
それぞれにリストから「DEPL」、「SIEQ_NOEU」、「SIGM_NOEU」を追加します。
「OK」をクリックしてこのパネルを終了し、もう一度「OK」をクリックし、結果出力をコマンドファイルに追加します。

![2021-02-28-12-54-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/9cfefe7a-44b0-7859-c769-cf32990b8c15.png)

解析条件の設定が終了しました。
スタディを保存します。

# 解析の実行

Object Browserで、「History View」タブを選択します。
ここでは、すべてのケースと実行中の解析を確認できます。
現在、「Stage_1」には赤い「□」ボタンにチェックが付いていますので、「+」ボタンをクリックします。

![2020-04-30-13-54-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/606effe6-e91c-65ed-10a5-333855b2ecf8.png)

パネル下部の「Run」で解析を実行します。
パネル右下の「Auto Refresh:No」をプルダウンして、「Auto Refresh:5s」に変更します。

![2020-04-30-13-55-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f0d5297e-01de-cc74-3d56-f4ff71f428ae.png)

すべてが正常に実行されると、解析が正常に完了したことを示す緑色の丸が表示されます。

![2020-04-30-13-58-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/c1e94e30-5113-22a4-f6c8-42933c631bd8.png)

# 結果の確認

「Data Files Summary」より、結果ファイル（multi-bar-1.rmed）を右クリックして、「Post-process」を選択します。
新しいウィンドウの初期化を待ちます。
Post-processが開き、次の画面になります。
「Results」タブがアクティブになります。

Baseの材質が柔らかいAluminumでTopの材質が硬いSteelに設定した為、SteelがAluminumに食い込んでいる様子が良くわかります。
下図（40,000倍に拡大）参照。

![2021-03-14-10-07-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/52515007-fc53-856e-3463-76b22186b52a.png)

# ソースコード

以下にCode_Asterのソースコードを示します。

```python
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=('Top', ),
                                 MATER=(Steel, ))),
                        MODELE=model)

mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DX=0.0,
                                    DY=0.0,
                                    DZ=0.0,
                                    GROUP_MA=('fix', )),
                        MODELE=model)

mecach = AFFE_CHAR_MECA(MODELE=model,
                        PRES_REP=_F(GROUP_MA=('load', ),
                                    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()
```