找回密码
 注册
查看: 5978|回复: 1

[转载]OpenFOAM——编译过程

[复制链接]
发表于 2009-2-10 23:45:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我在两台机器上编译了OpenFOAM,

    一台CPU是DUAL XEON(带64位指令扩展),
    操作系统是Linux RedHat Linux ES 3.0 for EM64T(64bit),
    linux kernel是2.4.21 (x86-64,SMP),
    GCC版本是3.2.3,glibc 2.3.2,
    binutils的版本是2.14.90。

    另一台是CPU是普通的Pentium 4,
    操作系统是RedHat Fedora Core 5,
    kernel 2.6.15 (i386),
    GCC 4.1.0,glibc 2.4,
    binutil 2.16.91。

两台机器OpenFOAM的安装都在用户权限下进行。

安装基本按照这个howto进行的。下面给出的一些信息仅是这个howto的补充。

在安装之前,如果对linux下的编译、静态和动态链接以及make过程不太了解,不妨可以看看GCC the complete reference。这个有英文的电子版,在新水木的linuxdev版不久之前还有人贴过,我觉得基本上看看第4、12以及14章就可以了。

大体上,OpenFOAM的编译从逻辑上可以分为三个部分,前处理、求解器和后处理
其包依赖性大致可以如下图所示。



不过在实际编译时,在安装gcc/binutil/java/cmake/paraview之后,三部分都是在一个make命令下同一完成的。

OpenFOAM源代码树中还包含了两个辅助的包的源代码,mico和lam-mpi。前者是用于FoamX用于浏览计算节点机器的一个支持库(大概吧,不是非常清楚)。后者用于支持并行计算。

起始,从我的经验来看,OpenFOAM的求解器的编译还是相对容易的,容易出问题的是FoamX和paraFoam(包括paraView)的编译,特别是后者。如果你的确遇到FoamX和paraFoam的编译问题,不妨统统不考虑java/cmake/paraview这些包,仅安装gcc/binutil/openFOAM(如下图),我觉得这也能够得到一个命令行的OpenFOAM(我没有试验过)。

FoamX的用处实际不大,我觉得编辑配置文件,然后用命令行操作是一种效率更高的方式;在后处理方面,OpenFOAM提供了从OpenFOAM到Fluent数据文件的转换功能,也许可以把Fluent作为一个后处理器。当然,也可以用OpenFOAM的数据采样程序sampling。



这是编译成功之后的OpenFOAM目录结构。通常OpenFOAM安装在$HOME/OpenFOAM之下,其中的OpenFOAM-1.3也是将源代码解开后生成的目录,生成的OpenFOAM二进制代码也在此目录下(似乎不是个好主意,但是缺省的安装模式就是这样的)。$HOME/OpenFOAM/linux是binutil/gcc/cmake/paraview/java-sdk的二进制以及一些.h .lib文件。$HOME/OpenFOAM/$LOGNAME-1.3是用户的项目文件目录。

编译出来的OpenFOAM动态链接库文件在$HOME/OpenFOAM/OpenFOAM-1.3/lib/linuxGcc4DPOpt/目录下,linuxGcc4DPOpt目录名取决于编译时候的一些选项,其中linux是操作系统平台,Gcc4是编译器,DP是双精度,Opt是为速度优化编译。

编译出来的可执行文件在$HOME/OpenFOAM/OpenFOAM-1.3/applications/linuxGcc4DPOpt/下。包括:
    
    icoFoam 层流模型,
    turbFoam 基于雷诺时均非常的求解器,
    coodles LES模型,
    dnsFoam DNS模型
    bubbleFoam 欧拉-欧拉模式的双流体模型,
    dieselEngineFoam 一个带喷嘴的发动机模拟

    blockMesh OpenFOAM自己的网格生成器
    gambitToFoam/fluentMeshToFoam/cfxToFoam Gambit/Fluent/CFX网格的转换器
    foamMeshToFluent/foamDataToFluent 将OpenFOAM的网格/数据转为Fluent格式
    sample 数据采样程序
    mapFields 将粗网格的数据映射到细网格的工具
    chemkinToFoam 将chemkin动力学网络引入OpenFOAM的工具

