3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, K, 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ LLD_, MB_, M_, NB_, N_, RSRC_
159 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
160 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
162 COMPLEX*16 ONE, ZERO
163 parameter( one = ( 1.0d+0, 0.0d+0 ),
164 $ zero = ( 0.0d+0, 0.0d+0 ) )
165
166
167 LOGICAL LQUERY
168 CHARACTER COLBTOP, ROWBTOP
169 INTEGER IACOL, IAROW, ICTXT, J, JJ, LWMIN, MPA0, MYCOL,
170 $ MYROW, NPCOL, NPROW, NQA0
171 COMPLEX*16 TAUJ
172
173
174 EXTERNAL blacs_abort, blacs_gridinfo,
chk1mat,
177
178
179 INTEGER INDXG2L, INDXG2P, NUMROC
181
182
183 INTRINSIC dble, dcmplx,
max,
min, mod
184
185
186
187
188
189 ictxt = desca( ctxt_ )
190 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
191
192
193
194 info = 0
195 IF( nprow.EQ.-1 ) THEN
196 info = -(700+ctxt_)
197 ELSE
198 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
199 IF( info.EQ.0 ) THEN
200 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
201 $ nprow )
202 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
203 $ npcol )
204 mpa0 =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
205 $ myrow, iarow, nprow )
206 nqa0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
207 $ mycol, iacol, npcol )
208 lwmin = mpa0 +
max( 1, nqa0 )
209
210 work( 1 ) = dcmplx( dble( lwmin ) )
211 lquery = ( lwork.EQ.-1 )
212 IF( n.GT.m ) THEN
213 info = -2
214 ELSE IF( k.LT.0 .OR. k.GT.n ) THEN
215 info = -3
216 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
217 info = -10
218 END IF
219 END IF
220 END IF
221 IF( info.NE.0 ) THEN
222 CALL pxerbla( ictxt,
'PZUNG2L', -info )
223 CALL blacs_abort( ictxt, 1 )
224 RETURN
225 ELSE IF( lquery ) THEN
226 RETURN
227 END IF
228
229
230
231 IF( n.LE.0 )
232 $ RETURN
233
234 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
235 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
236 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'I-ring' )
237 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
238
239
240
241 CALL pzlaset(
'All', m-n, n-k, zero, zero, a, ia, ja, desca )
242 CALL pzlaset(
'All', n, n-k, zero, one, a, ia+m-n, ja, desca )
243
244 tauj = zero
245 nqa0 =
max( 1,
numroc( ja+n-1, desca( nb_ ), mycol,
246 $ desca( csrc_ ), npcol ) )
247 DO 10 j = ja+n-k, ja+n-1
248
249
250
251 CALL pzelset( a, ia+m-n+j-ja, j, desca, one )
252 CALL pzlarf(
'Left', m-n+j-ja+1, j-ja, a, ia, j, desca, 1, tau,
253 $ a, ia, ja, desca, work )
254
255 jj =
indxg2l( j, desca( nb_ ), mycol, desca( csrc_ ), npcol )
256 iacol =
indxg2p( j, desca( nb_ ), mycol, desca( csrc_ ),
257 $ npcol )
258 IF( mycol.EQ.iacol )
259 $ tauj = tau(
min( jj, nqa0 ) )
260 CALL pzscal( m-n+j-ja, -tauj, a, ia, j, desca, 1 )
261 CALL pzelset( a, ia+m-n+j-ja, j, desca, one-tauj )
262
263
264
265 CALL pzlaset(
'All', ja+n-1-j, 1, zero, zero, a, ia+m-n+j-ja+1,
266 $ j, desca )
267
268 10 CONTINUE
269
270 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
271 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
272
273 work( 1 ) = dcmplx( dble( lwmin ) )
274
275 RETURN
276
277
278
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pxerbla(ictxt, srname, info)
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pzelset(a, ia, ja, desca, alpha)
subroutine pzlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)