FrontISTRをWindows 10のDockerで使ってみた

2020年8月4日CAECAE,Docker,FrontISTR,Linux,Windows,WSL2

FrontISTRというCAEソフトがあります。このソフトのマニュアルを読むと、基本的にLinuxにインストールして使用するソフトなのですが、ふと公式サイトを見たところDockerリポジトリーが公開されていたので、Dockerリポジトリーを使ってWindows上にインストールしてみました。

Windowsであればバイナリファイルが配布されていますし、WSL2(Windows Subsystem for Linux)のUbuntuを使えば公式マニュアル通りにインストールできると思いますが、今回はDockerの練習もかねて、Dockerを使用しました。

前提のシステム要件

まず、Windows 10にWSL2をインストールします。手順はこちらのページにまとめました。

続いて、Docker Desktopをインストールします。この手順は、こちらのページにまとめています。

FrontISTRのDockerリポジトリーをダウンロード

FrontISTRのダウンロードページに行くと、各バージョンのDockerイメージを落とせるよう、docker pullコマンドが掲載されています。

今回はv5.1をインストールします。v5.1の「Docker」のリンクをクリックし、docker pullコマンドをコピーします。

PowerShell(もしくはコマンドプロンプト)を起動して、コピーしたコマンドを実行します。

PS C:\> docker pull registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1
v5.1: Pulling from frontistr-commons/frontistr/fistr1
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
380ba44ad6e5: Pull complete
2931644c996b: Pull complete
Digest: sha256:a47784568fb143dee548c54ceb9c3204f33031257af5120315f0525f8caeb6cb
Status: Downloaded newer image for registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1
registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1

pullできたら、一度イメージの一覧を表示してみます。ダウンロードできていることが分かります。

PS C:\> docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
中略
registry.gitlab.com/frontistr-commons/frontistr/fistr1   v5.1                3ac2f6883392        4 weeks ago         191MB

Dockerをインタラクティブに動かしてチュートリアルをしてみる

まず、ダウンロードしたリポジトリーを使って、インタラクティブに使えるコンテナを作ってFrontISTRを動かしてみたいと思います。

Dockerコンテナの作成

ダウンロードしたリポジトリーを使って、コンテナを作ります。今回実行したコマンドはdocker create -i --name fistr51 -v c:\:/mnt/win-c registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1です。

-iはインタラクティブ動作をさせるためのものです。
--nameは分かりやすい名前をつけます。今回はfistr51にしました。
-vで、ホスト側のフォルダをコンテナ側にマウントします。今回は、WindowsのCドライブを、Linux側の/mnt/win-cにマウントしました。
最後の引数は、使用するリポジトリーです。リポジトリー名:タグを指定しています。

docker createすると、Docker Desktopのダッシュボードにも、作成したコンテナが表示されます。

PS C:\> docker create -i --name fistr51 -v c:\:/mnt/win-c  registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1
1f7026581f6cd31546eeb556c6fdf056949d4c0d0b6bd4f4cd08d13d232b8e35

続いて、作成したコンテナを実行します。docker start fistr51というように、先ほど指定したコンテナ名でスタートします。このコマンドは、Docker DesktopのダッシュボードからSTARTボタンを押しても同じです。ちなみに、上記のdocker createの代わりに、docker runを使用すると、コンテナ作成後に自動的にコンテナが動き出しますので、docker startは不要です。

PS C:\> docker start fistr51
fistr51

続いて、docker execコマンドで起動したコンテナのシェルを開きます。末尾のパスは、使用するシェルへのパスを指定します。実行すると、コンテナ側のプロンプトが表示されます。

PS C:\> docker exec -i -t fistr51 /bin/bash
root@1f7026581f6c:/#

試しにfistr1を実行すると、バージョン情報が表示されます。

root@1f7026581f6c:/# fistr1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:    5.1.0
git_hash:   f3fe347a8fd83cd45983476521d43061c8528da0
以下略

