深入理解 OpenFOAM 环境变量与编译

操作系统选择

由于 OpenFOAM 在 Linux 平台开发和测试,在非 Linux 平台无法直接对软件进行编译和安装,所以在非 Linux 平台上最简便方法是使用 docker 容器运行 OpenFOAM。下面主要介绍在 Linux 平台上 OpenFOAM 源程序编译安装过程。

环境变量

在 OpenFOAM 编译和运行时,需要设置多个环境变量。在源程序路径 ${FOAM_DIR}/etc 下,脚本文件 bashrc 包含了软件编译和运行所需的所有环境变量的设置,可以直接通过 source 命令加载。

为什么要用 source 命令?
在 OpenFOAM 中,bashrc 其实是一个 shell 脚本,这个脚本里定义了所需的环境变量。在 Linux 环境中,执行 shell 脚本有多种形式。以 bash 脚本为例,首先可以通过新开启一个 shell 并在新的环境中运行脚本,这种方式可以用 bash 命令执行此脚本,或者在脚本第一行添加 #!/bin/bash 说明执行脚本的程序,随后添加执行权限后直接执行此脚本。$ bash ${FOAM_DIR}/etc/bashrc # bash 命令执行 $ ${FOAM_DIR}/etc/bashrc # 直接执行
这两种方法执行效果是相同的,当新的 shell 运行脚本完毕后再返回当前环境,此时当前 shell 的工作环境是未变的,也就是说执行完毕后是无法看到 bashrc 脚本内定义的环境变量。
另外一种方式就是在当前 shell 环境中执行此脚本,这时在脚本名前使用 . 或者 source 命令,如下所示。$ . ${FOAM_DIR}/etc/bashrc # 使用 . 执行 $ source ${FOAM_DIR}/etc/bashrc # 使用 source 命令执行
此时脚本内定义的变量或所做的修改都会直接添加到当前 shell 环境内,这种方式才是正确加载 OpenFOAM 环境变量方法。

bashrc 脚本中定义了多个变量,按照编译、运行和第三方函数库相关可以分为三类。

  1. 与编译相关的 WM_XXX 变量
WM_THIRD_PARTY_DIR=$HOME/OpenFOAM/ThirdParty-1.6.x # 第三方函数库路径
WM_PROJECT_INST_DIR=$HOME/OpenFOAM
WM_PROJECT_DIR=$HOME/OpenFOAM/OpenFOAM-1.6.x # 源程序路径
WM_DIR=$HOME/OpenFOAM/OpenFOAM-1.6.x/wmake #
WM_PROJECT_USER_DIR=$HOME/OpenFOAM/$USER-1.6.x # 用户路径WM_PRECISION_OPTION=DP # 精度设置
WM_ARCH_OPTION=64 #
WM_LINK_LANGUAGE=c++ # 链接器
WM_ARCH=linux64 # 平台架构
WM_CXXFLAGS=-m64 -fPIC # c++ 编译器参数
WM_CFLAGS=-m64 -fPIC # c 编译器参数
WM_PROJECT_VERSION=1.6.x # 版本
WM_COMPILER_LIB_ARCH=64 #
WM_CXX=g++ # c++ 编译器
WM_COMPILER_ARCH=
WM_PROJECT=OpenFOAM # 工程名
WM_LDFLAGS=-m64 # 链接器参数
WM_COMPILER=Gcc # 编译器
WM_MPLIB=OPENMPI # MPI 函数库
WM_CC=gcc # C 编译器
WM_COMPILE_OPTION=Opt # 编译选项
WM_OPTIONS=linux64GccDPOpt # 编译设置

2. 与运行相关的 FOAM_XXX 变量

FOAM_SOLVERS=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/solvers
FOAM_APPBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/bin/linux64GccDPOpt
FOAM_TUTORIALS=$HOME/OpenFOAM/OpenFOAM-1.6.x/tutorials
FOAM_JOB_DIR=$HOME/OpenFOAM/jobControl
FOAM_LIB=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib
FOAM_SITE_APPBIN=$HOME/OpenFOAM/site/1.6.x/bin/linux64GccDPOpt
FOAM_MPI_LIBBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib/linux64GccDPOpt/openmpi-1.3.3
FOAM_APP=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications
FOAM_SITE_LIBBIN=$HOME/OpenFOAM/site/1.6.x/lib/linux64GccDPOpt
FOAM_SRC=$HOME/OpenFOAM/OpenFOAM-1.6.x/src
FOAM_SIGFPE=
FOAM_UTILITIES=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/utilities
FOAM_USER_LIBBIN=$WM_PROJECT_USER_DIR/lib/linux64GccDPOpt
FOAM_INST_DIR=$HOME/OpenFOAM
FOAM_LIBBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib/linux64GccDPOpt
FOAM_RUN=$WM_PROJECT_USER_DIR/run
FOAM_USER_APPBIN=$WM_PROJECT_USER_DIR/applications/bin/linux64GccDPOpt

