Я работаю над нелинейным решателем конечных элементов в Python, используя scipy
разреженных матриц. Решатель генерирует матрицу касательной жесткости с именем KT
(scipy.sparse.csc_matrix()
), которая обновляется несколько раз во время выполнения - но не меняет форму и вектор нагрузки F
. Затем итерационные смещения deltaU
рассчитываются как KT * deltaU = F
.
(Схематическое) текущее значение процесса:
import scipy.sparse as sps
while error > max_error:
KT = updateKT()
F = updateF()
solveRHS = sps.linalg.factorized(KT)
deltaU = solveRHS(F)
error = calculate_error(F,deltaU,...)
Если я моделирую довольно большие модели, факторизация стоит несколько гигабайтпамяти. Итак, после первой итерации, во время факторизации KT11
необходима двойная память (память solveRHS + spslinalg.factorized (self.KT)).
Удаляя solveRHS
после решения SLAE,
import scipy.sparse as sps
while error > max_error:
KT = updateKT()
F = updateF()
solveRHS = sps.linalg.factorized(KT)
deltaU = solveRHS(F)
del solveRHS
error = calculate_error(F,deltaU,...)
Я могу уменьшить объем занимаемой памяти - но за счет выделения памяти для факторизации в каждой итерации - что стоит несколько секунд на одну итерацию.
Isесть вероятность, что «новая» решающая функция напрямую записана в solveRHS
, без перераспределения памяти?