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