3
4
5
6
7
8
9
10 CHARACTER TYPE
11 INTEGER IA, INFO, JA, M, N
12 DOUBLE PRECISION CFROM, CTO
13
14
15 INTEGER DESCA( * )
16 DOUBLE PRECISION A( * )
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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 )
143
144
145 LOGICAL DONE
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,
149 $ NPCOL, NPROW, NQ
150 DOUBLE PRECISION BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
151
152
154
155
156 LOGICAL LSAME, DISNAN
157 INTEGER ICEIL, NUMROC
158 DOUBLE PRECISION PDLAMCH
160
161
162 INTRINSIC abs,
min, mod
163
164
165
166
167
168 ictxt = desca( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
170
171
172
173 IF( nprow.EQ.-1 ) THEN
174 info = -907
175 ELSE
176 info = 0
177 CALL chk1mat( m, 4, n, 6, ia, ja, desca, 9, info )
178 IF( info.EQ.0 ) THEN
179 IF(
lsame(
TYPE,
'G' ) ) THEN
180 itype = 0
181 ELSE IF(
lsame(
TYPE,
'L' ) ) THEN
182 itype = 1
183 ELSE IF(
lsame(
TYPE,
'U' ) ) THEN
184 itype = 2
185 ELSE IF(
lsame(
TYPE,
'H' ) ) THEN
186 itype = 3
187 ELSE
188 itype = -1
189 END IF
190 IF( itype.EQ.-1 ) THEN
191 info = -1
192 ELSE IF( cfrom.EQ.zero .OR. disnan(cfrom) ) THEN
193 info = -4
194 ELSE IF( disnan(cto) ) THEN
195 info = -5
196 END IF
197 END IF
198 END IF
199
200 IF( info.NE.0 ) THEN
201 CALL pxerbla( ictxt,
'PDLASCL', -info )
202 RETURN
203 END IF
204
205
206
207 IF( n.EQ.0 .OR. m.EQ.0 )
208 $ RETURN
209
210
211
213 bignum = one / smlnum
214
215 cfromc = cfrom
216 ctoc = cto
217
218
219
220 lda = desca( lld_ )
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,
225 $ iarow, iacol )
226 mp =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
227 IF( myrow.EQ.iarow )
228 $ mp = mp - iroffa
229 nq =
numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
230 IF( mycol.EQ.iacol )
231 $ nq = nq - icoffa
232
233 10 CONTINUE
234 cfrom1 = cfromc*smlnum
235 IF( cfrom1.EQ.cfromc ) THEN
236
237
238 mul = ctoc / cfromc
239 done = .true.
240 cto1 = ctoc
241 ELSE
242 cto1 = ctoc / bignum
243 IF( cto1.EQ.ctoc ) THEN
244
245
246 mul = ctoc
247 done = .true.
248 cfromc = one
249 ELSE IF( abs( cfrom1 ).GT.abs( ctoc ) .AND. ctoc.NE.zero ) THEN
250 mul = smlnum
251 done = .false.
252 cfromc = cfrom1
253 ELSE IF( abs( cto1 ).GT.abs( cfromc ) ) THEN
254 mul = bignum
255 done = .false.
256 ctoc = cto1
257 ELSE
258 mul = ctoc / cfromc
259 done = .true.
260 END IF
261 END IF
262
263 ioffa = ( jja - 1 ) * lda
264 icurrow = iarow
265 icurcol = iacol
266
267 IF( itype.EQ.0 ) THEN
268
269
270
271 DO 30 jj = jja, jja+nq-1
272 DO 20 ii = iia, iia+mp-1
273 a( ioffa+ii ) = a( ioffa+ii ) * mul
274 20 CONTINUE
275 ioffa = ioffa + lda
276 30 CONTINUE
277
278 ELSE IF( itype.EQ.1 ) THEN
279
280
281
282 ii = iia
283 jj = jja
284 jb = jn-ja+1
285
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
291 40 CONTINUE
292 ioffa = ioffa + lda
293 50 CONTINUE
294 ELSE
295 DO 70 ll = jj, jj + jb -1
296 DO 60 kk = ii, iia+mp-1
297 a( ioffa+kk ) = a( ioffa+kk ) * mul
298 60 CONTINUE
299 ioffa = ioffa + lda
300 70 CONTINUE
301 END IF
302 jj = jj + jb
303 END IF
304
305 IF( myrow.EQ.icurrow )
306 $ ii = ii + jb
307 icurrow = mod( icurrow+1, nprow )
308 icurcol = mod( icurcol+1, npcol )
309
310
311
312 DO 120 j = jn+1, ja+n-1, desca( nb_ )
313 jb =
min( ja+n-j, desca( nb_ ) )
314
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
320 80 CONTINUE
321 ioffa = ioffa + lda
322 90 CONTINUE
323 ELSE
324 DO 110 ll = jj, jj + jb -1
325 DO 100 kk = ii, iia+mp-1
326 a( ioffa+kk ) = a( ioffa+kk ) * mul
327 100 CONTINUE
328 ioffa = ioffa + lda
329 110 CONTINUE
330 END IF
331 jj = jj + jb
332 END IF
333
334 IF( myrow.EQ.icurrow )
335 $ ii = ii + jb
336 icurrow = mod( icurrow+1, nprow )
337 icurcol = mod( icurcol+1, npcol )
338
339 120 CONTINUE
340
341 ELSE IF( itype.EQ.2 ) THEN
342
343
344
345 ii = iia
346 jj = jja
347 jb = jn-ja+1
348
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
354 130 CONTINUE
355 ioffa = ioffa + lda
356 140 CONTINUE
357 ELSE
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
361 150 CONTINUE
362 ioffa = ioffa + lda
363 160 CONTINUE
364 END IF
365 jj = jj + jb
366 END IF
367
368 IF( myrow.EQ.icurrow )
369 $ ii = ii + jb
370 icurrow = mod( icurrow+1, nprow )
371 icurcol = mod( icurcol+1, npcol )
372
373
374
375 DO 210 j = jn+1, ja+n-1, desca( nb_ )
376 jb =
min( ja+n-j, desca( nb_ ) )
377
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
383 170 CONTINUE
384 ioffa = ioffa + lda
385 180 CONTINUE
386 ELSE
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
390 190 CONTINUE
391 ioffa = ioffa + lda
392 200 CONTINUE
393 END IF
394 jj = jj + jb
395 END IF
396
397 IF( myrow.EQ.icurrow )
398 $ ii = ii + jb
399 icurrow = mod( icurrow+1, nprow )
400 icurcol = mod( icurcol+1, npcol )
401
402 210 CONTINUE
403
404 ELSE IF( itype.EQ.3 ) THEN
405
406
407
408 ii = iia
409 jj = jja
410 jb = jn-ja+1
411
412
413
414 IF( nprow.EQ.1 ) THEN
415
416
417
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
422 220 CONTINUE
423 ioffa = ioffa + lda
424 230 CONTINUE
425 jj = jj + jb
426 END IF
427
428 icurcol = mod( icurcol+1, npcol )
429
430
431
432 DO 260 j = jn+1, ja+n-1, desca( nb_ )
433 jb =
min( ja+n-j, desca( nb_ ) )
434
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
439 240 CONTINUE
440 ioffa = ioffa + lda
441 250 CONTINUE
442 jj = jj + jb
443 END IF
444
445 ii = ii + jb
446 icurcol = mod( icurcol+1, npcol )
447
448 260 CONTINUE
449
450 ELSE
451
452
453
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
460 270 CONTINUE
461 ioffa = ioffa + lda
462 280 CONTINUE
463 ELSE
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
467 290 CONTINUE
468 ioffa = ioffa + lda
469 300 CONTINUE
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
472 END IF
473 jj = jj + jb
474 END IF
475
476 IF( myrow.EQ.icurrow )
477 $ ii = ii + jb
478 icurrow = inxtrow
479 icurrow = mod( icurrow+1, nprow )
480 icurcol = mod( icurcol+1, npcol )
481
482
483
484 DO 350 j = jn+1, ja+n-1, desca( nb_ )
485 jb =
min( ja+n-j, desca( nb_ ) )
486
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
492 310 CONTINUE
493 ioffa = ioffa + lda
494 320 CONTINUE
495 ELSE
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
499 330 CONTINUE
500 ioffa = ioffa + lda
501 340 CONTINUE
502 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+mp-1 )
503 $ a( ii+(jj+jb-2)*lda ) = a( ii+(jj+jb-2)*lda ) *
504 $ mul
505 END IF
506 jj = jj + jb
507 END IF
508
509 IF( myrow.EQ.icurrow )
510 $ ii = ii + jb
511 icurrow = inxtrow
512 icurrow = mod( icurrow+1, nprow )
513 icurcol = mod( icurcol+1, npcol )
514
515 350 CONTINUE
516
517 END IF
518
519 END IF
520
521 IF( .NOT.done )
522 $ GO TO 10
523
524 RETURN
525
526
527
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
double precision function pdlamch(ictxt, cmach)
subroutine pxerbla(ictxt, srname, info)