具有非恒定容量的传导扩散热二维模型

conduction-diffusion heat 2D model with non constant capacity

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

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

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

边界条件是恒定的入口温度(左)和恒定的输入通量(上),同时强制所有外表面没有梯度。

查看代码here

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

input = 50.00e3 W
ouput = 50.00e3 W

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

input = 50.00e3 W
ouput = 33.78e3 W

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

我担心我在定义对流项时做错了,但找不到错误。此外,如果 fipy 能够将 theta(rank=0 单元格变量)与 velocity(rank=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 经常出现,我们应该让它们成为 public API.

的一部分

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