Salome-Meca 2018 をPythonから実行する方法（Ubuntu18.04）

##はじめに
Salome-Mecaとはプリポストとソルバーがセットになった、オープンソースの構造解析ソフトです。
このSalome-MecaはPythonで操作や制御が可能な上、GUIを立ち上げずにターミナルからコマンド操作も可能です。
Salome-Mecaは基本的にはGUIで操作をしますが、パラメータスタディなどで何度も繰り返し計算をさせる場合にはコマンド操作が便利です。
GUIを使った使用方法などは、以下のサイトが参考になります。（少し情報は古いですが）

> OpenCAE Users Wiki
> [SALOME-Mecaの使用法解説][link-1]
[link-1]:http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?SALOME-Meca%A4%CE%BB%C8%CD%D1%CB%A1%B2%F2%C0%E2

## 対象

- Salome-Mecaを使って繰り返し計算をしたい人
- Salome-Mecaの解析自動化をしたい人


## 準備
### 1. PATHを通す
まず初めに~/.bashrc にPATHの設定を追加しておきます。

```bash
export $PATH=~/salome_meca/appli_V2018.0.1_public
```

### 2. 解析に必要なファイルを用意
PythonスクリプトからCUIで計算させる場合、以下の3つのファイルが必要になります。
注意点としては、GUIの操作で解析の設定を全て完了しないと、これらのファイルが作成されませんので、一度GUIを使って解析のステップまで進めておく必要があります。
（一旦作成できれば、テキストを編集する事で解析の設定変更などが可能になります）

AsterStudyモジュールの解析の設定完了後に一度解析を実行することで、下記の作業ディレクトリの中にファイルが作成されます。

- 作成される場所：`/任意ディレクトリ/Study＊_Files/RunCase_＊/Result-Stage_＊` 
（ファイルパス中の＊は数字です。保存するファイルで変わります）
- commファイル（境界条件などの設定ファイル）
- medファイル（メッシュファイル）
- exportファイル（commファイル・medファイルの指定、使用メモリ量などの設定ファイル）


解析用のディレクトリ（~/test）を作成して、３つのファイルを置いておきます。
(↓こんな感じ)

```
~/test
┣ ○○.comm  (境界条件などの設定ファイル)
┣ ○○.med   (メッシュファイル)
┗ export   (解析条件の設定ファイル)
```

### 3. exportファイルの編集
exportファイルは、解析に必要なメッシュファイルの場所や結果の出力場所などが記述されたファイルのため、先ほど作成した解析用ディレクトリ(~/test)を確実に読み込むように編集しておきます。

以下のようにファイルパスと必要に応じてファイル名を修正します。（ファイル下部の５行）

```bash:export
P actions make_etude
P debug nodebug
P memjob 20971520
P memory_limit 20480.0
P mode interactif
P mpi_nbcpu 1
P mpi_nbnoeud 1
P nomjob RunCase_1_Stage_1 
P origine AsterStudy 0.11
P rep_trav /tmp/kura-kura-desktop-interactif_7147
P studyid 5079-0001-kura-desktop
P time_limit 900.0
P tpsjob 16
P version stable
A memjeveux 2560.0
A tpmax 900.0
F comm /home/**/test/RunCase_*_Stage_*.comm D  1 # 修正
F libr /home/**/test/Mesh.med D  20              # 修正
F libr /home/**/test/test.rmed R  80             # 修正
F mess /home/**/test/message R  6                # 修正
R base /home/**/test/base-stage1 RC 0            # 修正

```
パス末尾の大文字（DやRなど）と数字（1や20）を消さないように気をつけます。
これで準備完了です。

## 計算実行
CUIで計算を実行するためには、Salome-Mecaをターミナルモードで起動させる必要があります。
さきほどの3つのファイルが置いてあるディレクトリ(~/test)に移動後、bashで以下を入力して下さい。
`-t`オプションをつけることでCUIモードで起動できます。

```bash
$ salome -t
```
次に、salome shell を立ち上げ、`-- as_run export`オプションをつけて実行します。

```bash
$ salome shell -- as_run export
```

これで計算が実行され、commファイルに記述されている保存場所と名前で結果ファイルが保存されます。
ちなみに、計算終了後はターミナルモードで起動中のSalome-Mecaを落としておいた方が良いです。
理由は、Salome-Mecaを起動したまま何度も計算を続けると、SALOME_ContainerやSALOME_SessionServerなどのメモリ使用量が上がり続け、いずれ計算ができなくなってしまうからです。
メッシュ数に依存するようですが、筆者の環境では100回以内で止まることが多いです。

```bash
$ salome killall
```

とすることで、ターミナルモードで起動中のSalome-Mecaを完全に落とすことができます。


## Pythonスクリプトで実行する場合
以上の手順をスクリプトにまとめておき、bashから実行することで、起動→計算実行→終了を一度に処理することができます。
Pythonから外部プロセスを実行するため、subprocessモジュールを使います。

```python
import subprocess

class RunSalome():
    def __init__(self, wd):
        self.workdir = wd

    def run(self):
        cmd0 = "salome -t"
        cmd1 = "salome shell -- as_run export"
        cmd2 = "salome killall"

        subprocess.run(cmd0.split())
        subprocess.run(cmd1.split(), cwd=self.workdir)
        subprocess.run(cmd2.split())

if __name__ == "__main__":
    r = RunSalome(`/解析実行ディレクトリパス`)
    r.run()
```

## 最後に

パラメータスタディをする場合、モデリングと解析を繰り返す必要がありますが、FreeCADでモデリングしてからSalome-Mecaで解析を自動化すると非常に便利です。
この方法については後日記事にしたいと思います。

Pythonスクリプトを使ったFreeCADのモデリング方法は、以下を参考にしてください。

>Qiita
> [-Python3スクリプトでFreeCADモデリング（Ubuntu18.04）][link-2]
[link-2]:https://qiita.com/hiro_kuramoto/items/3f1253002fc2ab7d46ab