3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, K, LWORK, M, N
11
12
13 INTEGER DESCA( * )
14 DOUBLE PRECISION 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 DOUBLE PRECISION ONE, ZERO
163 parameter( one = 1.0d+0, zero = 0.0d+0 )
164
165
166 LOGICAL LQUERY
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER IACOL, IAROW, I, ICTXT, II, LWMIN, MP, MPA0,
169 $ MYCOL, MYROW, NPCOL, NPROW, NQA0
170 DOUBLE PRECISION TAUI
171
172
176
177
178 INTEGER INDXG2L, INDXG2P, NUMROC
180
181
182 INTRINSIC dble,
max,
min, mod
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 ) = dble( 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,
'PDORGR2', -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', 'I-ring' )
237
238 IF( k.LT.m ) THEN
239
240
241
242 CALL pdlaset(
'All', m-k, n-m, zero, zero, a, ia, ja, desca )
243 CALL pdlaset(
'All', m-k, m, zero, one, a, ia, ja+n-m, desca )
244
245 END IF
246
247 taui = zero
248 mp =
numroc( ia+m-1, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
249
250 DO 10 i = ia+m-k, ia+m-1
251
252
253
254 CALL pdelset( a, i, ja+n-m+i-ia, desca, one )
255 CALL pdlarf(
'Right', i-ia, i-ia+n-m+1, a, i, ja, desca,
256 $ desca( m_ ), tau, a, ia, ja, desca, work )
257 ii =
indxg2l( i, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
258 iarow =
indxg2p( i, desca( mb_ ), myrow, desca( rsrc_ ),
259 $ nprow )
260 IF( myrow.EQ.iarow )
261 $ taui = tau(
min( ii, mp ) )
262 CALL pdscal( i-ia+n-m, -taui, a, i, ja, desca, desca( m_ ) )
263 CALL pdelset( a, i, ja+n-m+i-ia, desca, one-taui )
264
265
266
267 CALL pdlaset(
'All', 1, ia+m-1-i, zero, zero, a, i,
268 $ ja+n-m+i-ia+1, 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 ) = dble( 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 pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pdelset(a, ia, ja, desca, alpha)
subroutine pdlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pxerbla(ictxt, srname, info)