|These subroutines compute the QR factorization of a general matrix A, where, in this description:
If m = 0 or n = 0, no computation is performed and the subroutine returns after doing some parameter checking.
A, tau, work | Subroutine |
Long-precision real | PDGEQRF |
Long-precision complex | PZGEQRF |
Fortran | CALL PDGEQRF | PZGEQRF (m, n, a, ia, ja, desc_a, tau, work, lwork, info) |
C and C++ | pdgeqrf | pzgeqrf (m, n, a, ia, ja, desc_a, tau, work, lwork, info); |
Scope: global
Specified as: a fullword integer; m >= 0.
Scope: global
Specified as: a fullword integer; n >= 0.
Scope: local
Specified as: an LLD_A by (at least) LOCq(N_A) array, containing numbers of the data type indicated in Table 63. Details about the block-cyclic data distribution of global matrix A are stored in desc_a.
Scope: global
Specified as: a fullword integer; 1 <= ia <= M_A and ia+m-1 <= M_A.
Scope: global
Specified as: a fullword integer; 1 <= ja <= N_A and ja+n-1 <= N_A.
desc_a | Name | Description | Limits | Scope |
---|---|---|---|---|
1 | DTYPE_A | Descriptor type | DTYPE_A=1 | Global |
2 | CTXT_A | BLACS context | Valid value, as returned by BLACS_GRIDINIT or BLACS_GRIDMAP | Global |
3 | M_A | Number of rows in the global matrix | If m = 0 or n = 0:
M_A >= 0
Otherwise: M_A >= 1 | Global |
4 | N_A | Number of columns in the global matrix | If m = 0 or n = 0:
N_A >= 0
Otherwise: N_A >= 1 | Global |
5 | MB_A | Row block size | MB_A >= 1 | Global |
6 | NB_A | Column block size | NB_A >= 1 | Global |
7 | RSRC_A | The process row of the p × q grid over which the first row of the global matrix is distributed | 0 <= RSRC_A < p | Global |
8 | CSRC_A | The process column of the p × q grid over which the first column of the global matrix is distributed | 0 <= CSRC_A < q | Global |
9 | LLD_A | The leading dimension of the local array | LLD_A >= max(1,LOCp(M_A)) | Local |
Specified as: an array of (at least) length 9, containing fullword integers.
If lwork = 0, work is ignored.
If lwork <> 0, work is the work area used by this subroutine, where:
Scope: local
Specified as: an area of storage containing numbers of data type indicated in Table 63.
Scope:
Specified as: a fullword integer; where:
lwork >= nb (mp0 + nq0 + nb)
where:
The elements on and above the diagonal of Aia:ia+m-1, ja:ja+n-1 contain the min(m, n) × n upper trapezoidal matrix R (R is upper triangular if m >= n). The elements below the diagonal with tau represent |the matrix Q as a product of elementary reflectors.
Scope: local
Returned as: an LLD_A by (at least) LOCq(N_A) array, containing numbers of the data type indicated in Table 63. Details about the block-cyclic data distribution of global matrix A are stored in desc_a.
This identifies the first element of the local array tau. This subroutine computes the location of the first element of the local subarray used, based on ja, desc_a, p, q, myrow, and mycol; therefore, the leading 1 by LOCq(ja+min(m, n)-1) part of the local array tau must contain the local pieces of the leading 1 by ja+min(m, n)-1 part of the global matrix tau.
A copy of the vector tau, with a block size of NB_A and global index ja, is returned to each row of the process grid. The process column over which the first column of tau is distributed is CSRC_A.
Scope: local
Returned as: a 1 by (at least) LOCq(ja+min(m, n)-1) array, containing numbers of the data type indicated in Table 63.
If lwork <> 0 and lwork <> -1, its size is (at least) of length lwork.
If lwork = -1, its size is (at least) of length 1.
Scope: local
Returned as: an area of storage, where:
If lwork >= 1 or lwork = -1, then work1 is set to the minimum lwork value and contains numbers of the data type indicated in Table 63. Except for work1, the contents of work are overwritten on return.
Scope: global
Returned as: a fullword integer; info = 0.
|These subroutines compute the QR factorization of a general |matrix A.
|A = QR
|where: |
|Q = Hja |Hja+1 ... |Hja+k-1
|where: |
|where: |
|where: |
|vi+1:m is stored on return in |submatrix Aia+i: |ia+m-1, ja+i-1.
|tau is stored on return in |tauja+i-1. |
None
Stage 5: If m <> 0 and n <> 0:
where:
Each of the following global input arguments are checked to determine whether its value differs from the value specified on process P00:
Also:
This example shows the QR factorization of a real general matrix of size 4 × 3, using a 2 × 2 process grid.
ORDER = 'R' NPROW = 2 NPCOL = 2 CALL BLACS_GET(0, 0, ICONTXT) CALL BLACS_GRIDINIT(ICONTXT, ORDER, NPROW, NPCOL) CALL BLACS_GRIDINFO(ICONTXT, NPROW, NPCOL, MYROW, MYCOL) M N A IA JA DESC_A TAU WORK LWORK INFO | | | | | | | | | | CALL PDGEQRF( 4 , 3 , A , 1 , 1 , DESC_A , TAU , WORK , 0 , INFO)
| DESC_A |
---|---|
DTYPE_ | 1 |
CTXT_ | icontxt(IOBG55) |
M_ | 4 |
N_ | 3 |
MB_ | 1 |
NB_ | 1 |
RSRC_ | 0 |
CSRC_ | 0 |
LLD_ | See below(EPSSL55) |
Notes: |
Global general matrix A of size 4 × 3 with block sizes 1 × 1:
B,D 0 1 2 * * 0 | 1.00 | -2.00 | -1.00 | | -------|---------|------- | 1 | 2.00 | .00 | 1.00 | | -------|---------|------- | 2 | 2.00 | -4.00 | 2.00 | | -------|---------|------- | 3 | 4.00 | .00 | .00 | * *
The following is the 2 × 2 process grid:
B,D | 0 2 | 1 -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11 3 | |
Local arrays for A:
p,q | 0 | 1 -----|--------------|-------- 0 | 1.00 -1.00 | -2.00 | 2.00 2.00 | -4.00 -----|--------------|-------- 1 | 2.00 1.00 | 0.00 | 4.00 0.00 | 0.00
Output:
Global general matrix A of size 4 × 3 with block sizes 1 × 1:
B,D 0 1 2 * * 0 | -5.00 | 2.00 | -1.00 | | -------|---------|------- | 1 | 0.33 | -4.00 | 1.00 | | -------|---------|------- | 2 | 0.33 | -0.50 | -2.00 | | -------|---------|------- | 3 | 0.67 | 0.50 | 0.00 | * *
The following is the 2 × 2 process grid:
B,D | 0 2 | 1 -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11 3 | |
Local arrays for A:
p,q | 0 | 1 -----|----------------|--------- 0 | -5.00 -1.00 | 2.00 | 0.33 -2.00 | -0.50 -----|----------------|--------- 1 | 0.33 1.00 | -4.00 | 0.67 0.00 | 0.50
Global row vector tau of length 3 with block size of 1:
B,D 0 1 2 * * 0 | 1.20 | 1.33 | 2.00 | * *
The following is the 2 × 2 process grid:
B,D | 0 2 | 1 -----| ------- |----- | P00 | P01 | | -----| ------- |----- | P10 | P11 | |
Local arrays for tau:
p,q | 0 | 1 -----|----------------|--------- 0 | 1.20 2.00 | 1.33 -----|----------------|--------- 1 | 1.20 2.00 | 1.33
The value of info is 0 on all processes.
|This example shows the QR factorization of a complex general |matrix of size 3 × 4, using a 2 × 2 process |grid.
|ORDER = 'R' |NPROW = 2 |NPCOL = 2 |CALL BLACS_GET(0, 0, ICONTXT) |CALL BLACS_GRIDINIT(ICONTXT, ORDER, NPROW, NPCOL) |CALL BLACS_GRIDINFO(ICONTXT, NPROW, NPCOL, MYROW, MYCOL) | | M N A IA JA DESC_A TAU WORK LWORK INFO | | | | | | | | | | | |CALL PZGEQRF( 3 , 4 , A , 1 , 1 , DESC_A , TAU , WORK , 0 , INFO)
| DESC_A |
---|---|
DTYPE_ | 1 |
CTXT_ | icontxt(IOBG56) |
M_ | 3 |
N_ | 4 |
MB_ | 1 |
NB_ | 1 |
RSRC_ | 0 |
CSRC_ | 0 |
LLD_ | See below(EPSSL56) |
Notes: |
|Global general matrix A of size 3 × 4 with block |sizes 1 × 1:
| 0 1 2 3 | * * | | --------------|---------------|-------------- |-------------- | | 0 | ( 1.00, 0.00) | (-2.00, 1.00) | (-3.00,-1.00) | ( 4.00,-3.00) | | | --------------|---------------|-------------- |-------------- | | 1 | ( 1.00,-1.00) | ( 2.00, 2.00) | (-3.00, 0.00) | (-4.00,-2.00) | | | --------------|---------------|-------------- |-------------- | | 2 | ( 1.00,-2.00) | (-2.00, 3.00) | (-3.00, 1.00) | ( 4.00,-1.00) | | | --------------|---------------|-------------- |-------------- | | * * |
|The following is the 2 × 2 process grid:
|B,D | 0 2 | 1 3 |-----| ------- |----- |0 | P00 | P01 |2 | | |-----| ------- |----- |1 | P10 | P11 |
|Local arrays for A:
|p,q | 0 | 1 |-----|--------------------------------|----------------------------- | 0 | ( 1.00, 0.00) (-3.00,-1.00) | (-2.00, 1.00) ( 4.00,-3.00) | | ( 1.00,-2.00) (-3.00, 1.00) | (-2.00, 3.00) ( 4.00,-1.00) |-----|--------------------------------|----------------------------- | 1 | ( 1.00,-1.00) (-3.00, 0.00) | ( 2.00, 2.00) (-4.00,-2.00) |
|Global general matrix A of size 3 × 4 with block |sizes 1 × 1:
| 0 1 2 3 | * * | | --------------|---------------|-------------- |-------------- | | 0 | (-2.83, 0.00) | ( 3.54,-1.41) | ( 3.89, 3.18) | (-2.83, 0.71) | | | --------------|---------------|-------------- |-------------- | | 1 | ( 0.26,-0.26) | (-3.39, 0.00) | ( 0.37,-0.37) | ( 6.78, 0.74) | | | --------------|---------------|-------------- |-------------- | | 2 | ( 0.26,-0.52) | (-0.29,-0.09) | (-1.87, 0.00) | ( 1.87,-1.87) | | | --------------|---------------|-------------- |-------------- | | * * |
|The following is the 2 × 2 process grid:
|B,D | 0 2 | 1 3 |-----| ------- |----- |0 | P00 | P01 |2 | | |-----| ------- |----- |1 | P10 | P11 |
|Local arrays for A:
|p,q | 0 | 1 |-----|--------------------------------|----------------------------- | 0 | (-2.83, 0.00) ( 3.89, 3.18) | ( 3.54,-1.41) (-2.83, 0.71) | | ( 0.26,-0.52) (-1.87, 0.00) | (-0.29,-0.09) ( 1.87,-1.87) |-----|--------------------------------|----------------------------- | 1 | ( 0.26,-0.26) ( 0.37,-0.37) | (-3.39, 0.00) ( 6.78, 0.74) |
|Global row vector tau of length 3 with block size of 1:
| 0 1 2 | * * | | --------------|---------------|-------------- | | | ( 1.35, 0.00) | ( 1.83,-0.02) | ( 1.47,-0.88) | | | --------------|---------------|-------------- | | * * |
|The following is the 2 × 2 process grid.
|B,D | 0 2 | 1 |-----| ------- |----- | | P00 | P01 |-----| ------- |----- | | P10 | P11 |
|Local arrays for tau:
|p,q | 0 | 1 |-----|--------------------------------|--------------- | 0 | ( 1.35, 0.00) ( 1.47,-0.88) | ( 1.83,-0.02) |-----|--------------------------------|--------------- | 1 | ( 1.35, 0.00) ( 1.47,-0.88) | ( 1.83,-0.02) |
|The value of info is 0 on all processes.