14 INTEGER cplxsz, intgsz, memsiz, totmem
15 parameter( cplxsz = 8, intgsz = 4, totmem = 2000000,
16 $ memsiz = totmem / cplxsz )
17 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, ,
18 $ lld_, mb_, m_, nb_, n_, rsrc_
19 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
20 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
21 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
23 parameter( one = (1.0d+0,0.0d+0) )
27 INTEGER iam, ictxt, info, ipa, ipacpy, ipb, ippiv, ipx,
28 $ ipw, lipiv, mycol, myrow, n, nb, nout, npcol,
29 $ nprocs, nprow, np, nq, nqrhs, nrhs, worksiz
30 REAL anorm, bnorm, eps, xnorm, resid
33 INTEGER desca( dlen_ ), descb( dlen_ ), descx( dlen_ )
54 CALL blacs_pinfo( iam, nprocs )
55 CALL pdscaexinfo( outfile, nout, n, nrhs, nb, nprow, npcol, mem,
60 CALL blacs_get( -1, 0, ictxt )
67 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
70 np =
numroc( n, nb, myrow, 0, nprow )
71 nq =
numroc( n, nb, mycol, 0, npcol )
72 nqrhs =
numroc( nrhs, nb, mycol, 0, npcol )
76 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
max( 1, np ),
78 CALL descinit( descb, n, nrhs, nb, nb, 0, 0, ictxt,
max( 1, np ),
80 CALL descinit( descx, n, nrhs, nb, nb, 0, 0, ictxt,
max( 1, np ),
87 ipacpy = ipa + desca( lld_ )*nq
88 ipb = ipacpy + desca( lld_ )*nq
89 ipx = ipb + descb( lld_ )*nqrhs
90 ippiv = ipx + descb( lld_ )*nqrhs
91 lipiv =
iceil( intgsz*( np+nb ), cplxsz )
92 ipw = ippiv +
max( np, lipiv )
99 IF( ipw+worksiz.GT.memsiz )
THEN
101 $
WRITE( nout, fmt = 9998 )
'test', ( ipw+worksiz )*cplxsz
107 CALL igsum2d( ictxt,
'All',
' ', 1, 1, info, 1, -1, 0 )
110 $
WRITE( nout, fmt = 9999 )
'MEMORY'
116 CALL pclaread(
'CSCAEXMAT.dat', mem( ipa ), desca, 0, 0,
123 CALL pclacpy(
'All', n, n, mem( ipa ), 1, 1, desca,
124 $ mem( ipacpy ), 1, 1, desca )
125 CALL pclacpy(
'All', n, nrhs, mem( ipb ), 1, 1, descb,
126 $ mem( ipx ), 1, 1, descx )
133 WRITE( nout, fmt = * )
134 WRITE( nout, fmt = * )
135 $
'***********************************************'
136 WRITE( nout, fmt = * )
137 $ 'example of scalapack routine call: (
pcgesv)
'
138 WRITE( NOUT, FMT = * )
140 WRITE( NOUT, FMT = * )
141 WRITE( NOUT, FMT = * ) 'a * x = b
'
142 WRITE( NOUT, FMT = * )
144 CALL PCLAPRNT( N, N, MEM( IPA ), 1, 1, DESCA, 0, 0,
145 $ 'a
', NOUT, MEM( IPW ) )
147 WRITE( NOUT, FMT = * )
148 WRITE( NOUT, FMT = * ) 'matrix b:
'
149 WRITE( NOUT, FMT = * )
151 CALL PCLAPRNT( N, NRHS, MEM( IPB ), 1, 1, DESCB, 0, 0,
152 $ 'b
', NOUT, MEM( IPW ) )
154 CALL PCGESV( N, NRHS, MEM( IPA ), 1, 1, DESCA, MEM( IPPIV ),
155 $ MEM( IPB ), 1, 1, DESCB, INFO )
157.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
158 WRITE( NOUT, FMT = * )
159 WRITE( NOUT, FMT = * ) 'info code returned
', INFO
160 WRITE( NOUT, FMT = * )
161 WRITE( NOUT, FMT = * ) 'matrix x = a^{-1} * b
'
162 WRITE( NOUT, FMT = * )
164 CALL PCLAPRNT( N, NRHS, MEM( IPB ), 1, 1, DESCB, 0, 0, 'x
', NOUT,
166 CALL PCLAWRITE( 'cscaexsol.dat
', N, NRHS, MEM( IPB ), 1, 1, DESCB,
171 EPS = PSLAMCH( ICTXT, 'epsilon
' )
172 ANORM = PCLANGE( 'i
', N, N, MEM( IPA ), 1, 1, DESCA, MEM( IPW ) )
173 BNORM = PCLANGE( 'i
', N, NRHS, MEM( IPB ), 1, 1, DESCB,
175 CALL PCGEMM( 'no transpose
', 'no transpose
', N, NRHS, N, ONE,
176 $ MEM( IPACPY ), 1, 1, DESCA, MEM( IPB ), 1, 1, DESCB,
177 $ -ONE, MEM( IPX ), 1, 1, DESCX )
178 XNORM = PCLANGE( 'i
', N, NRHS, MEM( IPX ), 1, 1, DESCX,
180 RESID = XNORM / ( ANORM * BNORM * EPS * DBLE( N ) )
182.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
183 WRITE( NOUT, FMT = * )
184 WRITE( NOUT, FMT = * )
185 $ '||a * x - b|| / ( ||x|| * ||a|| * eps * n ) =
', RESID
186 WRITE( NOUT, FMT = * )
187.LT.
IF( RESID10.0D+0 ) THEN
188 WRITE( NOUT, FMT = * ) 'the answer is correct.
'
190 WRITE( NOUT, FMT = * ) 'the answer is suspicious.
'
196 CALL BLACS_GRIDEXIT( ICTXT )
203 WRITE( NOUT, FMT = * )
204 WRITE( NOUT, FMT = * )
205 WRITE( NOUT, FMT = 9997 )
206 WRITE( NOUT, FMT = * )
207.NE..AND..NE.
IF( NOUT6 NOUT0 )
213 9999 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
214 9998 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
216 9997 FORMAT( 'END OF TESTS.
' )
end diagonal values have been computed in the(sparse) matrix id.SOL
integer function iceil(inum, idenom)
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
real function pclange(norm, m, n, a, ia, ja, desca, work)
subroutine blacs_gridexit(cntxt)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)
subroutine pcgesv(n, nrhs, a, ia, ja, desca, ipiv, b, ib, jb, descb, info)
subroutine pclacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)
subroutine pclaprnt(m, n, a, ia, ja, desca, irprnt, icprnt, cmatnm, nout, work)
subroutine pclaread(filnam, a, desca, irread, icread, work)
subroutine pclawrite(filnam, m, n, a, ia, ja, desca, irwrit, icwrit, work)
subroutine pdscaexinfo(summry, nout, n, nrhs, nb, nprow, npcol, work, iam, nprocs)