3. 第三方库相关变量

MPI_ARCH_PATH=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3/platforms/linux64GccDPOpt
ParaView_INST_DIR=$HOME/OpenFOAM/ThirdParty-1.6.x/paraview-3.6.1
OPAL_PREFIX=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3/platforms/linux64GccDPOpt
ParaView_DIR=$HOME/OpenFOAM/ThirdParty-1.6.x/paraview-3.6.1/platforms/linux64Gcc
PARAVIEW_DIR=/opt/packages/Paraview3
ParaView_VERSION=3.6.1
MPI_HOME=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3

在正确设置上述环境变量后,即可对 OpenFOAM 源程序进行编译,并运行对应的求解器和工具。

编译系统

在大型程序编译与安装过程中,通常使用 make 和 cmake 等工具构建。在 OpenFOAM 中,使用的是 wmake 脚本进行编译,所在位置为 ${FOAM_DIR}/wmake/wmake。 查看此脚本可以发现,其编译是基于 make 修改,但是提供了针对 OpenFOAM 不同模块更灵活的特性,具体可参考网站^1013。

wmake 编译

在 Linux 平台编译软件时,通常需要给定一些编译和优化参数。在使用 wmake 编译时,编译脚本会则根据环境变量会加载对应的参数设置脚本进行编译。

在 OpenFOAM 中,编译参数设置文件所在路径为 ${FOAM_DIR}/wmake/rules/<Rules>,其中 <Rules> 成为编译规则,与环境变量中定义的编译平台、架构、编译器设置有关。 编译规则的定义在脚本 ${FOAM_DIR}/wmake/rules/General/general 中,查看脚本最后几行

$ tail -n 20 ${FOAM_DIR}/wmake/rules/General/general
COMPILER_TYPE   = $(shell echo $(WM_COMPILER) | tr -d [:digit:])
DEFAULT_RULES   = $(WM_DIR)/rules/$(WM_ARCH)$(COMPILER_TYPE)
RULES           = $(WM_DIR)/rules/$(WM_ARCH)$(WM_COMPILER)
WMAKE_BIN       = $(WM_DIR)/platforms/$(WM_ARCH)$(WM_COMPILER)......include $(DEFAULT_RULES)/general
include $(DEFAULT_RULES)/c++
sinclude $(RULES)/general
sinclude $(RULES)/c++
include $(GENERAL_RULES)/transform

其中 DEFAULT_RULESRULES 为定义的两个编译规则变量,可以看出编译规则名称由平台 $(WM_ARCH) 和编译器 $(WM_COMPILER) 组成。 DEFAULT_RULESRULES 变量的区别主要在于,前者中删除了 WM_COMPILER 中包含的所有数字,而默认加载的是 DEFAULT_RULES 路径下编译设置文件。 为了保证在定义规则时能够添加数字,可以修改 DEFAULT_RULES,使其与 RULES 定义完全相同。 在加载脚本指令中,#sinclude 为 OpenFOAM 自定义的宏指令。与 #include 主要区别在于,当加载文件不存在时不会报错并退出^1312。

当使用某个编译规则编译完成后,生成中间文件 *.o 的路径为 ${FOAM}/build/$(DEFAULT_RULES),而可执行程序的路径为 ${FOAM}/platforam/<makeRule>。 这些路径的定义都包含在了环境配置文件 ${FOAM}/etc/bashrc 中 ,并且还将可执行程序路径自动添加到 PATH 变量内,从而可以直接运行 OpenFOAM 工具和求解器。

由于 wmake 是基于 make 命令实现的,因此其也具有自动推导功能。当对某个特定源程序文件进行修改后,wmake 只会重新编译包含与此文件相关的模块。

wmake 使用

1. 编译文件结构

在使用 make 编译源程序时,需要在 makefile 中指定编译指令,并提供引用的头文件和动态链接库位置。当使用 wmake 脚本时,则仅按照一定规则配置说明文件即可。

