本算例的特点:Boussinesq假设,应用了data processor的概念。本例中用data processor创建初始流场条件,并触发不稳定性
头文件
使用双分布方程,需要定义两个格子。
#include <cstdlib>
#include <iostream>
#include "palabos3D.h"
#include "palabos3D.hh"
using namespace plb;
using namespace std;
typedef double T;
#define NSDESCRIPTOR descriptors::ForcedD3Q19Descriptor
#define ADESCRIPTOR descriptors::AdvectionDiffusionD3Q7Descriptor
#define ADYNAMICS AdvectionDiffusionBGKdynamics
#define NSDYNAMICS GuoExternalForceBGKdynamics
初始温度场定义
IniTemperatureRayleighBenardProcessor3D
由BoxProcessingFunctional3D_L继承得到初始温度场的类IniTemperatureRayleighBenardProcessor3D。需要重新定义构造函数,process函数,clone函数,getTypeOfModification函数,appliesTo函数。其中,process函数,clone函数,getTypeOfModification函数必须要重新定义。
构造函数:接收一个RayleighBenardFlowParam类型的对象parameters,其中包含着Ra数,Pr数,特征速度,高温低温,分辨率(应该是每米需要多少个点),长宽高。
process函数:根据流场内每个点的温度,为每个BlockLattice中的Cell赋初值。
clone函数:Palabos中建议创建类时定义clone函数,以便满足一个对象一个指针的特点。
getTypeOfModification函数:定义需要修改的变量。此处选择为staticVariables,即分布函数和externals(?)
applieTo函数:定义需要修改的位置。此处选择bulkAndEnvelope,即内部以及边界全部修改。
struct IniTemperatureRayleighBenardProcessor3D :
public BoxProcessingFunctional3D_L<T, adDescriptor> {
IniTemperatureRayleighBenardProcessor3D(
RayleighBenardFlowParam<T, nsDescriptor, adDescriptor> parameters_) :
parameters(parameters_)
{
}
virtual void process(Box3D domain, BlockLattice3D<T, adDescriptor> &adLattice)
{
Dot3D absoluteOffset = adLattice.getLocation();
for (plint iX = domain.x0; iX <= domain.x1; ++iX) {
for (plint iY = domain.y0; iY <= domain.y1; ++iY) {
for (plint iZ = domain.z0; iZ <= domain.z1; ++iZ) {
plint absoluteZ = absoluteOffset.z + iZ;
T temperature = parameters.getHotTemperature()
- parameters.getDeltaTemperature() / (T)(parameters.getNz() - 1)
* (T)absoluteZ;
Array<T, adDescriptor<T>::d> jEq(0., 0., 0.);
adLattice.get(iX, iY, iZ).defineDensity(temperature);
iniCellAtEquilibrium(adLattice.get(iX, iY, iZ), temperature, jEq);
}
}
}
}
virtual IniTemperatureRayleighBenardProcessor3D<T, nsDescriptor, adDescriptor> *clone() const
{
return new IniTemperatureRayleighBenardProcessor3D<T, nsDescriptor, adDescriptor>(*this);
}
virtual void getTypeOfModification(std::vector<modif::ModifT> &modified) const
{
modified[0] = modif::staticVariables;
}
virtual BlockDomain::DomainT appliesTo() const
{
return BlockDomain::bulkAndEnvelope;
}
private:
RayleighBenardFlowParam<T, nsDescriptor, adDescriptor> parameters;
};
引入不稳定性
与IniTemperatureRayleighBenardProcessor3D类似,PerturbTemperatureRayleighBenardProcessor3D同样继承了BoxProcessingFunctional3D_L,并重新定义了构造函数,process函数,clone函数,getTypeOfModification函数。
其中process函数有所修改,即将(lx/2,ly/2,lz)点Cell的初始值进行修改,造成初始不稳定性。
struct PerturbTemperatureRayleighBenardProcessor3D :
public BoxProcessingFunctional3D_L<T, adDescriptor> {
PerturbTemperatureRayleighBenardProcessor3D(
RayleighBenardFlowParam<T