OpenFOAM v2206 を Ubuntu 20.04 LTS にインストールメモ

2022年12月2日

はじめに

OpenFOAM v2206 をインストールする。マトリックスソルバーライブラリ PETSc を使うためにソースからコンパイルする。

インストール対象マシン

  • Ubuntu Desktop 20.04 LTS
  • CUDA 11.6

CUDA の設定

~/.bashrc

export CUDA_HOME=/usr/local/cuda-11.6
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

OpenFOAM のインストール

ソースコードの展開

ソースからコンパイルする。ここ からソースコードをダウンロードする。

  • OpenFOAM-v2206.tgz
  • ThirdParty-v2206.tgz

パッケージを展開。

$ mkdir ~/OpenFOAM
$ tar xvzf OpenFOAM-v2206.tgz -C ~/OpenFOAM
$ tar xvzf ThirdParty-v2206.tgz -C ~/OpenFOAM

Open MPI をコンパイルすることにする。設定ファイルを修正する。

~/OpenFOAM/OpenFOAM-v2206/etc/bashrc

#export WM_MPLIB=SYSTEMOPENMPI
export WM_MPLIB=OPENMPI

設定を読み込む。

$ . ~/OpenFOAM/OpenFOAM-v2206/etc/bashrc

ThirdParty のコンパイル

CMake の準備

CMake は apt でインストールすればよい。

$ sudo apt-get install cmake

Open MPI

CUDA オプションを有効にする。

$ cd $WM_THIRD_PARTY_DIR
$ ./makeOPENMPI -- --with-cuda

HYPRE

PETSc で使うために、HYPRE をコンパイルする。以下のパッケージをダウンロードする。

各バージョンの情報は BUILD.md に書いてあるようで、これと設定ファイルのものが一致している必要がありそうである。BUILD.md の HYPRE のバージョンが 2.24.0 で、$WM_PROJECT_DIR/etc/config.sh/hypre のバージョンが 2.23.0 なので、修正する。

$WM_PROJECT_DIR/etc/config.sh/hypre

#hypre_version=hypre-2.23.0
hypre_version=hypre-2.24.0

設定ファイルを読み直す。

$ . ~/OpenFOAM/OpenFOAM-v2206/etc/bashrc

ソースコードは $WM_THIRD_PARTY_DIR/sources に展開する。

コンパイル。

$ ./makeHYPRE

CUDA を使うオプションが指定できるのだが、コンパイルがうまくいかないのであきらめた

OpenBLAS

PETSc で使うために、OpenBLAS をコンパイルする。こちらは自力でやる。ここ からパッケージを入手する。

  • OpenBLAS-0.3.21.tar.gz

適当なところに展開してコンパイル、インストール。

$ make
$ mkdir -p ~/opt/OpenBLAS
$ make install PREFIX=$HOME/opt/OpenBLAS

設定。

~/.bashrc

export OPENBLAS=~/opt/OpenBLAS
export LIBRARY_PATH=$OPENBLAS/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=$OPENBLAS/lib:$LD_LIBRARY_PATH

読み直す。

PETSc

マトリックスソルバー PETSc を利用できるように、コンパイルする。

$ cd $WM_THIRD_PARTY_DIR
$ tar xvzf petsc-lite-3.17.2.tar.gz -C sources
$ ./makePETSC hypre-2.24.0 -- --with-cuda --with-kokkos --with-kokkos-kernels --download-kokkos --download-kokkos-kernels

CUDA と、KOKKOS とかいうのを使えるようにしている。KOKKOS はソースのダウンロードも指定している。実は OpenBLAS もここで --download-openblas を指定するだけでよかったかもしれない。

OpenFOAM のコンパイル

$ foam
$ ./Allwmake -j -s -l

PETSc が有効になっているかどうかの確認は、次のようにする。

$ foamHasLibrary -verbose petscFoam
Could not load "petscFoam"

有効にするには、次のようにする。

$ eval $(foamEtcFile -sh -config petsc -- -force)
$ foamHasLibrary -verbose petscFoam
Can load "petscFoam"

~/.bashrc などに次のように設定する。

~/.bashrc

alias of2206='. ~/OpenFOAM/OpenFOAM-v2006/etc/bashrc; eval $(foamEtcFile -sh -config petsc -- -force)'

次のようにすれば設定が有効になる。

$ of2206

PETSc の利用

petscFoam を読み込む。

system/controlDict

libs (petscFoam);

ソルバーの設定例は $WM_PROJECT_DIR/modules/external-solver/tutorials にある。たとえば、次のようにする。

