[toc]
代码风格
基本数据类型
采用
plint
和pluint
代替int
和unsigned int
为了64位的兼容性;
采用
pcout
代替cout
;采用pcerr
代替cerr
;采用pclog
代替clog
;采用ofstream
代替ofstream
;In an MPI-parallel program each thread writes to the terminal through cout. To avoid this and observe a consistent behavior between sequential and parallel programs.
内存
所有的Palabos类(或者至少那些使用继承的类)都有一个方法clone:
1
2A* object1 = new A;
A* object2 = object1->clone();在编写继承了Palabos类型的类时,需要实现这个方法。幸运的是,方法克隆总是具有完全相同的形状:
1
2
3A* A::clone() const {
return new A(*this);
}
矩阵
大数据集采用
Palabos
的BlockLattice
类型1
2
3
4
5
6// Instantiate a nx*ny*nz D3Q19 lattice with double-precision
// floating point numbers.
MultiBlockLattice3D<double,D3Q19descriptor> lattice(nx,ny,nz);
// Instantiate a nx*ny*nz matrix of double-precision floating
// point scalars.
MultiScalarField3D<double> field(nx,ny,nz);小的、非并行化的数组可以使用C++内置的
vector
类型1
2
3
4
5plint numspecies = 5;
// Instantiate a vector of double-precision floating point
// numbers with 5 elements.
vector<double> viscosities(numSpecies);
viscosities[3] = 0.63;对于非常小的,非并行的和固定大小的数组,
Palabos
定义了Array
类型1
2
3
4
5// Instantiate a fixed-size array of type double and with
// 3 elements. The values can be initialized directly in
// the constructor for arrays of size 2 and 3.
Array<double,3> velocity(0., 0., 0.5);
velocity[0] = 0.1;
并行方法
- Palabos采用单程序多数据(SPMD)并行计算,指的是在多个处理器或线程上同时运行相同的程序,但每个处理器或线程处理不同的数据;
- 这意味着程序在串行或并行执行时看起来是一样的;
使用Palabos进行非侵入式程序开发
不建议试图直接修改源码原因:
Palabos源码多于5万多行耗时耗力;
修改源码后的Palabos可能无法与后续的新版本兼容;
基于Palabos官方版本交换两个代码文件相对简单,其中一个为您自己的LB模型实现了一个新的动态类,另一个是一个示例应用程序。
不修改源码的扩展方法
- 假设您想要编写一个类似于BGK的LB模型,但差异很小;
- 首先要做的是检查“实现的流体模型”部分,并确保它尚未在Palabos中实现;
- 如果存在的话,你可以从文件
src/basicDynamics/isothermalDynamics.h and .hh
中可以发现BGKdynamics
继承自IsoThermalBulkDynamics
,实现了clone()
、collision()
和computeEquilibrium()
三个方法。 - 不能直接修改
BGKdynamics
中的collision()
,因为(在许多其他原因中)您将失去在应用程序中同时使用原始BGK动态和新模型的能力。
- 如果存在的话,你可以从文件
- 你需要创建两个新文件
myNewModel.h
和myNewModel.hh
,包含一个类MyNewDynamics
,它继承自IsoThermalBulkDynamics
,并定义了与BGKdynamics
相同的三个方法,适合您的情况。- 这个实现很简洁:它不会与更新的Palabos版本的更新冲突,并且您可以通过交换两个文件与同事共享它;
- 新文件可以位于任何本地目录中,独立于Palabos目录树。只要确保在Makefile的关键字includePaths下添加这个目录,这样就可以在编译过程中找到它。
Palabos的哪些部分是可扩展的?
粗略地说,有三种扩展Palabos的方法;
- 写一个新的动力学类;
- 写一个新的数据处理器;
- 写一个新的晶格描述符。
动力学类用于定义新的局部碰撞步骤,而新的晶格描述符意味着新的晶格拓扑(离散速度,权重等),而数据处理器用于其他一切。
好消息是,Palabos的可扩展部分提供了很大的灵活性。以单组分多相非混相多组分流体二维Shan/Chen模型实现和三维Shan/Chen模型实现为例。这只是通过编写一个新的晶格描述符和一个新的数据处理器来实现的,而不需要修改Palabos的任何结构部分。而且,生成的源代码的大小只占整个项目的1%。