1

我花了很长时间开发用于稳态近似的二维热传导扩散模型。

偏微分方程

为简单起见,考虑层流剪切膜,即底部的零速度和恒定的速度增加。

剪切

热容量可能是恒定的或随温度线性增加。

边界条件是恒定的入口温度(左)和恒定的输入通量(顶部),而所有外部面都被迫没有梯度。

请参阅此处的代码。

当使用恒定热容量时,输入功率等于输出功率。

input = 50.00e3 W
ouput = 50.00e3 W

当使用非恒定热容量时,它们显着不同。热容量随温度的变化越大,输入和输出的差异就越大。

input = 50.00e3 W
ouput = 33.78e3 W

引入可变速度系数(此处为 v * c * rho)已按照 fipy FAQ 中的说明进行(仅明确显示了扩散项的示例)。网格分辨率不会改变输出功率。所以我会说这不是网格问题。我还尝试添加一个瞬态项并解决一个非常高的时间步长,这不会改变解决方案。

我担心在定义对流项时我做错了什么,但找不到错误。如果fipy 能够将theta(rank=0 单元变量)与velocity(rank=1 单元变量)混合,然后将它们转换为对流项所必需的面变量,我也感到困惑。

4

1 回答 1

1

根据散度定理

散度定理

我会计算表面通量

Cp = mymodel.fluid.capacity(solution, use_constant_cp)
veloc = fipy.CellVariable(mesh=mesh, value=0., rank=1, name='velocity')
veloc[0] = mymodel.shear * mesh.y
R = ((Cp * solution * veloc).faceValue.dot(mesh._orientedAreaProjections) * mesh.facesRight * mymodel.fluid.rho).sum()
L = ((Cp * solution * veloc).faceValue.dot(mesh._orientedAreaProjections) * mesh.facesLeft * mymodel.fluid.rho).sum()
print "{:.3e} J/s received.".format((R+L).value)

我得到4.958e+04 J/s received.答案随着 x 分辨率而提高。

请注意,因为这使用了速度矢量,L是流入量和R流出量,所以我们将它们相加以获得差异。向量指向所有外表面的_orientedAreaProjections域,因此当通量进入域时点积为正,离开域时为负。因为我们正在整合整个外部边界,所以你可以写

J_dot_n = ((Cp * solution * veloc).faceValue.dot(mesh._orientedAreaProjections) * (mesh.facesLeft + mesh.facesRight) * mymodel.fluid.rho).sum()
print "{:.3e} J/s received.".format(J_dot_n.value)

同样,我会计算输入热通量(mymodel.flux * mesh._faceAreas * mesh.facesTop).sum()

我想你计算的是

如果你想计算散度定理的体积积分形式,你可以这样做,但它会是

velocF = fipy.FaceVariable(mesh=mesh, value=0., rank=1, name='velocity')
velocF[0] = mymodel.shear * mesh.faceCenters[1]
((Cp * solution).faceValue * velocF * mymodel.fluid.rho).divergence.cellVolumeAverage * mesh.cellVolumes.sum()

_faceAreas并且_orientedAreaProjections经常出现,以至于我们应该将它们作为公共 API 的一部分。

[为清楚起见进行了编辑,以解决评论中出现的问题]

于 2015-09-26T02:32:47.000 回答