Routine: PSLASRT()  File: SRC\pslasrt.f

 
 
# lines: 254
  # code: 254
  # comment: 0
  # blank:0
# Variables:59
# Callers:1
# Callings:1
# Words:139
# Keywords:92
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PSLASRT Sort the numbers in D in increasing order and the
  corresponding vectors in Q.
  Arguments
  =========
  ID      (global input) CHARACTER*1
          = 'I': sort D in increasing order;
          = 'D': sort D in decreasing order. (NOT IMPLEMENTED YET)
  N       (global input) INTEGER
          The number of columns to be operated on i.e the number of
          columns of the distributed submatrix sub( Q ). N >= 0.
  D       (global input/output) REAL array, dimmension (N)
          On exit, the number in D are sorted in increasing order.
  Q       (local input) REAL pointer into the local memory
          to an array of dimension (LLD_Q, LOCc(JQ+N-1) ). This array
          contains the local pieces of the distributed matrix sub( A )
          to be copied from.
  IQ      (global input) INTEGER
          The row index in the global array A indicating the first
          row of sub( Q ).
  JQ      (global input) INTEGER
          The column index in the global array A indicating the
          first column of sub( Q ).
  DESCQ   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix A.
  WORK    (local workspace/local output) REAL array,
                                                  dimension (LWORK)
  LWORK   (local or global input) INTEGER
          The dimension of the array WORK.
          LWORK = MAX( N, NP * ( NB + NQ ))
          where
          NP = NUMROC( N, NB, MYROW, IAROW, NPROW ),
          NQ = NUMROC( N, NB, MYCOL, DESCQ( CSRC_ ), NPCOL )
  IWORK   (local workspace/local output) INTEGER array,
                                                  dimension (LIWORK)
  LIWORK (local or global input) INTEGER
          The dimension of the array IWORK.
          LIWORK = N + 2*NB + 2*NPCOL
  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.
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PSLASRT( ID , N , D , Q , IQ , JQ , DESCQ , WORK , LWORK ,
002       $IWORK , LIWORK , 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  *     February 22 , 2000
008  
009  *     .. Scalar Arguments ..
010        CHARACTER ID
011        INTEGER INFO , IQ , JQ , LIWORK , LWORK , N
012        INTEGER BLOCK_CYCLIC_2D , DLEN_ , DTYPE_ , CTXT_ , M_ , N_ ,
013       $MB_ , NB_ , RSRC_ , CSRC_ , LLD_
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        INTEGER CL , COL , DUMMY , I , ICTXT , IID , IIQ , INDCOL ,
020       $INDX , INDXC , INDXG , IPQ , IPQ2 , IPW , IPWORK , J ,
021       $JJQ , K , L , LDQ , LEND , LIWMIN , LWMIN , MYCOL ,
022       $MYROW , NB , ND , NP , NPCOL , NPROW , NQ , PSQ , QCOL ,
023       $QTOT , SBUF
024  *     ..
025  *     .. External Functions ..
026        LOGICAL LSAME
027        INTEGER INDXG2L , INDXG2P , NUMROC
028        EXTERNAL INDXG2L , INDXG2P , LSAME , NUMROC
029  *     ..
030  *     .. External Subroutines ..
031        EXTERNAL BLACS_GRIDINFO , CHK1MAT , PXERBLA , SCOPY ,
032       $SGERV2D , SGESD2D , SLACPY , SLAPST  
033  *     ..
034  *     .. Intrinsic Functions ..
035        INTRINSIC MAX , MIN , MOD
036  *     ..
037  *     .. Executable Statements ..
038  
039  *     This is just to keep ftnchek and toolpack / 1 happy
040        IF( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_*
041       $    RSRC_.LT.0 )RETURN
042  
043            IF( N.EQ.0 )
044       $        RETURN
045  
046                CALL BLACS_GRIDINFO( DESCQ( CTXT_ ) , NPROW , NPCOL , MYROW , MYCOL )
047  
048  *             Test the input parameters
049  
050                INFO = 0
051                IF( NPROW.EQ. - 1 ) THEN
052                    INFO = - ( 600 + CTXT_ )
053                ELSE
054                    CALL CHK1MAT( N , 1 , N , 1 , IQ , JQ , DESCQ , 6 , INFO )
055                    IF( INFO.EQ.0 ) THEN
056                        NB = DESCQ( NB_ )
057                        LDQ = DESCQ( LLD_ )
058                        NP = NUMROC( N , NB , MYROW , DESCQ( RSRC_ ) , NPROW )
059                        NQ = NUMROC( N , NB , MYCOL , DESCQ( CSRC_ ) , NPCOL )
060                        LWMIN = MAX( N , NP*( NB + NQ ) )
061                        LIWMIN = N + 2*( NB + NPCOL )
062                        IF( .NOT.LSAME( ID , 'I' ) ) THEN
063                            INFO = - 1
064                        ELSE IF( N.LT.0 ) THEN
065                            INFO = - 2
066                        ELSE IF( LWORK.LT.LWMIN ) THEN
067                            INFO = - 9
068                        ELSE IF( LIWORK.LT.LIWMIN ) THEN
069                            INFO = - 11
070                        END IF
071                    END IF
072                END IF
073  
074                IF( INFO.NE.0 ) THEN
075                    CALL PXERBLA( ICTXT , 'PSLASRT' , - INFO )
076                    RETURN
077                END IF
078  
079  *             Set Pointers
080  
081                INDXC = 1
082                INDX = INDXC + N
083                INDXG = INDX
084                INDCOL = INDXG + NB
085                QTOT = INDCOL + NB
086                PSQ = QTOT + NPCOL
087  
088                IID = 1
089                IPQ2 = 1
090                IPW = IPQ2 + NP*NQ
091  
092                DUMMY = 0
093                IIQ = INDXG2L( IQ , NB , DUMMY , DUMMY , NPROW )
094  
095  *             Sort the eigenvalues in D
096  
097                CALL SLAPST ( 'I' , N , D , IWORK( INDX ) , INFO )
098  
099                DO 10 L = 0 , N - 1
100                    WORK( IID + L ) = D( IWORK( INDX + L ) )
101                    IWORK( INDXC - 1 + IWORK( INDX + L ) ) = IID + L
102     10         CONTINUE
103                CALL SCOPY( N , WORK , 1 , D , 1 )
104  
105                ND = 0
106     20 CONTINUE
107        IF( ND.LT.N ) THEN
108            LEND = MIN( NB , N - ND )
109            J = JQ + ND
110            QCOL = INDXG2P( J , NB , DUMMY , DESCQ( CSRC_ ) , NPCOL )
111            K = 0
112            DO 30 L = 0 , LEND - 1
113                I = JQ - 1 + IWORK( INDXC + ND + L )
114                CL = INDXG2P( I , NB , DUMMY , DESCQ( CSRC_ ) , NPCOL )
115                IWORK( INDCOL + L ) = CL
116                IF( MYCOL.EQ.CL ) THEN
117                    IWORK( INDXG + K ) = IWORK( INDXC + ND + L )
118                    K = K + 1
119                END IF
120     30     CONTINUE
121  
122            IF( MYCOL.EQ.QCOL ) THEN
123                DO 40 CL = 0 , NPCOL - 1
124                    IWORK( QTOT + CL ) = 0
125     40         CONTINUE
126                DO 50 L = 0 , LEND - 1
127                    IWORK( QTOT + IWORK( INDCOL + L ) ) = IWORK( QTOT +
128       $            IWORK( INDCOL + L ) ) + 1
129     50         CONTINUE
130                IWORK( PSQ ) = 1
131                DO 60 CL = 1 , NPCOL - 1
132                    IWORK( PSQ + CL ) = IWORK( PSQ + CL - 1 ) + IWORK( QTOT + CL - 1 )
133     60         CONTINUE
134                DO 70 L = 0 , LEND - 1
135                    CL = IWORK( INDCOL + L )
136                    I = JQ + ND + L
137                    JJQ = INDXG2L( I , NB , DUMMY , DUMMY , NPCOL )
138                    IPQ = IIQ + ( JJQ - 1 )*LDQ
139                    IPWORK = IPW + ( IWORK( PSQ + CL ) - 1 )*NP
140                    CALL SCOPY( NP , Q( IPQ ) , 1 , WORK( IPWORK ) , 1 )
141                    IWORK( PSQ + CL ) = IWORK( PSQ + CL ) + 1
142     70         CONTINUE
143                IWORK( PSQ ) = 1
144                DO 80 CL = 1 , NPCOL - 1
145                    IWORK( PSQ + CL ) = IWORK( PSQ + CL - 1 ) + IWORK( QTOT + CL - 1 )
146     80         CONTINUE
147                DO 90 L = 0 , K - 1
148                    I = IWORK( INDXG + L )
149                    JJQ = INDXG2L( I , NB , DUMMY , DUMMY , NPCOL )
150                    IPQ = IPQ2 + ( JJQ - 1 )*NP
151                    IPWORK = IPW + ( IWORK( PSQ + MYCOL ) - 1 )*NP
152                    CALL SCOPY( NP , WORK( IPWORK ) , 1 , WORK( IPQ ) , 1 )
153                    IWORK( PSQ + MYCOL ) = IWORK( PSQ + MYCOL ) + 1
154     90         CONTINUE
155                DO 100 CL = 1 , NPCOL - 1
156                    COL = MOD( MYCOL + CL , NPCOL )
157                    SBUF = IWORK( QTOT + COL )
158                    IF( SBUF.NE.0 ) THEN
159                        IPWORK = IPW + ( IWORK( PSQ + COL ) - 1 )*NP
160                        CALL SGESD2D( DESCQ( CTXT_ ) , NP , SBUF ,
161       $                WORK( IPWORK ) , NP , MYROW , COL )
162                    END IF
163    100         CONTINUE
164  
165            ELSE
166  
167                IF( K.NE.0 ) THEN
168                    CALL SGERV2D( DESCQ( CTXT_ ) , NP , K , WORK( IPW ) , NP ,
169       $            MYROW , QCOL )
170                    DO 110 L = 0 , K - 1
171                        I = JQ - 1 + IWORK( INDXG + L )
172                        JJQ = INDXG2L( I , NB , DUMMY , DUMMY , NPCOL )
173                        IPQ = 1 + ( JJQ - 1 )*NP
174                        IPWORK = IPW + L*NP
175                        CALL SCOPY( NP , WORK( IPWORK ) , 1 , WORK( IPQ ) , 1 )
176    110             CONTINUE
177                END IF
178            END IF
179            ND = ND + NB
180            GO TO 20
181        END IF
182        CALL SLACPY( 'Full' , NP , NQ , WORK , NP , Q( IIQ ) , LDQ )
183  
184  *     End of PSLASRT
185  
186        END