博文
openFOAM基础——c++的面向对象思想 (2008-03-03 22:30:00)
摘要:openFOAM是用c++写的,其基础思想便是面向对象。面向对象的编程思想随便找本相关的书都能看清楚。其最大的优点在于符合人类思考习惯,方便进行代码维护和开发,并且有利于提高代码重用率。但是面向对象的编程思想对于数值计算来说是否合适,可能还有待商酌,因为大量虚方法的引入势必降低运算速率。然而如果想在CFD领域有长足发展,我想积累是不可缺少的一个环节。而架构在面向对象程序设计思想上的openFOAM,应该是众多积累手段中较为有效的一种。
又扯上了,先说些基本的吧。
首先,什么是面向对象?面向对象其实从字面上也看不出有什么太多的意思,不过如果从程序设计的发展过程来看,就不难对“面向对象”这一概念进行理解了。“面向对象”是相对于其前的“面向过程”而言的。对于一个面向过程的程序而言,程序从头走到尾,代码的编写顺序基本上就是执行的过程。而面向对象的方法则不然,虽然面向过程的影子依然存在(没有过程、何谈程序,事实上所有现实中的事情都是过程化的),但是在程序执行过程中出现了“对象”这一概念,而且对象本身会发生“行为”,彼此之间实现“消息”传递,从而实现其驱动机制(本质上也就是函数调用)。
对象(object):哲学上讲,对象即指现实世界中各种各样的实体,可以指具体的事物也可以指抽象的事物。如苹果、飞机、规则、法律、方程、向量等等(凡是可以想到的东西)。每个对象皆有自己的内部状态和运动规律,在面向对象概念中我们把对象的内部状态称为“属性”、运动规律成为“方法”或“事件”。 在面向对象程序设计中,对象就是有着自己的属性、方法的“变量”,只不过我们以后不称之为变量,而叫“对象”了,这也是为了与一般的变量区分。
类(class):哲学上讲,类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。类是人们根据自己的认识水平以对象为素材归纳出来的。对于一个具体的类,它有许多具体的个体(属于此类),我们就管这些个体叫做对象。既然对象有属性、方法,那么由其归纳而得的类自然也有相应的属性、方法。在面向对象程序设计中,类的定义是最关键的,一个程序,在类的定义上是否合理,很大程度影响着编程的效率。我们定义一个类的时候,决定这个类到底都有哪些属性和方法,并且定义属性的时候给出属性的数据类型,定义方法的时候给出方法的实现过程。
在程序执行过程中,我们利用类来定义对象,真正使代码执行的,是对象......
openFOAM基础--编译applications和libraries (2008-03-03 22:28:00)
摘要: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文件中的声明,我们才能在库中找到自......
网友的留言(2008-03-03 17:54:00)
摘要:
留言人: sqj 时间:2007-3-13 16:47:00
哥们,我第一次看到这个工具,而且对linux又基本不通,我把linux装好了,但是不会安装openfoam阿,能否具体讲讲如何安装
留言人: bioexplore 时间:2007-3-12 10:42:00
感谢各位捧场,前段时间我这里网络出了问题不能上programfan,所以一直没能更新我的blog,不过现在又可以了,我将继续添加新的内容。欢迎大家常来转转!
留言人: 匿名 时间:2007-1-24 19:24:00
对了,我的QQ214560407。如果方便请加我,再次感谢。
留言人: 匿名 时间:2007-1-24 19:23:00
我安装了OpenFOAM,但编译过程我感觉有问题,又不知出在哪。比如:make:***[一个一路径]错误1。装好后运行命令FoamX,报错:Starting NameServer with inet:localhost.localdomain:1234....
nsd:error while loading shared libraries:libelf.so.0:cannot open shared object file:Nosuch file or directory.我完全按照一般的步骤安装的,这到底怎么回事啊,急盼赐教。
留言人: dabaobao 时间:2006-12-11 20:41:00
两位高手,我想请教一下为什么我按照howto执行cmake ../..
是执行不了,直接导致我的paraview安装不了呢,另外你们都用的什么版本的linux呀,有qq帮帮忙吗,太感谢了,我的qq274981071
留言......
Debug命名空间(2008-03-03 17:50:00)
摘要:下面是debug命名空间中的各种方法,主要是向系统控制字典中提取和保存各种参数信息。
dictionary& controlDict();
//获取系统控制字典"ControlDict"的引用
dictionary& switchSet(const char* switchSetName, dictionary* switchSetPtr);
//从系统控制字典中查找选项集名"switchSetName"对应的字典,并返回该字典的引用
dictionary& debugSwitches();
//返回选项集名为"DebugSwithes"的字典
int debugSwitch
(
const char* switchName,
const int defaultValue = 0
);
//在字典"DebugSwitches"中查找是否有选项名为switchName的选项,有的话返回其值,否则在字典中增加数据对(switchName,defaultValue),同时返回defaultValue。
dictionary& infoSwitches();
//在系统控制字典中查找字典名为“InfoSwitches”的字典,并返回该字典的引用
int infoSwitch
(
const char* switchName,
const int default......
OpenFOAM IOstream基类(2008-01-03 17:12:00)
摘要:OpenFOAM中的I/O基类IOstream。
其内部定义的公有类型包括:
enum streamAccess{OPENED,CLOSED};
enum streamFormat{ASCII,BINARY};
enum compressionType{UNCOMPRESSED,COMPRESSED};
class versionNumber{float versionNumber_,int index_};
内部私有变量:
streamAccess openClosed_;
streamFormat format_;
versionNumber version_;
compressionType compression_;
ios_base::iostate ioState_;
static fileName name_;
保护变量:
int lineNumber_;
内部公有静态变量:
......
OpenFOAM输入输出(2008-01-02 18:21:00)
摘要:
OpenFOAM中的I/O系统
——继承结构一览
OpenFOAM中在STL的基础上构建了自己的I/O类结构,通过构造自己的输入输出系统,完成系统中自定义的一些类对象的输入输出。
这里首先介绍其I/O系统的类继承结构,其类间继承结构如下所示:
从图中可见OpenFOAM的I/O系统中基类为IOstream,其中定义里许多关于I/O流状态的描述,是一个I/O系统中必不可少的内容的抽象描述。
......
编译问题1:About cpuTime.H(2007-05-09 18:45:00)
摘要:编译时遇到的问题:
windows下没有sys/times.H头文件,及相应库文件,而在cpuTime.H中嵌入的该文件
#include <sys/times.H>
解决方法:将该语句注释掉
在该类的实现代码里将相应的方法用其他函数替代掉:
对cpuTime.H的修改:
#ifndef cpuTime_H
#define cpuTime_H
#include <time.h>
//bioexploreModify deinclude the <sys/times.h> which is not found
//#include <sys/times.h>
////bioexploreModifyEnd
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class cpuTime Declaration
\*---------------------------------------------------------------------------*/
class cpuTime
{
// Private data
//bioexploreModify change long to double
&nb......
在windows下调试OpenFOAM的核心代码(2007-05-08 00:10:00)
摘要:最近正在windows下作OpenFOAM的核心代码的编译及测试,由于OpenFOAM是在linux系统下编程的所以很多东西在windows里没有,要采用替代或绕过的方法,编译过程也很繁琐,正在不断摸索中,有了进展再在这里告诉大家!
欢迎继续关注我的Blog!......
OpenFOAM中描述场的类Field及与之相关的类(2006-12-01 16:10:00)
摘要:在OpenFOAM中有一个很重量级的角色——就是描述场的类Field,Field作为一个重量级角色在OpenFOAM中扮演着十分重要的任务,很多类都派生自Field类,因而对于Field的剖析就显得很重要。下面是我仅是我看了一部分她的代码后的一些体会,所以不是很全,以后再慢慢添加。
首先,该类是一个模板类,下面是它的继承关系图
可以看到,他继承了refCount及List类,这也就是为什么Field中没有私有变量的原因,他的私有变量都被“保存”在refCount及List中了,这里提到refCount不得不把tmp<Filed>请出来,refCount的主要目的也就是要为tmp<Field>提供一种可以用来计算对一个Field进行引用的次数,也就是每生成一个tmp<Field>对象,或者说每构造一个tmp<Field>对象,都将对该引用对象被引用次数进行计数,并附带在该Field对象本身,作为其一个特征,可以通过调用该对象的count()方法返回其被引用的次数。也可以通过okToDelete()来判断该对象是否因为存在引用而不能被删除。这些都是通过refCount赋予Field的天然特性,真的很巧妙,而且很精致,像是在欣赏一幅画,呵呵。
......
[转载]湍流基本概念(2006-11-29 10:56:00)
摘要:1.湍流附加切应力
在《数值传热学》里讲到湍流粘性系数法时有提到这个概念,但没有明确的解释。
湍流粘性系数法就是将湍流应力表示成湍流粘性系数,计算的关键就转化为求解这种湍流粘性系数。根据Boussinesq的假设,将湍流脉动所造成的附加应力与时均的应变率联系起来。根据层流时的流体应力与应变率的本构方程构造出湍流脉动时的方程。从而又引出两个概念——k,ηt,其中k表示的是单位质量流体的湍流脉动动能。ηt就是湍流粘性系数,是空间坐标的函数,取决于流动状态。所谓湍流模型,就是把ηt与湍流时均参数联系起来的关系式。依据确定ηt的微分方程的个数的多少,又有所谓零方程模型,一方程模型及两方程模型等。
2.Boussinesq假设
Boussinesq假设,湍流脉动所造成的附加应力也与层流运动应力那样可以同时均的应变率关联起来。
3.亚格子Reynolds应力
在大涡模拟的时候,直接模拟大尺度涡,但不直接计算小尺度涡,小涡对大涡的影响通过近似的模型来考虑,这种影响称为亚格子Reynolds应力。
转自:http://combust.hit.edu.cn/blog......