在 Windows 7 下配置 OpenFOAM 运行环境

本篇介绍如何在 Windows 7 64 bit 下配置 OpenFOAM 的编译及运行环境。我并不打算在 windows 下进行 OpenFOAM 的开发,这里的折腾仅仅是作为一种测试,想看看目前的 OpenFOAM for windows 安装能做到什么程度。我使用的是Creative Fields提供的安装包,编译环境是基于 Mingw-64 来搭建的,linux模拟环境采用的是 MSYS,终端使用的是 mintty。经过一番折腾,我成功在 Windows 下安装了OpenFOAM-2.3.0,程序可以串行或并行运行,也可以用 wmake 编译新的代码。本篇博文不会一步一步详细介绍我的搭建过程,仅介绍一些基本的原则以及我遇到的坑。尤其注意的是,以下很多步骤其实对于安装 OpenFOAM for Windows 不是必需的,仅仅是因为我的特殊要求而徒增折腾而已。

1. 安装

安装步骤其实很简单,从Creative Fields下载 OpenFOAM for Windows,然后运行安装程序,选择需要的安装的 OpenFOAM 版本(OpenFOAM-2.3.0 或者 FOAM-extend-3.1,这里我安装的是前者),此外 Mingw compiler 也需要选上,不然无法编译新的 OpenFOAM 代码。选好以后,就开始安装过程,安装过程其实是将预编译好的 OpenFOAM 解压到你指定的目录。安装结束以后,从install_dir/OpenFOAM\OpenFOAM-2.3.0运行of23.bat,便会开启一个 Windows 的 cmd 窗口,从这个窗口里便可以运行 OpenFOAM 了。经测试,串行运行 cavity 和并行运行 dambreak 算例都能成功。如果仅仅满足于能在 Windows 下运行 OpenFOAM,那到这里就可以了,下面的不需要再看了。

但是,默认的 OpenFOAM 运行环境有很多不如意的地方,一是终端太简陋,没有颜色;二是 vim 使用的体验非常差;三是无法正常编译新的 OpenFOAM 代码。为了获得更好的使用体验以及更完整的功能,我进行了以下折腾。

2. 运行环境的配置

先简单描述一下我电脑的配置环境:我已安装过 32位版的 mingw,并配置好了 msys+mintty 环境,使用体验很不错。但是,从Creative Fields 提供的 OpenFOAM for Windows 默认使用的是它自带的 MSYS,经测试有问题,最不能忍的一个是,这个版本的 MSYS 配合 mintty 终端使用的时候,无法使用ctrl + z将程序放到后台,按ctrl + z会导致终端崩溃。此外,这个版本的 OpenFOAM 是在64 环境编译好的,经测验无法在 32位mingw 环境下编译新的代码,因为库的版本不一致。我不想破坏原来的配置,希望实现两个不同的终端入口,其中一个进入后会自动载入OpenFOAM的运行环境,包括 OpenFOAM 相关的环境变量, Mingw-64 编译环境,以及我配置好的 msys+mintty 运行环境。另一个入口,进入后则会自动载入先前配置的 msys + mingw-32 运行环境。下面开始配置:

2.1. 修改of23.bat

默认的内容如下:

1
2
3
4
@echo OFF
if NOT exist D:\OpenFOAM\MSYS\home\%USERNAME%\.profile call D:\OpenFOAM\MSYS\initProfile.bat
SET FOAM=of23
D:\OpenFOAM\MSYS\bin\sh.exe --login -i

我想载入我的 msys 环境,则需要对这个批处理脚本进行修改。最省事的方法是将原来安装 msys 时的脚本msys.bat的内容拷过来,然后加上一些 OpemFOAM 相关的变量,经测试,只需要改三处:

  • 加上这一句if NOT exist D:\OpenFOAM\MSYS\home\%USERNAME%\.profile call D:\OpenFOAM\MSYS\initProfile.bat,这个跟加载 OpenFOAM 环境变量有关。
  • 加一个环境变量 set FOAM=of23,注意如果安装的是FOAM-extend-3.1这一条可能会不一样。
  • 指定 msys 的路径,一共有两处需要修改。
    if NOT EXIST %WD%msys-1.0.dll set WD=.\bin\ 改成
    if NOT EXIST %WD%msys-1.0.dll set WD=C:\MinGw\msys\1.0\bin\
    以及
    if NOT EXIST %WD%msys-1.0.dll set WD=%~dp0\bin\ 改成
    if NOT EXIST %WD%msys-1.0.dll set WD=C:\MinGw\msys\1.0\bin\
    注意C:\MinGw\msys\1.0\bin\是我的 msys 的路径。

    完成这个以后,建立一个of23.bat的快捷方式,并将快捷方式的属性里目标设为:D:\OpenFOAM\OpenFOAM\OpenFOAM-2.3.0\of23.bat -mintty。设置好以后,运行这个快捷方式,便会自动载入 msys+mintty 运行环境了,并且自动配置好了OpenFOAM运行相关的环境。

