作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。
Palabos User Guide
Release 1.0 r1
Copyright © 2019 University of Geneva
Jul 05, 2019
Chapter Eight
问题设置
8.1 分配dynamics对象
首先block-lattice会分配一个默认值的dynamics到所有的格子里,主要是避免有的格子里没有dynamics对象导致bug,这种所谓的dynamics对象叫做 background dynamics。
正常而言,当你生成一个block-lattice时,你必须分配dynamics对象进去,来实现你想要的碰撞类型。
如下面的代码:
// Construct a new block-lattice with a background-dynamics of type BGK.
MultiBlockLattice3D<T,DESCRIPTOR> lattice( nx, ny, nz,
new BGKdynamics<T,DESCRIPTOR>(omega) );
当然,你肯定会需要调整一些局部的格子状态,在palabos里每个格子的dynamics对象都可以再定义的,这种再定义,需要你为所有格子再生成一个单独的dynamics对象copy,以这种方式来覆盖background dynamics。
假如说你强行修改一个cell中的dynamics对象,其他地方都会变的,因为创建block-lattice的时候只会生成一份dynamics object,其他格子都会参考这同一份,由此你用的dynamics对象一定不要与background dynamics相同。
lattice.get(0,0,0).getDynamics().setOmega(newOmega);
像上面这行代码,会影响到所有格子的松弛参数。松弛参数omega储存于dynamics中,而不在格子上。正是因为这种特性,让多个格子对应着相同的对象,只能创个新的block-lattice。
// Override background-dynamics to guarantee and independent per-cell
// copy of the dynamics object.
defineDynamics( lattice, lattice.getBoundingBox(),
new BGKdynamics<T,DESCRIPTOR> );
像这种对应,如果不太满足你的需求,你可以用上面的代码,在创建block-lattice后重新定义dynamics对象,这样每个格子都有一份独立的copy了。
有许多不同的defineDynamics函数,可用于调整格子群的dynamics,可以在附录 Operation on the block-lattice 上看到。
One-cell version: Assign a new dynamics to just one cell.
Example: tutorial/tutorial2/tutorial2_3.cpp.
BoxXD version: Assign a new dynamics to all cells within a rectangular domain.
Example: showCases/multiComponent2d/rayleighTaylor2D.cpp, or the 3d example.
DotListXD version: Assign a new dynamics to several cells, listed individually in a dot-list structure.
Example: codesByTopic/dotList/cylinder2d.cpp
35
Palabos User Guide, Release 1.0 r1
Domain-functional version: Provide an analytical function which indicates the coordinates of cells which get a new
dynamics object.
Example: showCases/cylinder2d/cylinder2d.cpp
Bool-mask version: Specify the location of cells which get a new dynamics object through a Boolean mask, represented through a scalar-field.
Example: codesByTopic/io/loadGeometry.cpp
8.2 初始化密度和速度
常见的做法是,通过给每个格子生成平衡分布方程来初始化密度和速度。
但依赖时间的benchmark problems就特别依赖初始状态,大多数情况下会以一个合理的初始值开始模拟。
initializeAtEquilibrium函数(附录 Operation on the block-lattice)可在方形区域内初始化平衡分布。它有两个好处,一是域内保持密度和速度为常量(如例子examples/showCases/
cavity2d or 3d),二是用户通过自定义的函数来定宏观数值的空间相关值。(如例子examples/showCases/poiseuille)
如果你想换个方法初始化,你可以在 Convenience wrappers for local operations(16.2节)这一节中找到单格子函数与索引的单格子函数,了解自定义的格子算子。