1 SUBROUTINE pslawil( II, JJ, M, A, DESCA, H44, H33, H43H34, V )
113 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
114 $ LLD_, MB_, M_, NB_, N_, RSRC_
115 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
116 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
117 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
120 INTEGER CONTXT, DOWN, HBL, ICOL, IROW, JSRC, LDA, LEFT,
121 $ MODKM1, MYCOL, MYROW, NPCOL, NPROW, NUM, RIGHT,
123 REAL H22, H33S, H44S, S, V1, V2
133 EXTERNAL blacs_gridinfo, sgerv2d, sgesd2d,
infog2l
141 contxt = desca( ctxt_ )
143 CALL blacs_gridinfo( contxt, nprow, npcol, myrow, mycol )
144 left = mod( mycol+npcol-1, npcol )
145 right = mod( mycol+1, npcol )
146 up = mod( myrow+nprow-1, nprow )
147 down = mod( myrow+1, nprow )
152 modkm1 = mod( m+1, hbl )
153 IF( modkm1.EQ.0 )
THEN
154 IF( ( myrow.EQ.ii ) .AND. ( right.EQ.jj ) .AND.
155 $ ( npcol.GT.1 ) )
THEN
156 CALL infog2l( m+2, m+1, desca, nprow, npcol, myrow, mycol,
157 $ irow, icol, rsrc, jsrc )
158 buf( 1 ) = a( ( icol-1 )*lda+irow )
159 CALL sgesd2d( contxt, 1, 1, buf, 1, ii, jj )
161 IF( ( down.EQ.ii ) .AND. ( right.EQ.jj ) .AND. ( num.GT.1 ) )
163 CALL infog2l( m, m, desca, nprow, npcol, myrow, mycol, irow,
165 buf( 1 ) = a( ( icol-1 )*lda+irow )
166 buf( 2 ) = a( ( icol-1 )*lda+irow+1 )
167 buf( 3 ) = a( icol*lda+irow )
168 buf( 4 ) = a( icol*lda+irow+1 )
169 CALL sgesd2d( contxt, 4, 1, buf, 4, ii, jj )
171 IF( ( myrow.EQ.ii ) .AND. ( mycol.EQ.jj ) )
THEN
172 CALL infog2l( m+2, m+2, desca, nprow, npcol, myrow, mycol,
173 $ irow, icol, rsrc, jsrc )
174 IF( npcol.GT.1 )
THEN
175 CALL sgerv2d( contxt, 1, 1, v3, 1, myrow, left )
177 v3( 1 ) = a( ( icol-2 )*lda+irow )
180 CALL sgerv2d( contxt, 4, 1, buf, 4, up, left )
186 h11( 1 ) = a( ( icol-3 )*lda+irow-2 )
187 h21( 1 ) = a( ( icol-3 )*lda+irow-1 )
188 h12( 1 ) = a( ( icol-2 )*lda+irow-2 )
189 h22 = a( ( icol-2 )*lda+irow-1 )
193 IF( modkm1.EQ.1 )
THEN
194 IF( ( down.EQ.ii ) .AND. ( right.EQ.jj ) .AND. ( num.GT.1 ) )
196 CALL infog2l( m, m, desca, nprow, npcol, myrow, mycol, irow,
198 CALL sgesd2d( contxt, 1, 1, a( ( icol-1 )*lda+irow ), 1, ii,
201 IF( ( down.EQ.ii ) .AND. ( mycol.EQ.jj ) .AND. ( nprow.GT.1 ) )
203 CALL infog2l( m, m+1, desca, nprow, npcol, myrow, mycol,
204 $ irow, icol, rsrc, jsrc )
205 CALL sgesd2d( contxt, 1, 1, a( ( icol-1 )*lda+irow ), 1, ii,
208 IF( ( myrow.EQ.ii ) .AND. ( right.EQ.jj ) .AND.
209 $ ( npcol.GT.1 ) )
THEN
210 CALL infog2l( m+1, m, desca, nprow, npcol, myrow, mycol,
211 $ irow, icol, rsrc, jsrc )
212 CALL sgesd2d( contxt, 1, 1, a( ( icol-1 )*lda+irow ), 1, ii,
215 IF( ( myrow.EQ.ii ) .AND. ( mycol.EQ.jj ) )
THEN
216 CALL infog2l( m+2, m+2, desca, nprow, npcol, myrow, mycol,
217 $ irow, icol, rsrc, jsrc )
219 CALL sgerv2d( contxt, 1, 1, h11, 1, up, left )
221 h11( 1 ) = a( ( icol-3 )*lda+irow-2 )
223 IF( nprow.GT.1 )
THEN
224 CALL sgerv2d( contxt, 1, 1, h12, 1, up, mycol )
226 h12( 1 ) = a( ( icol-2 )*lda+irow-2 )
228 IF( npcol.GT.1 )
THEN
229 CALL sgerv2d( contxt, 1, 1, h21, 1, myrow, left )
231 h21( 1 ) = a( ( icol-3 )*lda+irow-1 )
233 h22 = a( ( icol-2 )*lda+irow-1 )
234 v3( 1 ) = a( ( icol-2 )*lda+irow )
237 IF( ( myrow.NE.ii ) .OR. ( mycol.NE.jj ) )
240 IF( modkm1.GT.1 )
THEN
241 CALL infog2l( m+2, m+2, desca, nprow, npcol, myrow, mycol,
242 $ irow, icol, rsrc, jsrc )
243 h11( 1 ) = a( ( icol-3 )*lda+irow-2 )
244 h21( 1 ) = a( ( icol-3 )*lda+irow-1 )
245 h12( 1 ) = a( ( icol-2 )*lda+irow-2 )
246 h22 = a( ( icol-2 )*lda+irow-1 )
247 v3( 1 ) = a( ( icol-2 )*lda+irow )
250 h44s = h44 - h11( 1 )
251 h33s = h33 - h11( 1 )
252 v1 = ( h33s*h44s-h43h34 ) / h21( 1 ) + h12( 1 )
253 v2 = h22 - h11( 1 ) - h33s - h44s
254 s = abs( v1 ) + abs( v2 ) + abs( v3( 1 ) )
257 v3( 1 ) = v3( 1 ) / s