3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, LWORK, M, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX*16 A( * ), TAU( * ), WORK( * )
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
165 $ LLD_, MB_, M_, NB_, N_, RSRC_
166 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
167 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
168 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
169
170
171 LOGICAL LQUERY
172 CHARACTER COLBTOP, ROWBTOP
173 INTEGER I, IACOL, IAROW, IB, ICTXT, IINFO, IN, IPW,
174 $ IROFF, J, K, LWMIN, MP0, MYCOL, MYROW, NPCOL,
175 $ NPROW, NQ0
176
177
178 INTEGER IDUM1( 1 ), IDUM2( 1 )
179
180
184
185
186 INTEGER ICEIL, INDXG2P, NUMROC
188
189
190 INTRINSIC dble, dcmplx,
min, mod
191
192
193
194
195
196 ictxt = desca( ctxt_ )
197 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
198
199
200
201 info = 0
202 IF( nprow.EQ.-1 ) THEN
203 info = -(600+ctxt_)
204 ELSE
205 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
206 IF( info.EQ.0 ) THEN
207 iroff = mod( ia-1, desca( mb_ ) )
208 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
209 $ nprow )
210 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
211 $ npcol )
212 mp0 =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
213 nq0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
214 $ mycol, iacol, npcol )
215 lwmin = desca( mb_ ) * ( mp0 + nq0 + desca( mb_ ) )
216
217 work( 1 ) = dcmplx( dble( lwmin ) )
218 lquery = ( lwork.EQ.-1 )
219 IF( lwork.LT.lwmin .AND. .NOT.lquery )
220 $ info = -9
221 END IF
222 IF( lwork.EQ.-1 ) THEN
223 idum1( 1 ) = -1
224 ELSE
225 idum1( 1 ) = 1
226 END IF
227 idum2( 1 ) = 9
228 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
229 $ info )
230 END IF
231
232 IF( info.NE.0 ) THEN
233 CALL pxerbla( ictxt,
'PZGELQF', -info )
234 RETURN
235 ELSE IF( lquery ) THEN
236 RETURN
237 END IF
238
239
240
241 IF( m.EQ.0 .OR. n.EQ.0 )
242 $ RETURN
243
245 ipw = desca( mb_ ) * desca( mb_ ) + 1
246 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
247 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
248 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
249 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'I-ring' )
250
251
252
253 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+k-1 )
254 ib = in - ia + 1
255
256
257
258 CALL pzgelq2( ib, n, a, ia, ja, desca, tau, work, lwork, iinfo )
259
260 IF( ia+ib.LE.ia+m-1 ) THEN
261
262
263
264
265 CALL pzlarft(
'Forward',
'Rowwise', n, ib, a, ia, ja, desca,
266 $ tau, work, work( ipw ) )
267
268
269
270 CALL pzlarfb(
'Right',
'No transpose',
'Forward',
'Rowwise',
271 $ m-ib, n, ib, a, ia, ja, desca, work, a, ia+ib,
272 $ ja, desca, work( ipw ) )
273 END IF
274
275
276
277 DO 10 i = in+1, ia+k-1, desca( mb_ )
278 ib =
min( k-i+ia, desca( mb_ ) )
279 j = ja + i - ia
280
281
282
283
284 CALL pzgelq2( ib, n-i+ia, a, i, j, desca, tau, work, lwork,
285 $ iinfo )
286
287 IF( i+ib.LE.ia+m-1 ) THEN
288
289
290
291
292 CALL pzlarft(
'Forward',
'Rowwise', n-i+ia, ib, a, i, j,
293 $ desca, tau, work, work( ipw ) )
294
295
296
297 CALL pzlarfb(
'Right',
'No transpose',
'Forward',
'Rowwise',
298 $ m-i-ib+ia, n-j+ja, ib, a, i, j, desca, work,
299 $ a, i+ib, j, desca, work( ipw ) )
300 END IF
301
302 10 CONTINUE
303
304 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
305 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
306
307 work( 1 ) = dcmplx( dble( lwmin ) )
308
309 RETURN
310
311
312
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pxerbla(ictxt, srname, info)
subroutine pzgelq2(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pzlarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pzlarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)