Nbody6
 All Files Functions Variables
stablc.f
Go to the documentation of this file.
1  SUBROUTINE stablc(IM,ITERM,SEMI)
2 *
3 *
4 * Chain stability test.
5 * ---------------------
6 *
7  include 'commonc.h'
8  include 'common2.h'
9  common/chreg/ timec,tmax,rmaxc,cm(10),namec(6),nstep1,kz27,kz30
10  common/clump/ bodys(nmx,5),t0s(5),ts(5),steps(5),rmaxs(5),
11  & names(nmx,5),isys(5)
12  common/ccoll2/ qk(nmx4),pk(nmx4),rij(nmx,nmx),SIZE(nmx),vstar1,
13  & ecoll1,rcoll,qperi,istar(nmx),icoll,isync,ndiss1
14  common/incond/ x4(3,nmx),xdot4(3,nmx)
15  REAL*8 xcm(3),vcm(3)
16 *
17 *
18 * Check hierarchical stability of triple using simple criterion.
19  IF (n.EQ.3) THEN
20  CALL chstab(iterm)
21 *
22 * Examine general case of N > 3.
23  ELSE IF (n.GE.4) THEN
24  iesc = 0
25  jesc = 0
26 * Distinguish between synchronous binary and large distance ratio.
27  IF (isync.NE.0) THEN
28 * Specify removal of binary or single body (IM = 1, N-1; 1 < IM < N-1).
29  IF (im.EQ.1) THEN
30  iesc = iname(1)
31  jesc = iname(2)
32  ELSE IF (im.EQ.n - 1) THEN
33  iesc = iname(n-1)
34  jesc = iname(n)
35  ELSE
36  IF (rinv(1).LT.rinv(n-1)) THEN
37  iesc = iname(1)
38  ELSE
39  iesc = iname(n)
40  END IF
41  END IF
42  ELSE
43 * Check for distant binary or single body.
44  IF (im.EQ.1.OR.im.EQ.n-1) THEN
45  jm = min(im+1,n-2)
46 * Reduce chain if close binary is hierarchical and at beginning or end.
47  IF (1.0/rinv(jm).GT.50.0*semi) THEN
48  iesc = iname(im)
49  jesc = iname(im+1)
50  END IF
51  ELSE IF (im.EQ.2.OR.im.EQ.3) THEN
52  jm = 1
53 * Identify index of the maximum end separation.
54  IF (1.0/rinv(jm).LT.1.0/rinv(n-1)) jm = n - 1
55  IF (1.0/rinv(jm).GT.50.0*semi) THEN
56  iesc = iname(jm)
57  END IF
58  END IF
59  END IF
60 *
61 * Copy chain variables to standard form for escape test.
62  IF (iesc.GT.0) THEN
63  lk = 0
64  DO 10 l = 1,n
65  DO 5 k = 1,3
66  lk = lk + 1
67  x4(k,l) = x(lk)
68  xdot4(k,l) = v(lk)
69  5 CONTINUE
70  10 CONTINUE
71  END IF
72 *
73 * Check binary escape.
74  IF (iesc.GT.0.AND.jesc.GT.0) THEN
75 * Form coordinates & velocities of escaping binary (local c.m. frame).
76  bcm = m(iesc) + m(jesc)
77  ri2 = 0.0
78  rdot = 0.0
79  DO 20 k = 1,3
80  xcm(k) = (m(iesc)*x4(k,iesc) + m(jesc)*x4(k,jesc))/bcm
81  vcm(k) = (m(iesc)*xdot4(k,iesc) +
82  & m(jesc)*xdot4(k,jesc))/bcm
83  ri2 = ri2 + xcm(k)**2
84  rdot = rdot + xcm(k)*vcm(k)
85  20 CONTINUE
86 *
87 * Convert to relative distance & radial velocity w.r. to inner part.
88  fac = mass/(mass - bcm)
89  ri = sqrt(ri2)
90  rdot = fac*rdot/ri
91  ri = fac*ri
92  resc = 0.5*rsum
93 *
94 * Employ parabolic escape criterion (reduce if RI > RSUM/2 & RDOT > 0).
95  IF (ri.GT.resc.AND.rdot.GT.0.0) THEN
96  IF (rdot**2.LT.2.0*mass/ri) THEN
97  iesc = 0
98  END IF
99  ELSE
100  iesc = 0
101  END IF
102 * Check single body escape.
103  ELSE IF (iesc.GT.0.AND.jesc.EQ.0) THEN
104 * Form relative distance and radial velocity for single particle.
105  ri = sqrt(x4(1,iesc)**2 + x4(2,iesc)**2 + x4(3,iesc)**2)
106  rdot = x4(1,iesc)*xdot4(1,iesc) + x4(2,iesc)*xdot4(2,iesc)
107  & + x4(3,iesc)*xdot4(3,iesc)
108  fac = mass/(mass - m(iesc))
109  rdot = fac*rdot/ri
110  ri = fac*ri
111  resc = 0.5*rsum
112 * Ensure that escaper is not close to another body.
113  rm = min(1.0/rinv(im),ri)
114 *
115 * Check approximate escape criterion outside RESC (allow RX > 2*RESC).
116  IF (rm.GT.resc.AND.rdot.GT.0.0) THEN
117  IF (rdot**2.LT.2.0*mass/ri) THEN
118  er = 0.5*rdot**2 - mass/ri
119  rx = -mass/er
120  IF (er.LT.0.0.AND.rx.LT.2.0*resc) THEN
121  iesc = 0
122  END IF
123  END IF
124  ELSE
125  iesc = 0
126  END IF
127  END IF
128 *
129 * Remove identified binary or single escaper.
130  IF (iesc.GT.0) THEN
131  WRITE (6,40) iesc, jesc, namec(iesc), ri, rdot**2,
132  & 2.0*mass/ri
133  40 FORMAT (' STABLC: IESC JESC NAM RI RD2 2*M/R ',
134  & 2i4,i6,1p,3e9.1)
135  isub = isys(5)
136  CALL reduce(iesc,jesc,isub)
137  iterm = -2
138  END IF
139  END IF
140 *
141  RETURN
142 *
143  END