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