Eastsheng's Wiki

LBM/PALABOS:PALABOS代码风格与开发扩展方法

2024-04-28 18:37:28

[toc]

代码风格

基本数据类型

  • 采用plintpluint代替intunsigned 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
    2
    A* object1 = new A;
    A* object2 = object1->clone();
  • 在编写继承了Palabos类型的类时,需要实现这个方法。幸运的是,方法克隆总是具有完全相同的形状:

    1
    2
    3
    A* A::clone() const {
    return new A(*this);
    }

矩阵

  • 大数据集采用PalabosBlockLattice类型

    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
    5
    plint 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.hmyNewModel.hh,包含一个类MyNewDynamics,它继承自IsoThermalBulkDynamics,并定义了与BGKdynamics相同的三个方法,适合您的情况。
    • 这个实现很简洁:它不会与更新的Palabos版本的更新冲突,并且您可以通过交换两个文件与同事共享它;
    • 新文件可以位于任何本地目录中,独立于Palabos目录树。只要确保在Makefile的关键字includePaths下添加这个目录,这样就可以在编译过程中找到它。

Palabos的哪些部分是可扩展的?

  • 粗略地说,有三种扩展Palabos的方法;

    • 写一个新的动力学类;
    • 写一个新的数据处理器;
    • 写一个新的晶格描述符。

    动力学类用于定义新的局部碰撞步骤,而新的晶格描述符意味着新的晶格拓扑(离散速度,权重等),而数据处理器用于其他一切。

  • 好消息是,Palabos的可扩展部分提供了很大的灵活性。以单组分多相非混相多组分流体二维Shan/Chen模型实现和三维Shan/Chen模型实现为例。这只是通过编写一个新的晶格描述符和一个新的数据处理器来实现的,而不需要修改Palabos的任何结构部分。而且,生成的源代码的大小只占整个项目的1%。