背景
我正在使用交替方向隐式 (ADI) 方法求解 3D 中的不稳定热方程。这意味着我在一个时间步长内求解三个不同的三对角系统(每个笛卡尔轴一次)。这些矩阵的大小约为 10^5 x 10^5。
尽管每个方向的A矩阵沿三个对角线都具有非零值,但在某些情况下,一个方向沿对角线之一将具有零值,而另一个方向则没有。
我最初的计划是建立一个 AIJ 矩阵并为 3 个非零值预分配,并为三个方向中的每一个重用相同的内存分配。这可以很好地解决第一个方向,但是当我击中第二个方向时,PETSc 会抱怨,因为我试图在以前没有的地方添加一个新的非零值(与边界条件的差异有关)。
问题
最有效的方法是什么:
- 有没有办法以不同的方式分配,让我的值在零和非零之间变化?
- 或者我应该为每个方向创建一个新矩阵和新分配?(我知道这可行,但我担心为每个解决方案破坏和创建新矩阵的开销。)
- 其他选择?
在伪代码中,我的程序如下所示:
// Create and preallocate A matrix:
MatCreateAIJ(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,M,3,NULL,3,NULL,&Amat);
// Create x vector
VecCreate(PETSC_COMM_WORLD,&x);
// Create b vector
VecDuplicate(x,&b);
// Solve for each timestep:
for (each timestep)
{
for (X,Y,Z)
{
MatSetValues(Amat,...,INSERT_VALUES);
VecSetValues(b,...,INSERT_VALUES);
MatAssemblyBegin(Amat,MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(Amat,MAT_FINAL_ASSEMBLY);
VecAssemblyBegin(b);
VecAssemblyEnd(b);
KSPSetOperators(ksp, Amat, Amat, DIFFERENT_NONZERO_PATTERN);
KSPSetUp(ksp);
KSPSolve(ksp,b,x);
MatZeroEntries(Amat);
}
}