SUBROUTINE RESTOR(X, LDX, M, N, U, LDU, V, LDV, INUL, TOL,
* WANTU, WANTV)
C
C PURPOSE:
C
C The subroutine RESTOR applies the Householder transformations Pj
C stored in factored form into the columns of the array X, to the
C desired columns of the matrix U by premultiplication, and/or
C the Householder transformations Qj stored in factored form into
C the rows of the array X, to the desired columns of the matrix V by
C premultiplication.
C
C ARGUMENT LIST:
C
C X - DOUBLE PRECISION array of DIMENSION (LDX,N).
C The leading M x N part contains in the columns of its lower
C triangle the Householder transformations Pj, and in the rows
C of its upper triangle the Householder transformations Qj in
C factored form
C LDX - INTEGER.
C LDX is the leading dimension of the array X (LDX >= M).
C M - INTEGER.
C M is the number of rows of the matrix X.
C N - INTEGER.
C N is the number of columns of the matrix X.
C U - DOUBLE PRECISION array of DIMENSION (LDU,M).
C On entry, U contains the M by M matrix U.
C On return, the Householder transformations Pj have been
C applied to each column i of U corresponding to a parameter
C INUL(i) = .TRUE.
C NOTE: U is not referenced if WANTU = .FALSE.
C LDU - INTEGER.
C LDU is the leading dimension of the array U (LDU >= M).
C V - DOUBLE PRECISION of DIMENSION (LDV,N).
C On entry, U contains the N by N matrix V.
C On return, the Householder transformations Qj have been
C applied to each column i of V corresponding to a parameter
C INUL(i) = .TRUE.
C NOTE: V is not referenced if WANTV = .FALSE.
C LDV - INTEGER.
C LDV is the leading dimension of the array V (LDV >= N).
C INUL - LOGICAL array of DIMENSION (max(M,N)).
C INUL(i) = .TRUE. if the i-th column of U and/or V is to be
C transformed. (1 <= i <= max(M,N)).
C TOL - DOUBLE PRECISION.
C Specifies that a Householder transformation Pj (resp. Qj) is
C considered to be an identity transformation when the corres-
C ponding element X(j,j) for Pj (resp. X(j,j+1) for Qj) is
C <= TOL in absolute value.
C WANTU - LOGICAL.
C WANTU = .TRUE. if columns in U have to be transformed by the
C routine RESTOR, else .FALSE.
C WANTV - LOGICAL.
C WANTV = .TRUE. if columns in V have to be transformed by the
C routine RESTOR, else .FALSE.
C
C EXTERNAL SUBROUTINES AND FUNCTIONS:
C
C DDOT, DAXPY from BLAS.
C
C CONTRIBUTOR: S. Van Huffel (ESAT Laboratory, KU Leuven).
C
C REVISIONS: 1988, February 15.
C
C .. Scalar Arguments ..
INTEGER LDX, M, N, LDU, LDV
DOUBLE PRECISION TOL
LOGICAL WANTU, WANTV
C .. Array Arguments ..
DOUBLE PRECISION X(LDX,*), U(LDU,*), V(LDV,*)
LOGICAL INUL(*)
C .. External Subroutines/Functions ..
DOUBLE PRECISION DDOT
EXTERNAL DDOT, DAXPY
C .. Intrinsic Functions ..
INTRINSIC ABS, MIN
C .. Local Scalars ..
INTEGER I, LL, L, NL1, ML1, L1, IM
DOUBLE PRECISION T
C .. Executable Statements ..
C
C Apply the Householder transformations Pj onto the desired columns
C of U.
C
IM = MIN(M-1,N)
IF (WANTU .AND. (IM .GT. 0)) THEN
DO 20 I = 1, M
IF (INUL(I)) THEN
DO 10 LL = 1, IM
L = IM - LL + 1
IF (ABS(X(L,L)) .GT. TOL) THEN
ML1 = M - L + 1
T = -DDOT(ML1, X(L,L), 1, U(L,I), 1)/X(L,L)
CALL DAXPY(ML1, T, X(L,L), 1, U(L,I), 1)
END IF
10 CONTINUE
END IF
20 CONTINUE
END IF
C
C Apply the Householder transformations Qj onto the desired columns
C of V.
C
IM = MIN(N-2,M)
IF (WANTV .AND. (IM .GT. 0)) THEN
DO 40 I = 1, N
IF (INUL(I)) THEN
DO 30 LL = 1, IM
L = IM - LL + 1
L1 = L + 1
IF (ABS(X(L,L1)) .GT. TOL) THEN
NL1 = N - L
T = -DDOT(NL1, X(L,L1), LDX, V(L1,I), 1)/X(L,L1)
CALL DAXPY(NL1, T, X(L,L1), LDX, V(L1,I), 1)
END IF
30 CONTINUE
END IF
40 CONTINUE
END IF
RETURN
C *** Last line of RESTOR *********************************************
END