Как установить параметр «underRelaxation» на связанное уравнение? - PullRequest
0 голосов
/ 21 июня 2020

Я знаю, что мы можем установить параметр underRelaxation, если мы используем «sweep» для решения уравнения. например:

xVelocity_eq.sweep(dt=dt, underRelaxation = 0.5)

Но как установить этот параметр для связанного уравнения. например:

coupled_eq = xVelocity_eq & yVelocity_eq & zVelocity

coupled_eq.sweep(dt=dt,underRelaxation = ?)

Я пробовал установить underRelaxtion = 0.5 и установить underRelaxation как массив, как в следующем коде:

relaxation = np.zeros(len(self.yVelocity) + len(self.zVelocity) + len(self.xVelocity)) relaxation[:] = velocityRelaxation

coupled_eq.sweep(dt=dt,underRelaxation = relaxation)

Однако он не работает правильно с IndexError (индексы вне допустимого диапазона) .Если я не установил значение underRelaxation, ошибка не появится и коды могут работать.

File "C:\Program Files\Itasca\PFC500\exe64\python27\lib\site-packages\fipy\terms\term.py", line 237, in sweep solver._applyUnderRelaxation(underRelaxation=underRelaxation)

File "C:\Program Files\Itasca\PFC500\exe64\python27\lib\site-packages\fipy\solvers\solver.py", line 133, in _applyUnderRelaxation self.matrix.putDiagonal(self.matrix.takeDiagonal() / underRelaxation)

File "C:\Program Files\Itasca\PFC500\exe64\python27\lib\site-packages\fipy\matrices\pysparseMatrix.py", line 223, in putDiagonal self.put(vector, ids, ids)

File "C:\Program Files\Itasca\PFC500\exe64\python27\lib\site-packages\fipy\matrices\offsetSparseMatrix.py", line 55, in put SparseMatrix.put(self, vector, id1 + self.mesh.numberOfCells * self.equationIndex, id2 + self.mesh.numberOfCells * self.varIndex)

File "C:\Program Files\Itasca\PFC500\exe64\python27\lib\site-packages\fipy\matrices\pysparseMatrix.py", line 198, in put self.matrix.put(vector, id1, id2)

IndexError: indices out of range

1 Ответ

1 голос
/ 24 июня 2020

Аргумент underRelaxation принимает одно значение с плавающей запятой от 0 до 1. Установка underRelaxation=0.9 отлично работает в этом примере.

import numpy as np
from fipy import (
    CellVariable,
    TransientTerm,
    DiffusionTerm,
    Grid1D,
)

nx = 10

mesh = Grid1D(nx=nx, dx=1.0)

var_a = CellVariable(mesh=mesh, value=1.0)
var_b = CellVariable(mesh=mesh, value=0.0)

eqn_a = TransientTerm(var=var_a) == DiffusionTerm(var=var_a)
eqn_b = TransientTerm(var=var_b) == DiffusionTerm(var=var_b)

eqn = eqn_a & eqn_b

#underRelaxation = np.arange(nx * 2) / nx / 4. + 0.1
underRelaxation = 0.9

eqn.sweep(dt=1., underRelaxation=underRelaxation)

Кажется, что аргумент underRelaxation также может быть массивом той же длины, что и диагональ матрицы (2 * nx в данном случае), хотя, возможно, это никогда не было таким, как предполагалось. В любом случае, underRelaxation = np.arange(nx * 2) / nx / 4. + 0.1 тоже работает.

...