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的计算。

在循环过程中,下面存在这个步骤,是为在循环过程中计算rhobar和j,此点与movingwall算例中的一个集成内部数据处理器作用一样,因为BoxRhoBarJfunctional3D就是每一循环时间步长做一次computeRhoBarJ,需要注意一下,算例这里因为定义时有&这个取地址符号,如fields.push_back(&j);,以完成每时间步长的ExternalRhoJcollideAndStream3D更新。

computeRhoBarJ(lattice2, rhoBar, j, lattice2.getBoundingBox());
integrateProcessingFunctional(
            new BoxRhoBarJfunctional3D<T,DESCRIPTOR>(),
            lattice->getBoundingBox(), rhoBarJarg, 2);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值