1 回答

TA贡献1772条经验 获得超5个赞
几个问题:
python链式比较在 numpy 中不起作用,因此在 FiPy 中不起作用。所以,写
u10 = (4*L/10 < x) & (x < 6*L/10)
进一步,这会产生u10一个布尔值的字段,这会混淆 FiPy,所以写
u10 = ((4*L/10 < x) & (x < 6*L/10)) * 1.
或者,更好的是,写
u1 = CellVariable(name="u1", mesh=mesh, value=0., hasOld=True)
u2 = CellVariable(name="u2", mesh=mesh, value=1., hasOld=True)
u1.setValue(1., where=(4*L/10 < x) & (x < 6*L/10))
ConvectionTerm取向量系数。获得这个的一种方法是
convCoeff = g*(x-L/2) * [[1.]]
代表一维 rank-1 变量
如果你声明哪个VariableaTerm适用,你必须为所有的Terms做,所以写,例如,
ConvectionTerm(coeff=convCoeff, var=u1)
ConvectionTerm(coeff=g*x, var=u1) 不代表 g * x * du1/dx。它表示 d(g * x * u1)/dx。所以,我相信你会想要
ConvectionTerm(coeff=convCoeff, var=u1) - ImplicitSourceTerm(coeff=g, var=u1)
ImplicitSourceTerm(coeff=sourceCoeff1, var=u1不代表 -1*mu1*u1/(K+u1)*u2,而是代表-1*mu1*u1/(K+u1)*u2*u1。所以,为了方程之间的最佳耦合,写
sourceCoeff1 = -mu1*u1/(K+u1)
sourceCoeff2 = mu2*u2/(K+u1)
... ImplicitSourceTerm(coeff=sourceCoeff1, var=u2) ...
... ImplicitSourceTerm(coeff=sourceCoeff2, var=u1) ...
正如@wd15 在评论中指出的那样,您为两个未知数声明了四个方程。&并不意味着“将两个方程加在一起”(可以用 完成+),而是意味着“同时求解这两个方程”。所以,写
sourceCoeff1 = mu1*u1/(K+u1)
sourceCoeff2 = mu2*u2/(K+u1)
eq1 = (TransientTerm(var=u1)
== DiffusionTerm(coeff=D1, var=u1)
+ ConvectionTerm(coeff=convCoeff, var=u1)
- ImplicitSourceTerm(coeff=g, var=u1)
- ImplicitSourceTerm(coeff=sourceCoeff1, var=u2))
eq2 = (TransientTerm(var=u2)
== DiffusionTerm(coeff=D2, var=u2)
+ ConvectionTerm(coeff=convCoeff, var=u2)
- ImplicitSourceTerm(coeff=g, var=u2)
+ ImplicitSourceTerm(coeff=sourceCoeff2, var=u1))
eqn = eq1 & eq2
ACellVariable必须用 with 声明hasOld=True才能调用updateOld(),所以
u1 = CellVariable(name="u1", mesh=mesh, value=u10, hasOld=True)
u2 = CellVariable(name="u2", mesh=mesh, value=u20, hasOld=True)
添加回答
举报