2
3
4
5
6
7
8
9 CHARACTER DIAG, 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
129 $ LLD_, MB_, M_, NB_, N_, RSRC_
130 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
131 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
132 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
133 COMPLEX*16 ONE
134 parameter( one = 1.0d+0 )
135
136
137 LOGICAL NOUNIT, UPPER
138 INTEGER IACOL, IAROW, ICTXT, ICURR, IDIAG, IIA, IOFFA,
139 $ JJA, LDA, MYCOL, MYROW, NA, NPCOL, NPROW
140 COMPLEX*16 AJJ
141
142
145
146
147 LOGICAL LSAME
149
150
151
152
153
154 ictxt = desca( ctxt_ )
155 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
156
157
158
159 info = 0
160 IF( nprow.EQ.-1 ) THEN
161 info = -(700+ctxt_)
162 ELSE
163 CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
164 upper =
lsame( uplo,
'U' )
165 nounit =
lsame( diag,
'N' )
166 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
167 info = -1
168 ELSE IF( .NOT.nounit .AND. .NOT.
lsame( diag,
'U' ) )
THEN
169 info = -2
170 END IF
171 END IF
172
173 IF( info.NE.0 ) THEN
174 CALL pxerbla( ictxt,
'PZTRTI2', -info )
175 CALL blacs_abort( ictxt, 1 )
176 RETURN
177 END IF
178
179
180
181 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
182 $ iarow, iacol )
183
184 IF( myrow.EQ.iarow .AND. mycol.EQ.iacol ) THEN
185
186 lda = desca( lld_ )
187
188 IF( upper ) THEN
189
190 ioffa = iia + ( jja - 1 ) * lda
191 icurr = ioffa + lda
192
193 IF( nounit ) THEN
194
195
196
197 a( ioffa ) = one / a( ioffa )
198 idiag = icurr + 1
199 DO 10 na = 1, n-1
200 a( idiag ) = one / a( idiag )
201 ajj = -a( idiag )
202
203
204
205 CALL ztrmv( 'Upper', 'No transpose', diag, na,
206 $ a( ioffa ), lda, a( icurr ), 1 )
207 CALL zscal( na, ajj, a( icurr ), 1 )
208 idiag = idiag + lda + 1
209 icurr = icurr + lda
210 10 CONTINUE
211
212 ELSE
213
214
215
216 DO 20 na = 1, n-1
217
218
219
220 CALL ztrmv( 'Upper', 'No transpose', diag, na,
221 $ a( ioffa ), lda, a( icurr ), 1 )
222 CALL zscal( na, -one, a( icurr ), 1 )
223 icurr = icurr + lda
224 20 CONTINUE
225
226 END IF
227
228 ELSE
229
230 icurr = iia + n - 1 + ( jja + n - 2 ) * lda
231 ioffa = icurr - lda
232
233 IF( nounit ) THEN
234
235
236
237 a( icurr ) = one / a( icurr )
238 idiag = ioffa - 1
239 DO 30 na = 1, n-1
240 a( idiag ) = one / a( idiag )
241 ajj = -a( idiag )
242
243
244
245 CALL ztrmv( 'Lower', 'No transpose', diag, na,
246 $ a( icurr ), lda, a( ioffa ), 1 )
247 CALL zscal( na, ajj, a( ioffa ), 1 )
248 icurr = idiag
249 idiag = idiag - lda - 1
250 ioffa = idiag + 1
251 30 CONTINUE
252
253 ELSE
254
255
256
257 DO 40 na = 1, n-1
258
259
260
261 CALL ztrmv( 'Lower', 'No transpose', diag, na,
262 $ a( icurr ), lda, a( ioffa ), 1 )
263 CALL zscal( na, -one, a( ioffa ), 1 )
264 icurr = icurr - lda - 1
265 ioffa = icurr - lda
266 40 CONTINUE
267
268 END IF
269
270 END IF
271
272 END IF
273
274
275
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)