我需要求解2D泊松方程,即AX = B中的方程组,其中A是n×n矩阵,B是n-by-1矢量。作为2D泊松问题的离散化矩阵,我知道只有5个对角线不会为空。 Lapack不提供解决这一特定问题的函数,但它具有求解带状矩阵方程组的函数,即DGBTRF(用于LU分解)和DGBTRS。现在,5个对角线是:主对角线,主要上方和下方的第一对角线以及主对角线上方和对角线上方和下方的两条对角线。在阅读了关于带存储的lapack文档之后,我了解到我必须创建一个(3 * m + 1)-by-n矩阵来存储A带内存储格式,让我们调用这个矩阵AB。现在的问题是:
1)dgbtrs和dgbtrs_有什么区别?英特尔MKL提供了两种,但我无法理解为什么
2)dgbtrf要求带存储矩阵为数组。我应该按行还是按列线性化AB?
3)这是调用这两个函数的正确方法吗?
int n, m;
double *AB;
/*... fill n, m, AB, with appropriate numbers */
int *pivots;
int nrows = 3 * m + 1, info, rhs = 1;
dgbtrf_(&n, &n, &m, &m, AB, &nrows, pivots, &info);
char trans = 'N';
dgbtrs_(&trans, &n, &m, &m, &rhs, AB, &nrows, pivots, B, &n, &info);
答案 0 :(得分:0)
它还提供DGBTRS
和DGBTRS_
。这些是你不应该关心的fortran administrativa。只需调用dgbtrs
(原因是在某些体系结构上,fortran例程名称附加了下划线,而另一些不是,并且名称可能是大写或小写 - 英特尔MKL #define
是正确的dgbtrs
{1}})。
LAPACK例程需要列主要矩阵(即Fortran样式):将列一个接一个地存储。您必须使用的带状存储并不难:http://www.netlib.org/lapack/lug/node124.html。
这对我来说似乎不错,但请事先尝试一下小问题(顺便说一下总是好主意)。还要确保处理非零info
(这是报告错误的方式)。
更好的风格是使用MKL_INT
而不是普通int
,这是正确类型的typedef(在某些架构上可能有所不同)。
同时确保在致电pivots
之前为dgbtrf
分配内存。
答案 1 :(得分:0)
这可能不是主题。但对于泊松方程,基于FFT的解决方案要快得多。只需对你的势场进行2D FFT,除以 - (k ^ 2 + lambda ^ 2),然后进行IFFT。 lambda是一个小数,以避免k = 0时的分歧。 5对角方程是泊松方程的带限近似,它通过有限差分逼近微分算子。