我目前使用显式矩阵存储来表示$ AX = \ lambda BX $形式的广义特征值方程,其特征值为lambda和特征向量$ X $。 $ A $和$ B $是五边形的块,Hermitian和每个块都是Hermitian。
问题是对于大型模拟,内存使用失控。因此,我想切换到Shell矩阵。另外一个优点是,我可以避免重复大量信息,因为A和B都是通过有限差分填充的。即,函数X的一阶导数可以近似为$ X_i' = \ frac {X_ {i + 1} -X_ {i-1}} {\ Delta} $,以便同一条信息出现在两个地方。对于更高的订单,它会变得更糟糕。
当我尝试在Fortran中实现它时,使用多个MPI进程,每个进程包含$ A $和$ B $的一部分行,我偶然发现了以下问题:要执行矩阵乘法,需要矢量信息由于$ A $和$ B $的非对角线元素,在每个等级间隔结束时来自其他等级的$ X $。
我找到了一个概念解决方案,将MPI全部用于所有传递来自这些" ghosted"的信息的命令。地区到隔壁的行列。但是,我担心这可能不是最便携的,也不是太优雅。
有没有办法自动化从Petsc / Slepc的鬼区获取信息的过程?