更具体的参考OpenFOAM用户手册。

$HOME/OpenFOAM/OpenFOAM-1.3/bin是源代码中预带的script命令,其中foamInstallationTest是检测安装是否成功的一个script(其实这个script仅是检查一些预定义的目录和文件是否存在)。我在FC5上安装编译之后运行foamInstallationTest得到的结果。

(1)FC5上的安装
在FC5上的安装OpenFOAM比较简单,基本按照howto进行即可。因为OpenFOAM1.3 推荐在Gcc 4.1下编译(我试过在gcc 3.2下面编译,似乎编译部分即出现了一些错误),而目前我能够得到的包括Gcc4.1的linux发行版本只有FC5,所以特地为了OpenFOAM 1.3而安装了FC5。
(OpenFOAM开发者所用的机器是Suse Linux,最新的Suse Linux 10.1也包含了Gcc 4.1,所以选择Suse 10.1可能是一个更好的选择。不过Suse Linux 10.1在教育网上的镜像还不太好找)。

由于FC5上的GCC都已经是最新的,所以无需安装了;
binutil由于还需要一个demangle.h头文件和libiberty.a库文件,还需要从源代码中安装;
cmake需要从源代码安装;
paraview需要安装;
jdk需要从Sun发布的二进制代码安装。

这样在编译之前,需要准备下面几个软件包的源代码
    binutils-2.16.1.tar.bz2
    cmake-2.3.4-20060317.tar.gz
    OpenFOAM-1.3.General.gtgz
    paraview-2.4.3.tar.gz
    j2sdk1.4.2_05.linux.tgz(二进制)

其中安装顺序大概如下

    (1)编译安装binutils-2.16.1.tar.bz2,其版本与FC5中所带的binutils相同
    源码解压至$HOME/OpenFOAM/src/tmp/binutils-2.16.1/
    安装至$HOME/OpenFOAM/linux/binutils-2.16.1/

    (2)编译安装cmake
    源码解压至$HOME/OpenFOAM/src/tmp/cmake-2.3.4-20060317/
    安装至$HOME/OpenFOAM/linux/cmake-2.3.4/

    (3)安装jdk
    安装至$HOME/OpenFOAM/linux/j2sdk1.4.2_05/

    (4)解压OpenFOAM源代码,修改配置文件(c1-c6)
    源码解压至$HOME/OpenFOAM/OpenFOAM-1.3/
    修改(c1-c6)后需要执行$HOME/OpenFOAM/OpenFOAM-1.3/.OpenFOAM-1.3/bashrc
    将(c1-c6)中的环境变量export到shell环境中。

    (5)解压paraview源代码,修改配置文件(c7-c9),编译安装paraview。
    编译时间大约30分钟(P4 3G,大概时间)。
    源码解压至$HOME/OpenFOAM/src/tmp/paraview-2.4.3/
    安装至$HOME/OpenFOAM/linux/paraview-2.4.3/

    (6)编译OpenFOAM。编译时间大约1~2个小时。
    编译前后都可以运行foamInstallationTest看看还有上面问题。我在编译之前
    的结果只有一般critical error,即icoFoam找不到(这是因为还没有编译)。
    编译之后就critical error了。

这里简要说一下需要修改的配置文件。其中(c1-c6)用于编译OpenFOAM,(c7-c10)是用于编译paraview的。

其中(c2)中cmake环境变量的设置也是编译paraview所需要的。另外,我认为可能不用完全按照上面(4-6)的顺序,在安装cmake之后,自己设定一下(c2)中cmake的环境变量,修改(c7-c10)后可能就可以编译paraview了。然后解压OpenFOAM源代码,修改配置文件(c1-c6),编译OpenFOAM。这个顺序我觉得更容易理解一些(不过我没有试过)。

(c1)$HOME/OpenFOAM/OpenFOAM-1.3/.OpenFOAM-1.3/bashrc
  line 61
  export WM_COMPILER=Gcc4
  使用gcc4.x
  line 68
  #export WM_64=1
  这里不需要64位编译

