我一直在 Fortran 2008 中研究有限元代码,并实现了我自己的稀疏矩阵类型。我发现将局部刚度矩阵(真实类型)映射到全局 COO 稀疏类型,然后转换为 CSC 效果很好,但超过一定大小时,对 COO 进行排序变得令人望而却步。
相反,我想直接构建 CSC 矩阵,但我无法让它足够快。我不想让任何人对我的代码细节感到厌烦,但我尝试了以下方法:
将每个局部刚度矩阵中的值插入到预先声明的全局 CSC 矩阵中。这很慢,因为分配新空间并将列指针向右移动很慢。
实现 CSC 添加并将每个元素的局部刚度矩阵映射到一个空的全局矩阵,然后依次添加。
尝试构建邻接矩阵,以便预先分配所有条目。事实证明这同样缓慢。
我对你的结构性想法很感兴趣。人们通常如何做到这一点?我的代码是在非结构化网格上使用二阶元素的 3D 代码。一个较小的问题有大约 400 万个节点。
仅供参考,COO-> CSC 在大型矩阵上传输的问题是我实现了合并排序,一旦总数据大于约 32MB,我的实现就会爬网。