M2 MacにOpenFOAM v2012をインストールする

# 概要
この記事はM2 Macbook Airにオープンソースの流体解析ソフトウェアOpenFOAMをインストールする方法、またチュートリアル(ダムブレイク)の実行方法をまとめた記事です。

# はじめに
私は学生時代、土木・海岸工学分野を専攻していました。
現在はIT業界のエンジニアとして働いていますが、改めて海岸工学や土木、数値流体力学を学習したいと強く思い、アウトプットの一環として今回Qiitaに記事を投稿してみました。

私は以前windows環境でOpenFOAMを使った研究を行っていましたが、MacでもOpenFOAMを使いたいと思い、OpenFOAMのインストールを行いました。

そこで、この記事はM2 Macbook AirでopenFOAMをインストールする方法を整理します。

# 記事の対象読者
- OpenFOAMに関心のある方・インストールしたい方
- ITやソフトウェアに深い理解は無いが、計算できる環境を整えたい方


# 環境
- M2 MacBook Air
- OpenFOAM v2012　※1
- ParaView -5.10.1 ※2

※1 以前使用していたOpenFOAMのバージョンがv2012なので、今回もv2012をインストールします。
※2 計算結果の可視化にParaViewを使用します。インストール方法は省略します。

# OpenFOAMv2012のインストール

