Salome-Meca 2019でWizardを用いた接触解析

# はじめに

* Salome-Meca 2017ではAsterStudyモジュールの採用とともに4種類のCode_Asterコマンドファイル作成用Wizard機能が廃止
* Salome-Meca 2019では廃止になった4種類と新たに追加された3種類の合計7種類のWizard（Add Stage with Assistant）が採用
   * Liner thermal analysis:線形熱解析
   * Isotropic liner elasticity:等方性線形弾性
   * Modal analysys:モーダル解析
   * Thermo-mechanical analysis:熱-構造解析<font color="red">(New)</font>
   * Contact analysis:接触解析<font color="red">(New)</font>
   * Fracture mechanics:破壊力学
   * Reinforced concrete beam:鉄筋コンクリート梁<font color="red">(New)</font>

今回、新たに追加されたContact analysis:接触解析を実施

# 例題の実施
## 接触による応力分布[^1]
次図のようなスタンプ台にスタンプを押し付ける軸対称問題を考える。
スタンプ台、スタンプともに材料はS45Cとする。

![geom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/c2061e80-9b2c-1051-5517-7fe3e11e1db1.png)

## メッシュ条件
スタンプ、スタンプ台をそれぞれ次の条件でメッシュ分割

* 2D:Algorithm=Quadrangle Mapping（四面体）
* 1D:Algorithm=Wire Discretisation
* 1D:Hypothesis=Max Size 3mm

Compound Meshを作成、このとき「Merge coincident nodes and elements」のチェックを外しておく

![Compound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/3949b2e1-f387-1d23-a3a6-5b65935bbee1.png)


![mesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/7e21e8ce-9a20-810a-dee9-ee2d12123d1a.png)

# Wizardの実施

* AsterStudyモジュールで「Operations」>「Add Stage with Assistant」>「Contact analysis」を選択
* Introductionが表示されるので、「Next>」をクリック

![Contact analysis_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a5b94fb0-1bce-ee5d-98d8-9dc0b09430ad.png)

* 「Compound_Mesh_1」を選択
* 「Next>」をクリック

![Contact analysis_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/70dd88e5-910f-4b14-3a17-ca7253bf0b12.png)

* 軸対称問題なので「AXIS」を選択
* 「Next>」をクリック

![Contact analysis_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f5fe20b7-f709-dea3-6fe8-1204ae7658ba.png)

* 材料定数を設定
   * ヤング率に「2e5」MPa
   * ポアソン比に「0.3」を入力
* 「Next>」をクリック

![Contact analysis_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/d1029ed7-6f0b-7b3f-9d6b-9bf17a12e181.png)

* 拘束条件を設定
  * グループに「fix」を選択
  * 「DX=DY=0」を入力
* 「Next>」をクリック

![Contact analysis_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/730ae6b8-c0aa-924e-d324-ab2989d24fe7.png)

* 圧力荷重条件を設定
  * グループに「press」を選択
  * 「100」MPaを入力
* 「Next>」をクリック

![Contact analysis_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/68b897bb-97e2-b0f4-1428-b4c7bf1a2b4f.png)

* 接触アルゴリズム「Standard method」を選択
* Master Zoneに「contLo」を選択
* Slave Zonenに「contUp」を選択
* 「Finish」を選択

![Contact analysis_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a75c85fa-72f6-232d-fdeb-89ae42e399c4.png)

Wizardを終了するとエラーが発生

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a07a2255-ed26-e329-3230-8b7b54681fa4.png)

「Yes」をクリックすると、

* 解析ケース内でStage_1とStage_2に分離、
* Stage_2はテキストモードでしか編集できず、
* GUIで設定するグラフィカルモードに変更できず...

![textmode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a6dc01a9-1164-fde7-085a-b2d2c6cdff65.png)

「Show Details...」をクリックすると、次のように表示され**MODI_MAILLAGE**でエラーが発生しているよう

```
str, near the line 6:
For keyword ORIE_PEAU_2D/GROUP_MA: Unexpected type: <class 'tuple'>,
expecting: [<class 'code_aster.Cata.Language.DataStructure.grma'>]

Line is: ORIE_PEAU_2D =_F (GROUP_MA =("contUp","contLo",("press",)),),)
```
## コマンドの修正
Wizardから出力されたコマンドファイルの以下の**MODI_MAILLAGE**を

