gulie的个人博客分享 http://blog.sciencenet.cn/u/gulie

博文

[转载]LBM:PalaBos进行程序编制

已有 9600 次阅读 2011-12-6 23:18 |个人分类:知识的海洋|系统分类:科研笔记|关键词:程序| 程序 |文章来源:转载

辉哥一直努力为大家提供关于如何使用PALABOS开发自己的code,本博客转载他的博文,使科学网内更多朋友了解PALABOS,并使用之。(很惭愧,我还没真正使用过,虽然也搞过一阵LBM,但没有做到PALABOS这么强大)。不过,PALABOS还一直处于发展阶段,目前还算是幼年期,希望更多的朋友使用PALABOS进行相关研究工作。
数据类型

在Palabos中, 符号型和无符号型的整型数据类型系统地被plint和pluint替代(引入了一些例外的处理机制). 起原因是为了建立与64位代码兼容性. 对于32位的符号型整型变量范围是-2147483648到2147483647(2^31,首位表示+和-). 64位的系统具有更大的范围. 在模拟中,32位的结构经常不能满足数据集大于2GB情形. 当然,在很多情况下,我们也不愿意使用64位的
平台.尽管如此,在当今的64位的计算体系结构中,也可选择使用32的数据类型. 通常,在PalaBos中,对此问题的解决就是采用对32的架构就使用32位的plint和pluint, 对64为的体系架构就在用64位的定义.让我们来看在PalaBos中的具体定义:

#ifdef PLB_BGP
typedef long long int plint;
#else
typedef ptrdiff_t plint;
#endif

#ifdef PLB_BGP
typedef unsigned long long int pluint;
#else
typedef size_t pluint;
#endif

ptrdiff_t:是C/C++基本的符号型整型数据类型,并且是平台依赖的(32位平台,ptrdiff_t就是32位的,同理,64为的平台,其就是64位的). PLB_BGP是为了适应BlueGene特殊的系统架构够而定义的。在BlueGene上使用PalaBos时,建议使用编译参数 -DPLB_BGP,来启用平台适用的数据类型。

在PalaBos中,当使用并行机制时,如果使用cout,每一个进程就要调用cout,为了壁面这个问题,PalaBos中,重新定义了pcout(仅主节点调用)。同样,对于文件的输入输出流,采用 plb_ofstream, plb_ifstream. cerr被pcerr取代,clog被pclog取代。

内存管理

当C++没有垃圾收集收集机制时, 经由指针动态创建的对象必须进行手动释放. Palabos没有外部的垃圾收集机制,所以我们必须在编程是严格遵循C++对象的释放机制。PalaBos中,一般情况下,当一个函数调一个对象的用指针作为参数时,这个函数完全掌控这个对象. 用户不再负责对象的释放。反之,如果你得到一个对象的指针,你就成为这个对象的所有者,你可以做一切你想要做的,之后捕要忘记删除这个对象。

关于如果一个对象有多个实例谁来负责删除它,在PalaBos中可以使用一个对象一个指针的机制来避免。无论何时,当第二个实例需要访问一个正在使用的实例时,就给他创建一个这个实例的副本。示例如下:

A* object1 = new A;
A* object2 = object1->clone();

基类中clone是个纯虚的函数,如果你创建了一个类继承于PalaBos的类型,你需要实现它,同时也是必须的对于当前对象。当然重新这个方法很容易
A* A::clone() const {
    return new A(*this);
}

数组

对于大的数据集,诸如LBM模拟中的单粒子分布函数, PalaBos将其存储在BlockLattice类型中。当然,这个是个特殊的并行话的数据类型。其语法如下:

// 实例化一个nx*ny*nz D3Q19 双精度的格子
MultiBlockLattice<double,D3Q19descriptor> lattice(nx,ny,nz);

// 实例化一个nx*ny*nz 双精度标量场
MultiScalarField<double> field(nx,ny,nz);

当然,有时需要采用非并行化的数据类型来存储一些量。标准的C++库提供了一个可以动态改变大小的数据类型vector,其用法如下:

plint numspecies = 5;
// 实例化一个双精度的浮点类型,有5个元素
vector<double> viscosities(numSpecies);
viscosities[3] = 0.63;

强烈建议,使用vecotor,这样可以使你避免犯错,并使得你的程序具有很高的可读性。

速度与密度

在PalaBos中,变量u和rho是两个基本的变量,但是起却不常常能够看到。原因在于,在PalaBos的结构中,常常使用rhoBar和j。变量j是一阶速度矩, j = rho * u。 rhoBar定义为rhoBar=rho-1,仅仅是为了提高计算的数值精度。rho / u 和 rhoBar / j转换关系如下:
// 用rhoBar计算rho
rho = Descriptor<T>::fullRho(rhoBar);
// 用rho计算rhoBar
rhoBar = Descriptor<T>::rhoBar(rho);
// 动量
j[iD] = rho * u[iD];
// 速度
u[iD] = 1./rho * j[iD];
// 另外一中方法
u[iD] = Descriptor<T>::invRho(rhoBar) * j[iD];

并行机制

Palabos使用SPMD(single process, multiple data; or single program, multiple data),使用于共享内存和分布式内存平台。对于串行和并行,程序结构是可那看起来没有变化的。在分布式环境下(cluster), 多个拥有相同程序的实例会创建。在这种情形下,分布式是对象(MultiBlockLattice, MultiScalarField, 和 MultiTensorField) 被并行化。其他的数据类型,每个进程都有起一个副本。当然,有些例外的情况,一些变量由主进程掌管。

PalaBos基础上个人程序的开发(非侵入式)

对于物理学家和科学程序的编制者,有时需要基于PalaBos编制自己的方法。并不建议直接修改全部理解或者修改PalaBos的代码,可以直接利用或者调用PalaBos提供的接口。首先,你得确认你想要加入的模型或者方法PalaBos中是没有的。可以查看src/basicDynamics/isothermalDynamics.h和.hh,可以发现一些类直接继承于IsoThermalBulkDynamics并执行三个基本的方法clone(), collide(), 和computeEquilibrium()。接下来,你会想到是修改BGKdynamics collide(),这不是个好办法,也许你的模型会影响其他的使用BGKdynamics的模型。好的方法是,你自己创建myNewModel.h和myNewModel.hh,然后包含一个类MyNewDynamics继承于IsoThermalBulkDynamics,然后定义同样的其他的三个方法。这样你可以在保证不修改PalaBos的前提下创建自己的模西型,然后和你的同事仅仅分享这个两个文件。你的新的文件可以放置在本地的文件夹中。然后在Makefile中包含PalaBos的路径。

PalaBos中那些是可以扩展的

(1) 加入新的Dynamixs;
(2) 加入新的数据处理机制;
(3) 加入新的格子描述。

除此之外,其他部分是不可扩展的。比方你不能去写个类似MultiBlockLatticeXD的类, 或者重新发明MultiScalarFieldXD。当然,也不能去阻止每一个人不去做这些。你只有遵循PalaBos的约定,你才能利用PalaBos为你服务。

希望大家可以加入自己的模型在PalaBos中。



http://blog.sciencenet.cn/blog-250582-515682.html

上一篇:[转载]LBM:PalaBos 几何与边界的处理
下一篇:[转载]The Kutta-Joukowsky condition

1 wuxiangchao

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-11-12 21:49

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部