Routine: PSLARED1D()  File: SRC\pslared1d.f

 
 
# lines: 172
  # code: 172
  # comment: 0
  # blank:0
# Variables:27
# Callers:6
# Callings:0
# Words:42
# Keywords:26
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PSLARED1D redistributes a 1D array
  It assumes that the input array, BYCOL, is distributed across
  rows and that all process columns contain the same copy of
  BYCOL.  The output array, BYALL, will be identical on all processes
  and will contain the entire array.
  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
  =========
    NP = Number of local rows in BYCOL()
  N       (global input) INTEGER
          The number of elements to be redistributed.  N >= 0.
  IA      (global input) INTEGER
          IA must be equal to 1
  JA      (global input) INTEGER
          JA must be equal to 1
  DESC    (global/local input) INTEGER Array of dimension DLEN_
          A 2D array descriptor, which describes BYCOL
  BYCOL   (local input) distributed block cyclic REAL array
          global dimension (N), local dimension (NP)
          BYCOL is distributed across the process rows
          All process columns are assumed to contain the same value
  BYALL   (global output) REAL global dimension( N )
          local dimension (N)
          BYALL is exactly duplicated on all processes
          It contains the same values as BYCOL, but it is replicated
          across all processes rather than being distributed
          BYALL(i) = BYCOL( NUMROC(i,DESC( NB_ ),MYROW,0,NPROW ) on the procs
          whose MYROW == mod((i-1)/DESC( NB_ ),NPROW)
  WORK    (local workspace) REAL dimension (LWORK)
          Used to hold the buffers sent from one process to another
  LWORK   (local input) INTEGER size of WORK array
          LWORK >= NUMROC(N, DESC( NB_ ), 0, 0, NPCOL)
     .. Parameters ..

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

 
01        SUBROUTINE PSLARED1D( N , IA , JA , DESC , BYCOL , BYALL , WORK , LWORK )
02  
03  *     -- ScaLAPACK routine(version 1.7) --
04  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
05  *     and University of California , Berkeley.
06  *     December 12 , 2005
07  
08  *     .. Scalar Arguments ..
09        INTEGER IA , JA , LWORK , N
10        INTEGER BLOCK_CYCLIC_2D , DLEN_ , DTYPE_ , CTXT_ , M_ , N_ ,
11       $MB_ , NB_ , RSRC_ , CSRC_ , LLD_
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  *     ..
16  *     .. Local Scalars ..
17        INTEGER ALLI , BUFLEN , I , II , MYCOL , MYROW , NB , NPCOL ,
18       $NPROW , PCOL
19  *     ..
20  *     .. External Functions ..
21  
22        INTEGER NUMROC
23        EXTERNAL NUMROC
24  *     ..
25  *     .. External Subroutines ..
26  
27        EXTERNAL BLACS_GRIDINFO , SCOPY , SGEBR2D , SGEBS2D
28  *     ..
29  *     .. Intrinsic Functions ..
30        INTRINSIC MIN
31  *     ..
32  *     .. Executable Statements ..
33  *     This is just to keep ftnchek happy
34        IF( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_*
35       $    RSRC_.LT.0 )RETURN
36  
37            CALL BLACS_GRIDINFO( DESC( CTXT_ ) , NPROW , NPCOL , MYROW , MYCOL )
38            NB = DESC( MB_ )
39  
40            DO 30 PCOL = 0 , NPCOL - 1
41                BUFLEN = NUMROC( N , NB , PCOL , 0 , NPCOL )
42                IF( MYCOL.EQ.PCOL ) THEN
43                    CALL SCOPY( BUFLEN , BYCOL , 1 , WORK , 1 )
44                    CALL SGEBS2D( DESC( CTXT_ ) , 'R' , ' ' , 1 , BUFLEN , WORK , 1 )
45                ELSE
46                    CALL SGEBR2D( DESC( CTXT_ ) , 'R' , ' ' , 1 , BUFLEN , WORK , 1 ,
47       $            MYROW , PCOL )
48                END IF
49  
50                ALLI = PCOL*NB
51                DO 20 II = 1 , BUFLEN , NB
52                    DO 10 I = 1 , MIN( NB , BUFLEN - II + 1 )
53                        BYALL( ALLI + I ) = WORK( II - 1 + I )
54     10             CONTINUE
55                    ALLI = ALLI + NB*NPCOL
56     20         CONTINUE
57     30     CONTINUE
58  
59            RETURN
60  
61  *         End of PSLARED1D
62  
63        END