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 REAL 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 REAL ZERO
150 parameter( zero = 0.0e+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 pslasizesep( 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_ ),
'PSLAGSY', -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 slaset( 'A', ldaa, nq, zero, zero, work( indaa ), ldaa )
233
234
235
236
237
238 CALL psmatgen( 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 psgeqrf( n, order, work( indaa ), ia, ja, desca,
244 $ work( indtau ), work( indwork ), sizeqrf, info )
245
246 END IF
247
248
249
250 CALL slaset( '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 psormqr(
'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 psormqr(
'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 psmatgen(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 psgeqrf(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pslasizesep(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, sizeqtq, sizechk, sizesyevx, isizesyevx, sizesubtst, isizesubtst, sizetst, isizetst)
subroutine psormqr(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)
subroutine pxerbla(ictxt, srname, info)