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 D( * )
18 COMPLEX*16 A( * ), WORK( * )
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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
146 $ MB_, NB_, RSRC_, CSRC_, LLD_
147 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
148 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
149 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
150 COMPLEX*16 ZZERO
151 parameter( zzero = 0.0d+0 )
152
153
154 INTEGER CSRC_A, I, IACOL, IAROW, ICOFFA, II, IIROW,
155 $ INDAA, INDTAU, INDWORK, IPOSTPAD, IPREPAD,
156 $ IROFFA, ISIZEHEEVX, ISIZESUBTST, ISIZETST,
157 $ JJCOL, LDAA, LII, LIII, LJJ, LJJJ, LWMIN, MAXI,
158 $ MB_A, MYCOL, MYROW, NB_A, NP, NPCOL, NPROW, NQ,
159 $ RSIZECHK, RSIZEHEEVX, RSIZEQTQ, RSIZESUBTST,
160 $ RSIZETST, RSRC_A, SIZEHEEVX, SIZEMQRLEFT,
161 $ SIZEMQRRIGHT, SIZEQRF, SIZESUBTST, SIZETMS,
162 $ SIZETST,SIZEHEEVD, RSIZEHEEVD, ISIZEHEEVD
163
164
167
168
169 INTEGER INDXG2P, NUMROC
171
172
173
175
176
177
178 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
179 $ rsrc_.LT.0 )RETURN
180
181
182
183 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
184
185
186
187 info = 0
188 IF( nprow.EQ.-1 ) THEN
189 info = -( 700+ctxt_ )
190 ELSE
191 CALL chk1mat( n, 1, n, 1, ia, ja, desca, 7, info )
192 END IF
193
194 ldaa = desca( lld_ )
195 mb_a = desca( mb_ )
196 nb_a = desca( nb_ )
197 rsrc_a = desca( rsrc_ )
198 csrc_a = desca( csrc_ )
199 iarow =
indxg2p( ia, mb_a, myrow, rsrc_a, nprow )
200 iacol =
indxg2p( ja, nb_a, mycol, csrc_a, npcol )
201 iroffa = mod( ia-1, mb_a )
202 icoffa = mod( ja-1, nb_a )
203 np =
numroc( n+iroffa, mb_a, myrow, iarow, nprow )
204 nq =
numroc( n+icoffa, nb_a, mycol, iacol, npcol )
205 iprepad = 0
206 ipostpad = 0
207 CALL pzlasizesep( desca, iprepad, ipostpad, sizemqrleft,
208 $ sizemqrright, sizeqrf, sizetms, rsizeqtq,
209 $ rsizechk, sizeheevx, rsizeheevx, isizeheevx,
210 $ sizeheevd, rsizeheevd, isizeheevd,
211 $ sizesubtst, rsizesubtst, isizesubtst, sizetst,
212 $ rsizetst, isizetst )
213 lwmin = sizetms
214
215
216
217 IF( info.EQ.0 ) THEN
218 IF( k.LT.0 .OR. k.GT.n-1 ) THEN
219 info = -2
220 ELSE IF( n.NE.order ) THEN
221 info = -9
222 ELSE IF( lwork.LT.lwmin ) THEN
223 info = -11
224 END IF
225 END IF
226 IF( info.LT.0 ) THEN
227 CALL pxerbla( desca( ctxt_ ),
'PZLAGHE', -info )
228 RETURN
229 END IF
230
231 indaa = 1
232 indtau = indaa + ldaa*
max( 1, nq )
233 indwork = indtau +
max( 1, nq )
234
235 IF( k.NE.0 ) THEN
236 CALL zlaset( 'A', ldaa, nq, zzero, zzero, work( indaa ), ldaa )
237
238
239
240
241
242 CALL pzmatgen( desca( ctxt_ ),
'N',
'N', n, order,
243 $ desca( mb_ ), desca( nb_ ), work( indaa ),
244 $ desca( lld_ ), desca( rsrc_ ), desca( csrc_ ),
245 $ iseed( 1 ), 0, np, 0, nq, myrow, mycol, nprow,
246 $ npcol )
247 CALL pzgeqrf( n, order, work( indaa ), ia, ja, desca,
248 $ work( indtau ), work( indwork ), sizeqrf, info )
249
250 END IF
251
252
253
254 CALL zlaset( 'A', np, nq, zzero, zzero, a, desca( lld_ ) )
255
256 iirow = 0
257 jjcol = 0
258 lii = 1
259 ljj = 1
260
261 DO 20 ii = 1, n, desca( mb_ )
262 maxi =
min( n, ii+desca( mb_ )-1 )
263 IF( ( myrow.EQ.iirow ) .AND. ( mycol.EQ.jjcol ) ) THEN
264 liii = lii
265 ljjj = ljj
266 DO 10 i = ii, maxi
267 a( liii+( ljjj-1 )*desca( lld_ ) ) = d( i )
268 liii = liii + 1
269 ljjj = ljjj + 1
270 10 CONTINUE
271 END IF
272 IF( myrow.EQ.iirow )
273 $ lii = lii + desca( mb_ )
274 IF( mycol.EQ.jjcol )
275 $ ljj = ljj + desca( mb_ )
276 iirow = mod( iirow+1, nprow )
277 jjcol = mod( jjcol+1, npcol )
278 20 CONTINUE
279
280
281
282 IF( k.NE.0 ) THEN
283
284 CALL pzunmqr(
'L',
'Conjugate transpose', n, n, order,
285 $ work( indaa ), ia, ja, desca, work( indtau ), a,
286 $ ia, ja, desca, work( indwork ), sizemqrleft,
287 $ info )
288
289
290
291
292
293 CALL pzunmqr(
'R',
'N', n, n, order, work( indaa ), ia, ja,
294 $ desca, work( indtau ), a, ia, ja, desca,
295 $ work( indwork ), sizemqrright, info )
296
297 END IF
298
299
300
subroutine pzmatgen(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 pxerbla(ictxt, srname, info)
subroutine pzgeqrf(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pzlasizesep(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, rsizeqtq, rsizechk, sizeheevx, rsizeheevx, isizeheevx, sizeheevd, rsizeheevd, isizeheevd, sizesubtst, rsizesubtst, isizesubtst, sizetst, rsizetst, isizetst)
subroutine pzunmqr(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)