Nbody6
 All Files Functions Variables
hidat.f
Go to the documentation of this file.
1  SUBROUTINE hidat
2 *
3 *
4 * Hierarchical data bank.
5 * -----------------------
6 *
7  include 'common6.h'
8  common/binary/ cm(4,mmax),xrel(3,mmax),vrel(3,mmax),
9  & hm(mmax),um(4,mmax),umdot(4,mmax),tmdis(mmax),
10  & namem(mmax),nameg(mmax),kstarm(mmax),iflag(mmax)
11  REAL*8 xx(3,3),vv(3,3),m1,m2,m3
12 * REAL*4 EB(KMAX),ECM(KMAX)
13  LOGICAL first
14  SAVE first
15  DATA first /.true./
16 *
17 *
18 * Write formatted data bank on unit 87.
19  IF (first) THEN
20  OPEN (unit=87,status='NEW',form='FORMATTED',file='HIDAT')
21  first = .false.
22  WRITE (87,1)
23  1 FORMAT (/,' NAM1 NAM2 NAM3 K* M1 M2 M3 RI',
24  & ' EMAX E0 E1 P0 P1')
25  END IF
26 *
27  IF (nmerge.GT.0) THEN
28 * Count higher-order systems.
29  mult = 0
30  DO 2 i = n+1,ntot
31  IF (name(i).LT.-2*nzero) mult = mult + 1
32  2 CONTINUE
33  WRITE (87,3) npairs, nrun, n, nc, nmerge, mult, newhi, ttot
34  3 FORMAT (/,i6,i4,i6,3i4,i6,f9.1)
35  END IF
36 *
37 * Produce output for each merged KS pair (TRIPLE, QUAD, .. [[B,B],B]).
38  ipair = 0
39 * ISTAB = 0
40  DO 30 jpair = 1,npairs
41  icm = n + jpair
42  IF (name(icm).GT.0.AND.body(icm).GT.0.0d0) go to 30
43  j2 = 2*jpair
44  j1 = j2 - 1
45 * Determine merger & ghost index (delay ghost c.m.).
46  CALL findj(j1,j,im)
47  kcm = kstarm(im)
48  IF (body(icm).GT.0.0d0) THEN
49  semi1 = -0.5*body(icm)/h(jpair)
50  ecc1 = (1.0 - r(jpair)/semi1)**2 +
51  & tdot2(jpair)**2/(body(icm)*semi1)
52  END IF
53 *
54 * Consider any multiple hierarchies first (c.m. mass > 0 also here).
55  IF (name(icm).LT.-2*nzero) THEN
56  im = 0
57 * Find the original merger and ghost index (J > N possible).
58  DO 5 k = 1,nmerge
59  IF (namem(k).EQ.name(icm) + 2*nzero) im = k
60  5 CONTINUE
61  IF (im.EQ.0) go to 30
62  j = 0
63  DO 8 k = ifirst,ntot
64  IF (nameg(im).EQ.name(k)) j = k
65  8 CONTINUE
66  IF (j.EQ.0) go to 30
67  ipair = ipair + 1
68 * Employ actual masses and two-body distance for energy & eccentricity.
69  bodycm = cm(1,im) + cm(2,im)
70 * EB(IPAIR) = CM(1,IM)*CM(2,IM)*HM(IM)/BODYCM
71  semi = -0.5*bodycm/hm(im)
72  rj = sqrt(xrel(1,im)**2 + xrel(2,im)**2 + xrel(3,im)**2)
73  td2 = 0.0
74  DO 10 k = 1,4
75  td2 = td2 + 2.0*um(k,im)*umdot(k,im)
76  10 CONTINUE
77  ecc2 = (1.0 - rj/semi)**2 + td2**2/(bodycm*semi)
78  m1 = cm(1,im)*smu
79  m2 = cm(2,im)*smu
80  m3 = body(j2)*smu
81 * Determine EMAX and other relevant parameters.
82  e0 = sqrt(ecc2)
83  CALL himax(j1,im,e0,semi,emax,emin,zi,tg,edav)
84  nam2 = name(j)
85 * Check standard case of triple or quadruple (NAME(J2) <= N or > N).
86  ELSE IF (body(icm).GT.0.0d0) THEN
87  ipair = ipair + 1
88 * Employ actual masses and two-body distance for energy & eccentricity.
89  bodycm = cm(1,im) + cm(2,im)
90 * EB(IPAIR) = CM(1,IM)*CM(2,IM)*HM(IM)/BODYCM
91  semi = -0.5*bodycm/hm(im)
92  rj = sqrt(xrel(1,im)**2 + xrel(2,im)**2 + xrel(3,im)**2)
93  td2 = 0.0
94  DO 12 k = 1,4
95  td2 = td2 + 2.0*um(k,im)*umdot(k,im)
96  12 CONTINUE
97  ecc2 = (1.0 - rj/semi)**2 + td2**2/(bodycm*semi)
98 * Include separate diagnostics for the hierarchy (inner comps J1 & J).
99  m1 = cm(1,im)*smu
100  m2 = cm(2,im)*smu
101  m3 = body(j2)*smu
102 * Retain the next part just in case.
103  e0 = sqrt(ecc2)
104  e1 = sqrt(ecc1)
105 * Determine EMAX and other relevant parameters (if needed).
106  CALL himax(j1,im,e0,semi,emax,emin,zi,tg,edav)
107  pmin = semi1*(1.0 - e1)
108  IF (j.LT.0) j = j1
109  rm = semi*(1.0 - e0)/max(radius(j1),radius(j),1.0d-20)
110  rm = min(rm,99.9d0)
111 * Obtain inclination between inner relative motion and outer orbit.
112  DO 15 k = 1,3
113  xx(k,1) = xrel(k,im)
114  xx(k,2) = 0.0
115  xx(k,3) = x(k,j2)
116  vv(k,1) = vrel(k,im)
117  vv(k,2) = 0.0
118  vv(k,3) = xdot(k,j2)
119  15 CONTINUE
120  CALL inclin(xx,vv,x(1,icm),xdot(1,icm),angle)
121  pcr = stability(m1,m2,m3,e0,e1,angle)*semi
122  nam2 = name(j)
123 * Perform stability check.
124  IF (pmin*(1.0 - gamma(jpair)).LT.pcr.AND.e1.LT.0.96.AND.
125  & list(1,j1).GT.0) THEN
126 * ISTAB = JPAIR
127  WRITE (6,20) name(j1), name(j), 180.0*angle/3.14, e1,
128  & pmin, pcr, gamma(jpair), r0(jpair)
129  20 FORMAT (' MERGE UNSTAB NAM INC E1 PM PCR G R0 ',
130  & 2i6,f7.1,f7.3,1p,4e10.2)
131  END IF
132  ELSE IF (body(j1).EQ.0.0d0) THEN
133 * Treat case of ghost binary (JPAIR saved in CM(3,IM) & CM(4,IM).
134  im = 0
135 * Find the original merger index (use ghost name for [B,B]).
136  DO 22 k = 1,nmerge
137  IF (nameg(k).EQ.name(icm)) im = k
138  22 CONTINUE
139  IF (im.EQ.0) go to 30
140  kcm = kstar(icm)
141  j = 0
142 * Locate the first KS component (former c.m. hence subtract NZERO).
143  DO 23 k = 1,ifirst
144  IF (name(k) - nzero.EQ.name(j1)) j = k
145  23 CONTINUE
146  IF (j.EQ.0) go to 30
147 * Include the case of [[B,S],[B,S]] which requires more work.
148  IF (body(j).EQ.0.0d0) THEN
149  jm = 0
150  DO 24 k = 1,nmerge
151  IF (namem(im).EQ.nameg(k)) jm = k
152  24 CONTINUE
153  IF (jm.EQ.0) go to 30
154  j = 0
155 * Employ new ghost identification to find the corresponding c.m index.
156  DO 25 k = n+1,ntot
157  IF (name(k).EQ.namem(jm)) j = k
158  25 CONTINUE
159  IF (j.EQ.0) go to 30
160  j = 2*(j - n)
161 * Note that both the triple masses (M1,M2) are saved in CM(1->4,JM).
162  END IF
163  ipair = ipair + 1
164  nam2 = name(j2)
165 * Set indices for the whole system (KS pair, c.m.; note NAME(J2) < 0).
166  jp = kvec(j)
167  icm = n + jp
168  j2 = icm
169  j = icm
170 * Form outer semi-major axis and eccentricity.
171  semi1 = -0.5*body(icm)/h(jp)
172  ecc1 = (1.0 - r(jp)/semi1)**2 +
173  & tdot2(jp)**2/(body(icm)*semi1)
174 * Copy masses from second merger component of [B,B] system.
175  bodyj1 = cm(3,im)
176  bodyj2 = cm(4,im)
177  bodycm = bodyj1 + bodyj2
178  bodycm = max(bodycm,1.0d-10)
179  m1 = bodyj1*smu
180  m2 = bodyj2*smu
181  m3 = (body(icm) - bodycm)*smu
182 * EB(IPAIR) = BODYJ1*BODYJ2*H(JPAIR)/BODYCM
183  semi = -0.5*bodycm/h(jpair)
184  ecc2 = (1.0 - r(jpair)/semi)**2 +
185  & tdot2(jpair)**2/(bodycm*semi)
186  angle = 0.0
187  emax = 0.0
188  END IF
189 *
190 * Evaluate the potential energy of c.m.
191  phi = 0.0
192  DO 26 k = ifirst,ntot
193  IF (k.EQ.icm) go to 26
194  rij2 = (x(1,k) - x(1,icm))**2 + (x(2,k) - x(2,icm))**2
195  & + (x(3,k) - x(3,icm))**2
196  phi = phi + body(k)/sqrt(rij2)
197  26 CONTINUE
198 *
199 * Evaluate eccentricities and periods.
200  e0 = sqrt(ecc2)
201  e1 = sqrt(ecc1)
202  p0 = days*semi*sqrt(abs(semi)/bodycm)
203  p1 = days*semi1*sqrt(abs(semi1)/body(icm))
204  p0 = min(p0,9999.0d0)
205 * Obtain binding energy (per unit mass) of c.m. motion.
206  vj2 = xdot(1,icm)**2 + xdot(2,icm)**2 + xdot(3,icm)**2
207  IF (body(icm).EQ.0.0d0) vj2 = 0.0
208 * ECM(IPAIR) = 0.5*VJ2 - PHI
209  ri = sqrt((x(1,icm) - rdens(1))**2 + (x(2,icm) - rdens(2))**2
210  & + (x(3,icm) - rdens(3))**2)
211  WRITE (87,28) name(j1), nam2, name(j2), kstar(j1), kstar(j),
212  & kcm, m1, m2, m3, ri, emax, e0, e1, p0, p1
213  28 FORMAT (3i6,3i3,3f5.1,f7.2,f7.3,2f6.2,f8.1,1p,e9.1)
214  30 CONTINUE
215  CALL flush(87)
216 *
217 * Check merger termination of unstable system.
218 * IF (ISTAB.GT.0) THEN
219 * KSPAIR = ISTAB
220 * IPHASE = 7
221 * CALL RESET
222 * END IF
223 *
224  RETURN
225 *
226  END