我试图在深度( h(t) )随时间变化的区域上求解一个简单的扩散方程(dT/dt =Kd2T/dx2)。因此,由此得出的方程式是:
dT/dt = K/h^2 d2T/dx2 + z/h dh/dt dT/dz其中z现在是一个固定的0->1域。
新的术语是框架平流,我试着把它包括在内,但是我在努力地处理空间相关系数。
当我把它包含在对流项之外时:
mesh.cellCenters[0]*PowerLawConvectionTerm(...)我知道这个错误:
TermMultiplyError: Must multiply terms by int or float但是如果我重新组织方程,空间依赖在对流项内:
PowerLawConvectionTerm(coeff=(mesh.cellCenters[0]**2,),...)在求解方程时,我得到了一个不同的错误:
AssertionError: assert( len(id1) == len(id2) == len(vector) )包含这些术语的正确方法是什么?我在某处犯了一个愚蠢的错误吗?
发布于 2016-10-31 14:48:27
解决这一问题的最佳方法可能是将最后一个项分成两部分,以便编写FiPy中的方程。
fipy.TransientTerm() == fipy.DiffusionTerm(K / h**2) \
+ fipy.ConvectionTerm(z * z_hat * h_t / h) \
- h_t / h * T在FiPy中,在项的导数之外不可能有乘子,因此需要一个额外的源项。这里的假设是
K = 1. ## some constant
h = fipy.Variable(...) ## variable that is continuously updated
h_old = fipy.Variable(...) ## variable that is continuously updated
h_t = (h - h_old) / dt ## variable dependent on h and h_old
T = fipy.CellVariable(...)
z_hat = [0, 1] ## vector required for convection term coefficientT是正在求解的变量,h和h_old在每一次扫描或时间步骤中都根据一定的公式使用setValue进行说明性更新。此外,最后一个术语可以分为显式源和隐式源。
- h_t / h * T -> - fipy.ImplicitSourceTerm(1 / dt) + h_old / h / dt * T取决于如何计算h_t。隐式源应该使解决方案非常稳定。
https://stackoverflow.com/questions/40310806
复制相似问题