Nbody6
 All Files Functions Variables
roche.f
Go to the documentation of this file.
1 ***
2  SUBROUTINE roche(IPAIR)
3 *
4 *
5 * Roche lobe overflow.
6 * Updated 6/1/98 & 28/11/01 by J. Hurley.
7 * ---------------------------------------
8 *
9  include 'common6.h'
10  common/rche/ cmrch(13,mmax),namer(2,mmax),kstarr(3,mmax)
11  REAL*8 tscls(20),lums(10),gb(10),tm,tn,tphys0
12  REAL*8 m01,m1,age,r1,lum,mc,rcc,sep,m1ce,m2ce,rce,km0,km,m2,mcx
13  REAL*8 mass0(2),mass(2),massc(2),rad(2),radx(2),rol(2),
14  & radc(2),q(2),aj(2),tkh(2),tms(2),tbgb(2),
15  & jspin(2),ospin(2),djspin(2),dtmi(2)
16  REAL*8 menv(2),renv(2),k2str(2)
17  REAL*8 jorb,oorb,rlperi,djorb,djmb,djgr,djt,rdmin,rdisk
18  REAL*8 jspbru,ospbru
19  REAL*8 dms(2),dma(2),dmr(2),ivsqm,vwind2,vorb2
20  REAL*8 dm1,dm2,dm22,dspin,dspin0,delet,delet1,eqspin,mew,mt2
21  REAL*8 tc,tsyn,ttid,fac,fac0,ecc0,dtmmin,djtk(2),dspink(2)
22  REAL*8 mch,epsnov,eddfac,gamm1
23  parameter(mch=1.44d0,epsnov=0.d0,eddfac=100.d0,gamm1=-1.d0)
24  REAL*8 k2,k3,acc1,acc2,beta,xi,aursun
25  parameter(k3=0.21d0,acc1=3.920659d+08,acc2=1.5d0)
26  parameter(beta=0.125d0,xi=1.d0,aursun=214.95d0)
27  REAL*8 mlwind,rl
28  EXTERNAL mlwind,rl
29  LOGICAL coals,disk,novae,supedd,isave
30  CHARACTER*5 ch5
31  SAVE iwarn,igr,imb
32  DATA iwarn,igr,imb /0,0,0/
33  SAVE first
34  LOGICAL first
35  DATA first /.true./
36 *
37 *
38 * Set components & c.m. index and initialize counters & interval.
39  i1 = 2*ipair - 1
40  i2 = i1 + 1
41  i = n + ipair
42  iter = 0
43  iqcoll = 0
44  dt1 = 0.0
45  isave = .false.
46  jkick = 0
47  inew = 0
48 *
49 * Form semi-major axis and eccentricity.
50  semi = -0.5d0*body(i)/h(ipair)
51  ecc2 = (1.d0 - r(ipair)/semi)**2 + tdot2(ipair)**2/(semi*body(i))
52  ecc = sqrt(ecc2)
53 *
54 * Set age, mass ratio, Roche radius & radius (SU) for each star.
55  j = i1
56  DO 5 k = 1,2
57  q(k) = body(j)/(body(i) - body(j))
58  rol(k) = rl(q(k))*semi*su
59  rad(k) = radius(j)*su
60  dms(k) = 0.d0
61  j = i2
62  5 CONTINUE
63 *
64 * Determine indices for primary & secondary star (donor & accretor).
65  IF (rad(1)/rol(1).GE.rad(2)/rol(2)) THEN
66  j1 = i1
67  j2 = i2
68  rl1 = rol(1)
69  ELSE
70  j1 = i2
71  j2 = i1
72  rl1 = rol(2)
73  rr = rad(1)
74  rad(1) = rad(2)
75  rad(2) = rr
76  rr = rol(1)
77  rol(1) = rol(2)
78  rol(2) = rr
79  rr = q(1)
80  q(1) = q(2)
81  q(2) = rr
82  END IF
83 *
84 * Exit if physical radius is smaller than Roche radius.
85  IF (rad(1).LE.rl1) THEN
86  go to 200
87  ELSE
88 * Set the time to the latest evolution time of the components.
89  tphys0 = max(tev0(j1),tev0(j2))*tstar
90  tphys = tphys0 + toff*tstar
91 * Save the original stellar types and initialize coalescence flag.
92  kw1 = kstar(j1)
93  kw2 = kstar(j2)
94  coals = .false.
95 * write(6,*)' start roche ',name(j1),name(j2),kw1,kw2,
96 * & rad(1)/rl1,rad(2)/rol(2)
97 *
98 * Set separation & masses (solar units) and mass ratios.
99  sep = semi*su
100  semi0 = semi
101  mass(1) = body(j1)*zmbar
102  mass(2) = body(j2)*zmbar
103  mass0(1) = body0(j1)*zmbar
104  mass0(2) = body0(j2)*zmbar
105 *
106 * Set the orbital spin and angular momentum.
107  tb = yrs*semi*sqrt(semi/body(i))
108  tk = days*tb/yrs
109  oorb = twopi/tb
110  jorb = mass(1)*mass(2)/(mass(1)+mass(2))
111  & *sqrt(1.d0-ecc*ecc)*sep*sep*oorb
112 *
113  dm1 = 0.d0
114  dm2 = 0.d0
115 *
116 * Initialize local arrays.
117  j = j1
118  DO 97 k = 1,2
119  m01 = mass0(k)
120  m1 = mass(k)
121  mc = 0.d0
122  kw = kstar(j)
123  age = tev0(j)*tstar - epoch(j)
124  CALL star(kw,m01,m1,tm,tn,tscls,lums,gb,zpars)
125  CALL hrdiag(m01,age,m1,tm,tn,tscls,lums,gb,zpars,
126  & r1,lum,kw,mc,rcc,m1ce,rce,k2)
127  massc(k) = mc
128  aj(k) = age
129  menv(k) = m1ce
130  renv(k) = rce
131  k2str(k) = k2
132  radx(k) = r1
133  IF(k.EQ.1)THEN
134  radx(k) = min(radx(k),rol(k))
135  radx(k) = max(rcc,radx(k))
136  ENDIF
137  jspin(k) = max(spin(j)*spnfac,1.0d-10)
138  ospin(k) = jspin(k)/(k2*radx(k)*radx(k)*(m1-mc) +
139  & k3*rcc*rcc*mc)
140 * IF(K.EQ.1)THEN
141 * IF(OSPIN(1).GT.OORB)THEN
142 * Force co-rotation of primary and orbit to ensure that the
143 * tides do not lead to unstable Roche.
144 * OSPIN(1) = OORB
145 * JSPIN(1) = OSPIN(1)*(K2*R1*R1*(M1-MC)+K3*RCC*RCC*MC)
146 * ENDIF
147 * ENDIF
148  rlperi = rol(k)*(1.d0 - ecc)
149  dmr(k) = mlwind(kw,lum,r1,m1,mc,rlperi,zmet)
150  dma(k) = 0.d0
151  tms(k) = tm
152  tbgb(k) = tscls(1)
153  j = j2
154  97 CONTINUE
155 *
156 * Implement any mass loss between TEV0 and the Roche starting time.
157 * This is a check for the case where one star is catching up on the
158 * other and Roche occurs in the meantime!
159  j = j1
160  vorb2 = acc1*(mass(1)+mass(2))/sep
161  ivsqm = 1.d0/sqrt(1.d0-ecc*ecc)
162  DO 98 k = 1,2
163  dt = 1.0d+06*(tphys0 - tev0(j)*tstar)
164  IF(dt.EQ.0.0) goto 99
165 * VWIND2 = 2.D0*BETA*ACC1*MASS(3-K)/RAD(3-K)
166 * OMV2 = (1.D0 + VORB2/VWIND2)**(3.D0/2.D0)
167 * DMA(K) = IVSQM*ACC2*DMR(3-K)*((ACC1*MASS(K)/VWIND2)**2)/
168 * & (2.D0*SEP*SEP*OMV2)
169 * DMA(K) = MIN(DMA(K),0.8D0*DMR(3-K))
170  dms(k) = (dmr(k) - dma(k))*dt
171  djspin(k) = (2.d0/3.d0)*(dmr(k)*radx(k)*radx(k)*ospin(k) -
172  & xi*dma(k)*radx(3-k)*radx(3-k)*ospin(3-k))*dt
173  kw = kstar(j)
174  IF(kw.LT.10)THEN
175  dms(k) = min(dms(k),mass(k)-massc(k))
176  CALL magbrk(kw,mass(k),menv(k),rad(k),ospin(k),djmb)
177  djspin(k) = djspin(k) + djmb*dt
178  ENDIF
179  mass(k) = mass(k) - dms(k)
180  jspin(k) = max(jspin(k) - djspin(k),1.0d-10)
181  IF(kw.LE.2.OR.kw.EQ.7)THEN
182  m01 = mass0(k)
183  mass0(k) = mass(k)
184  body0(j) = mass(k)/zmbar
185  CALL star(kw,mass0(k),mass(k),tm,tn,tscls,lums,gb,zpars)
186  IF(kw.EQ.2)THEN
187  IF(gb(9).LT.massc(k).OR.m01.GT.zpars(3))THEN
188  mass0(k) = m01
189  ELSE
190  epoch(j) = tm + (tscls(1)-tm)*(aj(k)-tms(k))/
191  & (tbgb(k)-tms(k))
192  epoch(j) = tev0(j)*tstar - epoch(j)
193  ENDIF
194  ELSE
195  epoch(j) = tev0(j)*tstar - aj(k)*tm/tms(k)
196  ENDIF
197  ELSE
198  CALL star(kw,mass0(k),mass(k),tm,tn,tscls,lums,gb,zpars)
199  ENDIF
200  age = tphys0 - epoch(j)
201  IF((age-tn).GT.1.0d-02)THEN
202  IF(kw.LE.6)THEN
203  age = min(age,0.9999*tscls(11))
204  ELSE
205  age = min(age,0.9999*tscls(8))
206  ENDIF
207  epoch(j) = tphys0 - age
208  ENDIF
209  99 j = j2
210  98 CONTINUE
211 *
212  sep = sep*(mass(1)+mass(2)+dms(1)+dms(2))/(mass(1)+mass(2))
213  semi = sep/su
214  tb = yrs*semi*sqrt(semi*zmbar/(mass(1)+mass(2)))
215  tk = days*tb/yrs
216  oorb = twopi/tb
217  jorb = mass(1)*mass(2)/(mass(1)+mass(2))
218  & *sqrt(1.d0-ecc*ecc)*sep*sep*oorb
219 *
220 * Define first/second Roche overflow stage and increase event counter.
221  IF (kstar(i).LE.10.OR.
222  & (kstar(i).GT.10.AND.mod(kstar(i),2).EQ.0)) THEN
223  kstar(i) = kstar(i) + 1
224  nro = nro + 1
225  inew = 1
226  WRITE (6,8) name(j1), name(j2), tphys, kw1, kw2,
227  & kstar(i), mass, sep, tk, rad, rl1
228  8 FORMAT (' NEW ROCHE NAM TP K* M A P R* RL ',
229  & 2i6,f9.2,3i4,2f8.4,f8.2,1p,4e10.2)
230  IF(kstar(i).EQ.50)THEN
231  WRITE(6,9)name(j1),name(j2),kw1,kw2
232  9 FORMAT(' WARNING: TOO MUCH ROCHE NAM K* ',2i6,2i3)
233  ENDIF
234  igr = 0
235  imb = 0
236  IF (kz(8).GT.3) THEN
237  CALL binev(ipair)
238  END IF
239 *
240  IF(first)THEN
241  OPEN(unit=85,status='NEW',form='FORMATTED',
242  & file='ROCHE')
243  first = .false.
244  WRITE (85,94)
245  94 FORMAT (/,' NAM1 NAM2 K1 K2 TPHYS AGE1 ',
246  & ' AGE2 M01 M02 M1 M2 Z ',
247  & ' e P JSPIN1 JSPIN2')
248  ENDIF
249  ch5 = ' NEW '
250  WRITE(85,95)name(j1),name(j2),kstar(j1),kstar(j2),
251  & kstar(i),tphys,aj(1),aj(2),
252  & mass0(1),mass0(2),mass(1),mass(2),
253  & zmet,ecc,tk,jspin(1),jspin(2),ch5
254  95 FORMAT(2i7,3i3,3f10.3,4f7.3,f7.4,f6.3,1p,3e12.4,a5)
255  CALL flush(85)
256  ENDIF
257 *
258 * Evaluate 1/10 of nuclear time interval (yrs).
259  m1 = mass(1)
260  CALL trdot(j1,dtm,m1)
261  dtm = dtm*tstar
262  dtmi(1) = dtm
263  dtmi(2) = dtmi(1)
264 *
265 * Include time-scale check for GR & MB braking for small separations.
266 * (Note: use old orbital expressions)
267  IF (sep.LT.10.0) THEN
268  dsepg = -1.663d-09*mass(1)*mass(2)*(mass(1) + mass(2))/
269  & (sep*sep*sep)*1.0d+06
270  dtgr = -0.1d0*sep/dsepg
271  dtm = min(dtgr,dtm)
272  IF (kstar(j1).LE.1.AND.
273  & mass(1).GT.0.35.AND.mass(1).LT.1.25) THEN
274  dsepm = -4.574d-07*(mass(1) + mass(2))**2*
275  & radx(1)**3/(mass(2)*sep**4)*1.0d+06
276  dtmb = -0.1d0*sep/dsepm
277  dtm = min(dtmb,dtm)
278  END IF
279  END IF
280 *
281 * Adopt conservative time interval (expansion by factor 2 allowed).
282  km0 = dtm*1.0d+03/tb
283  zmu0 = body(j1)*body(j2)/body(i)
284  hi = h(ipair)
285  go to 50
286  END IF
287 *
288 * Specify period in yrs and N-body units.
289  10 tk = semi*sqrt(semi/body(i))
290  tb = yrs*tk
291  tk = twopi*tk
292 *
293 * Save energy, reduced mass & semi-major axis for corrections.
294 *
295  hi = h(ipair)
296  zmu0 = body(j1)*body(j2)/body(i)
297  semi0 = semi
298  ecc2 = ecc*ecc
299 *
300 * Obtain Eddington limit during one orbit.
301  dme = 2.08d-03*eddfac*(1.d0/(1.d0 + zpars(11)))*rad(2)*tb
302  supedd = .false.
303  novae = .false.
304  disk = .false.
305  rdmin = 0.0425d0*sep*(q(2)*(1.d0+q(2)))**(1.d0/4.d0)
306  IF(rdmin.GT.rad(2)) disk = .true.
307 *
308 * Adopt Kelvin-Helmholz time from the modified classical expression.
309 *
310  j = j1
311  DO 15 k = 1,2
312  tkh(k) = 1.0d+07*mass(k)/(rad(k)*zlmsty(j))
313  IF(kstar(j).LE.1.OR.kstar(j).EQ.7.OR.kstar(j).GE.10)THEN
314  tkh(k) = tkh(k)*mass(k)
315  ELSE
316  tkh(k) = tkh(k)*(mass(k) - massc(k))
317  END IF
318  j = j2
319  15 CONTINUE
320 *
321 * Define dynamical timescale for the primary.
322  tdyn = 5.05d-05*sqrt(rad(1)**3/mass(1))
323 * Identify special cases.
324 *
325  IF(kstar(j1).EQ.2)THEN
326  qc = 4.d0
327  ELSEIF(kstar(j1).EQ.3.OR.kstar(j1).EQ.5.OR.kstar(j1).EQ.6)THEN
328 * QC = (1.67D0-ZPARS(7)+2.D0*(MASSC(1)/MASS(1))**5)/2.13D0
329 *
330 * Alternatively use condition of Hjellming & Webbink, 1987, ApJ, 318, 794.
331  qc = 0.362d0 + 1.d0/(3.d0*(1.d0 - massc(1)/mass(1)))
332  ELSEIF(kstar(j1).EQ.8.OR.kstar(j1).EQ.9)THEN
333  qc = 0.784d0
334  ELSE
335  qc = 3.d0
336  ENDIF
337 *
338  IF(kstar(j1).EQ.0.AND.q(1).GT.0.695)THEN
339 *
340 * This will be dynamical mass transfer of a similar nature to common-envelope
341 * evolution. The result is always a single star.
342 *
343  taum = sqrt(tkh(1)*tdyn)
344  dm1 = mass(1)
345  IF (kstar(j2).LE.1)THEN
346 *
347 * Restrict accretion to thermal timescale of secondary.
348 *
349  dm2 = taum/tkh(2)*dm1
350  mass(2) = mass(2) + dm2
351 *
352 * Rejuvenate the main sequence star.
353 *
354  mass0(2) = mass(2)
355  CALL star(kstar(j2),mass0(2),mass(2),tm,tn,
356  & tscls,lums,gb,zpars)
357 * If the star has no convective core then the effective age decreases,
358 * otherwise it will become younger still.
359  IF(mass(2).LT.0.35.OR.mass(2).GT.1.25)THEN
360  aj(2) = tm/tms(2)*aj(2)*(mass(2) - dm2)/mass(2)
361  ELSE
362  aj(2) = tm/tms(2)*aj(2)
363  END IF
364  epoch(j2) = tphys0 - aj(2)
365 *
366 * Check for blue straggler formation (TM < TPHYS).
367  IF(tm.LT.tphys)THEN
368  WRITE(6,16)name(j2),mass(2),tm,tphys,aj(2)
369  16 FORMAT(' NEW BS (ROCHE): NAM M3 TM TP AGE ',
370  & i6,f6.2,3f8.1)
371  ENDIF
372 *
373  ELSEIF(kstar(j2).LE.6)THEN
374 *
375 * Add all the material to the giant's envelope.
376 *
377  dm2 = dm1
378  mass(2) = mass(2) + dm2
379  IF(kstar(j2).EQ.2)THEN
380  mass0(2) = mass(2)
381  CALL star(kstar(j2),mass0(2),mass(2),tm,tn,
382  & tscls,lums,gb,zpars)
383  aj(2) = tm + tscls(1)*(aj(2)-tms(2))/tbgb(2)
384  epoch(j2) = tphys0 - aj(2)
385  ENDIF
386  ELSEIF(kstar(j2).LE.12)THEN
387 *
388 * Form a new giant envelope (skip matrix test for preMS evolution).
389 *
390  dm2 = dm1
391  IF (min(kstar(j1),kstar(j2)).LT.0) THEN
392  kst = 0
393  ELSE
394  kst = ktype(kstar(j1),kstar(j2))
395  END IF
396  IF(kst.GT.100) kst = kst - 100
397  IF(kst.EQ.4)THEN
398  aj(2) = aj(2)/tms(2)
399  massc(2) = mass(2)
400  ENDIF
401 *
402 * Check for planets or low-mass WDs.
403 *
404  IF((kstar(j2).EQ.10.AND.mass(2).LT.0.05d0).OR.
405  & (kstar(j2).GE.11.AND.mass(2).LT.0.5d0))THEN
406  kst = kstar(j1)
407  mass(1) = mass(2) + dm2
408  mass(2) = 0.d0
409  ELSE
410  mass(2) = mass(2) + dm2
411  CALL gntage(massc(2),mass(2),kst,zpars,mass0(2),aj(2))
412  epoch(j2) = tphys0 - aj(2)
413  ENDIF
414  kstar(j2) = kst
415  ELSE
416 *
417 * The neutron star or black hole simply accretes at the Eddington rate.
418 *
419  dm2 = min(dme*taum/tb,dm1)
420  IF(dm2.LT.dm1) supedd = .true.
421  mass(2) = mass(2) + dm2
422  ENDIF
423  coals = .true.
424  IF(mass(2).GT.0.d0) mass(1) = 0.d0
425  kw1 = kstar(j2)
426  goto 60
427  ELSEIF(((abs(abs(2*kstar(j1)-11)-3).EQ.2.OR.kstar(j1).EQ.9).
428  & and.(q(1).GT.qc.OR.radx(1).LE.radc(1))).OR.
429  & (kstar(j1).EQ.2.AND.q(1).GT.qc).OR.
430  & (kstar(j1).EQ.4.AND.q(1).GT.qc))THEN
431 *
432 * Common-envelope evolution for critical giants and subgiants with extreme q.
433 *
434  m1ce = mass(1)
435  m2ce = mass(2)
436  WRITE (6,20) mass, kstar(j1), kstar(j2), rad, rol, sep
437  20 FORMAT (' NEW CE M K R RL A ',2f7.3,2i3,4f9.3,f9.3)
438  kw1 = kstar(j1)
439  kw2 = kstar(j2)
440  CALL comenv(mass0(1),mass(1),massc(1),aj(1),jspin(1),kw1,
441  & mass0(2),mass(2),massc(2),aj(2),jspin(2),kw2,
442  & ecc,sep,coals)
443  WRITE (6,25) mass, kw1, kw2, sep
444  25 FORMAT (' END CE M K A ',2f7.3,2i3,f9.3)
445 *
446 * Next step should be made without changing the time.
447 *
448  dtm = 0.d0
449  epoch(j1) = tphys0 - aj(1)
450  IF(coals)THEN
451  goto 60
452  ELSE
453  IF(kstar(j1).LT.13.AND.(kw1.EQ.13.OR.kw1.EQ.14))THEN
454  jkick = j1
455  kwk = kw1
456  ENDIF
457  IF (kstar(j2).LT.13.AND.(kw2.EQ.13.OR.kw2.EQ.14))THEN
458  jkick = j2
459  kwk = kw2
460  ENDIF
461  IF(kstar(j1).LT.10.AND.kw1.GE.10.AND.kw1.LE.12)THEN
462  jkick = j1
463  kwk = kw1
464  ENDIF
465  IF(kstar(j2).LT.10.AND.kw2.GE.10.AND.kw2.LE.12)THEN
466  jkick = j2
467  kwk = kw2
468  ENDIF
469  kstar(j1) = kw1
470  kstar(j2) = kw2
471  semi = sep/su
472  dm1 = m1ce - mass(1)
473  dm2 = mass(2) - m2ce
474  dm22 = dm2
475  dms(1) = 0.d0
476  dms(2) = dm1 - dm2
477 * jkick = 0
478  ENDIF
479  epoch(j2) = tphys0 - aj(2)
480 *
481  ELSEIF(kstar(j1).GE.10.AND.kstar(j1).LE.12.AND.q(1).GE.0.628)THEN
482 *
483 * Dynamic transfer from a white dwarf. Secondary will have KW > 9.
484 *
485  taum = sqrt(tkh(1)*tdyn)
486  dm1 = mass(1)
487  IF(eddfac.LT.10.d0)THEN
488  dm2 = min(dme*taum/tb,dm1)
489  IF(dm2.LT.dm1) supedd = .true.
490  ELSE
491  dm2 = dm1
492  ENDIF
493  mass(2) = mass(2) + dm2
494  IF(kstar(j1).EQ.10.AND.kstar(j2).EQ.10)THEN
495 *
496 * Assume the energy released by ignition of the triple-alpha reaction
497 * is enough to destroy the star.
498 *
499  kstar(j2) = 15
500  mass(2) = 0.d0
501  ELSEIF(kstar(j1).EQ.10.OR.kstar(j2).EQ.10)THEN
502 *
503 * Should be helium overflowing onto a CO or ONe core in which case the
504 * helium swells up to form a giant envelope so a HeGB star is formed.
505 * Allowance for the rare case of CO or ONe flowing onto He is made.
506 *
507  kstar(j2) = 9
508  IF(kstar(j2).EQ.10) massc(j2) = dm2
509  CALL gntage(massc(2),mass(2),kstar(j2),zpars,mass0(2),aj(2))
510  epoch(j2) = tphys0 - aj(2)
511  ELSEIF(kstar(j2).LE.12)THEN
512  mass0(2) = mass(2)
513 * IF(KSTAR(J1).EQ.12.AND.KSTAR(J2).EQ.11)THEN
514 *
515 * Mixture of ONe and CO
516 * or rapid accretion of CO on to CO
517 * will result in an ONe product.
518 *
519  kstar(j2) = 12
520 * ENDIF
521  ENDIF
522  mass(1) = 0.d0
523  kw1 = kstar(j2)
524 * See whether Chandrasekhar's mass is exceeded (SN).
525  IF(kstar(j2).LE.11.AND.mass(2).GT.mch)THEN
526  WRITE (6,27) name(j1), name(j2), kstar(j2), mass(2)
527  27 FORMAT (' ROCHE SN NAM K2* M2 ',2i6,i4,f6.2)
528  mass(2) = 0.d0
529  nas = nas + 1
530  kw1 = 15
531  ENDIF
532  coals = .true.
533  goto 60
534 *
535  ELSEIF(kstar(j1).EQ.13)THEN
536 *
537 * Gamma ray burster?
538 *
539  dm1 = mass(1)
540  mass(1) = 0.d0
541  kw1 = 14
542  dm2 = dm1
543  mass(2) = mass(2) + dm2
544  coals = .true.
545  ngb = ngb + 1
546  goto 60
547  ELSEIF(kstar(j1).EQ.14)THEN
548 *
549 * Both stars are black holes. Let them merge quietly.
550 *
551  dm1 = mass(1)
552  mass(1) = 0.d0
553  kw1 = kstar(j2)
554  dm2 = dm1
555  mass(2) = mass(2) + dm2
556  coals = .true.
557  goto 60
558  ELSE
559 *
560 * Form mass transfer for one Kepler orbit.
561 *
562  dm1 = 3.0d-06*tb*(log(rad(1)/rol(1))**3)*
563  & min(mass(1),5.d0)**2
564  IF(kstar(j1).EQ.2)THEN
565  mew = (mass(1) - massc(1))/mass(1)
566  dm1 = max(mew,0.01d0)*dm1
567  ELSEIF(kstar(j1).GE.10)THEN
568  dm1 = dm1*1.0d+03/max(rad(1),1.0d-04)
569  ENDIF
570  kst = kstar(j2)
571 *
572 * Limit mass transfer to the thermal rate for remaining giant-like stars and
573 * to the dynamical rate for all others.
574 *
575  IF(kstar(j1).GE.2.AND.kstar(j1).LE.9.AND.kstar(j1).NE.7)THEN
576  dm1 = min(dm1,mass(1)*tb/tkh(1))
577  ELSEIF(rad(1).GT.10.d0*rol(1).OR.(kstar(j1).LE.1.AND.
578  & kstar(j2).LE.1.AND.q(1).GT.qc))THEN
579 *
580 * Although zeta_ad is formally infinite we do not expect a star to overfill
581 * its Roche lobe by more than a factor of 10 before the stars merge.
582 *
583  WRITE (6,28) sep, dm1, rad(1), rol(1)
584  28 FORMAT (' OVERFILL A DM1 RAD ROL ',f7.1,1p,3e10.2)
585 *
586 * Form new star by combining the components inelastically.
587  iqcoll = 3
588  ch5 = ' OVER'
589  goto 160
590  ELSE
591  dm1 = min(dm1,mass(1)*tb/tdyn)
592  ENDIF
593 *
594 * Calculate wind mass loss from the stars during one orbit.
595 *
596  vorb2 = acc1*(mass(1)+mass(2))/sep
597  ivsqm = 1.d0/sqrt(1.d0-ecc*ecc)
598  j = j1
599  DO 30 k = 1,2
600  rlperi = rol(k)*(1.d0-ecc)
601  dmr(k) = mlwind(kstar(j),zlmsty(j),radx(k),
602  & mass(k),massc(k),rlperi,zmet)
603  vwind2 = 2.d0*beta*acc1*mass(k)/radx(k)
604  omv2 = (1.d0 + vorb2/vwind2)**(3.d0/2.d0)
605  dma(3-k) = ivsqm*acc2*dmr(k)*((acc1*mass(3-k)/vwind2)**2)/
606  & (2.d0*sep*sep*omv2)
607  dma(3-k) = min(dma(3-k),dmr(k))
608  j = j2
609  30 CONTINUE
610 *
611  DO 32 k = 1,2
612  dms(k) = (dmr(k)-dma(k))*tb
613  32 CONTINUE
614 *
615 * Increase time-scale to relative mass loss of 0.5% but < c.m. step.
616  km = 5.0d-03/max(abs(dm1+dms(1))/mass(1),dms(2)/mass(2))
617  km = min(km,2.d0*km0)
618  km0 = km
619  dtm = km*tb/1.0d+06
620  dt1 = dtm/tstar
621 *
622 * Take the stellar evolution timestep into account but don't let it
623 * be overly restrictive for long lived phases.
624 *
625  IF(iter.LE.100) dtm = min(dtm,dtmi(1),dtmi(2))
626  dtm = min(dtm,(time-tev0(i))*tstar)
627  dtm = max(dtm,1.0d-10)
628  km = dtm*1.0d+06/tb
629 *
630 * Decide between accreted mass by secondary and/or system mass loss.
631 *
632  taum = mass(2)/dm1*tb
633  IF(kstar(j2).LE.2.OR.kstar(j2).EQ.4)THEN
634 *
635 * Limit mass loss according to the thermal timescale of the secondary.
636 *
637  dm2 = min(1.d0,10.d0*taum/tkh(2))*dm1
638  ELSEIF(kstar(j2).GE.7.AND.kstar(j2).LE.9)THEN
639 *
640 * Naked helium star secondary swells up to a core helium burning star
641 * or SAGB star unless the primary is also a helium star.
642 *
643  IF(kstar(j1).GE.7)THEN
644  dm2 = min(1.d0,10.d0*taum/tkh(2))*dm1
645  ELSE
646  dm2 = dm1
647  dmchk = dm2 - 1.05d0*dms(2)
648  IF(dmchk.GT.0.d0.AND.dm2/mass(2).GT.1.0d-04)THEN
649  kst = min(6,2*kstar(j2)-10)
650  IF(kst.EQ.4)THEN
651  aj(2) = aj(2)/tms(2)
652  mcx = mass(2)
653  ELSE
654  mcx = massc(2)
655  ENDIF
656  m2 = mass(2) + km*(dm2 - dms(2))
657  CALL gntage(mcx,m2,kst,zpars,mass0(2),aj(2))
658  epoch(j2) = tphys0 + dtm - aj(2)
659  ENDIF
660  ENDIF
661  ELSEIF(kstar(j1).LE.6.AND.
662  & (kstar(j2).GE.10.AND.kstar(j2).LE.12))THEN
663 *
664 * White dwarf secondary.
665 *
666  IF(dm1/tb.LT.2.71d-07)THEN
667  IF(dm1/tb.LT.1.03d-07)THEN
668 *
669 * Accrete until a nova explosion blows away most of the accreted material.
670 *
671  novae = .true.
672  dm2 = min(dm1,dme)
673  IF(dm2.LT.dm1) supedd = .true.
674  dm22 = epsnov*dm2
675  ELSE
676 *
677 * Steady burning at the surface.
678 *
679  dm2 = dm1
680  ENDIF
681 *
682  ELSE
683 *
684 * Make a new giant envelope.
685 *
686  dm2 = dm1
687 *
688 * Check for planets or low-mass WDs.
689 *
690  IF((kstar(j2).EQ.10.AND.mass(2).LT.0.05d0).OR.
691  & (kstar(j2).GE.11.AND.mass(2).LT.0.5d0))THEN
692  kst = kstar(j2)
693  ELSE
694  kst = min(6,3*kstar(j2)-27)
695  m2 = mass(2) + km*(dm2 - dms(2))
696  CALL gntage(massc(2),m2,kst,zpars,mass0(2),aj(2))
697  epoch(j2) = tphys0 + dtm - aj(2)
698  ENDIF
699  ENDIF
700  ELSEIF(kstar(j2).GE.10)THEN
701 *
702 * Impose the Eddington limit.
703 *
704  dm2 = min(dm1,dme)
705  IF(dm2.LT.dm1) supedd = .true.
706  ELSE
707 *
708 * We have a giant whose envelope can absorb any transferred material.
709 *
710  dm2 = dm1
711  ENDIF
712  IF(.NOT.novae) dm22 = dm2
713 *
714  IF(kst.GE.10.AND.kst.LE.12)THEN
715  mt2 = mass(2) + km*(dm22 - dms(2))
716  IF(kstar(j1).LE.10.AND.kst.EQ.10.AND.mt2.GE.0.7)THEN
717 *
718 * HeWD can only accrete helium-rich material up to a mass of 0.7 when
719 * it is destroyed in a possible Type 1a SN.
720 *
721  mass(1) = mass(1) - km*(dm1 + dms(1))
722  mass(2) = 0.d0
723  kw1 = kstar(j1)
724  coals = .true.
725  goto 60
726  ELSEIF(kstar(j1).LE.10.AND.kst.GE.11)THEN
727 *
728 * CO and ONeWDs accrete helium-rich material until the accumulated
729 * material exceeds a mass of 0.15 when it ignites. For a COWD with
730 * mass less than 0.95 the system will be destroyed in a possible
731 * Type 1a SN. COWDs with mass greater than 0.95 and ONeWDs will survive
732 * with all the material converted to ONe.
733 *
734 ** Now changed to an ELD for all COWDs when 0.15 accreted (JH 11/01/00).
735 *
736  IF((mt2-mass0(2)).GE.0.15)THEN
737  IF(kst.EQ.11)THEN
738  mass(1) = mass(1) - km*(dm1 + dms(1))
739  mass(2) = 0.d0
740  kw1 = kstar(j1)
741  coals = .true.
742  goto 60
743  ENDIF
744  mass0(2) = mt2
745  ENDIF
746  ELSE
747  mass0(2) = mt2
748  ENDIF
749 *
750 * If the Chandrasekhar limit is exceeded for a white dwarf then destroy
751 * the white dwarf in a supernova. If the WD is ONe then a neutron star
752 * will survive the supernova and we let HRDIAG take care of this when
753 * the stars are next updated.
754 * However, first check if CO WD is accreting at a fast enough rate to
755 * convert to ONe (C. Tout 21/11/08).
756 *
757  IF(kst.EQ.11.AND.dm22.GT.0.4d0*dme/eddfac) kst = 12
758  IF((kst.EQ.10.OR.kst.EQ.11).AND.mt2.GE.mch)THEN
759  dm1 = mch - mass(2) + km*dms(2)
760  mass(1) = mass(1) - dm1 - km*dms(1)
761  mass(2) = 0.d0
762  kw1 = kstar(j1)
763  coals = .true.
764  goto 60
765  ENDIF
766  ENDIF
767 *
768 * Modify time-step & mass loss terms by speed-up factor.
769  dm1 = km*dm1
770  dm2 = km*dm2
771  dm22 = km*dm22
772  dme = km*dme
773 * Save last Roche step (yrs).
774  dtm0 = dtm*1.0d+06
775 *
776 * Transform to angular momentum for calculation of orbital changes.
777 *
778  oorb = twopi/tb
779  jorb = mass(1)*mass(2)/(mass(1)+mass(2))
780  & *sqrt(1.d0-ecc*ecc)*sep*sep*oorb
781 *
782 * Calculate orbital angular momentum change due to system mass loss.
783 *
784  djorb = ((dmr(1)+q(1)*dma(1))*mass(2)*mass(2) +
785  & (dmr(2)+q(2)*dma(2))*mass(1)*mass(1))*
786  & sep*sep*oorb/(mass(1)+mass(2))**2
787  djorb = djorb*dtm0
788 *
789 * For super-Eddington mass transfer rates, for gamm1 = -2.0,
790 * and for novae systems, assume that material is lost from
791 * the system as if a wind from the secondary.
792 * If gamm1 = -1.0 then assume the lost material carries with it
793 * the specific angular momentum of the primary and for all
794 * gamm1 > 0.0 assume that it takes away a fraction gamma of
795 * the orbital angular momentum.
796 *
797 *
798  IF(supedd.OR.novae.OR.gamm1.LT.-1.5d0)THEN
799  djorb = djorb + (dm1 - dm22)*mass(1)*mass(1)*
800  & sep*sep*oorb/(mass(1)+mass(2))**2
801  ELSEIF(gamm1.GE.0.d0)THEN
802  djorb = djorb + gamm1*(dm1 - dm2)*sep*sep*oorb
803  ELSE
804  djorb = djorb + (dm1 - dm2)*mass(2)*mass(2)*
805  & sep*sep*oorb/(mass(1)+mass(2))**2
806  ENDIF
807 *
808 * For very close systems include gravitational radiation.
809 *
810  IF(sep.LE.10.0)THEN
811  CALL grrad(mass(1),mass(2),sep,ecc,jorb,djgr,delet1)
812  djgr = djgr*dtm0
813  djorb = djorb + djgr
814  igr = igr + 1
815 * IF(IGR.LT.10.OR.ABS(DJGR)/JORB.GT.0.001)THEN
816  IF(sep.LT.1.05*(rad(1) + rad(2)))THEN
817  IF (mod(igr,10).EQ.0) WRITE (6,45) mass, sep, djgr, dtm
818  45 FORMAT (' GR BRAKE M1 M2 SEP DJ DTM ',2f7.3,1p,3e10.2)
819  ENDIF
820  ENDIF
821 *
822  dms(1) = km*dms(1)
823  IF(kstar(j1).LT.10) dms(1) = min(dms(1),mass(1) - massc(1))
824  dms(2) = km*dms(2)
825  IF(kstar(j2).LT.10) dms(2) = min(dms(2),mass(2) - massc(2))
826 *
827 * Calculate spin changes owing to stellar winds and magnetic braking.
828 *
829  djspin(1) = (2.d0/3.d0)*(dmr(1)*radx(1)*radx(1)*ospin(1) -
830  & xi*dma(1)*radx(2)*radx(2)*ospin(2))*dtm0
831  djspin(2) = (2.d0/3.d0)*(dmr(2)*radx(2)*radx(2)*ospin(2) -
832  & xi*dma(2)*radx(1)*radx(1)*ospin(1))*dtm0
833  IF(kstar(j1).LT.10.AND.mass(1).GE.0.35)THEN
834  CALL magbrk(kstar(j1),mass(1),menv(1),rad(1),ospin(1),djmb)
835  djspin(1) = djspin(1) + djmb*dtm0
836  imb = imb + 1
837  IF(jspin(1).GT.0.d0)THEN
838  IF(imb.LT.2.OR.abs(djmb)/jspin(1).GT.0.03)THEN
839  WRITE (6,40) mass, sep, djmb, dtm
840  40 FORMAT (' MB BRAKE M1 M2 SEP DJSPN DTM ',
841  & 2f7.3,1p,3e10.2)
842  ENDIF
843  ENDIF
844  ENDIF
845  IF(kstar(j2).LT.10.AND.mass(2).GE.0.35)THEN
846  CALL magbrk(kstar(j2),mass(2),menv(2),rad(2),ospin(2),djmb)
847  djspin(2) = djspin(2) + djmb*dtm0
848  imb = imb + 1
849  IF(jspin(2).GT.0.d0)THEN
850  IF(imb.LT.10.OR.abs(djmb)/jspin(2).GT.0.001)THEN
851  WRITE (6,40) mass, sep, djmb, dtm
852  ENDIF
853  ENDIF
854  ENDIF
855 *
856 * Adjust the spin angular momentum of each star owing to mass transfer
857 * and conserve total angular momentum.
858 *
859  djt = dm1*radx(1)*radx(1)*ospin(1)
860  djspin(1) = djspin(1) + djt
861  djorb = djorb - djt
862  IF(disk)THEN
863 *
864 * Alter spin of the degenerate secondary by assuming that material
865 * falls onto the star from the inner edge of a Keplerian accretion
866 * disk and that the system is in a steady state.
867 *
868  djt = dm2*twopi*aursun*sqrt(aursun*mass(2)*radx(2))
869  djspin(2) = djspin(2) - djt
870  djorb = djorb + djt
871 *
872  ELSE
873 *
874 * No accretion disk.
875 * Calculate the angular momentum of the transferred material by
876 * using the radius of the disk (see Ulrich & Burger) that would
877 * have formed if allowed.
878 *
879  rdisk = 1.7d0*rdmin
880  djt = dm2*twopi*aursun*sqrt(aursun*mass(2)*rdisk)
881  djspin(2) = djspin(2) - djt
882  djorb = djorb + djt
883 *
884  ENDIF
885 *
886 * Adjust the secondary spin if a nova eruption has occurred.
887 *
888  IF(novae)THEN
889  djt = (dm2 - dm22)*radx(2)*radx(2)*ospin(2)
890  djspin(2) = djspin(2) + djt
891  ENDIF
892 *
893 * Calculate any changes owing to tidal evolution (includes eccentricity).
894 *
895  j = j1
896  delet = 0.d0
897  DO 500 k = 1,2
898  IF((kstar(j).LE.9.AND.rad(k).GE.0.01d0*rol(k)).OR.
899  & (kstar(j).GE.10.AND.j.EQ.j1))THEN
900 *
901  CALL bsetid(kstar(j),mass(k),massc(k),menv(k),radx(k),
902  & radc(k),renv(k),zlmsty(j),ospin(k),k2str(k),
903  & q(3-k),sep,ecc,oorb,delet1,dspin,eqspin,djt)
904 *
905  delet = delet + delet1*dtm0
906  IF(dtm0.GT.0.d0.AND.abs(dspin).GE.tiny)THEN
907  dspin0 = dspin
908  IF(dspin.GE.0.d0)THEN
909  dspin = min(dtm0*dspin,eqspin-ospin(k))/dtm0
910  ELSE
911  dspin = max(dtm0*dspin,eqspin-ospin(k))/dtm0
912  ENDIF
913  djt = djt*dspin/dspin0
914  ELSE
915  djt = 0.d0
916  ENDIF
917  djorb = djorb + djt*dtm0
918  djspin(k) = djspin(k) - djt*dtm0
919 *
920  ENDIF
921 *
922  j = j2
923  500 CONTINUE
924 *
925 * Update the initial and current masses.
926 *
927  kstar(j2) = kst
928  mass(1) = mass(1) - dm1 - dms(1)
929  IF(kstar(j1).LE.1.OR.kstar(j1).EQ.7) mass0(1) = mass(1)
930  mass(2) = mass(2) + dm22 - dms(2)
931  IF(kstar(j2).LE.1.OR.kstar(j2).EQ.7) mass0(2) = mass(2)
932 *
933 * Update spins and ensure that the star does not spin up beyond break-up.
934 * For a HG star check if the initial mass can be reduced.
935 *
936  j = j1
937  DO 502 k = 1,2
938  jspin(k) = max(jspin(k) - djspin(k),1.0d-10)
939  ospbru = twopi*sqrt(mass(k)*aursun**3/radx(k)**3)
940  jspbru = (k2str(k)*(mass(k)-massc(k))*radx(k)*radx(k) +
941  & k3*massc(k)*radc(k)*radc(k))*ospbru
942  IF(jspin(k).GT.jspbru)THEN
943  djorb = djorb - (jspin(k) - jspbru)
944  jspin(k) = jspbru
945  ENDIF
946  IF(kstar(j).EQ.2.AND.mass0(k).LE.zpars(3))THEN
947  m01 = mass0(k)
948  mass0(k) = mass(k)
949  CALL star(kstar(j),mass0(k),mass(k),tmsnew,tn,tscls,
950  & lums,gb,zpars)
951  IF(gb(9).LT.massc(k)) mass0(k) = m01
952  ENDIF
953  j = j2
954  502 CONTINUE
955 *
956 * Combine the mass lost during transfer with the secondary's wind.
957 *
958  dms(2) = dms(2) + dm1 - dm22
959 *
960 * Adjust the orbital angular momentum and reset the orbital separation.
961 *
962  ecc = max(ecc - delet,0.001d0)
963  jorb = max(jorb - djorb,0.d0)
964  sep = (mass(1) + mass(2))*jorb*jorb/
965  & ((mass(1)*mass(2)*twopi)**2*aursun**3*(1.d0-ecc*ecc))
966  sep = max(sep,rad(2))
967  semi = sep/su
968 *
969 * Produce diagnostics for different types of CV and X-ray binaries.
970 * WRITE (19,38) NAME(J1), NAME(J2), KSTAR(J1), KSTAR(J2),
971 * & TPHYS, MASS, SEP, RAD(1)/ROL(1),
972 * & DM1/DTM/1.0E06, DM2/DTM/1.0E06, DTM
973 * 38 FORMAT (' ROCHE NAM K* T M A R/RL MD12 DT ',
974 * & 2I6,2I4,F9.2,2F6.1,F7.2,F6.2,1P,3E9.1)
975 * CALL flush(19)
976 *
977 * Update KS variables to SEMI1 while maintaining low eccentricity.
978 * SEMI1 = SEMI
979 * CALL decay(IPAIR,SEMI1)
980 *
981  ENDIF
982 *
983 * Rejuvenate secondary and age primary if they are on the main sequence.
984 *
985  IF(kstar(j1).LE.2.OR.kstar(j1).EQ.7)THEN
986  CALL star(kstar(j1),mass0(1),mass(1),tm,tn,
987  & tscls,lums,gb,zpars)
988  IF(kstar(j1).EQ.2)THEN
989  aj(1) = tm + (tscls(1)-tm)*(aj(1)-tms(1))/(tbgb(1)-tms(1))
990  ELSE
991  aj(1) = tm/tms(1)*aj(1)
992  ENDIF
993  epoch(j1) = tphys0 - aj(1)
994  ENDIF
995 *
996  IF(kstar(j2).LE.2.OR.kstar(j2).EQ.7)THEN
997  CALL star(kstar(j2),mass0(2),mass(2),tm,tn,
998  & tscls,lums,gb,zpars)
999  IF(kstar(j2).EQ.2)THEN
1000  aj(2) = tm + (tscls(1)-tm)*(aj(2)-tms(2))/(tbgb(2)-tms(2))
1001  ELSEIF((mass(2).LT.0.35.OR.mass(2).GT.1.25).AND.
1002  & kstar(j2).NE.7)THEN
1003  aj(2) = tm/tms(2)*aj(2)*(mass(2) - dm22)/mass(2)
1004  ELSE
1005  aj(2) = tm/tms(2)*aj(2)
1006  END IF
1007  epoch(j2) = tphys0 - aj(2)
1008 *
1009 * Check for blue straggler formation (TM < TPHYS).
1010  IF(kstar(j2).LE.1)THEN
1011  IF(tms(2).GT.tphys.AND.tm.LT.tphys)THEN
1012  nbr = nbr + 1
1013  WRITE(6,48)name(j2),mass(2),dm2,semi*su,tm,tphys,
1014  & kstar(j1)
1015  48 FORMAT (' NEW BR NAM M2 DM2 A TM TP KW1 ',
1016  & i6,2f7.3,3f8.1,i4)
1017  ENDIF
1018  ENDIF
1019 *
1020  ENDIF
1021  tphys0 = tphys0 + dtm
1022  tphys = tphys + dtm
1023 *
1024 * Accumulate the net system mass loss.
1025  50 zmsy = zmsy + dms(1) + dms(2)
1026 *
1027 * Update masses.
1028  body(j1) = mass(1)/zmbar
1029  body(j2) = mass(2)/zmbar
1030  body0(j1) = mass0(1)/zmbar
1031  body0(j2) = mass0(2)/zmbar
1032 *
1033 * Update mass loss & binary mass and re-define binding energy.
1034  dmt = dms(1) + dms(2)
1035  dmt = dmt/zmbar
1036  body(i) = body(i) - dmt
1037  h(ipair) = -0.5d0*body(i)/semi
1038 *
1039 * Include mass loss from system.
1040  dt2 = 1.d0
1041  IF (dmt.GT.0.0) THEN
1042  dt2 = min(dt2,0.02d0*body(j1)*dtm/(dmt*tstar))
1043 * Modify KS variables at constant eccentricity (expand or contract).
1044 * CALL expand(IPAIR,SEMI1)
1045  CALL expand(ipair,semi0)
1046 * Resolve KS components.
1047  CALL resolv(ipair,1)
1048 * Copy neighbour list for force corrections (no need!).
1049 * IPHASE = 0
1050 * NNB = LIST(1,I)
1051 * DO 55 L = 1,NNB+1
1052 * ILIST(L) = LIST(L,I)
1053 * 55 CONTINUE
1054 * Correct neighbour forces and obtain the corresponding energy loss.
1055  IF (dmt*smu.LT.0.05) THEN
1056  CALL ficorr(i,dmt)
1057  ELSE
1058  CALL fcorr(i,dmt,0)
1059  END IF
1060  zmass = zmass - dmt
1061  ELSE IF (abs(semi - semi0).GT.1.0d-10*semi) THEN
1062 * Modify KS variables at constant eccentricity to treat change in SEMI.
1063  CALL expand(ipair,semi0)
1064  END IF
1065 *
1066 * Subtract energy correction terms due to change in relative motion.
1067  zmu = body(j1)*body(j2)/body(i)
1068  emdot = emdot + zmu0*hi - zmu*h(ipair)
1069  egrav = egrav + zmu0*hi - zmu*h(ipair)
1070  de = zmu0*hi - zmu*h(ipair)
1071 *
1072 * Increase event counter and update mass-loss.
1073  nroche = nroche + 1
1074  zmro = zmro + dm1
1075 *
1076  tb = yrs*semi*sqrt(semi/body(i))
1077  tk = days*tb/yrs
1078 *
1079 * Check termination by coalescence.
1080  60 IF(coals)THEN
1081  tphys = (time+toff)*tstar
1082  body0(j1) = mass0(1)/zmbar
1083  body0(j2) = mass0(2)/zmbar
1084  spin(j1) = jspin(1)/spnfac
1085  spin(j2) = jspin(2)/spnfac
1086  kw2 = 15
1087 * Ensure zero BODY0 for secondary to avoid confusion in COAL
1088 * unless both stars heve zero MASS.
1089  ii = j2
1090  k = 2
1091  IF(mass(1).EQ.0.0.AND.mass(2).NE.0.0)THEN
1092  ii = j1
1093  k = 1
1094  ENDIF
1095  body0(ii) = 0.d0
1096  tev(j1) = tphys0/tstar
1097  ch5 = ' COAL'
1098  tk = 0.0
1099  WRITE(85,95)name(j1),name(j2),kw1,kw2,kstar(i),
1100  & tphys,aj(k),tk,mass0(k),mass0(3-k),
1101  & mass(k),tk,zmet,ecc,tk,jspin(k),tk,ch5
1102 *
1103  CALL coal(ipair,kw1,kw2,mass)
1104  go to 200
1105  ENDIF
1106 *
1107 * Obtain the stellar parameters for the next step (first J1, then J2).
1108 *
1109  j = j1
1110  iq = 0
1111  DO 70 k = 1,2
1112  age = tphys0 - epoch(j)
1113  m01 = mass0(k)
1114  m1 = mass(k)
1115  mc = massc(k)
1116  kw = kstar(j)
1117  CALL star(kw,m01,m1,tm,tn,tscls,lums,gb,zpars)
1118  CALL hrdiag(m01,age,m1,tm,tn,tscls,lums,gb,zpars,
1119  & r1,lum,kw,mc,rcc,m1ce,rce,k2)
1120  CALL trdot2(kw,age,tm,tn,tscls,dtmi(k),dtr)
1121  IF(k.EQ.1) dtmax = dtr/tstar
1122 *
1123 * Update evolution times.
1124 *
1125  tev(j) = tphys0/tstar
1126  tev0(j) = tev(j)
1127 * write(6,*)' roche star ',j,name(j),kstar(j),kw,log10(lum)
1128 *
1129 * Quit Roche on any transition that involves a supernova as the mass
1130 * will change suddenly.
1131 *
1132  IF((kstar(j).LT.13.AND.kw.GE.13).OR.
1133  & (kstar(j).LT.10.AND.kw.GE.10.AND.kw.LE.12))THEN
1134  iq = j
1135  body0(j) = mass0(k)/zmbar
1136  body(j) = mass(k)/zmbar
1137  spin(j) = jspin(k)/spnfac
1138  kwk = kw
1139  jk = j
1140  go to 68
1141  ENDIF
1142 *
1143 * Save relevant solar quantities.
1144 *
1145  aj(k) = age
1146  IF(kw.NE.kstar(j))THEN
1147  epoch(j) = tphys0 - age
1148  kstar(j) = kw
1149  mass0(k) = m01
1150  body0(j) = mass0(k)/zmbar
1151  mass(k) = m1
1152  body(j) = mass(k)/zmbar
1153  ENDIF
1154  radius(j) = r1/su
1155  rad(k) = r1
1156  radc(k) = rcc
1157  massc(k) = mc
1158  renv(k) = rce
1159  menv(k) = m1ce
1160  k2str(k) = k2
1161  zlmsty(j) = lum
1162  tms(k) = tm
1163  tbgb(k) = tscls(1)
1164  q(k) = mass(k)/mass(3-k)
1165  rol(k) = rl(q(k))*sep
1166  radx(k) = r1
1167  IF(j.EQ.j1)THEN
1168  radx(k) = min(radx(k),rol(k))
1169  radx(k) = max(rcc,radx(k))
1170  ENDIF
1171  ospin(k) = jspin(k)/(k2*radx(k)*radx(k)*(m1-mc) +
1172  & k3*rcc*rcc*mc)
1173  spin(j) = jspin(k)/spnfac
1174  68 j = j2
1175  70 CONTINUE
1176 *
1177 * Check Roche termination due to sudden mass loss.
1178  tev0(i) = tev0(j1)
1179  IF(jkick.GT.0)THEN
1180 * Implement velocity kick without mass loss for NS & BH.
1181  kstar(i) = kstar(i) + 1
1182  ch5 = ' KICK'
1183  WRITE(85,95)name(j1),name(j2),kstar(j1),kstar(j2),kstar(i),
1184  & tphys,aj(1),aj(2),mass0(1),mass0(2),
1185  & mass(1),mass(2),zmet,ecc,tk,jspin(1),jspin(2),ch5
1186  CALL kick2(jkick)
1187  goto 160
1188  ELSE IF(iq.GT.0)THEN
1189  tev(i) = 1.0d+10
1190  tev(j1) = tphys0/tstar
1191  tev(j2) = tev(j1)
1192  kstar(i) = kstar(i) + 1
1193  kstar(jk) = kwk
1194  ch5 = ' KICK'
1195  WRITE(85,95)name(j1),name(j2),kstar(j1),kstar(j2),kstar(i),
1196  & tphys,aj(1),aj(2),mass0(1),mass0(2),
1197  & mass(1),mass(2),zmet,ecc,tk,jspin(1),jspin(2),ch5
1198  WRITE (6,71) name(iq), name(j1), name(j2), kstar(j1),
1199  & kstar(j2), kw1, mass(1), mass(2), rad(1), rol(1)
1200  71 FORMAT (' ROCHE TERM NAM K* KW M R1 RL1 ',
1201  & 3i6,3i4,2f7.3,2f8.2)
1202  goto 140
1203  ENDIF
1204 *
1205 ***
1206  IF(iter.EQ.0.AND.inew.EQ.1)THEN
1207 *
1208 * Circularize the orbit if necessary.
1209 * Force co-rotation of primary with orbit if necessary.
1210 *
1211  tc = 1.0d+04
1212  tsyn = 1.0d+20
1213  iterb = 0
1214  ecc0 = ecc
1215  fac0 = ospin(1)/oorb
1216  semi0 = semi
1217 *
1218  80 CONTINUE
1219 *
1220  fac = ospin(1)/oorb
1221  IF(fac.GT.1.d0) fac = 1.d0/fac
1222 *
1223  IF((ecc-0.001d0).GT.tiny.OR.fac.LT.0.98d0)THEN
1224 * Calculate changes owing to tidal evolution.
1225  delet = 0.d0
1226  j = j1
1227  DO k = 1,2
1228  dspink(k) = 0.d0
1229  djtk(k) = 0.d0
1230  IF((kstar(j).LE.9.AND.rad(k).GE.0.01d0*rol(k)).OR.
1231  & (kstar(j).GE.10.AND.j.EQ.j1))THEN
1232 *
1233  CALL bsetid(kstar(j),mass(k),massc(k),menv(k),radx(k),
1234  & radc(k),renv(k),zlmsty(j),ospin(k),k2str(k),
1235  & q(3-k),sep,ecc,oorb,delet1,dspin,eqspin,djt)
1236 *
1237  delet = delet + delet1
1238  dspink(k) = dspin
1239  djtk(k) = djt
1240  ENDIF
1241  j = j2
1242  ENDDO
1243 * Include gravitational radiation.
1244  CALL grrad(mass(1),mass(2),sep,ecc,jorb,djgr,delet1)
1245  delet = delet + delet1
1246 * Include magnetic braking.
1247  CALL magbrk(kstar(j1),mass(1),menv(1),rad(1),ospin(1),djmb)
1248  djspin(1) = djtk(1) + djmb
1249 *
1250  ttid = 1.0d+20
1251  dtm0 = 1.0d+20
1252  dtmmin = 0.d0
1253  IF(ecc.GT.0.001d0)THEN
1254  IF(abs(delet).GT.1.0d-14)THEN
1255 * Allow eccentricity to change by 10% at most with a minimum of 0.01.
1256  dtm0 = max(0.1d0*ecc,0.0005d0)/abs(delet)
1257  dtmmin = min(0.01d0,ecc-0.001d0)/abs(delet)
1258  tc = ecc/abs(delet)
1259  tc = tc/1.0d+06
1260  ttid = tc
1261  ELSE
1262 * Perform instant circularization conserving orbital angular momentum.
1263  ecc = 0.001d0
1264  sep = jorb*(mass(1)+mass(2))/(mass(1)*mass(2)*oorb)
1265  sep = sqrt(sep)
1266  tb = (sep/aursun)*sqrt(sep/(aursun*(mass(1)+mass(2))))
1267  tk = days*tb/yrs
1268  oorb = twopi/tb
1269  ENDIF
1270  ELSE
1271  delet = 0.d0
1272  ENDIF
1273  IF(abs(djspin(1)).GT.1.0d-14)THEN
1274  IF(abs(dspink(1)).GT.1.0d-20)THEN
1275  tsyn = abs(oorb-ospin(1))/abs(dspink(1))
1276  dtm0 = min(dtm0,0.3d0*tsyn)
1277  tsyn = tsyn/1.0d+06
1278  ttid = min(ttid,tsyn)
1279  ELSE
1280 * Allow jspin to change by 50% at most.
1281  dtm0 = min(dtm0,0.5d0*jspin(1)/abs(djspin(1)))
1282  ENDIF
1283  ENDIF
1284 *
1285  IF(iterb.EQ.0.AND.nwarn.LT.50)THEN
1286  WRITE(6,710)name(j1),kstar(j1),kstar(j2),ecc0,fac0,
1287  & tc,tsyn
1288  710 FORMAT(' CIRC & SYNCH NM K* ECC0 SPIN1/OORB TC TSYN ',
1289  & i7,2i4,f7.4,f9.3,1p,2e10.2)
1290  nwarn = nwarn + 1
1291  ENDIF
1292 *
1293  IF(ttid.LT.min(tphys,10.d0))THEN
1294  itro = 0
1295  dtm0 = max(dtm0,dtmmin)
1296  delet = delet*dtm0
1297  81 djorb = djgr*dtm0
1298 * Include magnetic braking for both stars.
1299  djspin(1) = djmb*dtm0
1300  CALL magbrk(kstar(j2),mass(2),menv(2),rad(2),ospin(2),
1301  & djmb)
1302  djspin(2) = djmb*dtm0
1303 * Check equilibrium spin and add tidal changes.
1304  DO k = 1,2
1305  IF(dspink(k).GT.1.0d-10)THEN
1306  dspin0 = min(dtm0*dspink(k),eqspin-ospin(k))/dtm0
1307  djtk(k) = dspin0*djtk(k)/dspink(k)
1308  ELSEIF(dspink(k).LT.-1.0d-10)THEN
1309  dspin0 = max(dtm0*dspink(k),eqspin-ospin(k))/dtm0
1310  djtk(k) = dspin0*djtk(k)/dspink(k)
1311  ELSE
1312  dspink(k) = 0.d0
1313  ENDIF
1314  djorb = djorb + djtk(k)*dtm0
1315  djspin(k) = djspin(k) - djtk(k)*dtm0
1316  ENDDO
1317 * Update spins and ensure that the star does not spin up beyond break-up.
1318  DO k = 1,2
1319  jspin(k) = max(jspin(k) - djspin(k),1.0d-10)
1320  ospbru = twopi*sqrt(mass(k)*aursun**3/radx(k)**3)
1321  jspbru = (k2str(k)*(mass(k)-massc(k))*radx(k)*radx(k)
1322  & + k3*massc(k)*radc(k)*radc(k))*ospbru
1323  IF(jspin(k).GT.jspbru)THEN
1324  djorb = djorb - (jspin(k) - jspbru)
1325  jspin(k) = jspbru
1326  ENDIF
1327  ospin(k) = jspin(k)/
1328  & (k2str(k)*radx(k)*radx(k)*(mass(k)-massc(k))
1329  & + k3*radc(k)*radc(k)*massc(k))
1330  ENDDO
1331 * Impose 2.5 % limit on change of JORB (Chris Tout 1/2013).
1332  IF (abs(djorb).GT.0.1*jorb.AND.itro.LE.5) THEN
1333  dtm0 = 0.1*jorb*dtm0/abs(djorb)
1334  delet = 0.1*jorb*delet/abs(djorb)
1335  itro = itro + 1
1336  IF (jorb.GT.0.0d0) WRITE (6,83) djorb/jorb, jorb
1337  83 FORMAT (' ROCHE LIMIT DJO/JORB JORB ',1p,2e10.2)
1338  go to 81
1339  ENDIF
1340 * Adjust the eccentricity and orbital angular momentum.
1341  ecc = max(ecc - delet,0.001d0)
1342  jorb = max(jorb - djorb,0.d0)
1343 * Reset the orbital separation and Roche-lobe radii.
1344  sep = (mass(1) + mass(2))*jorb*jorb/
1345  & ((mass(1)*mass(2)*twopi)**2*aursun**3*(1.d0-ecc*ecc))
1346  sep = max(sep,rad(2))
1347 * Perform coalescence check after shrinkage.
1348  IF (rad(1)+rad(2).LT.sep)THEN
1349  coals = .true.
1350  go to 60
1351  ENDIF
1352  DO k = 1,2
1353  rol(k) = rl(q(k))*sep
1354  ENDDO
1355  radx(1) = min(rad(1),rol(1))
1356  radx(1) = max(radc(1),radx(1))
1357 *
1358  tb = (sep/aursun)*sqrt(sep/(aursun*(mass(1)+mass(2))))
1359  tk = days*tb/yrs
1360  oorb = twopi/tb
1361  iterb = iterb + 1
1362  IF(iterb.LE.100) goto 80
1363  ELSE
1364  IF(ecc.GT.0.02d0)THEN
1365  WRITE(6,*)' WARNING: will not circularize'
1366  ENDIF
1367  IF(fac.LT.0.98d0.AND.kstar(j1).LT.10)THEN
1368  WRITE(6,*)' WARNING: will not synchronize'
1369  ENDIF
1370  iterb = iterb + 1
1371  ENDIF
1372  ENDIF
1373  IF(iterb.GT.0)THEN
1374  WRITE(6,711)ecc,ospin(1)/oorb,sep,tk,rad(1),rol(1)
1375  711 FORMAT(' NEW PARAMS ECC SPIN1/OORB A P R1 RL1 ',
1376  & f7.4,f9.3,f8.2,1p,3e10.2)
1377  spin(j1) = jspin(1)/spnfac
1378  spin(j2) = jspin(2)/spnfac
1379 * Set new orbital elements (ECC, SEMI & JORB have changed).
1380  hi = h(ipair)
1381  semi = sep/su
1382 * Specify consistent orbital energy from new semi-major axis.
1383  h(ipair) = -0.5d0*body(i)/semi
1384 * Change the KS variables at constant eccentricity.
1385  CALL expand(ipair,semi0)
1386 * Transform to pericentre (note TIME may change).
1387  CALL ksperi(ipair)
1388 * Modify the eccentricity at constant energy.
1389  CALL deform(ipair,ecc0,ecc)
1390  zmu = body(j1)*body(j2)/body(i)
1391  emdot = emdot + zmu*(hi - h(ipair))
1392  egrav = egrav + zmu*(hi - h(ipair))
1393  ENDIF
1394 *
1395  ENDIF
1396 *
1397 * Check if components should be saved for output, cf. HRPLOT
1398  j = j1
1399  IF(tev(j).GE.tplot.AND..NOT.isave)THEN
1400  isave = .true.
1401 * Check if components are already saved (temporary)
1402  ii = 0
1403  DO 700 k = 1,nrsave
1404  IF(name(j1).EQ.namer(1,k)) ii = name(j1)
1405  IF(name(j1).EQ.namer(2,k)) ii = name(j1)
1406  700 CONTINUE
1407  IF(ii.EQ.0)THEN
1408  nrsave = nrsave + 1
1409  IF(nrsave.GT.mmax)THEN
1410  iwarn = iwarn + 1
1411  IF (iwarn.LT.20) THEN
1412  WRITE(6,*)' ROCHE WARNING: NRSAVE > MMAX'
1413  END IF
1414  nrsave = mmax
1415  ENDIF
1416  namer(1,nrsave) = name(j1)
1417  namer(2,nrsave) = name(j2)
1418  kstarr(1,nrsave) = kstar(i)
1419  kstarr(2,nrsave) = kstar(j1)
1420  kstarr(3,nrsave) = kstar(j2)
1421  cmrch(1,nrsave) = semi
1422  DO 701 k = 1,3
1423  cmrch(k+1,nrsave) = x(k,i)
1424  cmrch(k+4,nrsave) = xdot(k,i)
1425  701 CONTINUE
1426  cmrch(8,nrsave) = body0(j1)
1427  cmrch(9,nrsave) = body(j1)
1428  cmrch(10,nrsave) = epoch(j1)
1429  cmrch(11,nrsave) = body0(j2)
1430  cmrch(12,nrsave) = body(j2)
1431  cmrch(13,nrsave) = epoch(j2)
1432  ENDIF
1433  ENDIF
1434 *
1435 * See whether the primary still fills its Roche lobe.
1436 *
1437  IF(rad(1).GT.rol(1))THEN
1438 *
1439 * Test for a contact system.
1440 *
1441  IF (rad(2).GT.rol(2).AND.iter.GT.0) THEN
1442  ncont = ncont + 1
1443  WRITE (6,72) mass(1), mass(2), kstar(j1), kstar(j2), sep
1444  72 FORMAT (' CONTACT M1 M2 KW1 KW2 A ',2f7.3,2i3,f8.3)
1445 *
1446 * Form new star by combining the components inelastically.
1447  iqcoll = 3
1448  ch5 = ' CONT'
1449  go to 160
1450  END IF
1451 *
1452  IF (iwarn.LT.100.AND.rad(1).GT.2.0*rol(1)) THEN
1453  iwarn = iwarn + 1
1454  WRITE (6,73) kstar(j1), kstar(j2), mass(1), mass(2),
1455  & rad(1), rol(1), dm1, dm2, dtm
1456  73 FORMAT (' BIG ROCHE K12 M12 R1 RL1 DM12 DT ',
1457  & 2i3,2f7.3,2f8.3,1p,3e10.2)
1458  END IF
1459 *
1460 * Produce diagnostics for cases involving degenerate objects.
1461  IF (iter.EQ.1.AND.inew.GT.0.AND.kstar(j2).GE.10) THEN
1462  IF (abs(dtm).GT.1.0d-20) THEN
1463  pd = days*semi*sqrt(semi/body(i))
1464  WRITE (22,58) name(j1), name(j2),
1465  & kstar(j1), kstar(j2),
1466  & mass(1), mass(2), tphys, semi*su, pd,
1467  & dm1/dtm/1.0e+06, dm2/dtm/1.0e+06
1468  58 FORMAT (' DEGEN ROCHE NAM K* M TP A P M1D M2D ',
1469  & 2i6,2i4,2f6.2,f8.1,2f7.1,1p,2e9.1)
1470  CALL flush(22)
1471  END IF
1472  END IF
1473 *
1474  iter = iter + 1
1475  IF(tev0(i).LT.time) goto 10
1476  IF (iter.EQ.1.AND.gamma(ipair).LT.gmin) go to 10
1477  ELSE
1478  WRITE (6,76) kstar(j1), kstar(j2), mass(1),
1479  & mass(2),rad(1), rol(1), dm1, dm2, dtm
1480  76 FORMAT(' END ROCHE K12 M12 R1 RL1 DM DT ',
1481  & 2i3,2f7.3,2f8.2,2f8.3,1p,e10.2)
1482 * Check optional diagnostics for degenerate objects.
1483  IF(max(kstar(j1),kstar(j2)).GE.10)THEN
1484  IF(kz(8).GT.3)THEN
1485  CALL degen(ipair,ipair,4)
1486  ELSE
1487  ndd = ndd + 1
1488  ENDIF
1489  ENDIF
1490  IF (kstar(j1).GE.10.AND.kstar(j1).LE.12) nwd = nwd + 1
1491 * Define end of Roche stage.
1492  kstar(i) = kstar(i) + 1
1493  CALL trflow(ipair,dtr)
1494  tev(i) = time + dtr
1495  IF (kz(8).GT.3) THEN
1496  CALL binev(ipair)
1497  END IF
1498  ch5 = ' END '
1499  WRITE(85,95)name(j1),name(j2),kstar(j1),kstar(j2),kstar(i),
1500  & tphys,aj(1),aj(2),mass0(1),mass0(2),
1501  & mass(1),mass(2),zmet,ecc,tk,jspin(1),jspin(2),ch5
1502  CALL flush(85)
1503  END IF
1504 *
1505 * Check standard exit condition.
1506  IF(iter.EQ.0) goto 150
1507 *
1508  140 CONTINUE
1509 * Set new c.m. time only during active stage (otherwise by TRFLOW).
1510  IF (mod(kstar(i),2).EQ.1.AND.iq.EQ.0) THEN
1511  tev(i) = tphys0/tstar
1512 * Advance update time (extra for critical configurations).
1513  IF(list(1,i1).GT.0)THEN
1514  dtmax = min(dtmax,50.d0*dt1)
1515  ELSE
1516  dtmax = min(dtmax,10.d0*dt1)
1517  ENDIF
1518  dtmax = min(dtmax,dt2)
1519 * DTMAX = MIN(DTMAX,STEPX)
1520  tev(i) = tev(i) + max(dtmax,1.0d-07)
1521  tev(j1) = tev(i) + 2.0*stepx + step(i1)
1522  tev(j2) = tev(j1)
1523  tmdot = min(tmdot,tev(i))
1524  z = (1.0 - r(ipair)/semi)**2 + tdot2(ipair)**2/(body(i)*semi)
1525  ecc = sqrt(z)
1526  IF (ecc.GT.0.01) THEN
1527  qp = semi*(1.0 - ecc)
1528  icirc = -1
1529  CALL tcirc(qp,ecc,i1,i2,icirc,tc)
1530  WRITE (6,142) time+toff, name(j1), kstar(j1), kstar(j2),
1531  & list(1,i1), mass(1), mass(2), ecc,
1532  & semi*su, tc
1533  142 FORMAT (' ECCENTRIC ROCHE T NM K* NP M E A TC ',
1534  & f8.1,i6,3i4,3f6.2,2f7.1)
1535  kstar(i) = 0
1536  tev(i) = 1.0d+10
1537  END IF
1538  ELSEIF(iq.EQ.0)THEN
1539 * Update look-up time.
1540  CALL trdot(j1,dtm,mass(1))
1541  tev(j1) = tev(j1) + dtm
1542  CALL trdot(j2,dtm,mass(2))
1543  tev(j2) = min(tev(j1),tev(j2) + dtm)
1544 *
1545 * Ensure that close degenerate system gets GR check in mdot.
1546  kw = min(kstar(j1),kstar(j2))
1547  IF(kw.GT.6) tev(j2) = min(tev(j2),time+0.1d0)
1548 *
1549  tev(j1) = tev(j2)
1550  END IF
1551 *
1552 * Restore times and step and update mass on GRAPE.
1553  tphys = (time+toff)*tstar
1554 *
1555 * Include consistency check on mass difference.
1556  dm = (body(j1) + body(j2)) - body(i)
1557  IF(abs(dm).GT.0.0001*body(i))THEN
1558  WRITE (6,145) time+toff, body(j1), body(j2), body(i)
1559  145 FORMAT (' DANGER! ROCHE T M ',f10.3,1p,3e12.4)
1560  body(i) = body(i) + dm
1561  ENDIF
1562 *
1563  go to 200
1564 *
1565  150 IF(iphase.GE.0) goto 140
1566  160 tphys = (time+toff)*tstar
1567 *
1568 * Treat case of OVERFILL or CONTACT binary in the same way.
1569  IF(iqcoll.EQ.3)THEN
1570 * Predict c.m. to highest order and save KS index in COMMON.
1571  WRITE(85,95)name(j1),name(j2),kstar(j1),kstar(j2),kstar(i),
1572  & tphys,aj(1),aj(2),mass0(1),mass0(2),
1573  & mass(1),mass(2),zmet,ecc,tk,jspin(1),jspin(2),ch5
1574  IF(time-t0(i).LE.step(i))THEN
1575  CALL xvpred(i,0)
1576  ENDIF
1577  kspair = ipair
1578  CALL cmbody(r(ipair),2)
1579  iqcoll = 0
1580  ENDIF
1581 *
1582  200 RETURN
1583 *
1584  END
1585 ***