如何在FiPy中将CellVariables或implicitsourceterm提升为幂?

2024-05-19 12:52:21 发布

您现在位置:Python中文网/ 问答频道 /正文

通过FiPy(Python库),我想解决如下所示的pdes系统的耦合问题。下面的代码可以工作,但没有给出正确的解决方案。你知道吗

p, q, r, s = 2, 1, 2, 0
Du, Dv = 0.0004, 0.04
mesh = Grid1D(nx=500, Lx=5.)

U = CellVariable(name = 'U',mesh=mesh, hasOld=True, value=1.)
V = CellVariable(name = 'V',mesh=mesh, hasOld=True, value=2.)

eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - U + (U**p)/(V**q)
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - V + (U**r)/(V**s)

viewerV = Viewer(vars=V)
viewerU = Viewer(vars=U)

timeStepDuration = 0.1
steps = 1000

eqn = eqU & eqV

for t in range(500): 
    U.updateOld()
    V.updateOld()
    eqn.solve(dt=1.e-3)
viewerV.plot()
viewerU.plot()

在我看到的一些代码中,我也尝试用ImplicitSourceTerm替换CellVariables,但这会产生一个错误,因为用ImplicitSourceTerm的幂p不能这样做。 但是,我找不到任何关于如何进行的文档:

eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - ImplicitSourceTerm(var=U) + ((ImplicitSourceTerm(var=U)**p)/(ImplicitSourceTerm(var=V)**q))
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - ImplicitSourceTerm(var=V) + ((ImplicitSourceTerm(var=U)**r)/(ImplicitSourceTerm(var=V)**s))

试图提高U.p值也会出现错误。你知道吗


Tags: 代码nametruevardumeshdvcoeff
1条回答
网友
1楼 · 发布于 2024-05-19 12:52:21

你的第一个解决方案没有本质上的错误,除了显式源可能不会像隐式源那样快速收敛。你知道吗

ImplicitSourceTerm表示某个系数乘以正在求解的变量(默认系数为0,which is useless,因此必须显式声明coeff=1.)。你知道吗

你的条件可以表述为

eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - ImplicitSourceTerm(var=U, coeff=1.) + ImplicitSourceTerm(var=U, coeff=(U**(p-1))/V**q)
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - ImplicitSourceTerm(var=V, coeff=1.) + ImplicitSourceTerm(var=U, coeff=(U**(r-1))/V**s)

然后你应该使用扫描。你知道吗

相关问题 更多 >