5
6
7
8
9
10
11
12 CHARACTER UPLO
13 INTEGER IA, IB, IBTYPE, INFO, JA, JB, N
14 REAL SCALE
15
16
17 INTEGER DESCA( * ), DESCB( * )
18 COMPLEX A( * ), B( * )
19
20
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
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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
171 $ MB_, NB_, RSRC_, CSRC_, LLD_
172 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
173 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
174 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
175 REAL ONE
176 parameter( one = 1.0e+0 )
177 COMPLEX CONE, HALF
178 parameter( cone = ( 1.0e+0, 0.0e+0 ),
179 $ half = ( 0.5e+0, 0.0e+0 ) )
180
181
182 LOGICAL UPPER
183 INTEGER IACOL, IAROW, IBCOL, IBROW, ICOFFA, ICOFFB,
184 $ ICTXT, IROFFA, IROFFB, K, KB, MYCOL, MYROW, NB,
185 $ NPCOL, NPROW
186
187
188 INTEGER IDUM1( 2 ), IDUM2( 2 )
189
190
193
194
195 INTRINSIC ichar,
min, mod
196
197
198 LOGICAL LSAME
199 INTEGER ICEIL, INDXG2P
201
202
203
204 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
205 $ rsrc_.LT.0 )RETURN
206
207
208
209 scale = one
210
211 ictxt = desca( ctxt_ )
212 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
213
214
215
216 info = 0
217 IF( nprow.EQ.-1 ) THEN
218 info = -( 700+ctxt_ )
219 ELSE
220 upper =
lsame( uplo,
'U' )
221 CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
222 CALL chk1mat( n, 3, n, 3, ib, jb, descb, 11, info )
223 IF( info.EQ.0 ) THEN
224 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
225 $ nprow )
226 ibrow =
indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
227 $ nprow )
228 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
229 $ npcol )
230 ibcol =
indxg2p( jb, descb( nb_ ), mycol, descb( csrc_ ),
231 $ npcol )
232 iroffa = mod( ia-1, desca( mb_ ) )
233 icoffa = mod( ja-1, desca( nb_ ) )
234 iroffb = mod( ib-1, descb( mb_ ) )
235 icoffb = mod( jb-1, descb( nb_ ) )
236 IF( ibtype.LT.1 .OR. ibtype.GT.3 ) THEN
237 info = -1
238 ELSE IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
239 info = -2
240 ELSE IF( n.LT.0 ) THEN
241 info = -3
242 ELSE IF( iroffa.NE.0 ) THEN
243 info = -5
244 ELSE IF( icoffa.NE.0 ) THEN
245 info = -6
246 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
247 info = -( 700+nb_ )
248 ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow ) THEN
249 info = -9
250 ELSE IF( icoffb.NE.0 .OR. ibcol.NE.iacol ) THEN
251 info = -10
252 ELSE IF( descb( mb_ ).NE.desca( mb_ ) ) THEN
253 info = -( 1100+mb_ )
254 ELSE IF( descb( nb_ ).NE.desca( nb_ ) ) THEN
255 info = -( 1100+nb_ )
256 ELSE IF( ictxt.NE.descb( ctxt_ ) ) THEN
257 info = -( 1100+ctxt_ )
258 END IF
259 END IF
260 idum1( 1 ) = ibtype
261 idum2( 1 ) = 1
262 IF( upper ) THEN
263 idum1( 2 ) = ichar( 'U' )
264 ELSE
265 idum1( 2 ) = ichar( 'L' )
266 END IF
267 idum2( 2 ) = 2
268 CALL pchk2mat( n, 3, n, 3, ia, ja, desca, 7, n, 3, n, 3, ib,
269 $ jb, descb, 11, 2, idum1, idum2, info )
270 END IF
271
272 IF( info.NE.0 ) THEN
273 CALL pxerbla( ictxt,
'PCHEGST', -info )
274 RETURN
275 END IF
276
277
278
279 IF( n.EQ.0 )
280 $ RETURN
281
282 IF( ibtype.EQ.1 ) THEN
283 IF( upper ) THEN
284
285
286
287 k = 1
288 nb = desca( nb_ )
289 kb =
min(
iceil( ja, nb )*nb, ja+n-1 ) - ja + 1
290
291 10 CONTINUE
292
293
294
295 CALL pchegs2( ibtype, uplo, kb, a, ia+k-1, ja+k-1, desca, b,
296 $ ib+k-1, ib+k-1, descb, info )
297 IF( k+kb.LE.n ) THEN
298 CALL pctrsm( 'Left', uplo, 'Conjugate Transpose',
299 $ 'Non-unit', kb, n-k-kb+1, cone, b, ib+k-1,
300 $ jb+k-1, descb, a, ia+k-1, ja+k+kb-1, desca )
301 CALL pchemm( 'Left', uplo, kb, n-k-kb+1, -half, a,
302 $ ia+k-1, ja+k-1, desca, b, ib+k-1, jb+k+kb-1,
303 $ descb, cone, a, ia+k-1, ja+k+kb-1, desca )
304 CALL pcher2k( uplo, 'Conjugate Transpose', n-k-kb+1, kb,
305 $ -cone, a, ia+k-1, ja+k+kb-1, desca, b,
306 $ ib+k-1, jb+k+kb-1, descb, one, a,
307 $ ia+k+kb-1, ja+k+kb-1, desca )
308 CALL pchemm( 'Left', uplo, kb, n-k-kb+1, -half, a,
309 $ ia+k-1, ja+k-1, desca, b, ib+k-1, jb+k+kb-1,
310 $ descb, cone, a, ia+k-1, ja+k+kb-1, desca )
311 CALL pctrsm( 'Right', uplo, 'No transpose', 'Non-unit',
312 $ kb, n-k-kb+1, cone, b, ib+k+kb-1, jb+k+kb-1,
313 $ descb, a, ia+k-1, ja+k+kb-1, desca )
314 END IF
315 k = k + kb
316 kb =
min( n-k+1, nb )
317
318 IF( k.LE.n )
319 $ GO TO 10
320
321 ELSE
322
323
324
325 k = 1
326 nb = desca( mb_ )
327 kb =
min(
iceil( ia, nb )*nb, ia+n-1 ) - ia + 1
328
329 20 CONTINUE
330
331
332
333 CALL pchegs2( ibtype, uplo, kb, a, ia+k-1, ja+k-1, desca, b,
334 $ ib+k-1, jb+k-1, descb, info )
335 IF( k+kb.LE.n ) THEN
336 CALL pctrsm( 'Right', uplo, 'Conjugate transpose',
337 $ 'Non-unit', n-k-kb+1, kb, cone, b, ib+k-1,
338 $ jb+k-1, descb, a, ia+k+kb-1, ja+k-1, desca )
339 CALL pchemm( 'Right', uplo, n-k-kb+1, kb, -half, a,
340 $ ia+k-1, ja+k-1, desca, b, ib+k+kb-1, jb+k-1,
341 $ descb, cone, a, ia+k+kb-1, ja+k-1, desca )
342 CALL pcher2k( uplo, 'No transpose', n-k-kb+1, kb, -cone,
343 $ a, ia+k+kb-1, ja+k-1, desca, b, ib+k+kb-1,
344 $ jb+k-1, descb, one, a, ia+k+kb-1,
345 $ ja+k+kb-1, desca )
346 CALL pchemm( 'Right', uplo, n-k-kb+1, kb, -half, a,
347 $ ia+k-1, ja+k-1, desca, b, ib+k+kb-1, jb+k-1,
348 $ descb, cone, a, ia+k+kb-1, ja+k-1, desca )
349 CALL pctrsm( 'Left', uplo, 'No transpose', 'Non-unit',
350 $ n-k-kb+1, kb, cone, b, ib+k+kb-1, jb+k+kb-1,
351 $ descb, a, ia+k+kb-1, ja+k-1, desca )
352 END IF
353 k = k + kb
354 kb =
min( n-k+1, nb )
355
356 IF( k.LE.n )
357 $ GO TO 20
358
359 END IF
360
361 ELSE
362
363 IF( upper ) THEN
364
365
366
367 k = 1
368 nb = desca( nb_ )
369 kb =
min(
iceil( ja, nb )*nb, ja+n-1 ) - ja + 1
370
371 30 CONTINUE
372
373
374
375 CALL pctrmm( 'Left', uplo, 'No transpose', 'Non-unit', k-1,
376 $ kb, cone, b, ib, jb, descb, a, ia, ja+k-1,
377 $ desca )
378 CALL pchemm( 'Right', uplo, k-1, kb, half, a, ia+k-1,
379 $ ja+k-1, desca, b, ib, jb+k-1, descb, cone, a,
380 $ ia, ja+k-1, desca )
381 CALL pcher2k( uplo, 'No transpose', k-1, kb, cone, a, ia,
382 $ ja+k-1, desca, b, ib, jb+k-1, descb, one, a,
383 $ ia, ja, desca )
384 CALL pchemm( 'Right', uplo, k-1, kb, half, a, ia+k-1,
385 $ ja+k-1, desca, b, ib, jb+k-1, descb, cone, a,
386 $ ia, ja+k-1, desca )
387 CALL pctrmm( 'Right', uplo, 'Conjugate transpose',
388 $ 'Non-unit', k-1, kb, cone, b, ib+k-1, jb+k-1,
389 $ descb, a, ia, ja+k-1, desca )
390 CALL pchegs2( ibtype, uplo, kb, a, ia+k-1, ja+k-1, desca, b,
391 $ ib+k-1, jb+k-1, descb, info )
392
393 k = k + kb
394 kb =
min( n-k+1, nb )
395
396 IF( k.LE.n )
397 $ GO TO 30
398
399 ELSE
400
401
402
403 k = 1
404 nb = desca( mb_ )
405 kb =
min(
iceil( ia, nb )*nb, ia+n-1 ) - ia + 1
406
407 40 CONTINUE
408
409
410
411 CALL pctrmm( 'Right', uplo, 'No transpose', 'Non-unit', kb,
412 $ k-1, cone, b, ib, jb, descb, a, ia+k-1, ja,
413 $ desca )
414 CALL pchemm( 'Left', uplo, kb, k-1, half, a, ia+k-1, ja+k-1,
415 $ desca, b, ib+k-1, jb, descb, cone, a, ia+k-1,
416 $ ja, desca )
417 CALL pcher2k( uplo, 'Conjugate transpose', k-1, kb, cone, a,
418 $ ia+k-1, ja, desca, b, ib+k-1, jb, descb, one,
419 $ a, ia, ja, desca )
420 CALL pchemm( 'Left', uplo, kb, k-1, half, a, ia+k-1, ja+k-1,
421 $ desca, b, ib+k-1, jb, descb, cone, a, ia+k-1,
422 $ ja, desca )
423 CALL pctrmm( 'Left', uplo, 'Conjugate transpose',
424 $ 'Non-unit', kb, k-1, cone, b, ib+k-1, jb+k-1,
425 $ descb, a, ia+k-1, ja, desca )
426 CALL pchegs2( ibtype, uplo, kb, a, ia+k-1, ja+k-1, desca, b,
427 $ ib+k-1, jb+k-1, descb, info )
428
429 k = k + kb
430 kb =
min( n-k+1, nb )
431
432 IF( k.LE.n )
433 $ GO TO 40
434
435 END IF
436
437 END IF
438
439 RETURN
440
441
442
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine pchegs2(ibtype, uplo, n, a, ia, ja, desca, b, ib, jb, descb, info)
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
subroutine pxerbla(ictxt, srname, info)