[公式サイト](https://www.openfoam.com/download/openfoam-installation-on-mac-using-docker)を参考にdockerを用いてOpenFOAMをインストールします。

※今回は、dockerのインストール方法についての説明は省略します。
（Qiitaを含めて情報はたくさんありそう）

### 1.OpenFOAM v2012をインストールする準備
```
# ユーザのホームディレクトリに移動する
$ cd $HOME

# OpenFOAMの作業用ディレクトリを作成し、移動する
$ mkdir OpenFOAM
$ cd OpenFOAM

# openfoam-dockerという名前の空ファイルを作る
$ touch openfoam-docker
```
次に、作成したopenfoam-dockerファイルに[こちらのサイト](https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/docker)内のopenfoam-docker scriptの内容をコピーする（コピペすればOK）

### 2.OpenFOAM v2012をインストールする

```
# OpenFOAMの作業用ディレクトリに移動する
$ cd $HOME/OpenFOAM

# openfoam-dockerファイルへの実行権限を与える
$ chmod +x openfoam-docker

# openfoam-dockerファイルに対してopenfoam2012-defaultという名前のシンボリックリンクを作成する
$ ln -sf openfoam-docker openfoam2012-default

# OpenFOAM環境のイメージを起動する
$　./openfoam2012-default

# コマンドの実行結果...なんだかうまくいってそう
---------------------------------------------------------------------------
  =========                 |
  \\      /  F ield         | OpenFOAM in a container [from OpenCFD Ltd.]
   \\    /   O peration     |
    \\  /    A nd           | www.openfoam.com
     \\/     M anipulation  |
---------------------------------------------------------------------------
 Release notes:  https://www.openfoam.com/news/main-news/openfoam-v2012
 Documentation:  https://www.openfoam.com/documentation/
 Issue Tracker:  https://develop.openfoam.com/Development/openfoam/issues/
 Local Help:     more /openfoam/README
---------------------------------------------------------------------------
System   :  Ubuntu 20.04.3 LTS  (admin user: sudofoam)
OpenFOAM :  /usr/lib/openfoam/openfoam2012
Build    :  _269d0ffd5c-20210619 OPENFOAM=2012 patch=210618
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　一部省略
openfoam2012:~/

# exitと打ち込むとOpenFOAMを終了できる
openfoam$　exit
```

### 3.OpenFOAM内でnano、treeを使えるようにする （任意）
前節でOpenFOAMを使える環境を整えた。この節では、nanoエディタやtreeコマンドをOpenFOAM環境内で使えることを目標にする。
この節を飛ばして、次に進んでも計算はできます。

```
# OpenFOAMの作業用ディレクトリに移動し、Dockerfileを作成する
$ cd $HOME/OpenFOAM
$ touch Dockerfile
```
Dockerfileの中身をこんな感じにする
```
FROM opencfd/openfoam-default:2012
RUN apt update && apt install tree && apt install nano
```
Dockerfileが作成できたら、以下を実行する
```
# OpenFOAMの作業用ディレクトリに移動
$ cd $HOME/OpenFOAM

# 作成するイメージ名を「myopenfoam」とした。
$ docker build ./ -t myopenfoam

# コンテナの実行、「-it」オプションをつけないと動かなかった
$ docker run -it myopenfoam

# 実行結果、おそらく大丈夫だろう
---------------------------------------------------------------------------
  =========                 |
  \\      /  F ield         | OpenFOAM in a container [from OpenCFD Ltd.]
   \\    /   O peration     |
    \\  /    A nd           | www.openfoam.com
     \\/     M anipulation  |
---------------------------------------------------------------------------
 Release notes:  https://www.openfoam.com/news/main-news/openfoam-v2012
 Documentation:  https://www.openfoam.com/documentation/
 Issue Tracker:  https://develop.openfoam.com/Development/openfoam/issues/
 Local Help:     more /openfoam/README
---------------------------------------------------------------------------
System   :  Ubuntu 20.04.3 LTS  (admin user: sudofoam)
OpenFOAM :  /usr/lib/openfoam/openfoam2012
Build    :  _269d0ffd5c-20210619 OPENFOAM=2012 patch=210618
```
Docker DesktopのImagesを確認してみると、myopenfoamが追加されている。
これから「myopenfoam」イメージを使用する場合は、「opencfd/openfoam-default」を削除してもOK

![スクリーンショット 2024-07-13 9.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831763/1a7c1e3b-ba50-722f-0c5d-94b79e31d7b3.png)


### 4.チュートリアルを実施する準備
```
# OpenFOAMの作業用ディレクトリに移動する
$ cd $HOME/OpenFOAM

# [前節で新たにイメージを作成した場合]

# コンテナ内のデータ（計算結果）を残すために、バインドマウントという方法を用いる
# 計算結果保存用ディレクトリcalDataをローカルに作成
$ mkdir calData

# ホストマシンのディレクトリ 「/Users/username/OpenFOAM/calData」を
# コンテナのディレクトリ 「/root」にバインドマウントをして、OpenFOAM環境のイメージを起動する
$ docker run -it -v /Users/username/OpenFOAM/calData:/root myopenfoam

# [前節で新たなイメージの作成を行っていない場合]
# OpenFOAM環境のイメージを起動する
$ ./openfoam2012-default
```
```
# チュートリアルディレクトリに移動する、$FOAM_TUTORIALSはチュートリアルディレクトリへのパス
$ cd $FOAM_TUTORIALS

# 中身を確認する
$ tree -L 1
# treeコマンドが使えない方は以下のコマンドを実行
$ pwd; find . -maxdepth 1 | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'

# 実行結果
.
|-- Allclean
|-- Allcollect
|-- Allrun
|-- Alltest
|-- AutoTest
|-- DNS
|-- IO
|-- basic
|-- combustion
|-- compressible
|-- discreteMethods
|-- electromagnetics
|-- financial
|-- finiteArea
|-- heatTransfer
|-- incompressible
|-- lagrangian
|-- mesh
|-- modules
|-- multiphase
|-- preProcessing
|-- resources
|-- stressAnalysis
`-- verificationAndValidation

# 今回は、ダムブレイクまで移動
$ cd multiphase/interFoam/laminar/damBreak

# 計算用ディレクトリを作成
$ mkdir -p $FOAM_RUN

# ダムブレイクのチュートリアルを計算用ディレクトリにコピーする
$ cp -r damBreak $FOAM_RUN

# 計算用ディレクトリに移動、中身を確認
$ cd $FOAM_RUN
$ ls

実行結果
damBreak

# コピーしたdambreakディレクトリの名前を変更する　（任意）
$ mv damBreak mydamBreak
```
### 5.チュートリアルの実施 (ダムブレイク)

無事にインストールできたか確認するためにダムブレイクのチュートリアルを行う。

早速チュートリアルを実行しようと思うが、その前にmydamBreakの中身を確認する。
ディレクトリ名、ファイル名で予想はできるが、簡単な説明を加えた。

```
# mydamBreakディレクトリに移動する
$ cd $FOAM_RUN/mydamBreak

# mydamBreakディレクトリの中身を確認する
$ tree -L 2
# treeコマンドが使えない方は以下のコマンドを実行
$ pwd; find . -maxdepth 2 | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'

実行結果
|--0.orig
|  |-- U           #速度ベクトル場の設定
|  |-- alpha.water #水相率場の設定
|  `-- p_rgh       #静水圧を引いた圧力場の設定
|-- Allclean
|-- Allrun
|-- constant
|  |-- g                    #重力加速度の設定
|  |-- transportProperties  #流体物性
|  `-- turbulenceProperties #乱流モデルの設定(中身を確認すると”laminar”と記載がある、
　　　　　　　　　　　　　　　　　このチュートリアルでは乱流モデルは使用せず、層流モデルを使用)
`-- system
    |-- blockMeshDict       #メッシュの生成に関する設定
    |-- controlDict         #解析制御設定(計算時間間隔や最大クーラン数などの設定)
    |-- decomposeParDict    #領域分割の設定(並列計算を行う時に確認が必要)
    |-- fvSchemes           #離散化スキーム設定
    |-- fvSolution          #緩和係数の設定など
    |-- sampling            #波高計の設置やサンプリング間隔の設定（ダムブレイクの計測値を
    　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　触ったことが無く、詳しいことはわからない）
    `-- setFieldsDict       #気相・液相分布の定義（水がある領域、空気だけの領域を指定）
