OpenFOAM v2206 を Ubuntu 20.04 LTS にインストールメモ2022年12月2日 | |
はじめにOpenFOAM v2206 をインストールする。マトリックスソルバーライブラリ PETSc を使うためにソースからコンパイルする。 インストール対象マシン
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 のインストールソースコードの展開ソースからコンパイルする。ここ からソースコードをダウンロードする。
パッケージを展開。 $ 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 MPICUDA オプションを有効にする。 $ cd $WM_THIRD_PARTY_DIR $ ./makeOPENMPI -- --with-cuda HYPREPETSc で使うために、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 を使うオプションが指定できるのだが、コンパイルがうまくいかないのであきらめた OpenBLASPETSc で使うために、OpenBLAS をコンパイルする。こちらは自力でやる。ここ からパッケージを入手する。
適当なところに展開してコンパイル、インストール。 $ 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 のソルバーよりも遅くなることしかなかった。設定のチューニングが必要なのか、結構な計算環境が必要なのかもしれない。 | |
| PENGUINITIS | |