当前位置:首页 >> 电力/水利 >>

Unsteady boundary conditions in openFOAM


Unsteady boundary conditions in openFOAM By Alberto On August 15, 2008 · 25 Comments I recently had to help a friend setting up a case in OpenFOAM, where a ramp boundary condition for the vel

ocity was required. Apparently OpenFOAM doesn’t offer this boudary condition, or at least it might seem so at a first impression. Actually, OpenFOAM offers a very general way to specify unsteady boundary conditions called timeVaryingFixedValue, which can read a data set from a text file, interpolate them with respect to time and use them to generate the unsteady boundary condition. I will show how to use this boundary condition with a simple example of a ramp for a velocity boundary condition. We want the velocity to ramp from the value U1 = (0, 1, 0) to the value U2 = (0, 3, 0) in the time interval between t1 = 0 and t2 = 5s. The velocity stays constant and equal to U2 for t > t2. The ramp is simply defined by the extrema: the interpolation routine will automatically provide the correct values for the times contained inside the interval specified above. So, we need to create a text file with the following format: ( (t_0 value_0) ... (t_n value_n) ) In our specific case, we create a file called ramp containing the following lines: ( (0.0 (0 1 0)) (5.0 (0 3 0)) ) This file must be saved in the main directory of the simulation case, containing the 0, constant and system directories. The boundary condition can be then specified in the velocity dictionary in the 0 directory as follows: rampInlet { type timeVaryingUniformFixedValue; fileName "ramp"; outOfBounds clamp; } It is worth to pay attention to the option outOfBounds clamp; which specifies that for all the values of t outside the interval provided by the data, the values of the dependent variable are clamped to the last available value. In our case this means that the condition U = U2 for t > t2 will be imposed. The clamp option is also useful if we want to specify a ramp that begins for t > 0 or to change the final value of the dependent variable when the ramp is completed. Let’s consider the previous example again. Now we want the ramp to start at t = 2s and the velocity to go to zero at the end of the ramp. This can be simply accomplished by adding two lines to the dictionary, as follows: (

(1.99999 (0 0 0)) (2.0 (0 1 0)) (5.0 (0 3 0)) (5.00001 (0 0 0)) ) The timeVaryingFixedValue boundary condition is of course suitable for all kinds of fields. For a scalar, the dictionary will contain couples of data (t, value), while for tensors each line will have a 9 components tuple. Note: This procedure was tested on OpenFOAM 1.5. 130702 http://blog.pfan.cn/bioexplore/33162.html 在 OpenFOAM 中做用户自定义库——编译 library openfoam 自己提供的标准类都是以库的形式提供的,并且利用头文件给出了库的应用接口。这样一来,用户的代码 中即使用到了某个类,也不需要对源文件进行重新编译了。这样做有好有坏:好处是提高了效率;坏处是源 文件(.c)进行修改了但如果不重新编译的话会导致库文件不会被更新,从而用户代码中用到的还是旧库。缺点 可以弥补,那就是在修改了代码之后进行重新编译,但是一般情况下,我们完全可以不去动 OpenFOAM 的源文件。 (前面提到了编译器会根据文件的修改情况决定是否重新编译,针对的是.h 文件,而非.c 源文件) 既然 OpenFOAM 采用的是上面的这种机制,那么用户在自己定义某个类之后该如何处理呢?标准的做法也是将其 生成库文件,就像 OpenFOAM 本身提供的那样。当然用户很可能会修改自己的这个类,那么在修改之后记得重新 编译就好了。那么,如何生成用户自定义的库呢? OpenFOAM 提供了一个库:foamUser。如果查看目录$FOAM_LIBBIN 会发现该库文件。不过 OpenFOAM 本身并未给 此库提供什么功能,它相当于一个“空库”,等待用户自己去添加。与之对应,在$FOAM_SRC 目录下可以找到一 个 foamUser 文件夹,这是一个模版,提供了一个现成的框架,其中 Make 文件夹中的 files 和 options 文件提供了 利用 wmake 进行编译时的选项。其中 files 文件内容如下: libfoamUser.C //指出源文件 //LIB 指出编译为库,等号后为所添至库的路径 LIB = $(FOAM_LIBBIN)/libfoamUser

编译为库的命令为 wmake libso 。而 libfoamUser.C 中用到的头文件或者库同样在 Make/options 文件中说明, 方式与编译可执行文件相同,不过关键字 EXE 要换成 LIB,亦即: LIB_INC = \ -I<directoryPath> \ ... \ LIB_LIBS = \ -L<libraryPath> \ ... \ -l<library> \ ... \ 可见,$FOAM_LIBBIN 中的库文件就是由$FOAM_SRC/foamUser 下的内容生成的(或者添加,因为每个源文件都可以 添加到某一个已经存在的库中,如果该库不存在,则生成。当然也可以同时将很多源文件添加到某库中,这时 Make/files 文件中源文件的数量就不止一个,从这也可以看出,wmake 在进行编译的时候判断依据实际上就是 Make 文件夹) 仿照上面的“标准”方式,我们可以开发自己的库了。针对不同的开发功能,我们将 foamUser 这个名字替换成 我们自己所需要的(名字取得直观一些,采用“驼峰”式)。这样做的好处就是方便代码管理,有条理的工作总 能提高效率。建议:

自定义库的源文件统一放在$FOAM_USER/src 目录下,以功能分类存储(对应文件夹) 自定义库生成至$FOAM_USER_LIBBIN/ 库的名称与相应文件夹同名 总结一下,用户自定义库需要进行以下工作: 1.编写源文件(一个或多个,多个情况建议分文件夹存储) 2.确定 wmake 范围,建立 Make 文件夹及 options 和 files 文件(Make 文件夹应位于工程目录下,最好该 目录下所有源文件应都在编译范围内) 3. 修改 options 文件,确定头文件搜索路径,所引用库文件(搜索路径&库) 4. 修改 files 文件,确定编译范围和输出位置、输出库文件名 5. wmake libso 将自己的源码编译为库,同时做好其应用接口——头文件,我们就可以轻松应用自己的库了,就像 OpenFOAM 自 己提供的一样。一个好的习惯是,在编好一个源文件之后,就给出相应的头文件,并且命名相同,OpenFOAM 本身就 是这样做的 130702 [转载]openFOAM 基础--编译 applications 和 libraries openFOAM 基础--编译 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 文件来组织文件结构。) 编译工作都是由 wmake 完成的。有了前面的这些概念介绍,我们可以再来看一看 wmake 的功能和特点:

1、自动生成和维护 dependency list 2、多平台编译和链接, 3、多语言编译和链接,e.g. C, C++, Java. 4、多功能 (multi-option)编译和链接,e.g. debug, optimised, parallel and profiling 5、Support for source code generation programs, e.g. lex, yacc, IDL, MOC. 6、Simple syntax for source file lists. 7、自动生成新代码的源文件列表 8、Simple handling of multiple shared or static libraries. 9、 Extensible to new machine types. 10、 Extremely portable, works on any machine with: make; sh, ksh or csh; lex, cc. 11、Has been tested on Apollo, SUN, SGI, HP (HPUX), Compaq (DEC), IBM (AIX), Cray, Ardent, Stardent, PC Linux, PPC Linux, NEC, SX4, Fujitsu VP1000. 很多功能我们先不管它,现在我们知道 wmake 可以用来编译和链接程序、并且给出一个可执行文件就行了。我们关注的 有这些内容: 1)在程序中包含的头文件。wmake 需要能找到他们。“包含哪些头文件”在代码中已经说明,“这些头文件在哪”则需 要进行说明。 2) 程序需要载入的库,wmake 也需要能找到他们。(光有.h 文件是不够的,我们最终用的是库,.h 文件中声明的东西都 在这里面)“包含哪些库”和“这些库在哪”都需要进行说明。 3)生成的可执行文件。“生成到哪”需要说明。 以上各个需要进行说明的地方都是通过程序目录下的 make/options 和 make/files 文件实现的。后面会有详细的介绍。 我们逐项看一看上面的三条内容: (一) wmake 首先要生成 dependency list,然后搜索这些文件。对 openFOAM 而言,wmake 搜索的顺序如下: 1)$WM_PROJECT_DIR/src/OpenFOAM/lnInclude 2)当前目录下的 lnInclude 文件夹 3)当前文件夹 4)platform dependent paths set in files in the $WM PROJECT DIR/wmake/rules/$WM ARCH/ directory, e.g. /usr/X11/include and $(MPICH ARCH PATH)/include 5)其他在 make/opptions 文件中用-I 命令给出的路径。(*编译时需要在主程序目录中有 make 文件夹,内有 options、 files 文件,用以指明 wmake 命令的参数)。路径指出方法为: EXE_INC = \ -I<directoryPath1> \ -I<directoryPath2> \ ... \ -I<directoryPathN>

