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

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

热容量可能是恒定的,也可能是随着温度的线性增加。
边界条件是一个恒定的入口温度(左)和恒定的输入流量(顶部),而所有外部表面都被迫没有梯度。
请参阅代码这里。
当使用恒定的热容量时,输入功率等于输出功率。
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单元变量),然后将它们转换成一个面变量,这是对流项所必需的。
发布于 2015-09-26 02:32:47
散度定理

我会计算表面通量
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是通量in,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的一部分。
为解决评论中出现的问题而编辑
https://stackoverflow.com/questions/32740663
复制相似问题