| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 
 |       subroutine dhetr(na,nb,nc,l,m,n,low,igh,a,b,c,ort)
      double precision a(na,n),b(nb,m),c(nc,n),ort(n)
c
c     *** purpose
c
c     given a real general matrix a, shetr reduces a submatrix
c     of a in rows and columns low through igh to upper hessenberg
c     form by orthogonal similarity transformations.  these
c     orthogonal transformations are further accumulated into rows
c     low through igh of an n x m matrix b and columns low
c     through igh of an l x n matrix c by premultiplication and
c     postmultiplication, respectively.
c
c
c        b        double precision(nb,m)
c                 an n x m double precision matrix
c
c        c        double precision(nc,n)
c                 an l x n double precision matrix.
c
c     on return:
c
c        a        an upper hessenberg matric similar to (via an
c                 orthogonal matrix consisting of a sequence of
c                 householder transformations) the original matrix a;
c                 further information concerning the orthogonal
c                 transformations used in the reduction is contained
c                 in the elements below the first subdiagonal; see
c                 orthes documentation for details.
c
c        b        the original b matrix premultiplied by the transpose
c                 of the orthogonal transformation used to reduce a.
c
c        c        the original c matrix postmultiplied by the orthogonal
c                 transformation used to reduce a.
c
c        ort      double precision(n)
c                 a work vector containing information about the
c                 orthogonal transformations; see orthes documentation
c                 for details.
c
c     this version dated july 1980.
c     alan j. laub, university of southern california.
c
c     subroutines and functions called:
c
c     none
c
c     internal variables:
c
      integer i,ii,j,jj,k,kp1,kpn,la
      double precision f,g,h,scale
c
c     fortran functions called:
c
      la = igh-1
      kp1 = low+1
      if (la .lt. kp1) go to 170
      do 160 k = kp1,la
         h = 0.0d+0
         ort(k) = 0.0d+0
         scale = 0.0d+0
c
c        scale column
c
         do 10 i = k,igh
              scale = scale+abs(a(i,k-1))
   10    continue
         if (scale .eq. 0.0d+0) go to 150
          kpn=k+igh
         do 20 ii = k,igh
              i = kpn-ii
              ort(i) = a(i,k-1)/scale
              h = h+ort(i)*ort(i)
   20    continue
         g = -sign(sqrt(h),ort(k))
         h = h-ort(k) *g
         ort(k) = ort(k)-g
c
c        form  (i-(u*transpose(u))/h) *a
c
         do 50 j = k,n
              f = 0.0d+0
              do 30 ii = k,igh
                   i = kpn-ii
                   f = f+ort(i)*a(i,j)
   30         continue
              f = f/h
              do 40 i = k,igh
                   a(i,j) = a(i,j)-f*ort(i)
   40         continue
   50    continue
c
c        form  (i-(u*transpose(u))/h) *b
c
         do 80 j = 1,m
              f = 0.0d+0
              do 60 ii = k,igh
                   i = kpn-ii
                   f = f+ort(i) *b(i,j)
   60         continue
              f = f/h
              do 70 i = k,igh
                   b(i,j) = b(i,j)-f*ort(i)
   70         continue
   80    continue
c
c        form  (i-(u*transpose(u))/h) *a*(i-(u*transpose(u))/h)
c
         do 110 i = 1,igh
              f = 0.0d+0
              do 90 jj = k,igh
                   j = kpn-jj
                   f = f+ort(j)*a(i,j)
   90         continue
              f = f/h
              do 100 j = k,igh
                   a(i,j) = a(i,j)-f*ort(j)
  100         continue
  110    continue
c
c        form  c*(i-(u*transpose(u))/h)
c
         do 140 i = 1,l
              f = 0.0d+0
              do 120 jj = k,igh
                   j = kpn-jj
                   f = f+ort(j)*c(i,j)
  120         continue
              f = f/h
              do 130 j = k,igh
                   c(i,j) = c(i,j)-f*ort(j)
  130         continue
  140    continue
         ort(k) = scale*ort(k)
         a(k,k-1) = scale*g
  150    continue
  160 continue
  170 continue
      return
      end
 |