2
3
4
5
6
7
8
9 INTEGER IA, INFO, JA, M, N
10
11
12 INTEGER DESCA( * ), IPIV( * )
13 COMPLEX*16 A( * )
14
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
137 $ LLD_, MB_, M_, NB_, N_, RSRC_
138 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
139 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
140 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
141 COMPLEX*16 ONE
142 parameter( one = 1.0d+0 )
143
144
145 CHARACTER COLBTOP, COLCTOP, ROWBTOP
146 INTEGER I, ICOFF, ICTXT, IINFO, IN, IROFF, J, JB, JN,
147 $ MN, MYCOL, MYROW, NPCOL, NPROW
148
149
150 INTEGER IDUM1( 1 ), IDUM2( 1 )
151
152
156
157
158 INTEGER ICEIL
160
161
163
164
165
166
167
168 ictxt = desca( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
170
171
172
173 info = 0
174 IF( nprow.EQ.-1 ) THEN
175 info = -(600+ctxt_)
176 ELSE
177 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
178 IF( info.EQ.0 ) THEN
179 iroff = mod( ia-1, desca( mb_ ) )
180 icoff = mod( ja-1, desca( nb_ ) )
181 IF( iroff.NE.0 ) THEN
182 info = -4
183 ELSE IF( icoff.NE.0 ) THEN
184 info = -5
185 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
186 info = -(600+nb_)
187 END IF
188 END IF
189 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 0, idum1,
190 $ idum2, info )
191 END IF
192
193 IF( info.NE.0 ) THEN
194 CALL pxerbla( ictxt,
'PZGETRF', -info )
195 RETURN
196 END IF
197
198
199
200 IF( desca( m_ ).EQ.1 ) THEN
201 ipiv( 1 ) = 1
202 RETURN
203 ELSE IF( m.EQ.0 .OR. n.EQ.0 ) THEN
204 RETURN
205 END IF
206
207
208
209 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
210 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
211 CALL pb_topget( ictxt, 'Combine', 'Columnwise', colctop )
212 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'S-ring' )
213 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
214 CALL pb_topset( ictxt, 'Combine', 'Columnwise', ' ' )
215
216
217
219 in =
min(
iceil( ia, desca( mb_ ) )*desca( mb_ ), ia+m-1 )
220 jn =
min(
iceil( ja, desca( nb_ ) )*desca( nb_ ), ja+mn-1 )
221 jb = jn - ja + 1
222
223
224
225
226 CALL pzgetf2( m, jb, a, ia, ja, desca, ipiv, info )
227
228 IF( jb+1.LE.n ) THEN
229
230
231
232 CALL pzlaswp(
'Forward',
'Rows', n-jb, a, ia, jn+1, desca,
233 $ ia, in, ipiv )
234
235
236
237 CALL pztrsm( 'Left', 'Lower', 'No transpose', 'Unit', jb,
238 $ n-jb, one, a, ia, ja, desca, a, ia, jn+1, desca )
239
240 IF( jb+1.LE.m ) THEN
241
242
243
244 CALL pzgemm( 'No transpose', 'No transpose', m-jb, n-jb, jb,
245 $ -one, a, in+1, ja, desca, a, ia, jn+1, desca,
246 $ one, a, in+1, jn+1, desca )
247
248 END IF
249 END IF
250
251
252
253 DO 10 j = jn+1, ja+mn-1, desca( nb_ )
254 jb =
min( mn-j+ja, desca( nb_ ) )
255 i = ia + j - ja
256
257
258
259
260 CALL pzgetf2( m-j+ja, jb, a, i, j, desca, ipiv, iinfo )
261
262 IF( info.EQ.0 .AND. iinfo.GT.0 )
263 $ info = iinfo + j - ja
264
265
266
267 CALL pzlaswp(
'Forward',
'Rowwise', j-ja, a, ia, ja, desca,
268 $ i, i+jb-1, ipiv )
269
270 IF( j-ja+jb+1.LE.n ) THEN
271
272
273
274 CALL pzlaswp(
'Forward',
'Rowwise', n-j-jb+ja, a, ia, j+jb,
275 $ desca, i, i+jb-1, ipiv )
276
277
278
279 CALL pztrsm( 'Left', 'Lower', 'No transpose', 'Unit', jb,
280 $ n-j-jb+ja, one, a, i, j, desca, a, i, j+jb,
281 $ desca )
282
283 IF( j-ja+jb+1.LE.m ) THEN
284
285
286
287 CALL pzgemm( 'No transpose', 'No transpose', m-j-jb+ja,
288 $ n-j-jb+ja, jb, -one, a, i+jb, j, desca, a,
289 $ i, j+jb, desca, one, a, i+jb, j+jb, desca )
290
291 END IF
292 END IF
293
294 10 CONTINUE
295
296 IF( info.EQ.0 )
297 $ info = mn + 1
298 CALL igamn2d( ictxt, 'Rowwise', ' ', 1, 1, info, 1, idum1, idum2,
299 $ -1, -1, mycol )
300 IF( info.EQ.mn+1 )
301 $ info = 0
302
303 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
304 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
305 CALL pb_topset( ictxt, 'Combine', 'Columnwise', colctop )
306
307 RETURN
308
309
310
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 pzgetf2(m, n, a, ia, ja, desca, ipiv, info)
subroutine pzlaswp(direc, rowcol, n, a, ia, ja, desca, k1, k2, ipiv)