Python 基于FiPy的stokes绕球流动边界条件

Python 基于FiPy的stokes绕球流动边界条件,python,fipy,fluid-dynamics,Python,Fipy,Fluid Dynamics,我试着用FiPy来解绕球体的Stokes流。为此,我选择了一个圆柱形二维网格(因为我的问题是轴对称的)。z轴穿过球体的中心,网格的大小为Lr x Lz。我使用的边界条件如下图所示: 我使用FiPy library for Python解决了上面的问题,请参见下面的代码 从菲比进口* 从fipy.tools导入numerix 从fipy.variables.facegravariable导入\u facegravariable 粘度=5.556E-06 pfi=10000#球内处罚 v0=1#

我试着用FiPy来解绕球体的Stokes流。为此,我选择了一个圆柱形二维网格(因为我的问题是轴对称的)。z轴穿过球体的中心,网格的大小为Lr x Lz。我使用的边界条件如下图所示:

我使用FiPy library for Python解决了上面的问题,请参见下面的代码


从菲比进口*
从fipy.tools导入numerix
从fipy.variables.facegravariable导入\u facegravariable
粘度=5.556E-06
pfi=10000#球内处罚
v0=1#远离球体的速度
tol=1.e-6#公差
Lr=2#网格长度
#r和z方向上的单元格数量
Nr=400
新西兰=800
Lz=Lr*Nz/Nr#格栅高度(=4)
dL=Lr/Nr
网格=圆柱形网格2D(nr=nr,nz=nz,dr=dL,dz=dL)
R、 Z=网格面中心
r、 z=网格中心
#欠松弛因子
压力释放=0.8
速度松弛=0.5
#球面半径
rad=0.1
#到网格中心的距离(r=0,z=2)
var1=距离变量(name='distance to center',mesh=mesh,value=numerix.sqrt(r**2+(z-Lz/2.)**2))
#压力和压力修正变量
压力=CellVariable(网格=mesh,值=0,hasOld=True,name='press')
pressureCorrection=CellVariable(网格=mesh,值=0,hasOld=True)
#细胞速度
zVelocity=CellVariable(mesh=mesh,hasOld=True,name='Z vel')
rVelocity=CellVariable(mesh=mesh,hasOld=True,name='R vel')
#面速度
速度=面变量(网格=网格,秩=1)
VelocityLD=面变量(网格=网格,秩=1)
#边界条件(默认情况下无通量)
zVelocity.Constraint(v0,网格.面底)
zVelocity.constraint(v0,网格.facesTop)
rVelocity.CONSTRAINT(0,网格面右侧)
rVelocity.CONSTRAINT(0,网格面底部)
rVelocity.CONSTRAINT(0,网格面停止)
压力校正约束(0,网格面底部和(Rtol或pres>tol或cont>tol或pcorrmax>tol):
扫掠=扫掠+1
#求解Navier-Stokes方程以获得星号值
rVelocityEq.cacheMatrix()
rres=rVelocityEq.扫描(var=rVelocity,欠松弛=速度松弛)
rmat=rVelocityEq.矩阵
zVelocityEq.cacheMatrix()
zres=zVelocityEq.扫描(var=zVelocity,欠松弛=速度松弛)
zmat=zVelocityEq.矩阵
#在Rhie-Chow插值中使用对角系数更新矩阵
apr[:]=-rmat.takeDiagonal()
apz[:]=-zmat.takeDiagonal()
ap.setValue(apr.ArtihmeticFaceValue,其中=rFaces)
ap.setValue(apz.ArtihmeticFaceValue,其中=zFaces)
#使用Rhie Chow校正,根据星号值更新面速度
#与欠松弛因子无关的最终解
速度[0]=(rVelocity.ARTIMMETICFACEVALUE+(体积/四月*压力\u校正\u梯度[0])。ARTIMMETICFACEVALUE-\
控制容积*(1/4月)。算术面值*压力校正面梯度[0]+(1-速度松弛)*\
(VelocityLD[0]-rVelocity.old.arithmetricFaceValue)
速度[1]=(zVelocity.arithmeticFaceValue+(体积/apz*压力校正梯度[1])。arithmeticFaceValue-\
控制容积*(1./apz).算术面值*压力校正面梯度[1]+(1-速度松弛)*\
(VelocityLD[1]-zVelocity.old.arithmeticFaceValue)
#边界条件(再次)
速度[0,mesh.facesRight.value]=0。
速度[0,mesh.facesBottom.value]=0。
速度[0,mesh.facesTop.value]=0。
速度[1,网格面底部值]=v0
速度[1,网格.facesTop.value]=v0
#求解压力修正方程
系数setValue(contrvolume*(1/apr).ArtihmeticFaceValue,其中=rFaces)
系数setValue(contrvolume*(1./apz).ArtihmeticFaceValue,其中=zFaces)
压力校正公式cacheRHSvector()
压力=压力校正相等扫描(var=压力校正)
#正确的压力改正梯度
压力校正\u校正\u梯度[0]=压力校正。梯度[0]-压力校正/r
压力校正校正梯度[1]=压力校正梯度[1]
#校正压力校正面梯度
pressureCorrection\u correct\u facegrad0.setValue(pressureCorrection.faceGrad[0])
pressureCorrection\u correct\u facegrad0.setValue(pressureCorrection.faceGrad[0]-pressureCorrection.grad[0]。算术FaceValue+\
压力校正校正梯度[0]。算术面值,其中=zFaces)
pressureCorrection\u correct\u facegrad1.setValue(pressureCorrection.faceGrad[1])
压力校正\u校正\u面梯度设置值([压力校正\u校正\u面梯度0.value,压力校正\u校正\u面梯度1.value])
#使用修正值更新压力
压力设定值(压力+压力释放*压力校正)
#正确的压力梯度
压力校正梯度[0]=压力梯度[0]-压力/r
压力校正梯度[1]=压力梯度[1]
#正确的压力面梯度
压力校正面梯度0.setValue(压力面梯度[0])
压力校正面梯度0.setValue(压力面梯度[0]-压力面梯度[0]。算术面梯度值+\
压力校正梯度[0]。算术面值,其中=zFaces)
压力校正面梯度1.设定值(压力面梯度[1])
压力校正面梯度设定值([压力校正面梯度0.value,压力校正面梯度_
pressureCorrection.constrain(0., mesh.facesTop & (R < dL))
pressureCorrection.constrain(0., mesh.facesTop)