遇到一个问题,要把 sprayFoam 求解器的蒸发模型修改为自定义蒸发模型

sprayFoam 求解器本身没有实现蒸发模型,而是调用 $FOAM_SRC/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/ 中的模型。

蒸发模型库依赖探究

这里先从 liquidEvaporationBoil 这个已有的蒸发模型入手

首先运行

cd $FOAM_SRC
cd ..
grep -r liquidEvaporationBoil .

可以看到结果中有

grep: ./platforms/linux64GccDPInt32Opt/lib/liblagrangianIntermediate.so: binary file matches
grep: ./platforms/linux64GccDPInt32Opt/lib/liblagrangianSpray.so: binary file matches

因此使用自定义的蒸发模型,需要重新编译 liblagrangianIntermediateliblagrangianSpray 这两个库

因此做出以下尝试

复制并修改 src/lagrangian

mkdir -p $WM_PROJECT_USER_DIR/src
cp -r $FOAM_SRC/lagrangian $WM_PROJECT_USER_DIR/src

(1) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/Make/files

LIB = $(FOAM_LIBBIN)/liblagrangianIntermediate 改为

LIB = $(FOAM_USER_LIBBIN)/libmyLagrangianIntermediate

(2) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/spray/Make/files

LIB = $(FOAM_LIBBIN)/liblagrangianSpray 改为

LIB = $(FOAM_USER_LIBBIN)/libmyLagrangianSpray

(3) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/spray/Make/options

EXE_INC

-I$(LIB_SRC)/lagrangian/intermediate/lnInclude \ 改为

-I$(WM_PROJECT_USER_DIR)/src/lagrangian/intermediate/lnInclude \

LIB_LIBS

在开头加上

-L$(FOAM_USER_LIBBIN) \

-llagrangianIntermediate \ 修改为

-lmyLagrangianIntermediate \

(4) 由于测试的 case 调用的是 LiquidEvaporationBoil 模型,因此修改 $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C 文件

首先 #include <iostream>,然后在构造器中加上

std::cerr << "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" << std::endl;
std::cerr << "aaaaaaaaaaaaaaaaaaa Test !!!!!!!!!!!!!!" << std::endl;
std::cerr << "call LiquidEvaporationBoil Constructors" << std::endl;
std::cerr << "aaaaaaaaaaaaaaaaaaa Test !!!!!!!!!!!!!!" << std::endl;
std::cerr << "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" << std::endl;

这样可以测试修改蒸发模型的有效性

复制并修改 sparyFoam

cp -r $FOAM_SRC/../applications/solvers/lagrangian/sprayFoam <项目路径>

(1) 修改 <项目路径>/sprayFoam/Make/files

EXE = $(FOAM_USER_APPBIN)/mySprayFoam

(2) 修改 <项目路径>/sprayFoam/Make/options

EXE_INC

-I$(LIB_SRC)/../applications/solvers/lagrangian/reactingParcelFoam \
-I$(WM_PROJECT_USER_DIR)/src/lagrangian/intermediate/lnInclude \
-I$(WM_PROJECT_USER_DIR)/src/lagrangian/spray/lnInclude \

EXE_LIBS

在开头加上 -L$(FOAM_USER_LIBBIN) \

-llagrangianIntermediate \ 修改为 -lmyLagrangianIntermediate \

-llagrangianSpray \ 修改为 -lmyLagrangianSpray \

尝试编译并运行

编译

cd $WM_PROJECT_USER_DIR/src/lagrangian/intermediate
rm -r lnInclude
rm -r Make/linux*
wmake -j4 > wmake.log cd $WM_PROJECT_USER_DIR/src/lagrangian/spray
rm -r lnInclude
rm -r Make/linux*
wmake -j4 > wmake.log cd <项目路径>/sprayFoam
wmake -j4 > wmake.log

之后可以用 $FOAM_USER_APPBIN/mySprayFoam 运行使用 liquidEvaporationBoil 蒸发模型的算例,然后打印

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aaaaaaaaaaaaaaaaaaa Test !!!!!!!!!!!!!!
call LiquidEvaporationBoil Constructors
aaaaaaaaaaaaaaaaaaa Test !!!!!!!!!!!!!!
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

