5
6
7
8
9
10
11
12
13 INTEGER IA, INFO, JA, K, LWORK, N, ORDER
14
15
16 INTEGER DESCA( * ), ISEED( 4 )
17 DOUBLE PRECISION A( * ), D( * ), WORK( * )
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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
145 $ MB_, NB_, RSRC_, CSRC_, LLD_
146 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
147 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
148 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
149 DOUBLE PRECISION ZERO
150 parameter( zero = 0.0d+0 )
151
152
153 INTEGER CSRC_A, I, IACOL, IAROW, ICOFFA, II, IIROW,
154 $ INDAA, INDTAU, INDWORK, IPOSTPAD, IPREPAD,
155 $ IROFFA, ISIZESUBTST, ISIZESYEVX, ISIZETST,
156 $ JJCOL, LDAA, LII, LIII, LJJ, LJJJ, LWMIN, MAXI,
157 $ MB_A, MYCOL, MYROW, NB_A, NP, NPCOL, NPROW, NQ,
158 $ RSRC_A, SIZECHK, SIZEMQRLEFT, SIZEMQRRIGHT,
159 $ SIZEQRF, SIZEQTQ, SIZESUBTST, SIZESYEVX,
160 $ SIZETMS, SIZETST
161
162
165
166
167 INTEGER INDXG2P, NUMROC
169
170
171
173
174
175
176 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
177 $ rsrc_.LT.0 )RETURN
178
179
180
181 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
182
183
184
185 info = 0
186 IF( nprow.EQ.-1 ) THEN
187 info = -( 700+ctxt_ )
188 ELSE
189 CALL chk1mat( n, 1, n, 1, ia, ja, desca, 7, info )
190 END IF
191
192 ldaa = desca( lld_ )
193 mb_a = desca( mb_ )
194 nb_a = desca( nb_ )
195 rsrc_a = desca( rsrc_ )
196 csrc_a = desca( csrc_ )
197 iarow =
indxg2p( ia, mb_a, myrow, rsrc_a, nprow )
198 iacol =
indxg2p( ja, nb_a, mycol, csrc_a, npcol )
199 iroffa = mod( ia-1, mb_a )
200 icoffa = mod( ja-1, nb_a )
201 np =
numroc( n+iroffa, mb_a, myrow, iarow, nprow )
202 nq =
numroc( n+icoffa, nb_a, mycol, iacol, npcol )
203 iprepad = 0
204 ipostpad = 0
205 CALL pdlasizesep( desca, iprepad, ipostpad, sizemqrleft,
206 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
207 $ sizechk, sizesyevx, isizesyevx, sizesubtst,
208 $ isizesubtst, sizetst, isizetst )
209 lwmin = sizetms
210
211
212
213 IF( info.EQ.0 ) THEN
214 IF( k.LT.0 .OR. k.GT.n-1 ) THEN
215 info = -2
216 ELSE IF( n.NE.order ) THEN
217 info = -9
218 ELSE IF( lwork.LT.lwmin ) THEN
219 info = -11
220 END IF
221 END IF
222 IF( info.LT.0 ) THEN
223 CALL pxerbla( desca( ctxt_ ),
'PDLAGSY', -info )
224 RETURN
225 END IF
226
227 indaa = 1
228 indtau = indaa + ldaa*
max( 1, nq )
229 indwork = indtau +
max( 1, nq )
230
231 IF( k.NE.0 ) THEN
232 CALL dlaset( 'A', ldaa, nq, zero, zero, work( indaa ), ldaa )
233
234
235
236
237
238 CALL pdmatgen( desca( ctxt_ ),
'N',
'N', n, order,
239 $ desca( mb_ ), desca( nb_ ), work( indaa ),
240 $ desca( lld_ ), desca( rsrc_ ), desca( csrc_ ),
241 $ iseed( 1 ), 0, np, 0, nq, myrow, mycol, nprow,
242 $ npcol )
243 CALL pdgeqrf( n, order, work( indaa ), ia, ja, desca,
244 $ work( indtau ), work( indwork ), sizeqrf, info )
245
246 END IF
247
248
249
250 CALL dlaset( 'A', np, nq, zero, zero, a, desca( lld_ ) )
251
252 iirow = 0
253 jjcol = 0
254 lii = 1
255 ljj = 1
256
257 DO 20 ii = 1, n, desca( mb_ )
258 maxi =
min( n, ii+desca( mb_ )-1 )
259 IF( ( myrow.EQ.iirow ) .AND. ( mycol.EQ.jjcol ) ) THEN
260 liii = lii
261 ljjj = ljj
262 DO 10 i = ii, maxi
263 a( liii+( ljjj-1 )*desca( lld_ ) ) = d( i )
264 liii = liii + 1
265 ljjj = ljjj + 1
266 10 CONTINUE
267 END IF
268 IF( myrow.EQ.iirow )
269 $ lii = lii + desca( mb_ )
270 IF( mycol.EQ.jjcol )
271 $ ljj = ljj + desca( mb_ )
272 iirow = mod( iirow+1, nprow )
273 jjcol = mod( jjcol+1, npcol )
274 20 CONTINUE
275
276
277
278 IF( k.NE.0 ) THEN
279
280 CALL pdormqr(
'L',
'Transpose', n, n, order, work( indaa ), ia,
281 $ ja, desca, work( indtau ), a, ia, ja, desca,
282 $ work( indwork ), sizemqrleft, info )
283
284
285
286
287
288 CALL pdormqr(
'R',
'N', n, n, order, work( indaa ), ia, ja,
289 $ desca, work( indtau ), a, ia, ja, desca,
290 $ work( indwork ), sizemqrright, info )
291
292 END IF
293
294
295
subroutine pdmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdgeqrf(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pdlasizesep(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, sizeqtq, sizechk, sizesyevx, isizesyevx, sizesubtst, isizesubtst, sizetst, isizetst)
subroutine pdormqr(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)
subroutine pxerbla(ictxt, srname, info)