Как добавить граничные условия с нулевым потоком к me sh, сгенерированному в gm sh Fipy? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь найти модель 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)

1 Ответ

1 голос
/ 07 января 2020

Граничные условия FiPy по умолчанию не изменяются для всех сеток. Это фундаментальная характеристика c метода конечных объемов, основанного на ячейках.

...