2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, INFO, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX A( * )
15
16
17
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
139 $ LLD_, MB_, M_, NB_, N_, RSRC_
140 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
141 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
142 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
143 REAL ONE, ZERO
144 parameter( one = 1.0e+0, zero = 0.0e+0 )
145 COMPLEX CONE
146 parameter( cone = 1.0e+0 )
147
148
149 LOGICAL UPPER
150 CHARACTER COLBTOP, ROWBTOP
151 INTEGER IACOL, IAROW, ICOFF, ICTXT, ICURR, IDIAG, IIA,
152 $ IOFFA, IROFF, J, JJA, LDA, MYCOL, MYROW,
153 $ NPCOL, NPROW
154 REAL AJJ
155
156
157 EXTERNAL blacs_abort, blacs_gridinfo,
chk1mat, cgemv,
158 $ clacgv, csscal, igebr2d, igebs2d,
160
161
162 INTRINSIC mod, real, sqrt
163
164
165 LOGICAL LSAME
166 COMPLEX CDOTC
167 EXTERNAL lsame, cdotc
168
169
170
171
172
173 ictxt = desca( ctxt_ )
174 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
175
176
177
178 info = 0
179 IF( nprow.EQ.-1 ) THEN
180 info = -(600+ctxt_)
181 ELSE
182 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
183 IF( info.EQ.0 ) THEN
184 upper =
lsame( uplo,
'U' )
185 iroff = mod( ia-1, desca( mb_ ) )
186 icoff = mod( ja-1, desca( nb_ ) )
187 IF ( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
188 info = -1
189 ELSE IF( n+icoff.GT.desca( nb_ ) ) THEN
190 info = -2
191 ELSE IF( iroff.NE.0 ) THEN
192 info = -4
193 ELSE IF( icoff.NE.0 ) THEN
194 info = -5
195 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
196 info = -(600+nb_)
197 END IF
198 END IF
199 END IF
200
201 IF( info.NE.0 ) THEN
202 CALL pxerbla( ictxt,
'PCPOTF2', -info )
203 CALL blacs_abort( ictxt, 1 )
204 RETURN
205 END IF
206
207
208
209 IF( n.EQ.0 )
210 $ RETURN
211
212
213
214 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
215 $ iarow, iacol )
216 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
217 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
218
219 IF ( upper ) THEN
220
221
222
223 IF( myrow.EQ.iarow ) THEN
224 IF( mycol.EQ.iacol ) THEN
225
226
227
228 lda = desca( lld_ )
229 idiag = iia + ( jja - 1 ) * lda
230 ioffa = idiag
231
232 DO 10 j = ja, ja+n-1
233
234
235
236 ajj = real( a( idiag ) ) -
237 $ cdotc( j-ja, a( ioffa ), 1, a( ioffa ), 1 )
238 IF( ajj.LE.zero ) THEN
239 a( idiag ) = ajj
240 info = j - ja + 1
241 GO TO 20
242 END IF
243 ajj = sqrt( ajj )
244 a( idiag ) = ajj
245
246
247
248 IF( j.LT.ja+n-1 ) THEN
249 icurr = idiag + lda
250 CALL clacgv( j-ja, a( ioffa ), 1 )
251 CALL cgemv( 'Transpose', j-ja, ja+n-j-1, -cone,
252 $ a( ioffa+lda ), lda, a( ioffa ), 1,
253 $ cone, a( icurr ), lda )
254 CALL clacgv( j-ja, a( ioffa ), 1 )
255 CALL csscal( ja+n-j-1, one / ajj, a( icurr ),
256 $ lda )
257 END IF
258 idiag = idiag + lda + 1
259 ioffa = ioffa + lda
260 10 CONTINUE
261
262 20 CONTINUE
263
264
265
266 CALL igebs2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1 )
267
268 ELSE
269
270 CALL igebr2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1,
271 $ myrow, iacol )
272 END IF
273
274
275
276 CALL igebs2d( ictxt, 'Columnwise', colbtop, 1, 1, info, 1 )
277
278 ELSE
279
280 CALL igebr2d( ictxt, 'Columnwise', colbtop, 1, 1, info, 1,
281 $ iarow, mycol )
282
283 END IF
284
285 ELSE
286
287
288
289 IF( mycol.EQ.iacol ) THEN
290 IF( myrow.EQ.iarow ) THEN
291
292
293
294 lda = desca( lld_ )
295 idiag = iia + ( jja - 1 ) * lda
296 ioffa = idiag
297
298 DO 30 j = ja, ja+n-1
299
300
301
302 ajj = real( a( idiag ) ) -
303 $ cdotc( j-ja, a( ioffa ), lda, a( ioffa ), lda )
304 IF ( ajj.LE.zero ) THEN
305 a( idiag ) = ajj
306 info = j - ja + 1
307 GO TO 40
308 END IF
309 ajj = sqrt( ajj )
310 a( idiag ) = ajj
311
312
313
314 IF( j.LT.ja+n-1 ) THEN
315 icurr = idiag + 1
316 CALL clacgv( j-ja, a( ioffa ), lda )
317 CALL cgemv( 'No transpose', ja+n-j-1, j-ja, -cone,
318 $ a( ioffa+1 ), lda, a( ioffa ), lda,
319 $ cone, a( icurr ), 1 )
320 CALL clacgv( j-ja, a( ioffa ), lda )
321 CALL csscal( ja+n-j-1, one / ajj, a( icurr ), 1 )
322 END IF
323 idiag = idiag + lda + 1
324 ioffa = ioffa + 1
325 30 CONTINUE
326
327 40 CONTINUE
328
329
330
331 CALL igebs2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
332 $ 1 )
333
334 ELSE
335
336 CALL igebr2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
337 $ 1, iarow, mycol )
338
339 END IF
340
341
342
343 CALL igebs2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1 )
344
345 ELSE
346
347 CALL igebr2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1,
348 $ myrow, iacol )
349
350 END IF
351
352 END IF
353
354 RETURN
355
356
357
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pxerbla(ictxt, srname, info)