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 REAL 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
171
172 LOGICAL UPPER
173 INTEGER IACOL, IAROW, IBCOL, IBROW, ICOFFA, ICOFFB,
174 $ ICTXT, IIA, IIB, IOFFA, IOFFB, IROFFA, IROFFB,
175 $ JJA, JJB, K, LDA, LDB, MYCOL, MYROW, NPCOL,
176 $ NPROW
177 REAL AKK, BKK, CT
178
179
181 $
pxerbla, saxpy, sscal, ssyr2, strmv, strsv
182
183
184 INTRINSIC mod
185
186
187 LOGICAL LSAME
188 INTEGER INDXG2P
190
191
192
193 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
194 $ rsrc_.LT.0 )RETURN
195
196
197
198 ictxt = desca( ctxt_ )
199 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
200
201
202
203 info = 0
204 IF( nprow.EQ.-1 ) THEN
205 info = -( 700+ctxt_ )
206 ELSE
207 upper =
lsame( uplo,
'U' )
208 CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
209 CALL chk1mat( n, 3, n, 3, ib, jb, descb, 11, info )
210 IF( info.EQ.0 ) THEN
211 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
212 $ nprow )
213 ibrow =
indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
214 $ nprow )
215 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
216 $ npcol )
217 ibcol =
indxg2p( jb, descb( nb_ ), mycol, descb( csrc_ ),
218 $ npcol )
219 iroffa = mod( ia-1, desca( mb_ ) )
220 icoffa = mod( ja-1, desca( nb_ ) )
221 iroffb = mod( ib-1, descb( mb_ ) )
222 icoffb = mod( jb-1, descb( nb_ ) )
223 IF( ibtype.LT.1 .OR. ibtype.GT.3 ) THEN
224 info = -1
225 ELSE IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
226 info = -2
227 ELSE IF( n.LT.0 ) THEN
228 info = -3
229 ELSE IF( n+icoffa.GT.desca( nb_ ) ) THEN
230 info = -3
231 ELSE IF( iroffa.NE.0 ) THEN
232 info = -5
233 ELSE IF( icoffa.NE.0 ) THEN
234 info = -6
235 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
236 info = -( 700+nb_ )
237 ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow ) THEN
238 info = -9
239 ELSE IF( icoffb.NE.0 .OR. ibcol.NE.iacol ) THEN
240 info = -10
241 ELSE IF( descb( mb_ ).NE.desca( mb_ ) ) THEN
242 info = -( 1100+mb_ )
243 ELSE IF( descb( nb_ ).NE.desca( nb_ ) ) THEN
244 info = -( 1100+nb_ )
245 ELSE IF( ictxt.NE.descb( ctxt_ ) ) THEN
246 info = -( 1100+ctxt_ )
247 END IF
248 END IF
249 END IF
250
251 IF( info.NE.0 ) THEN
252 CALL pxerbla( ictxt,
'PSSYGS2', -info )
253 CALL blacs_exit( ictxt )
254 RETURN
255 END IF
256
257
258
259 IF( n.EQ.0 .OR. ( myrow.NE.iarow .OR. mycol.NE.iacol ) )
260 $ RETURN
261
262
263
264 lda = desca( lld_ )
265 ldb = descb( lld_ )
266 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
267 $ iarow, iacol )
268 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iib, jjb,
269 $ ibrow, ibcol )
270
271 IF( ibtype.EQ.1 ) THEN
272
273 IF( upper ) THEN
274
275 ioffa = iia + jja*lda
276 ioffb = iib + jjb*ldb
277
278
279
280 DO 10 k = 1, n
281
282
283
284
285 akk = a( ioffa-lda )
286 bkk = b( ioffb-ldb )
287 akk = akk / bkk**2
288 a( ioffa-lda ) = akk
289 IF( k.LT.n ) THEN
290 CALL sscal( n-k, one / bkk, a( ioffa ), lda )
291 ct = -half*akk
292 CALL saxpy( n-k, ct, b( ioffb ), ldb, a( ioffa ),
293 $ lda )
294 CALL ssyr2( uplo, n-k, -one, a( ioffa ), lda,
295 $ b( ioffb ), ldb, a( ioffa+1 ), lda )
296 CALL saxpy( n-k, ct, b( ioffb ), ldb, a( ioffa ),
297 $ lda )
298 CALL strsv( uplo, 'Transpose', 'Non-unit', n-k,
299 $ b( ioffb+1 ), ldb, a( ioffa ), lda )
300 END IF
301
302
303
304
305 ioffa = ioffa + lda + 1
306 ioffb = ioffb + ldb + 1
307
308 10 CONTINUE
309
310 ELSE
311
312 ioffa = iia + 1 + ( jja-1 )*lda
313 ioffb = iib + 1 + ( jjb-1 )*ldb
314
315
316
317 DO 20 k = 1, n
318
319
320
321
322 akk = a( ioffa-1 )
323 bkk = b( ioffb-1 )
324 akk = akk / bkk**2
325 a( ioffa-1 ) = akk
326
327 IF( k.LT.n ) THEN
328 CALL sscal( n-k, one / bkk, a( ioffa ), 1 )
329 ct = -half*akk
330 CALL saxpy( n-k, ct, b( ioffb ), 1, a( ioffa ), 1 )
331 CALL ssyr2( uplo, n-k, -one, a( ioffa ), 1,
332 $ b( ioffb ), 1, a( ioffa+lda ), lda )
333 CALL saxpy( n-k, ct, b( ioffb ), 1, a( ioffa ), 1 )
334 CALL strsv( uplo, 'No transpose', 'Non-unit', n-k,
335 $ b( ioffb+ldb ), ldb, a( ioffa ), 1 )
336 END IF
337
338
339
340
341 ioffa = ioffa + lda + 1
342 ioffb = ioffb + ldb + 1
343
344 20 CONTINUE
345
346 END IF
347
348 ELSE
349
350 IF( upper ) THEN
351
352 ioffa = iia + ( jja-1 )*lda
353 ioffb = iib + ( jjb-1 )*ldb
354
355
356
357 DO 30 k = 1, n
358
359
360
361 akk = a( ioffa+k-1 )
362 bkk = b( ioffb+k-1 )
363 CALL strmv( uplo, 'No transpose', 'Non-unit', k-1,
364 $ b( iib+( jjb-1 )*ldb ), ldb, a( ioffa ), 1 )
365 ct = half*akk
366 CALL saxpy( k-1, ct, b( ioffb ), 1, a( ioffa ), 1 )
367 CALL ssyr2( uplo, k-1, one, a( ioffa ), 1, b( ioffb ), 1,
368 $ a( iia+( jja-1 )*lda ), lda )
369 CALL saxpy( k-1, ct, b( ioffb ), 1, a( ioffa ), 1 )
370 CALL sscal( k-1, bkk, a( ioffa ), 1 )
371 a( ioffa+k-1 ) = akk*bkk**2
372
373
374
375
376 ioffa = ioffa + lda
377 ioffb = ioffb + ldb
378
379 30 CONTINUE
380
381 ELSE
382
383 ioffa = iia + ( jja-1 )*lda
384 ioffb = iib + ( jjb-1 )*ldb
385
386
387
388 DO 40 k = 1, n
389
390
391
392 akk = a( ioffa+( k-1 )*lda )
393 bkk = b( ioffb+( k-1 )*ldb )
394 CALL strmv( uplo, 'Transpose', 'Non-unit', k-1,
395 $ b( iib+( jjb-1 )*ldb ), ldb, a( ioffa ),
396 $ lda )
397 ct = half*akk
398 CALL saxpy( k-1, ct, b( ioffb ), ldb, a( ioffa ), lda )
399 CALL ssyr2( uplo, k-1, one, a( ioffa ), lda, b( ioffb ),
400 $ ldb, a( iia+( jja-1 )*lda ), lda )
401 CALL saxpy( k-1, ct, b( ioffb ), ldb, a( ioffa ), lda )
402 CALL sscal( k-1, bkk, a( ioffa ), lda )
403 a( ioffa+( k-1 )*lda ) = akk*bkk**2
404
405
406
407
408 ioffa = ioffa + 1
409 ioffb = ioffb + 1
410
411 40 CONTINUE
412
413 END IF
414
415 END IF
416
417 RETURN
418
419
420
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)