簡體   English   中英

FiPy 求解偶偏微分方程導致 IndexError

[英]FiPy Solving Couple PDEs Results in IndexError

我是 FiPy 的新手,我正在嘗試解決一對耦合 PDE,描述了一種材料對裝在圓柱體中的吸附劑的吸附。 材料流經圓柱體,其濃度處於 2 個相中的任何一個:流動相或固定相。 我將流動相的網格設為沿圓柱體長軸的一維網格。 我將固定相的網格作為圓柱體橫截面積的一維圓柱體網格。 兩相是耦合的,我試圖求解流動相中材料隨時間的濃度。

import numpy as np
import fipy as fp

# meshes and variables
nx = 50.
dx = 1.

# mobile phase
mesh_m = fp.Grid1D(nx=nx, dx=dx)
cm = fp.CellVariable(name="Concentration mobile", mesh=mesh_m, value=0.)

# stationary phase
mesh_s = fp.CylindricalGrid1D(nr=50, dr=dx)
cs = fp.CellVariable(name="Concentration stationary", mesh=mesh_s, value=0.)

# phase equations 
# mobile
eqCm = fp.TransientTerm(coeff = 0.5, var = cm) \
    == fp.ExplicitDiffusionTerm(coeff = 0.03, var = cm) \
    - fp.PowerLawConvectionTerm((1,), var = cm) \
    - fp.ImplicitSourceTerm(coeff= 3 * (cm - cs), var = cm)  

# stationary
eqCs = fp.TransientTerm(coeff = 0.4, var = cs) \
    == fp.ExplicitDiffusionTerm(coeff = 0.2, var = cs) 
   
# boundary conditions 
# mobile
cm_Left = 1.
cm_Right = 0.
cm_gradValueLeft = 30 * (cm_Left - 1)
cm_gradValueRight = 0.

cm.constrain(cm_Left, mesh_m.facesLeft)

cm.faceGrad.constrain(cm_gradValueLeft, mesh_m.facesLeft)
cm.faceGrad.constrain(cm_gradValueRight, mesh_m.facesRight)

# stationary
cs_Left = 0.
cs_Right = 1.
cs_gradValueLeft = 0.
cs_gradValueRight = 0.01 * (cm - cs)

cs.constrain(cs_Right, mesh_s.facesRight)

cs.faceGrad.constrain(cs_gradValueLeft, mesh_s.facesLeft)
cs.faceGrad.constrain(cs_gradValueRight, mesh_s.facesRight)

# **************** setup system and solve *********************************
eqn = eqCm and eqCs

T = 100
timeStep = 0.5
steps = int(T/timeStep)
viewer = fp.Viewer(vars=(cm, cs), datamin=0., datamax=4)

for step in range(steps):
    eqn.solve(var=cm, dt=timeStep)
    print(cm)
    viewer.plot()

eqn.solve(var=cm, dt=timeStep)命令期間,我不斷遇到以下錯誤: IndexError: boolean index did not match indexed array along dimension 0; dimension is 50 but corresponding boolean dimension is 51 IndexError: boolean index did not match indexed array along dimension 0; dimension is 50 but corresponding boolean dimension is 51 單元格變量或方程的設置方式有問題嗎? 對此的任何幫助表示贊賞。

該錯誤很可能是因為cmcs有 50 個單元格,導致cs_gradValueRight有 50 個單元格。 但是, mesh_s.facesRight訪問 51 個面,因此cs.faceGrad.constrain(cs_gradValueRight, mesh_s.facesRight)不知道該怎么做。 為了擺脫這個錯誤,你可以寫:

cs.faceGrad.constrain(cs_gradValueRight, where=mesh_s.facesRight.faceValue)

但是,您仍然會遇到問題:

  • FiPy 不能耦合不同網格之間的方程。 一般來說,網格可以連接,但我嚴重懷疑Grid1D可以連接到CylindricalGrid1D 我非常有信心它會失去圓柱幾何形狀。
  • FiPy 將方程與“ & ”,而不是“ and ”結合起來。

如果我了解您要做什么,我認為您在解決CylindricalGrid2D上的單個濃度場並改變移動區域和靜止區域之間的介質屬性時會有更好的運氣。

不是問題,但並不理想:使用DiffusionTerm而不是ExplicitDiffusionTerm 它將更有效地解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM