@bestucan 谢谢老师,我试了下,还是不行~
他是由于none量 他把它删了,看来我的问题就是那个omega,只要用
const volScalarField& omega_ =
(
this->mesh_.objectRegistry::template
lookupObject<volScalarField>("omega")
);
就会找不到,估计是结构问题,难道只能重写了。
@bestucan 谢谢老师,我试了下,还是不行~
他是由于none量 他把它删了,看来我的问题就是那个omega,只要用
const volScalarField& omega_ =
(
this->mesh_.objectRegistry::template
lookupObject<volScalarField>("omega")
);
就会找不到,估计是结构问题,难道只能重写了。
@bestucan
谢谢老师的耐心解答 ,我之前想达到的理想效果是:
建立个 一次性的Omega场 让第一个循环运行起来后注销,后面的omega场是原湍流模型里的。
在线性项中加入,会可能出现老师说的情况,每轮都会重新新建。
求解器运行时,按照createFields.H中的顺序建立许多场,然后读取湍流模型的智能指针,我有个想法:如果有能注销IOobject的建立场命令吗 ,我在createFields中建立这种一次性的omega!
如果没发做到,按照我的编写似乎没发在linearstress运行前注册进去Omega,似乎这种硬植入是无解的
@chen_hao 在 每个时间步文件夹下没有数据写入,求大神! 中说:
我在linearViscousStress.H中需要引用omega(SSTkomega.C中的)变量,然后我这样引用:
const volScalarField& omega_ = ( this->mesh_.objectRegistry::template lookupObject<volScalarField>("omega") );
编译没问题,但当我运行求解器时,会出现:
--> FOAM FATAL ERROR: request for volScalarField omega from objectRegistry region0 failed available objects of type volScalarField are 15 ( sigmaMag alphas nu.pos muMag_0 rho nu.molten p_rgh nu alpha.molten nu.neg muMag rho_0 alpha.neg alpha.pos sigmaMag_0 )
即objectRegistry region0此时没有omega注册,我分析原因:执行求解器的时候linearViscousStress.C先执行,此时omega还没注册进表里,显示找不到它,我现在在linearViscousStress.C的引用以前加入:
omega ( IOobject ( IOobject::groupName("omega", alphaRhoPhi.group()), //"omega", runTime.timeName(), //way--time mesh, //objectRegistry---region0(fvmesh) IOobject::MUST_READ, //regIOobject IOobject::AUTO_WRITE //regIOobject ), mesh ); const volScalarField& omega_ = ( this->mesh_.objectRegistry::template lookupObject<volScalarField>("omega") );
求解器可以运行,也omage也正常迭代,
但在每个时间步文件夹下,omage文件始终保持0文件下的状态,没有数据写入,所以不知为何?
我相当于IOobject了两次omega变量(其中SSTkomegabase.C本身自带一次,自己人为添加一次),是这个原因吗?
@李东岳 @bestucan 想问下怎么把一个注册到某个objectRegistry的物理量从其中 删除注销 有没有办法 我看regIOobject里有checkOut()函数,不知道能不能实现
@尚善若水
谢谢, 你是放在controlDict中吗?
@尚善若水
唯独omega没有输出,其他正常,我看有求解器程序中有runTime.write()
我单独加omega的话该怎么写
我在linearViscousStress.H中需要引用omega(SSTkomega.C中的)变量,然后我这样引用:
const volScalarField& omega_ =
(
this->mesh_.objectRegistry::template
lookupObject<volScalarField>("omega")
);
编译没问题,但当我运行求解器时,会出现:
--> FOAM FATAL ERROR:
request for volScalarField omega from objectRegistry region0 failed
available objects of type volScalarField are
15
(
sigmaMag
alphas
nu.pos
muMag_0
rho
nu.molten
p_rgh
nu
alpha.molten
nu.neg
muMag
rho_0
alpha.neg
alpha.pos
sigmaMag_0
)
即objectRegistry region0此时没有omega注册,我分析原因:执行求解器的时候linearViscousStress.C先执行,此时omega还没注册进表里,显示找不到它,我现在在linearViscousStress.C的引用以前加入:
omega
(
IOobject
(
IOobject::groupName("omega", alphaRhoPhi.group()),
//"omega",
runTime.timeName(), //way--time
mesh, //objectRegistry---region0(fvmesh)
IOobject::MUST_READ, //regIOobject
IOobject::AUTO_WRITE //regIOobject
),
mesh
);
const volScalarField& omega_ =
(
this->mesh_.objectRegistry::template
lookupObject<volScalarField>("omega")
);
求解器可以运行,也omage也正常迭代,
但在每个时间步文件夹下,omage文件始终保持0文件下的状态,没有数据写入,所以不知为何?
我相当于IOobject了两次omega变量(其中SSTkomegabase.C本身自带一次,自己人为添加一次),是这个原因吗?
注册omega如下,有地方不理解:
omega_
(
IOobject
(
IOobject::groupName("omega", alphaRhoPhi.group()),
this->runTime_.timeName(),
this->mesh_,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
this->mesh_
)
IOobject::groupName("omega", alphaRhoPhi.group()) 知道是定义omage的name,但是 后面这个alphaRhoPhi.group(),是起到什么作用呢?
如果我定义成:
omega_
(
IOobject
(
"omega",
this->runTime_.timeName(),
this->mesh_,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
this->mesh_
)
会有什么效果无法实现?
@李东岳
针对 ncompressible::turbulenceModel 模板特化后的 ShihQuadraticKE 模型 ,仔细研究了一下其怎么实现非线性项的实现,发现其是在 NonlinearEddyViscosity.H 中定义 nonlinearStress_ 项,然后用 ShihQuadraticKE 作为子类继承父类 NonlinearEddyViscosity 以便在 ShihQuadraticKE.C 中直接引用omega_。
但由于我修改的是SSTkomegabase.H( 继承于TurbulenceModel类 )与 linearViscousStrss.H ( 继承于BasicturbulenceModel原则类 ) 没有特例化,不能简单类似上面的ShihQuadraticKE 模型。需要从新仿造框架,是一项大工程!
我的策略是:在现有的文件上直接硬植入,简单很多,毕竟涉及到湍流模型的类错综复杂,针对找不到omega,按照我的分析应该是对的,运行求解器时linearViscousStrss.C先运行此时并未运行SSTkomegabase.C 所以没有omega场注册,找不到他,所以我在creatfield.H中IOobject一下omega场,目前可以算了,结果还未检查,不知道我的理解有没有问题。
@李东岳
谢谢老师,已经帮我很多了,记录下来,也可以帮助其他人
液态电池在一定的电压下,中间的电介质层会失稳,过程如下:
失稳这个过程我要采用湍流模型来算,但他是从静止开始的,我无法直接
用湍流模型,我有以下两种思路:
1、我目前采用了一个转捩模型,但对于这用流动不知道算不算严格的层流到湍流
2、异想天开:采用DNS当雷诺数到达一定值就采用湍流模型 可能实现吗?
还有其他解决办法吗 引用: 湍流模型计算层流转变为湍流 看东岳老师提了一个用湍流计算层流很有意思,具体是怎么实现呢?
希望有相关经验的可以跟我交流。
@chen_hao
自回复,如果论文中源项公式没错的话,按部就班导入进来就会有量纲问题,
解决办法:不要纠结,计算好源项量纲直接除一个带量纲的标量1即可。
希望可以给大家节省时间。
dimensionedScalar I1
(
"I1",
dimDensity,
1
);
fvm::SuSp(0.1*alpha()*rho()*Scmag()/k_(), omega_)
自己添加这一部分算下来确实如错误所示 [1,-3,-2,0,0,0,0]
fvm::SuSp((2.0/3.0)*alpha()*rho()*gamma*divU, omega_)
不理解的是这一部分 alpha gamma 无量纲,rho [1,-3,0,0,0,0,0] , divU [0,0,-1,0,0,0,0 ] , omega [0,0,-1,0,0,0,0] ,
按道理来说应该也是 [1,-3,-2,0,0,0,0],可错误显示其为 [0 0 -2 0 0 0 0],
然后omegaSource定义的量纲:
kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::omegaSource() const
{
return tmp<fvScalarMatrix>
(
new fvScalarMatrix
(
omega_,
dimVolume*this->rho_.dimensions()*omega_.dimensions()/dimTime
)
);
}
从这看是[ 1,0,-2,0,0,0,0] ???
错误如下:
--> FOAM FATAL ERROR:
incompatible dimensions for operation
[omega[0 0 -2 0 0 0 0] ] - [omega[1 -3 -2 0 0 0 0] ]
我定义量部分:
const volVectorField& B =
(
this->mesh_.objectRegistry::template
lookupObject<volVectorField>("B")
);
const volScalarField& sigmaMag =
(
this->mesh_.objectRegistry::template
lookupObject<volScalarField>("sigmaMag")
);
volScalarField Ux = U.component(0);
volScalarField Uy = U.component(1);
volScalarField Uz = U.component(2);
volScalarField Bx = B.component(0);
volScalarField By = B.component(1);
volScalarField Bz = B.component(2);
volScalarField Scmag
(
((sigmaMag/rho)*(2.0*Ux*Uy*Bx*By) + (2.0*Ux*Uz*Bx*Bz) + (2.0*Uy*Uz*Bx*By) - (Uy*Uy + Uz*Uz)*Bx*Bx - (Ux*Ux + Uz*Uz)*By*By - (Uy*Uy + Ux*Ux)*Bz*Bz)
);
加入一个fvm::susp部分:
tmp<fvScalarMatrix> omegaEqn
(
fvm::ddt(alpha, rho, omega_)
+ fvm::div(alphaRhoPhi, omega_)
- fvm::laplacian(alpha*rho*DomegaEff(F1), omega_)
==
alpha()*rho()*gamma
*min
(
GbyNu, //G
(c1_/a1_)*betaStar_*omega_()
*max(a1_*omega_(), b1_*F23()*sqrt(S2()))
)
- fvm::SuSp((2.0/3.0)*alpha()*rho()*gamma*divU, omega_)
//加入部分如下:
- fvm::SuSp(0.1*alpha()*rho()*Scmag()/k_(), omega_)
- fvm::Sp(alpha()*rho()*beta*omega_(), omega_)
- fvm::SuSp
(
alpha()*rho()*(F1() - scalar(1))*CDkOmega()/omega_(),
omega_
)
+ Qsas(S2(), gamma, beta)
+ omegaSource()
+ fvOptions(alpha, rho, omega_)
);
量纲显示差一个密度,可我计算的Scmag量 [0,2,-3,0,0,0,0] 密度没差, 莫非是方程默认除了一个rho的单位?
@chen_hao
解决了,改成了无量纲,就避免出问题:
volSymmTensorField Sij(twoSymm(tgradU())/omega_);
volTensorField Wij(2.0*skew(tgradU())/omega_);
@chen_hao 在 关于几个运算符运算后的量纲疑问 中说:
定义如下:
tensor I(1,0,0,0,1,0,0,0,1); volSymmTensorField Sij(twoSymm(fvc::grad(this->U_))); volTensorField Wij(2.0*skew(fvc::grad(this->U_)));
运算如下:
Sij&Sij - (1.0/3.0)*magSqr(Wij)*I
Sij应该是[0 0 -1 0 0 0 0],为啥 &内积 后还是[0 0 -1 0 0 0 0]?
而 magSqr(Wij) 模的平方后乘以I为啥 [0 0 -2 0 0 0 0] ?
显示错误如下,我通过排查也确实是这个地方,Sij & Sij 量纲显示为[0 0 -1 0 0 0 0 ],解释不通 难道要强行在乘一个量纲数?
--> FOAM FATAL ERROR:
LHS and RHS of - have different dimensions
dimensions : [0 0 -1 0 0 0 0] - [0 0 -2 0 0 0 0]
定义如下:
tensor I(1,0,0,0,1,0,0,0,1);
volSymmTensorField Sij(twoSymm(fvc::grad(this->U_)));
volTensorField Wij(2.0*skew(fvc::grad(this->U_)));
运算如下:
Sij&Sij - (1.0/3.0)*magSqr(Wij)*I
Sij应该是[0 0 -1 0 0 0 0],为啥 &内积 后还是[0 0 -1 0 0 0 0]?
而 magSqr(Wij) 模的平方后乘以I为啥 [0 0 -2 0 0 0 0] ?
@chen_hao 在 关于用lookupObject引用变量报错,求大佬们指点。 中说:
@bestucan @李东岳
虽然上面编译通过了,可兴致勃勃开始运行算例提示错误如下--> FOAM FATAL ERROR: request for volScalarField omega_ from objectRegistry region0 failed available objects of type volScalarField are 15 ( sigmaMag alphas nu.pos muMag_0 rho nu.molten p_rgh nu alpha.molten nu.neg muMag rho_0 alpha.neg alpha.pos sigmaMag_0 ) From function const Type& Foam::objectRegistry::lookupObject(const Foam::word&) const [with Type = Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>] in file /home/dyfluid/OpenFOAM/OpenFOAM-7/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 193.
还是关于omega_的引用问题,我在想是不是因为linearVicousStress.C是父类,而omega是在SSTbase.C中定义的(类似于子类),所以找不到?难道我要在linearVicousStress.C中重新IObject?
还是说这个引用方式有问题...但我用const volScalarField& omega_ = this->mesh_.lookupObject<volScalarField>("omega_");
会编译不通过......不知道老师们有没有想法,十分需要帮助,再次感谢老师们
我的分析原因是:执行求解器的时候linearStress.C先执行,所以此时omega还没注册进表里,显示找不到它,我现在在linearStress.C中加入一个omega的IOobject可不可行,毕竟在SST.C中还会IOobject一次,一个变量可以注册多次吗,会不会影响计算结果?
@wwzhao
老师,可以帮忙解答一下吗~
@bestucan @李东岳
虽然上面编译通过了,可兴致勃勃开始运行算例提示错误如下
--> FOAM FATAL ERROR:
request for volScalarField omega_ from objectRegistry region0 failed
available objects of type volScalarField are
15
(
sigmaMag
alphas
nu.pos
muMag_0
rho
nu.molten
p_rgh
nu
alpha.molten
nu.neg
muMag
rho_0
alpha.neg
alpha.pos
sigmaMag_0
)
From function const Type& Foam::objectRegistry::lookupObject(const Foam::word&) const [with Type = Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>]
in file /home/dyfluid/OpenFOAM/OpenFOAM-7/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 193.
还是关于omega_的引用问题,我在想是不是因为linearVicousStress.C是父类,而omega是在SSTbase.C中定义的(类似于子类),所以找不到?难道我要在linearVicousStress.C中重新IObject?
还是说这个引用方式有问题...但我用
const volScalarField& omega_ = this->mesh_.lookupObject<volScalarField>("omega_");
会编译不通过......不知道老师们有没有想法,十分需要帮助,再次感谢老师们
@bestucan
谢谢,刚才的wmake通过的太轻松了哈哈哈,还好问了一下,
果然很多错才是该有的样子。我先自己改改,有问题可能还会麻烦老师~
错误如下:
lnInclude/linearViscousStress.C: In constructor ‘Foam::linearViscousStress<BasicTurbulenceModel>::linearViscousStress(const Foam::word&, const alphaField&, const rhoField&, const volVectorField&, const surfaceScalarField&, const surfaceScalarField&, const transportModel&, const Foam::word&)’:
lnInclude/linearViscousStress.C:81:75: error: expected primary-expression before ‘>’ token
81 | const volScalarField& omega_ = this->mesh_.lookupObject<volScalarField>("omega_");
| ^
make: *** [/home/dyfluid/OpenFOAM/OpenFOAM-7/wmake/rules/General/transform:26: /home/dyfluid/OpenFOAM/OpenFOAM-7/platforms/linux64GccDPInt32Opt/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/fWallFunctions/fWallFunction/fWallFunctionFvPatchScalarField.o] Error 1
代码如下:
#include "linearViscousStress.H"
#include "fvc.H"
#include "fvm.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class BasicTurbulenceModel>
Foam::linearViscousStress<BasicTurbulenceModel>::linearViscousStress
(
const word& modelName,
const alphaField& alpha,
const rhoField& rho,
const volVectorField& U,
const surfaceScalarField& alphaRhoPhi,
const surfaceScalarField& phi,
const transportModel& transport,
const word& propertiesName
)
:
BasicTurbulenceModel
(
modelName,
alpha,
rho,
U,
alphaRhoPhi,
phi,
transport,
propertiesName
),
nonlinearStress_
(
IOobject
(
IOobject::groupName("nonlinearStress", alphaRhoPhi.group()),
this->runTime_.timeName(),
this->mesh_
),
this->mesh_,
dimensionedSymmTensor
(
"nonlinearStress",
sqr(dimVelocity),
Zero
)
)
{
tensor I(1,0,0,0,1,0,0,0,1);
volSymmTensorField S(twoSymm(fvc::grad(this->U_)));
volTensorField W(twoSkew(fvc::grad(this->U_)));
const volScalarField& omega_ = this->mesh_.lookupObject<volScalarField>("omega_");
nonlinearStress_ =
1.0/omega_
*(
S&S
- (1.0/3.0)*magSqr(W)*I
+ twoSymm(S&W)
+ (2.5)*(W&W - (1.0/3.0)*magSqr(W)*I));
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class BasicTurbulenceModel>
bool Foam::linearViscousStress<BasicTurbulenceModel>::read()
{
return BasicTurbulenceModel::read();
}
template<class BasicTurbulenceModel>
Foam::tmp<Foam::volSymmTensorField>
Foam::linearViscousStress<BasicTurbulenceModel>::devRhoReff() const
{
return volSymmTensorField::New
(
IOobject::groupName("devRhoReff", this->alphaRhoPhi_.group()),
(-(this->alpha_*this->rho_*this->nuEff()))
*dev(twoSymm(fvc::grad(this->U_)))
);
}
template<class BasicTurbulenceModel>
Foam::tmp<Foam::fvVectorMatrix>
Foam::linearViscousStress<BasicTurbulenceModel>::divDevRhoReff
(
volVectorField& U
) const
{
return
(
- fvc::div((this->alpha_*this->rho_*this->nuEff())*dev2(T(fvc::grad(U))))
- fvc::div((this->alpha_*this->rho_*this->nuEff())*nonlinearStress_ )
- fvm::laplacian(this->alpha_*this->rho_*this->nuEff(), U)
);
}
template<class BasicTurbulenceModel>
Foam::tmp<Foam::fvVectorMatrix>
Foam::linearViscousStress<BasicTurbulenceModel>::divDevRhoReff //
(
const volScalarField& rho,
volVectorField& U
) const
{
return
(
- fvc::div((this->alpha_*rho*this->nuEff())*dev2(T(fvc::grad(U))))
- fvc::div((this->alpha_*rho*this->nuEff())*nonlinearStress_ )
- fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
);
}
template<class BasicTurbulenceModel>
void Foam::linearViscousStress<BasicTurbulenceModel>::correct()
{
BasicTurbulenceModel::correct();
}
// ************************************************************************* //
在线性项里加入一个非线性部分,引用omega_出问题(omega_未在linearViscousStress文件中定义),这个引用方式是按照论坛其他帖子写的,需要怎么改正~
@李东岳
谢谢老师,大概理解this用法,这个是指向name(),还以为这个命名是起到什么作用,既然一般情况下没区别,那我就不深究了。
volScalarField::Internal GbyNu(dev(twoSymm(tgradU()())+Snl) && tgradU()());
volScalarField::Internal G(this->GName(), nut()*GbyNu);
相比于GbyNu,定义G时 这个this->Gname作用是什么?什么情况下需要这个this指针。
@李东岳
还是说这才叫引用~
const volScalarField& omega_ = this->omega_;
查了半天还是在疑惑:我需不需要在linearViscousStress.H文件中声明关于omega,还是挂个H文件就可以,问题有点低级,但希望老师能再次指点迷津。
继承类的可以直接用,但这种非继承类的......
@李东岳
哦哦,
老师所说的引用过来是指:在linearViscousStress.H文件中添加kOmegaSSTBase.H头文件(omega_定义的地方),然后在linearViscousStress.C文件里直接用对吧
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class BasicTurbulenceModel>
Foam::linearViscousStress<BasicTurbulenceModel>::linearViscousStress
(
const word& modelName,
const alphaField& alpha,
const rhoField& rho,
const volVectorField& U,
const surfaceScalarField& alphaRhoPhi,
const surfaceScalarField& phi,
const transportModel& transport,
const word& propertiesName
)
:
BasicTurbulenceModel
(
modelName,
alpha,
rho,
U,
alphaRhoPhi,
phi,
transport,
propertiesName
),
nonlinearStress_
(
IOobject
(
IOobject::groupName("nonlinearStress", alphaRhoPhi.group()),
this->runTime_.timeName(),
this->mesh_
),
this->mesh_,
dimensionedSymmTensor
(
"nonlinearStress",
sqr(dimVelocity),
Zero
)
)
{
tensor I(1,0,0,0,1,0,0,0,1);
volSymmTensorField S(twoSymm(fvc::grad(this->U_)));
volTensorField W(twoSkew(fvc::grad(this->U_)));
nonlinearStress_ =
1/omega_ //omega_???
*(
S&S
- (1/3)*magSqr(W)*I
+ twoSymm(S&W)
+ (2.5)*(W&W - (1/3)*magSqr(W)*I));
}
类似这样吗?修正直接跟在后面,那对于omega_是直接在:inearViscousStress.H文件中定义:
volScalarField omega_; 然后使用就可以吗? 麻烦老师了~
@李东岳 在 关于修改湍流模型中非线性雷诺应力项的问题 中说:
我觉得你不用这么写。你动继承肯定会有一些问题,目前也看不出来,不是很strightworrd。比较简单的是:
kOmega.H头文件不用动,你先去把tau植入到你的kOmega.C里面
计算G
去devTau函数里面把tau的非线性部分加上第一种简单一些,但有一些硬植入。就是devTau函数这块
现在我尝试采用硬植入的方式更改divDevRhoReff,原定义nonlinearEddyViscosity.H中:
protected:
// Fields
volSymmTensorField nonlinearStress_;
nonlinearEddyViscosity.C中:
nonlinearStress_
(
IOobject
(
IOobject::groupName("nonlinearStress", alphaRhoPhi.group()),
this->runTime_.timeName(),
this->mesh_
),
this->mesh_,
dimensionedSymmTensor
(
"nonlinearStress",
sqr(dimVelocity),
Zero
)
)
仿照上面,我在linearViscousStress.C中:
/ * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
tensor I(1,0,0,0,1,0,0,0,1);
volSymmTensorField S(twoSymm(fvc::grad(this->U_)));
volTensorField W(twoSkew(fvc::grad(this->U_)));
nonlinearStress_
(
IOobject
(
IOobject::groupName("nonlinearStress", alphaRhoPhi.group()),
this->runTime_.timeName(),
this->mesh_
),
this->mesh_,
dimensionedSymmTensor
(
"nonlinearStress",
sqr(dimVelocity),
1/omega_*(S&S - (1/3)*magSqr(W)*I + twoSymm(S&W) + (2.5)*(W&W - (1/3)*magSqr(W)*I))
)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class BasicTurbulenceModel>
Foam::tmp<Foam::fvVectorMatrix>
Foam::linearViscousStress<BasicTurbulenceModel>::divDevRhoReff //
(
const volScalarField& rho,
volVectorField& U
) const
{
return
(
- fvc::div((this->alpha_*rho*this->nuEff())*dev2(T(fvc::grad(U))))
-fvc::div((this->alpha_*rho*this->nuEff())* nonlinearStress_ ) //?????
- fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
);
}
疑问:这样在Constructor给 nonlinearStress_ 赋值对不对?如果可以,最棘手的是nonlinearStress_中含有一个omega_,怎么声明引用?只在上面加一个相应湍流模型的H文件就可以吗?
没系统学过c++,对改写模棱两可,希望各位能直面迷津
@李东岳
请老师看看G这部分代码可不可以这样写,
矢量场Snl有点搞不清=和()赋值,tgradU后面用不用加括号~
tmp<volTensorField> tgradU = fvc::grad(U);//tmp reload to Field
volScalarField S2(2*magSqr(symm(tgradU())));
tensor I(1,0,0,0,1,0,0,0,1);
volSymmTensorField S(twoSymm(tgradU));
volTensorField W(twoSkew(tgradU));
volTensorField Snl =
1/omega_
*(
S&S-(1/3)*magSqr(W)*I
+ twoSymm(S&W)
+ (2.5)*(W&W-(1/3)*magSqr(W)*I)
);
volScalarField::Internal GbyNu(dev(twoSymm(tgradU()())+Snl) && tgradU()());
volScalarField::Internal G(this->GName(), nut()*GbyNu);
tgradU.clear();
@李东岳
谢谢老师,虽然只是一个小建议和思路,却给我节约了大量的时间,目前已经在OF7中调通了mutiphaseInterFoam求解器。
@李东岳 谢谢老师,开辟了新思路,我在OF7中尝试植入,遇到这个编译问题,这是gcc的问题吗?
make:***[/home/dyfluid/OpenFOAM/OpenFOAM7/wmake/rules/General/transform:25: Make/linux64GccDPInt32Opt/emmultiphaseMixture.o] Error 1
编译了一个MHDmultiphaseInterFoam求解器(在OF4版本下),但想尝试的komegaSSTLM模型,在OF4中没有。无非两种解决办法:
1、把OF7中的komegaSSTLM模型拷贝到OF4中,不知道可不可行,大概需要修改哪些文件?
2、把OF4的求解器在OF7中重新编译,但我功力有限,有点不知道需要改动什么地方,简单wclean wmake 显示有很多未知的函数,感觉无从下手。
希望有老师能指点迷津,哪个方法更易行一点。自己摸索到无从下手,希望老师们能帮忙解答,感激不尽。
@李东岳
老师,像这种形式的alpha的定义,能用于多相的情况吗?
typedef typename BasicTurbulenceModel::alphaField alphaField
const alphaField& alpha
BasicTurbulenceModel这个通用类是代指的是KomegaSST?(就本例)
@李东岳 @
谢谢老师指导,我最后按照方法二,完全按照他的格式来修改的,修改到最后我发现一个问题,如下
public:
//typedef typename BasicTurbulenceModel::alphaField alphaField;
//typedef typename BasicTurbulenceModel::rhoField rhoField;
//typedef typename BasicTurbulenceModel::transportModel transportModel;
//- Runtime type information
TypeName("MHDkOmega");
// Constructors
//- Construct from components
MHDkOmega
(
//const alphaField& alpha, ????
//const rhoField& rho,
const geometricOneField& alpha,
const geometricOneField& rho,
const volVectorField& U,
const surfaceScalarField& alphaRhoPhi,
const surfaceScalarField& phi,
const transportModel& transport,
const word& propertiesName = turbulenceModel::propertiesName,
const word& type = typeName
);
其中 alpha是定义为geometricOneField也就是定义为1,可我的模型是三层液体,采用了multiphaseInterFoam求解器又基于VOF,我才意识到是不是湍流模型一般不能适用于多相的情况,这个alpha能不能修改来适用于这个求解器,担心自己做了无用功,希望老师能帮忙解答
老师,改程序中有个关于语法的问题不太确定,ShiQuadraticKE.C 中程序没有采用模板化的,但是KOmaga.C是采用模板化的,在我更改KOmaga.H文件的继承类时,我上图这个写法对不对,直接在nonlinearEddyViscosityincompressible::RASModel 中类比eddyViscosity<RASModel<BasicTurbulenceModel>>。
@李东岳
我会采用老师提供的第一种思路进行修改,感激不尽~
@xpqiu 谢谢老师的回答,ShihQuadraticKE模型是一个很好的参考!
这类模型除了修改 νt ,还需要把雷诺应力的非线性部分加上。
您所指的加上雷诺应力非线性部分就是UEqn.H中turbulence->divDevRhoReff(rho, U)项的修改对吗?
@李东岳
理解了,谢谢老师的耐心回答
@李东岳
谢谢老师夸奖。您的意思是,只需要更换KOmega中的G,目的是求解更精准的$ν_t$,从而作用到动量方程的U求解,故不需要再修改动量方程中的雷诺应力项,就可以达到效果。不知道理解的对不对,我一直在思考既然修改的话,需要两个地方统一变换,才能达到效果,希望老师能解答这个迷惑。
@李东岳
十分感谢老师的耐心回答!回复不及时请见谅,明白老师的意思了,方程转换好了(在编辑中稍等一会给您发过来),就您说的源项部分我单纯定义了一个标量场(语言基础差点),自己在尝试,请老师见谅。
@李东岳 谢谢老师对我问题的指导,理解了针对“动量方程”雷诺应力项的修改就是通过修改linearViscousStress.C。
我先介绍下我的研究方向:模拟三层液态金属组成的电池的不稳定性,随着电压增加时三层流体会发生不稳定性即湍流,目前组里采用DNS计算消耗计算资源太大,所以我需要采用湍流模型来尝试一下这个发生过程,我采用了基于磁流体修改后的K-omega模型,其需要加入磁动能源项与各项异性的雷诺应力,以下是我需要修改的非线性雷诺应力项:
我的问题是:雷诺应力也包含在kOmega.H中如下:
tmp<volTensorField> tgradU = fvc::grad(U);
volScalarField G
(
this->GName(),
nut*(tgradU() && dev(twoSymm(tgradU())))
);
tgradU.clear();
tmp<fvScalarMatrix> omegaEqn
(
fvm::ddt(alpha, rho, omega_)
+ fvm::div(alphaRhoPhi, omega_)
- fvm::laplacian(alpha*rho*DomegaEff(), omega_)
==
gamma_*alpha*rho*G*omega_/k_
- fvm::SuSp(((2.0/3.0)*gamma_)*alpha*rho*divU, omega_)
- fvm::Sp(beta_*alpha*rho*omega_, omega_)
+ fvOptions(alpha, rho, omega_)
+ fvm::SuSp(Comg_*S/k_, omega_)
);
其中G中包含线性雷诺应力,针对这个非线性雷诺应力是不是我需要同时:
1、修改动量方程中的,即通过修改linearViscousStress.C;
2、修改kOmega模型中的,即也要修改上面的G。
初学openfoam见识浅薄,希望各位老师和同学能不吝赐教。
你好,请问你修改湍流模型的雷诺应力项(跟你一样修改boussnesiq 假设)是在哪修改的?是在相应的komegaSST.C中,还是我看他们说的linearViscousStress.C?还有一直有个疑惑,相应的动量方程中这个雷诺应力项用修改吗? 不好意思打扰你了,希望能不吝赐教。