Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
各位前辈: 我自己编写的一个求解器里 热扩散系数ka 在不同位置值不一样,是一个标量场。因此我定义了一个变量 volScalarField ka=f(....) 。 在温度方程里的拉普拉斯项fvm::laplacian(ka,T) 中 存在ka的梯度的计算。 volScalarField 在壁面边界也有分布,因此grad(ka)在边界处的计算是错误的。 我的办法是把ka在壁面设为 zerogradient 条件。但总觉得不是十分完美,不知各位前辈有没有更好的方法。
存在ka的梯度的计算。 volScalarField 在壁面边界也有分布,因此grad(ka)在边界处的计算是错误的。
为什么?fvc::grad()函数在边界处已经考虑了边界的问题。
fvc::grad()
@东岳 纯流体计算时热扩散系数在边界是没有意义的吧,一般情况下是dimensionscalar ,是一个常数,grad(ka)都是0。 但如果吧ka 设为 volScalarField 的话,边界值也会被用于计算grad。 热扩散系数应该定义在流体域也就是内部场中,但volScalarField 有边界值。 有没有可能只对volScalarField 的内部场进行初始化和计算? 像这样 ka.primitiveFieldRef()=(r*(kf*(1+nn)-ks)+ks)/(1+nn*r);
你可以简单的把grad(ka)在边界处的值设为0,可参考: http://www.cfd-china.com/topic/1199
grad(ka)
@东岳 抱歉,我上面说的有问题,边界上的值会影响 fvc::grad(ka)在靠近壁面边界的第一层网格上的值。如果把grad(ka)在边界上设为0,靠近第一层网格处的grad(ka)还是不对。 是不是应该对ka在边界的值进行操作。或者手动计算靠近边界第一层网格上的grad(ka)。
我现在是吧ka在壁面设为zerogradient 条件
参考这个:
forAll(patches, patchi) { const fvPatch& currPatch = patches[patchi]; if (isType<wallFvPatch>(currPatch)) { forAll(currPatch, facei) { label faceCelli = currPatch.faceCells()[facei]; epsilon[faceCelli] = 0.0;//毗连网格单元值 G[faceCelli] = 0.0;//毗连网格单元值 } } }
将你的边界毗连网格单元值的梯度手动给定
@东岳 谢谢前辈
@mr-h 在 标量场壁面梯度的处理方式 中说:
在温度方程里的拉普拉斯项fvm::laplacian(ka,T) 中 存在ka的梯度的计算。
此处Ka为volScalarField,那么fvm::laplacian(ka,T)是不是等价于(fvm::grad(ka)&fvm::grad(T)) + ka*fvm::laplacian(T);这两种表达方式的意义一样吗?