我正在尝试在深度(h(t))随时间变化的域上求解一个简单的扩散方程(dT / dt = K d2T / 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) )


包含这些术语的正确方法是什么?我在某个地方犯了一个愚蠢的错误吗?

最佳答案

解决此问题的最佳方法可能是将最后一项分为两部分,以便写出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 coefficient


T是要求解的变量,hh_old在每个扫描或时间步均根据某些公式使用setValue显式更新。此外,最后一项可以分为显式和隐式源

- h_t / h * T -> - fipy.ImplicitSourceTerm(1 / dt) + h_old / h / dt * T


取决于h_t的评估方式。隐式源应使解决方案非常稳定。

10-06 05:55