Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 关于lagrangian求解器里preEvolve()的实现

关于lagrangian求解器里preEvolve()的实现

已定时 已固定 已锁定 已移动 OpenFOAM
2 帖子 1 发布者 2.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • J 离线
    J 离线
    JqBu
    写于 最后由 编辑
    #1

    在研究sprayFoam求解器整个运行机制的时候,遇到了这样一个问题,
    在KinematicCloud.C中运行了这样一句话:

    functions_.preEvolve();
    

    而functions_是CloudFunctionObjectList<KinematicCloud<CloudType>>这个类的数据成员。那么在CloudFunctionObjectList类中,preEvolve函数被下面语句定义。

    template<class CloudType>
    void Foam::CloudFunctionObjectList<CloudType>::preEvolve()
    {
        forAll(*this, i)
        {
            this->operator[](i).preEvolve();		
        }
    }
    

    在这里有两个疑问:
    1.关于operator[]重载的说明:

    首先,this指针指向了functions_对象,属于类CloudFunctionObjectList,而类CloudFunctionObjectList继承于PtrList,PtrList继承于UPtrList,故调用了UPtrList里的operator函数。那么this->operator.preEvolve()就等价于functions_[i].preEvolve()(但这里的operator[](cosnt label i)不是virtual,而是inline,这样子类CloudFunctionObjectList可以调用UPtrList的operator吗?)

    template<class T>
    inline const T& Foam::UPtrList<T>::operator[](const label i) const
    {
        if (!ptrs_[i])
        {
            FatalErrorInFunction
                << "hanging pointer at index " << i
                << " (size " << size()
                << "), cannot dereference"
                << abort(FatalError);
        }
    
        return *(ptrs_[i]);
    }
    

    请问这样理解正确吗?

    2.this->operator.preEvolve();里的preEvolve()函数又在执行哪个preEvolve()函数呢?

    this->operator.preEvolve()就等价于functions_[i].preEvolve(),在调用KinematicCloud的对象时会调用KinematicCloud的构造函数,实现对functions_的初始化,通过初始化的结果选择用哪个preEvolve函数

    template<class CloudType>
    Foam::KinematicCloud<CloudType>::KinematicCloud
    (
        const word& cloudName,
        const volScalarField& rho,
        const volVectorField& U,
        const volScalarField& mu,
        const dimensionedVector& g,
        bool readFields
    )
    :
        CloudType(rho.mesh(), cloudName, false),
        kinematicCloud(),
        cloudCopyPtr_(nullptr),
        mesh_(rho.mesh()),
        particleProperties_
        (
            IOobject
            (
                cloudName + "Properties",                        // 若为sprayFoam的程序,则为sprayCloudProperties
                rho.mesh().time().constant(),
                rho.mesh(),
                IOobject::MUST_READ_IF_MODIFIED,
                IOobject::NO_WRITE
            )
        ),
        outputProperties_
        (
            IOobject
            (
                cloudName + "OutputProperties",
                mesh_.time().timeName(),
                "uniform"/cloud::prefix/cloudName,
                mesh_,
                IOobject::READ_IF_PRESENT,
                IOobject::NO_WRITE
            )
        ),
        solution_(mesh_, particleProperties_.subDict("solution")),
        constProps_(particleProperties_),
        subModelProperties_
        (
            particleProperties_.subOrEmptyDict("subModels", solution_.active())
        ),
    
       ...
    
        functions_
        (
            *this,
            particleProperties_.subOrEmptyDict("cloudFunctions"),    // 通常在*CloudProperties文件最下面,会有cloudFunctions{}的内容,functions_则读取里面的信息
            solution_.active()
        ),
    

    但经搜索,在lagrangian/intermediate/submodels/CloudFunctionObjects/文件夹下只有VoidFraction,ParticleTrap,ParticleTracks,ParticleErosion这几个类里定义了preEvolve函数,而of自带tut里并非只用到了这几个fucntion,例如在lagrangian/reactingParcelFoam/verticalChannelLTS/constant/reactingCloud1Properties里,既有particleTracks1,又有patchPostProcessing1,那么patchPostProcessing1是如何实现的呢?

    1 条回复 最后回复
  • J 离线
    J 离线
    JqBu
    写于 最后由 编辑
    #2

    关于第一个问题,这里再回答一下,派生类可以调用基类的成员函数,virtual是用来重载函数的,但是这里派生类并没有重载operator,所以不需要用virtual,inline就可以

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]