OpenFOAM 自定义库编译

OpenFOAM 自定义库编译

除了修改最顶层的求解器之外,当需要修改相关的底层库时仍需要对其库进行编译。编译较多,但没有总结过,本文暂总结,后续遇到其他问题会更新。
自定义库的编译层级自己可以选, 一个是也放在solver 顶层,这比较安全,但是如果自己定义的库也希望在不同solver内使用,当然是定义在OF 库本身的层级更节省代码和编译复用性。

以最近手头的一个新的动网格求解库为例。平台:OpenFOAM2106。主要分三步来编译:

  1. 新建一个库路径及其源文件
  2. 建立软链接
  3. 写入编译路径并编译:wmake libso

1.源码路径选择

在新建库的时候不建议直接从头写,建议是根据自己的需求和要实现的功能,找到最相近的现有类库,在同级目录下touch 一个新的并复制原有基础类库,在其框架上修改。
本文涉及的库就放在路径$SRC/fvMotionSovler/fvMotionSolvers/displacement/separatedZoneLaplacianDisplacement/下。
包含两个源文件

separatedZoneLaplacianDisplacement.H
separatedZoneLaplacianDisplacement.C

2.建立软链接

编译的过程中会有链接这个过程。在程序设计过程中为了保证链接文件的路径一致性,会采取软链接的方式。(可以理解为Win 系统下的快捷方式)
软链接和硬链接的区别有点类似于引用传参和值传参。 对于前者,其不对源代码或者文件进行复制,该软链接文件只保存指向源文件的信息,后者会生成一个复制拷贝。

ln -s [source file] [generated link] ## 生成软链接
ln [source file] [generated link]  ## 生成硬链接

需要注意的是,建议在想要生成软链接的目的路径下执行上述命令。
本文涉及的操作为

cd  $SRC/fvMotionSoler/lnInclude/
ln -s  ../fvMotionSolvers/displacemet/separatedZoneLaplacianDisplacement/separatedZoneLaplacianDisplacement.H  separatedZoneLaplacianDisplacement.H
ln -s  ../fvMotionSolvers/displacemet/separatedZoneLaplacianDisplacement/separatedZoneLaplacianDisplacement.C separatedZoneLaplacianDisplacement.C

建立后通过 ls -li 在lnInclude 目录下查看软链接的生成情况。

3.修改编译配置文件并编译

在/Make 文件夹中的file 文件 中添加源码路径
在/Make的同级目录下编译即可

wmake libso
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
penFOAM基础--编译applications和libraries openFOAM是一个,用户在编程时需要调用此,当然用的语言是面向对象的c++语言。在使用openFOAM时我们应该将关注点放在顶层使用类以及数值算法上,这就需要对openFOAM Library的调用机制有一个详细的了解。并且由于我们在使用c++语言编程,因此需要对c++的编译过程有所了解。 关于编译器,我们可以直接使用LINUX自带的make程序,但openFOAM又提供了一个编译程序wmake,它建立在make的基础上,但比make更强大和简单。并且wmake不仅可以用于openFOAM library,而且可以用于任何c++代码。 openFOAM中的类,本质上是c++的class,都定义在.c文件中,这些文件在用编译器进行编译之后会生成.so文件(可执行的二进制文件),形成(library)。openFOAM在提供时都已经生成了.so文件,因此当我们编译一个调用了某class(该class所在文件为nc.c)的程序app.c时,nc.c不会被重新编译,而是调用直接调用nc.so文件。这种机制称为“动态链接”。而如果对某.c文件进行了修改,则重新编译之后才会生效。 c++中,我们在使用一个变量或者对象时,必须确保该变量或对象已经存在,这就需要进行声明。在使用类时同样需要事先声明,这些对类的声明都包装在.h文件中,我们称之为头文件(header file)。头文件中声明的类一定要能在中找到,这就要求声明的类与.c文件中定义的类相一致。头文件都必须以#include "xx.h"的形式被“包含”在使用了该头文件的c文件中(.c或.h文件)。一个c文件要想使用某个类,则必须在文件的开始将声明了该类的.h文件包含进来。这样一来,我们在编译一个程序的时候,可以通过“递归搜索”找到一系列的.h文件名,我们把这些.h文件称为dependences,而这一系列文件名也就是一个dependence list。编译器会判断这个list中的各个.h文件在最后一次进行编译之后是否被修改过,如果修改了,则从新编译,如果没有被修改,那么不再编译。然后,编译器会根据.h文件中的声明和程序中的调用情况在中找到想要的代码,进而链接出可执行文件来。一方面,只有有了.h文件,我们在写程序代码时才能保证用到的类都是声明过的;另一方面,只有有了.h文件中的声明,我们才能在中找到自己需要的东西,从这个角度来讲,h文件可以看作是的接口。 (.h文件的用途不仅仅是用来做class declaration。当某程序代码需要调用本身的时候,通常为了增加程序的可读性,也会选择.h文件来组织文件结构。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值