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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
186 $ LLD_, MB_, M_, NB_, N_, RSRC_
187 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
188 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
189 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
190 COMPLEX*16 ZERO
191 parameter( zero = ( 0.0d+0, 0.0d+0 ) )
192
193
194 LOGICAL LQUERY
195 CHARACTER COLBTOP, ROWBTOP
196 INTEGER I, IACOL, IAROW, IB, ICTXT, IIA, IL, IN, IPW,
197 $ IROFFA, J, JM1, L, LWMIN, MP0, MYCOL, MYROW,
198 $ NPCOL, NPROW, NQ0
199
200
201 INTEGER IDUM1( 1 ), IDUM2( 1 )
202
203
207
208
209 INTEGER ICEIL, INDXG2P, NUMROC
211
212
213 INTRINSIC dble, dcmplx,
max,
min, mod
214
215
216
217
218
219 ictxt = desca( ctxt_ )
220 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
221
222
223
224 info = 0
225 IF( nprow.EQ.-1 ) THEN
226 info = -(600+ctxt_)
227 ELSE
228 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
229 IF( info.EQ.0 ) THEN
230 iroffa = mod( ia-1, desca( mb_ ) )
231 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
232 $ nprow )
233 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
234 $ npcol )
235 mp0 =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
236 nq0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
237 $ mycol, iacol, npcol )
238 lwmin = desca( mb_ ) * ( mp0 + nq0 + desca( mb_ ) )
239
240 work( 1 ) = dcmplx( dble( lwmin ) )
241 lquery = ( lwork.EQ.-1 )
242 IF( n.LT.m ) THEN
243 info = -2
244 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
245 info = -9
246 END IF
247 END IF
248 IF( lquery ) THEN
249 idum1( 1 ) = -1
250 ELSE
251 idum1( 1 ) = 1
252 END IF
253 idum2( 1 ) = 9
254 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
255 $ info )
256 END IF
257
258 IF( info.NE.0 ) THEN
259 CALL pxerbla( ictxt,
'PZTZRZF', -info )
260 RETURN
261 ELSE IF( lquery ) THEN
262 RETURN
263 END IF
264
265
266
267 IF( m.EQ.0 .OR. n.EQ.0 )
268 $ RETURN
269
270 IF( m.EQ.n ) THEN
271
272 CALL infog1l( ia, desca( mb_ ), nprow, myrow, desca( rsrc_ ),
273 $ iia, iarow )
274 IF( myrow.EQ.iarow )
275 $ mp0 = mp0 - iroffa
276 DO 10 i = iia, iia+mp0-1
277 tau( i ) = zero
278 10 CONTINUE
279
280 ELSE
281
282 l = n-m
283 jm1 = ja +
min( m+1, n ) - 1
284 ipw = desca( mb_ ) * desca( mb_ ) + 1
285 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
286 il =
max( ( (ia+m-2) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
287 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
288 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
289 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
290 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'D-ring' )
291
292
293
294 DO 20 i = il, in+1, -desca( mb_ )
295 ib =
min( ia+m-i, desca( mb_ ) )
296 j = ja + i - ia
297
298
299
300
301 CALL pzlatrz( ib, ja+n-j, l, a, i, j, desca, tau, work )
302
303 IF( i.GT.ia ) THEN
304
305
306
307
308 CALL pzlarzt(
'Backward',
'Rowwise', l, ib, a, i, jm1,
309 $ desca, tau, work, work( ipw ) )
310
311
312
313 CALL pzlarzb(
'Right',
'No transpose',
'Backward',
314 $ 'Rowwise', i-ia, ja+n-j, ib, l, a, i, jm1,
315 $ desca, work, a, ia, j, desca, work( ipw ) )
316 END IF
317
318 20 CONTINUE
319
320
321
322 CALL pzlatrz( in-ia+1, n, n-m, a, ia, ja, desca, tau, work )
323
324 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
325 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
326
327 END IF
328
329 work( 1 ) = dcmplx( dble( lwmin ) )
330
331 RETURN
332
333
334
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine infog1l(gindx, nb, nprocs, myroc, isrcproc, lindx, rocsrc)
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 pzlarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pzlarzt(direct, storev, n, k, v, iv, jv, descv, tau, t, work)
subroutine pzlatrz(m, n, l, a, ia, ja, desca, tau, work)