我是 Fipy 的新手。我很想知道如何判断指定边界上的值,然后为指定的边界条件分配一个新值?”
我创建了一个 CellVariable“psi”和一个指定的边界“BSCfaces”。我想根据“psi”faceValue 对“BSCfaces”应用一个新值。现在我使用了第一个代码,但 mean(B1) 是一个临时解决方案。所以我测试了第二个代码,但是效果不好,尤其是网格有点大的时候(即10*10不行)。
# First code I used now
from fipy import CellVariable, Grid2D, Viewer, TransientTerm, DiffusionTerm
nx = 100
ny = 100
Lx=0.20
Ly=0.15
dx = Lx/nx
dy = Ly/ny
mesh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny)
# create a CellVariable and initialize it
psi = CellVariable(name="pressure head (m)",
mesh=mesh,
value=-0.513949,
hasOld=1)
BSC=[Lx / 4,3*Lx / 4]
BSCfaces= (mesh.facesTop & (X >= BSC[0]) & (X <= BSC[1]))
B1=psi.faceValue[BSCfaces.value].value
psi_min=-1000
import numpy as np
if (np.mean(B1)<psi_min):
psi.constrain(psi_min,BSCfaces)
# Second code I want to modify.
from fipy import CellVariable, Grid2D, Viewer, TransientTerm, DiffusionTerm
nx = 100
ny = 100
Lx=0.20
Ly=0.15
dx = Lx/nx
dy = Ly/ny
mesh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny)
# create a CellVariable and initialize it
psi = CellVariable(name="pressure head (m)",
mesh=mesh,
value=-0.513949,
hasOld=1)
BSC=[Lx / 4,3*Lx / 4]
BSCfaces= (mesh.facesTop & (X >= BSC[0]) & (X <= BSC[1]))
B=psi.faceValue.value
psi_min=-1000
import numpy as np
x1=mesh.faceCenters.value[0][np.where(B>psi_min)]
y1=mesh.faceCenters.value[1][np.where(B>psi_min)]
if (x1.size!=0):
BSC1=BSCfaces & (x1,y1) #I think probably here is the problem!!!!
psi.constrain(psi_min,BSC1)
第一个代码有效,但它是一个临时解决方案。第二个代码效果不佳,并显示“TypeError:输入类型不支持ufunc 'bitwise_and',并且根据强制转换规则''safe'',无法安全地将输入强制转换为任何支持的类型”