3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, K, 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 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 REAL ONE, ZERO
163 parameter( one = 1.0e+0, zero = 0.0e+0 )
164
165
166 LOGICAL LQUERY
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER IACOL, IAROW, I, ICTXT, II, J, KP, LWMIN, MPA0,
169 $ MYCOL, MYROW, NPCOL, NPROW, NQA0
170 REAL TAUI
171
172
176
177
178 INTEGER INDXG2L, INDXG2P, NUMROC
180
181
182 INTRINSIC max,
min, mod, real
183
184
185
186
187
188 ictxt = desca( ctxt_ )
189 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
190
191
192
193 info = 0
194 IF( nprow.EQ.-1 ) THEN
195 info = -(700+ctxt_)
196 ELSE
197 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
198 IF( info.EQ.0 ) THEN
199 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
200 $ nprow )
201 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
202 $ npcol )
203 mpa0 =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
204 $ myrow, iarow, nprow )
205 nqa0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
206 $ mycol, iacol, npcol )
207 lwmin = nqa0 +
max( 1, mpa0 )
208
209 work( 1 ) = real( lwmin )
210 lquery = ( lwork.EQ.-1 )
211 IF( n.LT.m ) THEN
212 info = -2
213 ELSE IF( k.LT.0 .OR. k.GT.m ) THEN
214 info = -3
215 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
216 info = -10
217 END IF
218 END IF
219 END IF
220 IF( info.NE.0 ) THEN
221 CALL pxerbla( ictxt,
'PSORGL2', -info )
222 CALL blacs_abort( ictxt, 1 )
223 RETURN
224 ELSE IF( lquery ) THEN
225 RETURN
226 END IF
227
228
229
230 IF( m.LE.0 )
231 $ RETURN
232
233 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
234 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
235 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
236 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'D-ring' )
237
238 IF( k.LT.m ) THEN
239
240
241
242 CALL pslaset(
'All', m-k, k, zero, zero, a, ia+k, ja, desca )
243 CALL pslaset(
'All', m-k, n-k, zero, one, a, ia+k, ja+k,
244 $ desca )
245
246 END IF
247
248 taui = zero
249 kp =
numroc( ia+k-1, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
250
251 DO 10 i = ia+k-1, ia, -1
252
253
254
255 j = ja + i - ia
256 ii =
indxg2l( i, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
257 iarow =
indxg2p( i, desca( mb_ ), myrow, desca( rsrc_ ),
258 $ nprow )
259 IF( myrow.EQ.iarow )
260 $ taui = tau(
min( ii, kp ) )
261 IF( j.LT.ja+n-1 ) THEN
262 IF( i.LT.ia+m-1 ) THEN
263 CALL pselset( a, i, j, desca, one )
264 CALL pslarf(
'Right', m-i+ia-1, n-j+ja, a, i, j, desca,
265 $ desca( m_ ), tau, a, i+1, j, desca, work )
266 END IF
267 CALL psscal( n-j+ja-1, -taui, a, i, j+1, desca,
268 $ desca( m_ ) )
269 END IF
270 CALL pselset( a, i, j, desca, one-taui )
271
272
273
274 CALL pslaset(
'All', 1, j-ja, zero, zero, a, i, ja, desca )
275
276 10 CONTINUE
277
278 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
279 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
280
281 work( 1 ) = real( lwmin )
282
283 RETURN
284
285
286
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 pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pselset(a, ia, ja, desca, alpha)
subroutine pslarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pxerbla(ictxt, srname, info)