Nbody6
 All Files Functions Variables
difsy1.f
Go to the documentation of this file.
1  subroutine difsy1(n,eps,h,x,y)
2 c Bulirsch-Stoer integrator.
3 c --------------------------
4 c For \Gamma=(H-E)/L and Y(ntime)=time
5 *
6  parameter(nmx=80,nmx7=7*nmx)
7  IMPLICIT REAL*8 (a-h,o-z)
8  REAL*8 y(n),ya(nmx),yl(nmx),ym(nmx),dy(nmx),dz(nmx),dt(nmx,7),
9  & d(7),x,xn,h,g,b,b1,u,v,c,ta,w,dabs
10  common/intfac/ lx,le,lp,lv,lt,j10,nhalf2
11  common/bssave/ ep(4),dsc,facm,tfac,itfac,jc
12 *
13  LOGICAL konv,bo,kl,gr,fybad
14  DATA dt /nmx7*0.0d0/
15 * DATA EP/0.4D-1,0.16D-2,0.64D-4,0.256D-5/
16  SAVE
17 *
18 * nhalf2=(n/2)*2
19  jti=0
20  fy=1.
21  reduc=0.5
22  do i=1,n
23  ya(i)=y(i)
24  end do
25  CALL derqp(y(1),y(lx),y(le),y(lp),y(lv),y(lt),
26  & dz(1),dz(lx),dz(le),dz(lp),dz(lv),dz(lt))
27  IF (jc.GT.0)h=dsc
28  10 xn=x+h
29  bo=.false.
30  m=1
31  jr=2
32  js=3
33  do j=1,10 ! Jmax (10 -> efficient, 4 -> short steps)
34  if(bo)then
35  d(2)=16d0/9.d0
36  d(4)=64.d0/9.d0
37  d(6)=256.d0/9.d0
38  else
39  d(2)=2.25d0
40  d(4)=9.d0
41  d(6)=3.6d1
42  end if
43  if(j.gt.7)then
44  l=7
45  d(7)=6.4d1
46  else
47  l=j
48  d(l)=m*m
49  end if
50  konv=l.gt.3
51  m=m+m
52  g=h/(m)
53  b=g+g
54  m=m-1
55  do i=1,n
56  yl(i)=ya(i)
57  ym(i)=ya(i)+g*dz(i)
58  end do
59  do k=1,m
60  CALL derqp(ym(1),ym(lx),ym(le),ym(lp),ym(lv),ym(lt),
61  & dy(1),dy(lx),dy(le),dy(lp),dy(lv),dy(lt))
62  do i=1,n
63  u=yl(i)+b*dy(i)
64  yl(i)=ym(i)
65  ym(i)=u
66  end do
67  end do
68  CALL derqp(ym(1),ym(lx),ym(le),ym(lp),ym(lv),ym(lt),
69  & dy(1),dy(lx),dy(le),dy(lp),dy(lv),dy(lt))
70  kl=l.lt.2
71  gr=l.gt.5
72  fs=0.
73  do i=1,n
74  v=dt(i,1)
75  c=(ym(i)+yl(i)+g*dy(i))*0.5d0
76  dt(i,1)=c
77  ta=c
78  if(.not.kl)then
79  do k=2,l
80  b1=d(k)*v
81  b=b1-c
82  w=c-v
83  u=v
84  if(b.ne.0.d0)then
85  b=w/b
86  u=c*b
87  c=b1*b
88  end if
89  v=dt(i,k)
90  dt(i,k)=u
91  ta=u+ta
92  end do
93  is=i+n/2
94  if(is.gt.nhalf2)is=i-(n/2)
95  dyis=dabs(dy(is))
96  if(i.eq.n)dyis=1/(abs(ya(i))+abs(ta)) ! for time
97  if(konv)then
98  test=dabs( (y(i)-ta)*dyis )
99  if(test.gt.eps) konv=.false.
100  end if
101  if(.not.gr)then
102  fv=dabs(w)*dyis
103  if(fs.lt.fv) fs=fv
104  end if
105  end if
106  y(i)=ta
107  end do
108  if(fs.ne.0.d0)then
109  fa=fy
110  k=l-1
111  fy=(ep(k)/fs)**(1./(l+k))
112  fa7=0.7*fa
113  if(l.eq.2)fa7=0.0
114  fybad=.not.((fa7.gt.fy).or.(fy.gt.0.7))
115  if(fy bad)then
116  h=h*fy
117  jti=jti+1
118  if(jti.gt.10)then !Seppo's suggestion Oct/06 (5 before).
119  h=0.0
120  do i=1,n
121  y(i)=ya(i)
122  end do
123  return
124  end if
125  goto 10
126  end if
127  end if
128  if(konv)then
129  h=xn-x
130  x=xn
131 * if(fy.gt.10.0)fy=10. ! factor 10 may be too large
132 * if(fy.gt.4.0)fy=4. ! factor 10 may be too large
133  if(fy.gt.2.0)fy=2. ! factor 10 may be too large
134  h=h*fy
135  return
136  end if
137  d(3)=4.d0
138  d(5)=1.6d1
139  bo=.not.bo
140  m=jr
141  jr=js
142  js=m+m
143  end do
144  h=reduc*h
145  reduc=0.01+reduc*reduc
146  goto 10
147  end