我花了很长时间研究稳态近似的二维热传导扩散模型。
PDE http://mathurl.com/p3rfqer.png
为简单起见,考虑层流剪切薄膜,即底部零速度和恒定速度增加。
shear http://mathurl.com/p6e3hau.png
热容量可能在整个温度范围内保持恒定或线性增加。
边界条件是恒定的入口温度(左)和恒定的输入通量(顶部),而所有外表面都被迫没有梯度。
请参阅代码here。
当使用恒定热容量时,输入功率等于输出功率。
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单元格变量)混合,然后将它们转换为面变量,这是对流术语所必需的。
答案 0 :(得分:1)
根据分歧定理
divergence theorem http://mathurl.com/oz3wd3c.png
我会用
计算表面通量var express = require('express');
var router = express.Router();
//setting up the get route as above
module.exports = router;
我得到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)
答案会因x分辨率而提高。
请注意,因为它使用了速度矢量,4.958e+04 J/s received.
是通量输入,而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)
计算输入热通量。
我认为你计算的是
http://mathurl.com/qzn7wbk.png
如果你想计算散度定理的体积积分形式,你可以这样做,但它会
(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
经常出现,我们应该将它们作为公共API的一部分。
[编辑清楚地解决评论中提出的问题]