3
4
5
6
7
8
9
10 INTEGER IA, IY, JA, JY, K, N, NB
11
12
13 INTEGER DESCA( * ), DESCY( * )
14 COMPLEX*16 A( * ), T( * ), TAU( * ), WORK( * ), Y( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
133 $ LLD_, MB_, M_, NB_, N_, RSRC_
134 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
135 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
136 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
137 COMPLEX*16 ONE, ZERO
138 parameter( one = ( 1.0d+0, 0.0d+0 ),
139 $ zero = ( 0.0d+0, 0.0d+0 ) )
140
141
142 LOGICAL IPROC
143 INTEGER I, IACOL, IAROW, ICTXT, IOFF, II, J, JJ, JL,
144 $ JT, JW, L, MYROW, MYCOL, NPCOL, NPROW, NQ
145 COMPLEX*16 EI
146
147
148 INTEGER DESCW( DLEN_ )
149
150
151 INTEGER NUMROC
153
154
157 $ zaxpy, zcopy, zscal, ztrmv
158
159
161
162
163
164
165
166 IF( n.LE.1 )
167 $ RETURN
168
169 ictxt = desca( ctxt_ )
170 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
171
172 ioff = mod( ja-1, desca( nb_ ) )
173 CALL infog2l( ia+k, ja, desca, nprow, npcol, myrow, mycol, ii,
174 $ jj, iarow, iacol )
175
176 iproc = ( myrow.EQ.iarow .AND. mycol.EQ.iacol )
177 nq =
numroc( n+ja-1, desca( nb_ ), mycol, iacol, npcol )
178 IF( mycol.EQ.iacol )
179 $ nq = nq - ioff
180
181 ei = zero
182
183 jw = ioff + 1
184 CALL descset( descw, 1, desca( mb_ ), 1, desca( mb_ ), iarow,
185 $ iacol, ictxt, 1 )
186
187 DO 10 l = 1, nb
188 i = ia + k + l - 2
189 j = ja + l - 1
190
191 IF( l.GT.1 ) THEN
192
193
194
195
196
197 CALL pzlacgv( l-1, a, i, ja, desca, desca( m_ ) )
198 CALL pzgemv( 'No transpose', n, l-1, -one, y, iy, jy, descy,
199 $ a, i, ja, desca, desca( m_ ), one, a, ia, j,
200 $ desca, 1 )
201 CALL pzlacgv( l-1, a, i, ja, desca, desca( m_ ) )
202
203
204
205
206
207
208
209
210
211
212
213 IF( iproc ) THEN
214 CALL zcopy( l-1, a( (jj+l-2)*desca( lld_ )+ii ), 1,
215 $ work( jw ), 1 )
216 CALL ztrmv( 'Lower', 'Conjugate transpose', 'Unit', l-1,
217 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
218 $ work( jw ), 1 )
219 END IF
220
221
222
223 CALL pzgemv( 'Conjugate transpose', n-k-l+1, l-1, one, a,
224 $ i+1, ja, desca, a, i+1, j, desca, 1, one, work,
225 $ 1, jw, descw, descw( m_ ) )
226
227
228
229 IF( iproc )
230 $ CALL ztrmv( 'Upper', 'Conjugate transpose', 'Non-unit',
231 $ l-1, t, desca( nb_ ), work( jw ), 1 )
232
233
234
235 CALL pzgemv( 'No transpose', n-k-l+1, l-1, -one, a, i+1, ja,
236 $ desca, work, 1, jw, descw, descw( m_ ), one,
237 $ a, i+1, j, desca, 1 )
238
239
240
241 IF( iproc ) THEN
242 CALL ztrmv( 'Lower', 'No transpose', 'Unit', l-1,
243 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
244 $ work( jw ), 1 )
245 CALL zaxpy( l-1, -one, work( jw ), 1,
246 $ a( ( jj+l-2 )*desca( lld_ )+ii ), 1 )
247 END IF
248 CALL pzelset( a, i, j-1, desca, ei )
249 END IF
250
251
252
253
254 CALL pzlarfg( n-k-l+1, ei, i+1, j, a,
min( i+2, n+ia-1 ), j,
255 $ desca, 1, tau )
256 CALL pzelset( a, i+1, j, desca, one )
257
258
259
260 CALL pzgemv( 'No transpose', n, n-k-l+1, one, a, ia, j+1,
261 $ desca, a, i+1, j, desca, 1, zero, y, iy, jy+l-1,
262 $ descy, 1 )
263 CALL pzgemv( 'Conjugate transpose', n-k-l+1, l-1, one, a, i+1,
264 $ ja, desca, a, i+1, j, desca, 1, zero, work, 1, jw,
265 $ descw, descw( m_ ) )
266 CALL pzgemv( 'No transpose', n, l-1, -one, y, iy, jy, descy,
267 $ work, 1, jw, descw, descw( m_ ), one, y, iy,
268 $ jy+l-1, descy, 1 )
269 jl =
min( jj+l-1, ja+nq-1 )
270 CALL pzscal( n, tau( jl ), y, iy, jy+l-1, descy, 1 )
271
272
273
274 IF( iproc ) THEN
275 jt = ( l-1 ) * desca( nb_ )
276 CALL zscal( l-1, -tau( jl ), work( jw ), 1 )
277 CALL zcopy( l-1, work( jw ), 1, t( jt+1 ), 1 )
278 CALL ztrmv( 'Upper', 'No transpose', 'Non-unit', l-1, t,
279 $ desca( nb_ ), t( jt+1 ), 1 )
280 t( jt+l ) = tau( jl )
281 END IF
282 10 CONTINUE
283
284 CALL pzelset( a, k+nb+ia-1, j, desca, ei )
285
286 RETURN
287
288
289
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pzelset(a, ia, ja, desca, alpha)
subroutine pzlacgv(n, x, ix, jx, descx, incx)
subroutine pzlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)