相比于商业CFD软件,OpenFOAM的最大优势在于其开源特性,可以让广大CDFer非常方便地利用它丰富的基础库魔改出各种求解器
最近写了一个新的求解器,编译通过,但是跑算例时遇到了[Duplicate entry]的问题,这里和大家分享一下DeBug的过程
先来看报错
1 Duplicate entry cubeRootVol in runtime selection table LESdelta
2 #0 /home/xxx/OpenFOAM/OpenFOAM-v1912/platforms/linux64GccDPInt32Opt/lib/libOpenFOAM.so(_ZN4Foam5error14safePrintStackERSo+0x3e) [0x7efcbba4371e]
3 #1 /home/xxx/OpenFOAM/xxx-v1912/platforms/linux64GccDPInt32Opt/lib/libMyturbulenceModels.so(+0x9815e) [0x7efcb9c0e15e]
4 #2 /lib64/ld-linux-x86-64.so.2(+0x108d3) [0x7efcc58638d3]
5 #3 /lib64/ld-linux-x86-64.so.2(+0x10ca) [0x7efcc58540ca]
...这里省略6000+行
这里说明在LESdelta类中有两个相同的key均为"cubeRootVol"
在CFDOnline上有关于此的讨论,主要给出了两种解决方法[1]。一是将自定义求解器魔改过的所有库以及所有调用魔改后库的库全部复制出来,形成一个独立的代码库。二是将所有自定义的库都进行重命名,特别是要修改Typename
这里采用第一种方法,因为第二种方法涉及到修改文件名及文件内部类和函数的名称,相对复杂且容易手滑改错...
我们首先要做的就是找到其定义求解器中与OF原代码中产生Duplicate entry的部分,从上面的报错看,问题处在OF原来的库libturbulenceModels.so与魔改后的libMyturbulenceModels.so中定义了相同的LESdelta。具体的原因就是,我的求解器魔改了新的湍流模型,但是求解器其有部分代码依然调用了OF原来的湍流模型库,两者产生了Duplicate entry。那么怎么快速找到自定义求解器中调用OF自带库的部分呢?

- 在$FOAM_LIBBIN/中删除出现重复的库,即自带的libturbulenceModels.so库,编译之后得到如下Warning
/usr/bin/ld: warning: libturbulenceModels.so, needed by /home/xxx/OpenFOAM/xxx-v1912/platforms/linux64GccDPInt32Opt/lib/libMyCombustion.so, not found (try using -rpath or -rpath-link)
原来是求解器中libMyCombustion.so库中调用了自带的libturbulenceModels.so
- 将OF代码中涉及到的部分复制到自定义求解器中,并在该库Make/file中将库的名称进行修改,如
libturbulenceModels → libMyturbulenceModels
- 在MyCombustion/Make/options/中把所调用的turbulenceModels库改为新的MyturbulenceModels库,即
EXE_INC = \
...
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
...
LIB_LIBS = \
...
-lturbulenceModels \
...
改为
EXE_INC = \
...
-I$(LIB_My_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
...
LIB_LIBS = \
-L$(FOAM_USER_LIBBIN) \
-lMyturbulenceModels \
...
- 编译之后如果还有Warning,重复步骤1直到求解器编译成功
俗话说的好,编码十分钟,deBug一整天,希望各位OpenFOAMer的代码都能一次work~
网友评论