2
3
4
5
6
7
8
9 CHARACTER , UPLO
10 INTEGER IA, INFO, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
134 $ LLD_, MB_, M_, NB_, N_, RSRC_
135 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
136 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
137 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
138 COMPLEX ZERO, ONE
139 parameter( zero = 0.0e+0, one = 1.0e+0 )
140
141
142 LOGICAL NOUNIT, UPPER
143 INTEGER I, ICOFF, ICTXT, IROFF, ICURCOL, ICURROW,
144 $ IDUMMY, II, IOFFA, J, JB, JJ, JN, LDA, MYCOL,
145 $ MYROW, NN, NPCOL, NPROW
146
147
148 INTEGER IDUM1( 2 ), IDUM2( 2 )
149
150
154
155
156 LOGICAL LSAME
157 INTEGER ICEIL
159
160
161 INTRINSIC ichar,
min, mod
162
163
164
165
166
167 ictxt = desca( ctxt_ )
169
170
171
172 info = 0
173 IF( nprow.EQ.-1 ) THEN
174 info = -(700+ctxt_)
175 ELSE
176 upper =
lsame( uplo,
'U' )
177 nounit =
lsame( diag, 'n
' )
178
179 CALL CHK1MAT( N, 3, N, 3, IA, JA, DESCA, 7, INFO )
180.EQ. IF( INFO0 ) THEN
181 IROFF = MOD( IA-1, DESCA( MB_ ) )
182 ICOFF = MOD( JA-1, DESCA( NB_ ) )
183.NOT..AND..NOT. IF( UPPER LSAME( UPLO, 'l' ) ) THEN
184 INFO = -1
185.NOT..AND..NOT. ELSE IF( NOUNIT LSAME( DIAG, 'u' ) ) THEN
186 INFO = -2
187.NE..OR..NE. ELSE IF( IROFFICOFF IROFF0 ) THEN
188 INFO = -6
189.NE. ELSE IF( DESCA( MB_ )DESCA( NB_ ) ) THEN
190 INFO = -(700+NB_)
191 END IF
192 END IF
193
194 IF( UPPER ) THEN
195 IDUM1( 1 ) = ICHAR( 'u' )
196 ELSE
197 IDUM1( 1 ) = ICHAR( 'l' )
198 END IF
199 IDUM2( 1 ) = 1
200 IF( NOUNIT ) THEN
201 IDUM1( 2 ) = ICHAR( 'n' )
202 ELSE
203 IDUM1( 2 ) = ICHAR( 'u' )
204 END IF
205 IDUM2( 2 ) = 2
206
207 CALL PCHK1MAT( N, 3, N, 3, IA, JA, DESCA, 7, 2, IDUM1, IDUM2,
208 $ INFO )
209 END IF
210
211.NE. IF( INFO0 ) THEN
212 CALL PXERBLA( ICTXT, 'pctrtri', -INFO )
213 RETURN
214 END IF
215
216
217
218.EQ. IF( N0 )
219 $ RETURN
220
221
222
223 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
224 IF( NOUNIT ) THEN
225 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL,
226 $ II, JJ, ICURROW, ICURCOL )
227
228
229
230 JB = JN-JA+1
231 LDA = DESCA( LLD_ )
232.EQ..AND..EQ. IF( MYROWICURROW MYCOLICURCOL ) THEN
233 IOFFA = II+(JJ-1)*LDA
234 DO 10 I = 0, JB-1
235.EQ..AND..EQ. IF( A( IOFFA )ZERO INFO0 )
236 $ INFO = I + 1
237 IOFFA = IOFFA + LDA + 1
238 10 CONTINUE
239 END IF
240.EQ. IF( MYROWICURROW )
241 $ II = II + JB
242.EQ. IF( MYCOLICURCOL )
243 $ JJ = JJ + JB
244 ICURROW = MOD( ICURROW+1, NPROW )
245 ICURCOL = MOD( ICURCOL+1, NPCOL )
246
247
248
249 DO 30 J = JN+1, JA+N-1, DESCA( NB_ )
250 JB = MIN( JA+N-J, DESCA( NB_ ) )
251.EQ..AND..EQ. IF( MYROWICURROW MYCOLICURCOL ) THEN
252 IOFFA = II+(JJ-1)*LDA
253 DO 20 I = 0, JB-1
254.EQ..AND..EQ. IF( A( IOFFA )ZERO INFO0 )
255 $ INFO = J + I - JA + 1
256 IOFFA = IOFFA + LDA + 1
257 20 CONTINUE
258 END IF
259.EQ. IF( MYROWICURROW )
260 $ II = II + JB
261.EQ. IF( MYCOLICURCOL )
262 $ JJ = JJ + JB
263 ICURROW = MOD( ICURROW+1, NPROW )
264 ICURCOL = MOD( ICURCOL+1, NPCOL )
265 30 CONTINUE
266 CALL IGAMX2D( ICTXT, 'all', ' ', 1, 1, INFO, 1, IDUMMY,
267 $ IDUMMY, -1, -1, MYCOL )
268.NE. IF( INFO0 )
269 $ RETURN
270 END IF
271
272
273
274 IF( UPPER ) THEN
275
276
277
278 JB = JN-JA+1
279
280
281
282 CALL PCTRTI2( UPLO, DIAG, JB, A, IA, JA, DESCA, INFO )
283
284
285
286 DO 40 J = JN+1, JA+N-1, DESCA( NB_ )
287 JB = MIN( DESCA( NB_ ), JA+N-J )
288 I = IA + J - JA
289
290
291
292 CALL PCTRMM( 'left', UPLO, 'no transpose', DIAG, J-JA, JB,
293 $ ONE, A, IA, JA, DESCA, A, IA, J, DESCA )
294 CALL PCTRSM( 'right', UPLO, 'no transpose', DIAG, J-JA,
295 $ JB, -ONE, A, I, J, DESCA, A, IA, J, DESCA )
296
297
298
299 CALL PCTRTI2( UPLO, DIAG, JB, A, I, J, DESCA, INFO )
300
301 40 CONTINUE
302
303 ELSE
304
305
306
307 NN = ( ( JA+N-2 ) / DESCA( NB_ ) )*DESCA( NB_ ) + 1
308 DO 50 J = NN, JN+1, -DESCA( NB_ )
309 JB = MIN( DESCA( NB_ ), JA+N-J )
310 I = IA + J - JA
311.LE. IF( J+JBJA+N-1 ) THEN
312
313
314
315 CALL PCTRMM( 'left', UPLO, 'no transpose', DIAG,
316 $ JA+N-J-JB, JB, ONE, A, I+JB, J+JB, DESCA,
317 $ A, I+JB, J, DESCA )
318 CALL PCTRSM( 'right', UPLO, 'no transpose', DIAG,
319 $ JA+N-J-JB, JB, -ONE, A, I, J, DESCA,
320 $ A, I+JB, J, DESCA )
321 END IF
322
323
324
325 CALL PCTRTI2( UPLO, DIAG, JB, A, I, J, DESCA, INFO )
326
327 50 CONTINUE
328
329
330
331 JB = JN-JA+1
332.LE. IF( JA+JBJA+N-1 ) THEN
333
334
335
336 CALL PCTRMM( 'left', UPLO, 'no transpose', DIAG, N-JB, JB,
337 $ ONE, A, IA+JB, JA+JB, DESCA, A, IA+JB, JA,
338 $ DESCA )
339 CALL PCTRSM( 'right', UPLO, 'no transpose', DIAG, N-JB, JB,
340 $ -ONE, A, IA, JA, DESCA, A, IA+JB, JA, DESCA )
341 END IF
342
343
344
345 CALL PCTRTI2( UPLO, DIAG, JB, A, IA, JA, DESCA, INFO )
346
347 END IF
348
349 RETURN
350
351
352
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 infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
subroutine pctrsm(side, uplo, transa, diag, m, n, alpha, a, ia, ja, desca, b, ib, jb, descb)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pctrti2(uplo, diag, n, a, ia, ja, desca, info)
subroutine pctrtri(uplo, diag, n, a, ia, ja, desca, info)