5
6
7
8
9
10
11
12 CHARACTER UPLO
13 INTEGER IA, IB, IBTYPE, INFO, JA, JB, N
14 DOUBLE PRECISION SCALE
15
16
17 INTEGER DESCA( * ), DESCB( * )
18 COMPLEX*16 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 DOUBLE PRECISION ONE
176 parameter( one = 1.0d+0 )
177 COMPLEX*16 CONE, HALF
178 parameter( cone = ( 1.0d+0, 0.0d+0 ),
179 $ half = ( 0.5d+0, 0.0d+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
192 $
pzhegs2, pzhemm, pzher2k, pztrmm, pztrsm
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,
'PZHEGST', -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 pzhegs2( 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 pztrsm( '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 pzhemm( '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 pzher2k( 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 pzhemm( '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 pztrsm( '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 pzhegs2( 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 pztrsm( '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 pzhemm( '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 pzher2k( 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 pzhemm( '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 pztrsm( '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 pztrmm( 'Left', uplo, 'No transpose', 'Non-unit', k-1,
376 $ kb, cone, b, ib, jb, descb, a, ia, ja+k-1,
377 $ desca )
378 CALL pzhemm( '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 pzher2k( 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 pzhemm( '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 pztrmm( '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 pzhegs2( 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 pztrmm( 'Right', uplo, 'No transpose', 'Non-unit', kb,
412 $ k-1, cone, b, ib, jb, descb, a, ia+k-1, ja,
413 $ desca )
414 CALL pzhemm( '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 pzher2k( 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 pzhemm( '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 pztrmm( '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 pzhegs2( 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 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)
subroutine pzhegs2(ibtype, uplo, n, a, ia, ja, desca, b, ib, jb, descb, info)