LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sopmtr.f
Go to the documentation of this file.
1*> \brief \b SOPMTR
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download SOPMTR + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sopmtr.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sopmtr.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sopmtr.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE SOPMTR( SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK,
20* INFO )
21*
22* .. Scalar Arguments ..
23* CHARACTER SIDE, TRANS, UPLO
24* INTEGER INFO, LDC, M, N
25* ..
26* .. Array Arguments ..
27* REAL AP( * ), C( LDC, * ), TAU( * ), WORK( * )
28* ..
29*
30*
31*> \par Purpose:
32* =============
33*>
34*> \verbatim
35*>
36*> SOPMTR overwrites the general real M-by-N matrix C with
37*>
38*> SIDE = 'L' SIDE = 'R'
39*> TRANS = 'N': Q * C C * Q
40*> TRANS = 'T': Q**T * C C * Q**T
41*>
42*> where Q is a real orthogonal matrix of order nq, with nq = m if
43*> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of
44*> nq-1 elementary reflectors, as returned by SSPTRD using packed
45*> storage:
46*>
47*> if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1);
48*>
49*> if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1).
50*> \endverbatim
51*
52* Arguments:
53* ==========
54*
55*> \param[in] SIDE
56*> \verbatim
57*> SIDE is CHARACTER*1
58*> = 'L': apply Q or Q**T from the Left;
59*> = 'R': apply Q or Q**T from the Right.
60*> \endverbatim
61*>
62*> \param[in] UPLO
63*> \verbatim
64*> UPLO is CHARACTER*1
65*> = 'U': Upper triangular packed storage used in previous
66*> call to SSPTRD;
67*> = 'L': Lower triangular packed storage used in previous
68*> call to SSPTRD.
69*> \endverbatim
70*>
71*> \param[in] TRANS
72*> \verbatim
73*> TRANS is CHARACTER*1
74*> = 'N': No transpose, apply Q;
75*> = 'T': Transpose, apply Q**T.
76*> \endverbatim
77*>
78*> \param[in] M
79*> \verbatim
80*> M is INTEGER
81*> The number of rows of the matrix C. M >= 0.
82*> \endverbatim
83*>
84*> \param[in] N
85*> \verbatim
86*> N is INTEGER
87*> The number of columns of the matrix C. N >= 0.
88*> \endverbatim
89*>
90*> \param[in] AP
91*> \verbatim
92*> AP is REAL array, dimension
93*> (M*(M+1)/2) if SIDE = 'L'
94*> (N*(N+1)/2) if SIDE = 'R'
95*> The vectors which define the elementary reflectors, as
96*> returned by SSPTRD. AP is modified by the routine but
97*> restored on exit.
98*> \endverbatim
99*>
100*> \param[in] TAU
101*> \verbatim
102*> TAU is REAL array, dimension (M-1) if SIDE = 'L'
103*> or (N-1) if SIDE = 'R'
104*> TAU(i) must contain the scalar factor of the elementary
105*> reflector H(i), as returned by SSPTRD.
106*> \endverbatim
107*>
108*> \param[in,out] C
109*> \verbatim
110*> C is REAL array, dimension (LDC,N)
111*> On entry, the M-by-N matrix C.
112*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
113*> \endverbatim
114*>
115*> \param[in] LDC
116*> \verbatim
117*> LDC is INTEGER
118*> The leading dimension of the array C. LDC >= max(1,M).
119*> \endverbatim
120*>
121*> \param[out] WORK
122*> \verbatim
123*> WORK is REAL array, dimension
124*> (N) if SIDE = 'L'
125*> (M) if SIDE = 'R'
126*> \endverbatim
127*>
128*> \param[out] INFO
129*> \verbatim
130*> INFO is INTEGER
131*> = 0: successful exit
132*> < 0: if INFO = -i, the i-th argument had an illegal value
133*> \endverbatim
134*
135* Authors:
136* ========
137*
138*> \author Univ. of Tennessee
139*> \author Univ. of California Berkeley
140*> \author Univ. of Colorado Denver
141*> \author NAG Ltd.
142*
143*> \ingroup upmtr
144*
145* =====================================================================
146 SUBROUTINE sopmtr( SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC,
147 $ WORK,
148 $ INFO )
149*
150* -- LAPACK computational routine --
151* -- LAPACK is a software package provided by Univ. of Tennessee, --
152* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
153*
154* .. Scalar Arguments ..
155 CHARACTER SIDE, TRANS, UPLO
156 INTEGER INFO, LDC, M, N
157* ..
158* .. Array Arguments ..
159 REAL AP( * ), C( LDC, * ), TAU( * ), WORK( * )
160* ..
161*
162* =====================================================================
163*
164* .. Local Scalars ..
165 LOGICAL FORWRD, LEFT, NOTRAN, UPPER
166 INTEGER I, I1, I2, I3, IC, II, JC, MI, NI, NQ
167* ..
168* .. External Functions ..
169 LOGICAL LSAME
170 EXTERNAL LSAME
171* ..
172* .. External Subroutines ..
173 EXTERNAL slarf1f, slarf1l, xerbla
174* ..
175* .. Intrinsic Functions ..
176 INTRINSIC max
177* ..
178* .. Executable Statements ..
179*
180* Test the input arguments
181*
182 info = 0
183 left = lsame( side, 'L' )
184 notran = lsame( trans, 'N' )
185 upper = lsame( uplo, 'U' )
186*
187* NQ is the order of Q
188*
189 IF( left ) THEN
190 nq = m
191 ELSE
192 nq = n
193 END IF
194 IF( .NOT.left .AND. .NOT.lsame( side, 'R' ) ) THEN
195 info = -1
196 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
197 info = -2
198 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans, 'T' ) ) THEN
199 info = -3
200 ELSE IF( m.LT.0 ) THEN
201 info = -4
202 ELSE IF( n.LT.0 ) THEN
203 info = -5
204 ELSE IF( ldc.LT.max( 1, m ) ) THEN
205 info = -9
206 END IF
207 IF( info.NE.0 ) THEN
208 CALL xerbla( 'SOPMTR', -info )
209 RETURN
210 END IF
211*
212* Quick return if possible
213*
214 IF( m.EQ.0 .OR. n.EQ.0 )
215 $ RETURN
216*
217 IF( upper ) THEN
218*
219* Q was determined by a call to SSPTRD with UPLO = 'U'
220*
221 forwrd = ( left .AND. notran ) .OR.
222 $ ( .NOT.left .AND. .NOT.notran )
223*
224 IF( forwrd ) THEN
225 i1 = 1
226 i2 = nq - 1
227 i3 = 1
228 ii = 2
229 ELSE
230 i1 = nq - 1
231 i2 = 1
232 i3 = -1
233 ii = nq*( nq+1 ) / 2 - 1
234 END IF
235*
236 IF( left ) THEN
237 ni = n
238 ELSE
239 mi = m
240 END IF
241*
242 DO 10 i = i1, i2, i3
243 IF( left ) THEN
244*
245* H(i) is applied to C(1:i,1:n)
246*
247 mi = i
248 ELSE
249*
250* H(i) is applied to C(1:m,1:i)
251*
252 ni = i
253 END IF
254*
255* Apply H(i)
256*
257 CALL slarf1l( side, mi, ni, ap( ii-i+1 ), 1, tau( i ), c,
258 $ ldc, work )
259*
260 IF( forwrd ) THEN
261 ii = ii + i + 2
262 ELSE
263 ii = ii - i - 1
264 END IF
265 10 CONTINUE
266 ELSE
267*
268* Q was determined by a call to SSPTRD with UPLO = 'L'.
269*
270 forwrd = ( left .AND. .NOT.notran ) .OR.
271 $ ( .NOT.left .AND. notran )
272*
273 IF( forwrd ) THEN
274 i1 = 1
275 i2 = nq - 1
276 i3 = 1
277 ii = 2
278 ELSE
279 i1 = nq - 1
280 i2 = 1
281 i3 = -1
282 ii = nq*( nq+1 ) / 2 - 1
283 END IF
284*
285 IF( left ) THEN
286 ni = n
287 jc = 1
288 ELSE
289 mi = m
290 ic = 1
291 END IF
292*
293 DO 20 i = i1, i2, i3
294 IF( left ) THEN
295*
296* H(i) is applied to C(i+1:m,1:n)
297*
298 mi = m - i
299 ic = i + 1
300 ELSE
301*
302* H(i) is applied to C(1:m,i+1:n)
303*
304 ni = n - i
305 jc = i + 1
306 END IF
307*
308* Apply H(i)
309*
310 CALL slarf1f( side, mi, ni, ap( ii ), 1, tau( i ),
311 $ c( ic, jc ), ldc, work )
312*
313 IF( forwrd ) THEN
314 ii = ii + nq - i + 1
315 ELSE
316 ii = ii - nq + i - 2
317 END IF
318 20 CONTINUE
319 END IF
320 RETURN
321*
322* End of SOPMTR
323*
324 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine sopmtr(side, uplo, trans, m, n, ap, tau, c, ldc, work, info)
SOPMTR
Definition sopmtr.f:149
subroutine slarf1f(side, m, n, v, incv, tau, c, ldc, work)
SLARF1F applies an elementary reflector to a general rectangular
Definition slarf1f.f:123
subroutine slarf1l(side, m, n, v, incv, tau, c, ldc, work)
SLARF1L applies an elementary reflector to a general rectangular
Definition slarf1l.f:125