(二) 然后,wmake 需要进行“链接”。链接的过程也就是根据头文件中的声明在库中寻找有用代码,然后植入应用程序的过程。 当然我们不可能在整个计算机中进行寻找,这样一来就要限定范围:一是搜寻的范围,二是到底载入哪些库。这些事情 并不一定全要用户指定,因为有些事情 wmake 默认就帮我们做了,下面还是先看看基本情况。 搜索范围:wmake 在链接到共享对象库(shared object library)时按以下路径顺序进行搜索(指定路径的命令为-L): 1)$FOAM_LIBBIN 路径

2)platform dependent paths set in files in the $WM DIR/rules/$WM ARCH/ directory, e.g. /usr/X11/lib and $(MPICH ARCH PATH)/lib 3)其他由 Make/options 文件指定的路径。 载入的库:如果想载入某库,则要被链接的文件(.so 文件,在 windows 下为.dll 文件)需要用-l 命令指出时,此时 需要去掉前缀(prefix)lib 和后缀.so。举例:libnew.so 文件在被链接时的命令为"-lnew"。默认情况下,wmake 会 载入下面的 libraries: 1)$FOAM LIBBIN 目录下的 libOpenFOAM.so 2)platform dependent libraries specified in set in files in the $WM DIR/rules/$WM ARCH/ directory, e.g. libm.so from /usr/X11/lib and liblam.so from $(LAM ARCH PATH)/lib 3)其他在 Make/options 文件中指定的库 可以想见,要想链接某库,则其必须在库路径的搜索范围内。除了默认搜索的路径和默认载入的库,其他路径或库都 可以在 Make/options 文件中(同前所述)用下面的方法定义: EXE_LIBS = \ -L<libraryPath1> \ -L<libraryPath2> \ ... \ -L<libraryPathN> \ -l<library1> \ -l<library2> \ ... \ -l<libraryN> 有了编译和链接,就可以生成可执行文件了。可执行文件是在 Make/Files 文件中用"EXE="指出的,标准习惯取为 与工程名(亦即主程序名、主程序文件名)同名。至于存放目录也有约定俗成的习惯:openFOAM 提供的标准应用程 序(standard released applications)放在$FOAM_APPBIN,用户自己开发的应用程序放在 FOAM_USER_APPBIN。至于用户 如何组织自己的代码存放,完全可以参考 openFOAM 提供的标准库的存放方式。好的习惯可以使程序层次更加清晰,便于 管理。 此外,从上面的介绍可以看出 c++面向对象编程思想中需要借鉴的习惯,那就是:将代码都封装到类中,然后编译为 库,用头文件来做接口,在使用时以头文件为纽带、编译时用限制参数选择库,对库中有用的内容进行调用。 转自:http://blog.sina.com.cn/s /blog_5fdfa7e60100dciw.html 2013/06/20 将 OpenFoam 的编译系统介绍一下,并给出了如何在 OpenFOAM 下编译“hello world”程序。OpenFOAM 用的编译器 是 gcc,他并不是直接运用该编译器,而是将该编译器进行了包装,也就是 wmake。OpenFOAM 中的头文件通常为 H 结尾, 而代码文件是以 C 为扩展名,应当注意,这里的 C 为大写的,如果写成小写,wmake 会出现编译错误,尽管你编写的代 码没有错误。 运用 wmake 编译程序,程序所在的文件夹结构必须为如下形式 |—newApp |-newApp.C |-otherHeader.H |-Make |-files |-options Make 所在的文件夹中放有主程序,和在主程序用到的所有头文件,这里面的代码文件和头文件名字任意。Make 文件夹

里面有两个文件 files 和 options,这两个文件的名字不能改变。 files 文件主要干两件事 (1)指定哪些文件需要编译,这里的文件是代码文件,也就是.C 文件,而不包括.H 文件 (2)指定你要编译的类型,是编译成库,还是编译成可执行文件,以及编译成的库文件或者可执行文件的名字。 下面是 icoFoam 的 Make 文件夹下的 files 文件的内容 icoFoam.C EXE = $(FOAM_APPBIN)/icoFoam 要编译的代码文件直接将名字写到里面就行了,如果有多个代码文件,直接一个一个列在上面就行了。 下面为编译程序类型 EXE=,说明要编译成可执行文件,等号右面为编译后的文件放在什么地方。这一行也可以不写,他 会将编译的可执行文件放到当前文件夹,名字为 OpenFOAM.out. 如果你要编译成库的话请采用”“LIB= ...”等号后面放编译的库文件所在的目录,一般编译库文件命名为 lib...,这是一 个习惯,而非规定。 options 文件也是干两件事 (1)指定编译的头文件所在的目录,如果说所用的头文件在当前文件夹或者标准 C++的头文件,无需指定。 (2)指定编译当前程序所用到的库。 下面为 icoFoam 下的 options 文件的内容 EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS = -lfiniteVolume EXE_INC=用于所运用到的头文件所在的目录,EXE_LIB 用来指定所有到的库。注意这里的库为 OpenFOAM 中的库或者你自 己写的库,C++的标准库无需在这添加。 因此如果你不使用 OpenFOAM 中的库,而是自己独立编写 C++程序,并且所有的头文件都在当前的根目录,options 里 无需指定任何东西。 下面是一个简单的“Hello world”c++程序,按照我说的方法试一试? 第 1 步:建立一个目录,用于编译当前的 Hello world 程序? 下面为当根目录建立一个 hello 的文件夹,并进入 hello 文件夹。 cd //进入根目录 //进入 hello //建立 Make 文件夹 //进入 Make mkdir hello //建立文件夹,名为 hello cd hello mkdir Make cd Make 第 2 步: 建立 Make 文件夹,并进入 Make 建立 files 和 options 文件

touch files //创建 files 文件 touch options //创建 options 文件 cd.. //退出 Make 文件夹 第 3 步:建立程序文件 hello.C, 打开 hello.C 进行编程序 touch hello.C //创建 hello.C kate hello.C //打开 hello.C 输入如下代码 #include"iostream" using namespace std ; int main ()

{ cout<<"hello world"<<endl; } 关闭 kate 第 4 步:在 files 指定编译文件,hello.C cd Make //进入 Make kate files //打开 files 将下面的东西输入进去 hello.C EXE=hello 关闭 kate 第 5 步:程序编译 cd .. //退出 Make 文件夹 wmake //编译程序 第 6 步:看结果 ./hello 你做成功了吗?

2013/05/16 come from:http://blog.sina.com.cn/s/blog_4a0a8b5d0100s8xb.html some basic knowlege,but has been translated by the fellow up! $FOAM_SOLVERS ---->Basic ---->Incompressible flow ---->Compressible flow ---->Multiphase flow ---->Direct numerical simulation ---->Combustion ---->Heat transfer and buoyancy-driven flows ---->Particle-tracking flows ---->Molecular dynamics methods ---->Direct simulation Monte Carlo methods ---->Electromagnetics ---->Stress analysis of Solids ---->Finance 1. Basic ---->laplacianFoam: 求解简单的 laplacian 方程,如固体的热扩散问题。 求解方程:fvm::ddt(T) - fvm::laplacian(DT, T) T: temperature DT:diffusivity 计算温度梯度:gradT = fvc::grad(T) gradT.component(vector::X) gradT.component(vector::Y)

gradT.component(vector::Z) ---->potentialFoam: 简单的势流求解器,用于建立 NS 方程求解的初始场 读入标量 p,向量 U, 表面场 phi(界面流率) 求解压力方程,根据表面场重建速度场 ---->scalarTransportFoam: 求解因变量传递方程 求解方程:fvm::ddt(T)+ fvm::div(phi, T)- fvm::laplacian(DT, T) 2. Incompressible flow ---->adjointShapeOptimizationFoam 稳态求解不可压缩的非牛顿流体在变形的管道中受阻湍流流动,计算压力和速度场的变化情况

---->boundaryFoam 主要用于 1 维稳态不可压缩湍流模型求解,并生成一个 inlet 的边界条件用于后续计算 boundaryLaunderSharma boundaryWallFunctions boundaryWallFunctionsProfile ---->channelFoam channel 流的 LES 求解 ---->icoFoam 瞬态求解不可压缩牛顿流体层流 ---->MRFSimpleFoam 稳态求解不可压缩带 MRF(多参考系 Multiple reference frame)的非牛顿流体湍流 ---->nonNewtonianIcoFoam 瞬态求解不可压缩非牛顿流体层流

