3
4
5
6
7
8
9
10 CHARACTER TRANS
11 INTEGER BWL, BWU, IB, INFO, JA, LAF, LWORK, N, NRHS
12
13
14 INTEGER DESCA( * ), DESCB( * )
15 DOUBLE PRECISION A( * ), AF( * ), B( * ), WORK( * )
16
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366 INTEGER INT_ONE
367 parameter( int_one = 1 )
368 INTEGER DESCMULT, BIGNUM
369 parameter( descmult = 100, bignum = descmult*descmult )
370 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
371 $ LLD_, MB_, M_, NB_, N_, RSRC_
372 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
373 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
374 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
375
376
377 INTEGER CSRC, FIRST_PROC, ICTXT, ICTXT_NEW, ICTXT_SAVE,
378 $ IDUM2, IDUM3, JA_NEW, LLDA, LLDB, MYCOL, MYROW,
379 $ NB, NP, NPCOL, NPROW, NP_SAVE, PART_OFFSET,
380 $ RETURN_CODE, STORE_M_B, STORE_N_A,
381 $ WORK_SIZE_MIN
382
383
384 INTEGER DESCA_1XP( 7 ), DESCB_PX1( 7 ),
385 $ PARAM_CHECK( 17, 3 )
386
387
390
391
392 LOGICAL LSAME
394
395
396 INTRINSIC ichar,
max, mod
397
398
399
400
401
402 info = 0
403
404
405
406
407 desca_1xp( 1 ) = 501
408 descb_px1( 1 ) = 502
409
411
412 IF( return_code.NE.0 ) THEN
413 info = -( 8*100+2 )
414 END IF
415
417
418 IF( return_code.NE.0 ) THEN
419 info = -( 11*100+2 )
420 END IF
421
422
423
424
425 IF( desca_1xp( 2 ).NE.descb_px1( 2 ) ) THEN
426 info = -( 11*100+2 )
427 END IF
428
429
430
431
432
433 IF( desca_1xp( 4 ).NE.descb_px1( 4 ) ) THEN
434 info = -( 11*100+4 )
435 END IF
436
437
438
439 IF( desca_1xp( 5 ).NE.descb_px1( 5 ) ) THEN
440 info = -( 11*100+5 )
441 END IF
442
443
444
445 ictxt = desca_1xp( 2 )
446 csrc = desca_1xp( 5 )
447 nb = desca_1xp( 4 )
448 llda = desca_1xp( 6 )
449 store_n_a = desca_1xp( 3 )
450 lldb = descb_px1( 6 )
451 store_m_b = descb_px1( 3 )
452
453
454
455
456 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
457 np = nprow*npcol
458
459
460
461 IF(
lsame( trans,
'N' ) )
THEN
462 idum2 = ichar( 'N' )
463 ELSE IF(
lsame( trans,
'T' ) )
THEN
464 idum2 = ichar( 'T' )
465 ELSE IF(
lsame( trans,
'C' ) )
THEN
466 idum2 = ichar( 'T' )
467 ELSE
468 info = -1
469 END IF
470
471 IF( lwork.LT.-1 ) THEN
472 info = -15
473 ELSE IF( lwork.EQ.-1 ) THEN
474 idum3 = -1
475 ELSE
476 idum3 = 1
477 END IF
478
479 IF( n.LT.0 ) THEN
480 info = -2
481 END IF
482
483 IF( n+ja-1.GT.store_n_a ) THEN
484 info = -( 8*100+6 )
485 END IF
486
487 IF( ( bwl.GT.n-1 ) .OR. ( bwl.LT.0 ) ) THEN
488 info = -3
489 END IF
490
491 IF( ( bwu.GT.n-1 ) .OR. ( bwu.LT.0 ) ) THEN
492 info = -4
493 END IF
494
495 IF( llda.LT.( bwl+bwu+1 ) ) THEN
496 info = -( 8*100+6 )
497 END IF
498
499 IF( nb.LE.0 ) THEN
500 info = -( 8*100+4 )
501 END IF
502
503 IF( n+ib-1.GT.store_m_b ) THEN
504 info = -( 11*100+3 )
505 END IF
506
507 IF( lldb.LT.nb ) THEN
508 info = -( 11*100+6 )
509 END IF
510
511 IF( nrhs.LT.0 ) THEN
512 info = -5
513 END IF
514
515
516
517 IF( ja.NE.ib ) THEN
518 info = -7
519 END IF
520
521
522
523 IF( nprow.NE.1 ) THEN
524 info = -( 8*100+2 )
525 END IF
526
527 IF( n.GT.np*nb-mod( ja-1, nb ) ) THEN
528 info = -( 2 )
529 CALL pxerbla( ictxt,
'PDDBTRS, D&C alg.: only 1 block per proc'
530 $ , -info )
531 RETURN
532 END IF
533
534 IF( ( ja+n-1.GT.nb ) .AND. ( nb.LT.2*
max( bwl, bwu ) ) )
THEN
535 info = -( 8*100+4 )
536 CALL pxerbla( ictxt,
'PDDBTRS, D&C alg.: NB too small', -info )
537 RETURN
538 END IF
539
540
541 work_size_min = (
max( bwl, bwu )*nrhs )
542
543 work( 1 ) = work_size_min
544
545 IF( lwork.LT.work_size_min ) THEN
546 IF( lwork.NE.-1 ) THEN
547 info = -15
548 CALL pxerbla( ictxt,
'PDDBTRS: worksize error', -info )
549 END IF
550 RETURN
551 END IF
552
553
554
555 param_check( 17, 1 ) = descb( 5 )
556 param_check( 16, 1 ) = descb( 4 )
557 param_check( 15, 1 ) = descb( 3 )
558 param_check( 14, 1 ) = descb( 2 )
559 param_check( 13, 1 ) = descb( 1 )
560 param_check( 12, 1 ) = ib
561 param_check( 11, 1 ) = desca( 5 )
562 param_check( 10, 1 ) = desca( 4 )
563 param_check( 9, 1 ) = desca( 3 )
564 param_check( 8, 1 ) = desca( 1 )
565 param_check( 7, 1 ) = ja
566 param_check( 6, 1 ) = nrhs
567 param_check( 5, 1 ) = bwu
568 param_check( 4, 1 ) = bwl
569 param_check( 3, 1 ) = n
570 param_check( 2, 1 ) = idum3
571 param_check( 1, 1 ) = idum2
572
573 param_check( 17, 2 ) = 1105
574 param_check( 16, 2 ) = 1104
575 param_check( 15, 2 ) = 1103
576 param_check( 14, 2 ) = 1102
577 param_check( 13, 2 ) = 1101
578 param_check( 12, 2 ) = 10
579 param_check( 11, 2 ) = 805
580 param_check( 10, 2 ) = 804
581 param_check( 9, 2 ) = 803
582 param_check( 8, 2 ) = 801
583 param_check( 7, 2 ) = 7
584 param_check( 6, 2 ) = 5
585 param_check( 5, 2 ) = 4
586 param_check( 4, 2 ) = 3
587 param_check( 3, 2 ) = 2
588 param_check( 2, 2 ) = 15
589 param_check( 1, 2 ) = 1
590
591
592
593
594
595 IF( info.GE.0 ) THEN
596 info = bignum
597 ELSE IF( info.LT.-descmult ) THEN
598 info = -info
599 ELSE
600 info = -info*descmult
601 END IF
602
603
604
605 CALL globchk( ictxt, 17, param_check, 17, param_check( 1, 3 ),
606 $ info )
607
608
609
610
611 IF( info.EQ.bignum ) THEN
612 info = 0
613 ELSE IF( mod( info, descmult ).EQ.0 ) THEN
614 info = -info / descmult
615 ELSE
616 info = -info
617 END IF
618
619 IF( info.LT.0 ) THEN
620 CALL pxerbla( ictxt,
'PDDBTRS', -info )
621 RETURN
622 END IF
623
624
625
626 IF( n.EQ.0 )
627 $ RETURN
628
629 IF( nrhs.EQ.0 )
630 $ RETURN
631
632
633
634
635
636 part_offset = nb*( ( ja-1 ) / ( npcol*nb ) )
637
638 IF( ( mycol-csrc ).LT.( ja-part_offset-1 ) / nb ) THEN
639 part_offset = part_offset + nb
640 END IF
641
642 IF( mycol.LT.csrc ) THEN
643 part_offset = part_offset - nb
644 END IF
645
646
647
648
649
650
651
652 first_proc = mod( ( ja-1 ) / nb+csrc, npcol )
653
654
655
656 ja_new = mod( ja-1, nb ) + 1
657
658
659
660 np_save = np
661 np = ( ja_new+n-2 ) / nb + 1
662
663
664
665 CALL reshape( ictxt, int_one, ictxt_new, int_one, first_proc,
666 $ int_one, np )
667
668
669
670 ictxt_save = ictxt
671 ictxt = ictxt_new
672 desca_1xp( 2 ) = ictxt_new
673 descb_px1( 2 ) = ictxt_new
674
675
676
677 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
678
679
680
681 IF( myrow.LT.0 ) THEN
682 GO TO 20
683 END IF
684
685
686
687
688
689 info = 0
690
691
692
693 IF(
lsame( trans,
'N' ) )
THEN
694
695 CALL pddbtrsv(
'L',
'N', n, bwl, bwu, nrhs, a( part_offset+1 ),
696 $ ja_new, desca_1xp, b, ib, descb_px1, af, laf,
697 $ work, lwork, info )
698
699 ELSE
700
701 CALL pddbtrsv(
'U',
'T', n, bwl, bwu, nrhs, a( part_offset+1 ),
702 $ ja_new, desca_1xp, b, ib, descb_px1, af, laf,
703 $ work, lwork, info )
704
705 END IF
706
707
708
709 IF( (
lsame( trans,
'C' ) ) .OR. (
lsame( trans,
'T' ) ) )
THEN
710
711 CALL pddbtrsv(
'L',
'T', n, bwl, bwu, nrhs, a( part_offset+1 ),
712 $ ja_new, desca_1xp, b, ib, descb_px1, af, laf,
713 $ work, lwork, info )
714
715 ELSE
716
717 CALL pddbtrsv(
'U',
'N', n, bwl, bwu, nrhs, a( part_offset+1 ),
718 $ ja_new, desca_1xp, b, ib, descb_px1, af, laf,
719 $ work, lwork, info )
720
721 END IF
722 10 CONTINUE
723
724
725
726
727 IF( ictxt_save.NE.ictxt_new ) THEN
728 CALL blacs_gridexit( ictxt_new )
729 END IF
730
731 20 CONTINUE
732
733
734
735 ictxt = ictxt_save
736 np = np_save
737
738
739
740 work( 1 ) = work_size_min
741
742
743 RETURN
744
745
746
subroutine desc_convert(desc_in, desc_out, info)
subroutine globchk(ictxt, n, x, ldx, iwork, info)
subroutine pddbtrsv(uplo, trans, n, bwl, bwu, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine pxerbla(ictxt, srname, info)
void reshape(Int *context_in, Int *major_in, Int *context_out, Int *major_out, Int *first_proc, Int *nprow_new, Int *npcol_new)