但是同时看到有一堆报错

Duplicate entry dual in runtime table AveragingMethod
[stack trace]
=============
#1 platforms/linux64GccDPInt32Opt/lib/libmyLagrangianIntermediate.so(+0x4e564a) [0x7f14a396f64a]
#2 /lib64/ld-linux-x86-64.so.2(+0x647e) [0x7f14a5d3847e]
#3 /lib64/ld-linux-x86-64.so.2(+0x6568) [0x7f14a5d38568]
#4 /lib64/ld-linux-x86-64.so.2(+0x202ca) [0x7f14a5d522ca]
=============
Duplicate entry moment in runtime table AveragingMethod
[stack trace]
=============
#1 platforms/linux64GccDPInt32Opt/lib/libmyLagrangianIntermediate.so(+0x4e56dd) [0x7f14a396f6dd]
#2 /lib64/ld-linux-x86-64.so.2(+0x647e) [0x7f14a5d3847e]
#3 /lib64/ld-linux-x86-64.so.2(+0x6568) [0x7f14a5d38568]
#4 /lib64/ld-linux-x86-64.so.2(+0x202ca) [0x7f14a5d522ca]
=============
Duplicate entry moment in runtime table AveragingMethod
[stack trace]
=============
#1 platforms/linux64GccDPInt32Opt/lib/libmyLagrangianIntermediate.so(+0x4e576b) [0x7f14a396f76b]
#2 /lib64/ld-linux-x86-64.so.2(+0x647e) [0x7f14a5d3847e]
#3 /lib64/ld-linux-x86-64.so.2(+0x6568) [0x7f14a5d38568]
#4 /lib64/ld-linux-x86-64.so.2(+0x202ca) [0x7f14a5d522ca]
=============

这是 Duplicate Entry 问题,为解决该问题,运行

cd $WM_PROJECT_USER_DIR/src/lagrangian
grep -r llagrangianIntermediate .

结果为

./coalCombustion/Make/options:    -llagrangianIntermediate \
./turbulence/Make/options: -llagrangianIntermediate \

这说明要重新编译 coalCombustionturbulence (╬▔皿▔)╯

再运行 grep -r llagrangianTurbulence .,结果为

./coalCombustion/Make/options:    -llagrangianTurbulence \
./spray/Make/options: -llagrangianTurbulence \

说明还要修改 coalCombustionspray

于是进行以下操作

(1) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/turbulence/Make/files

LIB = $(FOAM_USER_LIBBIN)/libmyLagrangianTurbulence

(2) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/turbulence/Make/options

-I$(WM_PROJECT_USER_DIR)/src/lagrangian/intermediate/lnInclude \
-L$(FOAM_USER_LIBBIN) \
-lmyLagrangianIntermediate \

(3) 修改 $WM_PROJECT_USER_DIR/src/lagrangian/spray/Make/options

-I$(WM_PROJECT_USER_DIR)/src/lagrangian/turbulence/lnInclude \
-lmyLagrangianTurbulence \

(4) 修改 <项目路径>/sprayFoam/Make/options

-lmyLagrangianTurbulence \

(5) 编译

cd $WM_PROJECT_USER_DIR/src/lagrangian/intermediate
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log cd $WM_PROJECT_USER_DIR/src/lagrangian/turbulence
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log cd $WM_PROJECT_USER_DIR/src/lagrangian/spray
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log cd <项目路径>/sprayFoam
wmake -j3 > wmake.log

之后运行,发现报错消失了

创建自定义蒸发模型

首先要知道蒸发模型是如何被调用的,运行下面命令

cd $WM_PROJECT_USER_DIR/src/lagrangian/intermediate
grep -r LiquidEvaporationBoil.H .

结果为

./parcels/include/makeReactingParcelPhaseChangeModels.H:#include "LiquidEvaporationBoil.H"

这提示了如何添加自定义蒸发模型。

因此首先复制已有的蒸发模型至项目路径并重命名

