3
4
5
6
7
8
9
10 INTEGER IA, IY, JA, JY, K, N, NB
11
12
13 INTEGER DESCA( * ), DESCY( * )
14 DOUBLE PRECISION 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 DOUBLE PRECISION ONE, ZERO
138 parameter( one = 1.0d+0, zero = 0.0d+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 DOUBLE PRECISION EI
145
146
147 INTEGER DESCW( DLEN_ )
148
149
150 INTEGER NUMROC
152
153
154 EXTERNAL blacs_gridinfo, daxpy,
descset, dcopy,
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 pdgemv( '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 dcopy( l-1, a( (jj+l-2)*desca( lld_ )+ii ), 1,
212 $ work( jw ), 1 )
213 CALL dtrmv( '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 pdgemv( '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 dtrmv( 'Upper', 'Transpose', 'Non-unit', l-1, t,
228 $ desca( nb_ ), work( jw ), 1 )
229
230
231
232 CALL pdgemv( '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 dtrmv( 'Lower', 'No transpose', 'Unit', l-1,
240 $ a( (jj-1)*desca( lld_ )+ii ), desca( lld_ ),
241 $ work( jw ), 1 )
242 CALL daxpy( l-1, -one, work( jw ), 1,
243 $ a( ( jj+l-2 )*desca( lld_ )+ii ), 1 )
244 END IF
245 CALL pdelset( a, i, j-1, desca, ei )
246 END IF
247
248
249
250
251 CALL pdlarfg( n-k-l+1, ei, i+1, j, a,
min( i+2, n+ia-1 ), j,
252 $ desca, 1, tau )
253 CALL pdelset( a, i+1, j, desca, one )
254
255
256
257 CALL pdgemv( '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 pdgemv( '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 pdgemv( '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 pdscal( 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 dscal( l-1, -tau( jl ), work( jw ), 1 )
274 CALL dcopy( l-1, work( jw ), 1, t( jt+1 ), 1 )
275 CALL dtrmv( '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 pdelset( 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 pdelset(a, ia, ja, desca, alpha)
subroutine pdlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)