```python:修正前
mesh = MODI_MAILLAGE(
    reuse=mesh,
    MAILLAGE=mesh,
    ORIE_PEAU_2D=_F(GROUP_MA=("contUp", "contLo", ("press", )), ),
)
```
次のようにテキストモードで修正

```python:修正後
mesh = MODI_MAILLAGE(
    reuse=mesh,
    MAILLAGE=mesh,
    ORIE_PEAU_2D=_F(GROUP_MA=("contUp", "contLo", "press" ))
)
```
以後はグラフィカルモードで編集が可能だが、

1. Stage_1をテキストモードに変更、
2. Stage_2の内容をStage_1にカット＆ペースト
3. Stage_2を削除

を実行して一つのStageにまとめてからグラフィカルモードにしたほうがコマンドファイルの管理がしやすい。

# コマンドファイルの追加

Wizardのデフォルトでは、Post処理、結果出力設定がないので追加が必要

```python:Post処理
result = CALC_CHAMP(reuse=result,
                    CHAM_MATER=materfl,
                    CONTRAINTE=('SIGM_ELNO', 'SIGM_NOEU'),
                    CRITERES=('SIEQ_ELNO', 'SIEQ_NOEU'),
                    MODELE=model,
                    RESULTAT=result)
```

```python:結果出力
IMPR_RESU(FORMAT='MED',
          RESU=_F(MAILLAGE=mesh,
                  NOM_CHAM=('DEPL', 'SIEQ_NOEU', 'SIGM_NOEU'),
                  RESULTAT=result),
          UNITE=80)
```

# 計算結果
## 変位
![displacement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/34dedb09-de18-1eed-1e84-baa34c7c4c1f.png)

## 相当応力
![VMIS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/21e887f1-7283-1751-42c4-a7b9b1189d0c.png)


# Asterコマンド

```python:Wizardのデフォルト設定
DEBUT(LANG='EN')

mesh = LIRE_MAILLAGE(FORMAT='MED',
                     UNITE=20)

mesh = MODI_MAILLAGE(reuse=mesh,
                     MAILLAGE=mesh,
                     ORIE_PEAU_2D=_F(GROUP_MA=('contUp', 'contLo', 'press')))

model = AFFE_MODELE(AFFE=_F(MODELISATION=('AXIS', ),
                            PHENOMENE='MECANIQUE',
                            TOUT='OUI'),
                    MAILLAGE=mesh)

mater = DEFI_MATERIAU(ELAS=_F(E=200000.0,
                              NU=0.3))

materfl = AFFE_MATERIAU(AFFE=_F(MATER=(mater, ),
                                TOUT='OUI'),
                        MODELE=model)

lst = DEFI_LIST_REEL(DEBUT=0.0,
                     INTERVALLE=_F(JUSQU_A=1.0,
                                   NOMBRE=2))

mult = DEFI_FONCTION(NOM_PARA='INST',
                     VALE=(0.0, 0.0, 1.0, 1.0))

times = DEFI_LIST_INST(DEFI_LIST=_F(LIST_INST=lst))

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

mecach = AFFE_CHAR_MECA(MODELE=model,
                        PRES_REP=_F(GROUP_MA=('press', ),
                                    PRES=100.0))

contact = DEFI_CONTACT(ALGO_RESO_CONT='NEWTON',
                       FORMULATION='CONTINUE',
                       MODELE=model,
                       ZONE=_F(ALGO_CONT='STANDARD',
                               GROUP_MA_ESCL='contUp',
                               GROUP_MA_MAIT='contLo'))

result = STAT_NON_LINE(CHAM_MATER=materfl,
                       CONTACT=contact,
                       EXCIT=(_F(CHARGE=mecabc,
                                 FONC_MULT=mult),
                              _F(CHARGE=mecach,
                                 FONC_MULT=mult)),
                       INCREMENT=_F(LIST_INST=times),
                       MODELE=model)

FIN()
```

[^1]: マルチフィジックスの実験／計算技術の高度化に関する研究会／CAE設計演習問題「接触による応力分布」[https://www.fml.t.u-tokyo.ac.jp/multiphysics/prob/index.htm](https://www.fml.t.u-tokyo.ac.jp/multiphysics/prob/index.htm)