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中文网

S

Samuel-Tu

@Samuel-Tu
关于
帖子
438
主题
104
群组
0
粉丝
9
关注
1

帖子

最新

  • 层流RTS调用机制简析(以simpleFoam为例)
    S Samuel-Tu

    注意到simpleFoam源码的createField.H中含有一行代码:

    singlePhaseTransportModel laminarTransport(U, phi);
    

    将类singlePhaseTransportModel实例化为laminarTransport,并且传给构造函数两个参数U和phi。
    在simpleFoam.C中找到了#include "singlePhaseTransportModel.H"。类singlePhaseTransportModel很有可能在里面定义,因此进入singlePhaseTransportModel.H。
    其路径为$FOAM_SRC/transportModels/incompressible/singlePhaseTransportModel/singlePhaseTransportModel.H,发现类singlePhaseTransportModel,及其构造函数的声明。因此进入singlePhaseTransportModel.C中查看其定义。

    Foam::singlePhaseTransportModel::singlePhaseTransportModel
    (
        const volVectorField& U,
        const surfaceScalarField& phi
    )
    :
        IOdictionary
        (
            IOobject
            (
                "transportProperties",
                U.time().constant(),
                U.db(),
                IOobject::MUST_READ_IF_MODIFIED,
                IOobject::NO_WRITE
            )
        ),
        viscosityModelPtr_(viscosityModel::New("nu", *this, U, phi))
    {}
    

    在类singlePhaseTransportModel构造前,先建立了读取constant/transportProperties的字典,并用
    viscosityModel::New返回了一个叫viscosityModelPtr_的指针。
    因此需要查看viscosityModel::New的定义。路径为$FOAM_SRC/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModelNew.C。相关代码如下:

    Foam::autoPtr<Foam::viscosityModel> Foam::viscosityModel::New
    (
        const word& name,
        const dictionary& viscosityProperties,
        const volVectorField& U,
        const surfaceScalarField& phi
    )
    {
        const word modelType(viscosityProperties.lookup("transportModel"));
    
        Info<< "Selecting incompressible transport model " << modelType << endl;
    
        auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
    
        if (!cstrIter.found())
        {
            FatalErrorInFunction
                << "Unknown viscosityModel type "
                << modelType << nl << nl
                << "Valid viscosityModels :" << endl
                << dictionaryConstructorTablePtr_->sortedToc()
                << exit(FatalError);
        }
    
        return autoPtr<viscosityModel>
            (cstrIter()(name, viscosityProperties, U, phi));
    }
    

    此函数本质是在contant/transportProperties文件中查询关键字transportModel对应的值(以Newtonian为例),并在哈希表中查看是否存在这个Newtonian。返回Newtonian在哈希表中对应的值。以我目前的学习经验来看,这个对应值应该是类Newtonian的一个临时对象,并用cstrIter()(name, viscosityProperties, U, phi)括号里的参数进行了初始化。因此需要找到类Newtonian的构造函数。路径为:$FOAM_SRC/transportModels/incompressible/viscosityModels/Newtonian/Newtonian.C

    Foam::viscosityModels::Newtonian::Newtonian
    (
        const word& name,
        const dictionary& viscosityProperties,
        const volVectorField& U,
        const surfaceScalarField& phi
    )
    :
        viscosityModel(name, viscosityProperties, U, phi),
        nu0_("nu", dimViscosity, viscosityProperties_),
        nu_
        (
            IOobject
            (
                name,
                U_.time().timeName(),
                U_.db(),
                IOobject::NO_READ,
                IOobject::NO_WRITE
            ),
            U_.mesh(),
            nu0_
        )
    {}
    

    在构造类Newtonian时先构造了类viscosityModel。注意到类viscosityModel是类Newtonian的一个父类。因此需要找到类viscosityModel的构造函数。路径为:$FOAM_SRC/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModel.C

    Foam::viscosityModel::viscosityModel
    (
        const word& name,
        const dictionary& viscosityProperties,
        const volVectorField& U,
        const surfaceScalarField& phi
    )
    :
        name_(name),
        viscosityProperties_(viscosityProperties),
        U_(U),
        phi_(phi)
    {}
    

    类viscosityModel的构造函数实际是将形参用于name_,viscosityProperties_,U_和phi_初始化了。这里的viscosityProperties_由于被类Newtonian继承,在类Newtonian的构造函数中可以看见nu0_使用了viscosityProperties_进行初始化。而viscosityProperties_的本质实际就是

     IOdictionary
        (
            IOobject
            (
                "transportProperties",
                U.time().constant(),
                U.db(),
                IOobject::MUST_READ_IF_MODIFIED,
                IOobject::NO_WRITE
            )
        ),
    

    返回看nu0_的初始化:

    nu0_("nu", dimViscosity, viscosityProperties_)
    

    实际是读取constant/transportProperties文件里的nu关键字对应的dimensionedScalar。
    而nu_

        nu_
        (
            IOobject
            (
                name,
                U_.time().timeName(),
                U_.db(),
                IOobject::NO_READ,
                IOobject::NO_WRITE
            ),
            U_.mesh(),
            nu0_
        )
    

    nu_则是以nu0_这个dimensionedScalar构建了一个volScalarField。


  • nearestPoint的问题
    S Samuel-Tu

    此贴基本完结,按着源代码琢磨了一下午,基本弄清楚了是如何计算的。nearestPoint()主要使用了实时碰撞检测算法,可以计算出网格中心点到一个面的最短距离。这个最短距离是通过寻找面上离网格中心点的最近点来计算的。等我过段时间总结好了,到时候再补充到这个贴子下面。


  • of1806中的epsilonWallFunction是否合并了LowRe的模型?
    S Samuel-Tu

    在头文件找到了描述:The low-Re correction is activated by setting the entry lowReCorrection to 'on'; in this mode the model switches between laminar and turbulent functions based on the laminar-to-turbulent y+ value derived from kappa and E. When the lowReCorrection is inactive, the wall function operates in high-Re mode.可能是在constant文件里使用这epsilonWallFunction的时候能够选择打不打开LowRe

  • 登录

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