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 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 REAL ONE, HALF
169 parameter( one = 1.0e+0, half = 0.5e+0 )
170 COMPLEX CONE
171 parameter( cone = ( 1.0e+0, 0.0e+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 REAL AKK, BKK
180 COMPLEX CT
181
182
183 EXTERNAL blacs_exit, blacs_gridinfo, caxpy, cher2,
186
187
188 INTRINSIC mod, real
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,
'PCHEGS2', -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 = real( a( ioffa-lda ) )
290 bkk = real( b( ioffb-ldb ) )
291 akk = akk / bkk**2
292 a( ioffa-lda ) = akk
293 IF( k.LT.n ) THEN
294 CALL csscal( n-k, one / bkk, a( ioffa ), lda )
295 ct = -half*akk
296 CALL clacgv( n-k, a( ioffa ), lda )
297 CALL clacgv( n-k, b( ioffb ), ldb )
298 CALL caxpy( n-k, ct, b( ioffb ), ldb, a( ioffa ),
299 $ lda )
300 CALL cher2( uplo, n-k, -cone, a( ioffa ), lda,
301 $ b( ioffb ), ldb, a( ioffa+1 ), lda )
302 CALL caxpy( n-k, ct, b( ioffb ), ldb, a( ioffa ),
303 $ lda )
304 CALL clacgv( n-k, b( ioffb ), ldb )
305 CALL ctrsv( uplo, 'Conjugate transpose', 'Non-unit',
306 $ n-k, b( ioffb+1 ), ldb, a( ioffa ), lda )
307 CALL clacgv( 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 = real( a( ioffa-1 ) )
331 bkk = real( b( ioffb-1 ) )
332 akk = akk / bkk**2
333 a( ioffa-1 ) = akk
334
335 IF( k.LT.n ) THEN
336 CALL csscal( n-k, one / bkk, a( ioffa ), 1 )
337 ct = -half*akk
338 CALL caxpy( n-k, ct, b( ioffb ), 1, a( ioffa ), 1 )
339 CALL cher2( uplo, n-k, -cone, a( ioffa ), 1,
340 $ b( ioffb ), 1, a( ioffa+lda ), lda )
341 CALL caxpy( n-k, ct, b( ioffb ), 1, a( ioffa ), 1 )
342 CALL ctrsv( 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 = real( a( ioffa+k-1 ) )
370 bkk = real( b( ioffb+k-1 ) )
371 CALL ctrmv( uplo, 'No transpose', 'Non-unit', k-1,
372 $ b( iib+( jjb-1 )*ldb ), ldb, a( ioffa ), 1 )
373 ct = half*akk
374 CALL caxpy( k-1, ct, b( ioffb ), 1, a( ioffa ), 1 )
375 CALL cher2( uplo, k-1, cone, a( ioffa ), 1, b( ioffb ),
376 $ 1, a( iia+( jja-1 )*lda ), lda )
377 CALL caxpy( k-1, ct, b( ioffb ), 1, a( ioffa ), 1 )
378 CALL csscal( 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 = real( a( ioffa+( k-1 )*lda ) )
401 bkk = real( b( ioffb+( k-1 )*ldb ) )
402 CALL clacgv( k-1, a( ioffa ), lda )
403 CALL ctrmv( uplo, 'Conjugate transpose', 'Non-unit', k-1,
404 $ b( iib+( jjb-1 )*ldb ), ldb, a( ioffa ),
405 $ lda )
406 ct = half*akk
407 CALL clacgv( k-1, b( ioffb ), ldb )
408 CALL caxpy( k-1, ct, b( ioffb ), ldb, a( ioffa ), lda )
409 CALL cher2( uplo, k-1, cone, a( ioffa ), lda, b( ioffb ),
410 $ ldb, a( iia+( jja-1 )*lda ), lda )
411 CALL caxpy( k-1, ct, b( ioffb ), ldb, a( ioffa ), lda )
412 CALL clacgv( k-1, b( ioffb ), ldb )
413 CALL csscal( k-1, bkk, a( ioffa ), lda )
414 CALL clacgv( 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)