<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[CFD软件工程——OpenFOAM]]></title>
<link>http://blog.pfan.cn/bioexplore</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[OpenFOAM中的引用计数]]></title>
		<link>http://blog.pfan.cn/bioexplore/54280.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OpenFOAM中在进行场计算时，涉及大量内存占用量很大的对象的操作，如果对于这些对象均采用“按值”操作而不是“按址”操作那就会造成大量内存耗用，导致程序效率的降低。C++中引用的概念解决了这一问题，但是同时也带来另一个问题就是关于引用计数的问题，同一对象被多重引用所指，那么对于引用个数的跟踪就显得很重要，因为如果依然有引用指向该对象时是不能进行该对象的析构的，因而需要跟踪大内存对象的引用个数，这就出现了引用计数的概念。


	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可惜在STL中并没有提供引用计数这样的类，因而在OpenFOAM中编写了refCount类用于实现该功能，需要进行引用计数的类只要派生自refCount，结合另一特定的模板类tmp&lt;T&gt;便可实现引用计数的功能。这里需要注意的是refCount的派生类必须要封锁复制构造函数及赋值操作符函数。


	&nbsp;]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2013-07-30 09:38:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++的多态]]></title>
		<link>http://blog.pfan.cn/bioexplore/52782.html</link>
		<description><![CDATA[当基类中含有虚函数（virtual）时，在运行时刻，通过基类指针（或引用）指向（或引用）具体派生对象时，当调用该指针（或引用）的虚函数时，实际调用的是该具体派生类中定义的相应函数。
那么如果存在以下继承关系：
class base；
class derived1：public base{...}；
class derivedderived1:public derived1{...};
及derivedderived1继承自derived1，而derived1又继承自base，那么假设base中有一个虚函数
virtual void print(){...};
在derived1中也定义了该函数只是没有声明为virtual：
class derived：public base{
......
public:
&nbsp;&nbsp;&nbsp;&nbsp;void print(){...}
......
};
在derivedderived1中也定义了形式上一样的print函数，也没有加virtual说明符；这种情况下，当一个base指针指向derivedderived1的对象，并调用print函数时，会调用哪个类中的print呢？
答案是：derivedderived1中定义的print。这说明了在继承层次中只要从某一层定义时加了virtual的成员函数，其n重派生类中均可实现多态。
现在有另一个问题就是如果derivedderived1中没有定义print这时将调用哪个类的print呢？
答案是：将调用derived1中定义的print函数
&nbsp;]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2011-09-07 12:45:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++笔记]]></title>
		<link>http://blog.pfan.cn/bioexplore/52771.html</link>
		<description><![CDATA[C++知识学习笔记
1. C++中的引用类型变量必须进行初始化，并且这个引用类型变量的值将不能变了，即该变量所代指的对象只能是其初始化时的对象，可见引用变量是十分忠诚的。。
例如：int I = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&amp; anotherI = I;//正确，编译通过
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&amp; wrongI;//错误，引用变量wrongI必须进行初始化
通常情况下的引用类型变量T&amp;进行初始化时必须为一个”左值“，即通俗的理解为一个T类型的变量名，而不能是T类型的一个常量。但是const T&amp;类型的引用变量进行初始化时就没有这一限制，即其可以用一个常量进行初始化。
例如：&nbsp;&nbsp;int myT = 5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&amp; myTRerfer=myT;//OK, myT is left value
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&amp; myTRefer2=5;//Wrong, 5 is not left value
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int&amp; myTRefer3=5;//OK, const int temp=5 first, myTRefer3=temp then;
2. 什么情况下将引用作为函数参数？
当函数要处理的参数是一个占用内存较大的类对象时，采用引用作为其参数可以避免在进行按值传递机制下对象复制所需内存及时间花销，而直接读取对象的内存，但是一般以const引用作为函数参数，表示函数不会改变对象的内容。如果想要改变对象内容时，应该以指针作为函数的参数，这样就显式的告诉函数使用者本函数将改变对象的内容。
&nbsp;
&nbsp;
&nbsp;
&nbsp;]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2011-09-02 23:17:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转载]被中国人误传了数千年的七句话]]></title>
		<link>http://blog.pfan.cn/bioexplore/52187.html</link>
		<description><![CDATA[在中国崇尚权威的文化氛围中，名人名言占的地位是很重的，很多名家说的话，往往被人民当成指导自己人生观世界观的不二准则，但这些几千年流传下来的名言中，也有一些话被人刻意或无知地曲解，背离了话语者本身的意旨与初衷，迷惑了天下万千受众。影不才，试举数例解析一二，以还世情真相与大众……好了我再文诌诌地说话大家估计要扔鸡蛋，虚荣心也满足了，下面开始举例开讲。&nbsp; 
1、以德抱怨&nbsp; 
　　&nbsp;原句：“或曰：‘以德报怨，何如？’子曰：“何以报德？以直报怨，以德报德”&nbsp;————《论语&nbsp;宪问》&nbsp; 
　　&nbsp;以德抱怨，是我们常听到的一句话了，人们通常理解的“以德抱怨”什么意思呢？就是说：孔老夫子教我们，别人欺负你了，你要忍，被打碎牙齿也要往肚子里吞，别人来欺负你，你反而应该对他更好，要用你的爱心去感化他，用你的胸怀去感动他。这就让人感觉很有点肃然了。想想看，如果我一巴掌呼过去那个被打的人还笑笑说打得好啊，你越打我我就要对你越好……遇到这种情况我也会感动到傻眼，这多好一孩子，多伟大的情操啊……&nbsp; 
　　&nbsp;但事实上，我们根本曲解了孔子的原意，我当初，也万万没想到原来在孔子这句“以德抱怨”的后边还跟着另外一段话，什么话呢？子曰：“以德抱怨，何以报德？以直报怨，以德报德！”看完以后，幡然醒悟，原来我们都被某个断章取义的孔子FANS给玩了一把！当时的真实情况是怎么样的呢？孔子的一个弟子问他说：师傅，别人打我了，我不打他，我反而要对他好，用我的道德和教养羞死他，让他悔悟，好不好？孔子就说了，你以德抱怨，那“何以报德？”别人以德来待你的时候，你才需要以德来回报别人。可是现在别人打了你，你就应该“以直抱怨”，拿起板砖飞他！看！就因为被人故意省略了一句话，刚烈如火的孔老夫子一下就被扭曲成了现在这个温婉的受气包形象。&nbsp; 
　　&nbsp;与西方文化相比，东方文明一向被认为是谦逊坚忍的，同样是被人欺负，西方的带头大哥耶稣在圣经里就叫嚣要：“以眼还眼，以牙还牙。”小弟们！别人瞪了你一眼，你就要瞪回去，别人咬了你一口，你就要咬回来！而东方呢？佛家的精神领袖释迦牟尼说“我不入地狱，谁入地狱？”一副逆来顺受的样子。而且他可不是说说而已的，大鹰来欺负他，要吃他的肉，他也真从自己身上一刀刀帮大鹰割下肉来，这就伟大得有点]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2011-01-16 16:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转载]wxWidget与VTK结合编程]]></title>
		<link>http://blog.pfan.cn/bioexplore/52186.html</link>
		<description><![CDATA[1.下载安装wxWidget,参见http://wxpack.sourceforge.net/Main/HomePage下载wxPack最新包【Windows下直接安装即可】，其中包含有wxWidgets，wxFormBuilder（可视化GUI设计），wxAdditions(扩展库)；
2.下载安装VTK，参见http://www.vtk.org/。下载源码自行编译【需要下载CMake，见http://www.cmake.org】形成库，需提前装有相应的C/C++编译器，如VC或GCC等。注意：为方便操作，设置相应的环境变量。
---------------------------------------------------------------------------------------------------------------------------------------------------
CMake的用法十分简便：运行CMake后，定位到VTK的源码处【解压源码后的文件夹】；同时指定生成的项目文件的目录；点击Configure按钮，出现若干选项，根据需要进行设置，如多线程，JAVA库等；选择相应的编译器【决定所生成的库所适用的范围和平台，如VS下生成的库不能移植到GCC下；反之亦然。但不影响源码的可移植性。】相应设置完成后，点击OK按钮，进入项目文件的生成。。。。。进入到生成的项目文件的目录打开相应的项目文件，如VS7.1等，选择生成ALL_BUILD，就可以喝杯咖啡去了【雪顶摩卡貌似还可】。。。。。。。。～～～～～～～～～～········，生成结束后，找到INSTALL项目，右键BUILD生成即可自动将生成的VTK库《静态和动态》以及相应的include包含文件自动拷贝到安装目录【默认下为C:\Program files\VTK】。此时就可以进行VTK程序应用开发了。---------------------------------------------------------------------------------------------------------------------------------------------------
3. 下载wxVTK程序，参见http://wxvtk.sourc]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2011-01-16 15:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转载]wxVTK编译时的错误]]></title>
		<link>http://blog.pfan.cn/bioexplore/52185.html</link>
		<description><![CDATA[Wx\wxVTK\src\wxVTKRenderWindowInteractor.cxx(86): error C2491: “wxVTKRenderWindowInteractor::ms_classInfo” : 不允许 dllimport 静态数据成员 的定义

解决办法：根据wxVTK提供的readme提示，出现的原因在于vtk和wxWidget混合使用了静态链接和动态链接，解决方案如下

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VTK static静态 &nbsp;&nbsp;&nbsp; VTK dynamic动态
wxWindows static静态 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3
wxWindows dynamic动态 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4

Just open the file: wxVTKRenderWindowInteractor.h, find the line:
打开文件： wxVTKRenderWindowInteractor.h, 找到下面的语句
class VTK_RENDERING_EXPORT wxVTKRenderWindowInteractor : public wxWindow, public vtkRenderWindowInteractor
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^^^^^^^^^^^^^^^^^^^^
根据上面的列表对应修改红色代码处
第一、二种情形无需修改，第三种情况改为WXDLLEXPORT,第四种则无]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2011-01-16 15:39:00</pubDate>
		</item>
				<item>
		<title><![CDATA[OpenFOAM相关资源]]></title>
		<link>http://blog.pfan.cn/bioexplore/52052.html</link>
		<description><![CDATA[（1）OpenFOAM官方网站
&nbsp;&nbsp;www.openfoam.org
&nbsp; 该网站你可以了解openfoam的基本信息，下载最近版本的OpenFOAM。
（2）OpenFOAM dev版本网站
&nbsp; http://openfoam-extend.wiki.sourceforge.net
&nbsp; 该网站为openfoam dev的网站，你可以看到最新的dev版本修改相关信息。该网站实时对dev代码进行更新。
（3）OpenFOAM论坛
&nbsp; http://www.cfd-online.com/Forums/openfoam/
&nbsp; 该网站为OpenFOAM的官方论坛，如果有关于openfoam的任何问题，都可以在这论坛上询问。当遇到问题时，不妨直接在该论坛上查询。你遇到的问题别人可能也遇到过，并且在论坛上已经解决。
（4）openfoamwiki
&nbsp;&nbsp;http://openfoamwiki.net/
&nbsp; 该网站上有一些openfoam相关的一些说明，比如求解器、openfoam里面的一些前处理后处理功能等。
（5）jasak个人主页
&nbsp; http://www.h.jasak.dial.pipex.com/
&nbsp;&nbsp;&nbsp; 该网站为jasak的个人主页，会公布一些关于openfoam的一些workshop，还有一些jasak的发表的paper
（6）&nbsp;http://powerlab.fsb.hr/ped/kturbo/OpenFOAM/&nbsp;
&nbsp;&nbsp; 这个上面包含有一些openfoam的一些workshop的一些资料。很多paper还有基于openfoam的博士论文。
（7）http://www.foamcfd.org/
&nbsp; &nbsp;&nbsp; 上面包括几乎所有基于of的博士论文，遗憾的是国内可能上不了这个网站
（8）流体中文网OpenFOAM社区
&nbsp;&nbsp;&nbsp;&nbsp; http://www.cfluid.com/bbs/forumdisplay.php?fid=86
&nbsp;&nbsp;&nbsp;&nbsp; 很可惜，该网站不]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2010-11-25 15:38:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用latex和beamer做幻灯片]]></title>
		<link>http://blog.pfan.cn/bioexplore/51966.html</link>
		<description><![CDATA[做幻灯片是一件头疼的事。而用latex做幻灯片是一件很头疼、很头疼、cdots、很头疼的事……总结和收集了一些经验如下：

beamer教程

有很多教程。对于初学者，最好先copy别人（比如师兄师姐的）模板用，或者直接看beamer的例子，C:CTeXtexmfdoclatexbeamerexamples。入门后，我觉得最好的提高教程是Ki-Joo Kim的Beamer v3.0 Guide，本身就是一个幻灯片，写的很清楚，看得也很爽。最后是beamer的用户手册，参考用。



中文幻灯片

一定要定义documentclass[cjk]{beamer}，别忘了“cjk”，否则编译不通过



pdf书签中文乱码

这是做中文幻灯片时必然遇到的问题……

在Adobe Reader中，显示在一旁的书签(Bookmark)是Unicode的。这样一来，如果单纯是使用pdflatex生成pdf将会显示乱码。所以，若要生成中文的Bookmark就需要执行如下命令:

pdflatex slide.tex
pdflatex slide.tex
gbk2uni slide.out
pdflatex slide.tex

注：gbk2uni是cct的一个小工具。



改变文字颜色

textcolor{blue!80!white}可以调色，这是xcolor包的一个功能。
在WinEdt中要查看任何一个package的用户手册，可以在菜单中选Help-Latex doc，然后输入包名即可。



lyx：可见即所得的Latex编辑器

每个frame里几乎都要敲一遍begin{itemize}end{itemize；思考若干秒后决定再敲一遍（因为要缩进其中的几个item）；再思考若干秒后把刚敲的这两行删掉（取消缩进）……用beamer就是这么痛苦。想想powerpoint，只要按Tab和Shift+Tab……于是我装了Lyx。虽然它其实还是很难用。下面是Lyx的几个经验： 
导入中文latex源文件前，应在latex源文件中写usepackage[gbk]{inputenc}指定编码，否则导入后是乱码 Document-preferences-language改为中文，否则查看源码时有很多解码错误]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2010-11-03 10:11:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Courant&nbsp;number的意义]]></title>
		<link>http://blog.pfan.cn/bioexplore/51926.html</link>
		<description><![CDATA[&nbsp;Courant number（库朗数）实际上是指时间步长和空间步长的相对关系，系统自动减小courant数，这种情况一般出现在存在尖锐外形的计算域，当局部的流速过大或者压差过大时出错，把局部的网格加密再试一下。 
&nbsp;&nbsp;&nbsp;在FLUENT中，用courant number来调节计算的稳定性与收敛性。一般来说，随着courant number的从小到大的变化，收敛速度逐渐加快，但是稳定性逐渐降低。所以具体的问题，在计算的过程中，最好是把courant number从小开始设置，看看迭代残差的收敛情况，如果收敛速度较慢而且比较稳定的话，可以适当的增加courant number的大小，根据自己具体的问题，找出一个比较合适的courant number，让收敛速度能够足够的快，而且能够保持它的稳定性。
&nbsp;&nbsp;&nbsp;&nbsp;FLUENT计算开始迭代最好使用较小的库朗数，否则容易导致迭代发散，修改办法slove－controls－solution，修改courant Number 默认值为1，开始没有经验的改小点，比如0.01，然后逐渐加大。]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2010-10-23 16:50:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于动态链接库中导出全局常量]]></title>
		<link>http://blog.pfan.cn/bioexplore/51869.html</link>
		<description><![CDATA[用gcc编译生成的含有调试信息的动态链接库，其中若定义了全局常量（包括基本类型与自定义的类对象）则不能得到该类的成员变量的调试信息，这可能与编译链接动态库时使用的--enable-auto-import参数有关]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2010-10-17 17:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[win32平台下动态链接库的编译]]></title>
		<link>http://blog.pfan.cn/bioexplore/51868.html</link>
		<description><![CDATA[本文主要讲解win32平台上用gcc编译生成动态链接库的方法，一方面做个备忘（主要自己专业不是这个，呵呵），另一方面也为不熟悉gcc在win32平台编译的朋友提供些线索
主要有两种方法：
方法一、用dllwrap工具
&nbsp;&nbsp;&nbsp;&nbsp;语法dllwrap.exe --output-def defFileName --implib implibFileName linkobj1 linkobj2 ... linklibs -o dllName
其中implibFileName是动态库对应导入库的名字，defFileName 中内容是动态库中导出符号表，linkobj1 linkobj2 是编译好的目标文件，linklibs是要链接的静态及动态库的列表，dllName是最终生成的动态库的名字。
方法二、用g++工具加-shared参数
语法g++ -shared linkobj1 linkobj2 ... linklibs -o dllName
其中参数意义与方法一中同名参数相同。]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2010-10-17 17:10:00</pubDate>
		</item>
				<item>
		<title><![CDATA[M4宏处理器]]></title>
		<link>http://blog.pfan.cn/bioexplore/45878.html</link>
		<description><![CDATA[原文：http://cm.bell-labs.com/7thEdMan/vol2/m4
转自：http://blog.chinaunix.net/u/13392/showart_135427.html
摘要
M4 是在 UNIX &reg; 和 GCOS 上可用的宏处理器。它的主要用途是在无参数宏不够强力的情况下用做 Ratfor 的前端。它也被用于各异的语言如 C 和 Cobol。M4 特别适合于函数式语言如 Fortran、PL/I 和 C，因为宏是以函数表示法指定的。
M4 提供了即使在更大的宏处理器中都少见的特征，它包括了

参数 
条件测试 
算术功能 
字符串和子串函数 
文件操纵 


本文是 M4 用户手册。
July 1, 1977



介绍 
用法 
定义宏 
引用 
参数 
算术内置 
文件操纵 
系统命令 
条件 
字符串操纵 
打印 
内置总结 
致谢 
引用 


---- 前言完 ----
介绍
宏处理器是增强一门编程语言，使它更加美味或更加可读，或者把它裁剪得适合特定应用的有用的方式。C 语言中的 #define 语句和 Ratfor 中类似的 define 就是任何宏处理器都提供的基本设施的例子 — 它把文本替代为其他文本。
M4 宏处理器是对叫做 M3 的宏处理器的扩展，它是 D. M. Ritchie 为 AP-3 小型机写的；M3 基于的是为 [1] 实现的宏处理器。不熟悉宏处理基本概念的读者可以读一下其中的某些讨论。
M4 适合于做 Ratfor 和 C 的前端，而且还成功的用于 Cobol。除了直接把一个字符串替代为另一个字符串之外，它还提供带有参数的宏、有条件的宏扩展、算术、文件操纵和某些特 殊的字符串处理函数。
M4 的基本操作把输入复制到输出。但在读入输入的时候，检查每个字母数字(alphanumeric)的“记号”(token) (就是说字母和数字的字符串)。如果它是一个宏的名字，则把这个宏的名字替代为它所定义的文本，把结果的字符串压回到输入中被重新扫描。调用宏可以带有参 数，在这种情况下，参数被收集并在重新扫描之前替换入定义的文本中正确的位置上。
M4 提供了一组大约二十个内置宏来进行各种有用的操作；此外，用户可以定义新宏。内置和用]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-07-30 22:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[正余弦定理与三角形面积公式]]></title>
		<link>http://blog.pfan.cn/bioexplore/45015.html</link>
		<description><![CDATA[这两天在看代码时发现关于三角形的这些基本定理和公式很有用，所以从网上搜了下，主要有三角形的正弦定理，余弦定理，以及三角形面积公式（包括海伦公式）。
正弦定理（引自百度百科）
　　 
Sine theorem
　　在一个三角形中，各边和它所对角的正弦的比相等。
　　即a/sinA=b/sinB=c/sinC=2R（2R在同一个三角形中是恒量，是此三角形外接圆的半径的两倍）
　　这一定理对于任意三角形ABC，都有
　　a/sinA=b/sinB=c/sinC=2R
　　R为三角形外接圆半径 


证明　　步骤1.
　　在锐角△ABC中，设BC=a,AC=b,AB=c。作CH⊥AB垂足为点H
　　 
CH=a·sinB
　　CH=b·sinA
　　∴a·sinB=b·sinA
　　得到
　　a/sinA=b/sinB
　　同理，在△ABC中，
　　b/sinB=c/sinC 
　　步骤2.
　　证明a/sinA=b/sinB=c/sinC=2R：
　　如图，任意三角形ABC,作ABC的外接圆O. 
　　作直径BD交⊙O于D. 
　　连接DA. 
　　因为直径所对的圆周角是直角,所以∠DAB=90度 
　　因为同弧所对的圆周角相等,所以∠D等于∠C. 
　　所以c/sinC＝c/sinD=BD=2R
　　类似可证其余两个等式。 


意义　　正弦定理指出了任意三角形中三条边与对应角的正弦之间的一个关系式，又由正弦函数在区间上的单
　　调性可知，正弦定理非常好的描述了任意三角形中边与角的一种数量关系。
余弦定理
　　 
　余弦定理是揭示三角形边角关系的重要定理，直接运用它可解决一类已知三角形两边及夹角求第三边或者是已知三个边求角的问题，若对余弦定理加以变形并适当移于其它知识，则使用起来更为方便、灵活。
　　对于任意三角形 三边为a,b,c 三角为A,B,C 满足性质
　　(注：a*b、a*c就是a乘b、a乘c 。a^2、b^2、c^2就是a的平方，b的平方，c的平方。)
　　a^2=b^2+c^2-2*b*c*CosA 
　　b^2=a^2+c^2-2*a*c*CosB
　　c^2=a^2+b^2-2*a*b*CosC
　　CosC=(a^2+b^2-c^2)/2ab
　　CosB=(a^2]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-07-07 16:45:00</pubDate>
		</item>
				<item>
		<title><![CDATA[组合，关联，聚合的区别]]></title>
		<link>http://blog.pfan.cn/bioexplore/44875.html</link>
		<description><![CDATA[类间关系
在类图中，除了需要描述单独的类的名称、属性和操作外，我们还需要描述类之间的联系，因为没有类是单独存在的，它们通常需要和别的类协作，创造比单独工作更大的语义。在UML类图中，关系用类框之间的连线来表示，连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承（泛化）、关联、聚合和组合。
（1）继承：指的是一个类（称为子类）继承另外的一个类（称为基类）的功能，并增加它自己的新功能的能力，继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头（或三角形）的实线指向基类。例如，图3.2给出了MFC中 CObject类和菜单类CMenu的继承关系。
　　　　　图3.2 类的继承
类的继承在C++中呈现为：
class B { }　class A : public B{ }
（2）关联：指的是模型元素之间的一种语义联系，是类之间的一种很弱的联系。关联可以有方向，可以是单向关联，也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联，角色可以具有多重性，表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束，以加强关联的含义。　　关联在C++中呈现为：
class A{...}　class B{ ...}　A::Function1(B &amp;b) //或A::Function1(B b) //或A::Function1(B *b)
即一个类作为另一个类方法的参数。
（3）聚合：指的是整体与部分的关系。通常在定义一个整体类后，再去分析这个整体类的组成结构。从而找出一些组成类，该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。 
（4）组合：也表示类之间整体和部分的关系，但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在，部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
聚合和组合的区别在于：聚合关系是“has-a”关系，组合关系是“contains-a”关系；聚合关系表示整体与部分的关系比较弱，而组合比较强；聚合关系中代表部分事物的对象与代表聚合事物的]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-07-01 09:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[编译OSspecific时碰到的编译问题]]></title>
		<link>http://blog.pfan.cn/bioexplore/41743.html</link>
		<description><![CDATA[在对OSspecific静态链接库进行编译时出现下列问题：程序中的string.H与系统头文件string.H的冲突：程序中的string.H位于../../src/OpenFOAM/lnInclude中，而系统的string.H位于 MingW\include中，在CodeBlocks工程文件中只定义了两个搜索路径即../../src/OpenFOAM/lnInclude和../../src/OSspecific/lnInclude，这样的话在进行编译时的编译过程出错：
In file included from C:/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/char_traits.h:45,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from C:/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/string:47,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from ../../src/OpenFOAM/lnInclude/..\primitives\strings\string\string.H:51,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from ../../src/OpenFOAM/lnInclude/string.H:1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from ../../src/OpenFOAM/lnInclude/.]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-03-23 18:16:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转]undefined&nbsp;reference&nbsp;to&nbsp;vtable]]></title>
		<link>http://blog.pfan.cn/bioexplore/41596.html</link>
		<description><![CDATA[最近在写一套基础类库用于SG解包blob字段统计，在写完了所有程序编译时遇到一个郁闷无比的错误： MailBox.o(.text+0x124): In function `CMailBox::CMailBox[not-in-charge](CMmogAnalyseStatManager*)': ../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()' MailBox.o(.text+0x182): In function `CMailBox::CMailBox[in-charge](CMmogAnalyseStatManager*)': ../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()' MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x33): In function `CMailBox::~CMailBox [in-charge]()': ../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()' MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x4f):../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()' MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD0Ev+0x33): In function `CMailBox::~CMailBox [in-charge deleting]()': ../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-03-18 20:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[c、c++]宏中&quot;#&quot;和&quot;##&quot;的用法]]></title>
		<link>http://blog.pfan.cn/bioexplore/40691.html</link>
		<description><![CDATA[宏中"#"和"##"的用法一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.用法:#include&lt;cstdio&gt;#include&lt;climits&gt;using namespace std; #define STR(s) &nbsp;&nbsp;&nbsp; #s#define CONS(a,b)&nbsp; int(a##e##b)
int main(){&nbsp;&nbsp;&nbsp; printf(STR(vck));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 输出字符串"vck"&nbsp;&nbsp;&nbsp; printf("%d\n", CONS(2,3));&nbsp; // 2e3 输出:2000&nbsp;&nbsp;&nbsp; return 0;}

二、当宏参数是另一个宏的时候需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.
1, 非'#'和'##'的情况#define TOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)#define MUL(a,b) (a*b)
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));这行的宏会被展开为：printf("%d*%d=%d\n", (2), (2), ((2)*(2)));MUL里的参数TOW会被展开为(2).

2, 当有'#'或'##'的时候#define A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)#define STR(s)&nbsp;&nbsp;&nbsp;&nbsp; #s#define CONS(a,b)&nbsp; int(a##e##b)
printf("int max: %s\n",&nbsp; STR(INT_MAX));&nbsp;&nbsp;&nbsp; // INT_MAX ＃i nclude&lt;climits&gt;这行会被展开为：printf("int max: %s\n", "INT_MAX");
printf("%s\n", CONS(A, A));]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-02-01 09:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[runtimeSelctionTable宏]]></title>
		<link>http://blog.pfan.cn/bioexplore/40690.html</link>
		<description><![CDATA[简单介绍：
在头文件runTimeSelectionTables.H中声明了两个很重要的宏：
declareRunTimeSelctionTable(autoPtr, baseType, argNames, argList, parList)
defineRunTimeSelectionTable(baseType, argNames)
这里涉及到一个专业词汇 ”run-time selection table”, 这两个宏的定义就是为了方便实现run-time selection table.
首先要说明的是这两个宏是成对的，也就是在源代码文件中这两个宏也要成对使用，一般将第一个宏放在头文件中，而第二个宏放在相应的c文件中。一个为声明另一个是定义实现。
&nbsp;
详细描述
&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declareRunTimeSelectionTable
该宏具有5个参数：autoPtr，baseType，argNames，argList，parList。
首先，利用typedef定义一个函数指针类型 argNamesConstructorPtr，返回值为autoPtr&lt;baseType&gt;，参数为argList；
接着，利用该函数指针通过typedef定义一个HashTable类型：argNamesConstructorTable，该HashTable的模板参数分别为&lt;argNamesConstructorPtr, word, string::hash&gt;;
接着，定一个静态argNamesConstructorTable型的指针变量：argnamesConstructorTablePtr_;
定义一个模板类：addargNamesConstructorToTable，模板参数为baseTypeType，该类中一个静态成员函数New，一个构造函数和一个析构函数。New的参数列表为argList，返回值是autoPtr&lt;baseType&gt;,实际上是调用autoPtr&lt;baseType&gt; (new baseTypeType parList)。构造函数有一个参数（const word&amp; lookup=]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2009-02-01 08:32:00</pubDate>
		</item>
				<item>
		<title><![CDATA[在论坛里回复别人关于链表操作的帖子]]></title>
		<link>http://blog.pfan.cn/bioexplore/39602.html</link>
		<description><![CDATA[#include&lt;iostream&gt;
using namespace std;
&nbsp;
struct Node
{
&nbsp;&nbsp;&nbsp; double content;
&nbsp;&nbsp;&nbsp; Node*&nbsp; next;
&nbsp;&nbsp;&nbsp; Node():content(0.0),next(NULL){}//默认构造函数
&nbsp;&nbsp;&nbsp; Node(double c,Node* n):content(c),next(n){}//又一构造函数
};
&nbsp;
void clearList(Node* h)//链表内存回收 
{
&nbsp;&nbsp;&nbsp;&nbsp; if(h)
&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(h -&gt;next)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node* nextHead= h -&gt;next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete h; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearList(nextHead); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2008-11-29 13:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[createMesh中用到的IOobject]]></title>
		<link>http://blog.pfan.cn/bioexplore/39559.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foam::IOobject
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foam::fvMesh::defaultRegion,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; runTime.timeName(),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; runTime,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foam::IOobject::MUST_READ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )

上述代码是摘抄自createMesh.H中进行fvMesh构造时用到的临时IOobject对象的构造代码。

Foam::fvMesh::defaultRegion的值为"region0",这一部分是作为该IOobject的name_成员;
runTime.timeName(),返回的是的runTime的量纲部分dimensioned&lt;scalar&gt;的name_,这一部分是作为该IOobject的instance_c成员;
runTime是作为该IOobject的db_成员;
在由该IOobject构造其它类时这些信息是非常有用的,比如objectRegistry类,regIOobject类等,现在举objectRegistry为例,其以IOobject为参数的构造如下:
Foam::objectRegistry::objectRegistry
(
&nbsp;&nbsp;&nbsp; const IOobject&amp; io,
&nbsp;&nbsp;&nbsp; const label nIoObjects
)
:
&n]]></description>
		<author><![CDATA[bioexplore]]></author>
		<pubDate>2008-11-25 09:41:00</pubDate>
		</item>
		</channel>
</rss>