---->pimpleDyMFoam PIMPLE 算法(PISO-SIMPLE 合并算法)瞬态求解不可压缩,动网格下的牛顿流体 ---->pimpleFoam 使用 PIMPLE 算法计算大时间步长瞬态不可压缩流 ---->pisoFoam 使用 PISO 算法瞬态求解不可压缩流 ---->porousSimpleFoam 用隐式或显式方法处理多孔介质,稳态求解不可压缩湍流 ---->shallowWaterFoam 瞬态求解带旋转的无粘浅水方程(http://en.wikipedia.org/wiki/Shallow_water_equations) ---->simpleFoam 使用 SIMPLE 算法稳态求解不可压缩湍流 ---->SRFsimpleFoam 稳态求解不可压缩非牛顿湍流旋转流 ---->windSimpleFoam 稳态求解不可压缩湍流,动量方程含有外部源项 3. Compressible flow ---->rhoCentralFoam 基于 Kurganov & Tadmor 中心迎风格式的可压缩流密度求解器 ---->rhoCentralDyMFoam rhoCentralFoam+DyM(动网格) ---->rhoPimpleFoam HVAC 或相似情况下的层流或湍流可压缩流动瞬态求解器 HVAC(暖通空调):http://en.wikipedia.org/wiki/HVAC ---->rhoPorousMRFLTSPimpleFoam 支持多孔介质及多重参考系的层流或湍流可压缩流 LTS 稳态求解器 ---->rhoPorousMRFSimpleFoam 支持多重参考系的显式或隐式多孔介质处理方法的可压缩 RANS 湍流稳态求解器 ---->rhoPorousMRFPimpleFoam 支持多重参考系及多孔介质的可压缩层流或湍流瞬态求解器 ---->rhoSimplecFoam 可压缩层流或 RANS 湍流 simplec 算法稳态求解器 ---->rhoSimpleFoam 可压缩层流或 RANS 湍流 simple 算法稳态求解器

---->sonicDyMFoam 支持动网格的层流或湍流可压缩跨音速/超音速气流瞬态求解器 ---->sonicFoam 层流或湍流可压缩跨音速/超音速气流瞬态求解器 ---->sonicLiquidFoam 层流或湍流可压缩跨音速/超音速液体流瞬态求解器 4. Multiphase flow ---->bubbleFoam 双组分不可压缩多相流求解器,其中一相是分散相,如液体中的气泡 ---->cavitatingFoam 基于可压缩液/汽混合物获得的均相平衡模型的瞬态空化代码 ---->compressibleInterFoam 采用 VOF 相分数界面捕捉方法求解 2 个等温混溶可压缩流体 ---->interFoam 采用 VOF 相分数界面捕捉方法求解 2 个等温混溶不可压缩流体 ---->interDyMFoam interFoam+DyM,包括自适应重划分网格的网格运动和网格拓扑变化 ---->interMixingFoam 3 个不可压缩流体,其中两个互溶,VOF 法捕捉界面 ---->interPhaseChangeFoam 带相变的 2 个不可压缩等温混溶流体,VOF 相分数界面捕捉方法 ---->LTSInterFoam LTS(Local time stepping,稳态)法求解 2 个不可压缩等温混溶流体,VOF 相分数界面捕捉方法 ---->MRFInterFoam 多重参考系下求解 2 个不可压缩等温混溶流体,VOF 相分数界面捕捉方法 ---->multiphaseInterFoam 计算 n 个不可压缩流的界面,包括各相的表面张力和接触角 ---->porousInterFoam 2 个不可压缩等温混溶流体,VOF 相分数界面捕捉方法,显式算法处理多孔区域 ---->settlingFoam 分散相沉积的 2 个不可压缩流的计算 ---->twoLiquidMixingFoam 两个不可压缩流的混合

---->twoPhaseEulerFoam Euler 法计算 2 个不可压缩流,一相为分散相,如液体中的气泡 5. Direct numerical simulation (DNS) ---->dnsFoam boxes 的各相同性湍流的直接数值模拟 6. Combustion ---->chemFoam 化学问题求解,单单元化学求解器,用于比较。类似 CHEMKIN ---->coldEngineFoam 内燃机的 cold-flow 求解 ---->dieselEngineFoam 柴油发动机的喷射和燃烧 ---->dieselFoam 柴油的喷雾和燃烧 ---->engineFoam 内燃机燃烧 ---->fireFoam 火焰和湍流扩散火焰的瞬态求解 ---->PDRFoam 可压缩预混/部分预混湍流燃烧模型求解 ---->reactingFoam 化学反应求解 ---->rhoReactingFoam 基于密度热力学求解器,求解化学反应 ---->XiFoam 求解可压缩预混/部分预混湍流模型的燃烧 7. Heat transfer and buoyancy-driven flows ---->buoyantBaffleSimpleFoam 稳态求解浮力,可压缩流体湍流,+隔热板 ---->buoyantBoussinesqPimpleFoam 瞬态求解浮力,不可压缩流湍流,Boussinesq+Pimple ---->buoyantBoussinesqSimpleFoam 稳态求解浮力,不可压缩流湍流,Boussinesq+Simple

---->buoyantPimpleFoam 瞬态可压缩流的湍流通风和传热 ---->buoyantSimpleFoam 稳态可压缩流的湍流 ---->buoyantSimpleRadiationFoam 稳态求解可压缩流,包括辐射,通风和传热 ---->chtMultiRegionFoam heatConductionFoam 和 buoyantFoam 组合,求解固液间的传热 8. Particle-tracking flows ---->coalChemistryFoam 瞬态,可压缩,湍流,煤和石灰石颗粒包裹注射,燃烧 ---->icoUncoupledKinematicParcelDyMFoam 瞬态,一个粒子的被动运输求解+DyM ---->icoUncoupledKinematicParcelFoam 瞬态,一个粒子的被动运输求解 ---->LTSReactingParcelFoam 稳态 LTS 求解可压缩、层流或湍流反应流及非反应流,多相 Lagrangian 包裹和多孔介质,包括质量、动量、 能量显式源项 ---->porousExplicitSourceReactingParcelFoam 瞬态 PISO 求解可压缩、层流或湍流与多孔介质的多相 Lagrangian 包裹反应,包括质量、动量、能量显式 源项 ---->reactingParcelFilmFoam 瞬态 PISO 求解可压缩、层流或湍流,Lagrangian 包裹和表面薄膜模型 ---->reactingParcelFoam 瞬态 PISO 求解可压缩、层流或湍流,Lagrangian 包裹 ---->uncoupledKinematicParcelFoam 瞬态,一个粒子的被动运输求解 9. Molecular dynamics methods ---->mdEquilibrationFoam 平衡和/或先决条件的分子动力学系统 ---->mdFoam 分子动力学求解流体动力学 10. Direct simulation Monte Carlo methods ---->dsmcFoam 3D 瞬态多相流直接 Monte Carlo 模拟

11. Electromagnetics ---->electrostaticFoam 求解静电 ---->magneticFoam 求解永久磁铁产生的磁场 ---->mhdFoam 磁流体动力学求解不可压缩导电层流在磁场下的作用 12. Stress analysis of solids ---->solidDisplacementFoam 瞬态分离有限体积法求解:固体的线弹性,小应变变形+热扩散和热应力 ---->solidEquilibriumDisplacementFoam 稳态分离有限体积法求解:固体的线弹性,小应变变形+热扩散和热应力 13. Finance ---->financialFoam 求解商品价格的 Black-Scholes 公式

2013/5/14 Are you ready for developping OpenFoam?Something important here now! OpenFOAM 的程序开发初步 一.OpenFOAM 应用的类型: 使用 OpenFOAM 进行 CFD 模拟的,大致可分为三种类型: 1)直接利用 OpenFOAM 的标准的求解器进行模拟,把 OpenFOAM 替代商业软件来使用,OpenFOAM 已基本具有这样的功能和人 二.气,与 Fuent,Star-CD 等相比较,OpenFOAM 显然具有更高的求解效率和灵活性。 2)用户自定义求解器,即利用 OpenFOAM 的基本类库,如 finiteVolume,OpenFOAM 库来按照自己的求解流程来编写针对某 三.类应用的求解器。用户需要开发的求解器就是类似于在 OpenFOAM 的 applications 中所看到的标准求解器 icoFOAM, 四.simpleFOAM 等。显然这一需求是非常大的,从 OpenFOAM 问世以来,已有很多用户定义了自己的求解器。这类需求的特 五.点是,并不需要特别关心,离散和求解的最底层的知识,如时间项离散,空间项离散等,关注的重点是求解的步骤或者 六.流程。在编程中,通常是顶层的求解流程的开发,在多数情况下可以不编译 OpenFOAM 的 finiteVolume 和 OpenFOAM 库 七.。这种顶层的求解器的开发,是我们以前常常忽略的,或者是以前没有能力做到的。需要指出的是,商业软件中的所 八.谓 udf,user subroutine 和这是不可相比的。 3)用户自己定义离散方法等。对于研究离散格式、代数求解器等人来说,更关注时间项 ddt,扩散项 Laplacian,对流 九.项 div 是如何离散的,能否有更高效更高精度的离散方法,这需要修改 finiteVolume 库和 OpenFOAM 库中对应的代码。 十.尤其是对流项,尽管 OpenFOAM 已经提供了基于 NVD 和 TVD 的模板和 40 多种有名的高阶高精度格式,但可以预见, 十一.这仍然是不够的,毕竟对流项的离散仍然是目前 CFD 的重点研究方向。 可以肯定的是,目前有很多人关注类型 2 的应用,毕竟将 OpenFOAM 当成 Fluent 或 Star-CCM 来使用,并不见得方便。 十二.但是将 OpenFOAM 作为类库来构建自己的求解器,这是其它软件无法实现的.

