我正在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,...)
如果我模拟相当大的模型,分解会消耗几GB的内存。因此,在第一次迭代之后,在KT11
的因式分解过程中,需要双内存(solveRHS+spslinalg.factoried(self.KT)的内存)
在解出SLAE之后删除solveRHS
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,...)
我可以减少内存占用,但代价是为每次迭代中的因式分解分配内存,每次迭代只需几秒钟
有没有可能“new”solver函数直接写入solveRHS
,而不必重新分配内存
根据sps.linalg.factorized sourcehttps://github.com/scipy/scipy/blob/v0.16.1/scipy/sparse/linalg/dsolve/linsolve.py#L318,factorized调用splu(A).solve使用函数编程。所以可以像函数一样将参数输入sps.linalg.factorized(KT)
另一种解决方案是,您可以通过数据透视实现自己的LU分解,这样可以更有效地优化代码,但风险也更大
希望这有帮助!快乐的编码
相关问题 更多 >
编程相关推荐