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