二.OpenFOAM 程序开发的基本知识 2.1OpenFOAM 的基本术语 重要的环境变量:

$WM_PROJECT_USER_DIR ―― OpenFOAM 的用户目录 $FOAM_TUTORIALS ------OpenFOAM 的算例目录 $ FOAM _SRC ------OpenFOAM 库的源程序目录 $ FOAM_APP ------ OpenFOAM 的求解器目录 $ FOAM_APPBIN ------- OpenFOAM 的求解器执行文件目录 $ FOAM_RUN ------用户的算例目录 重要的 shell: run = cd to $FOAM_RUN src = cd to $FOAM_SRC app = cd to $FOAM_APP util = cd to $FOAM_APP/utilities sol = cd to $FOAM_APP/solvers tut = cd to $FOAM_TUTORIALS 求解器的基本文件结构 appName 包含求解器源代码的目录 +appName.C 求解器主程序 +CreateFields.H 场变量的声明和初始化 +Make/ 编译指令 +files 编译需要的源程序文件和生成的目标文件 +options 编译选项,如链接库等 appName/appName.C 是求解器的主程序 appName/createFields.H 声明变量,并从文件中读入初值,如 p,物性。 appName/Make/files 所有源程序的名称,一个文件一行,最后一行是目标代码的名称和存放位 三.置,EXE=$(FOAM_USER_APPBIN)/appName appName/Make/options 设定查找头文件和库的路径,EXE_INCS,和需要链接的库 EXE_LIBS 算例的基本文件结构 case/ 算例目录 +0/ 包含初始和边界条件 +constant/ 包含初次读入后,不随时间变化的数据 +polyMesh/ 包含多面体网格数据 +transportProperties/ 包含物性数据 +system/ 包含计算控制和离散格式设定 +controlDict 包含计算控制,如时间步长等 +fvSchemes 包含离散格式设定 +fvSolutions 包含代数求解器或 SIMPLE,PISO 算法设定 具体而言 case/0 每个需求解的变量需要一个文件设定其初始边界条件 case/constant/polyMesh 网格数据,如 owner neighbour points faces boundary case/system/transportProperties 物性数据 case/system/controlDict 设定起始终止时间,时间步长,输出控制 case/system/fvSchemes 设定程序用到的每个微分算子的离散格式 case/system/fvSolution 为每个变量选择代数方程求解器/收敛精度及 PISO 等算法设定 三.OpenFOAM 程序开发的理论知识 作求解开发,必须能写出需要求解的控制方程及其定解条件,并且对于如何求解方程或方程组的步骤已经明确。 这些流体力学、传热学以及相关的理论是必需的,所谓连续介质力学中的数学模型,控制方程和定解条件就是表示它的 四.语言。 在这里是不可能说清楚的,这要看个人的功底了。

四 .OpenFOAM 程序开发的最简单的例子 下面采用 OpenFOAM 来开发一个用户自己的求解器。主要是利用 OpenFOAM 的标准求解器 icoFoam,用户不需要写任何代码 五.,只为为了熟悉 OpenFOAM 程序开发的环境和步骤。 步骤: 1) 将 icoFoam 目录拷贝到新的目录 可采用下面的 Linux 的命令实现: 到 OpenFOAM 的 incompressible 目录 cd applications/incompressible cp –r icoFoam myicoFoam 以上只是复制目录 icoFoam 到新的位置,并且新目录名为 myicoFoam cd myicoFoam 进入新的目录,查看一下,可以看到里面的文件和 icoFoam 中是否一样 2) 原文件改名,并且删除依赖文件 将 icoFoam.C 改名 myicoFoam.C mv icoFoam.C myicoFoam.C 删除依赖文件 rm icoFoam.dep 3) 修改编译文件 files 和 options 进入 Make 目录,打开 files 文件 将 icoFoam.C 源程序文件名 EXE = $(FOAM_APPBIN)/icoFoam 可执行文件名 修改为 myicoFoam.C 源程序文件名 EXE = $(FOAM_APPBIN)/myicoFoam 可执行文件名 此例中 options 不需修改,可以打开看看 EXE_INC = \ 头文件包含 -I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS = \ 链接库 -lfiniteVolume 4)删除原来的 obj 文件 rm –rf linuxGccDPOpt cd .. 5)编译 wmake 6) 检验一下 到 tutorial 目录,检验一下 myicoFoam . cavity 六.OpenFOAM 程序开发――例子一:在 icoFoam 中加入温度场求解 准备: 能量控制方程: dT/dt+div(den*U*T)=div(a gradT) 在壁面上给定值条件。 需要解决的问题:

a)如何创建标量场,T b) 如何创建物性,a c)如何定义温度方程,并求解 d) 如何在算例中设定 T 和 a e)如何设定 T 的离散格式 f)如何设定 T 的求解器的收敛标准等 步骤: 1)创建程序需要的新物性和新变量场 打开 myicoFoam.C 可以看到,程序开始运行时调用 CreateFields.H,创建变量场。 打开 CreateFields.H,可以看到程序首先从 transportProperties 文件中读入物性, Info<< "Reading transportProperties\n" << endl; IOdictionary transportProperties ( IOobject ( "transportProperties", 从字典文件 transportProperties 读入 runTime.constant(), //transportProperties 文件位于目录 runTime.constant()中 mesh, 网格对象 IOobject::MUST_READ, IOobject::NO_WRITE ) ); 创建了 Iodictionary 类型对象 transportProperties dimensionedScalar nu //首先读入粘性系数 ( transportProperties.lookup("nu") ); 创建有量纲标量 nu,nu 通过从字典 transportProperties 查找”nu”来赋值 可以加上新方程需要的物性 dimensionedScalar DT //首先读入热扩散率 ( transportProperties.lookup("DT") ); 创建有量纲标量 DT,DT 通过从字典 transportProperties 查找”DT”来赋值 此外还要从 createFields 中读入 p,U 场,我们要加入的新的变量场为温度场 T,最快的加入温度场的方法是拷贝 p 场 的代码,修改为 Info<< "Reading field T\n" << endl; volScalarField T ( IOobject ( "T", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh );

这样,创建了新的 vol 标量场 T,从文件 T 中读入。 对于 T 的创建具体解释如下: a)创建了标量场 T b)T 通过读(IOobject::MUST_READ)在 runTime.timeName()目录下名称为“T”的文件创建,在开始计算时,runTime. timeName()是 contorlDict 中设定的 startTime 值决定的。 c)T 将自动写入(IOobject::AUTO_WRITE)计算结果到 runTime.timeName()目录中,runTime.timeName()随迭代是变化的, 写入控制由 contorlDict 中设定。 d)T 是定义在 mesh 对象上的,这意味着 T 在内部 cell 上有值 internalField,在边界上还需要边界条件,这 与 polyMesh/boundary 中要一致。 2)在求解器中加入新的求解方程 下一步回到 myicoFoam.C 加入新的微分方程,由于温度场依赖于速度场,可放在 PISO 循环后面。 # include "continuityErrs.H" U -= rUA*fvc::grad(p); U.correctBoundaryConditions(); // Add the temperature equation fvScalarMatrix Teqn 温度是标量方程 ( fvm::ddt(T) + fvm::div(phi, T) 要用到界面流量 - fvm::laplacian(DT, T) 扩散项 ); TEqn.solve(); 求解

