Я пытаюсь найти модель Meinhart в me sh, созданную gm sh в Fipy. Однако я не уверен, как добавить граничные условия с нулевым потоком. Ниже вы можете найти мой код. Я хотел бы знать, если линии:
#u.constrain(0, where=mesh.exteriorFaces)
#u.faceGrad.constrain(mesh.faceCenters, where=mesh.exteriorFaces)
должны быть активированы для обеспечения граничных условий с нулевым потоком.
Я прочитал в: https://github.com/usnistgov/fipy/issues/674 что " Границы FiPy по умолчанию не изменяются ». Но я не знаю, применимо ли это ко мне sh, созданный опциями gm sh.
Если в моем коде нет необходимости активировать или добавлять дополнительные строки для настройки граничного условия с нулевым потоком, это также работает, когда у меня есть более сложные sh, например, многоугольники, круги или другие неправильные формы ?
Спасибо,
"""
Emacs Editor
This is a temporary script file.
"""
# -*- coding: utf-8 -*-
"""
@author: Irbin B.
"""
'''Solving Meinhart model 2D'''
# 1. Libraries
import fipy as fi # Finite volume method's package
# 2. Building the domain (Gmsh square)
## 2.1. Domain lenght
nx = 100
ny = nx
## 2.2. Gmsh config
mesh = fi.Gmsh2D('''
Side = 100;
CellSize = 1;
Point(1) = {0, 0, 0, CellSize};
Point(2) = {0, Side, 0, CellSize};
Point(3) = {Side, Side, 0, CellSize};
Point(4) = {Side, 0, 0, CellSize};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Line Loop(6) = {1, 2, 3, 4};
Plane Surface(7) = {6};
''' % locals())
## 2.3. Adding initial conditions values (Random)
noise_u = fi.GaussianNoiseVariable(mesh=mesh,
mean=0.5,
variance=0.05).value
noise_v = fi.GaussianNoiseVariable(mesh=mesh,
mean=0.5,
variance=0.05).value
# 3. Zero-Flux boundary conditions
BCs = (fi.FixedFlux(faces=mesh.facesRight, value=0.),
fi.FixedFlux(faces=mesh.facesLeft, value=0.),
fi.FixedFlux(faces=mesh.facesTop, value=0.),
fi.FixedFlux(faces=mesh.facesBottom, value=0.))
# 4. Defining the variables
u = fi.CellVariable(name = "u",
mesh=mesh,
value=0.,
hasOld=True)
u[:] = noise_u
#u.constrain(0, where=mesh.exteriorFaces)
#u.faceGrad.constrain(mesh.faceCenters, where=mesh.exteriorFaces)
v = fi.CellVariable(name = "v",
mesh = mesh,
value = 0.,
hasOld = True)
v[:] = noise_v
#v.constrain(0, where=mesh.exteriorFaces)
#v.faceGrad.constrain(mesh.faceCenters, where=mesh.exteriorFaces)
# 5. Defining the parameters
Da = 1.
Db = 100
alpha = -0.005
beta = 10
# 6. Creating the system of PDEs
equ = fi.TransientTerm(var=u) == fi.DiffusionTerm(coeff=Da, var=u) + u - u**3 - v + alpha
eqv = fi.TransientTerm(var=v) == fi.DiffusionTerm(coeff=Db, var=v) + (u - v) * beta
eqn = (equ & eqv)
# 7. Solving the PDEs and showing the results in figures
timeStepDuration = .1
steps = 100
for step in range(steps):
u.updateOld()
v.updateOld()
eqn.sweep(dt = timeStepDuration)
print(step+1)
if __name__== '__main__':
uviewer = fi.Viewer(vars=u, datamin=0., datamax=.7)
vviewer = fi.Viewer(vars=v, datamin=0., datamax=.7)