cp -r $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil <项目路径>
cd <项目路径>
mv LiquidEvaporationBoil MyLiquidEvaporation cd MyLiquidEvaporation
sed s/LiquidEvaporationBoil/MyLiquidEvaporation/g \
LiquidEvaporationBoil.C >MyLiquidEvaporation.C
sed s/LiquidEvaporationBoil/MyLiquidEvaporation/g \
LiquidEvaporationBoil.H >MyLiquidEvaporation.H
rm LiquidEvaporationBoil.C LiquidEvaporationBoil.H

也要修改 MyLiquidEvaporation.H

TypeName("myLiquidEvaporation");

对应的,要更新 case 文件,修改 constant/sprayCloudProperties.subModels.phaseChangeModelmyLiquidEvaporation,这应该与 TypeName("myLiquidEvaporation") 相对应。同时添加

    myLiquidEvaporationCoeffs
{
enthalpyTransfer enthalpyDifference; activeLiquids ( C7H16 );
}

接下来要创建链接

mkdir -p $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/MyLiquidEvaporation
ln <项目路径>/MyLiquidEvaporation/MyLiquidEvaporation.H $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/MyLiquidEvaporation/MyLiquidEvaporation.H
ln <项目路径>/MyLiquidEvaporation/MyLiquidEvaporation.C $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/MyLiquidEvaporation/MyLiquidEvaporation.C

然后在 $WM_PROJECT_USER_DIR/src/lagrangian/intermediate/parcels/include/makeReactingParcelPhaseChangeModels.H 中加上

#include "MyLiquidEvaporation.H"
makePhaseChangeModelType(MyLiquidEvaporation, CloudType);

之后编译

cd $WM_PROJECT_USER_DIR/src/lagrangian/intermediate
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log cd $WM_PROJECT_USER_DIR/src/lagrangian/turbulence
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log cd $WM_PROJECT_USER_DIR/src/lagrangian/spray
rm -r lnInclude
rm -r Make/linux*
wmake -j3 > wmake.log

为判断是否成功添加,运行以下命令

cd $WM_PROJECT_USER_DIR/src/lagrangian/intermediate
echo ---lagrangian/intermediate echo MyLiquidEvaporation
grep -r -I MyLiquidEvaporation | wc -l
grep -r -I myLiquidEvaporation | wc -l echo LiquidEvaporationBoil
grep -r -I LiquidEvaporationBoil | wc -l
grep -r -I liquidEvaporationBoil | wc -l echo LiquidEvapFuchsKnudsen
grep -r -I LiquidEvapFuchsKnudsen | wc -l
grep -r -I liquidEvapFuchsKnudsen | wc -l cd $WM_PROJECT_USER_DIR/src/lagrangian/spray
echo ---lagrangian/spray echo MyLiquidEvaporation
grep -r -I MyLiquidEvaporation | wc -l
grep -r -I myLiquidEvaporation | wc -l echo LiquidEvaporationBoil
grep -r -I LiquidEvaporationBoil | wc -l
grep -r -I liquidEvaporationBoil | wc -l cd $FOAM_USER_LIBBIN
echo ---FOAM_USER_LIBBIN echo MyLiquidEvaporation
nm -C libmyLagrangianIntermediate.so | grep MyLiquidEvaporation | wc -l
nm -C libmyLagrangianTurbulence.so | grep LiquidEvaporationBoil | wc -l
nm -C libmyLagrangianSpray.so | grep MyLiquidEvaporation | wc -l echo LiquidEvaporationBoil
nm -C libmyLagrangianIntermediate.so | grep LiquidEvaporationBoil | wc -l
nm -C libmyLagrangianTurbulence.so | grep MyLiquidEvaporation | wc -l
nm -C libmyLagrangianSpray.so | grep LiquidEvaporationBoil | wc -l

如果 MyLiquidEvaporation 相关的符号数与 LiquidEvaporationBoil 相同,应该可以说明成功添加 MyLiquidEvaporation

之后再编译求解器,最后成功运行。至此,已满足把 sprayFoam 求解器的蒸发模型修改为自定义蒸发模型的要求。

