2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, INFO, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX*16 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 DOUBLE PRECISION ONE, ZERO
144 parameter( one = 1.0d+0, zero = 0.0d+0 )
145 COMPLEX*16 CONE
146 parameter( cone = 1.0d+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 DOUBLE PRECISION AJJ
155 COMPLEX*16 DOT
156
157
158 EXTERNAL blacs_abort, blacs_gridinfo,
chk1mat, igebr2d,
161
162
163 INTRINSIC dble, mod, sqrt
164
165
166 LOGICAL LSAME
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,
'PZPOTF2', -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 CALL zzdotc( j-ja, dot, a( ioffa ), 1, a( ioffa ), 1 )
237 ajj = dble( a( idiag ) - dot )
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 zlacgv( j-ja, a( ioffa ), 1 )
251 CALL zgemv( 'Transpose', j-ja, ja+n-j-1, -cone,
252 $ a( ioffa+lda ), lda, a( ioffa ), 1,
253 $ cone, a( icurr ), lda )
254 CALL zlacgv( j-ja, a( ioffa ), 1 )
255 CALL zdscal( 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 CALL zzdotc( j-ja, dot, a( ioffa ), lda, a( ioffa ),
303 $ lda )
304 ajj = dble( a( idiag ) - dot )
305 IF ( ajj.LE.zero ) THEN
306 a( idiag ) = ajj
307 info = j - ja + 1
308 GO TO 40
309 END IF
310 ajj = sqrt( ajj )
311 a( idiag ) = ajj
312
313
314
315 IF( j.LT.ja+n-1 ) THEN
316 icurr = idiag + 1
317 CALL zlacgv( j-ja, a( ioffa ), lda )
318 CALL zgemv( 'No transpose', ja+n-j-1, j-ja, -cone,
319 $ a( ioffa+1 ), lda, a( ioffa ), lda,
320 $ cone, a( icurr ), 1 )
321 CALL zlacgv( j-ja, a( ioffa ), lda )
322 CALL zdscal( ja+n-j-1, one / ajj, a( icurr ), 1 )
323 END IF
324 idiag = idiag + lda + 1
325 ioffa = ioffa + 1
326 30 CONTINUE
327
328 40 CONTINUE
329
330
331
332 CALL igebs2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
333 $ 1 )
334
335 ELSE
336
337 CALL igebr2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
338 $ 1, iarow, mycol )
339
340 END IF
341
342
343
344 CALL igebs2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1 )
345
346 ELSE
347
348 CALL igebr2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1,
349 $ myrow, iacol )
350
351 END IF
352
353 END IF
354
355 RETURN
356
357
358
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)
subroutine zzdotc(n, dotc, x, incx, y, incy)