Statistiques
| Révision :

root / src / lapack / double / dlarf.f @ 1

Historique | Voir | Annoter | Télécharger (4,34 ko)

1 1 equemene
      SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
2 1 equemene
      IMPLICIT NONE
3 1 equemene
*
4 1 equemene
*  -- LAPACK auxiliary routine (version 3.2) --
5 1 equemene
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
6 1 equemene
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
7 1 equemene
*     November 2006
8 1 equemene
*
9 1 equemene
*     .. Scalar Arguments ..
10 1 equemene
      CHARACTER          SIDE
11 1 equemene
      INTEGER            INCV, LDC, M, N
12 1 equemene
      DOUBLE PRECISION   TAU
13 1 equemene
*     ..
14 1 equemene
*     .. Array Arguments ..
15 1 equemene
      DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )
16 1 equemene
*     ..
17 1 equemene
*
18 1 equemene
*  Purpose
19 1 equemene
*  =======
20 1 equemene
*
21 1 equemene
*  DLARF applies a real elementary reflector H to a real m by n matrix
22 1 equemene
*  C, from either the left or the right. H is represented in the form
23 1 equemene
*
24 1 equemene
*        H = I - tau * v * v'
25 1 equemene
*
26 1 equemene
*  where tau is a real scalar and v is a real vector.
27 1 equemene
*
28 1 equemene
*  If tau = 0, then H is taken to be the unit matrix.
29 1 equemene
*
30 1 equemene
*  Arguments
31 1 equemene
*  =========
32 1 equemene
*
33 1 equemene
*  SIDE    (input) CHARACTER*1
34 1 equemene
*          = 'L': form  H * C
35 1 equemene
*          = 'R': form  C * H
36 1 equemene
*
37 1 equemene
*  M       (input) INTEGER
38 1 equemene
*          The number of rows of the matrix C.
39 1 equemene
*
40 1 equemene
*  N       (input) INTEGER
41 1 equemene
*          The number of columns of the matrix C.
42 1 equemene
*
43 1 equemene
*  V       (input) DOUBLE PRECISION array, dimension
44 1 equemene
*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
45 1 equemene
*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
46 1 equemene
*          The vector v in the representation of H. V is not used if
47 1 equemene
*          TAU = 0.
48 1 equemene
*
49 1 equemene
*  INCV    (input) INTEGER
50 1 equemene
*          The increment between elements of v. INCV <> 0.
51 1 equemene
*
52 1 equemene
*  TAU     (input) DOUBLE PRECISION
53 1 equemene
*          The value tau in the representation of H.
54 1 equemene
*
55 1 equemene
*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
56 1 equemene
*          On entry, the m by n matrix C.
57 1 equemene
*          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
58 1 equemene
*          or C * H if SIDE = 'R'.
59 1 equemene
*
60 1 equemene
*  LDC     (input) INTEGER
61 1 equemene
*          The leading dimension of the array C. LDC >= max(1,M).
62 1 equemene
*
63 1 equemene
*  WORK    (workspace) DOUBLE PRECISION array, dimension
64 1 equemene
*                         (N) if SIDE = 'L'
65 1 equemene
*                      or (M) if SIDE = 'R'
66 1 equemene
*
67 1 equemene
*  =====================================================================
68 1 equemene
*
69 1 equemene
*     .. Parameters ..
70 1 equemene
      DOUBLE PRECISION   ONE, ZERO
71 1 equemene
      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
72 1 equemene
*     ..
73 1 equemene
*     .. Local Scalars ..
74 1 equemene
      LOGICAL            APPLYLEFT
75 1 equemene
      INTEGER            I, LASTV, LASTC
76 1 equemene
*     ..
77 1 equemene
*     .. External Subroutines ..
78 1 equemene
      EXTERNAL           DGEMV, DGER
79 1 equemene
*     ..
80 1 equemene
*     .. External Functions ..
81 1 equemene
      LOGICAL            LSAME
82 1 equemene
      INTEGER            ILADLR, ILADLC
83 1 equemene
      EXTERNAL           LSAME, ILADLR, ILADLC
84 1 equemene
*     ..
85 1 equemene
*     .. Executable Statements ..
86 1 equemene
*
87 1 equemene
      APPLYLEFT = LSAME( SIDE, 'L' )
88 1 equemene
      LASTV = 0
89 1 equemene
      LASTC = 0
90 1 equemene
      IF( TAU.NE.ZERO ) THEN
91 1 equemene
!     Set up variables for scanning V.  LASTV begins pointing to the end
92 1 equemene
!     of V.
93 1 equemene
         IF( APPLYLEFT ) THEN
94 1 equemene
            LASTV = M
95 1 equemene
         ELSE
96 1 equemene
            LASTV = N
97 1 equemene
         END IF
98 1 equemene
         IF( INCV.GT.0 ) THEN
99 1 equemene
            I = 1 + (LASTV-1) * INCV
100 1 equemene
         ELSE
101 1 equemene
            I = 1
102 1 equemene
         END IF
103 1 equemene
!     Look for the last non-zero row in V.
104 1 equemene
         DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO )
105 1 equemene
            LASTV = LASTV - 1
106 1 equemene
            I = I - INCV
107 1 equemene
         END DO
108 1 equemene
         IF( APPLYLEFT ) THEN
109 1 equemene
!     Scan for the last non-zero column in C(1:lastv,:).
110 1 equemene
            LASTC = ILADLC(LASTV, N, C, LDC)
111 1 equemene
         ELSE
112 1 equemene
!     Scan for the last non-zero row in C(:,1:lastv).
113 1 equemene
            LASTC = ILADLR(M, LASTV, C, LDC)
114 1 equemene
         END IF
115 1 equemene
      END IF
116 1 equemene
!     Note that lastc.eq.0 renders the BLAS operations null; no special
117 1 equemene
!     case is needed at this level.
118 1 equemene
      IF( APPLYLEFT ) THEN
119 1 equemene
*
120 1 equemene
*        Form  H * C
121 1 equemene
*
122 1 equemene
         IF( LASTV.GT.0 ) THEN
123 1 equemene
*
124 1 equemene
*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1)
125 1 equemene
*
126 1 equemene
            CALL DGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV,
127 1 equemene
     $           ZERO, WORK, 1 )
128 1 equemene
*
129 1 equemene
*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)'
130 1 equemene
*
131 1 equemene
            CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )
132 1 equemene
         END IF
133 1 equemene
      ELSE
134 1 equemene
*
135 1 equemene
*        Form  C * H
136 1 equemene
*
137 1 equemene
         IF( LASTV.GT.0 ) THEN
138 1 equemene
*
139 1 equemene
*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)
140 1 equemene
*
141 1 equemene
            CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,
142 1 equemene
     $           V, INCV, ZERO, WORK, 1 )
143 1 equemene
*
144 1 equemene
*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)'
145 1 equemene
*
146 1 equemene
            CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )
147 1 equemene
         END IF
148 1 equemene
      END IF
149 1 equemene
      RETURN
150 1 equemene
*
151 1 equemene
*     End of DLARF
152 1 equemene
*
153 1 equemene
      END