OpenFOAM環境を改善

はじめに

先日の投稿で述べたとおり、2次元の円柱周りの流れのチュートリアルを実施している。このチュートリアルを実施していて、自分の環境では、pyFoamPlotWatcher.py、gnuplotが使えなかった。この投稿では、それらの改善策についてまとめた。

情報源

  1. Vortex shedding by Joel Guerrero 2D - このページから参照される、チュートリアルを実施中。
  2. PyFoamメモ - 当初、このページを参考に、最新のtarファイルをダウンロードしてインストールしようかと考えたが、簡単にpipインストールすることにした。
  3. リモートのDockerで実行したGUIアプリをSSHでX11 Forwardingする - X11 Forwardingの手順が記載されている。Docker起動コマンドは参考になった。
  4. Docker上のGUIアプリをホスト/リモートで描画する - X11 Forwardingの説明記事。Macから接続する場合についての記述あり。
  5. XQuartz.org - ここから、XQuartzをインストールした。

上手くいかなかったこと

pyFoamPlotWatcher.py

c2ではステップ3の次のコマンドライン。シミュレーション中のログファイルから残差をその場でプロットする部分である。pyFoamPlotWatcher.pyが存在しないとのエラー。

$ pyFoamPlotWatcher.py log.icofoam

gnuplot

c2ではステップ4の次のコマンドライン。gnuplot scripts0/plot_coeffsを使って力係数をその場でプロットする部分である。 当初作成したコンテナにgnuplotが入っていなかった。

$ gnuplot scripts0/plot_coeffs

対応の考え方

pyFoamインストール

pyFoamPlotWatcher.pyの問題については、pyFoamPlotWatcher.pyをインストールすれば良いと考えて、調べると、pyFoamに含まれていることが分かったので、pyFoamをインストールすることにした。情報源2.を見つけて、tarファイルからインストールしようかとも考えたが、pipでインストールすることにした。

gnuplotインストール

gnuplotコマンドがコンテナに入っていなかったので、コンテナにインストールすることにした。リモートのコンテナで動作するX11アプリを手元の端末(Mac)で表示するにはどうしたら良いかを考え、X11 Forwardingについて調べて、情報源3.と4.を参考に対応することにした。

具体的な対応策

Dockerfile

以下の通り、前回から、gnuplot、pythonをインストールする部分、およびpipでPyFoamをインストールする部分を追加した。

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 \
	gnuplot \
	python3.11-dev \
	python3-pip ;\
        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/*

# Python / pip
RUN ln -s $(which python3.11) /usr/bin/python

# Install python packages used so far
RUN pip install --upgrade pip setuptools \
        && pip install PyFoam

# 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

X11 Forwarding(Macクライアント側)の対応

Xサーバをインストール

X11アプリ(gnuplotを含む)をMacクライアント側で表示するため、Xサーバ・Xquartsをインストールした。インストールは、情報源5.からMac用のインストールパッケージをダウンロードして、インストールした。

DISPLAY変数の設定

ssh接続する前に、Macのターミナルで、DISPLAY変数を設定する。

% export DISPLAY=:0

Macでxサーバを起動していれば、上記設定を行った後、端末でxeyesと入力すると、Mac画面上にxeyesアプリが立ち上がる。

-Yオプションを付けてssh接続
% ssh -Y 192.168.11.3

上記のIPアドレスは、OpenFOAMコンテナが動作しているサーバである。

X11 Forwarding(サーバで動作するコンテナ)の対応

上記のDockerfileから作成したコンテナ(コンテナ名がopenfoam)を次のシェルスクリプトで起動する。

export OPENFOAM_DIR=/mnt/nfs2/workspace/openfoam
sudo docker run \
  -it \
  --rm \
  -e DISPLAY=$DISPLAY \
  --net host \
  -v ${OPENFOAM_DIR}:/home/foam \
  -v $HOME/.Xauthority:/home/foam/.Xauthority \
  openfoam 

各パラメータの意味を、次のように理解している。「-e DISPLAY=$DISPLAY」でDISPLAY変数を継承。「--net host」でホスト側のネットワーク設定をコンテナで共有する。「-v $HOME/.Xauthority:/home/foam/.Xauthority」でコンテナ側でもX11プロトコルを使えるようにする。

plot_coeffsを変更

gunuplotでplot_coeffsを実行すると、次のようなエラーが表示された。

$ gnuplot scripts0/plot_coeffs
"scripts0/plot_coeffs" line 9: warning: Cannot find or open file "postProcessing/forceCoeffs_object/0/forceCoeffs.dat"
"scripts0/plot_coeffs" line 9: No data in plot

「forceCoeffs.dat」は、「~/sol_postProcessing/forceCoeffs_object/0」に存在していたので、「sol_postProcessing/forceCoeffs_object/0/forceCoeffs.dat」と2箇所修正した。

実行結果イメージ

residualsのグラフ

Residuals

continuityのグラフ

Continuity

forceCoeffsのグラフ

Coefficients

まとめ

今回の投稿の内容は、OpenFOAMの機能に関することではなく、OpenFOAMに関係するインフラ寄りの内容となった。今後OpenFOAMを使っていく上で、便利になった。

今回の改善をする中で、リモートマシン上で動作するコンテナ内で動作するx11アプリの画面を手元のPC上(自分の場合はMac)の画面に表示するというX Forwardingについて学ことができた。