1 2 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
|