Palabos_rayleighBenard3D解读

本文档详细介绍了使用Palabos库在3D环境中模拟Rayleigh-Bénard问题的过程,包括初始温度场的设置、引入不稳定性、流场初始化和主函数的实现。通过IniTemperatureRayleighBenardProcessor3D和PerturbTemperatureRayleighBenardProcessor3D类定义,结合RayleighBenardFlowParam参数,实现了温度场和速度场的初始化。在主函数中,根据用户输入的Rayleigh数进行迭代计算,并在达到特定收敛条件后引入不稳定性进行下一轮迭代。
摘要由CSDN通过智能技术生成


本算例的特点: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值