3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, K, LWORK, M, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX 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 ONE, ZERO
163 parameter( one = ( 1.0e+0, 0.0e+0 ),
164 $ zero = ( 0.0e+0, 0.0e+0 ) )
165
166
167 LOGICAL LQUERY
168 CHARACTER COLBTOP, ROWBTOP
169 INTEGER IACOL, IAROW, I, ICTXT, II, J, KP, LWMIN, MPA0,
170 $ MYCOL, MYROW, NPCOL, NPROW, NQA0
171 COMPLEX TAUI
172
173
176 $ pb_topget, pb_topset,
pxerbla
177
178
179 INTEGER INDXG2L, INDXG2P, NUMROC
181
182
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 = nqa0 +
max( 1, mpa0 )
209
210 work( 1 ) =
cmplx( real( lwmin ) )
211 lquery = ( lwork.EQ.-1 )
212 IF( n.LT.m ) THEN
213 info = -2
214 ELSE IF( k.LT.0 .OR. k.GT.m ) 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,
'PCUNGL2', -info )
223 CALL blacs_abort( ictxt, 1 )
224 RETURN
225 ELSE IF( lquery ) THEN
226 RETURN
227 END IF
228
229
230
231 IF( m.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', ' ' )
237 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'D-ring' )
238
239 IF( k.LT.m ) THEN
240
241
242
243 CALL pclaset(
'All', m-k, k, zero, zero, a, ia+k, ja, desca )
244 CALL pclaset(
'All', m-k, n-k, zero, one, a, ia+k, ja+k,
245 $ desca )
246
247 END IF
248
249 taui = zero
250 kp =
numroc( ia+k-1, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
251
252 DO 10 i = ia+k-1, ia, -1
253
254
255
256 j = ja + i - ia
257 ii =
indxg2l( i, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
258 iarow =
indxg2p( i, desca( mb_ ), myrow, desca( rsrc_ ),
259 $ nprow )
260 IF( myrow.EQ.iarow )
261 $ taui = tau(
min( ii, kp ) )
262 IF( j.LT.ja+n-1 ) THEN
263 CALL pclacgv( n-j+ja-1, a, i, j+1, desca, desca( m_ ) )
264 IF( i.LT.ia+m-1 ) THEN
265 CALL pcelset( a, i, j, desca, one )
266 CALL pclarfc(
'Right', m-i+ia-1, n-j+ja, a, i, j, desca,
267 $ desca( m_ ), tau, a, i+1, j, desca, work )
268 END IF
269 CALL pcscal( n-j+ja-1, -taui, a, i, j+1, desca,
270 $ desca( m_ ) )
271 CALL pclacgv( n-j+ja-1, a, i, j+1, desca, desca( m_ ) )
272 END IF
273 CALL pcelset( a, i, j, desca, one-conjg( taui ) )
274
275
276
277 CALL pclaset(
'All', 1, j-ja, zero, zero, a, i, ja, desca )
278
279 10 CONTINUE
280
281 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
282 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
283
284 work( 1 ) =
cmplx( real( lwmin ) )
285
286 RETURN
287
288
289
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 pclaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pcelset(a, ia, ja, desca, alpha)
subroutine pclacgv(n, x, ix, jx, descx, incx)
subroutine pclarfc(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pxerbla(ictxt, srname, info)