OpenFOAMとParaViewを試す

モチベーション

昨年末からPINNsに取り組んで2つの課題に挑戦した。今後は流体力学分野の問題を選定して取り組もうと考えている。実は円柱周りの非圧縮流をテーマに取り組んでいるのだが、モデルのアウトプットを微分方程式に関連付ける部分(PINNsの肝の部分)が分からず1週間停滞中。

流体力学分野に取り組むのならOpenFOAMを少し勉強しようと考え、OpenFOAM、ParaViewをインストールし、例題を試した。

情報源

  1. OpenFOAMのDocker Imageの作成方法 - OpenFOAMのdockerイメージを作成するのに大いに参考になった。
  2. ParaView - 「DOWNLOAD」ページからMac用のパッケージをダウンロードした。
  3. OpenFOAM 付属チュートリアル一覧 - チュートリアルについての解説。この解説だけだと自分は、理解できなかった。OpenFOAMとParaViewの世界に入って行けなかった。
  4. OpenFOAM入門:平面ポアズイユ流れのシミュレーション - ここの情報を追っていくことで、OpenFOAMとParaViewの世界観が、少しは理解できた。
  5. Raocp/PINN-laminar-flow - PINNsで取り組もうとしていて、参照しているページ。ここの論文の(3)式、(4)式の導入が理解できず、つまずいている。

インストール

システム構成

自分がOpenFOAMとParaViewを試す環境として、以下を想定している。OpenFOAMはdockerコンテナでサーバ上で動かし、出力結果を 手元のMacからNFSマウントで参照し、ParaViewで表示する。

SysConf

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で可視化すると次のとおり。

mesh

準備

「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は次のとおり。

U

p

まとめ

PINNsに行き詰ったので気分転換も兼ね、OpenFOAMとParaViewを試してみようとインストールして、チュートリアルを実行した。OpenFOAMとParaViewは、奥が深く、軽い気持ちで着手したことの間違いに気づいた。

OpenFOAMとParaViewをインストールした後、例として、「ポアズイユ流」シミュレーションのため各種ファイルを設定し、シミュレーションを実行し、結果を可視化した。それを通じて一連の手順について、少しは理解できた。しかしながら、設定の内容およびシミュレーション結果については、評価できるところまでは、流体力学の理解ができていない。今後、少しでも理解を深めていきたい。