3)编译 wmake 4)在算例中加入新方程的初始和边界条件 4.1 拷贝一个 cavity 算例到 mycavity 4.2 修改 transportProperties 字典文件,设定 DT cd constant 修改 transportProperties 文件,前面已提到 DT 要从该字典文件读入。设定 DT=0.002m2/s DT DT [0 2 -1 0 0 0 0] 0.002; 4.3 修改 T 文件,设定初始值和边界 cd 0 进入 0 目录 拷贝一个 T 文件 cp p T 修改 T 文件为 FoamFile { version 2.0; format ascii; class object } volScalarField; T;

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions internalField movingWall { type value uniform } fixedWalls { type value uniform

[0 0 0 1 0 0 0]; uniform 300; 初始内部点为 300℃

fixedValue; 350.; 边界为 350℃

fixedValue; 300.; 边界为 300℃

5)修改离散格式和代数求解器求解控制文件 A 进入 system 目录 由于温度方程有非稳态项,对流项,扩散项,分别要在 ddt,div,laplacian 中设置 打开 fvSchemes 文件,添加 divSchemes { default none; div(phi,U) Gauss upwind; div(phi,T) Gauss upwind; } laplacianSchemes { default none; laplacian(nu,U) Gauss linear corrected; laplacian(DT,T) Gauss linear corrected; laplacian((1|A(U)),p) Gauss linear corrected; } 在 fvSolution 中设置代数求解器选项 T PBiCG { preconditioner DILU; tolerance 1e-06; relTol 0; }; 注意 T 方程形成的矩阵是非对称的,不要用 PCG 和 DIC 6)运行 myicoFoam . mycavity 七.OpenFOAM 程序开发――求解器的详细分析 1 进入 icoFoam 目录

可以看到 createFields.H icoFoam.C icoFoam.dep Make/ Make/为 wmake 编译所需的文件 IcoFoam.C 为主程序文件,它包含 createFields.H 编辑 icoFoam.C 可以看到 icoFoam.C 首先引入的头文件为 fvCFD.H。 所以你可以看到,在编译选项 options 中 EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude //fvCFD.H 的存放目录 EXE_LIBS = \ -lfiniteVolume

//需要链接的库

找到 fvCFD.H,编辑,可以看出这些是主程序必须的类库 #ifndef fvCFD_H #define fvCFD_H #include "parRun.H" #include #include #include #include #include #include #include #include #include #include #include "Time.H" 时间类 "fvMesh.H" 网格类 "fvc.H" fvc 类 "fvMatrices.H" fvMatrix 类 "fvm.H" fvm 类 "linear.H" "calculatedFvPatchFields.H" "fixedValueFvPatchFields.H" "adjustPhi.H" "findRefCell.H" "mathematicalConstants.H"

#include "OSspecific.H" #include "argList.H" #ifndef namespaceFoam #define namespaceFoam using namespace Foam; #endif #endif 再看看 icoFoam 的程序体,了解一下求解程序的结构 #include "fvCFD.H" ――――――――――――――――(头文件) 通常位于 main 函数前,是程序所需的类的定义 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) {

#

―――――――――――――――(包含文件) include "setRootCase.H"

# include "createTime.H" # include "createMesh.H" ―――――――――――包含文件通常是程序片断,如创建时间、创建网格等 ―――――――――――――――(求解器代码)―――――― # include "createFields.H" 需要根据应用,单独写的代码,如"createFields.H"和 Main,以及 Ueqn,pEqn 等 ――――――――――――――――――――――――――――――――――――― # include "initContinuityErrs.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 。。。。。 } 八.OpenFOAM 程序开发――求解器的详细分析 2 a.场变量的定义 引用前面的温度场 Info<< "Reading field T\n" << endl; volScalarField T ( IOobject ( "T", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ); 例如 volScalarField CO2 ( IOobject ( "CO2", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), mesh, // Optional declaration, this can be done by accessing a file in "case/0/",量纲可在文件中读 // dimensionedScalar("zero", dimensionSet(1,-1,-3,0,0,0,0), value) ); b.场变量的使用

场变量有定义在内部 cell 上的值,也有边界上的值 例如给组分限值 Example of a mass fraction limiter used in this project: // Initialize the variable Y_i for use in a loop scalarField& CO2Internal = CO2.internalField(); 引用内部点 // Loop for all mesh points 遍历内部点 forAll(CO2, celli) { // Limits the mass fraction to a positive number if (CO2Internal[celli] < 0.0) { CO2Internal[celli] = 0.0; } // Limits the mass fraction to max 1.0 if (CO2Internal[celli] > 1.0) { CO2Internal[celli] = 1.0; } } c.定义输运方程 OpenFOAM 定义方程时要选择一种类型的 fvMatrix,有 fvScalarMatrix 和 fvVectorMatrix 离散格式在 case/system/fvSchemes.中设定 // Define a ScalarMatrix as a object fvScalarMatrix CO2Eqn 定义系数矩阵 ( fvm::div(phi, CO2) 对流项离散 fvm::div - fvm::laplacian(turbulence->nuEff(),CO2) 扩散项离散 fvm::div == S_CO2 源项 ); // Apply underrelaxation to the equation // Under relaxation factors defined in file: fvSolution CO2Eqn.relax(); 松弛 CO2Eqn.solve(); 求解

2013 年 3 月 20 日 转载 snappyHexMesh Tutorial In order to use the automatic meshing tool snappyHexMesh, you have to create a raw background mesh. This can easily be achieved by using blockMesh of OpenFOAM. For this tutorial, I assume that you wish to compute the flow around a body, such as a ship’s hull. Create (or copy) the blockMeshDict in $CASE_DIR/constant/polyMesh. It is not necessary to create a fine background mesh, since it will be refined by snappyHexMesh.

Basic case directory setup For the execution of blockMesh, the case folder has to be set up correctly. This can either be seen in the User Guide or in lots of tutorials, such as icoFoam/cavity. For the icoFoam solver, an example case-directory can be seen in the screenshot. Goto your case-directory and execute blockMesh This creates the background mesh. One has to mention, that is is necessary to dimension it sufficiently, in order to fit the hull into that mesh and suppress numerical errors, caused by a way to small mesh. Assuming, that you’ve already exported your geometry as an STL-file, you’ve to copy that file to $CASE_DIR/constant/triSurface. For the following tutorial, I assume, that the filename is hull.stl.

Mesh created by blockMesh Create (or copy from a snappyHexMesh tutorial) the snappyHexMeshDict in $CASE_DIR/system and insert the standard header into that file: FoamFile { version format root case instance local class object } Now we can start with creating the necessary dictionaries. First of all, tell snappyHexMesh, what to do (in a global sense) castellatedMesh true; snap true;

2.0; ascii; ""; ""; ""; ""; dictionary; autoHexMeshDict;

addLayers true; Secondly, snappyHexMesh needs to know which geometry to use. You can simply add just one STL-file, or add add searchableBoxes etc. to this dictionary, if you either wish to create a geometry without an STL-file or you like to specify a region in your mesh, that should be refined specifically. Trying to map the wake field requires a specific refinement region. geometry { hull.stl { type triSurfaceMesh; name HULL; } }; Now we have to configure the settings for the mesh, generated by snappyHexMesh. This is done in the castellatedMeshControls sub-dictionary. Valid settings and options can be seen in the user-guide (table 5.8) or in the snappyHexMesh tutorials. An example for that sub-dictionary is the following castellatedMeshControls { maxLocalCells 10000000; maxGlobalCells 2000000; minRefinementCells 0; nCellsBetweenLevels 1; refinementSurfaces { HULL { level (4 5); } } resolveFeatureAngle 30; refinementRegions { HULL { mode distance; levels ((0.1 5) (0.4 4) (1 2)); } } locationInMesh (3.11 1.51 -1.1); }

Visualized levels of region refinement The most important part for a working mesh refinement are locationInMesh, which specifies a point inside the mesh generated by blockMesh, but not inside the geometry (in this case the hull). Secondly, the refinementSurfaces tells snappyHexMesh, which surfaces are the ones to be refined. The level tag defines minimum and maximum refinement level. The refinementRegions tag sets the levels of refinement in various distances to the body, this can be seen in the figure. It doesn’t matter, how much refinementRegions are defined, but the scheme is always the same. levels((maxDistance refinementLevel)...) After the specification of the general meshing and refinement parameters, it is essential to set up controls for the snapping process itself. (cp. [1] table 5.9) snapControls { nSmoothPatch 3; tolerance 4.0; nSolveIter 30; nRelaxIter 5; }

