3
4
5
6
7
8
9
10 INTEGER IA, IY, JA, JY, K, N, NB
11
12
13 INTEGER DESCA( * ), DESCY( * )
14 COMPLEX 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 ONE, ZERO
138 parameter( one = ( 1.0e+0, 0.0e+0 ),
139 $ zero = ( 0.0e+0, 0.0e+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 EI
146
147
148 INTEGER DESCW( DLEN_ )
149
150
151 INTEGER NUMROC
153
154
155 EXTERNAL blacs_gridinfo, caxpy, ccopy, cscal,
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 pclacgv( l-1, a, i, ja, desca, desca( m_ ) )
198 CALL pcgemv( '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 pclacgv( 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 ccopy( l-1, a( (jj+l-2)*desca( lld_ )+ii ), 1,
215 $ work( jw ), 1 )
216 CALL ctrmv( '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 pcgemv( '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 ctrmv( 'Upper', 'Conjugate transpose', 'Non-unit',
231 $ l-1, t, desca( nb_ ), work( jw ), 1 )
232
233
234
235 CALL pcgemv( '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 ctrmv( 'Lower', 'No transpose', 'Unit', l-1,
243 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
244 $ work( jw ), 1 )
245 CALL caxpy( l-1, -one, work( jw ), 1,
246 $ a( ( jj+l-2 )*desca( lld_ )+ii ), 1 )
247 END IF
248 CALL pcelset( a, i, j-1, desca, ei )
249 END IF
250
251
252
253
254 CALL pclarfg( n-k-l+1, ei, i+1, j, a,
min( i+2, n+ia-1 ), j,
255 $ desca, 1, tau )
256 CALL pcelset( a, i+1, j, desca, one )
257
258
259
260 CALL pcgemv( '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 pcgemv( '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 pcgemv( '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 pcscal( 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 cscal( l-1, -tau( jl ), work( jw ), 1 )
277 CALL ccopy( l-1, work( jw ), 1, t( jt+1 ), 1 )
278 CALL ctrmv( '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 pcelset( 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 pcelset(a, ia, ja, desca, alpha)
subroutine pclacgv(n, x, ix, jx, descx, incx)
subroutine pclarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)