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, ICTXT, J, JJ, LWMIN, MPA0, MYCOL,
169 $ MYROW, NPCOL, NPROW, NQA0
170 REAL TAUJ
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 = mpa0 +
max( 1, nqa0 )
208
209 work( 1 ) = real( lwmin )
210 lquery = ( lwork.EQ.-1 )
211 IF( n.GT.m ) THEN
212 info = -2
213 ELSE IF( k.LT.0 .OR. k.GT.n ) 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,
'PSORG2L', -info )
222 CALL blacs_abort( ictxt, 1 )
223 RETURN
224 ELSE IF( lquery ) THEN
225 RETURN
226 END IF
227
228
229
230 IF( n.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', 'I-ring' )
236 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
237
238
239
240 CALL pslaset(
'All', m-n, n-k, zero, zero, a, ia, ja, desca )
241 CALL pslaset(
'All', n, n-k, zero, one, a, ia+m-n, ja, desca )
242
243 tauj = zero
244 nqa0 =
max( 1,
numroc( ja+n-1, desca( nb_ ), mycol,
245 $ desca( csrc_ ), npcol ) )
246 DO 10 j = ja+n-k, ja+n-1
247
248
249
250 CALL pselset( a, ia+m-n+j-ja, j, desca, one )
251 CALL pslarf(
'Left', m-n+j-ja+1, j-ja, a, ia, j, desca, 1, tau,
252 $ a, ia, ja, desca, work )
253
254 jj =
indxg2l( j, desca( nb_ ), mycol, desca( csrc_ ), npcol )
255 iacol =
indxg2p( j, desca( nb_ ), mycol, desca( csrc_ ),
256 $ npcol )
257 IF( mycol.EQ.iacol )
258 $ tauj = tau(
min( jj, nqa0 ) )
259 CALL psscal( m-n+j-ja, -tauj, a, ia, j, desca, 1 )
260 CALL pselset( a, ia+m-n+j-ja, j, desca, one-tauj )
261
262
263
264 CALL pslaset(
'All', ja+n-1-j, 1, zero, zero, a, ia+m-n+j-ja+1,
265 $ j, desca )
266
267 10 CONTINUE
268
269 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
270 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
271
272 work( 1 ) = real( lwmin )
273
274 RETURN
275
276
277
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)