~ubuntu-branches/debian/sid/octave-tisean/sid

« back to all changes in this revision

Viewing changes to src/source_f/slatec/rwupdt.f

  • Committer: Package Import Robot
  • Author(s): Rafael Laboissiere
  • Date: 2017-08-14 12:53:47 UTC
  • Revision ID: package-import@ubuntu.com-20170814125347-ju5owr4dggr53a2n
Tags: upstream-0.2.3
ImportĀ upstreamĀ versionĀ 0.2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
*DECK RWUPDT
 
2
      SUBROUTINE RWUPDT (N, R, LDR, W, B, ALPHA, COS, SIN)
 
3
C***BEGIN PROLOGUE  RWUPDT
 
4
C***SUBSIDIARY
 
5
C***PURPOSE  Subsidiary to SNLS1 and SNLS1E
 
6
C***LIBRARY   SLATEC
 
7
C***TYPE      SINGLE PRECISION (RWUPDT-S, DWUPDT-D)
 
8
C***AUTHOR  (UNKNOWN)
 
9
C***DESCRIPTION
 
10
C
 
11
C     Given an N by N upper triangular matrix R, this subroutine
 
12
C     computes the QR decomposition of the matrix formed when a row
 
13
C     is added to R. If the row is specified by the vector W, then
 
14
C     RWUPDT determines an orthogonal matrix Q such that when the
 
15
C     N+1 by N matrix composed of R augmented by W is premultiplied
 
16
C     by (Q TRANSPOSE), the resulting matrix is upper trapezoidal.
 
17
C     The orthogonal matrix Q is the product of N transformations
 
18
C
 
19
C           G(1)*G(2)* ... *G(N)
 
20
C
 
21
C     where G(I) is a Givens rotation in the (I,N+1) plane which
 
22
C     eliminates elements in the I-th plane. RWUPDT also
 
23
C     computes the product (Q TRANSPOSE)*C where C is the
 
24
C     (N+1)-vector (b,alpha). Q itself is not accumulated, rather
 
25
C     the information to recover the G rotations is supplied.
 
26
C
 
27
C     The subroutine statement is
 
28
C
 
29
C       SUBROUTINE RWUPDT(N,R,LDR,W,B,ALPHA,COS,SIN)
 
30
C
 
31
C     where
 
32
C
 
33
C       N is a positive integer input variable set to the order of R.
 
34
C
 
35
C       R is an N by N array. On input the upper triangular part of
 
36
C         R must contain the matrix to be updated. On output R
 
37
C         contains the updated triangular matrix.
 
38
C
 
39
C       LDR is a positive integer input variable not less than N
 
40
C         which specifies the leading dimension of the array R.
 
41
C
 
42
C       W is an input array of length N which must contain the row
 
43
C         vector to be added to R.
 
44
C
 
45
C       B is an array of length N. On input B must contain the
 
46
C         first N elements of the vector C. On output B contains
 
47
C         the first N elements of the vector (Q TRANSPOSE)*C.
 
48
C
 
49
C       ALPHA is a variable. On input ALPHA must contain the
 
50
C         (N+1)-st element of the vector C. On output ALPHA contains
 
51
C         the (N+1)-st element of the vector (Q TRANSPOSE)*C.
 
52
C
 
53
C       COS is an output array of length N which contains the
 
54
C         cosines of the transforming Givens rotations.
 
55
C
 
56
C       SIN is an output array of length N which contains the
 
57
C         sines of the transforming Givens rotations.
 
58
C
 
59
C***SEE ALSO  SNLS1, SNLS1E
 
60
C***ROUTINES CALLED  (NONE)
 
61
C***REVISION HISTORY  (YYMMDD)
 
62
C   800301  DATE WRITTEN
 
63
C   890831  Modified array declarations.  (WRB)
 
64
C   891214  Prologue converted to Version 4.0 format.  (BAB)
 
65
C   900326  Removed duplicate information from DESCRIPTION section.
 
66
C           (WRB)
 
67
C   900328  Added TYPE section.  (WRB)
 
68
C***END PROLOGUE  RWUPDT
 
69
      INTEGER N,LDR
 
70
      REAL ALPHA
 
71
      REAL R(LDR,*),W(*),B(*),COS(*),SIN(*)
 
72
      INTEGER I,J,JM1
 
73
      REAL COTAN,ONE,P5,P25,ROWJ,TAN,TEMP,ZERO
 
74
      SAVE ONE, P5, P25, ZERO
 
75
      DATA ONE,P5,P25,ZERO /1.0E0,5.0E-1,2.5E-1,0.0E0/
 
76
C***FIRST EXECUTABLE STATEMENT  RWUPDT
 
77
      DO 60 J = 1, N
 
78
         ROWJ = W(J)
 
79
         JM1 = J - 1
 
80
C
 
81
C        APPLY THE PREVIOUS TRANSFORMATIONS TO
 
82
C        R(I,J), I=1,2,...,J-1, AND TO W(J).
 
83
C
 
84
         IF (JM1 .LT. 1) GO TO 20
 
85
         DO 10 I = 1, JM1
 
86
            TEMP = COS(I)*R(I,J) + SIN(I)*ROWJ
 
87
            ROWJ = -SIN(I)*R(I,J) + COS(I)*ROWJ
 
88
            R(I,J) = TEMP
 
89
   10       CONTINUE
 
90
   20    CONTINUE
 
91
C
 
92
C        DETERMINE A GIVENS ROTATION WHICH ELIMINATES W(J).
 
93
C
 
94
         COS(J) = ONE
 
95
         SIN(J) = ZERO
 
96
         IF (ROWJ .EQ. ZERO) GO TO 50
 
97
         IF (ABS(R(J,J)) .GE. ABS(ROWJ)) GO TO 30
 
98
            COTAN = R(J,J)/ROWJ
 
99
            SIN(J) = P5/SQRT(P25+P25*COTAN**2)
 
100
            COS(J) = SIN(J)*COTAN
 
101
            GO TO 40
 
102
   30    CONTINUE
 
103
            TAN = ROWJ/R(J,J)
 
104
            COS(J) = P5/SQRT(P25+P25*TAN**2)
 
105
            SIN(J) = COS(J)*TAN
 
106
   40    CONTINUE
 
107
C
 
108
C        APPLY THE CURRENT TRANSFORMATION TO R(J,J), B(J), AND ALPHA.
 
109
C
 
110
         R(J,J) = COS(J)*R(J,J) + SIN(J)*ROWJ
 
111
         TEMP = COS(J)*B(J) + SIN(J)*ALPHA
 
112
         ALPHA = -SIN(J)*B(J) + COS(J)*ALPHA
 
113
         B(J) = TEMP
 
114
   50    CONTINUE
 
115
   60    CONTINUE
 
116
      RETURN
 
117
C
 
118
C     LAST CARD OF SUBROUTINE RWUPDT.
 
119
C
 
120
      END