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 |