我正在用 C++ 编写一个有限元求解器。主要瓶颈是在稀疏压缩行存储中组装全局刚度矩阵(到目前为止,我只解决稳定问题)。因为我不知道每行中存在多少非零条目,所以我目前假设每行非零数的上限是恒定的。我的代码目前看起来像:
int nrow[fem.Np+1]; //row vector in CRS format initialized to 0
int ncol[fem.Np*MAX_NNZ]; //column vector in CRS format initialized to -1
double A[fem.Np*MAX_NNZ]; //values vector in CRS format initialized to 0.0
//update nrow, ncol, and A
//MAX_NNZ is the constant upper bound on the number of nonzeros per row
//Np=='number of points (nodes)
//Npe=='number of points per element e.g. 3 for linear triangles
//kmat[Npe][Npe] is the previously computed local element stiffness matrix
for(int i=0;i<e.Npe;i++)
{
for(int j=0;j<e.Npe;j++)
{
r = e.nodes[i];
c = e.nodes[j];
for(int p=MAX_NNZ*r-MAX_NNZ;p<MAX_NNZ*r;p++)
{
if(ncol[p]==-1)
{
for(int l=r;l<fem.Np+1;l++)
nrow[l]++;
ncol[p] = c-1;
A[p] = e.kmat[i][j];
break;
}
else if(ncol[p]==c-1)
{
A[p] = A[p] + e.kmat[i][j];
break;
}
}
}
这是以 CRS 格式组装全局矩阵的最有效方法吗?我可以做些改进吗?谢谢。