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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
165 $ LLD_, MB_, M_, NB_, N_, RSRC_
166 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
167 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
168 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
169 REAL ONE
170 parameter( one = 1.0e+0 )
171
172
173 LOGICAL LQUERY
174 CHARACTER COLBTOP, ROWBTOP
175 INTEGER IACOL, IAROW, I, ICTXT, J, K, LWMIN, MP, MYCOL,
176 $ MYROW, NPCOL, NPROW, NQ
177 REAL AII
178
179
182
183
184 INTEGER INDXG2P, NUMROC
186
187
188 INTRINSIC max,
min, mod, real
189
190
191
192
193
194 ictxt = desca( ctxt_ )
195 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
196
197
198
199 info = 0
200 IF( nprow.EQ.-1 ) THEN
201 info = -(600+ctxt_)
202 ELSE
203 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
204 IF( info.EQ.0 ) THEN
205 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
206 $ nprow )
207 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
208 $ npcol )
209 mp =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
210 $ myrow, iarow, nprow )
211 nq =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
212 $ mycol, iacol, npcol )
213 lwmin = nq +
max( 1, mp )
214
215 work( 1 ) = real( lwmin )
216 lquery = ( lwork.EQ.-1 )
217 IF( lwork.LT.lwmin .AND. .NOT.lquery )
218 $ info = -9
219 END IF
220 END IF
221
222 IF( info.NE.0 ) THEN
223 CALL pxerbla( ictxt,
'PSGELQ2', -info )
224 CALL blacs_abort( ictxt, 1 )
225 RETURN
226 ELSE IF( lquery ) THEN
227 RETURN
228 END IF
229
230
231
232 IF( m.EQ.0 .OR. n.EQ.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', ' ' )
238 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'I-ring' )
239
241 DO 10 i = ia, ia+k-1
242 j = ja + i - ia
243
244
245
246
247 CALL pslarfg( n-j+ja, aii, i, j, a, i,
min( j+1, ja+n-1 ),
248 $ desca, desca( m_ ), tau )
249
250 IF( i.LT.ia+m-1 ) THEN
251
252
253
254 CALL pselset( a, i, j, desca, one )
255 CALL pslarf(
'Right', m-i+ia-1, n-j+ja, a, i, j, desca,
256 $ desca( m_ ), tau, a, i+1, j, desca, work )
257 END IF
258 CALL pselset( a, i, j, desca, aii )
259
260 10 CONTINUE
261
262 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
263 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
264
265 work( 1 ) = real( lwmin )
266
267 RETURN
268
269
270
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
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)