1 SUBROUTINE psdbtrsv( UPLO, TRANS, N, BWL, BWU, NRHS, A, JA, DESCA,
2 $ B, IB, DESCB, AF, LAF, WORK, LWORK, INFO )
10 INTEGER , BWU, IB, INFO, JA, LAF, LWORK, N, NRHS
13 INTEGER DESCA( * ), DESCB( * )
14 REAL A( * ), AF( * ), B( * ), WORK( * )
374 parameter( one = 1.0e+0 )
376 parameter( zero = 0.0e+0 )
378 parameter( int_one = 1 )
379 INTEGER DESCMULT, BIGNUM
380 parameter( descmult = 100, bignum = descmult*descmult )
381 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
382 $ lld_, mb_, m_, nb_, n_, rsrc_
383 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
384 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
385 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
388 INTEGER CSRC, FIRST_PROC, ICTXT, ICTXT_NEW, ICTXT_SAVE,
389 $ idum1, idum2, idum3, ja_new, level_dist, llda,
390 $ lldb, max_bw, mbw2, mycol, myrow, my_num_cols,
391 $ nb, np, npcol, nprow, np_save, odd_size, ofst,
392 $ part_offset, part_size, return_code, store_m_b,
393 $ store_n_a, work_size_min, work_u
396 INTEGER DESCA_1XP( 7 ), DESCB_PX1( 7 ),
397 $ param_check( 18, 3 )
407 EXTERNAL lsame, numroc
410 INTRINSIC ichar,
max,
min, mod
426 IF( return_code.NE.0 )
THEN
432 IF( return_code.NE.0 )
THEN
439 IF( desca_1xp( 2 ).NE.descb_px1( 2 ) )
THEN
447 IF( desca_1xp( 4 ).NE.descb_px1( 4 ) )
THEN
453 IF( desca_1xp( 5 ).NE.descb_px1( 5 ) )
THEN
459 ictxt = desca_1xp( 2 )
460 csrc = desca_1xp( 5 )
462 llda = desca_1xp( 6 )
463 store_n_a = desca_1xp( 3 )
464 lldb = descb_px1( 6 )
465 store_m_b = descb_px1( 3 )
472 max_bw =
max( bwl, bwu )
480 IF( lsame( uplo,
'U' ) )
THEN
482 ELSE IF( LSAME( UPLO, 'l
' ) ) THEN
488 IF( LSAME( TRANS, 'n
' ) ) THEN
490 ELSE IF( LSAME( TRANS, 't
' ) ) THEN
492 ELSE IF( LSAME( TRANS, 'c
' ) ) THEN
498.LT.
IF( LWORK-1 ) THEN
500.EQ.
ELSE IF( LWORK-1 ) THEN
510.GT.
IF( N+JA-1STORE_N_A ) THEN
514.GT..OR..LT.
IF( ( BWLN-1 ) ( BWL0 ) ) THEN
518.GT..OR..LT.
IF( ( BWUN-1 ) ( BWU0 ) ) THEN
522.LT.
IF( LLDA( BWL+BWU+1 ) ) THEN
530.GT.
IF( N+IB-1STORE_M_B ) THEN
534.LT.
IF( LLDBNB ) THEN
550.NE.
IF( NPROW1 ) THEN
554.GT.
IF( NNP*NB-MOD( JA-1, NB ) ) THEN
557 $ 'psdbtrsv, d&c alg.: only 1 block per proc
',
562.GT..AND..LT.
IF( ( JA+N-1NB ) ( NB2*MAX( BWL, BWU ) ) ) THEN
564 CALL PXERBLA( ICTXT, 'psdbtrsv, d&c alg.: nb too small
',
570 WORK_SIZE_MIN = MAX( BWL, BWU )*NRHS
572 WORK( 1 ) = WORK_SIZE_MIN
574.LT.
IF( LWORKWORK_SIZE_MIN ) THEN
575.NE.
IF( LWORK-1 ) THEN
577 CALL PXERBLA( ICTXT, 'psdbtrsv: worksize error
', -INFO )
584 PARAM_CHECK( 18, 1 ) = DESCB( 5 )
585 PARAM_CHECK( 17, 1 ) = DESCB( 4 )
586 PARAM_CHECK( 16, 1 ) = DESCB( 3 )
587 PARAM_CHECK( 15, 1 ) = DESCB( 2 )
588 PARAM_CHECK( 14, 1 ) = DESCB( 1 )
589 PARAM_CHECK( 13, 1 ) = IB
590 PARAM_CHECK( 12, 1 ) = DESCA( 5 )
591 PARAM_CHECK( 11, 1 ) = DESCA( 4 )
592 PARAM_CHECK( 10, 1 ) = DESCA( 3 )
593 PARAM_CHECK( 9, 1 ) = DESCA( 1 )
594 PARAM_CHECK( 8, 1 ) = JA
595 PARAM_CHECK( 7, 1 ) = NRHS
596 PARAM_CHECK( 6, 1 ) = BWU
597 PARAM_CHECK( 5, 1 ) = BWL
598 PARAM_CHECK( 4, 1 ) = N
599 PARAM_CHECK( 3, 1 ) = IDUM3
600 PARAM_CHECK( 2, 1 ) = IDUM2
601 PARAM_CHECK( 1, 1 ) = IDUM1
603 PARAM_CHECK( 18, 2 ) = 1205
604 PARAM_CHECK( 17, 2 ) = 1204
605 PARAM_CHECK( 16, 2 ) = 1203
606 PARAM_CHECK( 15, 2 ) = 1202
607 PARAM_CHECK( 14, 2 ) = 1201
608 PARAM_CHECK( 13, 2 ) = 11
609 PARAM_CHECK( 12, 2 ) = 905
610 PARAM_CHECK( 11, 2 ) = 904
611 PARAM_CHECK( 10, 2 ) = 903
612 PARAM_CHECK( 9, 2 ) = 901
613 PARAM_CHECK( 8, 2 ) = 8
614 PARAM_CHECK( 7, 2 ) = 6
615 PARAM_CHECK( 6, 2 ) = 5
616 PARAM_CHECK( 5, 2 ) = 4
617 PARAM_CHECK( 4, 2 ) = 3
618 PARAM_CHECK( 3, 2 ) = 16
619 PARAM_CHECK( 2, 2 ) = 2
620 PARAM_CHECK( 1, 2 ) = 1
628.LT.
ELSE IF( INFO-DESCMULT ) THEN
631 INFO = -INFO*DESCMULT
636 CALL GLOBCHK( ICTXT, 18, PARAM_CHECK, 18, PARAM_CHECK( 1, 3 ),
642.EQ.
IF( INFOBIGNUM ) THEN
644.EQ.
ELSE IF( MOD( INFO, DESCMULT )0 ) THEN
645 INFO = -INFO / DESCMULT
651 CALL PXERBLA( ICTXT, 'psdbtrsv', -INFO )
667 PART_OFFSET = NB*( ( JA-1 ) / ( NPCOL*NB ) )
669.LT.
IF( ( MYCOL-CSRC )( JA-PART_OFFSET-1 ) / NB ) THEN
670 PART_OFFSET = PART_OFFSET + NB
673.LT.
IF( MYCOLCSRC ) THEN
674 PART_OFFSET = PART_OFFSET - NB
683 FIRST_PROC = MOD( ( JA-1 ) / NB+CSRC, NPCOL )
687 JA_NEW = MOD( JA-1, NB ) + 1
692 NP = ( JA_NEW+N-2 ) / NB + 1
696 CALL RESHAPE( ICTXT, INT_ONE, ICTXT_NEW, INT_ONE, FIRST_PROC,
703 DESCA_1XP( 2 ) = ICTXT_NEW
704 DESCB_PX1( 2 ) = ICTXT_NEW
708 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
712.LT.
IF( MYROW0 ) THEN
725 MY_NUM_COLS = NUMROC( N, PART_SIZE, MYCOL, 0, NPCOL )
729.EQ.
IF( MYCOL0 ) THEN
730 PART_OFFSET = PART_OFFSET + MOD( JA_NEW-1, PART_SIZE )
731 MY_NUM_COLS = MY_NUM_COLS - MOD( JA_NEW-1, PART_SIZE )
736 OFST = PART_OFFSET*LLDA
740 ODD_SIZE = MY_NUM_COLS
741.LT.
IF( MYCOLNP-1 ) THEN
742 ODD_SIZE = ODD_SIZE - MAX_BW
747 WORK_U = BWU*ODD_SIZE + 3*MBW2
753 IF( LSAME( UPLO, 'l
' ) ) THEN
755 IF( LSAME( TRANS, 'n
' ) ) THEN
766 CALL STBTRS( UPLO, 'n
', 'u
', ODD_SIZE, BWL, NRHS,
767 $ A( OFST+1+BWU ), LLDA, B( PART_OFFSET+1 ),
771.LT.
IF( MYCOLNP-1 ) THEN
779 CALL SLAMOV( 'n
', BWL, NRHS,
780 $ B( PART_OFFSET+ODD_SIZE-BWL+1 ), LLDB,
781 $ WORK( 1 ), MAX_BW )
783 CALL STRMM( 'l
', 'u
', 'n
', 'n
', BWL, NRHS, -ONE,
784 $ A( ( OFST+( BWL+BWU+1 )+( ODD_SIZE-BWL )*
785 $ LLDA ) ), LLDA-1, WORK( 1 ), MAX_BW )
787 CALL SMATADD( BWL, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
788 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
794 DO 10 IDUM1 = 1, WORK_SIZE_MIN
799.NE.
IF( MYCOL0 ) THEN
804 CALL SGEMM( 'n
', 'n
', BWU, NRHS, ODD_SIZE, -ONE, AF( 1 ),
805 $ BWU, B( PART_OFFSET+1 ), LLDB, ZERO,
806 $ WORK( 1+MAX_BW-BWU ), MAX_BW )
818.GT.
IF( MYCOL0 ) THEN
820 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
827.LT.
IF( MYCOLNPCOL-1 ) THEN
829 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
834 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
835 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
842.EQ.
IF( MYCOLNPCOL-1 ) THEN
857.NE.
IF( MOD( ( MYCOL+1 ) / LEVEL_DIST, 2 )0 )
862.GE.
IF( MYCOL-LEVEL_DIST0 ) THEN
864 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
867 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
868 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
874.LT.
IF( MYCOL+LEVEL_DISTNPCOL-1 ) THEN
876 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
879 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
880 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
884 LEVEL_DIST = LEVEL_DIST*2
897 CALL STBTRS( 'l
', 'n
', 'u
', MAX_BW, MIN( BWL, MAX_BW-1 ),
898 $ NRHS, AF( ODD_SIZE*BWU+MBW2+1 ), MAX_BW+1,
899 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, INFO )
908.LE.
IF( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-2 ) THEN
912 CALL SGEMM( 't
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
913 $ AF( ( ODD_SIZE )*BWU+1 ), MAX_BW,
914 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, ZERO,
915 $ WORK( 1 ), MAX_BW )
919 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
926.GT..AND.
IF( ( MYCOL / LEVEL_DIST0 )
927.LE.
$ ( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-1 ) )
934 CALL SGEMM( 'n
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
935 $ AF( ODD_SIZE*BWU+2*MBW2+1 ), MAX_BW,
936 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, ZERO,
937 $ WORK( 1 ), MAX_BW )
941 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
961.EQ.
IF( MYCOLNPCOL-1 ) THEN
969.NE.
IF( MOD( ( MYCOL+1 ) / LEVEL_DIST, 2 )0 )
972 LEVEL_DIST = LEVEL_DIST*2
978.GT..AND.
IF( ( MYCOL / LEVEL_DIST0 )
979.LE.
$ ( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-1 ) )
984 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
991 CALL SGEMM( 't
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
992 $ AF( ODD_SIZE*BWU+2*MBW2+1 ), MAX_BW,
993 $ WORK( 1 ), MAX_BW, ONE,
994 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
999.LE.
IF( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-2 ) THEN
1003 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1004 $ MYCOL+LEVEL_DIST )
1008 CALL SGEMM( 'n
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
1009 $ AF( ( ODD_SIZE )*BWU+1 ), MAX_BW, WORK( 1 ),
1010 $ MAX_BW, ONE, B( PART_OFFSET+ODD_SIZE+1 ),
1019 CALL STBTRS( 'l
', 't
', 'u
', MAX_BW, MIN( BWL, MAX_BW-1 ),
1020 $ NRHS, AF( ODD_SIZE*BWU+MBW2+1 ), MAX_BW+1,
1021 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, INFO )
1023.NE.
IF( INFO0 ) THEN
1032.EQ.
IF( LEVEL_DIST1 )
1035 LEVEL_DIST = LEVEL_DIST / 2
1039.LT.
IF( MYCOL+LEVEL_DISTNPCOL-1 ) THEN
1041 CALL SGESD2D( ICTXT, MAX_BW, NRHS,
1042 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, 0,
1043 $ MYCOL+LEVEL_DIST )
1049.GE.
IF( MYCOL-LEVEL_DIST0 ) THEN
1051 CALL SGESD2D( ICTXT, MAX_BW, NRHS,
1052 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, 0,
1053 $ MYCOL-LEVEL_DIST )
1071.LT.
IF( MYCOLNPCOL-1 ) THEN
1073 CALL SGESD2D( ICTXT, MAX_BW, NRHS,
1074 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, 0,
1081.GT.
IF( MYCOL0 ) THEN
1083 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1094.NE.
IF( MYCOL0 ) THEN
1098 CALL SGEMM( 't
', 'n
', ODD_SIZE, NRHS, BWU, -ONE, AF( 1 ),
1099 $ BWU, WORK( 1+MAX_BW-BWU ), MAX_BW, ONE,
1100 $ B( PART_OFFSET+1 ), LLDB )
1105.LT.
IF( MYCOLNP-1 ) THEN
1113 CALL SLAMOV( 'n
', BWL, NRHS, B( PART_OFFSET+ODD_SIZE+1 ),
1114 $ LLDB, WORK( 1+MAX_BW-BWL ), MAX_BW )
1116 CALL STRMM( 'l
', 'u
', 't
', 'n
', BWL, NRHS, -ONE,
1117 $ A( ( OFST+( BWL+BWU+1 )+( ODD_SIZE-BWL )*
1118 $ LLDA ) ), LLDA-1, WORK( 1+MAX_BW-BWL ),
1121 CALL SMATADD( BWL, NRHS, ONE, WORK( 1+MAX_BW-BWL ),
1122 $ MAX_BW, ONE, B( PART_OFFSET+ODD_SIZE-BWL+
1129 CALL STBTRS( UPLO, 't
', 'u
', ODD_SIZE, BWL, NRHS,
1130 $ A( OFST+1+BWU ), LLDA, B( PART_OFFSET+1 ),
1141 IF( LSAME( TRANS, 't
' ) ) THEN
1152 CALL STBTRS( UPLO, 't
', 'n
', ODD_SIZE, BWU, NRHS,
1153 $ A( OFST+1 ), LLDA, B( PART_OFFSET+1 ), LLDB,
1157.LT.
IF( MYCOLNP-1 ) THEN
1165 CALL SLAMOV( 'n
', BWU, NRHS,
1166 $ B( PART_OFFSET+ODD_SIZE-BWU+1 ), LLDB,
1167 $ WORK( 1 ), MAX_BW )
1169 CALL STRMM( 'l
', 'l
', 't
', 'n
', BWU, NRHS, -ONE,
1170 $ A( ( OFST+1+ODD_SIZE*LLDA ) ), LLDA-1,
1171 $ WORK( 1 ), MAX_BW )
1173 CALL SMATADD( BWU, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
1174 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1180 DO 100 IDUM1 = 1, WORK_SIZE_MIN
1185.NE.
IF( MYCOL0 ) THEN
1189 CALL SGEMM( 'n
', 'n
', BWL, NRHS, ODD_SIZE, -ONE,
1190 $ AF( WORK_U+1 ), BWL, B( PART_OFFSET+1 ),
1191 $ LLDB, ZERO, WORK( 1+MAX_BW-BWL ), MAX_BW )
1202.GT.
IF( MYCOL0 ) THEN
1204 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1211.LT.
IF( MYCOLNPCOL-1 ) THEN
1213 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1218 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
1219 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1226.EQ.
IF( MYCOLNPCOL-1 ) THEN
1241.NE.
IF( MOD( ( MYCOL+1 ) / LEVEL_DIST, 2 )0 )
1246.GE.
IF( MYCOL-LEVEL_DIST0 ) THEN
1248 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1249 $ MYCOL-LEVEL_DIST )
1251 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
1252 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1258.LT.
IF( MYCOL+LEVEL_DISTNPCOL-1 ) THEN
1260 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1261 $ MYCOL+LEVEL_DIST )
1263 CALL SMATADD( MAX_BW, NRHS, ONE, WORK( 1 ), MAX_BW, ONE,
1264 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1268 LEVEL_DIST = LEVEL_DIST*2
1281 CALL STBTRS( 'u
', 't
', 'n
', MAX_BW, MIN( BWU, MAX_BW-1 ),
1282 $ NRHS, AF( ODD_SIZE*BWU+MBW2+1-MIN( BWU,
1283 $ MAX_BW-1 ) ), MAX_BW+1,
1284 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, INFO )
1286.NE.
IF( INFO0 ) THEN
1293.LE.
IF( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-2 ) THEN
1297 CALL SGEMM( 't
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
1298 $ AF( WORK_U+( ODD_SIZE )*BWL+1 ), MAX_BW,
1299 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, ZERO,
1300 $ WORK( 1 ), MAX_BW )
1304 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1305 $ MYCOL+LEVEL_DIST )
1311.GT..AND.
IF( ( MYCOL / LEVEL_DIST0 )
1312.LE.
$ ( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-1 ) )
1319 CALL SGEMM( 'n
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
1320 $ AF( WORK_U+ODD_SIZE*BWL+2*MBW2+1 ), MAX_BW,
1321 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB, ZERO,
1322 $ WORK( 1 ), MAX_BW )
1326 CALL SGESD2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1327 $ MYCOL-LEVEL_DIST )
1346.EQ.
IF( MYCOLNPCOL-1 ) THEN
1354.NE.
IF( MOD( ( MYCOL+1 ) / LEVEL_DIST, 2 )0 )
1357 LEVEL_DIST = LEVEL_DIST*2
1363.GT..AND.
IF( ( MYCOL / LEVEL_DIST0 )
1364.LE.
$ ( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-1 ) )
1369 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1370 $ MYCOL-LEVEL_DIST )
1376 CALL SGEMM( 't
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
1377 $ AF( WORK_U+ODD_SIZE*BWL+2*MBW2+1 ), MAX_BW,
1378 $ WORK( 1 ), MAX_BW, ONE,
1379 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1384.LE.
IF( MYCOL / LEVEL_DIST( NPCOL-1 ) / LEVEL_DIST-2 ) THEN
1388 CALL SGERV2D( ICTXT, MAX_BW, NRHS, WORK( 1 ), MAX_BW, 0,
1389 $ MYCOL+LEVEL_DIST )
1393 CALL SGEMM( 'n
', 'n
', MAX_BW, NRHS, MAX_BW, -ONE,
1394 $ AF( WORK_U+( ODD_SIZE )*BWL+1 ), MAX_BW,
1395 $ WORK( 1 ), MAX_BW, ONE,
1396 $ B( PART_OFFSET+ODD_SIZE+1 ), LLDB )
1404 CALL STBTRS( 'u
', 'n
', 'n', max_bw,
min( bwu, max_bw-1 ),
1405 $ nrhs, af( odd_size*bwu+mbw2+1-
min( bwu,
1406 $ max_bw-1 ) ), max_bw+1,
1407 $ b( part_offset+odd_size+1 ), lldb, info )
1409 IF( info.NE.0 )
THEN
1418 IF( level_dist.EQ.1 )
1421 level_dist = level_dist / 2
1425 IF( mycol+level_dist.LT.npcol-1 )
THEN
1427 CALL sgesd2d( ictxt, max_bw, nrhs,
1428 $ b( part_offset+odd_size+1 ), lldb, 0,
1429 $ mycol+level_dist )
1435 IF( mycol-level_dist.GE.0 )
THEN
1437 CALL sgesd2d( ictxt, max_bw, nrhs,
1438 $ b( part_offset+odd_size+1 ), lldb, 0,
1439 $ mycol-level_dist )
1457 IF( mycol.LT.npcol-1 )
THEN
1459 CALL sgesd2d( ictxt, max_bw, nrhs,
1460 $ b( part_offset+odd_size+1 ), lldb, 0,
1467 IF( mycol.GT.0 )
THEN
1469 CALL sgerv2d( ictxt, max_bw, nrhs, work( 1 ), max_bw, 0,
1480 IF( mycol.NE.0 )
THEN
1484 CALL sgemm(
'T',
'N', odd_size, nrhs, bwl, -one,
1485 $ af( work_u+1 ), bwl, work( 1+max_bw-bwl ),
1486 $ max_bw, one, b( part_offset+1 ), lldb )
1491 IF( mycol.LT.np-1 )
THEN
1499 CALL slamov(
'N', bwu, nrhs, b( part_offset+odd_size+1 ),
1500 $ lldb, work( 1+max_bw-bwu ), max_bw+bwl )
1502 CALL strmm(
'L',
'L',
'N',
'N', bwu, nrhs, -one,
1503 $ a( ( ofst+1+odd_size*llda ) ), llda-1,
1504 $ work( 1+max_bw-bwu ), max_bw+bwl )
1506 CALL smatadd( bwu, nrhs, one, work( 1+max_bw-bwu ),
1507 $ max_bw+bwl, one, b( part_offset+odd_size-
1514 CALL stbtrs( uplo,
'N',
'N', odd_size, bwu, nrhs,
1515 $ a( ofst+1 ), llda, b( part_offset+1 ), lldb,
1529 IF( ictxt_save.NE.ictxt_new )
THEN
1542 work( 1 ) = work_size_min