3
4
5
6
7
8
9
10 INTEGER IA, IY, JA, JY, K, N, NB
11
12
13 INTEGER DESCA( * ), DESCY( * )
14 REAL 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 REAL ONE, ZERO
138 parameter( one = 1.0e+0, zero = 0.0e+0 )
139
140
141 LOGICAL IPROC
142 INTEGER I, IACOL, IAROW, ICTXT, IOFF, II, J, JJ, JL,
143 $ JT, JW, L, MYROW, MYCOL, NPCOL, NPROW, NQ
144 REAL EI
145
146
147 INTEGER DESCW( DLEN_ )
148
149
150 INTEGER NUMROC
152
153
155 $ psgemv,
pslarfg, psscal, saxpy,
156 $ scopy, sscal, strmv
157
158
160
161
162
163
164
165 IF( n.LE.1 )
166 $ RETURN
167
168 ictxt = desca( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
170
171 ioff = mod( ja-1, desca( nb_ ) )
172 CALL infog2l( ia+k, ja, desca, nprow, npcol, myrow, mycol, ii,
173 $ jj, iarow, iacol )
174
175 iproc = ( myrow.EQ.iarow .AND. mycol.EQ.iacol )
176 nq =
numroc( n+ja-1, desca( nb_ ), mycol, iacol, npcol )
177 IF( mycol.EQ.iacol )
178 $ nq = nq - ioff
179
180 ei = zero
181
182 jw = ioff + 1
183 CALL descset( descw, 1, desca( mb_ ), 1, desca( mb_ ), iarow,
184 $ iacol, ictxt, 1 )
185
186 DO 10 l = 1, nb
187 i = ia + k + l - 2
188 j = ja + l - 1
189
190 IF( l.GT.1 ) THEN
191
192
193
194
195
196 CALL psgemv( 'No transpose', n, l-1, -one, y, iy, jy, descy,
197 $ a, i, ja, desca, desca( m_ ), one, a, ia, j,
198 $ desca, 1 )
199
200
201
202
203
204
205
206
207
208
209
210 IF( iproc ) THEN
211 CALL scopy( l-1, a( (jj+l-2)*desca( lld_ )+ii ), 1,
212 $ work( jw ), 1 )
213 CALL strmv( 'Lower', 'Transpose', 'Unit', l-1,
214 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
215 $ work( jw ), 1 )
216 END IF
217
218
219
220 CALL psgemv( 'Transpose', n-k-l+1, l-1, one, a, i+1, ja,
221 $ desca, a, i+1, j, desca, 1, one, work, 1, jw,
222 $ descw, descw( m_ ) )
223
224
225
226 IF( iproc )
227 $ CALL strmv( 'Upper', 'Transpose', 'Non-unit', l-1, t,
228 $ desca( nb_ ), work( jw ), 1 )
229
230
231
232 CALL psgemv( 'No transpose', n-k-l+1, l-1, -one, a, i+1, ja,
233 $ desca, work, 1, jw, descw, descw( m_ ), one,
234 $ a, i+1, j, desca, 1 )
235
236
237
238 IF( iproc ) THEN
239 CALL strmv( 'Lower', 'No transpose', 'Unit', l-1,
240 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
241 $ work( jw ), 1 )
242 CALL saxpy( l-1, -one, work( jw ), 1,
243 $ a( ( jj+l-2 )*desca( lld_ )+ii ), 1 )
244 END IF
245 CALL pselset( a, i, j-1, desca, ei )
246 END IF
247
248
249
250
251 CALL pslarfg( n-k-l+1, ei, i+1, j, a,
min( i+2, n+ia-1 ), j,
252 $ desca, 1, tau )
253 CALL pselset( a, i+1, j, desca, one )
254
255
256
257 CALL psgemv( 'No transpose', n, n-k-l+1, one, a, ia, j+1,
258 $ desca, a, i+1, j, desca, 1, zero, y, iy, jy+l-1,
259 $ descy, 1 )
260 CALL psgemv( 'Transpose', n-k-l+1, l-1, one, a, i+1, ja, desca,
261 $ a, i+1, j, desca, 1, zero, work, 1, jw, descw,
262 $ descw( m_ ) )
263 CALL psgemv( 'No transpose', n, l-1, -one, y, iy, jy, descy,
264 $ work, 1, jw, descw, descw( m_ ), one, y, iy,
265 $ jy+l-1, descy, 1 )
266 jl =
min( jj+l-1, ja+nq-1 )
267 CALL psscal( n, tau( jl ), y, iy, jy+l-1, descy, 1 )
268
269
270
271 IF( iproc ) THEN
272 jt = ( l-1 ) * desca( nb_ )
273 CALL sscal( l-1, -tau( jl ), work( jw ), 1 )
274 CALL scopy( l-1, work( jw ), 1, t( jt+1 ), 1 )
275 CALL strmv( 'Upper', 'No transpose', 'Non-unit', l-1, t,
276 $ desca( nb_ ), t( jt+1 ), 1 )
277 t( jt+l ) = tau( jl )
278 END IF
279 10 CONTINUE
280
281 CALL pselset( a, k+nb+ia-1, j, desca, ei )
282
283 RETURN
284
285
286
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 pselset(a, ia, ja, desca, alpha)
subroutine pslarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)