937
0
0

OpenFOAM コンパイルに関するメモ

Published at August 15, 2020 8:42 p.m.
Edited at March 23, 2022 8:55 p.m.

OpenFOAM コンパイルに関するメモ

詳細については,OpenFOAM v8 User Guide: 3.2 Compiling applications & libraries や Programmer's Guide 1.2節 を参照してください。(Programmer's Guide は,OpenFOAMのSourceForgeサイト から,各バージョンのPDFファイルが取得できます。)

この文書は,下記の講習を補足するものです。
OpenFOAMカスタマイズの始め方(v1912)

ソルバとライブラリ

OpenFOAMでは,多くのライブラリを作成し,そのライブラリに格納されている多くのクラスの機能を使って,必要な計算を実行する。シミュレーションの実行時には,ソルバ(solver)と呼ばれるプログラムを実行するが,そのソルバから様々なライブラリの機能を呼び出す。

ソルバとライブラリは,別々に,独立してコンパイルされる。simpleFoamソルバを例に,模式図を下に示す。

ソルバとライブラリのコンパイル。インクルードとリンク。

wmakeスクリプト

OpenFOAM では,make コマンドに必要な設定を追加した wmakeスクリプト によってコンパイルする。【実体は$WM_PROJECT_DIR/wmake/wmake

コンパイルに必要な情報は,Makeディレクトリの中に格納した files ファイルと options ファイルに記載する。

例として,simpleFoamソルバをコピーして作成した mySimpleFoamソルバ ディレクトリの構造を示す。このようにMakeディレクトリの存在する場所で wmake を実行すると,Make/files および Make/options の指示に従ってコンパイルが実行される。

shell
user@user-VirtualBox:~/OpenFOAM/user-v1912/solvers/mySimpleFoam$ tree
.
├── createFields.H
├── Make
│   ├── files
│   └── options
├── mySimpleFoam.C
├── pEqn.H
└── UEqn.H

1 directory, 6 files

例として,非圧縮性流体の物性ライブラリを作成するディレクトリの構造を示す。このようにMakeディレクトリの存在する場所で wmake を実行すると,関係するファイルをまとめてコンパイルすることになる。

shell
user@user-VirtualBox:/opt/openfoam7/src/transportModels/incompressible$ tree -L 2 -F
.
├── incompressibleTwoPhaseMixture/
│   ├── incompressibleTwoPhaseMixture.C
│   └── incompressibleTwoPhaseMixture.H
├── Make/
│   ├── files
│   └── options
├── singlePhaseTransportModel/
│   ├── singlePhaseTransportModel.C
│   └── singlePhaseTransportModel.H
├── transportModel/
│   ├── transportModel.C
│   └── transportModel.H
└── viscosityModels/
    ├── BirdCarreau/
    ├── Casson/
    ├── CrossPowerLaw/
    ├── HerschelBulkley/
    ├── Newtonian/
    ├── powerLaw/
    ├── strainRateFunction/
    └── viscosityModel/

Make/files で指定するもの

コンパイルするソースコード .C の名前は,Make/files ファイルに列挙する。

対象となるディレクトリに含まれるファイルに比べて,ここに記載されたファイル名が圧倒的に少ないことがある。これは,記載されていないファイルが不要であることを示すのではない。ソースコード内で include 文によって,多くのファイルが参照されているためである。

Make/files ファイルでは,コンパイルに成功して生成される実行形式ファイルの保存場所および名前を指定する。EXE = の後の記述がこれに該当する。

下にsimplFoamソルバの files の内容を示す。

cpp
simpleFoam.C

EXE = $(FOAM_APPBIN)/simpleFoam

Make/optionsで指定するもの

ソルバのコンパイル時には,ライブラリやクラスの定義に関する情報が必要となる。これらの情報は,Make/options の中で EXE_INC = に続けて記述する。-I オプションに続けて,情報が格納されているディレクトリ名を記載する。

なお,このオプションで指定していないくても,コンパイルを実行しているディレクトリに置かれたファイルや特定ディレクトリの中においたファイルは自動的に検索される。これについては,OpenFOAM v8 User Guide: 3.2 Compiling applications & libraries の 3.2.2.1 で説明されている。

このインクルードオプションで指定するのは,定義などの情報を参照するためである。例えば,simpleFoam.C がインクルードする UEqn.H ファイルでは,volScalarField というクラス(実際は別名宣言されたテンプレートクラス:$FOAM_SRC/finiteVolume/fields/volFields/volFieldsFwd.H)が使用されている。この宣言は,$FOAM_SRC/finiteVolume ディレクトリの中に格納されている。

ソルバの実行時には,ライブラリの実行形式ファイルが必要である。このライブラリの情報は,Make/options の中で EXE_LIBS = に続けて記述する。-l オプションに続けてライブラリ名(先頭の lib と拡張子の .so を除く)を記載する,または,-L オプションに続けてディレクトリ名を記載する。

