博文

正在结合刚刚编译完成的I/O系统编写其类库手册(2008-10-18 20:30:00)

摘要:针对刚刚编译完成的foam的I/O系统,对该系统中涉及的类编写类库使用手册!主要是可以通过在编译的I/O平台上实验其所有的成员函数,并进行编写!......

阅读全文(2721) | 评论:0

终于将OpenFOAM中的I/O系统在windows下编译通过了(2008-10-17 18:15:00)

摘要:经过4天的时间,终于将OpenFOAM1.5中的I/O系统从源代码中剥离出来,并在windows下编译通过了,整个过程还算是比较顺利,虽然遇到了一些问题,但是最终还是都克服了。目前除了涉及系统相关命令的unix.C文件中的函数还没有实现代码外,基本上都已经通过了,此外errorIO.C中的List类模板特化时的链接问题也还没有解决,不过问题不大,并不影响使用。 接下来可以在这个小平台上测试一些代码了,用来学习和了解OpenFOAM的I/O系统相关的类,及他们之间的相互关系等。......

阅读全文(3813) | 评论:3

如何用一个IOobject对象来构造一个IOdictionary对象(2008-09-06 13:23:00)

摘要:如何用一个IOobject对象来构造一个IOdictionary对象 经常会看到下面这样的代码:
 IOdictionary controlDic_
  (
   IOobject
   (
      “nameString”,
      runTime.timeName(),
      mesh,
      IOobject::MUST_READ,
      IOobject::AUTO_WRITE
   )
  );
这段代码的意思就是要用一个IOobject对象来构造一个IOdictionary对象。就是以IOobject构造的临时对象为实参来调用IOdictionary的以IOobject为形参的构造函数,那么该构造是如何完成的呢,下面让我们来分析一下其实现源代码:
 IOdictionary::IOdictionary    //代码段1
 (
     const IOobject& io
 )
 :
     regIOobject(io)    <==//Line1
 {
    dictionary::name() = IOobject::objectPath();     if
    (
        io.readOpt() == IOo......

阅读全文(6445) | 评论:0

OF描述具量纲变量的模板类——dimesioned<Type>(2008-09-04 21:29:00)

摘要:dimensioned<Type>默板类 该类是实现具有量纲变量的类,在给变量值加量纲的同时还给变量加了名字。OF通过该类模板实现标量,矢量,张量三种类型变量的量纲化。相应的在OF中具体实例化的类分别为dimensionedScalar,dimensionedVector和dimensionedTensor。   该类模板中提供了三个私有变量: word name_;             //保存变量的名字 dimesionSet dimensions_;    //保存变量的量纲 Type value_;            //保存变量值,类型由模板参数Type指出   构造函数(4个):   dimensioned(const word&, const dimensionSet&, const Type);  //给定名字,量纲和变量值进行构造   dimensioned(const word&, const dimensioned<Type>&);   //量纲和值取自给定的具量纲变量对象,并给其重新命名   dimensioned(const Type& t)   : name_(::Foam::name(t)),     dimensions_(dimless),     value_(t)   {}            //仅给出变量值,将构造一个无量纲名字为变量值的类对象   dimensioned(Istream&); //从输入流中读入数据进行对象的构造   成员访问函数对外接口(3*2个): con......

阅读全文(4959) | 评论:1

为什么C++编译器不能支持对模板的分离式编译(2008-09-04 13:02:00)

摘要:为什么C++编译器不能支持对模板的分离式编译   刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba)   首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件)文件格式,并且本身包含的就已经是二进制码,但是不一定能够执行,因为并不保证其中一定有main函数。当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由连接器(linker)进行连接成为一个.exe文件。   举个例子:   //---------------test.h-------------------// void f();//这里声明一个函数f   //---------------test.cpp--------------// #include”test.h” void f() { …//do something }  //这里实现出test.h中声明的f函数   //---------------main.cpp--------------// #include”test.h” int main() { f(); //调用f,f具有外部连接类型 }   在这个例子中,test. cpp和main.cpp各自被编译成不同的.obj文件(姑且命名为test.obj和main.obj),在main.cpp中,调用了f函数,然而当编译器编译main.cpp时,它所仅仅知道的只是main.cpp中所包含的test.h文件中的一个关于void f();的声明,所以,编译器将这里的f看作外部连接类型,即认为它的函数实现代码在另一个.obj文件中,本例也就是test.obj,也就是说,main.obj中实际没有关于f函数的哪怕一行二进制代码,而这些代码实际存在于test.cpp所编译成的test.obj中。在main.obj中对f的调用只会生成一行ca......

阅读全文(3225) | 评论:0

OF描述量纲的类——dimensionSet(2008-09-04 12:22:00)

摘要:dimensionSet类
该类封装了量纲信息及对量纲的相关运算操作,是实现计算中物理量量纲运算与处理的接口类。 该类首先定义了两个公有枚举类型:
enum{ nDimensions=7 };  //国际单位制中规定了7个标准单位,这些单位在下一个枚举类型中定义
enum dimensionType{ MASS,   //质量,单位是kg
   LENGTH,  //长度,单位是m
   TIME,   //时间,单位是s
   TEMPERATURE,  //温度,单位是K
   MOLES,   //摩尔数,单位是mol
   CURRENT,  //电流,单位是A(安培)
   LUMINOUS_INTENSITY  //光强,单位是Cd(坎德拉)
  }; 保存的私有成员变量:
