モチベーション
昨年末からPINNsに取り組んで2つの課題に挑戦した。今後は流体力学分野の問題を選定して取り組もうと考えている。実は円柱周りの非圧縮流をテーマに取り組んでいるのだが、モデルのアウトプットを微分方程式に関連付ける部分(PINNsの肝の部分)が分からず1週間停滞中。
流体力学分野に取り組むのならOpenFOAMを少し勉強しようと考え、OpenFOAM、ParaViewをインストールし、例題を試した。
情報源
- OpenFOAMのDocker Imageの作成方法 - OpenFOAMのdockerイメージを作成するのに大いに参考になった。
- ParaView - 「DOWNLOAD」ページからMac用のパッケージをダウンロードした。
- OpenFOAM 付属チュートリアル一覧 - チュートリアルについての解説。この解説だけだと自分は、理解できなかった。OpenFOAMとParaViewの世界に入って行けなかった。
- OpenFOAM入門:平面ポアズイユ流れのシミュレーション - ここの情報を追っていくことで、OpenFOAMとParaViewの世界観が、少しは理解できた。
- Raocp/PINN-laminar-flow - PINNsで取り組もうとしていて、参照しているページ。ここの論文の(3)式、(4)式の導入が理解できず、つまずいている。
インストール
システム構成
自分がOpenFOAMとParaViewを試す環境として、以下を想定している。OpenFOAMはdockerコンテナでサーバ上で動かし、出力結果を 手元のMacからNFSマウントで参照し、ParaViewで表示する。
Dockerfile
情報源1.を参考に、次のDockerfileでOpenFOAMコンテナを作成した。
FROM ubuntu:22.04
# Install any extra things we might need
RUN apt-get update \
&& apt-get install -y \
vim \
ssh \
sudo \
wget \
software-properties-common ;\
rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt-get install -y \
lv \
htop \
neofetch \
curl \
git ;\
rm -rf /var/lib/apt/lists/*
RUN curl https://dl.openfoam.com/add-debian-repo.sh | bash
RUN apt-get update \
&& apt-get install -y openfoam2406-default ;\
rm -rf /var/lib/apt/lists/*
# Create a new user called foam
RUN useradd --user-group --create-home --shell /bin/bash foam ;\
echo "foam ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER foam
WORKDIR /home/foam
RUN echo "source /usr/lib/openfoam/openfoam2406/etc/bashrc" >> ~/.bashrc
最初、OpenFOAMのチュートリアルをrootユーザで実行したところ、次のエラーが発生したので、情報源1.を参考に「foam」ユーザ作成部分を追加した。
--> FOAM FATAL IO ERROR: (openfoam-2406 patch=241212)
This code should not be executed by someone with administrator rights for security reasons.
コンテナの実行
作成したコンテナは、次のように実行し、コンテナとホスト間でデータを共有している。ちなみに、$(OPENFOAM_DIR)は、NFSマウントされている領域である。
export OPENFOAM_DIR=/mnt/nfs2/workspace/openfoam
sudo docker run -it --rm -v ${OPENFOAM_DIR}:/home/foam openfoam bash
ParaViewのインストール
情報源2.で示したParaViewのページからダウンロードページを開き、Mac用の「ParaView-5.13.1-MPI-OSX10.15-Python3.10-x86_64.dmg」をダウンロードし、インストールした。
シミュレーション実行
組み込まれているチュートリアルコードを実行するだけでは、OpenFOAMの理解は深まらないと思い、情報源4.を参考に、実際に必要なファイルを自分で作成した。
メッシュを作成
今回、ポアズイユ流の課題を実行するにあたって、「try」ディレクトリを作成し、その配下にsystem、constantディレクトリを作成した。
systemディレクトリ配下に、「controlDict」、「blockMeshDict」を作成した。その後「try」ディレクトリで、blockMeshを実行。
openfoam2406:~/try/
foam$ blockMesh
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 2406 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : _9bfe8264-20241212 OPENFOAM=2406 patch=241212 version=2406
(omitted in the middle)
Writing polyMesh with 0 cellZones
----------------
Mesh Information
----------------
boundingBox: (0 0 0) (0.3 0.1 0.01)
nPoints: 2562
nCells: 1200
nFaces: 4880
nInternalFaces: 2320
----------------
Patches
----------------
patch 0 (start: 2320 size: 20) name: inlet
patch 1 (start: 2340 size: 20) name: outlet
patch 2 (start: 2360 size: 120) name: fixedWalls
patch 3 (start: 2480 size: 2400) name: frontAndBack
End
openfoam2406:~/try/
作成されたメッシュをParaViewで可視化すると次のとおり。
準備
「system」ディレクト配下に「fvSchemes」と「fvSolution」を作成。次に、「0」ディレクト配下に「p」と「U」を作成する。最後に、「constant」配下に「transportProperties」を作成する。情報源4.では、「physicalProperties」となっていたが、自分の環境では、「transportProperties」で上手くいった。
シミュレーション実行
openfoam2406:~/try/
foam$ icoFoam
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 2406 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : _9bfe8264-20241212 OPENFOAM=2406 patch=241212 version=2406
(omitted in the middle)
Time = 0.5
Courant Number mean: 0.276748 max: 0.412884
smoothSolver: Solving for Ux, Initial residual = 0.00027116, Final residual = 6.3461e-06, No Iterations 8
smoothSolver: Solving for Uy, Initial residual = 0.322225, Final residual = 9.39342e-06, No Iterations 21
DICPCG: Solving for p, Initial residual = 4.17235e-06, Final residual = 6.96067e-07, No Iterations 8
time step continuity errors : sum local = 6.48502e-09, global = -7.71682e-10, cumulative = -2.34105e-05
DICPCG: Solving for p, Initial residual = 3.49567e-06, Final residual = 5.00111e-07, No Iterations 8
time step continuity errors : sum local = 4.65936e-09, global = 3.79253e-10, cumulative = -2.34101e-05
ExecutionTime = 0.63 s ClockTime = 3 s
End
openfoam2406:~/try/
foam$
ここで、「try」配下に「try.foam」を作成(「$ touch try.foam」を実行)。
参考までに作成したファイルは、次のとおり。
drwxr-xr-x 2 kenji kenji 4096 1月 5 14:08 0
drwxr-xr-x 3 kenji kenji 4096 1月 5 14:02 constant
drwxr-xr-x 2 kenji kenji 4096 1月 5 14:11 system
-rw-r--r-- 1 kenji kenji 0 1月 5 13:19 tri.foam
-rw-r--r-- 1 kenji kenji 482 1月 5 14:08 0/U
-rw-r--r-- 1 kenji kenji 675 1月 5 14:05 0/p
-rw-r--r-- 1 kenji kenji 208 1月 5 14:02 constant/transportProperties
-rw-r--r-- 1 kenji kenji 1337 1月 5 12:56 system/blockMeshDict
-rw-r--r-- 1 kenji kenji 410 1月 5 12:51 system/controlDict
-rw-rw-r-- 1 kenji kenji 377 1月 5 14:11 system/fvSchemes
-rw-r--r-- 1 kenji kenji 384 1月 5 13:16 system/fvSolution
ParaViewで可視化したUとpは次のとおり。
まとめ
PINNsに行き詰ったので気分転換も兼ね、OpenFOAMとParaViewを試してみようとインストールして、チュートリアルを実行した。OpenFOAMとParaViewは、奥が深く、軽い気持ちで着手したことの間違いに気づいた。
OpenFOAMとParaViewをインストールした後、例として、「ポアズイユ流」シミュレーションのため各種ファイルを設定し、シミュレーションを実行し、結果を可視化した。それを通じて一連の手順について、少しは理解できた。しかしながら、設定の内容およびシミュレーション結果については、評価できるところまでは、流体力学の理解ができていない。今後、少しでも理解を深めていきたい。