openfoam 修改 src 库经验记录的更多相关文章

  1. android studio 导入第三方库的记录

    android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...

  2. ERP渠道信息的修改和渠道联系记录(二十三)

    用例图: 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Cha ...

  3. SVN修改已经提交过记录的日志和作者

    原 SVN修改已经提交过记录的日志和作者 使用TortoiseSVN管理代码,对于已经提交的记录,可以修改提交作者和提交日志,不过会报如下错误: Repository has not been ena ...

  4. SQL-修改: 将日期修改为空NULL、修改为空的记录

    1.将日期修改为空NULL update 表 set 字段=null where 字段='' 如果设置为‘’,会默认1900-01-01 2.修改为空的记录 update [dbo].[pub_ite ...

  5. Oracle查询库中记录数大于2千万的所有表

    Oracle查询库中记录数大于2千万的所有表 假如当前用户拥有select any table权限,则可以使用下列sql语句: select table_name, num_rows from dba ...

  6. 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录

     孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...

  7. Dynamics CRM 修改Excel 最大导出记录限制及 最大上传文件限制

    CRM默认的Excel最大导出记录是10000条,最大上传文件限制为5m. 这样的限制可以满足少量数据的批量更新,但是如果数据量比较大的话需要修改最大的导出记录限制,和上传文件的大小,网上有的是直接修 ...

  8. Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)

    Elasticsearch之重要核心概念如下: 1.cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是 ...

  9. 修改so库中的依赖名

    修改so库中的依赖名 在ArchLinuxArm上有一些针对aarch64, arm, armeabi-v7a等Android常用架构的so库可以下载,有时候可以省去很多编译时间,且都是编译optim ...

  10. 如何在vue中修改动态标签中的样式和修改组件库样式

    vue中修改动态标签中的样式和修改组件库样式 因为vue中的标签在渲染的时候,都会给标签加上id 所以你想在<style lang="scss" scoped>直接修改 ...

随机推荐

  1. 题解:CF1941G Rudolf and Subway

    原题链接 简化题意 一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(b\) 到 \(e\) 最短需要经过几种颜色 思路 考虑因为同种颜色联通,可直接在读入的时候开两个 vector ...

  2. WEB服务与NGINX(22)- nginx的七层负载均衡功能

    目录 1. NGINX实现负载均衡功能 1.1 nginx负载均衡概述 1.2 nginx实现http的负载均衡 1.2.1 nginx基于http负载均衡场景配置 1.2.1.1 负载均衡相关参数 ...

  3. 密码学—仿射密码Python程序

    文章目录 仿射密码 加密算法 解密算法 仿射密码 古典密码,且属于单表加密. 加密算法 仿射密码公式 c = m×k + b mod 26 c是密文,m是明文,m作为26字母中的明文,因此计算出来的密 ...

  4. IDEA 2020 版配置VUE

    找到IDE工具栏,就是启动项目的run那里 点击下拉框,找到Eidt Confiuration,选择 选择小加号 选取npm 设置npm页,完成后,点击apply run npm ,如图选择run或者 ...

  5. 教你如何搞定springboot集成kafka

    本文分享自华为云社区<手拉手入门springboot+kafka>,作者:QGS. 安装kafka 启动Kafka本地环境需Java 8+以上 Kafka是一种高吞吐量的分布式发布订阅消息 ...

  6. kubernetes 之Health Check 健康检查

    默认的健康检查 这里Pod的restartPolicy设置为OnFailure,默认为Always. [machangwei@mcwk8s-master ~]$ cat mcwHealthcheck. ...

  7. centos7源码编译安装nginx1.19并调优,向已安装的nginx添加新模块

    目录 一.关于nginx 二.nginx的安装方式 三.源码编译安装nginx 3.1 下载nginx源码并解压 3.2 创建nginx用户和组 3.3 安装nginx编译环境(解决依赖问题) 3.4 ...

  8. EL表达式与JSTL简单入门

    更多博文请关注:听到微笑的博客 EL概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 简单来说EL表达式 ...

  9. WPF:DataGrid可过滤、多语言

    目录 介绍 背景 怎么运作 自定义控件 如何使用 基准 下载演示项目 - 133.8 KB GitHub 存储库 NuGet 包

  10. Java并发编程(一)JUC同步类

    JUC 是学习 Java 并发编程的小伙伴不可避免的一个 pkg,JUC提供了对并发编程的底层支持,比如我们熟悉的线程池.MQ.线程同步... 都有JUC的影子,下面我们一起来看看JUC下比较重要的几 ...