1、开源计算力学软件开源计算力学软件OpenFOAM讲座讲座OpenFOAM的结构和能力的结构和能力南京工业大学城市建设与安全工程学院OpenFOAM研讨小组研讨小组QQ群号码:127471850殷亮2010.12.18于南京本讲稿的内容参考了Hrvoje Jasak的演讲内容,版权OpenFOAM研讨小组,遵守GPL协议,归可自由的复制和拷贝。1、OpenFOAM介绍 OpenFOAM:面向对象的计算力学数值模拟库 对偏微分方程算子实施有限体积离散(积分形式)故最多处理二阶方程(传递方程适用)使用非结构化网格(但精度与网格相关性较大)以类封装的形式提供离散和数值算法(最大优点)有效的进行大规模并
2、行化计算,并且在很多平台可以移植和调试(底层并行化实施)同时提供:自动网格运动 网格拓扑改变:体单元的层化,滑动界面(ggi)及其它 拉格朗日粒子追踪及喷射 有限元离散及有限面积离散(ext版本)工具类库:ODE求解器、热物理属性、CHEMKIN界面OpenFOAM是什么是什么1.1、OpenFOAM历史 上世纪90年代掀起的C+及面向对象编程(主要解决软件危机)OpenFOAM与英国帝国大学Gosman 的小组和热流体分部相关联(Spalding、帕帕坦卡S.V.Patankar的研究相关,PHOENICS与STAR-CD-非结构网格)初始类来自于Charlie Hill(1993)的博士论
3、文 数值工作来自于1993年Henry Weller和Hrvoje Jasak(两个版本)1、OpenFOAM背景2开发与应用 OpenFOAM 的的PhD项目包括:数值分析、误差估计、网格自适应、RANS、LES湍流模型、自由液面、多相流等等 材料力学:非线性结构分析(如何分量解耦)、接触弹塑性、流固耦合 在Chalmers大学的Diesel喷射模型 瑞士军方应用(水动力)多所大学贡献:Imperial College:Poly Milano,Chalmers University,University of Zagreb,Croatia,University College Dublin,
4、Kings College London等 在cfd-online上其活跃程度与FLUENT相当3、版本发展 在2000年,FOAM作为Nabla公司的商业版本 与Fluent公司进行策略合作:为下一代CFD软件进行软件设计(Hrvoje Jasak)自2002年提供了大学免费版本 满足复杂要求的高端客户 在2004年10月提供公共域版本支持4、OpenFOAM和C+OpenFOAM基于坚实而彻底的C+开发 OpenFOAM实施要早于C+的稳定版本的推出,故其并未用标准库,但其类库也随语言而进化 其核心代码不断的重写或提炼:清除冗余代码、使用新的语言知识和程序理念 其代表了在面向对象、模块化、
5、代码重用方面的经典案例,值得研读。5、OpenFOAM完成了以下的创新 多面体网格支持 新的自由液面算法 Halo-free并行化(无ghost)自动多面体(任意)网格求解器 新方法进行拓扑网格变化 通过实时选择表进行用户定制1.2设计理念 用户修改要预先定义 模型与模型作用的矩阵过于复杂 难于开发、维护及支持 缺少支持层:不同相关性的代码混合在一起难以区分 开发与维护需要大的团队 即使小的改变也需要专业的知识 化很长时间才能变得专业 封闭的框架,对用户而言存在代码重用性问题 单一的开发使得需要单一的测试1曾经主流的设计特点 有利于新模型的实现 无介入的分层开发 便利的代码重用及模块化 能应用
6、于超出流体流动的更多应用 在不改变已有组件的条件下实现代码的开发和定制化 如下例2、新的理念软件中方程的表达为 solve (fvm:ddt(k)+fvm:div(phi,k)-fvm:laplacian(nu()+nut,k)=nut*magSqr(symm(fvc:grad(U)-fvm:Sp(epsilon/k,k);3、分层实现 软件中不同的功能层 张量代数 场代数 场的映射和差分 不同类型的离散 有限体积方法 有限元 网格处理、网格运动、拓扑改变 差分格式 拉格朗日追踪 边界条件定制化 线性方程组求解技术 分离的物理模型 应用程序的定制 流体流动、传热 燃烧、湍流、喷射 电磁学 其它
7、 模型组合:流固耦合 各层可以独立开发,同时又相互依赖。4、用户考虑因素 功能能交换,考虑使用同一界面,使用实时选择表 功能块可选 用户定制:线性方程求解、梯度计算、对流差分格式 开源高层代码共享 自动优化:内存和执行分支1.3、使用 面向问题的求解器框架 通用的CFD软件包不可能预先知道并满足求解器需求 不能写出完全通用的求解器 取而代之的是数值库及实施代码重用 通过重用提供基本工具直至需求满足 如果重用很难,继续分解代码,并重写代码 伴随着高层应用的工具开发 求解器的编写及优化 所有这些,使得要检查建立求解器必要的部件,再检查能否用在其它处(重用性)。2、主要的对象及相互关系 从面向对象的
8、观点,在于识别对和它们所需提供的功能。2.1 元类及容器类其封装了label,scalar,bool,string,complex1、元类2、容器类(内存管理问题)OpenFOAM写在STL之前,所以有自己的容器类 容器类对代码的优化相当重要,需要紧密的控制 所有的容器类都以内容类型作为模板具体实现 Lists:数组容器 List:提供序列存储的容器,类似于数组,为数值求解的主要容器,将其视为对单一内存的封装 SubList:对List的片段抽取(基于效率考虑)DynamicList:具有动态长度的List Linked List:动态数组 SLList:单链 DLList:双链 Hash T
9、ables HashTable HashSet:无内容 指针物体的容器:List被创建时,默认为无参构造函数,但有些对象没有无参构造,或不能被拷贝,则要使用指针列代替对指针列需要附带操作:哪一个元素已经被设置了在列的构析函数执行中,谁负责删除指针PtrList存储指针的容器 字典(Dictionary)处理数据的输入和输出关键字-值对的嵌入次序无关,用分号隔开允许嵌入表:表的表 处理数据的输入和输出Ioobject封装了隐式对象注册管理(树形结构)所有的物体都应该从一个文件读或写IOobject由名字、类名、路径、对注册对象objectRegistry的应用、决定储存状态的参数来创建:MUST
10、_READ、READ_IF_PRESENT、NO_READ、AUTO_WRITE、NO_WRITE objectRegistry管理者读写请求2.2、空间和时间的描述 1空间的描述 空间为基本的计算网格。其主旨为网格独立于离散,应该满足合法的网格需求网格元 点 边(两点)面(点列)体(面列)提供体网格的识别,主要可以实现网格转化及后处理多面体网格 点列 面列 体列 边界网格(元面网格列)要保证有序 元网格和元面网格 此两类提供了网格特拓扑和几何信息 几何 体中心 面中心 体体积 面面积 边界长 拓扑信息 围绕体的面 体-体 点-面 支持网格运动,拓扑改变2时间描述 控制时间和迭代次数 控制数据
11、库读写 Time类为顶层类 时间记录 起始时间 结束时间 时间步长 CPU时间 经历时间 处理物体注册功能 I/O注册 Root和case路径 读写控制、格式及精度2.3、张量运算1、张量基础 矢量和张量的运算 采用笛卡尔坐标描述 采用自动的扩展到n阶的张量运算,三维,现为二阶 使用模板2、实施 模板的使用,可以拓展到complex VectorSpace解决通用性 类型的自动演绎(typname功能)运算符重载 分量采用枚举类,不用列举多个函数名 包含维数和阶数信息2.4 场及场的代数1.场对象张量列+运算的再实施场的场2.边界条件:面网格场 不光是数,包含了行为信息,如本值和梯度值 实时读
12、取 虚界面虚函数界面继承与面网格场类可定制与特性和功能相关,与并行3.单位 单位一致可运算 单位检查 自动单位运算(嵌于场)4、几何场必要条件 值和边界条件 网格 值在几何下的关系 内部场和边界场分离如此 对mesh的引用 内场 边界场-场的场:含边界几何、访问内场、边界条件由于面场为离散服务,模板处理不同类型单位几何场为一完整的独立单元 为其注册入数据库 继承于IOobject,读写处理3、矩阵支持lduMatrix类 矢量稀疏矩阵 对角线,上三角和下三角分别存储 lduAddressing类地址索引1、稀疏矩阵具有基本的矩阵代数 M+M S*M 低松弛因子 矩阵矢量乘矩阵结构的识别和求解器
13、的选择 只有对角线 对称性矩阵 非对称性矩阵2、线性方程求解器 继承于lduMatrix:solver 实施了迭代求解器ICCGBi-CGAMG 通过C指针优化 并行化通过lduCoupledInterface类,升级矩阵矢量乘3、有限体积矩阵 对矢量和张量采用分离求解 储存b 处理边界条件 实施FV相关的操作 H()4、偏微分方程表达高层机制 网格代表空间 时间代表进展和迭代 带有单位和边界条件的几何场 微积分类 矩阵支持、储存及吸收处理 线性方程求解器 方法类,转化算子为矩阵处理方程 方程离散现在能通过算子的复合操作 最终体现为对矩阵的贡献 单位检查,单元离散,网格支持,并行化都在底层完成
14、,与方程看似无关 离散受表控制 如此,其能解决一大类计算力学问题。5、物理模型 当前的机理足够写出复杂的物理模型 但不方便,如湍流模型等使流动求解器复杂化 模型可实时选择 不是写大通用的湍流问题可执行程序 而是要分装这些模型1、方程表达2、物理模型相互作用数值模拟软件的复杂性多数在于模型与模型的相互作用如:动量方程和湍流模型 动量方程需要雷诺应力和湍流粘度 湍流方程需要速度场合应力信息 湍流不同,结果不同 还有如非牛顿粘性模型,矩阵的相互作用等3、模型库 将同一功能性组成库 模型对模型作用=实现共同的接口(标志)实时选择(模型、离散、求解器选择方面)4、模型-模型作用 最好避免直接相互作用,使用虚基类代替 有助于简化作用矩阵,分层处理,但要注意有效性小组未来研讨的计划 湍流实现 动网格,特别是其编程结构 自动网格划分结构(网格划分)、网格自适应 基础库的C+编程技巧的分析 代数方程组求解技术 算法的优化技术 细节问题将分步进行研讨欢迎大家在QQ群上上传自己成果,我们会编辑成电子期刊发布。