|
|
| |
| # lines: |
294 | | # code: |
294 | | # comment: | 0 | |
# blank: | 0 |
| # Variables: | 37 |
| # Callers: | 1 |
| # Callings: | 3 |
| # Words: | 109 |
| # Keywords: | 60 |
|
|
|
|
|
..
.. Array Arguments ..
..
Purpose
=======
PCGEHD2 reduces a complex general distributed matrix sub( A )
to upper Hessenberg form H by an unitary similarity transformation:
Q' * sub( A ) * Q = H, where
sub( A ) = A(IA+N-1:IA+N-1,JA+N-1:JA+N-1).
Notes
=====
Each global data object is described by an associated description
vector. This vector stores the information required to establish
the mapping between an object element and its corresponding process
and memory location.
Let A be a generic term for any 2D block cyclicly distributed array.
Such a global array has an associated description vector DESCA.
In the following comments, the character _ should be read as
"of the global array".
NOTATION STORED IN EXPLANATION
--------------- -------------- --------------------------------------
DTYPE_A(global) DESCA( DTYPE_ )The descriptor type. In this case,
DTYPE_A = 1.
CTXT_A (global) DESCA( CTXT_ ) The BLACS context handle, indicating
the BLACS process grid A is distribu-
ted over. The context itself is glo-
bal, but the handle (the integer
value) may vary.
M_A (global) DESCA( M_ ) The number of rows in the global
array A.
N_A (global) DESCA( N_ ) The number of columns in the global
array A.
MB_A (global) DESCA( MB_ ) The blocking factor used to distribute
the rows of the array.
NB_A (global) DESCA( NB_ ) The blocking factor used to distribute
the columns of the array.
RSRC_A (global) DESCA( RSRC_ ) The process row over which the first
row of the array A is distributed.
CSRC_A (global) DESCA( CSRC_ ) The process column over which the
first column of the array A is
distributed.
LLD_A (local) DESCA( LLD_ ) The leading dimension of the local
array. LLD_A >= MAX(1,LOCr(M_A)).
Let K be the number of rows or columns of a distributed matrix,
and assume that its process grid has dimension p x q.
LOCr( K ) denotes the number of elements of K that a process
would receive if K were distributed over the p processes of its
process column.
Similarly, LOCc( K ) denotes the number of elements of K that a
process would receive if K were distributed over the q processes of
its process row.
The values of LOCr() and LOCc() may be determined via a call to the
ScaLAPACK tool function, NUMROC:
LOCr( M ) = NUMROC( M, MB_A, MYROW, RSRC_A, NPROW ),
LOCc( N ) = NUMROC( N, NB_A, MYCOL, CSRC_A, NPCOL ).
An upper bound for these quantities may be computed by:
LOCr( M ) <= ceil( ceil(M/MB_A)/NPROW )*MB_A
LOCc( N ) <= ceil( ceil(N/NB_A)/NPCOL )*NB_A
Arguments
=========
N (global input) INTEGER
The number of rows and columns to be operated on, i.e. the
order of the distributed submatrix sub( A ). N >= 0.
ILO (global input) INTEGER
IHI (global input) INTEGER
It is assumed that sub( A ) is already upper triangular in
rows IA:IA+ILO-2 and IA+IHI:IA+N-1 and columns JA:JA+JLO-2
and JA+JHI:JA+N-1. See Further Details. If N > 0,
1 <= ILO <= IHI <= N; otherwise set ILO = 1, IHI = N.
A (local input/local output) COMPLEX pointer into the
local memory to an array of dimension (LLD_A,LOCc(JA+N-1)).
On entry, this array contains the local pieces of the N-by-N
general distributed matrix sub( A ) to be reduced. On exit,
the upper triangle and the first subdiagonal of sub( A ) are
overwritten with the upper Hessenberg matrix H, and the ele-
ments below the first subdiagonal, with the array TAU, repre-
sent the unitary matrix Q as a product of elementary
reflectors. See Further Details.
IA (global input) INTEGER
The row index in the global array A indicating the first
row of sub( A ).
JA (global input) INTEGER
The column index in the global array A indicating the
first column of sub( A ).
DESCA (global and local input) INTEGER array of dimension DLEN_.
The array descriptor for the distributed matrix A.
TAU (local output) COMPLEX array, dimension LOCc(JA+N-2)
The scalar factors of the elementary reflectors (see Further
Details). Elements JA:JA+ILO-2 and JA+IHI:JA+N-2 of TAU are
set to zero. TAU is tied to the distributed matrix A.
WORK (local workspace/local output) COMPLEX array,
dimension (LWORK)
On exit, WORK( 1 ) returns the minimal and optimal LWORK.
LWORK (local or global input) INTEGER
The dimension of the array WORK.
LWORK is local input and must be at least
LWORK >= NB + MAX( NpA0, NB )
where NB = MB_A = NB_A, IROFFA = MOD( IA-1, NB ),
IAROW = INDXG2P( IA, NB, MYROW, RSRC_A, NPROW ),
NpA0 = NUMROC( IHI+IROFFA, NB, MYROW, IAROW, NPROW ),
INDXG2P and NUMROC are ScaLAPACK tool functions;
MYROW, MYCOL, NPROW and NPCOL can be determined by calling
the subroutine BLACS_GRIDINFO.
If LWORK = -1, then LWORK is global input and a workspace
query is assumed; the routine only calculates the minimum
and optimal size for all work arrays. Each of these
values is returned in the first entry of the corresponding
work array, and no error message is issued by PXERBLA.
INFO (local output) INTEGER
= 0: successful exit
< 0: If the i-th argument is an array and the j-entry had
an illegal value, then INFO = -(i*100+j), if the i-th
argument is a scalar and had an illegal value, then
INFO = -i.
Further Details
===============
The matrix Q is represented as a product of (ihi-ilo) elementary
reflectors
Q = H(ilo) H(ilo+1) . . . H(ihi-1).
Each H(i) has the form
H(i) = I - tau * v * v'
where tau is a complex scalar, and v is a complex vector with
v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on
exit in A(ia+ilo+i:ia+ihi-1,ja+ilo+i-2), and tau in TAU(ja+ilo+i-2).
The contents of A(IA:IA+N-1,JA:JA+N-1) are illustrated by the follo-
wing example, with n = 7, ilo = 2 and ihi = 6:
on entry on exit
( a a a a a a a ) ( a a h h h h a )
( a a a a a a ) ( a h h h h a )
( a a a a a a ) ( h h h h h h )
( a a a a a a ) ( v2 h h h h h )
( a a a a a a ) ( v2 v3 h h h h )
( a a a a a a ) ( v2 v3 v4 h h h )
( a ) ( a )
where a denotes an element of the original matrix sub( A ), h denotes
a modified element of the upper Hessenberg matrix H, and vi denotes
an element of the vector defining H(ja+ilo+i-2).
Alignment requirements
======================
The distributed submatrix sub( A ) must verify some alignment proper-
ties, namely the following expression should be true:
( MB_A.EQ.NB_A .AND. IROFFA.EQ.ICOFFA )
=====================================================================
.. Parameters ..
|
|
|
|
001 SUBROUTINE PCGEHD2( N , ILO , IHI , A , IA , JA , DESCA , TAU , WORK ,
002 $LWORK , INFO )
003
004 * -- ScaLAPACK auxiliary routine(version 1.7) --
005 * University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
006 * and University of California , Berkeley.
007 * May 1 , 1997
008
009 * .. Scalar Arguments ..
010 INTEGER IA , IHI , ILO , INFO , JA , LWORK , N
011 INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
012 $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
013 PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
014 $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
015 $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
016 COMPLEX ONE
017 PARAMETER( ONE =( 1.0E + 0 , 0.0E + 0 ) )
018 * ..
019 * .. Local Scalars ..
020 LOGICAL LQUERY
021 INTEGER I , IAROW , ICOFFA , ICTXT , IROFFA , J , K , LWMIN ,
022 $MYCOL , MYROW , NPA0 , NPCOL , NPROW
023 COMPLEX AII
024 * ..
025 * .. External Subroutines ..
026 EXTERNAL BLACS_ABORT , BLACS_GRIDINFO , CHK1MAT , PCELSET ,
027 $PCLARF , PCLARFC , PCLARFG , PXERBLA
028 * ..
029 * .. External Functions ..
030 INTEGER INDXG2P , NUMROC
031 EXTERNAL INDXG2P , NUMROC
032 * ..
033 * .. Intrinsic Functions ..
034 INTRINSIC CMPLX , MAX , MIN , MOD , REAL
035 * ..
036 * .. Executable Statements ..
037
038 * Get grid parameters
039
040 ICTXT = DESCA( CTXT_ )
041 CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
042
043 * Test the input parameters
044
045 INFO = 0
046 IF( NPROW.EQ. - 1 ) THEN
046
047 INFO = - (700 + CTXT_)
048 ELSE
048
049 CALL CHK1MAT( N , 1 , N , 1 , IA , JA , DESCA , 7 , INFO )
050 IF( INFO.EQ.0 ) THEN
050
051 IROFFA = MOD( IA - 1 , DESCA( MB_ ) )
052 ICOFFA = MOD( JA - 1 , DESCA( NB_ ) )
053 IAROW = INDXG2P( IA , DESCA( MB_ ) , MYROW , DESCA( RSRC_ ) ,
054 $ NPROW )
055 NPA0 = NUMROC( IHI + IROFFA , DESCA( MB_ ) , MYROW , IAROW ,
056 $ NPROW )
057 LWMIN = DESCA( NB_ ) + MAX( NPA0 , DESCA( NB_ ) )
058
059 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
060 LQUERY =( LWORK.EQ. - 1 )
061 IF( ILO.LT.1 .OR. ILO.GT.MAX( 1 , N ) ) THEN
061
062 INFO = - 2
063 ELSE IF( IHI.LT.MIN( ILO , N ) .OR. IHI.GT.N ) THEN
063
064 INFO = - 3
065 ELSE IF( IROFFA.NE.ICOFFA ) THEN
065
066 INFO = - 6
067 ELSE IF( DESCA( MB_ ).NE.DESCA( NB_ ) ) THEN
067
068 INFO = - (700 + NB_)
069 ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
069
070 INFO = - 10
071 END IF
072 END IF
073 END IF
074
075 IF( INFO.NE.0 ) THEN
075
076 CALL PXERBLA( ICTXT , 'PCGEHD2' , - INFO )
077 CALL BLACS_ABORT( ICTXT , 1 )
078 RETURN
079 ELSE IF( LQUERY ) THEN
079
080 RETURN
081 END IF
082
083 DO 10 K = ILO , IHI - 1
083
084 I = IA + K - 1
085 J = JA + K - 1
086
087 * Compute elementary reflector H(j) to annihilate
088 * A(i + 2 : ihi + ia - 1 , j)
089
090 CALL PCLARFG ( IHI - K , AII , I + 1 , J , A , MIN( I + 2 , N + IA - 1 ) , J ,
091 $ DESCA , 1 , TAU )
092 CALL PCELSET( A , I + 1 , J , DESCA , ONE )
093
094 * Apply H(k) to A(ia : ihi + ia - 1 , j + 1 : ihi + ja - 1) from the right
095
096 CALL PCLARF ( 'Right' , IHI , IHI - K , A , I + 1 , J , DESCA , 1 , TAU , A ,
097 $ IA , J + 1 , DESCA , WORK )
098
099 * Apply H(j) to A(i + 1 : ia + ihi - 1 , j + 1 : ja + n - 1) from the left
100
101 CALL PCLARFC ( 'Left' , IHI - K , N - K , A , I + 1 , J , DESCA , 1 , TAU , A ,
102 $ I + 1 , J + 1 , DESCA , WORK )
103
104 CALL PCELSET( A , I + 1 , J , DESCA , AII )
105 10 CONTINUE
106
107 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
108
109 RETURN
110
111 * End of PCGEHD2
112
113 END20
11
|
|
Variables in Routine PCGEHD2()
| Summary Report |
| Data Type | Quantity | Size(byte) |
| COMPLEX | 2 | 8 |
| INTEGER | 33 | 132 |
| LOGICAL | 1 | 1 |
| REAL | 1 | 4 |
| TOTAL | 37 | 145 |
List of Variables
COMPLEX
INTEGER
| BLOCK_CYCLIC_2D | CSRC_ | CTXT_ | DLEN_ | DTYPE_ |
| I | IA | IAROW | ICOFFA | ICTXT |
| IHI | ILO | INDXG2P | INFO | IROFFA |
| J | JA | K | LLD_ | LWMIN |
| LWORK | M_ | MB_ | MYCOL | MYROW |
| N | N_ | NB_ | NPA0 | NPCOL |
| NPROW | NUMROC | RSRC_ | | |
LOGICAL
REAL
Variables Dependence Graph Put the mouse over a right hand side variable to display the corresponding line of the dependence | | - | | - | - | | I | <--- | KI = IA + K - 1, IAI = IA + K - 1 |
| IAROW | <--- | INDXG2PIAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),, MB_IAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),, MYROWIAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),, NPROWIAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),, RSRC_IAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),, IAIAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), |
| ICOFFA | <--- | JAICOFFA = MOD( JA-1, DESCA( NB_ ) ), NB_ICOFFA = MOD( JA-1, DESCA( NB_ ) ) |
| ICTXT | <--- | CTXT_ICTXT = DESCA( CTXT_ ) |
| INFO | <--- | NB_INFO = -(700+NB_), CTXT_INFO = -(700+CTXT_) |
| IROFFA | <--- | MB_IROFFA = MOD( IA-1, DESCA( MB_ ) ), IAIROFFA = MOD( IA-1, DESCA( MB_ ) ) |
| J | <--- | JAJ = JA + K - 1, KJ = JA + K - 1 |
| K | <--- | IHIDO 10 K = ILO, IHI-1, ILODO 10 K = ILO, IHI-1 |
| LWMIN | <--- | NB_LWMIN = DESCA( NB_ ) + MAX( NPA0, DESCA( NB_ ) ), NPA0LWMIN = DESCA( NB_ ) + MAX( NPA0, DESCA( NB_ ) ) |
| NPA0 | <--- | IHINPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, IROFFANPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, MB_NPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, MYROWNPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, NPROWNPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, NUMROCNPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW,, IAROWNPA0 = NUMROC( IHI+IROFFA, DESCA( MB_ ), MYROW, IAROW, |
| WORK | <--- | LWMINWORK( 1 ) = CMPLX( REAL( LWMIN ) ){2WORK( 1 ) = CMPLX( REAL( LWMIN ) )} |
|
|
Analysis elements of the routine PCGEHD2() Put the mouse over each element to display detailed matching information
Assigned variables |
| | | BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ , I , IAROW , ICOFFA , ICTXT , INFO , IROFFA , J , K , LLD_ , LQUERY , LWMIN , M_ , MB_ , N_ , NB_ , NPA0 , ONE , RSRC_ , WORK |
|
Active variables |
| | | A , AII , BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DESCA , DLEN_ , DTYPE_ , I , IA , IAROW , ICOFFA , ICTXT , IHI , ILO , INDXG2P , INFO , IROFFA , J , JA , K , LLD_ , LQUERY , LWMIN , LWORK , M_ , MB_ , MYCOL , MYROW , N , N_ , NB_ , NPA0 , NPCOL , NPROW , NUMROC , ONE , RSRC_ , TAU , WORK |
|
Accessed arrays [ array name : associated index ] |
| | A | : i+1:ia+ihi-1,j+1:ja+n-1 , i+2:ihi+ia-1,j , ia:ihi+ia-1,j+1:ihi+ja-1 |
| | DESCA | : CTXT_ , MB_ , MB_ , MB_ , MB_ , NB_ , NB_ , NB_ , RSRC_ |
| | WORK | : 1 , 1 |
|
Conditional statements [ statement : associated predicate ] |
| | do | : ( 10 K = ILO , IHI - 1 ) |
| | if | : ( NPROW.EQ. - 1 ) , ( INFO.EQ.0 ) , ( (ILO.LT.1 .OR. ILO.GT.MAX( 1 , N ) ) ) , ( (IHI.LT.MIN( ILO , N ) .OR. IHI.GT.N ) ) , ( IROFFA.NE.ICOFFA ) , ( (DESCA( MB_ ).NE.DESCA( NB_ ) ) ) , ( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) , ( INFO.NE.0 ) , ( LQUERY ) |
|
| List of variables | AII BLOCK_CYCLIC_2D CSRC_ CTXT_ DLEN_ DTYPE_ I
| IA IAROW ICOFFA ICTXT IHI ILO INDXG2P INFO
| IROFFA J JA K LLD_ LQUERY LWMIN LWORK
| M_ MB_ MYCOL MYROW N N_ NB_ NPA0
| NPCOL NPROW NUMROC ONE RSRC_ WORK | | close
| |
AII
BLOCK_CYCLIC_2D
CSRC_
CTXT_
DLEN_
DTYPE_
I
IA
IAROW
ICOFFA
ICTXT
IHI
ILO
INDXG2P
INFO
IROFFA
J
JA
K
LLD_
LQUERY
LWMIN
LWORK
M_
MB_
MYCOL
MYROW
N
N_
NB_
NPA0
NPCOL
NPROW
NUMROC
ONE
RSRC_
WORK
97#94#96
| |