63 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
64 $ lld_, mb_, m_, nb_, n_, rsrc_
65 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
66 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
67 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
68 INTEGER memsiz, ntests, realsz, totmem
71 parameter( realsz = 4, totmem = 2000000,
72 $ memsiz = totmem / realsz, ntests = 20,
73 $ padval = -9923.0e+0 )
74 parameter( one = 1.0e+0, zero = 0.0e+0 )
81 INTEGER hh, i, iam, iaseed, ibseed, ictxt, ii, imidpad,
82 $ , ipa, ipb, ipostpad, iprepad, ipw, ipw2,
83 $ ipx, iscale, , itype, , jj, k, kfail, kk,
84 $ kpass, kskip, ktests, lcm, lcmp, ltau, lwf,
85 $ lwork, lws, m, mnp, mnrhsp, mp, mq, mycol,
86 $ myrow, n, nb, nbrhs, ncols, ngrids, nmat, nnb,
87 $ nnbr, nnr, nnrhsq, nout, np, npcol, nprocs,
88 $ nprow, nrows, nq, nrhs, nrhsp, nrhsq, worksiz
89 REAL anorm, bnorm, sresid, thresh
90 DOUBLE PRECISION addfac, adds, mulfac, mults, nops, tmflops
93 INTEGER desca( dlen_ ), ( dlen_ ), descw( lld_ ),
94 $ ( dlen_ ), ierr( 2 ), mval( ),
95 $ nbrval( ntests ), nbval( ntests ),
96 $ nrval( ntests ), nval( ntests ),
97 $ pval( ntests ), qval( ntests )
98 REAL mem( memsiz ), result( 2 )
99 DOUBLE PRECISION ctime( 1 ), wtime( 1 )
102 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
120 DATA ktests, kpass, kfail, kskip / 4*0 /
126 CALL blacs_pinfo( iam, nprocs )
130 CALL pslsinfo( outfile, nout, nmat, mval, ntests, nval,
131 $ ntests, nnb, nbval, ntests, nnr, nrval, ntests,
132 $ nnbr, nbrval, ntests, ngrids, pval, ntests, qval,
133 $ ntests, thresh, mem, iam, nprocs )
134 check = ( thresh.GE.0.0e+0 )
139 WRITE( nout, fmt = * )
140 WRITE( nout, fmt = 9995 )
141 WRITE( nout, fmt = 9994 )
142 WRITE( nout, fmt = * )
155 IF( nprow.LT.1 )
THEN
157 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
159 ELSE IF( npcol.LT.1 )
THEN
161 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol'
163 ELSE IF( nprow*npcol.GT.nprocs )
THEN
165 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
169 IF( ierr( 1 ).GT.0 )
THEN
171 $
WRITE( nout, fmt = 9997 )
'grid'
178 CALL blacs_get( -1, 0, ictxt )
184 IF( ( myrow.GE.nprow ).OR.( mycol.GE.npcol ) )
197 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'M', m
199 ELSE IF( n.LT.1 )
THEN
201 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
207 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
209 IF( ierr( 1 ).GT.0 )
THEN
211 $
WRITE( nout, fmt = 9997 )
'matrix'
228 $
WRITE( nout, fmt = 9999 )
'NB',
'NB', nb
233 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
235 IF( ierr( 1 ).GT.0 )
THEN
237 $
WRITE( nout, fmt = 9997 )
'NB'
244 mp =
numroc( m, nb, myrow, 0, nprow )
245 mq =
numroc( m, nb, mycol, 0, npcol )
246 np =
numroc( n, nb, myrow, 0, nprow )
248 nq =
numroc( n, nb, mycol, 0, npcol )
251 iprepad =
max( nb, mp )
253 ipostpad =
max( nb, nq )
262 CALL descinit( desca, m, n, nb, nb, 0, 0, ictxt,
263 $
max( 1, mp ) + imidpad, ierr( 1 ) )
267 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr
269 IF( ierr( 1 ).LT.0 )
THEN
271 $
WRITE( nout, fmt = 9997 )
'descriptor'
284 ipx = ipa + desca( lld_ )*nq + ipostpad + iprepad
287 worksiz = nq + ipostpad
292 IF( ( ipw+worksiz ).GT.memsiz )
THEN
294 $
WRITE( nout, fmt = 9996 )
'MEMORY',
295 $ ( ipx+worksiz )*realsz
301 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1,
304 IF( ierr( 1 ).GT.0 )
THEN
306 $
WRITE( nout, fmt = 9997 )
'MEMORY'
312 CALL psfillpad( ictxt, mp, nq, mem( ipa-iprepad ),
313 $ desca( lld_ ), iprepad, ipostpad,
315 CALL psfillpad( ictxt, worksiz-ipostpad, 1,
316 $ mem( ipw-iprepad ),
317 $ worksiz-ipostpad, iprepad,
323 CALL psqrt13( iscale, m, n, mem( ipa ), 1, 1,
324 $ desca, anorm, iaseed, mem( ipw ) )
327 CALL pschekpad( ictxt,
'PSQRT13', mp, nq,
328 $ mem( ipa-iprepad ), desca( lld_ ),
329 $ iprepad, ipostpad, padval )
331 $ worksiz-ipostpad, 1,
333 $ worksiz-ipostpad, iprepad,
339 IF( itran.EQ.1 )
THEN
361 NRHSP = NUMROC( NRHS, NBRHS, MYROW, 0,
363 NRHSQ = NUMROC( NRHS, NBRHS, MYCOL, 0,
368 CALL DESCINIT( DESCX, MAX( M, N ), NRHS, NB,
369 $ NBRHS, 0, 0, ICTXT,
370 $ MAX( 1, MNP ) + IMIDPAD,
373 CALL DESCINIT( DESCW, M, NRHS, NB, NBRHS,
374 $ 0, 0, ICTXT, MAX( 1, MP ) +
375 $ IMIDPAD, IERR( 2 ) )
377 CALL DESCINIT( DESCW, N, NRHS, NB, NBRHS,
378 $ 0, 0, ICTXT, MAX( 1, NP ) +
379 $ IMIDPAD, IERR( 2 ) )
384 CALL IGSUM2D( ICTXT, 'all
', ' ', 2, 1, IERR,
387.LT..OR..LT.
IF( IERR( 1 )0 IERR( 2 )0 ) THEN
389 $ WRITE( NOUT, FMT = 9997 ) 'descriptor
'
396 IPX = IPA + DESCA( LLD_ )*NQ + IPOSTPAD +
398 IPW = IPX + DESCX( LLD_ )*NRHSQ + IPOSTPAD +
400 WORKSIZ = DESCW( LLD_ )*NRHSQ + IPOSTPAD
403.GT.
IF( IPW+WORKSIZMEMSIZ ) THEN
405 $ WRITE( NOUT, FMT = 9996 ) 'generation
',
406 $ ( IPW+WORKSIZ )*REALSZ
412 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
415.GT.
IF( IERR( 1 )0 ) THEN
417 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
425 CALL PSMATGEN( ICTXT, 'no
', 'no
',
426 $ DESCW( M_ ), DESCW( N_ ),
427 $ DESCW( MB_ ), DESCW( NB_ ),
428 $ MEM( IPW ), DESCW( LLD_ ),
430 $ DESCW( CSRC_ ), IBSEED, 0,
431 $ MP, 0, NRHSQ, MYROW, MYCOL,
434 CALL PSMATGEN( ICTXT, 'no
', 'no
',
435 $ DESCW( M_ ), DESCW( N_ ),
436 $ DESCW( MB_ ), DESCW( NB_ ),
437 $ MEM( IPW ), DESCW( LLD_ ),
439 $ DESCW( CSRC_ ), IBSEED, 0,
440 $ NP, 0, NRHSQ, MYROW, MYCOL,
445 CALL PSFILLPAD( ICTXT, MNP, NRHSQ,
446 $ MEM( IPX-IPREPAD ),
447 $ DESCX( LLD_ ), IPREPAD,
450 CALL PSFILLPAD( ICTXT, MP, NRHSQ,
451 $ MEM( IPW-IPREPAD ),
452 $ DESCW( LLD_ ), IPREPAD,
455 CALL PSFILLPAD( ICTXT, NP, NRHSQ,
456 $ MEM( IPW-IPREPAD ),
457 $ DESCW( LLD_ ), IPREPAD,
463 CALL PSNRM2( NCOLS, BNORM, MEM( IPW ), 1,
466 $ CALL PSSCAL( NCOLS, ONE / BNORM,
467 $ MEM( IPW ), 1, JJ, DESCW,
471 CALL PSGEMM( TRANS, 'n
', NROWS, NRHS, NCOLS,
472 $ ONE, MEM( IPA ), 1, 1, DESCA,
473 $ MEM( IPW ), 1, 1, DESCW, ZERO,
474 $ MEM( IPX ), 1, 1, DESCX )
480 CALL PSCHEKPAD( ICTXT, 'generation
', MP,
481 $ NQ, MEM( IPA-IPREPAD ),
482 $ DESCA( LLD_ ), IPREPAD,
484 CALL PSCHEKPAD( ICTXT, 'generation
', MNP,
485 $ NRHSQ, MEM( IPX-IPREPAD ),
486 $ DESCX( LLD_ ), IPREPAD,
489 CALL PSCHEKPAD( ICTXT, 'generation
',
491 $ MEM( IPW-IPREPAD ),
492 $ DESCW( LLD_ ), IPREPAD,
495 CALL PSCHEKPAD( ICTXT, 'generation
',
497 $ MEM( IPW-IPREPAD ),
498 $ DESCW( LLD_ ), IPREPAD,
507 CALL DESCINIT( DESCB, N, NRHS, NB,
508 $ NBRHS, 0, 0, ICTXT,
509 $ MAX( 1, NP ) + IMIDPAD,
512 CALL DESCINIT( DESCB, M, NRHS, NB,
513 $ NBRHS, 0, 0, ICTXT,
514 $ MAX( 1, MP ) + IMIDPAD,
520 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
523.LT.
IF( IERR( 1 )0 ) THEN
525 $ WRITE( NOUT, FMT = 9997 )
531 IPW = IPB + DESCB( LLD_ )*NRHSQ +
539 LTAU = NUMROC( MIN(M,N), NB, MYCOL, 0,
541 LWF = NB * ( MP + NQ + NB )
542 LWS = MAX( ( NB*( NB - 1 ) ) / 2,
543 $ ( MP + NRHSQ ) * NB ) + NB*NB
545 LCM = ILCM( NPROW, NPCOL )
547 LTAU = NUMROC( MIN(M,N), NB, MYROW, 0,
549 LWF = NB * ( MP + NQ + NB )
550 LWS = MAX( ( NB*( NB - 1 ) ) / 2, ( NP +
551 $ MAX( NQ + NUMROC( NUMROC( N, NB, 0,
552 $ 0, NPROW ), NB, 0, 0, LCMP ),
553 $ NRHSQ ) ) * NB ) + NB*NB
556 LWORK = LTAU + MAX( LWF, LWS )
557 WORKSIZ = LWORK + IPOSTPAD
562.GT.
IF( IPW+WORKSIZMEMSIZ ) THEN
564 $ WRITE( NOUT, FMT = 9996 ) 'solve
',
565 $ ( IPW+WORKSIZ )*REALSZ
571 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
574.GT.
IF( IERR( 1 )0 ) THEN
576 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
585 CALL PSLACPY( 'all
', NROWS, NRHS,
586 $ MEM( IPX ), 1, 1, DESCX,
587 $ MEM( IPB ), 1, 1, DESCB )
590 CALL PSFILLPAD( ICTXT, NP, NRHSQ,
591 $ MEM( IPB-IPREPAD ),
592 $ DESCB( LLD_ ), IPREPAD,
595 CALL PSFILLPAD( ICTXT, MP, NRHSQ,
596 $ MEM( IPB-IPREPAD ),
597 $ DESCB( LLD_ ), IPREPAD,
600 CALL PSFILLPAD( ICTXT, LWORK, 1,
601 $ MEM( IPW-IPREPAD ),
607 CALL BLACS_BARRIER( ICTXT, 'all
' )
612 CALL PSGELS( TRANS, M, N, NRHS, MEM( IPA ),
613 $ 1, 1, DESCA, MEM( IPX ), 1, 1,
614 $ DESCX, MEM( IPW ), LWORK, INFO )
622 CALL PSCHEKPAD( ICTXT, 'psgels', MP,
623 $ NQ, MEM( IPA-IPREPAD ),
624 $ DESCA( LLD_ ), IPREPAD,
626 CALL PSCHEKPAD( ICTXT, 'psgels', MNP,
627 $ NRHSQ, MEM( IPX-IPREPAD ),
628 $ DESCX( LLD_ ), IPREPAD,
630 CALL PSCHEKPAD( ICTXT, 'psgels', LWORK,
631 $ 1, MEM( IPW-IPREPAD ),
639 CALL PSQRT13( ISCALE, M, N, MEM( IPA ), 1, 1,
640 $ DESCA, ANORM, IASEED,
649.GE..AND..NOT..OR.
IF( ( MN ( TPSD ) )
650.LT..AND.
$ ( MN TPSD ) ) THEN
658 WORKSIZ = NP*NRHSQ + NRHSP*MQ
661 $ MAX( NQ, MAX( MQ, NRHSQ ) ) +
664 WORKSIZ = MP*NRHSQ + NRHSP*NQ
675.GT.
IF( ( IPW+WORKSIZ )MEMSIZ ) THEN
677 $ WRITE( NOUT, FMT = 9996 )
678 $ 'memory
', ( IPW+WORKSIZ )*REALSZ
684 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
687.GT.
IF( IERR( 1 )0 ) THEN
689 $ WRITE( NOUT, FMT = 9997 )
695 CALL PSFILLPAD( ICTXT,
696 $ WORKSIZ-IPOSTPAD, 1,
697 $ MEM( IPW-IPREPAD ),
702 RESULT( 2 ) = PSQRT17( TRANS, 1, M, N,
714 CALL PSCHEKPAD( ICTXT, 'psqrt17',
716 $ MEM( IPA-IPREPAD ),
720 CALL PSCHEKPAD( ICTXT, 'psqrt17',
722 $ MEM( IPX-IPREPAD ),
723 $ DESCX( LLD_ ), IPREPAD,
726 CALL PSCHEKPAD( ICTXT, 'psqrt17',
728 $ MEM( IPB-IPREPAD ),
733 CALL PSCHEKPAD( ICTXT, 'psqrt17',
735 $ MEM( IPB-IPREPAD ),
740 CALL PSCHEKPAD( ICTXT, 'psqrt17',
741 $ WORKSIZ-IPOSTPAD, 1,
742 $ MEM( IPW-IPREPAD ),
751 WORKSIZ = MP + IPOSTPAD
753 WORKSIZ = NQ + IPOSTPAD
759.GT.
IF( ( IPW+WORKSIZ )MEMSIZ ) THEN
761 $ WRITE( NOUT, FMT = 9996 ) 'memory
',
762 $ ( IPW+WORKSIZ )*REALSZ
768 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
771.GT.
IF( IERR( 1 )0 ) THEN
773 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
778 CALL PSFILLPAD( ICTXT,
779 $ WORKSIZ-IPOSTPAD, 1,
780 $ MEM( IPW-IPREPAD ),
785 CALL PSQRT16( TRANS, M, N, NRHS,
786 $ MEM( IPA ), 1, 1, DESCA,
787 $ MEM( IPX ), 1, 1, DESCX,
788 $ MEM( IPB ), 1, 1, DESCB,
789 $ MEM( IPW ), RESULT( 1 ) )
791 CALL PSCHEKPAD( ICTXT, 'psqrt16',
793 $ mem( ipa-iprepad ),
800 $ descx( lld_ ), iprepad,
805 $ mem( ipb-iprepad ),
812 $ mem( ipb-iprepad ),
818 $ worksiz-ipostpad, 1,
819 $ mem( ipw-iprepad ),
826 IF( ( m.GE.n .AND. tpsd ) .OR.
827 $ ( m.LT.n .AND. ( .NOT.tpsd ) ) )
THEN
833 nnrhsq =
numroc( n+nrhs, nb, mycol,
837 lwf = nb * ( nb + mp + nnrhsq )
838 worksiz = mp * nnrhsq + ltau + lwf +
843 mnrhsp =
numroc( m+nrhs, nb, myrow,
847 lwf = nb * ( nb + mnrhsp + nq )
848 worksiz = mnrhsp * nq + ltau + lwf +
857 IF( ( ipw+worksiz ).GT.memsiz )
THEN
859 $
WRITE( nout, fmt = 9996 )
860 $
'MEMORY', ( ipw+worksiz )*realsz
866 CALL igsum2d( ictxt,
'All',
' ', 1, 1,
869 IF( ierr( 1 ).GT.0 )
THEN
871 $
WRITE( nout, fmt = 9997 )
878 $ worksiz-ipostpad, 1,
879 $ mem( ipw-iprepad ),
886 result( 2 ) =
psqrt14( trans, m, n,
897 $ mem( ipa-iprepad ),
903 $ mem( ipx-iprepad ),
904 $ descx( lld_ ), iprepad,
907 $ worksiz-ipostpad, 1,
908 $ mem( ipw-iprepad ),
919 IF( ( result( ii ).GE.thresh ) .AND.
920 $ ( result( ii )-result( ii ).EQ.0.0e+0
923 $
WRITE( nout, fmt = 9986 )trans,
924 $ m, n, nrhs, nb, itype, ii,
938 sresid = sresid - sresid
946 CALL slcombine( ictxt,
'All',
'>',
'W', 1, 1,
948 CALL slcombine( ictxt,
'All',
'>',
'C', 1, 1,
953 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
THEN
962 mults = n*( ( ( 23.d0 / 6.d0 )+m+n /
963 $ 2.d0 )+ n*( m-n / 3.d0 ) ) +
964 $ n*nrhs*( 2.d0*m+2.d0-n )
965 adds = n*( ( 5.d0 / 6.d0 )+n*
966 $ ( 1.d0 / 2.d0+( m-n / 3.d0 ) ) )
967 $ + n*nrhs*( 2.d0*m+1.d0-n )
974 mults = m*( ( ( 29.d0 / 6.d0 )+2.d0*n-m
975 $ / 2.d0 )+m*( n-m / 3.d0 ) )
976 $ + n*nrhs*( 2.d0*m+2.d0-n )
977 adds = m*( ( 5.d0 / 6.d0 )+m / 2.d0+m*
979 $ + n*nrhs*( 2.d0*m+1.d0-n )
981 nops = addfac*adds + mulfac*mults
988 IF( wtime( 1 ).GT.0.0d+0 )
THEN
989 tmflops = nops / ( wtime( 1 )*1.0d+6 )
994 IF( wtime( 1 ).GE.0.0d+0 )
995 $
WRITE( nout, fmt = 9993 )
996 $
'WALL', trans, m, n, nb, nrhs,
997 $ nbrhs, nprow, npcol, wtime( 1 ),
1002 IF( ctime( 1 ).GT.0.0d+0 )
THEN
1003 tmflops = nops / ( ctime( 1 )*1.0d+6
1008 IF( ctime( 1 ).GE.0.0d+0 )
1009 $
WRITE( nout, fmt = 9993 )
1010 $
'CPU ', trans, m, n, nb
1011 $ nbrhs, nprow, npcol, ctime( 1 ),
1026 ktests = kpass + kfail + kskip
1027 WRITE( nout, fmt = * )
1028 WRITE( nout, fmt = 9992 ) ktests
1030 WRITE( nout, fmt = 9991 ) kpass
1031 WRITE( nout, fmt = 9989 ) kfail
1033 WRITE( nout, fmt = 9990 ) kpass
1035 WRITE( nout, fmt = 9988 ) kskip
1036 WRITE( nout, fmt = * )
1037 WRITE( nout, fmt = * )
1038 WRITE( nout, fmt = 9987 )
1039 IF( nout.NE.6 .AND. nout.NE.0 )
1043 CALL blacs_exit( 0 )
1045 9999
FORMAT(
'ILLEGAL ', a6,
': ', a5,
' = ', i3,
1046 $
'; It should be at least 1' )
1047 9998
FORMAT(
'ILLEGAL GRID: nprow*npcol = ', i4,
'. It can be at most',
1049 9997
FORMAT(
'Bad ', a6,
' parameters: going on to next test case.' )
1050 9996
FORMAT(
'Unable to perform ', a,
': need TOTMEM of at least',
1052 9995
FORMAT(
'Time TRANS M N NB NRHS NBRHS P Q ',
1053 $
'LS Time MFLOPS CHECK' )
1054 9994
FORMAT(
'---- ----- ------ ------ --- ----- ----- ----- ----- ',
1055 $
'--------- -------- ------' )
1056 9993
FORMAT( a4, 3x, a1, 3x, i6, 1x, i6, 1x, i3, 1x, i5, 1x, i5, 1x,
1057 $ i5, 1x, i5, 1x, f9.2, 1x, f8.2, 1x, a6 )
1058 9992
FORMAT(
'Finished', i6,
' tests, with the following results:' )
1059 9991
FORMAT( i5,
' tests completed and passed residual checks.' )
1060 9990
FORMAT( i5,
' tests completed without checking.' )
1061 9989
FORMAT( i5,
' tests completed and failed residual checks.' )
1062 9988
FORMAT( i5,
' tests skipped because of illegal input values.' )
1063 9987
FORMAT(
'END OF TESTS.' )
1064 9986
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
1065 $
', NB=', i4,
', type', i2, ', test(
', I2, ')=
', G12.5 )
subroutine psmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
logical function lsame(ca, cb)
LSAME
integer function iceil(inum, idenom)
integer function ilcm(m, n)
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
subroutine psnrm2(n, norm2, x, ix, jx, descx, incx)
real function pslange(norm, m, n, a, ia, ja, desca, work)
subroutine psscal(n, alpha, x, ix, jx, descx, incx)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine blacs_gridexit(cntxt)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine psgels(trans, m, n, nrhs, a, ia, ja, desca, b, ib, jb, descb, work, lwork, info)
subroutine pslacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)
subroutine pslsinfo(summry, nout, nmat, mval, ldmval, nval, ldnval, nnb, nbval, ldnbval, nnr, nrval, ldnrval, nnbr, nbrval, ldnbrval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
subroutine psqrt13(scale, m, n, a, ia, ja, desca, norma, iseed, work)
real function psqrt14(trans, m, n, nrhs, a, ia, ja, desca, x, ix, jx, descx, work)
subroutine psqrt16(trans, m, n, nrhs, a, ia, ja, desca, x, ix, jx, descx, b, ib, jb, descb, rwork, resid)
real function psqrt17(trans, iresid, m, n, nrhs, a, ia, ja, desca, x, ix, jx, descx, b, ib, jb, descb, work, rwork)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)