鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

P?GETRF

计算矩阵A的LU分解,允许行交换(partial pivoting)。分解结果为A=PLU,其中P为置换矩阵、L为下三角矩阵或下阶梯矩阵且对角线为1,U是上三角矩阵或上阶梯矩阵。

接口定义

C Interface:

void psgetrf_(const int *m, const int *n, float *a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)

void pdgetrf_(const int *m, const int *n, double*a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)

void pcgetrf_(const int *m, const int *n, float _Complex *a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)

void pzgetrf_(const int *m, const int *n, double _Complex*a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)

Fortran Interface:

PSGETRF(m, n, a, ia, ja, desca, ipiv, info)

PDGETRF(m, n, a, ia, ja, desca, ipiv, info)

PCGETRF(m, n, a, ia, ja, desca, ipiv, info)

PZGETRF(m, n, a, ia, ja, desca, ipiv, info)

参数

参数

类型

范围

说明

输入/输出

m

整型

全局

要操作的行数,比如子矩阵的行数。

输入

n

整型

全局

要操作的列数,比如子矩阵的列数。

输入

a

  • 在psgetrf中为单精度浮点型数组。
  • 在pdgetrf中为双精度浮点型数组。
  • 在pcgetrf中为单精度复数型数组。
  • 在pzgetrf中为双精度复数型数组。

本地

  • 调用前保存分布式矩阵A的本地M*N部分。
  • 调用后保存本地部分存放的分解结果L和U,不保存L的对角线元素(均为1)。

输入,输出

ia

整型

全局

子矩阵在全局矩阵中的行索引。

输入

ja

整型

全局

子矩阵在全局矩阵中的列索引。

输入

desca

整型数组

本地,全局

分布式矩阵A的矩阵描述符。

输入

ipiv

整型

本地

包含了主元信息。

输出

info

整型

全局

执行结果:

  • 等于0:成功。
  • 小于0:第-info个参数值不合法。
  • 大于0:矩阵U对角线上第info个元素为0,矩阵分解完成但U是奇异的,会导致求解线程方程组时出现除以零的错误。

输出

依赖

#include <kscalapack.h>

#include <kscalapack_utils.h>

示例

C Interface:
    int m = 8;
    int n = 8;       
    int nprow = 2;   
    int npcol = 2;
    int mb = 4;:q   
    int nb = 4;          
    np = 4;
    int descA[9];
    int info;
    int ipiv[10] = {0};
    int lddA = mpA > 1 ? mpA : 1;
    descinit_( descA,  &n, &n, &nb, &nb, &izero, &izero, &ictxt, &lddA, &info);     
    /* 
     * Origin A: 
     *  

    4.00000 19.0000 25.0000 16.0000 19.0000 19.0000 25.0000 16.0000
    22.0000 8.00000 17.0000 25.0000 22.0000 21.0000 17.0000 25.0000
    23.0000 22.0000 7.00000 19.0000 23.0000 22.0000 18.0000 19.0000
    21.0000 18.0000 23.0000 13.0000 21.0000 18.0000 23.0000 22.0000
    19.0000 19.0000 25.0000 16.0000 4.00000 19.0000 25.0000 16.0000
    22.0000 21.0000 17.0000 25.0000 22.0000 8.00000 17.0000 25.0000
    23.0000 22.0000 18.0000 19.0000 23.0000 22.0000 7.00000 19.0000
    21.0000 18.0000 23.0000 22.0000 21.0000 18.0000 23.0000 13.0000
    */
    /* Query optimal work size */ 
    pdgetrf_(&n, &n, A, &ione, &ione, descA, ipiv, &info);
    // run with 4 processes
    * After PDGETRF: 
    /*
    23.0000 22.0000 7.00000 19.0000 23.0000 22.0000 18.0000 19.0000
    0.173913 15.1739 23.7826 12.6957 15.0000 15.1739 21.8696 12.6957
    0.956522 -0.859599 30.7479 17.7393 12.8940 13.0000 18.5817 17.7393
    0.913043 -0.137536 0.646538 -14.0708 -6.27341 -8.40499 -2.44069 -5.07082
    0.826087 0.0544413 0.582891 0.762348 -18.5499 -1.17005 -0.0305972 -6.86113
    0.956522 -0.00286533 0.337340 -0.0624197 0.253277 -17.6137 -6.56767 2.29955
    1.00000 0.00000 0.357749 0.451018 0.0961398 0.0424351 -16.2651 -3.49711
    0.913043 -0.137536 0.646538 0.360379 0.216315 0.290848 -0.0218688 -11.5045
    */