Routine: PCLATRA()  File: SRC\pclatra.f

 
 
# lines: 187
  # code: 187
  # comment: 0
  # blank:0
# Variables:32
# Callers:0
# Callings:0
# Words:67
# Keywords:43
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PCLATRA computes the trace of an N-by-N distributed matrix sub( A )
  denoting A( IA:IA+N-1, JA:JA+N-1 ). The result is left on every
  process of the grid.
  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.
  A       (local input) COMPLEX pointer into the local memory
          to an array of dimension ( LLD_A, LOCc(JA+N-1) ). This array
          contains the local pieces of the distributed matrix the trace
          is to be computed.
  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.
  ====================================================================
     .. Parameters ..

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

 
01        COMPLEX FUNCTION PCLATRA( N , A , IA , JA , DESCA )
02  
03  *     -- ScaLAPACK auxiliary routine(version 1.7) --
04  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
05  *     and University of California , Berkeley.
06  *     May 1 , 1997
07  
08  *     .. Scalar Arguments ..
09        INTEGER IA , JA , N
10        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
11       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
12        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
13       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
14       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
15        COMPLEX ZERO
16        PARAMETER( ZERO = 0.0E + 0 )
17  *     ..
18  *     .. Local Scalars ..
19        INTEGER ICURCOL , ICURROW , II , IOFFA , J , JB , JJ , JN ,
20       $LDA , LL , MYCOL , MYROW , NPCOL , NPROW
21        COMPLEX TRACE
22  *     ..
23  *     .. External Subroutines ..
24        EXTERNAL BLACS_GRIDINFO , CGSUM2D , INFOG2L
25  *     ..
26  *     .. External Functions ..
27        INTEGER ICEIL
28        EXTERNAL ICEIL
29  *     ..
30  *     .. Intrinsic Functions ..
31        INTRINSIC MIN , MOD
32  *     ..
33  *     .. Executable Statements ..
34  
35  *     Get grid parameters
36  
37        CALL BLACS_GRIDINFO( DESCA( CTXT_ ) , NPROW , NPCOL , MYROW , MYCOL )
38  
39        TRACE = ZERO
40        IF( N.EQ.0 ) THEN
41            PCLATRA = TRACE
42            RETURN
43        END IF
44  
45        CALL INFOG2L( IA , JA , DESCA , NPROW , NPCOL , MYROW , MYCOL , II , JJ ,
46       $ICURROW , ICURCOL )
47  
48        JN = MIN( ICEIL( JA , DESCA( NB_ ) ) * DESCA( NB_ ) , JA + N - 1 )
49        JB = JN - JA + 1
50        LDA = DESCA( LLD_ )
51        IOFFA = II + ( JJ - 1 ) * LDA
52  
53  *     Handle first diagonal block separately
54  
55        IF( MYROW.EQ.ICURROW .AND. MYCOL.EQ.ICURCOL ) THEN
56            DO 10 LL = IOFFA , IOFFA + (JB - 1)*(LDA + 1) , LDA + 1
57                TRACE = TRACE + A( LL )
58     10     CONTINUE
59        END IF
60        IF( MYROW.EQ.ICURROW )
61       $    IOFFA = IOFFA + JB
62            IF( MYCOL.EQ.ICURCOL )
63       $        IOFFA = IOFFA + JB*LDA
64                ICURROW = MOD( ICURROW + 1 , NPROW )
65                ICURCOL = MOD( ICURCOL + 1 , NPCOL )
66  
67  *             Loop over the remaining block of columns
68  
69                DO 30 J = JN + 1 , JA + N - 1 , DESCA( NB_ )
70                    JB = MIN( JA + N - J , DESCA( NB_ ) )
71  
72                    IF( MYROW.EQ.ICURROW .AND. MYCOL.EQ.ICURCOL ) THEN
73                        DO 20 LL = IOFFA , IOFFA + (JB - 1)*(LDA + 1) , LDA + 1
74                            TRACE = TRACE + A( LL )
75     20                 CONTINUE
76                    END IF
77                    IF( MYROW.EQ.ICURROW )
78       $                IOFFA = IOFFA + JB
79                        IF( MYCOL.EQ.ICURCOL )
80       $                    IOFFA = IOFFA + JB*LDA
81                            ICURROW = MOD( ICURROW + 1 , NPROW )
82                            ICURCOL = MOD( ICURCOL + 1 , NPCOL )
83     30         CONTINUE
84  
85                CALL CGSUM2D( DESCA( CTXT_ ) , 'All' , ' ' , 1 , 1 , TRACE , 1 , - 1 ,
86       $        MYCOL )
87  
88                PCLATRA = TRACE
89  
90                RETURN
91  
92  *             End of PCLATRA
93  
94            END