Routine: PZPOSV()  File: SRC\pzposv.f

 
 
# lines: 263
  # code: 263
  # comment: 0
  # blank:0
# Variables:34
# Callers:0
# Callings:2
# Words:98
# Keywords:65
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PZPOSV computes the solution to a complex system of linear equations
                        sub( A ) * X = sub( B ),
  where sub( A ) denotes A(IA:IA+N-1,JA:JA+N-1) and is an N-by-N
  hermitian distributed positive definite matrix and X and sub( B )
  denoting B(IB:IB+N-1,JB:JB+NRHS-1) are N-by-NRHS distributed
  matrices.
  The Cholesky decomposition is used to factor sub( A ) as
                     sub( A ) = U**H * U,  if UPLO = 'U', or
                     sub( A ) = L * L**H,  if UPLO = 'L',
  where U is an upper triangular matrix and L is a lower triangular
  matrix.  The factored form of sub( A ) is then used to solve the
  system of equations.
  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
  This routine requires square block decomposition ( MB_A = NB_A ).
  Arguments
  =========
  UPLO    (global input) CHARACTER
          = 'U':  Upper triangle of sub( A ) is stored;
          = 'L':  Lower triangle of sub( A ) is stored.
  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.
  NRHS    (global input) INTEGER
          The number of right hand sides, i.e., the number of columns
          of the distributed submatrix sub( B ). NRHS >= 0.
  A       (local input/local output) COMPLEX*16 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 symmetric distributed matrix sub( A ) to be factored.
          If UPLO = 'U', the leading N-by-N upper triangular part of
          sub( A ) contains the upper triangular part of the matrix,
          and its strictly lower triangular part is not referenced.
          If UPLO = 'L', the leading N-by-N lower triangular part of
          sub( A ) contains the lower triangular part of the distribu-
          ted matrix, and its strictly upper triangular part is not
          referenced. On exit, if INFO = 0, this array contains the
          local pieces of the factor U or L from the Cholesky factori-
          zation sub( A ) = U**H*U or L*L**H.
  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.
  B       (local input/local output) COMPLEX*16 pointer into the
          local memory to an array of dimension (LLD_B,LOC(JB+NRHS-1)).
          On entry, the local pieces of the right hand sides distribu-
          ted matrix sub( B ). On exit, if INFO = 0, sub( B ) is over-
          written with the solution distributed matrix X.
  IB      (global input) INTEGER
          The row index in the global array B indicating the first
          row of sub( B ).
  JB      (global input) INTEGER
          The column index in the global array B indicating the
          first column of sub( B ).
  DESCB   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix B.
  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.
          > 0:  If INFO = K, the leading minor of order K,
                A(IA:IA+K-1,JA:JA+K-1) is not positive definite, and
                the factorization could not be completed, and the
                solution has not been computed.
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PZPOSV( UPLO , N , NRHS , A , IA , JA , DESCA , B , IB , JB ,
002       $DESCB , 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 UPLO
011        INTEGER IA , IB , INFO , JA , JB , N , NRHS
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 UPPER
020        INTEGER IAROW , IBROW , ICOFFA , ICTXT , IROFFA , IROFFB ,
021       $MYCOL , MYROW , NPCOL , NPROW
022  *     ..
023  *     .. Local Arrays ..
024        INTEGER IDUM1( 1 ) , IDUM2( 1 )
025  *     ..
026  *     .. External Subroutines ..
027        EXTERNAL BLACS_GRIDINFO , CHK1MAT , PCHK2MAT , PXERBLA ,
028       $PZPOTRF , PZPOTRS  
029  *     ..
030  *     .. External Functions ..
031        LOGICAL LSAME
032        INTEGER INDXG2P
033        EXTERNAL INDXG2P , LSAME
034  *     ..
035  *     .. Intrinsic Functions ..
036        INTRINSIC ICHAR , MOD
037  *     ..
038  *     .. Executable Statements ..
039  
040  *     Get grid parameters
041  
042        ICTXT = DESCA( CTXT_ )
043        CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
044  
045  *     Test the input parameters
046  
047        INFO = 0
048        IF( NPROW.EQ. - 1 ) THEN
049            INFO = - (700 + CTXT_)
050        ELSE
051            UPPER = LSAME( UPLO , 'U' )
052            CALL CHK1MAT( N , 2 , N , 2 , IA , JA , DESCA , 7 , INFO )
053            IF( INFO.EQ.0 ) THEN
054                IAROW = INDXG2P( IA , DESCA( MB_ ) , MYROW , DESCA( RSRC_ ) ,
055       $        NPROW )
056                IBROW = INDXG2P( IB , DESCB( MB_ ) , MYROW , DESCB( RSRC_ ) ,
057       $        NPROW )
058                IROFFA = MOD( IA - 1 , DESCA( MB_ ) )
059                IROFFB = MOD( IB - 1 , DESCB( MB_ ) )
060                ICOFFA = MOD( JA - 1 , DESCA( NB_ ) )
061                IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO , 'L' ) ) THEN
062                    INFO = - 1
063                ELSE IF( IROFFA.NE.0 ) THEN
064                    INFO = - 5
065                ELSE IF( ICOFFA.NE.0 ) THEN
066                    INFO = - 6
067                ELSE IF( DESCA( MB_ ).NE.DESCA( NB_ ) ) THEN
068                    INFO = - (700 + NB_)
069                ELSE IF( IROFFB.NE.0 .OR. IBROW.NE.IAROW ) THEN
070                    INFO = - 9
071                ELSE IF( DESCB( MB_ ).NE.DESCA( NB_ ) ) THEN
072                    INFO = - (1000 + NB_)
073                END IF
074            END IF
075            IF( UPPER ) THEN
076                IDUM1( 1 ) = ICHAR( 'U' )
077            ELSE
078                IDUM1( 1 ) = ICHAR( 'L' )
079            END IF
080            IDUM2( 1 ) = 1
081            CALL PCHK2MAT( N , 2 , N , 2 , IA , JA , DESCA , 7 , N , 2 , NRHS ,
082       $    3 , IB , JB , DESCB , 11 , 1 , IDUM1 , IDUM2 , INFO )
083        END IF
084  
085        IF( INFO.NE.0 ) THEN
086            CALL PXERBLA( ICTXT , 'PZPOSV' , - INFO )
087            RETURN
088        END IF
089  
090  *     Compute the Cholesky factorization sub( A ) = U'*U or L*L'.
091  
092        CALL PZPOTRF ( UPLO , N , A , IA , JA , DESCA , INFO )
093  
094        IF( INFO.EQ.0 ) THEN
095  
096  *         Solve the system sub( A ) * X = sub( B ) overwriting sub( B )
097  *         with X.
098  
099            CALL PZPOTRS ( UPLO , N , NRHS , A , IA , JA , DESCA , B , IB , JB ,
100       $    DESCB , INFO )
101  
102        END IF
103  
104        RETURN
105  
106  *     End of PZPOSV
107  
108        END