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, , IROFF, J, JB, JN, MYCOL,
152 $ MYROW, NPCOL, NPROW
153
154
155 INTEGER IDUM1( 1 ), IDUM2( 1 )
156
157
161
162
163 LOGICAL
164 INTEGER ICEIL
166
167
168 INTRINSIC ichar,
min, mod
169
170
171
172
173
174 ictxt = desca( ctxt_ )
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.NE. IF( INFO0 )
240 $ GO TO 30
241
242.LE. IF( JB+1N ) 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.NE. IF( INFO0 ) THEN
266 INFO = INFO + J - JA
267 GO TO 30
268 END IF
269
270.LE. IF( J-JA+JB+1N ) 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.NE. IF( INFO0 )
306 $ GO TO 30
307
308.LE. IF( JB+1N ) 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.NE. IF( INFO0 ) THEN
331 INFO = INFO + J - JA
332 GO TO 30
333 END IF
334
335.LE. IF( J-JA+JB+1N ) 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
logical function lsame(ca, cb)
LSAME
integer function iceil(inum, idenom)
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine pxerbla(contxt, srname, info)
subroutine pztrsm(side, uplo, transa, diag, m, n, alpha, a, ia, ja, desca, b, ib, jb, descb)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pzpotf2(uplo, n, a, ia, ja, desca, info)