OpenFoam 2.3 升级 7 并配置Docker环境
老版本of2.3 CFD程序升级of7,在此记录。
准备OF7的docker
docker安装及环境配置见前文 ubuntu docker配置cuda+anaconda+vscode+tensorflow环境的镜像
docker hub 拉取openfoam/openfoam7-paraview56镜像
docker pull openfoam/openfoam7-paraview56
从镜像启动容器
sudo docker run --gpus all -it -u 0 --name=zhl --privileged=true -p 8022:22 -p 8080:8080 -p 8060:8060 -p 8081:8081 -v /data1/AI-DEM:/data openfoam/openfoam7-paraview56:latest bash
# -p 端口映射 本地端口:容器端口
# -v 挂载目录 本地目录:容器目录
端口映射
参考前文 通过端口映射访问远程服务器中的Docker容器 https://blog.csdn.net/qq_43488795/article/details/126658342
注意将容器的SSH端口设置为对应的映射端口。
至此可以通过SSH, VSCode Remote-SSH, 等方式直接通过主机连接服务器中的容器。
VSCode访问容器
安装Remote-SSH插件
OF7修改记录
Makefile.basic
不熟悉makefile的可以先学习这篇文章
首先对比 Makefile.basic 的不同
vimdiff Makefile.basic ../cfd_of7_src/Makefile.basic
对应修改即可,注意CFLAGS
中的-DWM_LABEL_SIZE=32
选项,一定要设置不然后面会报错。
修改config.h
只打开流动选项,关闭所有反应传热宏。
编译
修改完 Makefile.basic后可以开始编译
#!/bin/sh
rm cfd-two-phase
rm main.o
make clean-all
make -j > 1.log 2>&1
逐个解决输出的错误,参考OpenFoam v7 官网
错误1: fvIOoptionList.H 找不到
main.cpp:41:10: fatal error: fvIOoptionList.H: No such file or directory
#include "fvIOoptionList.H"
原因: of7中没有这个库函数
解决办法:注释掉即可
错误2 :readPISOControls.H 没有
main.cpp:431:10: fatal error: readPISOControls.H: No such file or directory
#include "readPISOControls.H"
^~~~~~~~~~~~~~~~~~~~
新版本叫 pisoControlI.H
改为
// #include "readPISOControls.H"
#include "psioControl.H"
错误3: SEEK_SET 没有定义
In file included from /usr/lib/x86_64-linux-gnu/openmpi/include/mpi.h:2704:0,
from ./include/includes.h:22,
from cfd_dem_IBM.cpp:7:
/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/ompi/mpi/cxx/mpicxx.h:57:40: error: 'SEEK_SET' was not declared in this scope
static const int ompi_stdio_seek_set = SEEK_SET;
^~~~~~~~
原因:USE_INTEL_MPI
// #define USE_INTEL_MPI
#include "createFvOptions.H"
注释掉
#include "createControl.H" //增加
#include "createFields.H"
错误4: IBM相关问题
均为没有加#ifdef USE_IBM
加上#ifdef USE_IBM
跳过编译。
IBM相关报错均做同样处理。
错误5:momentumPredictor , nCorr 没有定义
In file included from main.cpp:498:0:
./of-include/two_phase_solvation_gravity.H:18:35: error: 'momentumPredictor' was not declared in this scope
Info << "momentumPredictor:" << momentumPredictor <<endl;
^~~~~~~~~~~~~~~~~
./of-include/two_phase_solvation_gravity.H:26:18: error: 'nCorr' was not declared in this scope
int nCorrSoph = nCorr;
// ./of-include/two_phase_solvation_gravity.H:26:18:
// PISO loop
int nCorrSoph = nCorr;
for (int corr=0; corr<nCorrSoph; corr++) {
momentumPredictor变为了piso的成员变量
// Info << "momentumPredictor:" << momentumPredictor <<endl;
Info << "momentumPredictor:" << piso.momentumPredictor() <<endl;
新版piso取消了nCorr和for循环,参考opt/openfoam7/applications/solvers/incompressible/pisoFoam/pisoFoam.C:
将for循环改为while
// PISO loop
// int nCorrSoph = nCorr;
// for (int corr=0; corr<nCorrSoph; corr++) {
while (piso.correct()) {
// for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) {
while (piso.correctNonOrthogonal()) {
错误全部解决,编译得到可执行文件。