Salome-Meca 2019を用いたモーダル解析（SDLS）

# 目的

シェル要素を用いたモーダル解析

この資料はオープンCAE勉強会＠岐阜で公開されている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)：[10.0モーダル解析](http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?plugin=attach&refer=SALOME-Meca%A4%CE%BB%C8%CD%D1%CB%A1%B2%F2%C0%E2&openfile=10-00.pdf)」をSalome-Meca 2019（Code_Aster 14.4）を用いてシェル要素（1次）で実行しました。

# ジオメトリ

* Salome-Meca 2019を起動します。
* Shaperモジュールを起動します。

Sketchを使用してワイヤーを作成します。

* 新規Partを作成します （メニューより、Part/New Part）。
* スケッチの作成を開始します（メニューより、Sketch/Sketch）。
* ビューで**XOZ**平面を選択します。
* 「Sketch」プロパティパネルの「Set plane View」ボタンをクリックします。

* 四角形を作成します（メニューより、Sketch/Rectangle）。
* ビュー内の2つのポイントを選択し、四角形を作成します。
* 四角形の左端と原点を一致させます（Skethc/Coincident）。

* Skechツールバーの「Length」ボタンから寸法拘束を作成します。
* Y方向を「100」、Z方向を「20」に設定します。
* Skechプロパティパネルの「Apply」ボタンをクリックして、スケッチの作成を終了します。

![VirtualBox_CAELinux2020_11_01_2021_10_46_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/1f2529c8-e7dc-4204-3478-51b293e8b842.png)

Faceを作成します。

* **Face1**を作成します（メニューより、Build/Face）
* オブジェクトブラウザで**Sketch_1**を選択します。
* プロパティパネルの「Apply」ボタンをクリックします。

![VirtualBox_CAELinux2020_11_01_2021_10_46_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/25f77e66-4375-ca28-432e-b88fffe830b4.png)

グループを設定します

* グループを設定します（Features/Group）。
* Nameを「fix」に設定、Typeに「Edge」を選択、X=0上の線を選択し、「Apply and continue」をクリックします。
* Nameを「divZ」に設定、Typeを「Edge」を選択したままで、X=0、X=100上のＺ方向の2線を選択し（SHIFTキーを押しながら）、「Apply and continue」をクリックします。
* Nameを「shell」に設定、Typeに「Faces」を選択、ビュー内の「Face_1_1」を選択、「Apply」をクリックします。

![VirtualBox_CAELinux2020_11_01_2021_10_49_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/6ca3c17f-14b5-cc55-e545-34836c87cecc.png)

GEOMモジュールにエキスポート

* グループ設定をGEOMモジュールにエキスポートします（メニューより、Features/Export to GEOM）

# メッシュ

Meshモジュールを起動します。

**Mesh_1**を作成：（メニューより、Mesh/Create Mesh）

* ジオメトリ：**Face_1_1**
* 2Dアルゴリズム：自動四角形メッシュ化（Quadrangle:Mapping）
* 1Dアルゴリズム：セグメント数=20
* ダイアログをApplyし、**Mesh_1**をComputeします。

![VirtualBox_CAELinux2020_11_01_2021_10_51_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/447fc19b-0cf2-90bf-5ae6-bdc33b20a240.png)

サブメッシュを作成：（メニューより、Mesh/Create Sub-mesh）

* メッシュ：**Mesh_1**
* ジオメトリ：**divZ**
* アルゴリズム：Wire Discretisation
* Hypothesis（仮設）にNumber of Segmentsを設定（4分割、等分布）します。
* **Mesh_1**をComputeします。

![VirtualBox_CAELinux2020_11_01_2021_10_52_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/b7af18e8-ba0f-09c8-36ec-01cc9eacd93d.png)

ジオメトリよりグループを作成します（メニューより、Mesh/Create Groups from Geometry）

* メッシュ：**Mesh_1**
* Elements：Geometryの**fix**、**shell**
* ダイアログを「Apply and Close」します。

![VirtualBox_CAELinux2020_11_01_2021_10_53_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/098337cf-79c6-c79d-d059-2a1e5ccbb933.png)

# Asterコマンドファイルを作成

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

AsterStudyモジュールを起動します。

アシスタントも用いてコマンドファイルの雛形を作成します（メニューより、Operations/Add Stage with Assistant/Modal analysis）

