File: wexchn.f

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (105 lines) | stat: -rw-r--r-- 3,105 bytes parent folder | download | duplicates (4)
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
      subroutine wexchn(ar, ai, vr, vi, n, l, fail, na, nv)
c!purpose
c
c     given the upper triangular complex matrix a ,wexchn produce a
c     unitary transformation which exchange the two consecutive blocks
c     starting at a(l,l),along with their eigenvalues.
c     the transformation is accumulated in v.
c!calling sequence
c
c     subroutine exchng(ar, ai, vr, vi, n, l, fail, na, nv)
c
c     integer l, na, nv
c     double precision ar, ai, vr, vi
c     dimension ar(na,n) , ai(na,n) ,vr(nv,n) ,vi(nv,n)
c     logical fail
c
c     starred parameters are altered by the subroutine
c
c        *ar,ai  the matrix whose blocks are to be
c                interchanged.
c        *vr,vi  the array into which the transformations
c                are to re accumulated.
c         n      the order of the matrix a.
c         l      the position of the blocks.
c       *fail    a logical variable which is false on a
c                normal return.  if thirty iterations were
c                performed without convergence, fail is set
c                to true and the element
c                a(l+b2,l+b2-1) cannot be assumed zero.
c         na     the first dimension of the array a.
c         nv     the first dimension of the array v.
c
c!auxiliary routines
c     max sqrt abs (fortran)
c!originator
c     steer i.n.r.i.a  from routine exchng
c!
c
c
c     Copyright INRIA
      integer l,na,nv
      double precision ar,ai,vr,vi
      dimension ar(na, n),  ai(na, n), vr(nv, n), vi(nv, n)
      logical fail
c
c     internal variables.
c
      double precision pr,pi,qr,qi,r,sr,si,tr,ti,zero
      integer i, j, l1
      data zero /0.0d+0/
      l1 = l + 1
c
      fail = .false.
c
c         interchange 1x1 and 1x1 blocks.
c
      qr = ar(l1,l1) - ar(l,l)
      pr = ar(l,l1)
      qi = ai(l1,l1) - ai(l,l)
      pi = ai(l,l1)
      r = max(abs(pr),abs(pi),abs(qr),abs(qi))
      if (r.eq.zero) return
      pr = pr/r
      qr = qr/r
      pi = pi/r
      qi = qi/r
      r = sqrt(pr*pr + pi*pi + qr*qr + qi*qi)
      pr = pr/r
      qr = qr/r
      pi = pi/r
      qi = qi/r
      do 10 j = l,n
      sr = ar(l,j)
      si = ai(l,j)
      tr = ar(l1,j)
      ti = ai(l1,j)
         ar(l,j) = pr*sr + pi*si + qr*tr + qi*ti
         ai(l,j) = pr*si - pi*sr + qr*ti - qi*tr
         ar(l1,j) = pr*tr - pi*ti - qr*sr + qi*si
         ai(l1,j) = pr*ti + pi*tr - qr*si - qi*sr
   10 continue
      do 20 i = 1,l1
         sr = ar(i,l)
         si = ai(i,l)
         tr = ar(i,l1)
         ti = ai(i,l1)
         ar(i,l) = pr*sr + qr*tr - pi*si - qi*ti
         ai(i,l) = pi*sr + qi*tr + pr*si + qr*ti
         ar(i,l1) = pr*tr + pi*ti - qr*sr - qi*si
         ai(i,l1) = pr*ti - pi*tr - qr*si + qi*sr
   20 continue
      do 30 i = 1,n
         sr = vr(i,l)
         si = vi(i,l)
         tr = vr(i,l1)
         ti = vi(i,l1)
         vr(i,l) = pr*sr + qr*tr - pi*si - qi*ti
         vi(i,l) = pi*sr + qi*tr + pr*si + qr*ti
         vr(i,l1) = pr*tr + pi*ti - qr*sr - qi*si
         vi(i,l1) = pr*ti - pi*tr - qr*si + qi*sr
   30 continue
      ar(l1,l) = zero
      ai(l1,l) = zero
      return
      end