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
|