Scipy разреженно-матричная факторизация без перераспределения памяти - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над нелинейным решателем конечных элементов в 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, без перераспределения памяти?

1 Ответ

0 голосов
/ 06 ноября 2019

Согласно источнику sps.linalg.factorized https://github.com/scipy/scipy/blob/v0.16.1/scipy/sparse/linalg/dsolve/linsolve.py#L318, факторизованный вызов splu (A) .solve с использованием функционального программирования. Таким образом, вы можете ввести параметр в sps.linalg.factorized (KT) как функцию.

import scipy.sparse as sps
while error > max_error:
    KT = updateKT()
    F = updateF()
    deltaU = sps.linalg.factorized(KT)(F)
    error = calculate_error(F,deltaU,...)

Другое решение: вы можете реализовать собственную факторизацию LU с помощью поворота, чтобы оптимизировать код более эффективно, но при этом у вас больше рисков.

Надеюсь, это поможет! Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...