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