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. KEpsilon.C中k定义时使用的autoCreateK("k", mesh_)函数含义?

KEpsilon.C中k定义时使用的autoCreateK("k", mesh_)函数含义?

已定时 已固定 已锁定 已移动 OpenFOAM
3 帖子 2 发布者 2.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • S 离线
    S 离线
    strive_DUT
    写于2020年12月30日 07:46 最后由 李东岳 编辑 2020年12月30日 16:24
    #1

    最近在看湍流模型代码,发现一个小问题:比如在kEpsilon.C文件关于湍动能k的的定义:
    OpenFOAM的版本中(3.0以上)

    k_
        (
            IOobject
            (
                IOobject::groupName("k", U.group()),
                this->runTime_.timeName(),
                this->mesh_,
                IOobject::MUST_READ,
                IOobject::AUTO_WRITE
            ),
            this->mesh_
        ),
    

    foam-extend版本中(4.1)

    k_
        (
            IOobject
            (
                "k",
                runTime_.timeName(),
                U_.db(),
                IOobject::NO_READ,
                IOobject::AUTO_WRITE
            ),
            autoCreateK("k", mesh_)
        ),
    

    可以发现,OpenFOAM中k为MUST_READ,而foam-extend中k为NO_READ,但存在一个autoCreateK("k", mesh_)函数,其定义在backwardsCompatibilityWallFunctions.C中,代码如下:

    tmp<volScalarField> autoCreateK
    (
    const word& fieldName,
    const fvMesh& mesh
    )
    {
    return
    autoCreateWallFunctionField
    <
    scalar,
    RASModels::kqRWallFunctionFvPatchField<scalar>
    >
    (
    fieldName,
    mesh,
    mesh
    );
    }

    backwardsCompatibilityWallFunctionsTemplates.C中有autoCreateWallFunctionField的定义:

    template<class Type, class PatchType>
    tmp<GeometricField<Type, fvPatchField, volMesh> >
    autoCreateWallFunctionField
    (
    const word& fieldName,
    const fvMesh& mesh,
    const objectRegistry& obj
    )
    {
    IOobject mutHeader
    (
    "mut",
    mesh.time().timeName(),
    obj,
    IOobject::MUST_READ
    );
    typedef GeometricField<Type, fvPatchField, volMesh> fieldType;//起了一个别名: fieldType
    if (mutHeader.headerOk())//如果找到了文件路径,并读取了文件头,则为true
    {
    return tmp<fieldType>
    (
    new fieldType
    (
    IOobject
    (
    fieldName,
    mesh.time().timeName(),
    obj,
    IOobject::MUST_READ,
    IOobject::NO_WRITE,
    false
    ),
    mesh
    )
    );
    }
    else //如果没有找到文件路径,或无法读取文件头,返回一个新的场
    {
    Info<< "--> Upgrading " << fieldName
    << " to employ run-time selectable wall functions" << endl;
    // Read existing field
    IOobject ioObj
    (
    fieldName,
    mesh.time().timeName(),
    obj,
    IOobject::MUST_READ,
    IOobject::NO_WRITE,
    false
    );
    tmp<fieldType> fieldOrig
    (
    new fieldType
    (
    ioObj,
    mesh
    )
    );
    // rename file
    Info<< " Backup original " << fieldName << " to "
    << fieldName << ".old" << endl;
    mvBak(ioObj.objectPath(), "old");
    PtrList<fvPatchField<Type> > newPatchFields(mesh.boundary().size());
    forAll(newPatchFields, patchI)
    {
    if (mesh.boundary()[patchI].isWall())
    {
    newPatchFields.set
    (
    patchI,
    new PatchType
    (
    mesh.boundary()[patchI],
    fieldOrig().dimensionedInternalField()
    )
    );
    newPatchFields[patchI] == fieldOrig().boundaryField()[patchI];
    }
    else
    {
    newPatchFields.set
    (
    patchI,
    fieldOrig().boundaryField()[patchI].clone()
    );
    }
    }
    tmp<fieldType> fieldNew
    (
    new fieldType
    (
    IOobject
    (
    fieldName,
    mesh.time().timeName(),
    obj,
    IOobject::NO_READ,
    IOobject::NO_WRITE,
    false
    ),
    mesh,
    fieldOrig().dimensions(),
    fieldOrig().internalField(),
    newPatchFields
    )
    );
    Info<< " Writing updated " << fieldName << endl;
    fieldNew().write();
    return fieldNew;
    }
    }

    问题:对于autoCreatek函数具体实现的功能还是不太明了,另外,函数

    autoCreateWallFunctionField
    <scalar, RASModels::kqRWallFunctionFvPatchField<scalar> > 
    (fieldName, mesh, mesh);
    

    是什么形式,<>内代表什么意思?
    特向各位同行请教:xinxin:

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于2020年12月30日 08:27 最后由 编辑
    #2

    这是模板的使用

    autoCreateWallFunctionField
    <scalar, RASModels::kqRWallFunctionFvPatchField<scalar> > 
    (fieldName, mesh, mesh);
    

    和

    template<class Type, class PatchType>
    tmp<GeometricField<Type, fvPatchField, volMesh> >

    是对应的,第一个scalar对应Type,第二个RASModels::kqRWallFunctionFvPatchField<scalar>对应PatchType。

    所以你这么写应该也是可以的:

    autoCreateWallFunctionField
    <一个类型, 一个类型> 
    (fieldName, mesh, mesh);
    

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    S 1 条回复 最后回复 2020年12月30日 09:22
  • S 离线
    S 离线
    strive_DUT
    在 2020年12月30日 09:22 中回复了 李东岳 最后由 编辑
    #3

    @李东岳 谢谢李老师!这是调用函数模板的一种形式吧。此问题已解决!但关于autoCreatek函数的实现功能还是不太明白:mihu:

    1 条回复 最后回复
2020年12月30日 07:46

1/3

2020年12月30日 07:46

2020年12月30日 09:22
  • 登录

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