5
6
7
8
9
10
11
12 INTEGER IAM, LDNBVAL, LDNVAL, LDPVAL, LDQVAL,
13 $ NGRIDS, NMAT, NNB, NOUT, NPROCS
14 REAL THRESH
15
16
17 CHARACTER*( * ) SUMMRY
18 INTEGER NBVAL( LDNBVAL ), NVAL( LDNVAL ),
19 $ NVHI( LDNVAL ), NVLO( LDNVAL ),
20 $ PVAL( LDPVAL ), QVAL( LDQVAL ), WORK( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
111 $ LLD_, MB_, M_, NB_, N_, RSRC_
112 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
113 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
114 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
115 INTEGER NIN
116 parameter( nin = 11 )
117
118
119 CHARACTER*79 USRINFO
120 INTEGER I, ICTXT
121 DOUBLE PRECISION EPS
122
123
127
128
129 DOUBLE PRECISION PDLAMCH
131
132
134
135
136
137
138
139
140 IF( iam.EQ.0 ) THEN
141
142
143
144 OPEN( unit = nin, file = 'HRD.dat', status = 'OLD' )
145 READ( nin, fmt = * )summry
146 summry = ' '
147
148
149
150 READ( nin, fmt = * ) usrinfo
151
152
153
154 READ( nin, fmt = * ) summry
155 READ( nin, fmt = * ) nout
156 IF( nout.NE.0 .AND. nout.NE.6 )
157 $ OPEN( unit = nout, file = summry, status = 'UNKNOWN' )
158
159
160
161
162
163 READ( nin, fmt = * ) nmat
164 IF( nmat.LT.1. .OR. nmat.GT.ldnval ) THEN
165 WRITE( nout, fmt = 9997 ) 'N', ldnval
166 GO TO 20
167 END IF
168
169
170
171 READ( nin, fmt = * ) ( nval( i ), i = 1, nmat )
172 READ( nin, fmt = * ) ( nvlo( i ), i = 1, nmat )
173 READ( nin, fmt = * ) ( nvhi( i ), i = 1, nmat )
174
175
176
177 READ( nin, fmt = * ) nnb
178 IF( nnb.LT.1 .OR. nnb.GT.ldnbval ) THEN
179 WRITE( nout, fmt = 9997 ) 'NB', ldnbval
180 GO TO 20
181 END IF
182 READ( nin, fmt = * ) ( nbval( i ), i = 1, nnb )
183
184
185
186 READ( nin, fmt = * ) ngrids
187 IF( ngrids.LT.1 .OR. ngrids.GT.ldpval ) THEN
188 WRITE( nout, fmt = 9997 ) 'Grids', ldpval
189 GO TO 20
190 ELSE IF( ngrids.GT.ldqval ) THEN
191 WRITE( nout, fmt = 9997 ) 'Grids', ldqval
192 GO TO 20
193 END IF
194
195
196
197 READ( nin, fmt = * ) ( pval( i ), i = 1, ngrids )
198 READ( nin, fmt = * ) ( qval( i ), i = 1, ngrids )
199
200
201
202 READ( nin, fmt = * ) thresh
203
204
205
206 CLOSE( nin )
207
208
209
210
211 IF( nprocs.LT.1 ) THEN
212 nprocs = 0
213 DO 10 i = 1, ngrids
214 nprocs =
max( nprocs, pval( i )*qval( i ) )
215 10 CONTINUE
216 CALL blacs_setup( iam, nprocs )
217 END IF
218
219
220
221
222 CALL blacs_get( -1, 0, ictxt )
224
225
226
228
229
230
231 CALL sgebs2d( ictxt,
'All',
' ', 1, 1, thresh, 1 )
232
233 work( 1 ) = nmat
234 work( 2 ) = nnb
235 work( 3 ) = ngrids
236 CALL igebs2d( ictxt, 'All', ' ', 1, 3, work, 1 )
237
238 i = 1
239 CALL icopy( nmat, nval, 1, work( i ), 1 )
240 i = i + nmat
241 CALL icopy( nmat, nvlo, 1, work( i ), 1 )
242 i = i + nmat
243 CALL icopy( nmat, nvhi, 1, work( i ), 1 )
244 i = i + nmat
245 CALL icopy( nnb, nbval, 1, work( i ), 1 )
246 i = i + nnb
247 CALL icopy( ngrids, pval, 1, work( i ), 1 )
248 i = i + ngrids
249 CALL icopy( ngrids, qval, 1, work( i ), 1 )
250 i = i + ngrids -1
251 CALL igebs2d( ictxt, 'All', ' ', 1, i, work, 1 )
252
253
254
255 WRITE( nout, fmt = 9999 )
256 $ 'ScaLAPACK Reduction routine to Hessenberg form.'
257 WRITE( nout, fmt = 9999 ) usrinfo
258 WRITE( nout, fmt = * )
259 WRITE( nout, fmt = 9999 )
260 $ 'Tests of the parallel '//
261 $ 'real double precision Hessenberg '
262 WRITE( nout, fmt = 9999 ) 'reduction routines.'
263 WRITE( nout, fmt = 9999 )
264 $ 'The following scaled residual '//
265 $ 'checks will be computed:'
266 WRITE( nout, fmt = 9999 )
267 $ ' ||A - Q H Q''|| / (||A|| * eps * N)'
268 WRITE( nout, fmt = 9999 )
269 $ '
the matrix a is randomly
'//
270 $ 'generated
for each test.
'
271 WRITE( NOUT, FMT = * )
272 WRITE( NOUT, FMT = 9999 )
273 $ 'an explanation of
the input/output
'//
274 $ 'parameters follows:'
275 WRITE( NOUT, FMT = 9999 )
276 $ 'time : indicates whether wall or '//
277 $ 'cpu time was used.'
278 WRITE( NOUT, FMT = 9999 )
279 $ 'n :
the number of rows and columns
'//
281 WRITE( NOUT, FMT = 9999 )
282 $ 'nb :
the size of
the square blocks
'//
284 WRITE( NOUT, FMT = 9999 )
285 $ ' on to
the next column of processes.
'
286 WRITE( NOUT, FMT = 9999 )
287 $ 'p :
the number of process rows.
'
288 WRITE( NOUT, FMT = 9999 )
289 $ 'q :
the number of process columns.
'
290 WRITE( NOUT, FMT = 9999 )
291 $ 'hrd time : time in seconds to compute hrd '
292 WRITE( NOUT, FMT = 9999 )
293 $ 'mflops : rate of execution
for hrd
' //
294 $ 'reduction.'
295 WRITE( NOUT, FMT = * )
296 WRITE( NOUT, FMT = 9999 )
297 $ 'the following
parameter values will be used:
'
298 WRITE( NOUT, FMT = 9995 )
299 $ 'n ', ( NVAL( I ), I = 1, MIN( NMAT, 10 ) )
300.GT. IF( NMAT10 )
301 $ WRITE( NOUT, FMT = 9994 ) ( NVAL( I ), I = 11, NMAT )
302 WRITE( NOUT, FMT = 9995 )
303 $ 'ilo ', ( NVLO( I ), I = 1, MIN( NMAT, 10 ) )
304.GT. IF( NMAT10 )
305 $ WRITE( NOUT, FMT = 9994 ) ( NVLO( I ), I = 11, NMAT )
306 WRITE( NOUT, FMT = 9995 )
307 $ 'ihi ', ( NVHI( I ), I = 1, MIN( NMAT, 10 ) )
308.GT. IF( NMAT10 )
309 $ WRITE( NOUT, FMT = 9994 ) ( NVHI( I ), I = 11, NMAT )
310 WRITE( NOUT, FMT = 9995 )
311 $ 'nb ', ( NBVAL( I ), I = 1, MIN( NNB, 10 ) )
312.GT. IF( NNB10 )
313 $ WRITE( NOUT, FMT = 9994 ) ( NBVAL( I ), I = 11, NNB )
314 WRITE( NOUT, FMT = 9995 )
315 $ 'p ', ( PVAL( I ), I = 1, MIN( NGRIDS, 10 ) )
316.GT. IF( NGRIDS10 )
317 $ WRITE( NOUT, FMT = 9994 ) ( PVAL( I ), I = 11, NGRIDS )
318 WRITE( NOUT, FMT = 9995 )
319 $ 'q ', ( QVAL( I ), I = 1, MIN( NGRIDS, 10 ) )
320.GT. IF( NGRIDS10 )
321 $ WRITE( NOUT, FMT = 9994 ) ( QVAL( I ), I = 11, NGRIDS )
322 WRITE( NOUT, FMT = * )
323 WRITE( NOUT, FMT = 9996 ) EPS
324 WRITE( NOUT, FMT = 9993 ) THRESH
325
326 ELSE
327
328
329
330.LT. IF( NPROCS1 )
331 $ CALL BLACS_SETUP( IAM, NPROCS )
332
333
334
335
336 CALL BLACS_GET( -1, 0, ICTXT )
337 CALL BLACS_GRIDINIT( ICTXT, 'row-major', 1, NPROCS )
338
339
340
341 EPS = PDLAMCH( ICTXT, 'eps' )
342
343 CALL SGEBR2D( ICTXT, 'all', ' ', 1, 1, THRESH, 1, 0, 0 )
344 CALL IGEBR2D( ICTXT, 'all', ' ', 1, 3, WORK, 1, 0, 0 )
345 NMAT = WORK( 1 )
346 NNB = WORK( 2 )
347 NGRIDS = WORK( 3 )
348
349 I = 3*NMAT + NNB + 2*NGRIDS
350 CALL IGEBR2D( ICTXT, 'all', ' ', 1, I, WORK, 1, 0, 0 )
351
352 I = 1
353 CALL ICOPY( NMAT, WORK( I ), 1, NVAL, 1 )
354 I = I + NMAT
355 CALL ICOPY( NMAT, WORK( I ), 1, NVLO, 1 )
356 I = I + NMAT
357 CALL ICOPY( NMAT, WORK( I ), 1, NVHI, 1 )
358 I = I + NMAT
359 CALL ICOPY( NNB, WORK( I ), 1, NBVAL, 1 )
360 I = I + NNB
361 CALL ICOPY( NGRIDS, WORK( I ), 1, PVAL, 1 )
362 I = I + NGRIDS
363 CALL ICOPY( NGRIDS, WORK( I ), 1, QVAL, 1 )
364
365 END IF
366
367 CALL BLACS_GRIDEXIT( ICTXT )
368
369 RETURN
370
371 20 CONTINUE
372 WRITE( NOUT, FMT = 9998 )
373 CLOSE( NIN )
374.NE..AND..NE. IF( NOUT6 NOUT0 )
375 $ CLOSE( NOUT )
376 CALL BLACS_ABORT( ICTXT, 1 )
377
378 STOP
379
380 9999 FORMAT( A )
381 9998 FORMAT( ' illegal input in file ', 40A, '. aborting run.' )
382 9997 FORMAT( ' number of values of ', 5A,
383 $ ' is less than 1 or greater ', 'than ', I2 )
384 9996 FORMAT( 'relative machine precision(eps) is taken to be ',
385 $ E18.6 )
386 9995 FORMAT( 2X, A5, ': ', 10I6 )
387 9994 FORMAT( ' ', 10I6 )
388 9993 FORMAT( 'routines pass computational tests if scaled residual is',
389 $ ' less than ', G14.7 )
390
391
392
end diagonal values have been computed in the(sparse) matrix id.SOL
subroutine icopy(n, sx, incx, sy, incy)
ICOPY
subroutine sgebs2d(contxt, scope, top, m, n, a, lda)
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
subroutine sgebr2d(contxt, scope, top, m, n, a, lda)
subroutine blacs_gridexit(cntxt)
for(i8=*sizetab-1;i8 >=0;i8--)
double precision function pdlamch(ictxt, cmach)
void split(mapping_t *, PORD_INT, PORD_INT, PORD_INT, PORD_INT *, PORD_INT *, FLOAT *, PORD_INT)