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, LWMIN, MP, 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,
'PCUNGR2', -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', 'I-ring' )
238
239 IF( k.LT.m ) THEN
240
241
242
243 CALL pclaset(
'All', m-k, n-m, zero, zero, a, ia, ja, desca )
244 CALL pclaset(
'All', m-k, m, zero, one, a, ia, ja+n-m, desca )
245
246 END IF
247
248 taui = zero
249 mp =
numroc( ia+m-1, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
250
251 DO 10 i = ia+m-k, ia+m-1
252
253
254
255 CALL pclacgv( i-ia+n-m, a, i, ja, desca, desca( m_ ) )
256 CALL pcelset( a, i, ja+n-m+i-ia, desca, one )
257 CALL pclarfc(
'Right', i-ia, i-ia+n-m+1, a, i, ja, desca,
258 $ desca( m_ ), tau, a, ia, ja, desca, work )
259 ii =
indxg2l( i, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
260 iarow =
indxg2p( i, desca( mb_ ), myrow, desca( rsrc_ ),
261 $ nprow )
262 IF( myrow.EQ.iarow )
263 $ taui = tau(
min( ii, mp ) )
264 CALL pcscal( i-ia+n-m, -taui, a, i, ja, desca, desca( m_ ) )
265 CALL pclacgv( i-ia+n-m, a, i, ja, desca, desca( m_ ) )
266 CALL pcelset( a, i, ja+n-m+i-ia, desca, one-conjg( taui ) )
267
268
269
270 CALL pclaset(
'All', 1, ia+m-1-i, zero, zero, a, i,
271 $ ja+n-m+i-ia+1, desca )
272
273 10 CONTINUE
274
275 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
276 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
277
278 work( 1 ) =
cmplx( real( lwmin ) )
279
280 RETURN
281
282
283
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)