Patch name in an ASCII STL file The layer addition is controlled by the addLayersControls dictionary, whose options can be seen in table 5.10 of the user guide (cp. [1]). These options are skipped for this tutorial, and sample values can be found in the user guide as well. Nevertheless, the layers sub-directory is important to talk about. As stated in [1], it tells snappyHexMesh which patches “need” layers attached and the number of those layers. Since this is an mesh oriented option, not the surface geometry has to be specified, but the patch name. If you have an ASCII STL file, you can open simply open it with an texteditor of your choice and the word after solid is the patch name. In my case, this was OBJECT. addLayersControls { layers { HULL_OBJECT

{ nSurfaceLayers 1; } } } Finally, controlling the mesh’s quality is a crucial part of the whole meshing process. Thus snappyHexMesh provides a dictionary to control the quality, which is namely the meshQualityControls sub-dictionary. All options related to this can be found in table 5.11 in the user guide [1]. meshQualityControls{ //Insert your options here }

Model's position compared to the background mesh It is essential to get your model into the right position within your background mesh, created with blockMesh. You can easily check this by comparing both, the mesh and the model, with paraFoam or paraview. If you are on a linux machine, simply type paraFoam & your mesh by foamToVTK and then open paraview and your VTK file manually. After that, load your STL model into paraview/paraFoam as well. To simplify the orientation within the mesh, you should enable the option show cube axes for the mesh. If you have a symmetry plane, it is beneficial to highlight this as well. After that, the picture you get should be in a way similar to mine. Move the mesh until the model is inside and in its desired position. The coordinates are obtained from paraFoam/paraview and the axes shown in there. Moving the mesh is kind of easy transformPoints -translate "(x y z)" One has to state that the coordinates have to be specified in dashes as shown, otherwise the bash will skrew up on that command. Look again at the model’s position in the mesh. If it is not correct, move it again. Now it’s time to execute snappyHexMesh by moving to your case directory and execute snappyHexMesh // & to run paraFoam in background If you calculate on a linux machine and do the postprocessing on e.g. a mac, you have to convert

After having run the meshing without any errors, three new timestep folders appear in your case directory. The naming differs, depending on your deltaT in your system/controlDict, but always reflects the first three timesteps. Opening the case using paraFoam gives a good nice understanding, how snappyHexMeshworks. The first timestep (folder 0) shows the background mesh, without any refinements. Timestep 1 shows the refined mesh as well as no faces, that are “snapped” to the geometry. The final result is provided by timestep 2. timestep 1: Refined mesh, but n o snapped faces

timestep 0: simply the background mesh If running the solver, the improved mesh will not be used, because the old mesh is still written in constant/polyMesh. Hence the folder "lastTimeStep"/polyMesh has to be copied to constant/polyMesh. Run your solver

2013 年 3 月 20 日 转贴:OpenFOAM 中的参数字典使用剖析 对于模型参数 OpenFOAM 采用了参数字典 dictionary 来由用户指定,参数字典的使用,对参数设置及其新模型 的 OpenFOAM 扩充至关重要。本文从参数字典类对象构建,字典文件设置,字典查询对参数字典类的使用进行详解。 (1)字典构建 对字典类对象构建通常采用如下形式 IOdictionary ObjectName ( IOobject ( "dictionaryFileName", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); 其中:ObjectName 和“dictionaryFileName”换成你要构建对象名字和字典文件名字。 (2)字典文件设置 典型参数类型设置方法: scalar,label,word 类型: 关键字 值; 如参数 C1 的值为 0.1,则可设置为 C1 0.1;

带有单位的类型 dimensionedScalar(带有单位的标量) 关键字 创建的参数名字参数单位 值; 如 黏性设置 nu nu [0 2 -1 0 0 0 0] 5.952e-06; 加速度矢量 g g [0 1 -2 0 0 0 0] (0 0 0); 字典可以分组,成为子字典(subDict) 如大涡一方程模型参数设置 oneEqEddyCoeffs//子字典名字 { ck 0.07; //参数 ce 1.05; //参数 } 子字典还可以有子字典以此类推。 (3)字典的查询 通过字典文件设定参数以便在程序中使用。 label,scalar 类型查询 比如查询 ObjectName 字典中参数 C1 的值,将其值付给变量 Vc1,; scalar Vc1(readScalar(ObjectName.lookup("C1")); 查询带单位的量,比如查询黏性 dimensionedScalar nu(ObjectName.lookup("nu")); 查询加速度 dimensionedVector g(ObjectName.lookup("g")); 注意对于基本类型 label 或者 scalar 需要使用 readLabel 或者 readScalar 两个函数,而对于带单位的量直 接查询就可以了。 子字典查询 如查询 oneEqEddyCoeffs 下的 ck dimensionedScalar ck(readScalar(ObjectName.subDict("oneEqEddyCoeffs").lookup("ck"))); 如果子字典还有子字典,则连续使用 subDict。 转自 OpenFOAM 研究:http://blog.sina.com.cn/openfoamresearch

2013 年 3 月 19 日 [转载]商业软件划分的网格向 OpenFOAM 转换应注意的问题 openfoam 自己带有网格划分功能 blockMesh 和 snapHexMesh.前者可以生成块结构化网格,后者则基于表面网格 文件(stl 格式)自动生成复杂的网格。她还带有商业软件网格转换功能,如 fluentMeshToFoam 等,所有的网格转 换器源文件在文件夹 applications/utilities/mesh/conversion 中。 总体而言运用商业软件网格的转换 openfoam 可识别的网格时候,应当注意以下几个问题 (1)几何尺寸 几乎所有的商业软件划分的网格是没有单位的,而 OpenFOAM 的网格是具有单位(其单位 m),因此在划分网格的时候 应当完全按照国际单位制划分网格。如果在事先没有注意到这一点,不用着急,后面还有补救方法。 (2)边界条件 几乎所有的商业软件都支持边界条件的设定,然而在这些软件定义的边界条件 openfoam 未必认识,这时候转换器会

将其定义为 wall 类型。不要随意定义边界类型,因为一个不同的边界类型可能对网格进行的限制,如你在 gridgen 中定 义了周期边界,导出的网格是无法为 openfoam 认识的,一种比较好的就是将起定义为 wall 类型。 如果商业软件允许你对边界条件进行命名的话,一个比较好的名字,可以解决转换后网格边界条件无法识别的问题。但是 有的商业软件(gridgen)边界名字是根据边界类型生成的。要是定义多个边界都为 wall 的话并导出 fluent 格式,并 转换为 openfoam 时候,相同类型的边界会命名为 wall-1,wall-2,不醒目,你设置类型的时候都不知道那个是那个 ,我通常采用自定义边界类型,然后输出 fluent 格式,并转换为 openfoam 格式。 当成功的划分网格并转换成 openfoam 可支持的转换格式后,就可以对网格进行转换了。 (3)网格转换 将划分后的 mesh 拷贝到你的 case 文件夹中,然后运用如下命令进行网格转换 转换器名字 网格文件 [-scale scale factor] 比如:fluentMeshToFoam 001.cas -scale 0.01 前面 fluentMeshToFoam 为转换器,001.cas 为网格文件,-scale 用来指定你要划分的网格放大多少倍,用来处理你 划分网格的时候没有注意到的单位问题,上面的 0.01 是将网格缩小 100 倍。 (4)修改物理边界名字和边界类型。 所有不识别的边界类型,他们都会认为是 wall 类型。修改边界名字,应当到 case 文件夹中 constant/polyMesh 中的 boundary 文件修改。里面有边界的名字,和边界 type,指定为你要的类型,比如 patch,wall 等,这里指定的 是物理边界。 (5)设定数值边界类型 进入初始化文件夹 0 文件中各个场文件进行 boundaryField 设定相应的数值边界条件。数值边界的名字要和物理边 界的名字对应,对顺序没有要求。 现在 check 一下你的 mesh 了。 利用 checkMesh 对网格进行一下 check 或者利用 paraFoam 看看你导入的网格。 转自 OpenFOAM 研究:http://blog.sina.com.cn/openfoamresearch

2013 年 3 月 14 日 mesh grading 之后,还需要修改 time 和 time step,根据条件,The highest velocities and smallest cells are next to the lid, therefore the highest Courant number will be generated next to the lid.

2013 年 1 月 8 日 OpenFoam 的学习总结(转贴) OpenFoam 与 Fluent,Star-CD 等相比较,具有更高的求解效率与灵活性,并且可以根据用户的需要自己构建求解 器和定义相应的离散方法。 一、 1、 实例操作篇 例子的结构

2、 求解实例的步骤: 1) 导入网格。将 Fluent 中生成的网格文件.msh 导入到 OpenFoam 中需要执行 fluentMeshToFoam 命令。通过该命

令导入的网格由于软件转换的不足,需要使用者在执行前检查导入网格的边界条件是否正确,只有在网格边界条 件正确的情况下才能执行计算命令。 2) 3) 4) 5) 检查网格。命令为 checkMesh 设置相应的物性参数,如在 case1/constant/transportProperties 路径下设定运动粘度(nu)。 设定初始条件,如在 case1/0/p 路径下设定初始状态下的压力场。 对计算时间和输入/输出数据的控制。如在 case1/system/controlDict 路径下设定相应的起始/终止时间,

