3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, LWORK, M, N
11
12
13 INTEGER DESCA( * )
14 REAL 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
166 $ LLD_, MB_, M_, NB_, N_, RSRC_
167 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
168 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
169 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
170 REAL ONE
171 parameter( one = 1.0e+0 )
172
173
174 LOGICAL LQUERY
175 CHARACTER COLBTOP, ROWBTOP
176 INTEGER I, IACOL, IAROW, ICTXT, II, J, JJ, K, LWMIN,
177 $ MP, MYCOL, MYROW, NPCOL, NPROW, NQ
178 REAL AJJ, ALPHA
179
180
183 $ pb_topset,
pxerbla, sgebr2d, sgebs2d,
184 $ slarfg, sscal
185
186
187 INTEGER INDXG2P, NUMROC
189
190
191 INTRINSIC max,
min, mod, real
192
193
194
195
196
197 ictxt = desca( ctxt_ )
198 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
199
200
201
202 info = 0
203 IF( nprow.EQ.-1 ) THEN
204 info = -(600+ctxt_)
205 ELSE
206 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
207 IF( info.EQ.0 ) THEN
208 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
209 $ nprow )
210 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
211 $ npcol )
212 mp =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
213 $ myrow, iarow, nprow )
214 nq =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
215 $ mycol, iacol, npcol )
216 lwmin = mp +
max( 1, nq )
217
218 work( 1 ) = real( lwmin )
219 lquery = ( lwork.EQ.-1 )
220 IF( lwork.LT.lwmin .AND. .NOT.lquery )
221 $ info = -9
222 END IF
223 END IF
224
225 IF( info.NE.0 ) THEN
226 CALL pxerbla( ictxt,
'PSGEQL2', -info )
227 CALL blacs_abort( ictxt, 1 )
228 RETURN
229 ELSE IF( lquery ) THEN
230 RETURN
231 END IF
232
233
234
235 IF( m.EQ.0 .OR. n.EQ.0 )
236 $ RETURN
237
238 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
239 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
240 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'D-ring' )
241 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
242
243 IF( desca( m_ ).EQ.1 ) THEN
244 IF( mycol.EQ.iacol )
245 $ nq = nq - mod( ja-1, desca( nb_ ) )
246 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
247 $ jj, iarow, iacol )
248 iacol =
indxg2p( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
249 $ npcol )
250 IF( myrow.EQ.iarow ) THEN
251 IF( mycol.EQ.iacol ) THEN
252 i = ii+(jj+nq-2)*desca( lld_ )
253 ajj = a( i )
254 CALL slarfg( 1, ajj, a( i ), 1, tau( jj+nq-1 ) )
255 IF( n.GT.1 ) THEN
256 alpha = one - tau( jj+nq-1 )
257 CALL sgebs2d( ictxt, 'Rowwise', ' ', 1, 1, alpha, 1 )
258 CALL sscal( nq-1, alpha, a( ii+(jj-1)*desca( lld_ ) ),
259 $ desca( lld_ ) )
260 END IF
261 CALL sgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
262 $ tau( jj+nq-1 ), 1 )
263 a( i ) = ajj
264 ELSE
265 IF( n.GT.1 ) THEN
266 CALL sgebr2d( ictxt, 'Rowwise', ' ', 1, 1, alpha,
267 $ 1, iarow, iacol )
268 CALL sscal( nq, alpha, a( ii+(jj-1)*desca( lld_ ) ),
269 $ desca( lld_ ) )
270 END IF
271 END IF
272 ELSE IF( mycol.EQ.iacol ) THEN
273 CALL sgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
274 $ tau( jj+nq-1 ), 1, iarow, iacol )
275 END IF
276
277 ELSE
278
280 DO 10 j = ja+k-1, ja, -1
281 i = ia + j - ja
282
283
284
285
286 CALL pslarfg( m-k+i-ia+1, ajj, m-k+i, n-k+j, a, ia,
287 $ n-k+j, desca, 1, tau )
288
289
290
291 CALL pselset( a, i+m-k, j+n-k, desca, one )
292 CALL pslarf(
'Left', m-k+i-ia+1, n-k+j-ja, a, ia, n-k+j,
293 $ desca, 1, tau, a, ia, ja, desca, work )
294 CALL pselset( a, i+m-k, j+n-k, desca, ajj )
295
296 10 CONTINUE
297
298 END IF
299
300 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
301 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
302
303 work( 1 ) = real( lwmin )
304
305 RETURN
306
307
308
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pselset(a, ia, ja, desca, alpha)
subroutine pslarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pslarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)
subroutine pxerbla(ictxt, srname, info)