* メッシュ：**Mesh_1**
* 解析モデル：**3D**（のちほど**DKT**に変更します）
* 材料定数：
   * ヤング率：**132000**
   * 質量密度：**8.96e-9**
   * ポアソン比：**0.343**
* 拘束条件： 
   * グループ：**fix**
   * **DX=DY=DZ=0**
* 固有モード探索の基準：「N first eigenmodes」を選択、周波数の数を「5」に設定
* 結果ファイル（.rmed）の保存場所を指定します。

## Asterコマンドファイルを修正

有限要素モデルを**3D**から**DKT**に変更します。

```python:有限要素の選択
model = AFFE_MODELE(AFFE=_F(MODELISATION=('DKT', ), # シェルを指定
                            PHENOMENE='MECANIQUE',
                            TOUT='OUI'),
                    MAILLAGE=mesh)
```

shellグループに板厚を設定します（メニューより、Commands/Model Definition/AFFE_CARA_ELEM）。

```python:シェルの設定
elemprop = AFFE_CARA_ELEM(COQUE=_F(EPAIS=10.0, # シェルの厚さを設定
                                   GROUP_MA=('shell', )),
                          MODELE=model)
```

境界条件に回転自由度を追加します。
**LIAISON='ENCASTRE'**を用いて全自由度拘束でも可能です。

```python:
mecabc = AFFE_CHAR_MECA(DDL_IMPO=_F(DRX=0.0, # 追加
                                    DRY=0.0, # 追加
                                    DRZ=0.0, # 追加
                                    DX=0.0,
                                    DY=0.0,
                                    DZ=0.0,
                                    GROUP_MA=('fix', )),
                        MODELE=model)
```

モーダル解析の前処理を修正

```python:モーダル解析の前処理
ASSEMBLAGE(CARA_ELEM=elemprop, # 追加
           CHAM_MATER=materfl,
           CHARGE=(mecabc, ),
           MATR_ASSE=(_F(MATRICE=CO('rigidite'),
                         OPTION='RIGI_MECA'),
                      _F(MATRICE=CO('masse'),
                         OPTION='MASS_MECA')),
           MODELE=model,
           NUME_DDL=CO('numeddl'))
```

結果の出力を修正します。

```python:結果出力
IMPR_RESU(FORMAT='MED',
          RESU=_F(CARA_ELEM=elemprop, # 追加
                  RESULTAT=result),
          UNITE=80)
```

# 結果（変形の形状）
## 1次：630.2Hz
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/610754db-9ae7-5dfe-4f3e-ad80882e1026.png)
## 2次：1225.34Hz
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/2bde2386-5597-d4e3-f08e-9d8739aa0b70.png)
## 3次：3946.98Hz
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/6157991a-6c75-d286-0a98-759f6d18362a.png)
## 4次：6167.8Hz
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f12e1d75-a73e-f2b8-75e4-dfc3b981f244.png)
## 5次：6633.12Hz
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/26b602e5-e766-1802-6cb6-a02f92205c6e.png)

# ソースコード

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

```python:ここから（1次メッシュの場合）
DEBUT(LANG='EN')

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

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

elemprop = AFFE_CARA_ELEM(COQUE=_F(EPAIS=10.0,
                                   GROUP_MA=('shell', )),
                          MODELE=model)

mater = DEFI_MATERIAU(ELAS=_F(E=132000.0,
                              NU=0.343,
                              RHO=8.96e-09))

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

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

ASSEMBLAGE(CARA_ELEM=elemprop,
           CHAM_MATER=materfl,
           CHARGE=(mecabc, ),
           MATR_ASSE=(_F(MATRICE=CO('rigidite'),
                         OPTION='RIGI_MECA'),
                      _F(MATRICE=CO('masse'),
                         OPTION='MASS_MECA')),
           MODELE=model,
           NUME_DDL=CO('numeddl'))

result = CALC_MODES(CALC_FREQ=_F(NMAX_FREQ=5),
                    MATR_MASS=masse,
                    MATR_RIGI=rigidite,
                    OPTION='PLUS_PETITE')

IMPR_RESU(FORMAT='MED',
          RESU=_F(CARA_ELEM=elemprop,
                  RESULTAT=result),
          UNITE=80)

FIN()
```