6
7
8
9
10
11
12
13 INTEGER IA, IB, IBTYPE, IC, IQ, JA, JB, JC, JQ, LWORK,
14 $ MS, NV, RESULT
15 REAL THRESH, TSTNRM
16
17
18
19 INTEGER DESCA( * ), DESCB( * ), DESCC( * ), DESCQ( * )
20 REAL W( * ), WORK( * )
21 COMPLEX A( * ), B( * ), C( * ), Q( * )
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217 INTEGER I, INFO, MYCOL, MYROW, NPCOL, NPROW, NQ
218 REAL ANORM, ULP
219
220
221 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
222 $ MB_, NB_, RSRC_, CSRC_, LLD_
223 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
224 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
225 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
226 REAL ONE, ZERO
227 parameter( one = 1.0e+0, zero = 0.0e+0 )
228 COMPLEX CONE, CNEGONE, CZERO
229 parameter( cone = 1.0e+0, cnegone = -1.0e+0,
230 $ czero = 0.0e+0 )
231
232
233 INTEGER NUMROC
234 REAL PCLANGE, SLAMCH
236
237
238 EXTERNAL blacs_gridinfo,
chk1mat, pcgemm, pcsscal,
240
241
243
244
245
246 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
247 $ rsrc_.LT.0 )RETURN
248
249 result = 0
250
251 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
252
253 info = 0
254 CALL chk1mat( ms, 1, ms, 2, ia, ja, desca, 7, info )
255 CALL chk1mat( ms, 1, ms, 2, ib, jb, descb, 11, info )
256 CALL chk1mat( ms, 1, nv, 2, iq, jq, descq, 16, info )
257 CALL chk1mat( ms, 1, nv, 2, ib, jb, descb, 20, info )
258
259 IF( info.EQ.0 ) THEN
260
261 nq =
numroc( nv, desca( nb_ ), mycol, 0, npcol )
262
263 IF( iq.NE.1 ) THEN
264 info = -14
265 ELSE IF( jq.NE.1 ) THEN
266 info = -15
267 ELSE IF( ia.NE.1 ) THEN
268 info = -5
269 ELSE IF( ja.NE.1 ) THEN
270 info = -6
271 ELSE IF( ib.NE.1 ) THEN
272 info = -9
273 ELSE IF( jb.NE.1 ) THEN
274 info = -10
275 ELSE IF( lwork.LT.nq ) THEN
276 info = -23
277 END IF
278 END IF
279
280 IF( info.NE.0 ) THEN
281 CALL pxerbla( desca( ctxt_ ),
'PCGSEPCHK', -info )
282 RETURN
283 END IF
284
285 result = 0
287
288
289
290 anorm =
pclange(
'M', ms, ms, a, ia, ja, desca, work )*
291 $
pclange(
'M', ms, nv, q, iq, jq, descq, work )
292 IF( anorm.EQ.zero )
293 $ anorm = one
294
295 IF( ibtype.EQ.1 ) THEN
296
297
298
299
300
301 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, a, ia, ja, desca, q,
302 $ iq, jq, descq, czero, c, ic, jc, descc )
303
304
305
306 DO 10 i = 1, nv
307 CALL pcsscal( ms, w( i ), q, iq, jq+i-1, descq, 1 )
308 10 CONTINUE
309
310
311
312 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, b, ib, jb, descb, q,
313 $ iq, jq, descq, cnegone, c, ic, jc, descc )
314
315 tstnrm = (
pclange(
'M', ms, nv, c, ic, jc, descc, work ) /
316 $ anorm ) / (
max( ms, 1 )*ulp )
317
318
319 ELSE IF( ibtype.EQ.2 ) THEN
320
321
322
323
324
325
326 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, b, ib, jb, descb, q,
327 $ iq, jq, descq, czero, c, ic, jc, descc )
328
329
330
331 DO 20 i = 1, nv
332 CALL pcsscal( ms, w( i ), q, iq, jq+i-1, descq, 1 )
333 20 CONTINUE
334
335
336
337 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, a, ia, ja, desca, c,
338 $ ic, jc, descc, cnegone, q, iq, jq, descq )
339
340 tstnrm = (
pclange(
'M', ms, nv, q, iq, jq, descq, work ) /
341 $ anorm ) / (
max( ms, 1 )*ulp )
342
343 ELSE IF( ibtype.EQ.3 ) THEN
344
345
346
347
348
349
350 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, a, ia, ja, desca, q,
351 $ iq, jq, descq, czero, c, ic, jc, descc )
352
353
354
355 DO 30 i = 1, nv
356 CALL pcsscal( ms, w( i ), q, iq, jq+i-1, descq, 1 )
357 30 CONTINUE
358
359
360
361 CALL pcgemm( 'N', 'N', ms, nv, ms, cone, b, ib, jb, descb, c,
362 $ ic, jc, descc, cnegone, q, iq, jq, descq )
363
364 tstnrm = (
pclange(
'M', ms, nv, q, iq, jq, descq, work ) /
365 $ anorm ) / (
max( ms, 1 )*ulp )
366
367 END IF
368
369 IF( tstnrm.GT.thresh .OR. ( tstnrm-tstnrm.NE.0.0e0 ) ) THEN
370 result = 1
371 END IF
372 RETURN
373
374
375
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pclange(norm, m, n, a, ia, ja, desca, work)
subroutine pxerbla(ictxt, srname, info)