众所周知,OpenFOAM
只允许用户把编译好的库(lib)和求解器(solver)放在 $FOAM_USER_APPBIN
或 $FOAM_APPBIN
文件夹中。
科研时间久了,某一个库经过太多次的修改,会有很多个不同版本的代码。如果需要使用其中的一个版本,就要重新编译。如果想同时保留两个版本的求解器,就只能在修改代码的过程中,精心安排每一个编译好的库的名字,比如把 Make/files
文件中的 libcombustionModels
命名为 libcombustionModelsNew
libcombustionModelsNewNew
…… 只有这样,才能保留不同求解器各自需要的库(.so)文件。改的库多了,工作量就会几何增长!(比如turbulenceModels
建立在thermophysicalModels
的基础上,lagrangian
又基于湍流模型,每一个库里都有大量的lib,每一个修改过的lib都需要重新命名,牵一发动全身!如果改了fluidThermo
,那简直是欲哭无泪)
网上好像还没有人讨论过这个问题。经过研究,终于找到了一个打破僵局的办法。实现一个新的算法,只需要把新代码放在一个文件夹下,所有库的名字都不用修改。新生成的库,都会以旧代码的库名字保存在新的文件夹下,只要solver中指定需要哪个文件夹下的库就好了。
首先打开terminal,进入到OpenFOAM
的文件夹下
$cd $WM_PROJECT_DIR/etc/
在bashrc
文件中添加一行代码(在terminal
中输入以下代码):
$sed -i '/WM_PROJECT_USER_DIR_DEV/iexport WM_PROJECT_USER_DIR_DEV=$HOME/$WM_PROJECT/$USER-$WM_PROJECT_VERSION-dev' bashrc
其中,WM_PROJECT_USER_DIR_DEV
是自己取的名字,$USER-$WM_PROJECT_VERSION-dev
是想要储存新代码和库的文件夹路径,这里是创建user-版本号-dev
,和$FOAM_USER_APPBIN
文件夹同级。
之后,
$cd $WM_PROJECT_DIR/etc/config
$sed -i '/FOAM_USER_LIBBIN/iexport WM_PROJECT_USER_DIR_DEV=$WM_PROJECT_USER_DIR_DEV/platforms/$WM_OPTIONS/lib' settings.sh
$sed -i -e 's=_foamAddLib $FOAM_USER_LIBBIN\:=_foamAddLib $FOAM_USER_LIBBIN_DEV:$FOAM_USER_LIBBIN=' settings.sh
完成在$FOAM_USER_LIBBIN
这一行添加新的路径$FOAM_USER_LIBBIN_DEV
,其位置在新代码所在的文件夹中。
之后,只要参照下面的命令批量替换新代码中Make/options
和Make/files
中OpenFOAM
寻找库的路径,并保证求解器调用新路径下的库就好了!
sed -i "s/$(FOAM_USER_LIBBIN/$(FOAM_USER_LIBBIN_DEV/g" `grep "lib<自己命名的库>" -rl ~/OpenFOAM/user-版本号-dev/src`