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 ZERO
164 parameter( zero = 0.0e+0 )
165
166
167 LOGICAL LQUERY
168 CHARACTER COLBTOP, ROWBTOP
169 INTEGER I, IACOL, IAROW, IB, ICTXT, IINFO, IN, IPW,
170 $ LWMIN, MPA0, MYCOL, MYROW, NPCOL, NPROW, NQA0
171
172
173 INTEGER IDUM1( 2 ), IDUM2( 2 )
174
175
179
180
181 INTEGER ICEIL, INDXG2P, NUMROC
183
184
185 INTRINSIC min, mod, real
186
187
188
189
190
191 ictxt = desca( ctxt_ )
192 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
193
194
195
196 info = 0
197 IF( nprow.EQ.-1 ) THEN
198 info = -(700+ctxt_)
199 ELSE
200 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
201 IF( info.EQ.0 ) THEN
202 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
203 $ nprow )
204 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
205 $ npcol )
206 mpa0 =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
207 $ myrow, iarow, nprow )
208 nqa0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
209 $ mycol, iacol, npcol )
210 lwmin = desca( mb_ ) * ( mpa0 + nqa0 + desca( mb_ ) )
211
212 work( 1 ) = real( lwmin )
213 lquery = ( lwork.EQ.-1 )
214 IF( n.LT.m ) THEN
215 info = -2
216 ELSE IF( k.LT.0 .OR. k.GT.m ) THEN
217 info = -3
218 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
219 info = -10
220 END IF
221 END IF
222 idum1( 1 ) = k
223 idum2( 1 ) = 3
224 IF( lwork.EQ.-1 ) THEN
225 idum1( 2 ) = -1
226 ELSE
227 idum1( 2 ) = 1
228 END IF
229 idum2( 2 ) = 10
230 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 7, 2, idum1, idum2,
231 $ info )
232 END IF
233
234 IF( info.NE.0 ) THEN
235 CALL pxerbla( ictxt,
'PSORGRQ', -info )
236 RETURN
237 ELSE IF( lquery ) THEN
238 RETURN
239 END IF
240
241
242
243 IF( m.LE.0 )
244 $ RETURN
245
246 ipw = desca( mb_ )*desca( mb_ ) + 1
247 in =
min(
iceil( ia+m-k, desca( mb_ ) )*desca( mb_ ), ia+m-1 )
248 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
249 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
250 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
251 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'I-ring' )
252
253
254
255 CALL pslaset(
'All', in-ia+1, m-in+ia-1, zero, zero, a, ia,
256 $ ja+n-m+in-ia+1, desca )
257
258
259
260 CALL psorgr2( in-ia+1, n-m+in-ia+1, in-ia-m+k+1, a, ia, ja, desca,
261 $ tau, work, lwork, iinfo )
262
263
264
265 DO 10 i = in+1, ia+m-1, desca( mb_ )
266 ib =
min( ia+m-i, desca( mb_ ) )
267
268
269
270
271 CALL pslarft(
'Backward',
'Rowwise', n-m+i+ib-ia, ib, a, i, ja,
272 $ desca, tau, work, work( ipw ) )
273
274
275
276 CALL pslarfb(
'Right',
'Transpose',
'Backward',
'Rowwise',
277 $ i-ia, n-m+i+ib-ia, ib, a, i, ja, desca, work, a,
278 $ ia, ja, desca, work( ipw ) )
279
280
281
282 CALL psorgr2( ib, n-m+i+ib-ia, ib, a, i, ja, desca, tau, work,
283 $ lwork, iinfo )
284
285
286
287
288 CALL pslaset(
'All', ib, m-i-ib+ia, zero, zero, a, i,
289 $ ja+n-m+i+ib-ia, desca )
290
291 10 CONTINUE
292
293 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
294 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
295
296 work( 1 ) = real( lwmin )
297
298 RETURN
299
300
301
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pslarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pslarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)
subroutine psorgr2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)
subroutine pxerbla(ictxt, srname, info)