0

我是 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'',无法安全地将输入强制转换为任何支持的类型”

4

0 回答 0