我想要解一个含源项的流体流动问题。但是,我无法按照我所希望的那样,在最后用源项写出方程。是否有方法将FaceVariable转换为cellVariable。
我收到了这个错误
TypeError:系数不能是FaceVariable。
代码如下
from fipy import CellVariable, FaceVariable, Grid2D, DiffusionTerm, Viewer, ExponentialConvectionTerm
from fipy.tools import numerix
from fipy.meshes.gmshMesh import Gmsh2D
import numpy as np
L = 1.0
N = 100
dL = L / N
viscosity = 1
U = 1.
meshsize = 1./N
geo = '''
cl__1 = 1;
Point(1) = {1, 1, 0, %f};
Point(2) = {2, 1, 0, %f};
Point(3) = {2, 2, 0, %f};
Point(4) = {1, 2, 0, %f};
Line(1) = {4, 3};
Line(2) = {3, 2};
Line(3) = {2, 1};
Line(4) = {1, 4};
Line Loop(6) = {1, 2, 3, 4};
Plane Surface(6) = {6};
Transfinite Line {4, 1, 2, 3} = %d Using Progression 1;
Transfinite Surface {6};
Recombine Surface {6};
'''
geo = geo %(meshsize ,meshsize, meshsize, meshsize , 1/meshsize )
mesh = Gmsh2D(geo , background=None)
#0.8 for pressure and 0.5 for velocity are typical relaxation values for SIMPLE
pressureRelaxation = 0.1
velocityRelaxation = 0.1
if __name__ == '__main__':
sweeps = 100
else:
sweeps = 5
x = mesh.cellCenters.value[0]
y = mesh.cellCenters.value[1]
sourcevx = CellVariable(mesh=mesh , name = 'sourcevx')
sourcevy = CellVariable(mesh=mesh , name = 'sourcevy')
source_p = FaceVariable(mesh=mesh , rank=1)
source_pcorr = CellVariable(mesh=mesh , name = 'source_pcor')
pressure = CellVariable(mesh=mesh, name='pressure')
pressureCorrection = CellVariable(mesh=mesh)
xVelocity = CellVariable(mesh=mesh, name='X velocity')
yVelocity = CellVariable(mesh=mesh, name='Y velocity')
velocity = FaceVariable(mesh=mesh, rank=1)
sourcevx.setValue(-x**2*numerix.sin(x*y) - 2*x*numerix.cos(x**2 + y**2) - \
y**2*numerix.sin(x*y))
sourcevy.setValue(-x*y*numerix.sin(x*y) - 2*y*numerix.cos(x**2 + y**2) \
+ numerix.cos(x*y) - y**3*numerix.sin(x*y)/x - \
3*y**2*numerix.cos(x*y)/x**2 + 6*y*numerix.sin(x*y)/x**3 \
+ 6*numerix.cos(x*y)/x**4)
xVelocityEq = DiffusionTerm(coeff=viscosity) - pressure.grad.dot([1.,0.]) \
== sourcevx
yVelocityEq = DiffusionTerm(coeff=viscosity) - pressure.grad.dot([0.,1.]) \
== sourcevy
ap = CellVariable(mesh=mesh, value=1.)
coeff = 1./ ap.arithmeticFaceValue*mesh._faceAreas * mesh._cellDistances
x , y = mesh.faceCenters
source_p.setValue(coeff * (-4*x**2*numerix.sin(x**2 + y**2) \
- 4*y**2*numerix.sin(x**2 + y**2) + 4*numerix.cos(x**2 + y**2))\
- 2*y*numerix.cos(x*y) )
pressureCorrectionEq = DiffusionTerm(coeff=coeff) - velocity.divergence \
== source_p
发布于 2018-08-17 15:03:03
在FiPy中,没有简单的方法从人脸到细胞中心进行插值,因为它是很少需要的。在你的情况下,我也不认为它是必需的。source_p
face变量可以表示为单元变量。
source_p = CellVariable(mesh=mesh, rank=1)
ap = CellVariable(mesh=mesh, value=1.)
coeff = 1 / ap * mesh.cellVolumes
x ,y = mesh.cellCenters
source_p.setValue(coeff * (-4*x**2*numerix.sin(x**2 + y**2) \
- 4*y**2*numerix.sin(x**2 + y**2) + 4*numerix.cos(x**2 + y**2))\
- 2*y*numerix.cos(x*y) )
pressureCorrectionEq = DiffusionTerm(coeff=coeff) - velocity.divergence \
== source_p
如果我们将coeff
定义为一个单元变量,那么我们就不需要插值回单元格了。这确实稍微改变了coeff
的离散化。如果您担心这一点,那么您可以定义两个版本的coeff
coeff_cell = 1 / ap * mesh.cellVolumes
coeff_face = 1 / ap.arithmeticFaceValue * mesh._faceAreas * mesh._cellDistances
其中,coeff_face
作为扩散系数,coeff_cell
作为源项的表达式。
https://stackoverflow.com/questions/51888346
复制相似问题