在 OpenFOAM 每个模块内,源程序文件后缀为 .C,头文件后缀为 .H。为了提供编译所需的信息,在文件夹内必须同时包含 Make 文件夹,内含 files 和 options 两个设置文件。以 icoFoam 求解器为例,其编译文件结构为

icoFoam
├── createFields.H
├── icoFoam.C
└── Make├── files└── options

files 文件内,包含了进行编译程序全路径和名字(EXE 变量)。关于安装路径可以提供两种形式,一个是标准路径,编译好的求解器储存在 $FOAM_APPBIN,也可以保存在用户自己的路径 $FOAM_USER_APPBIN 中。在 icoFoam 求解器中,配置文件files 内容如下所示,其中 EXE 变量说明了需编译生成可执行程序,当目标为动态链接库时使用 LIB 变量。

$ cat icoFoam/Make/files
icoFoam.CEXE = $(FOAM_APPBIN)/icoFoam

options 文件内指定了模块需要连接的头文件和链接库,其中头文件使用 EXE_INC-I 关键字进行指定,而连接库则需要用 EXE_LIBS-L/-l 等指定。在 icoFoam 求解器中 options 文件的内容为

$ cat icoFoam/Make/options
EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude -I$(LIB_SRC)/meshTools/lnIncludeEXE_LIBS = -lfiniteVolume -lmeshTools

2. 模块编译

在 OpenFOAM 中,对特定模块编译时,需要进入模块上一层目录下,使用 wmake + <模块名> 进行编译。在 wmake 命令运行时,可以通过增加 -j 参数可以启用并行编译指令。当需要对 OpenFOAM 全部代码进行编译时,可以直接运行源程序目录下 Allwmake 脚本。

当需要删除特定求解器和动态库时运行 wclean 命令,若需将全部求解器和动态库,加 -all 参数。

自定义编译规则:Intel-2019

在本节中,将定义一个新的编译规则,设置采用 intel 2019.5.281 版本编译器和 MPI 函数库进行编译,并对编译设置文件进行相应修改。

为了在编译后,能够通过加载单独的 bashrc 脚本来使用不同的 OpenFOAM 可执行程序,可以复制一份 bashrc 文件的拷贝 bashrc-intel-19,并在此文件中修改 WM_COMPILER=Intel-19。此时自定义编译规则名为 linux64Intel-19

在使用默认参数对 OpenFOAM 编译后,生成可执行程序使用的是 SSE 指令集。随着新一代 CPU 开始提供浮点性能更高的 AVX 系列指令集,可以通过修改编译参数,使求解器使用 AVX 指令集。

这时,需要在新的编译配置文件中进行修改。为此,复制目录 ${FOAM_DIR}/wmake/rules/linux64Icc,并将目录名称修改为 ${FOAM_DIR}/wmake/rules/linux64Intel-19 作为编译规则配置文件。 在此目录下 cc++ 两个文件包含了编译器的基本设置,在OptDebugProf等后缀的对应文件内,定义了不同优化设置 WM_COMPILE_OPTION 时使用的参数。 为使用 Intel 2019.5.281 版本编译器,可以修改 cc++ 文件中 CC 变量的值为 icc 和 icpc。为了省去在编译时指定对应的 MPI 头文件和动态链接库的位置,也可以直接用 mpiicc 和 mpiicpc 分别作为 C/C++ 程序编译器。 在对第三方函数库进行编译时,使用的编译器由 WM_CCWM_CXX 变量提供,因此还需要在配置文件 bashrc-intel-19 中,添加这两个变量的定义。

$ echo 'export WM_CC=icc' >> ${FOAM_DIR}/etc/bashrc-intel-19
$ echo 'export WM_CC=icpc' >> ${FOAM_DIR}/etc/bashrc-intel-19

设置完毕后,加载新的环境配置文件 ${FOAM_DIR}/etc/bashrc-intel-19,再运行Allwmake 脚本,即可生成按照自定义规则编译的二进制程序。

openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程相关推荐

  1. openfoam安装中出现allmake error_如何更新OpenFOAM的版本?

    这是协作翻译的第四章,翻译完感觉挺有意思的,分享给大家一起看看. 4.更新OpenFOAM版本 4.1 版本管理 OpenFOAM以两种不同的方式分发.一种方式是使用Git仓库下载的仓库版本.仓库版本 ...

  2. 怎么看python环境变量配置是否好了验证图片_简述验证Anaconda是否安装成功的两种方式和Anaconda环境变量配置过程...

    加个"星标",每天一起快乐的学习 今 日 鸡 汤 闻道欲来相问讯,西楼望月几回圆. /1 前言/ 大家好,我是 Rocky0429,今天我给大家介绍一下验证Anaconda是否安装 ...

  3. 2.深入一点理解C源程序的编译过程

    2.深入一点理解C源程序的编译过程 本文章的大多数灵感及知识来源于南京大学的计算机系统基础教材,如果希望更加深入地对相关知识做进一步了解,可以移步上述相关资源.在网上可以轻易获得上述资源,mooc也有 ...

  4. 简述验证Anaconda是否安装成功的两种方式和Anaconda环境变量配置过程

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 闻道欲来相问讯,西楼望月几回圆. ...

  5. vc2005编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决

    vc2005编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决 收藏 快毕业了,为了工作的需要,需要使用庞大的VS2 ...

  6. C++编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决...

    今天本人用vs2005 sp1中文版,学习C++程序的过程中,在执行MFC程序时,在编译过程中出现如下问题: 相关问题:这里编译时可能出现以下问题 /************************* ...

  7. *#OpenFOAM安装后的第一个案例的理解与运行(pitzDaily)

    #OpenFOAM安装后的第一个案例的理解与运行(pitzDaily) /运用算例的目的:理解运算过程,检测OpenFOAM安装是否成功/ 1.安装openfoam8 ,结束配置后开始算例 2.依据o ...

  8. linux分区概念理解,在linux安装中的分区概念(转)

    在linux安装中的分区概念(转)[@more@] 首先我们需要知道,硬盘分区的存在,是由硬盘的物理特性决定的,并不会因为不同的操作系统而有所改变. 请您把一块硬盘想象为一本书--即便您不喜欢读书,您 ...

  9. 流固耦合开源软件precice安装笔记(包括开源CFD软件OpenFOAM、插件swak4Foam,开源有限元软件CalculiX、deal.II)

    安装环境:Ubuntu 20.04 LTS 1. 安装Python发行版Anaconda 可在Anaconda官网下载安装包,下载完成后在下载目录中鼠标右键打开终端,键入: bash Anaconda ...

最新文章

  1. 进程创建函数fork()和vfork()
  2. linux vnc服务重启,CentOS下配置VNCServer,重启服务仍然生效
  3. [luogu1131][bzoj1060][ZJOI2007]时态同步【树形DP】
  4. 用python倒序输出一个字符串_Python字符串逆序输出的实例讲解
  5. Linux有趣小工具命令,终端中的乐趣:6个有趣的Linux命令行工具
  6. java 多线程同步_浅谈Java多线程(状态、同步等)
  7. 华清实训的收获(人工智能的小广告和福利)
  8. 成长 | 《大厂晋升指南》学习总结(中)
  9. EF Core 2.0使用MsSql/Mysql实现DB First和Code First
  10. [react] React的render中可以写{if else}这样的判断吗?
  11. eclipse打开后显示 Failed to create the part‘s controls 解决方法
  12. python产品缺陷检测_3 Kaggle钢材表面缺陷检测竞赛的探索与实践-阿里云开发者社区...
  13. Android应用开发的一些思考
  14. 方法代码ASP.NET MVC如何使用Ajax的辅助方法
  15. python 爬虫 糗百成人
  16. 主题:一个成功的RIA技术需要满足的条件(转)
  17. OSPF多区域配置实例
  18. 百度竞价推广:关键词首页指导价分析及竞价出价技巧
  19. 打开计算机网络自动连接,电脑如何自动连接上网 开机自动拨号连接宽带的方法【步骤】...
  20. PCM音频处理一:分离左右声道音频

热门文章

  1. 如何解决div层被flash遮盖的问题
  2. 【tool】网站测试分类
  3. 为什么要重映射那个GPIO_Remap_SWJ_JTAGDisable
  4. 练习1: Python基本语法元素 (第1周)
  5. mysql空洞_optimize table 删除空洞--MYSQL
  6. seata xid是什么_Seata 分布式事务框架
  7. cryptogen (1)generate 生成证书举例
  8. Hyperledger Fabric 私有数据(3)交易流程
  9. 差分能量分析介绍(五)
  10. crypto-RSA