(c2)$HOME/OpenFOAM/OpenFOAM-1.3/.bashrc
  line 114
  if [ "$WM_COMPILER" = "Gcc4" ]; then
  export WM_COMPILER_DIR=/usr
  这里是给出Gcc的目录,因为这里使用的系统自带的目录,因此
  设为/usr 即可
  line 244
  export CMAKE=cmake-2.3.4
  export CMAKE_ARCH_PATH=$WM_PROJECT_INST_DIR/$WM_ARCH/$CMAKE
  AddPath $CMAKE_ARCH_PATH/bin
  给出cmake的环境变量
  #export BINUTILS_ROOT=$WM_PROJECT_INST_DIR/$WM_ARCH/binutils-2.16
  不设定BINUTILS_ROOT环境变量(因为我发现这个会导致gcc可能工作不正常)。
  由于取消了$BINUTILS_ROOT,$HOME/OpenFOAM/OpenFOAM-1.3/src/
  OpenFOAM/Make/options也无需修改了。

(c3)$HOME/OpenFOAM/OpenFOAM-1.3/.OpenFOAM-1.3/apps/paraview/bashrc
  line 47
  export ParaView_VERSION=2.4.3
  $ParaView_VERSION用来设置$ParaView_INST_DIR与$ParaView_DIR。

(c4)$HOME/OpenFOAM/OpenFOAM-1.3/applications/utilities/
postProcessing/graphics/PVFoamReader/PVFoamReader/CMakeLists.txt
按照howto修改即可。

(c5)因为前面取消了BINUTILS_ROOT环境变量,现在要手动修改包含demangle.h的源文件。幸运的是只有一个文件包含了demangle.h,即$HOME/OpenFOAM/OpenFOAM-1.3/src/OpenFOAM/db/error/error.C
  line 41
  #include <$HOME/OpenFOAM/linux/binutils-2.16.1/include/demangle.h>
  (这里的$HOME需要改为真正的用户目录)

(c6)同样,需要将库文件libiberty.a放到一个gcc能够找到的地方。创建$HOME/OpenFOAM/OpenFOAM-1.3/lib/linuxGcc4DPOpt子目录(这是存放编译出的OpenFOAM库文件的目录),将$HOME/OpenFOAM/linux/binutils-2.16.1/lib/libiberty.a 拷贝到该目录下。

(c7)$HOME/OpenFOAM/src/tmp/paraview-2.4.3/CMakeLists.txt
按照howto修改即可。

(c8)$HOME/OpenFOAM/src/tmp/paraview-2.4.3/Utilities/TclTk/
tcl8.4.5/unix/tcl.m4
按照howto修改即可。

(c9)$HOME/OpenFOAM/src/tmp/paraview-2.4.3/Utilities/TclTk/
tk8.4.5/unix/tcl.m4
按照howto修改即可。

(c10)$HOME/OpenFOAM/src/tmp/paraview-2.4.3/lib/paraview-2.4/CMakeCache.txt
按照howto修改即可。注意howto中与lib64和m64相关的修改就不需要了。
注意这个文件是在创建$HOME/OpenFOAM/src/tmp/paraview-2.4.3/lib/paraview-2.4/目录后,且在这个目录下执行“cmake ../..” 后自动生成的。

(c1-c10)修改之后,在$HOME/OpenFOAM/linux/paraview-2.4.3/lib/paraview-2.4/
执行
make
make install
就可以编译和安装paraview

然后执行$HOME/OpenFOAM/OpenFOAM-1.3/Allwmake
就开始OpenFOAM的编译。注意,上述命令之后可以加入 “2 > error.txt”,就可以在error.txt中看到所有的出错消息了。

good luck !

转自http://166.111.35.76/index.php  ——Qian Zhen's weblog
转自http://blog.pfan.cn/bioexplore/20825.html
发表于 2009-4-9 09:36:25 | 显示全部楼层
这一篇博文我也曾看过,是针对1.3版本的啊,谁有1.5版本的编译方法啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表