File: desi14.f

package info (click to toggle)
scilab 2.4-1
  • links: PTS
  • area: non-free
  • in suites: potato, slink
  • size: 55,196 kB
  • ctags: 38,019
  • sloc: ansic: 231,970; fortran: 148,976; tcl: 7,099; makefile: 4,585; sh: 2,978; csh: 154; cpp: 101; asm: 39; sed: 5
file content (101 lines) | stat: -rw-r--r-- 2,193 bytes parent folder | download | duplicates (14)
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
      subroutine desi14(nmaxi,maxdeg,ndeg,vsn,gd1,gd2,adelta,nzm,
     *sm,nzero,dsk,ugc,ogc,ack,nj,nh,dk,dks,dcap02,dcap04)
c!purpose
c elliptic filter
c computation of the zeros and the locations of the extrema
c!
c
      implicit double precision (a-h,o-z)
      double precision dsk(*)
      dimension nzero(*),sm(maxdeg,*),nzm(*)
c
      external slamch
      real slamch
c
      data de /1.0d+00/
      dpi=4.0d+0*atan(1.0d+00)
      flma=2.0d+0**(int(slamch('l'))-2)
c
      dcap02 = de/vsn
      dcap01 = sqrt(dcap02)
        dcap04 = sqrt(de-dcap02*dcap02)
      dk = dellk(dcap02)
      dks = dellk(dcap04)
c
      dq = exp(-dpi*dks/dk)
c
      nh = ndeg/2
      m = ndeg + 1
      nj = m/2
      mh = nh + 1
c
      dn = dk/dble(real(ndeg))
c
      del1 = de
      if (nh.eq.0) go to 20
      do 10 i=1,nh
        inh = m - i - i
        du = dn*dble(real(inh))
        dm = dsn2(du,dk,dq)
        del1 = del1*dm*dcap01
         dsk(i) = dm
        j = mh - i
        sm(j,1) = dm
        nzero(i) = 2
        dde = de/(dcap02*dm)
        sm(i,4) = dde
  10  continue
      go to 30
  20  sm(1,1) = 0.0d+0
  30  kj = nj - 1
      mj = nj + 1
      del2 = de
      if (kj.eq.0) go to 50
      do 40 i=1,kj
        ndegi = ndeg - i - i
        du = dn*dble(real(ndegi))
        dm = dsn2(du,dk,dq)
        j = mj - i
        sm(j,2) = dm
        dde = de/(dcap02*dm)
          sm(i+1,3) = dde
        del2 = del2*dm*dcap01
  40  continue
      go to 60
  50  sm(ndeg,2) = 1.0d+0
      sm(1,3) = vsn
c
  60  ddelt = del1*del1
      adelta = ddelt
      ack = 1.0d+0/adelta
      if (nh.eq.nj) go to 80
      ack = ack*dcap01
      ddelta = del2*del2*dcap01
      adelta = ddelta
      dsk(nj) = 0.0d+0
      nzero(nj) = 1
      sm(nj,4) = flma
c
      if (nh.eq.0) go to 90
      do 70 i=1,nh
         j = mj - i
        sm(j,1) = sm(j-1,1)
        sm(i,2) = sm(i+1,2)
  70  continue
      sm(1,1) = 0.0d+0
      go to 90
c
  80  sm(mh,3) = flma
      sm(1,2) = 0.0d+0
c
  90  nzm(1) = nj
      nzm(4) = nj
      nzm(2) = mh
      nzm(3) = mh
      sm(mh,2) = 1.0d+0
      sm(1,3) = vsn
      ugc = gd2*adelta
      ogc = gd1/adelta
      sm(nmaxi-1,4) = 1.0d+0
      return
      end