下にsimplFoamソルバの options の内容を示す。ここで,LIB_SRC は,$(WM_PROJECT_DIR)/src として,OpenFOAM-v1912/wmake/makefiles/general ファイルの中で定義されている。このファイルの中で,コンパイルに関わるディレクトリの設定などが行われている。

cpp
EXE_INC = \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/sampling/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel

EXE_LIBS = \
    -lfiniteVolume \
    -lfvOptions \
    -lmeshTools \
    -lsampling \
    -lturbulenceModels \
    -lincompressibleTurbulenceModels \
    -lincompressibleTransportModels \
    -latmosphericModels

このoptionsファイルを見ることで,このソルバで使用できる機能を確認できる。

lnIncludeについて

lnInclude ディレクトリには,コンパイルの過程でソースコードへのリンクが格納される。ディレクトリを構造化して整理されたソースコードのファイルが,このディレクトリにまとめられる。

wmake dep を実行すると,lnIncludeの作成だけとなる。

ステップアップ

興味のある方は,$FOAM_SRC/finiteVolume/Make/files をご覧ください。多くの基本的な機能を詰め込んだライブラリとして,finiteVolume が作られることを確認してください。

その $FOAM_SRC/finiteVolume/Make/files の中には,前述の volFieldsFwd.H は書かれていません。このファイルがどのように使われるか(あるいは,使われないのか?)は,fields/volFields/volFields.C を見て考えると,わかります。

確実かつ詳しい情報は,本家サイト

詳細については,OpenFOAM v8 User Guide: 3.2 Compiling applications & libraries を参照する。

関連するライブラリの確認方法

実行ファイルから利用されるライブラリを確認する方法

ldd

ldd $FOAM_APPBIN/simpleFoam

http://manpages.ubuntu.com/manpages/bionic/ja/man1/ldd.1.html

objdump

objdump -p $FOAM_APPBIN/simpleFoam | grep NEEDED

http://manpages.ubuntu.com/manpages/bionic/ja/man1/objdump.1.html

wmake -help

shell
bash-4.2$ wmake -help

Usage: wmake [OPTION] [dir]
       wmake [OPTION] target [dir [MakeDir]]
options:
  -s | -silent      Quiet mode (does not echo commands)
  -a | -all         wmake all sub-directories, running Allwmake if present
  -q | -queue       wmakeCollect sub-directories, running Allwmake if present
  -k | -keep-going  Keep going even when errors occur (-non-stop)
  -j | -jN | -j N   Compile using all or specified N cores/hyperthreads
  -update           Update lnInclude dirs, dep files, remove deprecated files/dirs
  -pwd              Print root directory containing a Make/ directory
  -version | --version  Print version, which is the same as -show-api
  -h | -help        Display short help and exit
  -help-full        Display full help and exit

A general, easy-to-use make system for multi-platform development
with support for local and network parallel compilation.

The 'target' is a Makefile target:
  e.g., platforms/linux64GccDPOpt/.../fvMesh.o

or a special target:
  all | queue       Same as -all | -queue options
  exe               Compile statically linked executable
  lib               Compile statically linked archive lib (.a)
  libo              Compile statically linked lib (.o)
  libso             Compile dynamically linked lib (.so)
  dep               Compile lnInclude and dependencies only
  updatedep         Compile dependencies only (in case of broken dependencies)
  objects           Compile but not link

参考になるサイト

OpenFOAM Foundation. "OpenFOAM v8 User Guide: 3.2 Compiling applications & libraries". CFD Direct.
https://cfd.direct/openfoam/user-guide/v8-compiling-applications/, (参照 2020-08-15).

OpenFOAM Programmer's Guide
OpenFOAMのSourceForgeサイトのバージョン毎のディレクトリに存在するPDFファイル ProgrammersGuide.pdf

山口晴広.”「ビルド」という作業は何を指しているのか”.@IT.2011年05月23日.
https://www.atmarkit.co.jp/ait/articles/1105/23/news128.html, (参照 2020-08-15).

山口晴広.”ダイナミックリンクとスタティックリンク”.@IT.2011年05月27日.
https://www.atmarkit.co.jp/ait/articles/1105/27/news111.html, (参照 2020-08-15).

山口晴広.”makeを使ってソフトウェアをビルドしてみよう”.@IT.2011年06月07日.
https://www.atmarkit.co.jp/ait/articles/1106/07/news131.html, (参照 2020-08-15).

山口晴広.”Makefileをいろいろ書き換えながらビルドしてみよう”.@IT.2011年05月23日.
https://www.atmarkit.co.jp/ait/articles/1106/10/news115.html, (参照 2020-08-15).

https://linuxjm.osdn.jp/html/GNU_make/man1/make.1.html, (参照 2020-08-15).