Nbody6
 All Files Functions Variables
mix.f
Go to the documentation of this file.
1  SUBROUTINE mix(J1,J2,DM)
2 *
3 * Author : J. R. Hurley
4 * Date : 7th July 1998
5 *
6 * Updated by A. D. Railton 23th Feb 2011 to include preMS evolution.
7 *
8 * Evolution parameters for mixed star.
9 * ------------------------------------
10 *
11  include 'common6.h'
12 *
13  REAL*8 tscls(20),lums(10),gb(10),tms1,tms2,tms3,tn
14  REAL*8 m01,m02,m03,m1,m2,m3,age1,age2,age3,mc3,lum,rm,rcc
15  REAL*8 rr,mf,rzams,tprems,left,right,err,xx
16  REAL*8 menv,renv,k2e
17  REAL*8 mch,mxns
18  parameter(mch=1.44d0,mxns=3.0d0,err=1d-5)
19  EXTERNAL rzamsf,premsf
20  LOGICAL first
21  SAVE first
22  DATA first /.true./
23  DATA rg2 /0.1d0/
24 *
25 *
26 * Define global indices with body #I1 being most evolved.
27  IF(kstar(j1).GE.kstar(j2))THEN
28  i1 = j1
29  i2 = j2
30  IF(kstar(j1).LE.1.AND.body(j1).LT.body(j2))THEN
31  i1 = j2
32  i2 = j1
33  ENDIF
34  ELSE
35  i1 = j2
36  i2 = j1
37  END IF
38 *
39 * Specify case index for collision treatment.
40  k1 = kstar(i1)
41  k2 = kstar(i2)
42 * PreMS collision scheme: -1, -1 ==> -1; -1, 0 ==> -1; -1, x ==> x.
43  IF (k1.LT.0.OR.k2.LT.0) THEN
44  icase = -1
45  IF (max(k1,k2).GT.0) THEN
46  icase = max(k1,k2)
47  IF (k1 .EQ. -1) epoch(i1) = time*tstar
48  IF (k2 .EQ. -1) epoch(i2) = time*tstar
49  END IF
50  ELSE
51  icase = ktype(k1,k2)
52  END IF
53  IF(icase.GT.100)THEN
54  WRITE(38,*)' MIX ERROR ICASE>100 ',icase,k1,k2
55  ENDIF
56 *
57 * Record name and stellar type of the colliding stars.
58  jc = ncoll + 1
59  itype(1) = name(i1)
60  itype(2) = name(i2)
61  itype(3) = kstar(i1)
62  itype(4) = kstar(i2)
63 *
64 * Set physical time and initialize mass loss & time increment.
65  ttot = time + toff
66  tphys = ttot*tstar
67  dm = 0.d0
68  dt = 0.d0
69  rs1 = radius(i1)*su
70  rs2 = radius(i2)*su
71 *
72 * Evolve the stars to the current time unless they have been
73 * evolved further by recent Roche interaction.
74  tev1 = max(time,tev0(i1))
75 * Determine evolution time scales for first star.
76  m01 = body0(i1)*zmbar
77  m1 = body(i1)*zmbar
78  age1 = tev1*tstar - epoch(i1)
79  CALL star(k1,m01,m1,tms1,tn,tscls,lums,gb,zpars)
80 *
81 * Obtain time scales for second star.
82  m02 = body0(i2)*zmbar
83  m2 = body(i2)*zmbar
84  age2 = tev1*tstar - epoch(i2)
85  CALL star(k2,m02,m2,tms2,tn,tscls,lums,gb,zpars)
86 *
87 * Check for planetary systems - defined as HeWDs - and low-mass WDs!
88  IF(k1.EQ.10.AND.m1.LT.0.05)THEN
89  icase = k2
90  IF(k2.LE.1)THEN
91  icase = 1
92  age1 = 0.d0
93  ENDIF
94  ELSEIF(k1.GE.11.AND.m1.LT.0.15.AND.icase.EQ.6)THEN
95  icase = 1
96  ENDIF
97  IF(k2.EQ.10.AND.m2.LT.0.05)THEN
98  icase = k1
99  IF(k1.LE.1)THEN
100  icase = 1
101  age2 = 0.d0
102  ENDIF
103  ENDIF
104 *
105  WRITE(38,67)k1,m01,m1
106  67 FORMAT(' MIX OLD *1:',i4,2f10.6)
107  WRITE(38,68)k2,m02,m2
108  68 FORMAT(' MIX OLD *2:',i4,2f10.6)
109 *
110 * Specify total mass.
111  m3 = m1 + m2
112  m03 = m01 + m02
113  mc3 = 0.d0
114  kw = icase
115  age3 = 0.d0
116  tms3 = 0.d0
117 *
118 * Check energy budget for partial disruption.
119  zmb = body(i1) + body(i2)
120  rij2 = 0.0
121  vij2 = 0.0
122  rdot = 0.0
123  DO 50 k = 1,3
124  rij2 = rij2 + (x(k,i1) - x(k,i2))**2
125  vij2 = vij2 + (xdot(k,i1) - xdot(k,i2))**2
126  rdot = rdot + (x(k,i1) - x(k,i2))*(xdot(k,i1) - xdot(k,i2))
127  50 CONTINUE
128  rij = sqrt(rij2)
129 * Form binding energy of secondary and orbital kinetic energy.
130  eb = -0.5*6.68d-08*4.0d+66*m2**2/(radius(i2)*su*7.0d+10)
131  zmu = smu*body(i1)*body(i2)/(body(i1) + body(i2))
132  zke = 0.5*2.0d+33*zmu*1.0d+10*vij2*vstar**2
133  IF (zke + eb.GT.0.0.AND.rij.LT.0.5*(radius(i1)+radius(i2)).AND.
134  & max(k1,k2).LT.2) THEN
135  zm = abs(zke/eb)
136  fac = 1.0/sqrt(zm)
137  WRITE (6,55) fac, rij*su, sqrt(vij2)*vstar, eb, zke
138  55 FORMAT (' ENFORCED MASS LOSS FAC RIJ VIJ EB KE ',
139  & f7.3,f8.2,f8.2,1p,2e10.2)
140 * DM = FAC*M2
141  dm = 0.3d0*m2
142  m3 = m3 - dm
143  m03 = m3
144  m02 = m02 - dm
145  END IF
146 *
147 * Evaluate apparent age and other parameters.
148 *
149  IF (icase.EQ.-1) THEN
150 * Collisions between -1 and -1/0 stars.
151  mf = 0.1
152  m3 = (1.0 - mf)*(m1 + m2)
153  dm = m1 + m2 - m3
154 * Treat case that collided star is greater than 8 solar masses.
155 * -> start on ZAMS.
156  IF(m3.GT.8.d0)THEN
157  age3 = 0.0d0
158  ELSE
159 * From internal energy arguments, treating both stars as
160 * n = 3/2 polytropes, get new radius:
161  rr = m03**2*(1.0-mf)*2.33333
162  rr = rr/(m1*m1/rs1 + m2*m2/rs2)*(3.0 - 4.0*mf)
163 * Define the preMS variables.
164  tprems = 10d0**(43.628d0-(35.835d0*m3**1.5029d-2)
165  & *exp(m3*3.9608d-3))
166  rzams = rzamsf(m3)
167 *
168 * Do bisection on the function PREMSR to find the time at
169 * which the preMS star is at this radius.
170 *
171  ic = 0
172  left = 0
173  right = 1
174 * Make sure new radius is in right range.
175  IF(rr.LE.rzams)THEN
176  xx=0
177  IF(m3.LT.1.25) kw = 0
178  IF(m3.GE.1.25) kw = 1
179  goto 103
180  ENDIF
181  xx = 1d0
182  IF(premsf(m3,xx,rr).LE.0d0)THEN
183  xx=1d0
184  goto 103
185  ENDIF
186 *
187  101 xx=0.5*(left + right)
188  ic = ic + 1
189  IF (ic.GT.100) stop
190  IF(abs(premsf(m3,xx,rr)).LE.err)goto 103
191  IF(abs(premsf(m3,xx,rr)).GT.err)goto 102
192 *
193  102 IF(sign(1.d0,premsf(m3,xx,rr)).EQ.
194  & sign(1.d0,premsf(m3,left,rr)))left=xx
195  IF(sign(1.d0,premsf(m3,xx,rr)).EQ.
196  & sign(1.d0,premsf(m3,right,rr)))right=xx
197  goto 101
198 *
199  103 age3 = -tprems*xx
200  END IF
201  IF (m3.GT.2.0) WRITE (6,720) m3, rzams, xx, tprems, age3
202  720 FORMAT (' WATCH! M3 RZAMS XX TP AGE3 ',f7.2,1p,4e10.2)
203  CALL star(kw,m3,m3,tms3,tn,tscls,lums,gb,zpars)
204 *
205  ELSE IF(icase.EQ.1)THEN
206 * Specify new age based on complete mixing.
207  IF(k1.EQ.7) kw = 7
208  CALL star(kw,m03,m3,tms3,tn,tscls,lums,gb,zpars)
209  age3 = 0.1d0*tms3*(age1*m01/tms1 + age2*m02/tms2)/m03
210  ELSEIF(icase.EQ.3.OR.icase.EQ.6.OR.icase.EQ.9)THEN
211  mc3 = m1
212  CALL gntage(mc3,m3,kw,zpars,m03,age3)
213  ELSEIF(icase.EQ.4)THEN
214  mc3 = m1
215  age3 = age1/tms1
216  IF(age3.GT.1.d0)THEN
217  WRITE(6,*)' WARNING! MIX AGE WRONG FOR KW=4 ',age1,tms1
218  WRITE(6,*)k1,m01,m1,tev1,epoch(i1)
219  age3 = 0.99d0
220  ENDIF
221  CALL gntage(mc3,m3,kw,zpars,m03,age3)
222  ELSEIF(icase.EQ.7)THEN
223  CALL star(kw,m03,m3,tms3,tn,tscls,lums,gb,zpars)
224  age3 = tms3*(age2*m2/tms2)/m3
225  ELSEIF(icase.LE.12)THEN
226 * Ensure that a new WD has the initial mass set correctly.
227  m03 = m3
228  dt = 1.0d+04
229  ELSEIF(icase.EQ.13.OR.icase.EQ.14)THEN
230 * Set unstable Thorne-Zytkow object with fast mass loss of envelope
231 * unless the less evolved star is a WD, NS or BH.
232  IF(k2.LT.10)THEN
233  m03 = m1
234  m3 = m1
235  dm = m2
236  ntz = ntz + 1
237  WRITE (6,2) k1, k2, name(i1), name(i2)
238  2 FORMAT (' NEW TZ K* NM ',2i4,2i6)
239  ELSEIF(icase.EQ.13)THEN
240  ngb = ngb + 1
241  IF(m3.GT.mxns) kw = 14
242  ENDIF
243  dt = 1.0d+04
244  ELSEIF(icase.EQ.15)THEN
245  dm = m3
246  m3 = 0.d0
247  ELSEIF(icase.GT.100)THEN
248 * Common envelope case which should only be used after COMENV.
249  kw = k1
250  age3 = age1
251  m3 = m1
252  m03 = m01
253  dm = m2
254  ELSE
255 * This should not be reached.
256  WRITE(6,*)' ERROR MIX: ICASE NOT CAUGHT!!!'
257  WRITE(6,*)' K1 K2 -> K3 ',k2,k2,kw
258  stop
259  ENDIF
260 *
261  WRITE(38,69)kw,m03,m3
262  69 FORMAT(' MIX NEW *3:',i4,2f10.6)
263 *
264 * Determine consistent stellar type and specify mass loss.
265  IF(kw.LE.14)THEN
266  kw0 = kw
267  CALL star(kw,m03,m3,tms3,tn,tscls,lums,gb,zpars)
268  CALL hrdiag(m03,age3,m3,tms3,tn,tscls,lums,gb,zpars,
269  & rm,lum,kw,mc3,rcc,menv,renv,k2e)
270  IF(kw.NE.kw0)then
271  dm = m1 + m2 - m3
272  WRITE (6,5) name(i1), name(i2), kw0, kw, dm
273  5 FORMAT (' MIX TYPE CHANGE: NAM K* DM ',2i6,2i4,f6.2)
274  ENDIF
275  ENDIF
276  kstar(i1) = kw
277  radius(i1) = rm/su
278  zlmsty(i1) = lum
279 * Update initial mass, epoch & evolution times.
280  body0(i1) = m03/zmbar
281  epoch(i1) = tev1*tstar - age3
282  tev(i1) = tev1 + dt
283  tev0(i1) = tev1
284  dm = dm/zmbar
285 *
286 * Record final type of mixed star.
287  itype(5) = kstar(i1)
288 *
289 * Check for blue straggler formation (TM < TPHYS & KSTAR <= 1).
290  IF(tms3.LT.tphys.AND.kstar(i1).LE.1)THEN
291  WRITE (6,8) name(i1), m3, tms3, tphys, age3
292  8 FORMAT (' NEW BS (MIX): NAM M3 TM TP AGE ',
293  & i6,f6.2,3f8.1)
294 * Prepare spin diagnostics for fort.91 (rg2=0.1 is assumed).
295  semi = 2.0/rij - vij2/zmb
296  semi = 1.0/semi
297  pd = days*semi*sqrt(abs(semi)/zmb)
298  pd = max(pd,0.0d0)
299  ecc2 = (1.0 - rij/semi)**2 + rdot**2/(semi*zmb)
300  ecc = sqrt(ecc2)
301  spin1 = spin(i1)/(rg2*body(i1)*radius(i1)**2)
302  spin2 = spin(i2)/(rg2*body(i2)*radius(i2)**2)
303  ts = 1.0d+06*365.0*twopi*tstar
304  nbs = nbs + 1
305  WRITE (91,9) time+ttot, name(i1), name(i2), m3, ecc, pd,
306  & ts/spin1, ts/spin2
307  9 FORMAT (' NEW BS T NAM M3 ECC P ROT ',
308  & f8.1,2i7,f6.2,f8.4,1p,3e9.1)
309  CALL flush(91)
310  ENDIF
311 *
312  WRITE (6,10) iqcoll, k1, k2, kstar(i1), m1, m2, m3, rs1, rs2,
313  & radius(i1)*su, dm*zmbar
314  10 FORMAT (' NEW STAR: IQ K1 K2 K* M1 M2 M3 R1 R2 R* DM ',
315  & 4i3,3f6.1,3f7.1,f5.1)
316 *
317 * Open unit #13 the first time.
318  IF(first.AND.iqcoll.NE.3)THEN
319  OPEN (unit=13,status='NEW',form='FORMATTED',file='COLL')
320  first = .false.
321 *
322 * Print cluster scaling parameters at start of the run.
323  IF(ncoll.EQ.0)THEN
324  WRITE (13,20) rbar, bodym*zmbar, body1*zmbar, tscale,
325  & nbin0, nzero
326  20 FORMAT (/,6x,'MODEL: RBAR =',f5.1,' <M> =',f6.2,
327  & ' M1 =',f6.1,' TSCALE =',f6.2,
328  & ' NB =',i4,' N0 =',i6,//)
329  WRITE (13,25)
330  25 FORMAT (' TIME NAME NAME K1 K2 KC M1 M2 MC',
331  & ' DM R1 R2 r/Rc R ECC P',/)
332  ENDIF
333  ENDIF
334 *
335 * Form central distance (scaled by RC) and period in days.
336  ri2 = 0.d0
337  rij2 = 0.d0
338  vij2 = 0.d0
339  DO 30 k = 1,3
340  ri2 = ri2 + (x(k,i1) - rdens(k))**2
341  rij2 = rij2 + (x(k,i1) - x(k,i2))**2
342  vij2 = vij2 + (xdot(k,i1) - xdot(k,i2))**2
343  30 CONTINUE
344  ri = sqrt(ri2)
345  rij = sqrt(rij2)
346  semi = 2.d0/rij - vij2/zmb
347  semi = 1.d0/semi
348  tk = days*semi*sqrt(abs(semi)/zmb)
349  ecc = 1.0 - rij/semi
350 *
351 * Accumulate collision diagnostics on unit #13 (filename COLL).
352  IF (iqcoll.NE.3) THEN
353  WRITE (13,35) ttot, (itype(k),k=1,5), m1, m2, m3,
354  & dm*zmbar, rs1, rs2, ri/rc, rij*su, ecc, tk
355  35 FORMAT (1x,f7.1,2i6,3i4,4f5.1,2f7.2,f6.2,f7.2,f9.5,1p,e9.1)
356  CALL flush(13)
357  END IF
358 *
359 * Re-define indices of colliding bodies with J1 as new c.m.
360  j1 = i1
361  j2 = i2
362 *
363  IF(kstar(i1).GT.12)THEN
364  WRITE (15,40) k1, k2, kstar(i1), body(i1)*zmbar,
365  & body(i2)*zmbar, m3
366  40 FORMAT (' MIX: K1 K2 K* M1 M2 M3 ',3i4,3f7.2)
367  CALL flush(15)
368  ENDIF
369 *
370  RETURN
371  END
372 ***