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