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, J, KP, LWMIN, 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,
'PDORGL2', -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 pdlaset(
'All', m-k, k, zero, zero, a, ia+k, ja, desca )
243 CALL pdlaset(
'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 pdelset( a, i, j, desca, one )
264 CALL pdlarf(
'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 pdscal( n-j+ja-1, -taui, a, i, j+1, desca,
268 $ desca( m_ ) )
269 END IF
270 CALL pdelset( a, i, j, desca, one-taui )
271
272
273
274 CALL pdlaset(
'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 ) = dble( 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 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)