2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, INFO, JA, N
11
12
13 INTEGER DESCA( * )
14 DOUBLE PRECISION 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
144 parameter( one = 1.0d+0 )
145
146
147 LOGICAL UPPER
148 CHARACTER COLBTOP, ROWBTOP
149 INTEGER I, ICOFF, ICTXT, IROFF, J, JB, JN, MYCOL,
150 $ MYROW, NPCOL, NPROW
151
152
153 INTEGER IDUM1( 1 ), IDUM2( 1 )
154
155
157 $ pb_topset,
pdpotf2, pdsyrk, pdtrsm,
159
160
161 LOGICAL LSAME
162 INTEGER ICEIL
164
165
166 INTRINSIC ichar,
min, mod
167
168
169
170
171
172 ictxt = desca( ctxt_ )
173 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
174
175
176
177 info = 0
178 IF( nprow.EQ.-1 ) THEN
179 info = -(600+ctxt_)
180 ELSE
181 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
182 upper =
lsame( uplo,
'U' )
183 IF( info.EQ.0 ) THEN
184 iroff = mod( ia-1, desca( mb_ ) )
185 icoff = mod( ja-1, desca( nb_ ) )
186 IF ( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
187 info = -1
188 ELSE IF( iroff.NE.0 ) THEN
189 info = -4
190 ELSE IF( icoff.NE.0 ) THEN
191 info = -5
192 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
193 info = -(600+nb_)
194 END IF
195 END IF
196 IF( upper ) THEN
197 idum1( 1 ) = ichar( 'U' )
198 ELSE
199 idum1( 1 ) = ichar( 'L' )
200 END IF
201 idum2( 1 ) = 1
202 CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
203 $ info )
204 END IF
205
206 IF( info.NE.0 ) THEN
207 CALL pxerbla( ictxt,
'PDPOTRF', -info )
208 RETURN
209 END IF
210
211
212
213 IF( n.EQ.0 )
214 $ RETURN
215
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
224 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
225 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'S-ring' )
226
227
228
229
230
231 jn =
min(
iceil( ja, desca( nb_ ) )*desca(nb_), ja+n-1 )
232 jb = jn - ja + 1
233
234
235
236 CALL pdpotf2( uplo, jb, a, ia, ja, desca, info )
237 IF( info.NE.0 )
238 $ GO TO 30
239
240 IF( jb+1.LE.n ) THEN
241
242
243
244 CALL pdtrsm( 'Left', uplo, 'Transpose', 'Non-Unit',
245 $ jb, n-jb, one, a, ia, ja, desca, a, ia, ja+jb,
246 $ desca )
247
248
249
250 CALL pdsyrk( uplo, 'Transpose', n-jb, jb, -one, a, ia,
251 $ ja+jb, desca, one, a, ia+jb, ja+jb, desca )
252 END IF
253
254
255
256 DO 10 j = jn+1, ja+n-1, desca( nb_ )
257 jb =
min( n-j+ja, desca( nb_ ) )
258 i = ia + j - ja
259
260
261
262 CALL pdpotf2( uplo, jb, a, i, j, desca, info )
263 IF( info.NE.0 ) THEN
264 info = info + j - ja
265 GO TO 30
266 END IF
267
268 IF( j-ja+jb+1.LE.n ) THEN
269
270
271
272 CALL pdtrsm( 'Left', uplo, 'Transpose', 'Non-Unit',
273 $ jb, n-j-jb+ja, one, a, i, j, desca, a,
274 $ i, j+jb, desca )
275
276
277
278 CALL pdsyrk( uplo, 'Transpose', n-j-jb+ja, jb,
279 $ -one, a, i, j+jb, desca, one, a, i+jb,
280 $ j+jb, desca )
281 END IF
282 10 CONTINUE
283
284 ELSE
285
286
287
288
289 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'S-ring' )
290 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
291
292
293
294
295
296
297 jn =
min(
iceil( ja, desca( nb_ ) )*desca( nb_ ), ja+n-1 )
298 jb = jn - ja + 1
299
300
301
302 CALL pdpotf2( uplo, jb, a, ia, ja, desca, info )
303 IF( info.NE.0 )
304 $ GO TO 30
305
306 IF( jb+1.LE.n ) THEN
307
308
309
310 CALL pdtrsm( 'Right', uplo, 'Transpose', 'Non-Unit',
311 $ n-jb, jb, one, a, ia, ja, desca, a, ia+jb, ja,
312 $ desca )
313
314
315
316 CALL pdsyrk( uplo, 'No Transpose', n-jb, jb, -one, a, ia+jb,
317 $ ja, desca, one, a, ia+jb, ja+jb, desca )
318
319 END IF
320
321 DO 20 j = jn+1, ja+n-1, desca( nb_ )
322 jb =
min( n-j+ja, desca( nb_ ) )
323 i = ia + j - ja
324
325
326
327 CALL pdpotf2( uplo, jb, a, i, j, desca, info )
328 IF( info.NE.0 ) THEN
329 info = info + j - ja
330 GO TO 30
331 END IF
332
333 IF( j-ja+jb+1.LE.n ) THEN
334
335
336
337 CALL pdtrsm( 'Right', uplo, 'Transpose', 'Non-Unit',
338 $ n-j-jb+ja, jb, one, a, i, j, desca, a, i+jb,
339 $ j, desca )
340
341
342
343 CALL pdsyrk( uplo, 'No Transpose', n-j-jb+ja, jb, -one,
344 $ a, i+jb, j, desca, one, a, i+jb, j+jb,
345 $ desca )
346
347 END IF
348 20 CONTINUE
349
350 END IF
351
352 30 CONTINUE
353
354 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
355 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
356
357 RETURN
358
359
360
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pdpotf2(uplo, n, a, ia, ja, desca, info)
subroutine pxerbla(ictxt, srname, info)