Routine: PSGEQPF()  File: SRC\psgeqpf.f

 
 
# lines: 541
  # code: 541
  # comment: 0
  # blank:0
# Variables:71
# Callers:0
# Callings:2
# Words:360
# Keywords:215
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PSGEQPF computes a QR factorization with column pivoting of a
  M-by-N distributed matrix sub( A ) = A(IA:IA+M-1,JA:JA+N-1):
                         sub( A ) * P = Q * R.
  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
  =========
  M       (global input) INTEGER
          The number of rows to be operated on, i.e. the number of rows
          of the distributed submatrix sub( A ). 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( A ). N >= 0.
  A       (local input/local output) REAL pointer into the
          local memory to an array of dimension (LLD_A, LOCc(JA+N-1)).
          On entry, the local pieces of the M-by-N distributed matrix
          sub( A ) which is to be factored. On exit, the elements on
          and above the diagonal of sub( A ) contain the min(M,N) by N
          upper trapezoidal matrix R (R is upper triangular if M >= N);
          the elements below the diagonal, with the array TAU, repre-
          sent the orthogonal matrix Q as a product of elementary
          reflectors (see Further Details).
  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.
  IPIV    (local output) INTEGER array, dimension LOCc(JA+N-1).
          On exit, if IPIV(I) = K, the local i-th column of sub( A )*P
          was the global K-th column of sub( A ). IPIV is tied to the
          distributed matrix A.
  TAU     (local output) REAL, array, dimension
          LOCc(JA+MIN(M,N)-1). This array contains the scalar factors
          TAU of the elementary reflectors. TAU is tied to the
          distributed matrix A.
  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
          LWORK >= MAX(3,Mp0 + Nq0) + LOCc(JA+N-1)+Nq0.
          IROFF = MOD( IA-1, MB_A ), ICOFF = MOD( JA-1, NB_A ),
          IAROW = INDXG2P( IA, MB_A, MYROW, RSRC_A, NPROW ),
          IACOL = INDXG2P( JA, NB_A, MYCOL, CSRC_A, NPCOL ),
          Mp0   = NUMROC( M+IROFF, MB_A, MYROW, IAROW, NPROW ),
          Nq0   = NUMROC( N+ICOFF, NB_A, MYCOL, IACOL, NPCOL ),
          LOCc(JA+N-1) = NUMROC( JA+N-1, NB_A, MYCOL, CSRC_A, NPCOL )
          and NUMROC, INDXG2P 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.
  Further Details
  ===============
  The matrix Q is represented as a product of elementary reflectors
     Q = H(1) H(2) . . . H(n)
  Each H(i) has the form
     H = I - tau * v * v'
  where tau is a real scalar, and v is a real vector with v(1:i-1) = 0
  and v(i) = 1; v(i+1:m) is stored on exit in A(ia+i-1:ia+m-1,ja+i-1).
  The matrix P is represented in jpvt as follows: If
     jpvt(j) = i
  then the jth column of P is the ith canonical unit vector.
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PSGEQPF( M , N , A , IA , JA , DESCA , IPIV , TAU , WORK ,
002       $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  *     March 14 , 2000
008  
009  *     .. Scalar Arguments ..
010        INTEGER IA , JA , INFO , LWORK , M , N
011        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
012       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
013        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
014       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
015       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
016        REAL ONE , ZERO
017        PARAMETER( ONE = 1.0E + 0 , ZERO = 0.0E + 0 )
018  *     ..
019  *     .. Local Scalars ..
020        LOGICAL LQUERY
021        INTEGER I , IACOL , IAROW , ICOFF , ICTXT , ICURROW ,
022       $ICURCOL , II , IIA , IOFFA , IPN , IPCOL , IPW ,
023       $IROFF , ITEMP , J , JB , JJ , JJA , JJPVT , JN , KB ,
024       $K , KK , KSTART , KSTEP , LDA , LL , LWMIN , MN , MP ,
025       $MYCOL , MYROW , NPCOL , NPROW , NQ , NQ0 , PVT
026        REAL AJJ , ALPHA , TEMP , TEMP2
027  *     ..
028  *     .. Local Arrays ..
029        INTEGER DESCN( DLEN_ ) , IDUM1( 1 ) , IDUM2( 1 )
030  *     ..
031  *     .. External Subroutines ..
032        EXTERNAL BLACS_GRIDINFO , CHK1MAT , DESCSET , IGERV2D ,
033       $IGESD2D , INFOG1L , INFOG2L , PCHK1MAT , PSAMAX ,
034       $PSELSET , PSLARF , PSLARFG , PSNRM2 ,
035       $PXERBLA , SCOPY , SGEBR2D , SGEBS2D ,
036       $SGERV2D , SGESD2D , SLARFG , SSWAP
037  *     ..
038  *     .. External Functions ..
039        INTEGER ICEIL , INDXG2P , NUMROC
040        EXTERNAL ICEIL , INDXG2P , NUMROC
041  *     ..
042  *     .. Intrinsic Functions ..
043        INTRINSIC ABS , IFIX , MAX , MIN , MOD , REAL , SQRT
044  *     ..
045  *     .. Executable Statements ..
046  
047  *     Get grid parameters
048  
049        ICTXT = DESCA( CTXT_ )
050        CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
051  
052  *     Test the input parameters
053  
054        INFO = 0
055        IF( NPROW.EQ. - 1 ) THEN
056            INFO = - (600 + CTXT_)
057        ELSE
058            CALL CHK1MAT( M , 1 , N , 2 , IA , JA , DESCA , 6 , INFO )
059            IF( INFO.EQ.0 ) THEN
060                IROFF = MOD( IA - 1 , DESCA( MB_ ) )
061                ICOFF = MOD( JA - 1 , DESCA( NB_ ) )
062                IAROW = INDXG2P( IA , DESCA( MB_ ) , MYROW , DESCA( RSRC_ ) ,
063       $        NPROW )
064                IACOL = INDXG2P( JA , DESCA( NB_ ) , MYCOL , DESCA( CSRC_ ) ,
065       $        NPCOL )
066                MP = NUMROC( M + IROFF , DESCA( MB_ ) , MYROW , IAROW , NPROW )
067                NQ = NUMROC( N + ICOFF , DESCA( NB_ ) , MYCOL , IACOL , NPCOL )
068                NQ0 = NUMROC( JA + N - 1 , DESCA( NB_ ) , MYCOL , DESCA( CSRC_ ) ,
069       $        NPCOL )
070                LWMIN = MAX( 3 , MP + NQ ) + NQ0 + NQ
071  
072                WORK( 1 ) = REAL( LWMIN )
073                LQUERY =( LWORK.EQ. - 1 )
074                IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY )
075       $            INFO = - 10
076                END IF
077                IF( LWORK.EQ. - 1 ) THEN
078                    IDUM1( 1 ) = - 1
079                ELSE
080                    IDUM1( 1 ) = 1
081                END IF
082                IDUM2( 1 ) = 10
083                CALL PCHK1MAT( M , 1 , N , 2 , IA , JA , DESCA , 6 , 1 , IDUM1 , IDUM2 ,
084       $        INFO )
085            END IF
086  
087            IF( INFO.NE.0 ) THEN
088                CALL PXERBLA( ICTXT , 'PSGEQPF' , - INFO )
089                RETURN
090            ELSE IF( LQUERY ) THEN
091                RETURN
092            END IF
093  
094  *         Quick return if possible
095  
096            IF( M.EQ.0 .OR. N.EQ.0 )
097       $        RETURN
098  
099                CALL INFOG2L( IA , JA , DESCA , NPROW , NPCOL , MYROW , MYCOL , IIA , JJA ,
100       $        IAROW , IACOL )
101                IF( MYROW.EQ.IAROW )
102       $            MP = MP - IROFF
103                    IF( MYCOL.EQ.IACOL )
104       $                NQ = NQ - ICOFF
105                        MN = MIN( M , N )
106  
107  *                     Initialize the array of pivots
108  
109                        LDA = DESCA( LLD_ )
110                        JN = MIN( ICEIL( JA , DESCA( NB_ ) ) * DESCA( NB_ ) , JA + N - 1 )
111                        KSTEP = NPCOL * DESCA( NB_ )
112  
113                        IF( MYCOL.EQ.IACOL ) THEN
114  
115  *                         Handle first block separately
116  
117                            JB = JN - JA + 1
118                            DO 10 LL = JJA , JJA + JB - 1
119                                IPIV( LL ) = JA + LL - JJA
120     10                     CONTINUE
121                            KSTART = JN + KSTEP - DESCA( NB_ )
122  
123  *                         Loop over remaining block of columns
124  
125                            DO 30 KK = JJA + JB , JJA + NQ - 1 , DESCA( NB_ )
126                                KB = MIN( JJA + NQ - KK , DESCA( NB_ ) )
127                                DO 20 LL = KK , KK + KB - 1
128                                    IPIV( LL ) = KSTART + LL - KK + 1
129     20                         CONTINUE
130                                KSTART = KSTART + KSTEP
131     30                     CONTINUE
132                        ELSE
133                            KSTART = JN + ( MOD( MYCOL - IACOL + NPCOL , NPCOL ) - 1 )*
134       $                    DESCA( NB_ )
135                            DO 50 KK = JJA , JJA + NQ - 1 , DESCA( NB_ )
136                                KB = MIN( JJA + NQ - KK , DESCA( NB_ ) )
137                                DO 40 LL = KK , KK + KB - 1
138                                    IPIV( LL ) = KSTART + LL - KK + 1
139     40                         CONTINUE
140                                KSTART = KSTART + KSTEP
141     50                     CONTINUE
142                        END IF
143  
144  *                     Initialize partial column norms , handle first block separately
145  
146                        CALL DESCSET( DESCN , 1 , DESCA( N_ ) , 1 , DESCA( NB_ ) , MYROW ,
147       $                DESCA( CSRC_ ) , ICTXT , 1 )
148  
149                        IPN = 1
150                        IPW = IPN + NQ0 + NQ
151                        JJ = IPN + JJA - 1
152                        IF( MYCOL.EQ.IACOL ) THEN
153                            DO 60 KK = 0 , JB - 1
154                                CALL PSNRM2( M , WORK( JJ + KK ) , A , IA , JA + KK , DESCA , 1 )
155                                WORK( NQ + JJ + KK ) = WORK( JJ + KK )
156     60                     CONTINUE
157                            JJ = JJ + JB
158                        END IF
159                        ICURCOL = MOD( IACOL + 1 , NPCOL )
160  
161  *                     Loop over the remaining blocks of columns
162  
163                        DO 80 J = JN + 1 , JA + N - 1 , DESCA( NB_ )
164                            JB = MIN( JA + N - J , DESCA( NB_ ) )
165  
166                            IF( MYCOL.EQ.ICURCOL ) THEN
167                                DO 70 KK = 0 , JB - 1
168                                    CALL PSNRM2( M , WORK( JJ + KK ) , A , IA , J + KK , DESCA , 1 )
169                                    WORK( NQ + JJ + KK ) = WORK( JJ + KK )
170     70                         CONTINUE
171                                JJ = JJ + JB
172                            END IF
173                            ICURCOL = MOD( ICURCOL + 1 , NPCOL )
174     80                 CONTINUE
175  
176  *                     Compute factorization
177  
178                        DO 120 J = JA , JA + MN - 1
179                            I = IA + J - JA
180  
181                            CALL INFOG1L( J , DESCA( NB_ ) , NPCOL , MYCOL , DESCA( CSRC_ ) ,
182       $                    JJ , ICURCOL )
183                            K = JA + N - J
184                            IF( K.GT.1 ) THEN
185                                CALL PSAMAX( K , TEMP , PVT , WORK( IPN ) , 1 , J , DESCN ,
186       $                        DESCN( M_ ) )
187                            ELSE
188                                PVT = J
189                            END IF
190                            IF( J.NE.PVT ) THEN
191                                CALL INFOG1L( PVT , DESCA( NB_ ) , NPCOL , MYCOL ,
192       $                        DESCA( CSRC_ ) , JJPVT , IPCOL )
193                                IF( ICURCOL.EQ.IPCOL ) THEN
194                                    IF( MYCOL.EQ.ICURCOL ) THEN
195                                        CALL SSWAP( MP , A( IIA + (JJ - 1)*LDA ) , 1 ,
196       $                                A( IIA + (JJPVT - 1)*LDA ) , 1 )
197                                        ITEMP = IPIV( JJPVT )
198                                        IPIV( JJPVT ) = IPIV( JJ )
199                                        IPIV( JJ ) = ITEMP
200                                        WORK( IPN + JJPVT - 1 ) = WORK( IPN + JJ - 1 )
201                                        WORK( IPN + NQ + JJPVT - 1 ) = WORK( IPN + NQ + JJ - 1 )
202                                    END IF
203                                ELSE
204                                    IF( MYCOL.EQ.ICURCOL ) THEN
205  
206                                        CALL SGESD2D( ICTXT , MP , 1 , A( IIA + (JJ - 1)*LDA ) , LDA ,
207       $                                MYROW , IPCOL )
208                                        WORK( IPW ) = REAL( IPIV( JJ ) )
209                                        WORK( IPW + 1 ) = WORK( IPN + JJ - 1 )
210                                        WORK( IPW + 2 ) = WORK( IPN + NQ + JJ - 1 )
211                                        CALL SGESD2D( ICTXT , 3 , 1 , WORK( IPW ) , 3 , MYROW ,
212       $                                IPCOL )
213  
214                                        CALL SGERV2D( ICTXT , MP , 1 , A( IIA + (JJ - 1)*LDA ) , LDA ,
215       $                                MYROW , IPCOL )
216                                        CALL IGERV2D( ICTXT , 1 , 1 , IPIV( JJ ) , 1 , MYROW ,
217       $                                IPCOL )
218  
219                                    ELSE IF( MYCOL.EQ.IPCOL ) THEN
220  
221                                        CALL SGESD2D( ICTXT , MP , 1 , A( IIA + (JJPVT - 1)*LDA ) ,
222       $                                LDA , MYROW , ICURCOL )
223                                        CALL IGESD2D( ICTXT , 1 , 1 , IPIV( JJPVT ) , 1 , MYROW ,
224       $                                ICURCOL )
225  
226                                        CALL SGERV2D( ICTXT , MP , 1 , A( IIA + (JJPVT - 1)*LDA ) ,
227       $                                LDA , MYROW , ICURCOL )
228                                        CALL SGERV2D( ICTXT , 3 , 1 , WORK( IPW ) , 3 , MYROW ,
229       $                                ICURCOL )
230                                        IPIV( JJPVT ) = IFIX( WORK( IPW ) )
231                                        WORK( IPN + JJPVT - 1 ) = WORK( IPW + 1 )
232                                        WORK( IPN + NQ + JJPVT - 1 ) = WORK( IPW + 2 )
233  
234                                    END IF
235  
236                                END IF
237  
238                            END IF
239  
240  *                         Generate elementary reflector H(i)
241  
242                            CALL INFOG1L( I , DESCA( MB_ ) , NPROW , MYROW , DESCA( RSRC_ ) ,
243       $                    II , ICURROW )
244                            IF( DESCA( M_ ).EQ.1 ) THEN
245                                IF( MYROW.EQ.ICURROW ) THEN
246                                    IF( MYCOL.EQ.ICURCOL ) THEN
247                                        IOFFA = II + (JJ - 1)*DESCA( LLD_ )
248                                        AJJ = A( IOFFA )
249                                        CALL SLARFG( 1 , AJJ , A( IOFFA ) , 1 , TAU( JJ ) )
250                                        IF( N.GT.1 ) THEN
251                                            ALPHA = ONE - TAU( JJ )
252                                            CALL SGEBS2D( ICTXT , 'Rowwise' , ' ' , 1 , 1 , ALPHA ,
253       $                                    1 )
254                                            CALL SSCAL( NQ - JJ , ALPHA , A( IOFFA + DESCA( LLD_ ) ) ,
255       $                                    DESCA( LLD_ ) )
256                                        END IF
257                                        CALL SGEBS2D( ICTXT , 'Columnwise' , ' ' , 1 , 1 ,
258       $                                TAU( JJ ) , 1 )
259                                        A( IOFFA ) = AJJ
260                                    ELSE
261                                        IF( N.GT.1 ) THEN
262                                            CALL SGEBR2D( ICTXT , 'Rowwise' , ' ' , 1 , 1 , ALPHA ,
263       $                                    1 , ICURROW , ICURCOL )
264                                            CALL SSCAL( NQ - JJ + 1 , ALPHA , A( I ) , DESCA( LLD_ ) )
265                                        END IF
266                                    END IF
267                                ELSE IF( MYCOL.EQ.ICURCOL ) THEN
268                                    CALL SGEBR2D( ICTXT , 'Columnwise' , ' ' , 1 , 1 , TAU( JJ ) ,
269       $                            1 , ICURROW , ICURCOL )
270                                END IF
271  
272                            ELSE
273  
274                                CALL PSLARFG ( M - J + JA , AJJ , I , J , A , MIN( I + 1 , IA + M - 1 ) , J ,
275       $                        DESCA , 1 , TAU )
276                                IF( J.LT.JA + N - 1 ) THEN
277  
278  *                                 Apply H(i) to A(ia + j - ja : ia + m - 1 , j + 1 : ja + n - 1) from the left
279  
280                                    CALL PSELSET( A , I , J , DESCA , ONE )
281                                    CALL PSLARF ( 'Left' , M - J + JA , JA + N - 1 - J , A , I , J , DESCA ,
282       $                            1 , TAU , A , I , J + 1 , DESCA , WORK( IPW ) )
283                                END IF
284                                CALL PSELSET( A , I , J , DESCA , AJJ )
285  
286                            END IF
287  
288  *                         Update partial columns norms
289  
290                            IF( MYCOL.EQ.ICURCOL )
291       $                        JJ = JJ + 1
292                                IF( MOD( J , DESCA( NB_ ) ).EQ.0 )
293       $                            ICURCOL = MOD( ICURCOL + 1 , NPCOL )
294                                    IF((JJA + NQ - JJ).GT.0 ) THEN
295                                        IF( MYROW.EQ.ICURROW ) THEN
296                                            CALL SGEBS2D( ICTXT , 'Columnwise' , ' ' , 1 , JJA + NQ - JJ ,
297       $                                    A( II + ( MIN( JJA + NQ - 1 , JJ ) - 1 )*LDA ) ,
298       $                                    LDA )
299                                            CALL SCOPY( JJA + NQ - JJ , A( II + ( MIN( JJA + NQ - 1 , JJ )
300       $                                    - 1)*LDA ) , LDA , WORK( IPW + MIN( JJA + NQ - 1 ,
301       $                                    JJ ) - 1 ) , 1 )
302                                        ELSE
303                                            CALL SGEBR2D( ICTXT , 'Columnwise' , ' ' , JJA + NQ - JJ , 1 ,
304       $                                    WORK( IPW + MIN( JJA + NQ - 1 , JJ ) - 1 ) ,
305       $                                    MAX( 1 , NQ ) , ICURROW , MYCOL )
306                                        END IF
307                                    END IF
308  
309                                    JN = MIN( ICEIL( J + 1 , DESCA( NB_ ) ) * DESCA( NB_ ) ,
310       $                            JA + N - 1 )
311                                    IF( MYCOL.EQ.ICURCOL ) THEN
312                                        DO 90 LL = JJ - 1 , JJ + JN - J - 2
313                                            IF( WORK( IPN + LL ).NE.ZERO ) THEN
314                                                TEMP = ONE - ( ABS( WORK( IPW + LL ) ) /
315       $                                        WORK( IPN + LL ) )**2
316                                                TEMP = MAX( TEMP , ZERO )
317                                                TEMP2 = ONE + 0.05E + 0*TEMP*
318       $( WORK( IPN + LL ) / WORK( IPN + NQ + LL ) )**2
319                                                IF( TEMP2.EQ.ONE ) THEN
320                                                    IF( IA + M - 1.GT.I ) THEN
321                                                        CALL PSNRM2( IA + M - I - 1 , WORK( IPN + LL ) , A , I + 1 ,
322       $                                                J + LL - JJ + 2 , DESCA , 1 )
323                                                        WORK( IPN + NQ + LL ) = WORK( IPN + LL )
324                                                    ELSE
325                                                        WORK( IPN + LL ) = ZERO
326                                                        WORK( IPN + NQ + LL ) = ZERO
327                                                    END IF
328                                                ELSE
329                                                    WORK( IPN + LL ) = WORK( IPN + LL ) * SQRT( TEMP )
330                                                END IF
331                                            END IF
332     90                                 CONTINUE
333                                        JJ = JJ + JN - J
334                                    END IF
335                                    ICURCOL = MOD( ICURCOL + 1 , NPCOL )
336  
337                                    DO 110 K = JN + 1 , JA + N - 1 , DESCA( NB_ )
338                                        KB = MIN( JA + N - K , DESCA( NB_ ) )
339  
340                                        IF( MYCOL.EQ.ICURCOL ) THEN
341                                            DO 100 LL = JJ - 1 , JJ + KB - 2
342                                                IF( WORK( IPN + LL ).NE.ZERO ) THEN
343                                                    TEMP = ONE - ( ABS( WORK( IPW + LL ) ) /
344       $                                            WORK( IPN + LL ) )**2
345                                                    TEMP = MAX( TEMP , ZERO )
346                                                    TEMP2 = ONE + 0.05E + 0*TEMP*
347       $( WORK( IPN + LL ) / WORK( IPN + NQ + LL ) )**2
348                                                    IF( TEMP2.EQ.ONE ) THEN
349                                                        IF( IA + M - 1.GT.I ) THEN
350                                                            CALL PSNRM2( IA + M - I - 1 , WORK( IPN + LL ) , A ,
351       $                                                    I + 1 , K + LL - JJ + 1 , DESCA , 1 )
352                                                            WORK( IPN + NQ + LL ) = WORK( IPN + LL )
353                                                        ELSE
354                                                            WORK( IPN + LL ) = ZERO
355                                                            WORK( IPN + NQ + LL ) = ZERO
356                                                        END IF
357                                                    ELSE
358                                                        WORK( IPN + LL ) = WORK( IPN + LL ) * SQRT( TEMP )
359                                                    END IF
360                                                END IF
361    100                                     CONTINUE
362                                            JJ = JJ + KB
363                                        END IF
364                                        ICURCOL = MOD( ICURCOL + 1 , NPCOL )
365  
366    110                             CONTINUE
367  
368    120                 CONTINUE
369  
370                        WORK( 1 ) = REAL( LWMIN )
371  
372                        RETURN
373  
374  *                     End of PSGEQPF
375  
376                    END