如何使用cython多次有效地组装刚度矩阵

时间:2018-12-22 13:16:08

标签: python scipy cython

我正在使用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内部调用的lexsortreduceat函数都会浪费大量时间。我的问题是我是否可以在scipy中重用矩阵的非零结构(保持不变并易于计算)以节省时间?或者,您是否建议我为Eigen的稀疏矩阵使用包装器?

任何帮助将不胜感激!

0 个答案:

没有答案