これでコンテナの用意ができました。

チュートリアルを実行

公式のチュートリアルをしてみます。前述のダウンロードページから、v5.1のソースコードを落としてきて、Cドライブの直下に解凍します。

bashで、チュートリアルのフォルダに移動します。

root@1f7026581f6c:/# cd /mnt/win-c/FrontISTR-v5.1/tutorial/01_elastic_hinge/
root@1f7026581f6c:/mnt/win-c/FrontISTR-v5.1/tutorial/01_elastic_hinge#

ここでfistr1を実行すると、チュートリアルの計算が始まります。

root@1f7026581f6c:/mnt/win-c/FrontISTR-v5.1/tutorial/01_elastic_hinge# fistr1
##################################################################
#                         FrontISTR                              #
##################################################################
---
version:    5.1.0
git_hash:   f3fe347a8fd83cd45983476521d43061c8528da0
build:
  date:     2020-06-30T13:56:53Z
  MPI:      enabled
  OpenMP:   enabled
  option:   "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml "
  HECMW_METIS_VER: 5
execute:
  date:       2020-08-02T15:11:56+0000
  processes:  1
  threads:    8
  cores:      8
  host:
    0: 1f7026581f6c
---
...
 Step control not defined! Using default step=1
 fstr_setup: OK
 Start visualize PSF 1 at timestep 0

 loading step=    1
 sub_step= 1,   current_time=  0.0000E+00, time_inc=  0.1000E+01
 loading_factor=    0.0000000   1.0000000
### 3x3 BLOCK CG, SSOR, 1
      1    1.903375E+00
      2    1.974378E+00
      3    2.534627E+00
      4    3.004045E+00

中略

   2965    1.188443E-08
   2966    1.143242E-08
   2967    1.077974E-08
   2968    1.003847E-08
   2969    9.378912E-09
### Relative residual = 9.39860E-09

### summary of linear solver
      2969 iterations      9.398601E-09
    set-up time      :     1.830644E-01
    solver time      :     8.181565E+01
    solver/comm time :     6.386476E-01
    solver/matvec    :     2.922772E+01
    solver/precond   :     4.454701E+01
    solver/1 iter    :     2.755664E-02
    work ratio (%)   :     9.921941E+01

 Start visualize PSF 1 at timestep 1
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :     86.59
           pre (sec) :      0.79
         solve (sec) :     85.80
 ====================================
 FrontISTR Completed !!
FrontISTR Completed !!

どうやら、ちゃんと動いているっぽそうです。

exitを実行すると、コンテナ中のシェルから抜け出せます。

root@1f7026581f6c:/mnt/win-c/FrontISTR-v5.1/tutorial/01_elastic_hinge# exit
exit
PS C:\>

また、docker stop fistr51で、実行していたコンテナを停止できます。停止は少し時間がかかるようです。このコマンドは、Docker DesktopのダッシュボードからSTOPを押しても実行できます。

PS C:\> docker stop fistr51
fistr51
PS C:\>

単発でコンテナを作成してチュートリアルをしてみる

別の方法でもチュートリアルの計算をやってみたいと思います。

前述の方法では、インタラクティブシェルが動くコンテナを作成しました。対して、単発でコンテナを作成して、FrontISTRを実行して、計算が終わったらコンテナを削除する、という方法でも使用できますので、それをやってみたいと思います。といっても、打つコマンドは実質一つだけです。

上と同じように、FrontISTRの公式ページからv5.1のソースコードをダウンロードし、Cドライブ直下に解凍します。

PowerShellを開き、cdコマンドでチュートリアルのフォルダに移動します。

PS C:\> cd C:\FrontISTR-v5.1\tutorial\01_elastic_hinge

次に、Dockerコンテナを作成して実行するコマンドを実行します。コマンドはdocker run --name fistr51a --rm -v ${pwd}:/mnt/work -w /mnt/work registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1 fistr1です。

