Routine: PSORMHR()  File: SRC\psormhr.f

 
 
# lines: 397
  # code: 397
  # comment: 0
  # blank:0
# Variables:59
# Callers:0
# Callings:1
# Words:179
# Keywords:118
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PSORMHR overwrites the general real M-by-N distributed matrix
  sub( C ) = C(IC:IC+M-1,JC:JC+N-1) with
                       SIDE = 'L'           SIDE = 'R'
  TRANS = 'N':      Q * sub( C )          sub( C ) * Q
  TRANS = 'T':      Q**T * sub( C )       sub( C ) * Q**T
  where Q is a real orthogonal distributed matrix of order nq, with
  nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the
  product of IHI-ILO elementary reflectors, as returned by PSGEHRD:
  Q = H(ilo) H(ilo+1) . . . H(ihi-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
  =========
  SIDE    (global input) CHARACTER
          = 'L': apply Q or Q**T from the Left;
          = 'R': apply Q or Q**T from the Right.
  TRANS   (global input) CHARACTER
          = 'N':  No transpose, apply Q;
          = 'T':  Transpose, apply Q**T.
  M       (global input) INTEGER
          The number of rows to be operated on i.e the number of rows
          of the distributed submatrix sub( C ). M >= 0.
  N       (global input) INTEGER
          The number of columns to be operated on i.e the number of
          columns of the distributed submatrix sub( C ). N >= 0.
  ILO     (global input) INTEGER
  IHI     (global input) INTEGER
          ILO and IHI must have the same values as in the previous call
          of PSGEHRD. Q is equal to the unit matrix except in the
          distributed submatrix Q(ia+ilo:ia+ihi-1,ia+ilo:ja+ihi-1).
          If SIDE = 'L', 1 <= ILO <= IHI <= max(1,M);
          if SIDE = 'R', 1 <= ILO <= IHI <= max(1,N);
          ILO and IHI are relative indexes.
  A       (local input) REAL pointer into the local memory
          to an array of dimension (LLD_A,LOCc(JA+M-1)) if SIDE='L',
          and (LLD_A,LOCc(JA+N-1)) if SIDE = 'R'. The vectors which
          define the elementary reflectors, as returned by PSGEHRD.
  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 input) REAL, array, dimension LOCc(JA+M-2)
          if SIDE = 'L', and LOCc(JA+N-2) if SIDE = 'R'. This array
          contains the scalar factors TAU(j) of the elementary
          reflectors H(j) as returned by PSGEHRD. TAU is tied to
          the distributed matrix A.
  C       (local input/local output) REAL pointer into the
          local memory to an array of dimension (LLD_C,LOCc(JC+N-1)).
          On entry, the local pieces of the distributed matrix sub(C).
          On exit, sub( C ) is overwritten by Q*sub( C ) or Q'*sub( C )
          or sub( C )*Q' or sub( C )*Q.
  IC      (global input) INTEGER
          The row index in the global array C indicating the first
          row of sub( C ).
  JC      (global input) INTEGER
          The column index in the global array C indicating the
          first column of sub( C ).
  DESCC   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix C.
  WORK    (local workspace/local output) REAL 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
          IAA = IA + ILO; JAA = JA+ILO-1;
          If SIDE = 'L',
            MI = IHI-ILO; NI = N; ICC = IC + ILO; JCC = JC;
            LWORK >= MAX( (NB_A*(NB_A-1))/2, (NqC0 + MpC0)*NB_A ) +
                     NB_A * NB_A
          else if SIDE = 'R',
            MI = M; NI = IHI-ILO; ICC = IC; JCC = JC + ILO;
            LWORK >= MAX( (NB_A*(NB_A-1))/2, ( NqC0 + MAX( NpA0 +
                     NUMROC( NUMROC( NI+ICOFFC, NB_A, 0, 0, NPCOL ),
                             NB_A, 0, 0, LCMQ ), MpC0 ) )*NB_A ) +
                     NB_A * NB_A
          end if
          where LCMQ = LCM / NPCOL with LCM = ICLM( NPROW, NPCOL ),
          IROFFA = MOD( IAA-1, MB_A ), ICOFFA = MOD( JAA-1, NB_A ),
          IAROW = INDXG2P( IAA, MB_A, MYROW, RSRC_A, NPROW ),
          NpA0 = NUMROC( NI+IROFFA, MB_A, MYROW, IAROW, NPROW ),
          IROFFC = MOD( ICC-1, MB_C ), ICOFFC = MOD( JCC-1, NB_C ),
          ICROW = INDXG2P( ICC, MB_C, MYROW, RSRC_C, NPROW ),
          ICCOL = INDXG2P( JCC, NB_C, MYCOL, CSRC_C, NPCOL ),
          MpC0 = NUMROC( MI+IROFFC, MB_C, MYROW, ICROW, NPROW ),
          NqC0 = NUMROC( NI+ICOFFC, NB_C, MYCOL, ICCOL, NPCOL ),
          ILCM, 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    (global 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.
  Alignment requirements
  ======================
  The distributed submatrices A(IA:*, JA:*) and C(IC:IC+M-1,JC:JC+N-1)
  must verify some alignment properties, namely the following
  expressions should be true:
  If SIDE = 'L',
    ( MB_A.EQ.MB_C .AND. IROFFA.EQ.IROFFC .AND. IAROW.EQ.ICROW )
  If SIDE = 'R',
    ( MB_A.EQ.NB_C .AND. IROFFA.EQ.ICOFFC )
  =====================================================================
     .. Parameters ..

 
Display dynamic version Find AutoScroll Reload FontSize: - + Hide Comments Hide Blanks Frame FullScreen MailPrint

 
001        SUBROUTINE PSORMHR( SIDE , TRANS , M , N , ILO , IHI , A , IA , JA , DESCA ,
002       $TAU , C , IC , JC , DESCC , WORK , LWORK , INFO )
003  
004  *     -- ScaLAPACK 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        CHARACTER SIDE , TRANS
011        INTEGER IA , IC , IHI , ILO , INFO , JA , JC , LWORK , M , N
012        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
013       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
014        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
015       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
016       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
017  *     ..
018  *     .. Local Scalars ..
019        LOGICAL LEFT , LQUERY , NOTRAN
020        INTEGER IAA , IAROW , ICC , ICCOL , ICOFFC , ICROW , ICTXT ,
021       $IINFO , IROFFA , IROFFC , JAA , JCC , LCM , LCMQ ,
022       $LWMIN , MI , MPC0 , MYCOL , MYROW , NH , NI , NPA0 ,
023       $NPCOL , NPROW , NQ , NQC0
024  *     ..
025  *     .. Local Arrays ..
026        INTEGER IDUM1( 5 ) , IDUM2( 5 )
027  *     ..
028  *     .. External Subroutines ..
029        EXTERNAL BLACS_GRIDINFO , CHK1MAT , PCHK2MAT , PSORMQR ,
030       $PXERBLA
031  *     ..
032  *     .. External Functions ..
033        LOGICAL LSAME
034        INTEGER ILCM , INDXG2P , NUMROC
035        EXTERNAL ILCM , INDXG2P , LSAME , NUMROC
036  *     ..
037  *     .. Intrinsic Functions ..
038        INTRINSIC ICHAR , MAX , MIN , MOD , REAL
039  *     ..
040  *     .. Executable Statements ..
041  
042  *     Get grid parameters
043  
044        ICTXT = DESCA( CTXT_ )
045        CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
046  
047  *     Test the input parameters
048  
049        INFO = 0
050        NH = IHI - ILO
051        IF( NPROW.EQ. - 1 ) THEN
052            INFO = - (1000 + CTXT_)
053        ELSE
054            LEFT = LSAME( SIDE , 'L' )
055            NOTRAN = LSAME( TRANS , 'N' )
056            IAA = IA + ILO
057            JAA = JA + ILO - 1
058  
059  *         NQ is the order of Q
060  
061            IF( LEFT ) THEN
062                NQ = M
063                MI = NH
064                NI = N
065                ICC = IC + ILO
066                JCC = JC
067                CALL CHK1MAT( M , 3 , M , 3 , IA , JA , DESCA , 10 , INFO )
068            ELSE
069                NQ = N
070                MI = M
071                NI = NH
072                ICC = IC
073                JCC = JC + ILO
074                CALL CHK1MAT( N , 4 , N , 4 , IA , JA , DESCA , 10 , INFO )
075            END IF
076            CALL CHK1MAT( M , 3 , N , 4 , IC , JC , DESCC , 15 , INFO )
077            IF( INFO.EQ.0 ) THEN
078                IROFFA = MOD( IAA - 1 , DESCA( MB_ ) )
079                IROFFC = MOD( ICC - 1 , DESCC( MB_ ) )
080                ICOFFC = MOD( JCC - 1 , DESCC( NB_ ) )
081                IAROW = INDXG2P( IAA , DESCA( MB_ ) , MYROW , DESCA( RSRC_ ) ,
082       $        NPROW )
083                ICROW = INDXG2P( ICC , DESCC( MB_ ) , MYROW , DESCC( RSRC_ ) ,
084       $        NPROW )
085                ICCOL = INDXG2P( JCC , DESCC( NB_ ) , MYCOL , DESCC( CSRC_ ) ,
086       $        NPCOL )
087                MPC0 = NUMROC( MI + IROFFC , DESCC( MB_ ) , MYROW , ICROW ,
088       $        NPROW )
089                NQC0 = NUMROC( NI + ICOFFC , DESCC( NB_ ) , MYCOL , ICCOL ,
090       $        NPCOL )
091  
092                IF( LEFT ) THEN
093                    LWMIN = MAX(( DESCA( NB_ ) * ( DESCA( NB_ ) - 1 ) ) / 2 ,
094       $( MPC0 + NQC0 ) * DESCA( NB_ ) ) +
095       $            DESCA( NB_ ) * DESCA( NB_ )
096                ELSE
097                    NPA0 = NUMROC( NI + IROFFA , DESCA( MB_ ) , MYROW , IAROW ,
098       $            NPROW )
099                    LCM = ILCM( NPROW , NPCOL )
100                    LCMQ = LCM / NPCOL
101                    LWMIN = MAX(( DESCA( NB_ ) * ( DESCA( NB_ ) - 1 ) )
102       $            / 2 ,( NQC0 + MAX( NPA0 + NUMROC( NUMROC(
103       $            NI + ICOFFC , DESCA( NB_ ) , 0 , 0 , NPCOL ) ,
104       $            DESCA( NB_ ) , 0 , 0 , LCMQ ) , MPC0 ) ) *
105       $            DESCA( NB_ ) ) + DESCA( NB_ ) * DESCA( NB_ )
106                END IF
107  
108                WORK( 1 ) = REAL( LWMIN )
109                LQUERY =( LWORK.EQ. - 1 )
110                IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE , 'R' ) ) THEN
111                    INFO = - 1
112                ELSE IF( .NOT.LSAME( TRANS , 'N' ) .AND.
113       $            .NOT.LSAME( TRANS , 'T' ) ) THEN
114                    INFO = - 2
115                ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1 , NQ ) ) THEN
116                    INFO = - 5
117                ELSE IF( IHI.LT.MIN( ILO , NQ ) .OR. IHI.GT.NQ ) THEN
118                    INFO = - 6
119                ELSE IF( .NOT.LEFT .AND. DESCA( MB_ ).NE.DESCC( NB_ ) ) THEN
120                    INFO = - (1000 + NB_)
121                ELSE IF( LEFT .AND. IROFFA.NE.IROFFC ) THEN
122                    INFO = - 13
123                ELSE IF( LEFT .AND. IAROW.NE.ICROW ) THEN
124                    INFO = - 13
125                ELSE IF( .NOT.LEFT .AND. IROFFA.NE.ICOFFC ) THEN
126                    INFO = - 14
127                ELSE IF( LEFT .AND. DESCA( MB_ ).NE.DESCC( MB_ ) ) THEN
128                    INFO = - (1500 + MB_)
129                ELSE IF( ICTXT.NE.DESCC( CTXT_ ) ) THEN
130                    INFO = - (1500 + CTXT_)
131                ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
132                    INFO = - 17
133                END IF
134            END IF
135  
136            IF( LEFT ) THEN
137                IDUM1( 1 ) = ICHAR( 'L' )
138            ELSE
139                IDUM1( 1 ) = ICHAR( 'R' )
140            END IF
141            IDUM2( 1 ) = 1
142            IF( NOTRAN ) THEN
143                IDUM1( 2 ) = ICHAR( 'N' )
144            ELSE
145                IDUM1( 2 ) = ICHAR( 'T' )
146            END IF
147            IDUM2( 2 ) = 2
148            IDUM1( 3 ) = ILO
149            IDUM2( 3 ) = 5
150            IDUM1( 4 ) = IHI
151            IDUM2( 4 ) = 6
152            IF( LWORK.EQ. - 1 ) THEN
153                IDUM1( 5 ) = - 1
154            ELSE
155                IDUM1( 5 ) = 1
156            END IF
157            IDUM2( 5 ) = 17
158            IF( LEFT ) THEN
159                CALL PCHK2MAT( M , 3 , M , 3 , IA , JA , DESCA , 10 , M , 3 , N , 4 ,
160       $        IC , JC , DESCC , 15 , 5 , IDUM1 , IDUM2 , INFO )
161            ELSE
162                CALL PCHK2MAT( N , 4 , N , 4 , IA , JA , DESCA , 10 , M , 3 , N , 4 ,
163       $        IC , JC , DESCC , 15 , 5 , IDUM1 , IDUM2 , INFO )
164            END IF
165        END IF
166  
167        IF( INFO.NE.0 ) THEN
168            CALL PXERBLA( ICTXT , 'PSORMHR' , - INFO )
169            RETURN
170        ELSE IF( LQUERY ) THEN
171            RETURN
172        END IF
173  
174  *     Quick return if possible
175  
176        IF( M.EQ.0 .OR. N.EQ.0 .OR. NH.EQ.0 )
177       $    RETURN
178  
179            CALL PSORMQR ( SIDE , TRANS , MI , NI , NH , A , IAA , JAA , DESCA , TAU ,
180       $    C , ICC , JCC , DESCC , WORK , LWORK , IINFO )
181  
182            WORK( 1 ) = REAL( LWMIN )
183  
184            RETURN
185  
186  *         End of PSORMHR
187  
188        END