system/fvSolution

    p
    {
        solver          petsc;

        petsc
        {
            options
            {
//                ksp_type  cg;
//                ksp_cg_single_reduction  true;
//                ksp_norm_type none;
//                pc_type bjacobi;
//                sub_pc_type ilu;

                ksp_type  cg;
                ksp_cg_single_reduction  true;
                ksp_norm_type none;
                pc_type  hypre;
                pc_hypre_type boomeramg;
                pc_hypre_boomeramg_max_iter "1";
                pc_hypre_boomeramg_strong_threshold "0.25";
                pc_hypre_boomeramg_grid_sweeps_up "1";
                pc_hypre_boomeramg_grid_sweeps_down "1";
                pc_hypre_boomeramg_agg_nl "1";
                pc_hypre_boomeramg_agg_num_paths "1";
                pc_hypre_boomeramg_max_levels "25";
                pc_hypre_boomeramg_coarsen_type HMIS;
                pc_hypre_boomeramg_interp_type ext+i;
                pc_hypre_boomeramg_P_max "1";
                pc_hypre_boomeramg_truncfactor "0.3";
            }
            caching
            {
                matrix
                {
                    update always;
                }

                preconditioner
                {
                    update always;
                }
            }
        }
			
        tolerance       1e-06;
        relTol          0.01;
    }
	
    U
    {
        solver petsc;

        petsc
        {
            options
            {
                ksp_type bicg;
                pc_type bjacobi;
                sub_pc_type ilu;
            }

            caching
            {
                matrix
                {
                    update always;
                }

                preconditioner
                {
                    update always;
                }
            }
        }

        tolerance       1e-05;
        relTol          0.1;
    }

実行は次のようにする。

$ OMP_NUM_THREADS=1 simpleFoam

スレッドが効くので、スレッドの数を環境変数 OMP_NUM_THREADS で指定する。うっかりそのまま実行すると、CPU 使用率が 100% を超えたりしているので注意。

CUDA を使う場合は、次のようにするらしい。

system/fvSolution

    p
    {
        solver          petsc;

        petsc
        {
            options
            {
                //ksp_view "::ascii_info"; // uncomment to list details of the solve
                ksp_type  cg;
                ksp_cg_single_reduction  true;
                ksp_norm_type none;
                mat_type aijcusparse; // Using CUSPARSE
                pc_type gamg; // algebraic multigrid from PETSc
                pc_gamg_type agg; // smoothed aggregation
                pc_gamg_agg_nsmooths "1"; // number of prolongator smoothing steps in smoothed aggregation (not smoother iterations)
                pc_gamg_reuse_interpolation true;
                pc_gamg_square_graph "10"; //square graph on all levels
                pc_gamg_threshold "0.0"; // increase to 0.05 if coarse grids get larger
                pc_gamg_threshold_scale "0.5"; // thresholding on coarse grids

                // smoother
                mg_levels_ksp_max_it "1"; // number of smoothing steps (use 2 or 4 if problem is hard, i.e stretched grids)
                mg_levels_ksp_type chebyshev;
                mg_levels_esteig_ksp_type cg; // spectrum estimation via CG
                mg_levels_ksp_chebyshev_esteig "0,0.05,0,1.1"; // target upper-part of the spectrum
                mg_levels_pc_type jacobi;

                // coarse solve
                mg_coarse_pc_type redundant;
                mg_coarse_redundant_pc_type lu;
            }
            caching
            {
                matrix
                {
                    update always;
                }

                preconditioner
                {
                    update always;
                }
            }
        }
			
        tolerance       1e-06;
        relTol          0.01;
    }

CUDA が使われているかどうかは、次のコマンドでモニタリングすればよい。

$ nvidia-smi -l 1

設定

設定の意味がさっぱりわからないが、ここ にあるような PETSc の設定と対応しているらしい。

おそらく、ksp_type は Krylov ソルバーのタイプのことで、pc_type は前処理 (preconditioner) のタイプのことと考えられる。pc_type の bjacobi というのは Block Jacobi のことと思われる。

mat_type はマトリックスタイプのことのようで、通常は aij のようである。aijcusparse や aijkokkos を指定すると CUDA が使われる。

caching はよくわからないが、次のような設定ができるようである。

            caching
            {
                matrix
                {
                    update periodic;
                    periodicCoeffs
                    {
                        frequency 2;
                    }
                }

                preconditioner
                {
                    update periodic;
                    periodicCoeffs
                    {
                        frequency 40;
                    }
                }
            }

計算速度

計算速度については、色々試してみたが、OpenFOAM のソルバーよりも遅くなることしかなかった。設定のチューニングが必要なのか、結構な計算環境が必要なのかもしれない。