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
|
subroutine coef(ierr)
c!purpose
c coef compute the lengh,and the coefficients of the
c exponential pade approximant
c
c!calling sequence
c subroutine coef(ierr)
c common /dcoeff/ b,n
c
c double precision b(41)
c integer n,ierr
c ierr error indicator : if ierr.ne.0 n is too large
c machine precision can't be achieved
c
c b array containing pade coefficients
c
c n lengh of pade approximation
c
c!auxiliary routines
c exp dble real mod (fortran)
c!originator
c j.roche - laboratoire d'automatique de grenoble
c!
double precision b(41)
integer n,ierr
c internal variables
integer m, i, ir, id, ie, j, j1, n1, im1, ip1, k
double precision a, b1, b2, b3, zero, one, two, cnst, half
dimension a(41), m(21)
common /dcoeff/ b, n
data zero, one, two, cnst, half /0.0d+0,1.0d+0,2.0d+0,
* 0.556930d+0,0.50d+0/
c
ierr=0
c
c determination of the pade approximants type
c
n = 1
b1 = exp(one)
b3 = 6.
b2 = b1/(b3*(cnst-one))
b2 = abs(b2)
10 if (b2+one.le.one) go to 20
n = n + 1
b3 = b3*(4.0d+0*dble(real(n))+two)
b2 = b1/(b3*((dble(real(n))*cnst-one)**n))
go to 10
20 continue
if(n.gt.40) ierr=n
n=min(n,40)
c
c compute the coefficients of pade approximants
c
n1 = n + 1
n2 = (n+2)/2
a(1) = one
a(2) = half
do 30 i=2,n
im1 = i - 1
ip1 = i + 1
a(ip1) = a(i)*dble(real(n-im1))/dble(real(i*(2*n-im1)
* ))
30 continue
c
c compute the coefficients of pade approximants in chebychef system
c
do 40 i=1,n2
m(i) = 0
40 continue
do 50 i=1,n1
b(i) = zero
50 continue
m(1) = 1
b(1) = a(1)
b(2) = a(2)
i = 0
b3 = one
60 i = i + 1
b3 = b3*half
ir = mod(i,2)
id = (i+3)/2
ie = id
if (ir) 80, 70, 80
70 m(id) = m(id) + m(id)
80 m(id) = m(id) + m(id-1)
id = id - 1
if (id-1) 80, 90, 80
90 j = i + 2
j1 = j
do 100 k=1,ie
b2 = m(k)
b1 = a(j1)*b2*b3
b(j) = b(j) + b1
j = j - 2
100 continue
if (n1-i.ne.2) go to 60
return
end
|