1 SUBROUTINE pddbtrs( TRANS, N, BWL, BWU, NRHS, A, JA, DESCA, B, IB,
2 $ DESCB, AF, LAF, WORK, LWORK, INFO )
11 INTEGER BWL, BWU, IB, INFO, JA, LAF, LWORK, N, NRHS
14 INTEGER DESCA( * ), DESCB( * )
15 DOUBLE PRECISION A( * ), AF( * ), B( * ), WORK( * )
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 )
377 INTEGER , 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,
384 INTEGER DESCA_1XP( 7 ), DESCB_PX1( 7 ),
385 $ param_check( 17, 3 )
396 INTRINSIC ichar,
max, mod
412 IF( return_code.NE.0 )
THEN
418 IF( return_code.NE.0 )
THEN
425 IF( desca_1xp( 2 ).NE.descb_px1( 2 ) )
THEN
433 IF( desca_1xp( 4 ).NE.descb_px1( 4 ) )
THEN
439 IF( desca_1xp( 5 ).NE.descb_px1( 5 ) )
THEN
445 ictxt = desca_1xp( 2 )
446 csrc = desca_1xp( 5 )
448 llda = desca_1xp( 6 )
449 store_n_a = desca_1xp( 3 )
450 lldb = descb_px1( 6 )
451 store_m_b = descb_px1( 3 )
461 IF( lsame( trans,
'N' ) )
THEN
463 ELSE IF( lsame( trans,
'T' ) )
THEN
465 ELSE IF( lsame( trans,
'C' ) )
THEN
471 IF( lwork.LT.-1 )
THEN
473 ELSE IF( lwork.EQ.-1 )
THEN
483 IF( n+ja-1.GT.store_n_a )
THEN
487 IF( ( bwl.GT.n-1 ) .OR. ( bwl.LT.0 ) )
THEN
491 IF( ( bwu.GT.n-1 ) .OR. ( bwu.LT.0 ) )
THEN
495 IF( llda.LT.( bwl+bwu+1 ) )
THEN
503 IF( n+ib-1.GT.store_m_b )
THEN
507 IF( lldb.LT.nb )
THEN
523 IF( nprow.NE.1 )
THEN
527 IF( n.GT.np*nb-mod( ja-1, nb ) )
THEN
529 CALL pxerbla( ictxt,
'PDDBTRS, D&C alg.: only 1 block per proc'
534 IF( ( ja+n-1.GT.nb ) .AND. ( nb.LT.2*
max( bwl, bwu ) ) )
THEN
541 WORK_SIZE_MIN = ( MAX( BWL, BWU )*NRHS )
543 WORK( 1 ) = WORK_SIZE_MIN
545.LT.
IF( LWORKWORK_SIZE_MIN ) THEN
546.NE.
IF( LWORK-1 ) THEN
548 CALL PXERBLA( ICTXT, 'pddbtrs: worksize error
', -INFO )
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
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
597.LT.
ELSE IF( INFO-DESCMULT ) THEN
600 INFO = -INFO*DESCMULT
605 CALL GLOBCHK( ICTXT, 17, PARAM_CHECK, 17, PARAM_CHECK( 1, 3 ),
611.EQ.
IF( INFOBIGNUM ) THEN
613.EQ.
ELSE IF( MOD( INFO, DESCMULT )0 ) THEN
614 INFO = -INFO / DESCMULT
620 CALL PXERBLA( ICTXT, 'pddbtrs', -INFO )
636 PART_OFFSET = NB*( ( JA-1 ) / ( NPCOL*NB ) )
638.LT.
IF( ( MYCOL-CSRC )( JA-PART_OFFSET-1 ) / NB ) THEN
639 PART_OFFSET = PART_OFFSET + NB
642.LT.
IF( MYCOLCSRC ) THEN
643 PART_OFFSET = PART_OFFSET - NB
652 FIRST_PROC = MOD( ( JA-1 ) / NB+CSRC, NPCOL )
656 JA_NEW = MOD( JA-1, NB ) + 1
661 NP = ( JA_NEW+N-2 ) / NB + 1
665 CALL RESHAPE( ICTXT, INT_ONE, ICTXT_NEW, INT_ONE, FIRST_PROC,
672 DESCA_1XP( 2 ) = ICTXT_NEW
673 DESCB_PX1( 2 ) = ICTXT_NEW
677 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
681.LT.
IF( MYROW0 ) THEN
693 IF( LSAME( TRANS, 'n
' ) ) THEN
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 )
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 )
709 IF( ( LSAME( TRANS, 'c.OR.
' ) ) ( LSAME( TRANS, 't
' ) ) ) THEN
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 )
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 )
727.NE.
IF( ICTXT_SAVEICTXT_NEW ) THEN
728 CALL BLACS_GRIDEXIT( ICTXT_NEW )
740 WORK( 1 ) = WORK_SIZE_MIN
subroutine pddbtrs(trans, n, bwl, bwu, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine pddbtrsv(uplo, trans, n, bwl, bwu, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)