2.2. 解决32位和64位 Mingw 的冲突问题

以上运行环境里默认加载的是32位 Mingw 编译环境,无法编译新的 OpenFOAM 代码,为了解决这个问题,需要实现在需要运行 OpenFOAM 时,自动载入64位的 Mingw,这需要通过修改$HOME/.profile 文件来实现。摸索过程不细说了,这里贴上我的最终配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if [ -n "${FOAM+1}" ]; then  
if [ $FOAM == "of23" ]; then

echo Setting up OpenFoam 2.3 shell
source /D/OpenFOAM/OpenFOAM/OpenFOAM-2.3.0/etc/bashrc
export PATH=/D/OpenFOAM/MinGW/bin:$PATH
export CPLUS_INCLUDE_PATH='D:\OpenFOAM\MinGw\include;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2\include'
export C_INCLUDE_PATH='D:\OpenFOAM\MinGw\include;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2\include'
export LIBRARY_PATH='D:\OpenFOAM\MinGW\lib;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2'
elif [ $FOAM == "f3" ]; then

echo Setting up foam-extend-3.1 shell
source /D/OpenFOAM/OpenFOAM/foam-extend-3.1/etc/bashrc
export PATH=/D/OpenFOAM/MinGW/bin:$PATH
export CPLUS_INCLUDE_PATH='D:\OpenFOAM\MinGw\include;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2\include'
export C_INCLUDE_PATH='D:\OpenFOAM\MinGw\include;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2\include'
export LIBRARY_PATH='D:\OpenFOAM\MinGW\lib;D:\OpenFOAM\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2'
else
echo No foam preset in MSYS
fi
fi
#echo Setting up ParaView
export PATH=$PATH:/d/Program\ Files\ \(x86\)//ParaView\ 4.1.0/bin/

# echo Setting up PATH
export PATH=$LD_LIBRARY_PATH:$PATH
# echo Done

以上配置好以后,便可以用wmake来编译新的 OpenFOAM 代码了。

2.3. 一些坑

如果以上配置好以后,仍然无法编译你的 OpenFOAM 代码,那可能是以下原因造成的:

  • Creative Fields 这个版本的 OpenFOAM,将所有的属于 OpenFOAM 的源码文件名都在之前加了一个OF_的前缀。我估计这是为了防止文件名冲突,因为windows下,文件名不区分大小写,如此一来,OpenFOAM的源码文件Vector.H便与标准C++的头文件vector.h无法区分了。所以,从Linux下拷贝过来的OpenFOAM源码无法直接在这个环境下编译,需要修改一下#include的源文件名再尝试。
  • wmake编译的时候,默认会去src目录下编译生成的lnInclude目录下寻找头文件,但是,估计是由于 msys 环境下不支持符号链接,这个版本的OpenFOAM的 src目录下不自带lnInclude目录,所以,编译会遇到找不到头文件的错误,解决办法是重新运行一次src目录的Allwmake,编译不会成功,不过无所谓,只要生成了那些lnInclude目录就行了。
  • mpicc,mpic++,mpicxx这几个程序在默认情况下不能正常运行,原因是,在D:\OpenFOAM\OpenFOAM\ThirdParty-2.3.0\platforms\mingw64Gcc\openmpi-1.6.5\share\openmpi下定义的*-wrapper-data.txt文件中,指定的默认编译器是cl.exe,这是visual studio带的命令行编译器。将之改成gcc.exe( mpic++ 和 mpicxx 的改成g++.exe),便可以正常运行了。

最后,所有配置都弄好以后,便可以以比较好的体验在Windows下编译和运行OpenFOAM了,但是,msys+mintty 这套环境仍有一个遗憾,那就是并行不能正常。如果在 mintty 终端里直接运行mpirun -np 4 interFoam.exe -parallel,会报错:..\..\..\SOURCES\openmpi-1.6.5\opal\event\event.c: ompi_evesel->dispatch() failed.。但是如果用 nohup 命令,nohup mpirun -np 4 interFoam.exe -parallel &则可以并行运行。只是仍有一个bug,那就是程序运行结束以后,进程interFoam.exe不会自动关闭,需要手动从任务管理器里去结束。但在默认的of23.bat环境里,并行是正常的,所以妥协的办法是当需要并行运行的时候,就转移到默认环境里去运行。

以上仅供读者参考,不推荐新手去折腾,因为不太值得,安装一个 Ubuntu 虚拟机,然后在里面安装配置 OpenFOAM 简单多了,而且使用体验也更好。即便要折腾,也不太推荐Creative Fields 的这个安装包,因为它在所有的OpenFOAM源文件名前加了OF_前缀,这对编译从linux环境下拷贝过来的 OpenFOAM 代码造成了不小的麻烦。不知道其他的OpenFOAM for windows 安装包采用的是什么方法来规避上面提到的文件名可能冲突这个问题的。

顺带提一句,Creative Fields 除了提供OpenFOAM for Windows,还有一个画网格工具套装叫cfMesh,经简单试用,其特点是自动化程度很高,网格生成速度特别快。