一定的时间步,输出的格式或精度,输出的时间间隔等。 6) 设定各个求解量的离散格式,如在 case1/system/fvSchemes 路径下设定时间的离散格式为欧拉格式, 7) 即:ddtSchemes {default Euler}。 7) 设定求解器,求解方法,以及松弛因子等,如在 case1/system/fvSolution 路径下设定求解方法为 PISO 方法。

8) 9)

执行求解命令,如 icoFaom –case case1。 导出数据。如果导出网格数据用 foamMeshToFluent 命令,如果导出计算结果数据用 foamDataToFluent 命令。

10) 用 Fluent 等软件查看计算结果。 3、并行求解实例 1)在需要并行求解的例子目录下面创建 decomposeParDict 文件,对其中包含的内容进行设置。 注:在 decomposeParDict 文件中包含的内容有:需要的并行处理器的个数;分割数据的方法,包括 simple( 按照 xyz 的顺序,对各个方向的分块数进行设定),hierarchical(对各个方向的分块数进行设定,各方向 的顺序可以更改),metis(按照各个处理器需要分配的比重进行分配),manual(手动进行人工分配,需包含分 配的文件);分散后的数据是否需要分配在不同的磁盘,如果需要则应该写明分配磁盘的路径。 2)执行分散命令,如 decomposePar –case case1 3)执行并行运算命令,其格式为:mpirun --hostfile <machines> -np <nProcs> <foamExec> <otherArgs> -parallel > log & 4)对计算后的结果进行重组,如 reconstructPar –case case1 4、controDict 文件中各个选项包含的内容: controlDict Time control startFrom (控制计算的开始时 间) firstTime 所有时间目录中最早的时间步

startTime latestTime stopAt (控制计算结束的时 间) endTime writeNow noWriteNow nextWrite deltaT Data writing writeControl (控制输出文件的时 间) 计算的时间步 timeStep

startFrom startTime 连用表示计算开始的时间 所有时间目录中最近的时间步 stopAt endTime 连用表示就算的结束时间 当前时间步完成时结束计算并且写数据 当前时间步完成时结束计算但不写数据 按计划的下一个时间步完成时结束计算

每个写的时间间隔(writeInterval)需要的时间 步

runTime adjustableRunT ime cpuTime

每个写的时间间隔(writeInterval)需要的时间 用在时间步是自动调节的情况下的每个写的时间 间隔(writeInterval)需要的时间 每个写的时间间隔(writeInterval)需要花费的 CPU 时间

clockTime

每个写的时间间隔(writeInterval)需要的真 实时间

writeInterval purgeWrite writeFormat (输出数据的格式)

和 writeControl 连用标量,表示写的间隔 用整数来表示对时间目录数量进行限制 ascii 十进制形式

binary writePrecision writeCompression (定义 数据文件的是否压 缩)

二进制形式

与 writeFormat 连用,用整数表示输出的精度 uncompressed 输出的数据不进行压缩

compressed timeFormat (选择 时间目录的名字的 格式) fixed

输出的数据进行压缩 ±m.dddddd

scientific general timePrecision graphFormat (采用 一种软件输出图形 数据)

±m.dddddd±xx

指数在-4

与 timeFormat 连用,用整数表示时间的精度 raw 原 ASCII 格式列

gnuplot xmgr jplot Dat reading runTimeModifiable yes (OpenFoam 是否是在每个时 间步的开始读入各个目录) no Run-time loadable functionality libs

数据采用 gunplot 格式 数据采用 Grace/xmgr 格式 数据采用 jPlot 格式 OpenFoam 在每个时间步的开始读入各个目录

OpenFoam 不是在每个时间步的开始读入各个目录

增加的库的列表在运行时间开始下载

functions

函数的列表在运行时间开始下载

5、fvShemes 中包含的内容:

vSchemes interpolationSchemes 的点对点的差值) (值 Centred schemes linear cubicCorrection midPiont Upwinded convection schemes upwind linearUpwind skewLinear QUICK TVD schemes limitedLinear vanLeer MUSCL limitedCubic NVD shemes SFCD Gamma∮ snGradSchemes (网格 法向梯度项的离散格式) corrected uncorrected limited∮ bounded fourth gradSchemes 度的离散格式) (梯 Gauss <interpolationScheme> leastSquares fourth limited<gradScheme> laplacianSchemes 拉斯算子的离散格式) (拉普 Gauss <interpolationScheme> <snGradScheme> Gauss <interpolationScheme> corrected

Gauss <interpolationScheme> uncorrected

Gauss <interpolationScheme> limited∮

Gauss <interpolationScheme> bounded

Gauss <interpolationScheme> fourth

divShcemes 的离散格式)

(散度

Gauss <interpolationScheme>

Gauss linear Gauss skewLinear Gauss cubicCorrected

Gauss upwind Gauss linearUpwind Gauss QUICK Gauss TVD schemes Gauss SFCD Gauss NVD schemes

二、

创建求解器

1、求解器的结构 newApp 为求解器的名称,它是包含求解器源代码的目录;appApp.C 求解器的主程序;otherHeader.H 为所包含的头文件, 达到声明变量,从文件中读入初值的目的,例如包含的 CreateFields.H 头文件表示场变量的声明和初始化;Make 为 编译指令,它下面包含的 files 包括编译需要的源程序的文件名和生成的目标文件的绝对路径,options 包括编译选项,设 定链接头文件和库的绝对路径(EXE_INC 和 EXE_LIBS)。 2、使用现有的求解器 对已经存在的求解器,如 OpenFoam 自带的标准求解器,在执行该求解器时应在相应的路径下输入该求解器的名字或输入 该求解器的名字和相应的路径,如:执行 icoFoam 求解器,则相应的输入命令 icoFoam –case case1。 3、创建新的求解器 1)使新创建的求解器包含求解器结构中的所有项(可以从已经存在的求解器中复制得到)。 如:copy –r icoFoam myIcoFoam 2)更改相应的内容。更改求解器的名称,如:mv icoFoam myIcoFoam;更改主程序的名称, 3)如:mv icoFoam.C myIcoFoam.C,同时更改 myIcoFoam.C 文件内的内容,如增加需要求解的方程;增加或删除相应的头 4)文件,同时更改头文件中的内容以满足需求,如在 CreatFields.H 这个头文件中增加需要读入的初值。 3)如果新求解器的内容最初是从别的求解器复制而来,就必须执行 wclean 命令,从而删除原求解器中的依靠文件, 4)即扩展名为.dep 的文件,以便之后新的求解器的编译。 4)更改 Make/files 和 Make/options 中的内容。对于 Make/files 要将求解器的名称改为新的求解器的名称,目 5)标文件的绝对路径要改为新的求解器的绝对路径。如(红色为需要更改的部分): myIcoFoam.C EXE = $(FOAM_USER_APPBIN)/myIcoFoam 对于 Make/options,如果又增加或删除相应的头文件或库,则在此文件中增加或删除相应的头文件或库的链接路径。 如: EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS = \ -lfiniteVolume 5)在更改 Make/files 和 Make/options 文件中的内容后,再次执行 wclean 命令,删除原求解器中的相对路径文件 6)编译新创建的求解器,即在新创建的求解器目录下执行 wmake 命令 7)测试新创建的求解器是否可以正常执行,运行一个例子进行验证。如;myIcaoFoam –case case1。

