我正在使用ceygen库(Eigen向量和矩阵的包装内存视图)编写自己的有限元求解器,用于cython中的动态仿真。在每个时间步骤中,我都必须组装刚度矩阵,并通过添加矩阵中每一行的绝对值,使用Gerschgoring圆定理来估计其最大特征值。对于程序集,我使用的是coo_matrix
格式。这是我的汇编代码的简短版本:
for el in range(nElemens):
Klocal()
for i in range(9):
for j in range(9):
data(index) = Klocal(i,j)
index += 1
K = coo_matrix((data, (row, col)), shape=(ndof, ndof)).tocsc()
K.eliminate_zeros()
运行探查器时,我得到以下结果:
ncalls tottime percall cumtime percall filename:lineno(function)
458 264.720 0.578 264.720 0.578 {built-in method lexsort}
1 84.764 84.764 486.663 486.663 main.py:9(main)
458 61.473 0.134 343.218 0.749 coo.py:460(_sum_duplicates)
458 12.933 0.028 12.933 0.028 {method 'reduceat' of 'numpy.ufunc' objects}
2775 11.192 0.004 11.193 0.004 {method 'reduce' of 'numpy.ufunc' objects}
16063 8.627 0.001 8.627 0.001 {built-in method array}
28419916 6.933 0.000 6.933 0.000 membrane3D.pyx:366(membrane3DKmat)
每次组装矩阵时,scipy内部调用的lexsort
和reduceat
函数都会浪费大量时间。我的问题是我是否可以在scipy中重用矩阵的非零结构(保持不变并易于计算)以节省时间?或者,您是否建议我为Eigen的稀疏矩阵使用包装器?
任何帮助将不胜感激!