OpenFoam | 全面解析sprayFoam | 一、对象parcels属于哪个类

sprayFoam作为一个耦合了欧拉、拉格朗日方法的求解,粒子部分的实现在主程序中写的很简单,只有短短两行,即:

// Store the particle positions
parcels.storeGlobalPositions();

......

parcels.evolve();

那么要如何追溯粒子模型呢?

可见,主程序中不管调用了什么函数,都只用到了parcels这一个对象,所以关键在于弄懂parcels是属于什么类型的,这样才有可能知道调用了哪个类的storeGlobalPositions()和evolve()函数。

parcels的定义在createClouds.H中,代码如下:

Info<< "\nConstructing reacting cloud" << endl;
basicSprayCloud parcels
(
    "sprayCloud",
    rho,
    U,
    g,
    slgThermo
);

可见parcels是basicSprayCloud类的数据成员,并把"sprayCloud"传给了basicSprayCloud构造函数的第一个形参。

而basicSprayCloud类在lagrangian\spray\clouds\derived\basicSprayCloud\basicSprayCloud.H中有所说明,代码如下:

namespace Foam
{
    typedef SprayCloud
    <
        ReactingCloud
        <
            ThermoCloud
            <
                KinematicCloud
                <
                    Cloud
                    <
                        basicSprayParcel
                    >
                >
            >
        >
    > basicSprayCloud;
}

 由上可知,basicSprayCloud等价于SprayCloud<......>,故在声明parcels这个对象的时候,便首先调用了SprayCloud的构造函数。该类的构造函数的声明和定义的代码如下:

// src\lagrangian\spray\clouds\Templates\SprayCloud\SprayCloud.H

template<class CloudType>
class SprayCloud
:
    public CloudType,
    public sprayCloud
{
    ...
    //- Construct given carrier gas fields
    SprayCloud
    (
        const word& cloudName,
        const volScalarField& rho,
        const volVectorField& U,
        const dimensionedVector& g,
        const SLGThermo& thermo,
        bool readFields = true
    );
    ...
}

// src\lagrangian\spray\clouds\Templates\SprayCloud\SprayCloud.C

template<class CloudType>
Foam::SprayCloud<CloudType>::SprayCloud
(
    const word& cloudName,
    const volScalarField& rho,
    const volVectorField& U,
    const dimensionedVector& g,
    const SLGThermo& thermo,
    bool readFields
)
:
    CloudType(cloudName, rho, U, g, thermo, false),
    sprayCloud(),
    cloudCopyPtr_(nullptr),
    averageParcelMass_(0.0),
    atomizationModel_(nullptr),
    breakupModel_(nullptr)
{
    ...
}

从这里可以得到以下信息

  1. 类SprayCloud是继承于模板类的,即ReactingCloud;以此类推,ReactingCloud继承于ThermoCloud,ThermoCloud继承于KinematicCloud……其中,ReactingCloud、ThermoCloud、KinematicCloud的.C和.H写在了src\lagrangian\intermediate\clouds\Templates中,Cloud的.C和.H写在了src\lagrangian\basic\Cloud中。
  2. "sprayCloud"传给了形参cloudName。
  3. 在上面构造函数的数据成员初始化表(即冒号":"后对应的初始化表)中,又调用了CloudType即ReactingCloud的构造函数。以此类推,依次调用了SprayCloud、ReactingCloud、ThermoCloud、KinematicCloud、Cloud、basicSprayParcel的构造函数,但cloudName一直是sprayCloud。

那么这里的basicSprayParcel又指什么呢?

在src\lagrangian\spray\parcels\derived\basicSprayParcel\basicSprayParcel.H中可找到答案,定义如下:

namespace Foam
{
    typedef SprayParcel
    <
        ReactingParcel
        <
            ThermoParcel
            <
                KinematicParcel
                <
                    particle
                >
            >
        >
    > basicSprayParcel;

    template<>
    inline bool contiguous<basicSprayParcel>()
    {
        return false;
    }
}

综上,我们可以这样理解,parcels这个对象其实是下面这个类的成员

SprayCloud
    <
        ReactingCloud
        <
            ThermoCloud
            <
                KinematicCloud
                <
                    Cloud
                    <
                        SprayParcel
                        <
                            ReactingParcel
                            <
                                ThermoParcel
                                <
                                    KinematicParcel
                                    <
                                        particle
                                    >
                                >
                            >
                        >
                    >
                >
            >
        >
    >
parcels

记在后面:

深究OpenFOAM代码的学习资料真的是少之又少,希望本系列博客会予人帮助。

这次先写到这里了,我也是边学边写,这个系列一定会继续写下去的,只是下一记什么时候写出来还说不好,希望早一点吧!

最后,如果大佬发现哪里我写的有问题请及时联系我,我会加以修改!希望不要误导新人(虽然我也是个新人哈哈)

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值