2013 年 1 月 8 日 [转贴]OpenFOAM 不可压缩流边界条件的设定 边界条件是设定正确与否是决定计算成功与否的关键因素。边界条件有物理边界条件和数值边界条件之分。 物理边界条件是根据某种物理现象而对速度和压力必须满足某种数值行为而定义的边界条件,比如 fluent 中 的 pressureOutletorvelocityinlet 等。此类边界条件是软件公司为了减少用户的逐个对每个变量进行设定而引起麻 烦而定义的一种数值边界条件集合。比如 fluent 中 pressureOutlet 边界条件为该边界压力指定,其他变量梯度为 0,这 样设定,给用户带来了很多方便,但同时限制了用户的选择性。比如我想在压力边界上设定某个标量为指定值,这就很难 在 fluent 中办到。openfoam 中的 foamX 也为大家定义了一些物理边界条件,比如 wall,atmosphere 等。我很少 用 foamX,因为使用起来比较麻烦,不如直接对文件进行编辑。这也是在本站博文中没有对 foamX 进行介绍的一个原因。 数值边界条件:就是我们经常所说的第一类边界条件(定值边界)和第二类边界条件(梯度边界)。在 openfoam 的初 始化文件中就需要指定边界条件就是这种数值边界条件。不像 fluent 那样,在用 gambit 画几何时候指定的边界条件可 以是 fluent 中的物理边界条件。而 openfoam 中画网格的时候,需要指定相应的几何边界,也就是基本边界类 型:patch:基本边界,symmetryPlane 对称板,empty:空边界,用于二维流动,wedge:用于轴对称模拟,cyclic:循 环边界,wall:墙边界(主要运用湍流流动的壁面函数),inter-processor:处理器边界。除了几何上有特殊性的边界 ,如墙,对称轴,循环边界,空边界,周期边界,wedge 性边界,其他所有的边界都指定为 patch。 边界条件指定: 在 openfoam 的初始化文件中(0 文件夹中的文件),boundaryField 下面的东西用于指定边界条件。 《1》压力-速度 对于不可压缩流动边界而言,知道了压力就可以求出速度,知道了速度就可以求解出压力,在指定的边界条件的时候压 力速度必须耦合。也就是说,压力和速度不能同时为第一类或者同时为第二类边界。换句话说是压力指定,速度必须是由 程序算出来的,速度指定,压力必须是算出来的。这是针对不可压缩流动而言,速度和压力相互制约,如果由其他变量影响 速度和压力,比如浮力驱动流动,压力速度受温度的影响,这种除外。 《2》其他标量 对速度没有影响的其他标量的边界条件,所有的边界不能同时为第二类边界,这样会造成全场的均匀,但压力可以所有都 为第二类边界,因为他受速度的影响。 转自 OpenFOAM 研究:http://blog.sina.com.cn/openfoamresearch

2013 年 1 月 6 日 Viewing the mesh The mesh is viewed in paraFoam, the post-processing tool supplied with OpenFOAM. T he paraFoam post-processing is started by typing in the terminal from within the case directory paraFoam Alternatively, it can be launched from another directory location with an optional-case argument giving the case directory, e.g.

paraFoam -case $FOAM_RUN/tutorials/incompressible/icoFoam/cavity

2013 年 1 月 5 日 openfoam 的 userguide 写的太好了。面向对象的清晰结构和成熟完整的 userguide,目前的感觉是入门比 overture 容易。

2013 年 1 月 4 日 第一个例子:cavity mkdir -p $FOAM_RUN cp -r $FOAM_TUTORIALS $FOAM_RUN cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavity blockMesh icoFoam paraFoam

面向对象的架构: pre-processing

Mesh generation:The mesh generator supplied with OpenFOAM, blockMesh, generates meshes from a description specified in an input dictionary, blockMeshDict located in the constant/polyMesh directory for a given case. The mesh is generated by running blockMesh on this blockMeshDict file. From within the case directory, this is done, simply by typing in the terminal: blockMesh /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile {

version format class object

2.0; ascii; dictionary; blockMeshDict;

} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // convertToMeters 0.1;坐标缩放比例系数 vertices 顶点坐标 ( (0 0 0)编号 0 的顶点 (1 0 0) (1 1 0) (0 1 0) (0 0 0.1) (1 0 0.1) (1 1 0.1) (0 1 0.1) ); blocks 由指定的顶点构成区域 ( xyz 三个方向的网格数 hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1) 0 到 7 号顶点构成区域 等间隔分割网格 ); edges ( ); boundary 边界的设定 ( movingWall 名称是 movingwall 的避免 { type wall; faces ( (3 7 6 2)顶点 3、7、6、2 构成的面,遵循右手定则,逆时针向外 ); } fixedWalls 名称为 fixedwalls 的壁面 { type wall; faces ( (0 4 7 3) (2 6 5 1)

(1 5 4 0) ); } frontAndBack 2D 问题用 3D 网格处理时,前后边界面的设定 { type empty; faces ( (0 3 2 1) (4 5 6 7) ); } ); mergePatchPairs ( ); // ************************************************************************* //

Boundary and initial conditions Once the mesh generation is complete, the user can look at this initial fields set up for this case. The case is set up to start at time t = 0 s, so the initial field data is stored in a 0 sub-directory of the cavity directory. The 0 sub-directory contains 2 files, p and U, one for each of the pressure (p ) and velocity (U ) fields whose initial values and boundary conditions must be set. Let us examine file p:

/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class volScalarField; object p; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 2 -2 0 0 0 0]; kg(kilogram),m(metre),s(second),K(kelvin),kgmol(kilogram-mole),

A(ampere),cd(candedla),in this case,it is internalField uniform 0; boundaryField { movingWall { type } fixedWalls { type } frontAndBack { type } }

.

zeroGradient;

zeroGradient;

empty;

// ************************************************************************* //

physical properties The physical properties for the case are stored in dictionaries whose names are given the suffix ? Properties, located in the Dictionaries directory tree. For an icoFoam case, the only property that must Be specified is the kinematic viscosity which is stored from the transportProperties dictionary. The user can check that the kinematic viscosity is set correctly by opening the transportProperties dictionary to view/edit its entries.

/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii;

class location object

dictionary; "constant"; transportProperties;

} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // nu nu [ 0 2 -1 0 0 0 0 ] 0.01;

// ************************************************************************* //

control Input data relating to the control of time and reading and writing of the solution data are read in from the controlDict dictionary. The user should view this file; as a case control file, it is located in the system directory. /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // application startFrom startTime stopAt endTime deltaT icoFoam; startTime; 0; endTime; 0.5; 0.005;

writeControl writeInterval purgeWrite writeFormat writePrecision

timeStep; 20; 0; ascii; 6;

writeCompression off; timeFormat timePrecision general; 6;

runTimeModifiable true;

// ************************************************************************* //

solving post-processing cavity: 文件夹 0:起始条件、边界条件 文件 p:压力的起始条件、边界条件 文件 U:速度的起始条件、边界条件 文件夹 0.1:各个时段结果 文件夹 0.2 文件夹 0.3 文件夹 0.4 文件夹 0.5 文件夹 constant: 文件夹 polyMesh 文件 blockMeshDict 文件 transportProperties 文件夹 system: 文件 controlDict


相关文章:
Unsteady boundary conditions in openFOAM
Unsteady boundary conditions in openFOAM_电力/水利_工程科技_专业资料。openfoam边界条件Unsteady boundary conditions in openFOAM By Alberto On August 15, ...
nonreflection boundary conditions
nonreflection boundary conditions_物理_自然科学_专业资料。无反射边界条件数值... ofile.open(ch1,ios::out); if(!ofile) { cout<<"can't open!"<<...
OpenFOAM Tutorial Standard Solvers
OpenFOAM Tutorial Standard Solvers boundaryFoam ======== Steady-state solver for 1D turbulent flow, typically to generate boundary layer conditions at an...
外文翻译
3.2.1 the relation between Gs and the boundary conditions In Fig.2, ? ? ? ? 1.0 ,the street’s exit boundary is fully open and the entrance ...
OpenFOAM的程序开发初步
cavity OpenFOAM 的程序开发初步 六.OpenFOAM 程序开发――例子一:在 icoFoam ...(p); U.correctBoundaryConditions(); // Add the temperature equation fv...
拉普拉斯变换法在非稳态导热中的应用
The methods and steps of Laplace transform applications in solving unsteady state heat condition problem is presented. Furthermore,boundary conditions for the ...
过约束ErrNodeBCInactiveDof
1 nodes have inactive dof on which boundary conditions are specified. The nodes have been identified in node set ErrNodeBCInactiveDof. 2 1 nodes have ...
ABAQUS常见问题
(continuum) elements 128 nides have dof on which incorrect boundary conditions may 9 nodes have dof on which incorrect boundary conditions may have been ...
deform边界条件说明
Contact boundary conditions are generated under the InterObject , Contact Boundary Conditions. It is for this reason that the user should be VERY careful ...
叠模法计算船体阻力Fluent参数设置步骤
6、Define → Models → Solver →在 Time 栏中点击 Unsteady(非定常) → ...10、Define → Boundary Conditions (边界条件设置) → (1) fluid → Set →...
更多相关标签:
boundary conditions | open boundary | comsol open boundary | openfoam | openfoam安装 | openfoam windows | openfoam官网 | openfoamwiki |