scalar exponents_[nDimesions]; //用于保存7个标准单位的相应幂指数,例如:
 exponents_[MASS],  //就表示质量单位的幂指数。  exponents_[TIME],  //表示时间单位的幂指数. …… 静态常量smallExponent保存SMALL,主要用来判断各个单位的幂指数是否足够小<abs(SMALL),若在上述范围则表明该单位的量纲是0 该类具有三个构造函数,原型分别如下:
dimensionSet( const scalar mass,
  const scalar length,
  const scalar time,
  const scalar temperature,
  const scalar moles......

阅读全文(4420) | 评论:0

更新记录(2008-09-03 09:38:00)

摘要:2008/9/3 添加文章:
Time类的基类1——clock
Time类的基类2——TimePaths 更新文章
已经看过的类
本文 2008/0904 添加文章:
OF描述量纲的类——dimensionSet
OF描述具量纲变量的模板类——dimesioned<Type> 更新文章:
已经看过的类
本文 2008/09/06 添加文章:
如何用一个IOobject对象来构造一个IOdictionary对象......

阅读全文(2226) | 评论:0

Time类的基类2——TimePaths(2008-09-03 09:30:00)

摘要:TimePaths是Time的第三个基类,相对其他基类而言该类的结构也相对比较简单,主要封装了算例的相关路径信息,用于保存与算例有关的关键路径的名称,并对这些路径信息进行相应的操作。 该类具有三个类型的五个私有变量:
bool processorCase_;  //判断是否是处理器进程的算例?
Foam::fineName rootPath_;  //保存算例根路径
Foam::fineName case_;  //保存算例名称
Foam::word  system_;  //保存算例system文件夹的名称
Foam::word  constant_;  //保存算例constant文件夹名称 构造函数:
TimePaths( const fileName& rootPath,
    const fileName& caseName,
    const word&    systemName,
    const word&    constantName
    );
只声明并定义了这一个构造函数,所给的四个参数分别赋予相应的四个私有成员变量:rootPath_,case_,system_,constant_;另外一个通过检视case_中是否包含"processor"来定义,若包含则为true,否则为false 对私有变量访问的成员函数:
const fileName& rootpath() const;  //返回rootPath_
const fileName& caseName() const;  //返回cae_
const word& system() const;  //返回system_
const word& constant() const;  //返回constant_ 另外还提供三个路径获取函数:......

阅读全文(3268) | 评论:0

Time类的基类1——clock(2008-09-02 22:12:00)

摘要:clock作为Time类的第一个基类,其构成很简单,主要是封装时间的类,用来对程序运行时间进行计时,并处理与时间有关的数据,如返回系统日期,系统当前时间,程序运行时间等。   该类具有三个私有成员变量: time_t(注1) startTime_;  //构造时的时间 mutable time_t lastTime_;    //上一次计时的时间 mutable time_t newTime_;     //最新计时的时间   该类就是通过上面三个值来实现对程序进行计时的,主要应用体现在下面两个成员函数: time_t  elapsedClockTime() const;  //取当前时间并赋值给newTime_成员,同时返回newTime_-startTime_ time_t  clockTimeIncrement() const;   //计算当前时间距上次取时间的时间间隔,返回newtime_-lastTime_   该类还提供了以下时间处理函数: time_t  getTime();  //通过调用time(0)(c++函数)返回当前系统时间 const struct tm rawDate();  //通过调用localtime(&getTime())(c++函数)返回包含时间相关信息的tm结构 Foam::string date();  //返回一个如格式month day year的字符串,如Sep 02 2008 Foam::string clockTime();  //返回一个如格式hh:mm:ss的字符串,如22:05:12   其中date用到的月份名取自该类的一个静态字符串数组: char* monthnames[]={"Jan","Feb", "Mar", "Apr", "May", "Jun",     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",};   由于Time公有继承该类,因而其便具有cl......

阅读全文(2515) | 评论:0

DLListBase类解读(2008-08-12 16:53:00)

摘要:通过定义的内部结构link实现节点的双向链接,该类完成对双向链表的构造,控制对节点的操作,包括删除,替换,插入,追加,清除链表等,此外该类还提供了内部公有迭代类iterator和const_iterator;这两个类用于实现对链表对象DLListBase的遍历,前者能够实现对链表内元素的修改,后者不能对链表内元素修改。为了更好的实现遍历,DLListBase中还提供了first(),end()成员函数分别生成指向链表第一个元素和最后一个元素的迭代器iterator或const_iterator。

另外该类屏蔽了复制构造函数和赋值构造函数,因此不能通过以下方式进行DLListBase类对象的声明:
 DLListBase llistA;
 DLListBase llistB(llistA);  //这是不允许的,因为复制构造函数被屏蔽
 DLListBase llistC=llistA;  //也是不行的,赋值构造被屏蔽

三个私有成员变量link* first_,link* last_及label nElmts_分别为指向第一个元素的指针,指向最后一个元素的指针和链表中元素的个数。

构造函数有两个一个为默认构造函数,其将三个私有成员变量均设为0,另外一个以link* a作为函数参数,将first_和last_都设为a,并且将a注册即a->prev_=a;a->next_=a; 私有成员变量nElmts_=1。

成员函数clear()将清除链表,其并不一一删除各元素,只是将自身三个私有变量的值重置为0,其他工作交由link的派生类或程序员来完成。......

阅读全文(2538) | 评论:0