Palabos算例解读:cavity3d.cpp From /codesByTopic/externalMacroscopicVariables/
作者:互联网
我们要想做理想的LBM模拟,往往中间涉及到很多其他操作,比如外部变量,耦合等等,这个算例提供了很好的展示。
从int main看起,
定义了变量,lattice1,lattice2,边界条件后,通过cavitySetup将其初始化。
接下来定义了lattice2RhoBarJparam
,显然它就是我们可以操作的地方。
MultiScalarField3D<T> rhoBar(lattice2);
MultiTensorField3D<T,3> j(lattice2);
std::vector<MultiBlock3D*> lattice2RhoBarJparam;
lattice2RhoBarJparam.push_back(&lattice2);
lattice2RhoBarJparam.push_back(&rhoBar);
lattice2RhoBarJparam.push_back(&j);
computeRhoBarJ(lattice2, rhoBar, j, lattice2.getBoundingBox());
下面有一个computeRhoBarJ,这里调用的是下面代码
template<typename T, template<typename U> class Descriptor>
void computeRhoBarJ( MultiBlockLattice3D<T,Descriptor>& lattice,
MultiScalarField3D<T>& rhoBar, MultiTensorField3D<T,3>& j, Box3D domain )
{
std::vector<MultiBlock3D*> fields;
fields.push_back(&lattice);
fields.push_back(&rhoBar);
fields.push_back(&j);
applyProcessingFunctional (
new BoxRhoBarJfunctional3D<T,Descriptor>, domain, fields );
}
这里我之前的博文有介绍,它的作用是根据分布函数f计算出rhobar和j,并返回这两个值。
逻辑上应该是在cavitySetup(lattice2, parameters, *boundaryCondition)的时候,有initializeAtEquilibrium的过程,所以才用feq得到rhobar和j赋值。
接下来是利用ExternalRhoJcollideAndStream3D将lattice2集成到内部处理器中,level为-1。它的作用前文已述,即对lattice2进行一次collideAndStream。
integrateProcessingFunctional( new ExternalRhoJcollideAndStream3D<T,DESCRIPTOR>,
lattice2.getBoundingBox(), lattice2RhoBarJparam, -1 );
它的循环过程中,首先对lattice进行collideAndStream,接着对lattice2执行level为-1的内部处理器,后面lattice2.executeInternalProcessors()
在这里没有作用,因为它正常是按顺序从0往上依次执行内部处理器,算例里没有其他相关数据处理器的定义。
// Execute a time iteration.
lattice.collideAndStream();
lattice2.executeInternalProcessors(-1);
lattice2.executeInternalProcessors();
而在Movingwall的IBM算例里,作者就大量地运用了这种integrateProcessingFunctional来进行j和g的计算。
标签:externalMacroscopicVariables,cavity3d,fields,算例,back,lattice2RhoBarJparam,push,r 来源: https://blog.csdn.net/qq_40259141/article/details/110106371