@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通过的太轻松了哈哈哈,还好问了一下,
果然很多错才是该有的样子。我先自己改改,有问题可能还会麻烦老师~