Граничное ограничение приводит к внутреннему l oop, что здесь происходит и почему? - PullRequest
0 голосов
/ 11 января 2020

Мой скрипт перестает работать из-за моей легкой проблемы с проводимостью. Может ли кто-нибудь объяснить мне, почему следующая строка кода T.faceValue.constrain(alp/lam*(Tu-T.faceValue),where=mesh.exteriorFaces) # Boundary Condition for Solver приводит к фипи, от которой я отказываюсь?

Полный код:

cv=900.
lam=5.
alp=300.

T0 = 25.
Tu = 400.


cellSize = 0.05
radius = 1.


mesh = Gmsh2D('''
              cellSize = %(cellSize)g;
              radius = %(radius)g;
              Point(1) = {0, 0, 0, cellSize};
              Point(2) = {-radius, 0, 0, cellSize};
              Point(3) = {0, radius, 0, cellSize};
              Point(4) = {radius, 0, 0, cellSize};
              Point(5) = {0, -radius, 0, cellSize};
              Circle(6) = {2, 1, 3};
              Circle(7) = {3, 1, 4};
              Circle(8) = {4, 1, 5};
              Circle(9) = {5, 1, 2};
              Line Loop(10) = {6, 7, 8, 9};
              Plane Surface(11) = {10};
              ''' % locals()) # doctest: +GMSH

T = CellVariable(name = "HeatingUp",mesh = mesh,value = T0)


viewer = None
if __name__ == '__main__':
     try:
         viewer = Viewer(vars=T, datamin=T0, datamax=Tu)
         viewer.plotMesh()
         input("Irregular circular mesh. Press <return> to proceed") # doctest: +GMSH
     except:
         print("Unable to create a viewer for an irregular mesh (try Matplotlib2DViewer or MayaviViewer)")
# =============================================================================



eq = TransientTerm(coeff=rho*cv)==DiffusionTerm(coeff=lam)

T.faceValue.constrain(alp/lam*(Tu-T.faceValue),where=mesh.exteriorFaces) # Boundary Condition for Solver



timeStepDuration = 0.1
steps = 10
for step in range(steps):
    eq.solve(var=T, dt=timeStepDuration) # doctest: +GMSH
    if viewer is not None:
        viewer.plot() # doctest: +GMSH
``

1 Ответ

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

Вы написали, что T.faceValue зависит от T.faceValue, который зависит от T.faceValue, который зависит от T.faceValue, ... FiPy должным образом предоставил вам бесконечный l oop, который вы запросили.

Просто напишите T.faceValue.constrain(Tu * (alp/lam) / (1 + alp/lam), where=mesh.exteriorFaces).

В более вероятном случае, когда вы хотите связать градиент со значением на границе, см. Обсуждение Условия Робина .

...