docker runは、前述の実行例で言う、docker createdocker startを組み合わせたものです。
--nameは前述の例と同様、コンテナの名前を任意で指定します。この引数は必須ではないですが、コンテナ名が分かっていると計算を中断させやすいので、明示的に指定しておきます。
--rmは、実行後にコンテナを消去するよう設定しています。
-vでは、Windows側のカレントディレクトリ(この例では01_elastic_hinge)を、Linux側の/mnt/workにマウントするように設定しています。
-wは、Linux側のカレントディレクトリを指定しています。-vでマウントしたディレクトリ、つまりWindows側のカレントディレクトリを指定しています。
続く引数は、起動するDockerリポジトリーのリポジトリー名:タグを指定します。
最後の引数は、Dockerコンテナで実行するコマンドを指定します。ここでは単にfistr1を実行します。

ちなみに、-vで指定している${pwd}は、PowerShellでカレントディレクトリのパスを表す変数です。なので、コマンドプロンプトで動かしたい場合は、代替の記載をする必要があります。

PS C:\FrontISTR-v5.1\tutorial\01_elastic_hinge> docker run --name fistr51a --rm -v ${pwd}:/mnt/work -w /mnt/work  registry.gitlab.com/frontistr-commons/frontistr/fistr1:v5.1 fistr1

実行結果はこちらです。

##################################################################
#                         FrontISTR                              #
##################################################################
---
version:    5.1.0
git_hash:   f3fe347a8fd83cd45983476521d43061c8528da0
build:
  date:     2020-06-30T13:56:53Z
  MPI:      enabled
  OpenMP:   enabled
  option:   "-p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml "
  HECMW_METIS_VER: 5
execute:
  date:       2020-08-03T10:30:14+0000
  processes:  1
  threads:    8
  cores:      8
  host:
    0: 0362a984dc2a
---
...
 Step control not defined! Using default step=1
 fstr_setup: OK
 Start visualize PSF 1 at timestep 0

 loading step=    1
 sub_step= 1,   current_time=  0.0000E+00, time_inc=  0.1000E+01
 loading_factor=    0.0000000   1.0000000
### 3x3 BLOCK CG, SSOR, 1
      1    1.903375E+00
      2    1.974378E+00
      3    2.534627E+00
      4    3.004045E+00

中略

   2965    1.187363E-08
   2966    1.142312E-08
   2967    1.078976E-08
   2968    1.004497E-08
   2969    9.373681E-09
### Relative residual = 9.38945E-09

### summary of linear solver
      2969 iterations      9.389448E-09
    set-up time      :     1.834822E-01
    solver time      :     7.461448E+01
    solver/comm time :     6.376212E-01
    solver/matvec    :     2.920223E+01
    solver/precond   :     3.728695E+01
    solver/1 iter    :     2.513118E-02
    work ratio (%)   :     9.914545E+01

 Start visualize PSF 1 at timestep 1
### FSTR_SOLVE_NLGEOM FINISHED!

 ====================================
    TOTAL TIME (sec) :     79.46
           pre (sec) :      0.76
         solve (sec) :     78.69
 ====================================
 FrontISTR Completed !!
PS C:\FrontISTR-v5.1\tutorial\01_elastic_hinge>

この方法でも、ちゃんと動いてそうです。こちらの方法の場合、計算が終了したら自動的にコンテナも消去されます。

ちなみに、この方法で実行しているときにCtrl+Cでコマンドを中断すると、プロンプトが戻ってきて一見すると計算を中断できたように見えます。ですが、裏ではDockerコンテナが生きていて、計算が続行しています。

ですので、中断した際は、合わせてコンテナを停止するコマンドも実行します。コンテナの停止は、docker stop fistr51aでできます。停止次第、自動的にコンテナが削除されます。

PS C:\FrontISTR-v5.1\tutorial\01_elastic_hinge> docker stop fistr51a
fistr51a

コンテナの停止は、Docker Desktopのダッシュボードからも行えます。そちらの方が分かりやすいかもしれません。