```
Allrun、Allcleanファイルの中身を確認する。これらのファイルを実行するには「./Allrun」や「./Allclean」と打ち込めば良い。
```
#Allrunファイルの中身を一部抜粋
#-----------------------------------------------------------------------------
#!/bin/sh
cd "${0%/*}" || exit                                # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions

restore0Dir 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#0.origの内容を0ディレクトリにコピーする
runApplication blockMesh 　　　　　　　　　　　　　　　　#メッシュ生成
runApplication setFields 　　　　　　　　　　　　　　　　#境界条件を設定
runApplication $(getApplication) #ソルバの実行、今回はinterFoam。interFoam？と思った方は
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　controlDictの中身を確認するといいかも

#-----------------------------------------------------------------------------

#Allcleanファイルの中身を一部抜粋
#-----------------------------------------------------------------------------
#!/bin/sh
cd "${0%/*}" || exit                                # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions      # Tutorial clean functions

cleanCase0

#-----------------------------------------------------------------------------
```
いよいよダムブレイクの計算を行う。
今回は、Allrunファイルにある「runApplication　〇〇」の部分はコメントアウトし、
コマンドを直接入力する。
（もちろん コメントアウトせずに「./Allrun」と打ち込んでもOK）

また、controlDictファイルにあるdeltaT（計算時間間隔）を0.01(s)に変更し、
endTimeは3(s)に変更している。

```
# mydamBreakディレクトリに移動する
$ cd $FOAM_RUN/mydamBreak

# 0.origをコピーした0ディレクトリの作成など
$ ./Allrun

# メッシュの生成
$ blockMesh

# 気相・液相の初期条件を作る
$ setFields

# 計算実行、たくさんログが出るはず
$ interFoam

# ディレクトリの確認、いい感じかも
$ ls
(一部抜粋)
0     0.1   0.2   0.3   0.4   0.5   0.6   0.7   0.8   0.9   0.orig  Allclean  constant        system
0.05  0.15  0.25  0.35  0.45  0.55  0.65  0.75  0.85  0.95  1       Allrun    postProcessing

# .foamファイルを作成 （可視化に必要）
$ touch aa.foam
```

ParaViewで計算結果の可視化を行う。
計算条件などの議論は置いておいて、計算はできてますね。
![ダムブレイク.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831763/58e59441-8340-9527-e84a-9ed2193f51a1.gif)

# 最後に
今回、MacにOpenFOAMをインストールしてみましたが、意外とすんなりいった？と思いました。しかし、「docker」は若干のハードルかも...。

実は、この記事を執筆する過程で海岸工学分野の研究で用いられる（私も使用していた）OpenFOAMのライブラリをインストールしようと思いましたが、なかなかうまくいかず...別記事でまとめられるといいなと思っています。