SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) 2,4
!
! -- LAPACK auxiliary routine (version 3.1) --
! Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
! November 2006
!
! .. Scalar Arguments ..
CHARACTER SIDE
INTEGER INCV, LDC, M, N
DOUBLE PRECISION TAU
! ..
! .. Array Arguments ..
DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * )
! ..
!
! Purpose
! =======
!
! DLARF applies a real elementary reflector H to a real m by n matrix
! C, from either the left or the right. H is represented in the form
!
! H = I - tau * v * v'
!
! where tau is a real scalar and v is a real vector.
!
! If tau = 0, then H is taken to be the unit matrix.
!
! Arguments
! =========
!
! SIDE (input) CHARACTER*1
! = 'L': form H * C
! = 'R': form C * H
!
! M (input) INTEGER
! The number of rows of the matrix C.
!
! N (input) INTEGER
! The number of columns of the matrix C.
!
! V (input) DOUBLE PRECISION array, dimension
! (1 + (M-1)*abs(INCV)) if SIDE = 'L'
! or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
! The vector v in the representation of H. V is not used if
! TAU = 0.
!
! INCV (input) INTEGER
! The increment between elements of v. INCV <> 0.
!
! TAU (input) DOUBLE PRECISION
! The value tau in the representation of H.
!
! C (input/output) DOUBLE PRECISION array, dimension (LDC,N)
! On entry, the m by n matrix C.
! On exit, C is overwritten by the matrix H * C if SIDE = 'L',
! or C * H if SIDE = 'R'.
!
! LDC (input) INTEGER
! The leading dimension of the array C. LDC >= max(1,M).
!
! WORK (workspace) DOUBLE PRECISION array, dimension
! (N) if SIDE = 'L'
! or (M) if SIDE = 'R'
!
! =====================================================================
!
! .. Parameters ..
DOUBLE PRECISION ONE, ZERO
PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
! ..
! .. External Subroutines ..
! EXTERNAL DGEMV, DGER
! ..
! .. External Functions ..
! LOGICAL LSAME
! EXTERNAL LSAME
! ..
! .. Executable Statements ..
!
IF( LSAME( SIDE, 'L' ) ) THEN
!
! Form H * C
!
IF( TAU.NE.ZERO ) THEN
!
! w := C' * v
!
CALL DGEMV
( 'Transpose', M, N, ONE, C, LDC, V, INCV, ZERO, &
WORK, 1 )
!
! C := C - v * w'
!
CALL DGER
( M, N, -TAU, V, INCV, WORK, 1, C, LDC )
END IF
ELSE
!
! Form C * H
!
IF( TAU.NE.ZERO ) THEN
!
! w := C * v
!
CALL DGEMV
( 'No transpose', M, N, ONE, C, LDC, V, INCV, &
ZERO, WORK, 1 )
!
! C := C - w * v'
!
CALL DGER
( M, N, -TAU, WORK, 1, V, INCV, C, LDC )
END IF
END IF
RETURN
!
! End of DLARF
!
END SUBROUTINE DLARF