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