1 SUBROUTINE pdlascl( TYPE, CFROM, CTO, M, N, A, IA, JA, DESCA,
11 INTEGER IA, INFO, JA, M, N
12 DOUBLE PRECISION CFROM, CTO
16 DOUBLE PRECISION A( * )
136 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
137 $ lld_, mb_, m_, nb_, n_, rsrc_
138 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
139 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
140 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
141 DOUBLE PRECISION ONE, ZERO
142 parameter( zero = 0.0d0, one = 1.0d0 )
146 INTEGER IACOL, IAROW, ICOFFA, ICTXT, ICURCOL, ICURROW,
147 $ iia, ii, inxtrow, ioffa, iroffa, itype, j, jb,
148 $ jja, jj, jn, kk, lda, ll, mycol, myrow, mp,
150 DOUBLE PRECISION BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
156 LOGICAL LSAME, DISNAN
157 INTEGER ICEIL, NUMROC
158 DOUBLE PRECISION PDLAMCH
159 EXTERNAL disnan, iceil, lsame, numroc, pdlamch
162 INTRINSIC abs,
min, mod
168 ictxt = desca( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
173 IF( nprow.EQ.-1 )
THEN
177 CALL chk1mat( m, 4, n, 6, ia, ja, desca, 9, info )
179 IF( lsame(
TYPE,
'G' ) ) then
181 ELSE IF( lsame(
TYPE,
'L' ) ) then
183 ELSE IF( lsame(
TYPE,
'U' ) ) then
185 ELSE IF( lsame(
TYPE,
'H' ) ) then
190 IF( itype.EQ.-1 )
THEN
192 ELSE IF( cfrom.EQ.zero .OR. disnan(cfrom) )
THEN
194 ELSE IF( disnan(cto) )
THEN
201 CALL pxerbla( ictxt,
'PDLASCL', -info )
207 IF( n.EQ.0 .OR. m.EQ.0 )
212 smlnum = pdlamch( ictxt,
'S' )
213 bignum = one / smlnum
221 iroffa = mod( ia-1, desca( mb_ ) )
222 icoffa = mod( ja-1, desca( nb_ ) )
223 jn =
min( iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
224 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
226 mp = numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
229 nq = numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
234 cfrom1 = cfromc*smlnum
235 IF( cfrom1.EQ.cfromc )
THEN
243 IF( cto1.EQ.ctoc )
THEN
249 ELSE IF( abs( cfrom1 ).GT.abs( ctoc ) .AND. ctoc.NE.zero )
THEN
253 ELSE IF( abs( cto1 ).GT.abs( cfromc ) )
THEN
263 ioffa = ( jja - 1 ) * lda
267 IF( itype.EQ.0 )
THEN
271 DO 30 jj = jja, jja+nq-1
272 DO 20 ii = iia, iia+mp-1
273 a( ioffa+ii ) = a( ioffa+ii ) * mul
278 ELSE IF( itype.EQ.1 )
THEN
286 IF( mycol.EQ.icurcol )
THEN
287 IF( myrow.EQ.icurrow )
THEN
288 DO 50 ll = jj, jj + jb -1
289 DO 40 kk = ii+ll-jj, iia+mp-1
290 a( ioffa+kk ) = a( ioffa+kk ) * mul
295 DO 70 ll = jj, jj + jb -1
296 DO 60 kk = ii, iia+mp-1
297 a( ioffa+kk ) = a( ioffa+kk ) * mul
305 IF( myrow.EQ.icurrow )
307 icurrow = mod( icurrow+1, nprow )
308 icurcol = mod( icurcol+1, npcol )
312 DO 120 j = jn+1, ja+n-1, desca( nb_ )
313 jb =
min( ja+n-j, desca( nb_ ) )
315 IF( mycol.EQ.icurcol )
THEN
316 IF( myrow.EQ.icurrow )
THEN
317 DO 90 ll = jj, jj + jb -1
318 DO 80 kk = ii+ll-jj, iia+mp-1
319 a( ioffa+kk ) = a( ioffa+kk ) * mul
324 DO 110 ll = jj, jj + jb -1
325 DO 100 kk = ii, iia+mp-1
326 a( ioffa+kk ) = a( ioffa+kk ) * mul
334 IF( myrow.EQ.icurrow )
336 icurrow = mod( icurrow+1, nprow )
337 icurcol = mod( icurcol+1, npcol )
341 ELSE IF( itype.EQ.2 )
THEN
349 IF( mycol.EQ.icurcol )
THEN
350 IF( myrow.EQ.icurrow )
THEN
351 DO 140 ll = jj, jj + jb -1
352 DO 130 kk = iia,
min(ii+ll-jj,iia+mp-1)
353 a( ioffa+kk ) = a( ioffa+kk ) * mul
358 DO 160 ll = jj, jj + jb -1
359 DO 150 kk = iia,
min(ii-1,iia+mp-1)
360 a( ioffa+kk ) = a( ioffa+kk ) * mul
368 IF( myrow.EQ.icurrow )
370 icurrow = mod( icurrow+1, nprow )
371 icurcol = mod( icurcol+1, npcol )
375 DO 210 j = jn+1, ja+n-1, desca( nb_ )
376 jb =
min( ja+n-j, desca( nb_ ) )
378 IF( mycol.EQ.icurcol )
THEN
379 IF( myrow.EQ.icurrow )
THEN
380 DO 180 ll = jj, jj + jb -1
381 DO 170 kk = iia,
min(ii+ll-jj,iia+mp-1)
382 a( ioffa+kk ) = a( ioffa+kk )*mul
387 DO 200 ll = jj, jj + jb -1
388 DO 190 kk = iia,
min(ii-1,iia+mp-1)
389 a( ioffa+kk ) = a( ioffa+kk ) * mul
397 IF( myrow.EQ.icurrow )
399 icurrow = mod( icurrow+1, nprow )
400 icurcol = mod( icurcol+1, npcol )
404 ELSE IF( itype.EQ.3 )
THEN
414 IF( nprow.EQ.1 )
THEN
418 IF( mycol.EQ.icurcol )
THEN
419 DO 230 ll = jj, jj+jb-1
420 DO 220 kk = iia,
min( ii+ll-jj+1, iia+mp-1 )
421 a( ioffa+kk ) = a( ioffa+kk )*mul
428 icurcol = mod( icurcol+1, npcol )
432 DO 260 j = jn+1, ja+n-1, desca( nb_ )
433 jb =
min( ja+n-j, desca( nb_ ) )
435 IF( mycol.EQ.icurcol )
THEN
436 DO 250 ll = jj, jj+jb-1
437 DO 240 kk = iia,
min( ii+ll-jj+1, iia+mp-1 )
438 a( ioffa+kk ) = a( ioffa+kk )*mul
446 icurcol = mod( icurcol+1, npcol )
454 inxtrow = mod( icurrow+1, nprow )
455 IF( mycol.EQ.icurcol )
THEN
456 IF( myrow.EQ.icurrow )
THEN
457 DO 280 ll = jj, jj + jb -1
458 DO 270 kk = iia,
min(ii+ll-jj+1,iia+mp-1)
459 a( ioffa+kk ) = a( ioffa+kk ) * mul
464 DO 300 ll = jj, jj + jb -1
465 DO 290 kk = iia,
min(ii-1,iia+mp-1)
466 a( ioffa+kk ) = a( ioffa+kk ) * mul
470 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+mp-1 )
471 $ a( ii+(jj+jb-2)*lda ) = a( ii+(jj+jb-2)*lda ) * mul
476 IF( myrow.EQ.icurrow )
479 icurrow = mod( icurrow+1, nprow )
480 icurcol = mod( icurcol+1, npcol )
484 DO 350 j = jn+1, ja+n-1, desca( nb_ )
485 jb =
min( ja+n-j, desca( nb_ ) )
487 IF( mycol.EQ.icurcol )
THEN
488 IF( myrow.EQ.icurrow )
THEN
489 DO 320 ll = jj, jj + jb -1
490 DO 310 kk = iia,
min( ii+ll-jj+1, iia+mp-1 )
491 a( ioffa+kk ) = a( ioffa+kk ) * mul
496 DO 340 ll = jj, jj + jb -1
497 DO 330 kk = iia,
min( ii-1, iia+mp-1 )
498 a( ioffa+kk ) = a( ioffa+kk ) * mul
502 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+mp-1 )
503 $ a( ii+(jj+jb-2)*lda ) = a( ii+(jj+jb-2)*lda ) *
509 IF( myrow.EQ.icurrow )
512 icurrow = mod( icurrow+1, nprow )
513 icurcol = mod( icurcol+1, npcol )