Nbody6
 All Files Functions Variables
trdot.f
Go to the documentation of this file.
1  SUBROUTINE trdot(I,DTM,M1)
2 *
3 *
4 * Time-scale for expansion of radius.
5 * -----------------------------------
6 *
7  include 'common6.h'
8  REAL*8 tscls(20),lums(10),gb(10),tm,tn
9  REAL*8 m0,m1,rm,lum,age,mc,mc1,rcc,rm0,age0,m10
10  REAL*8 menv,renv,k2
11  REAL*8 pts1,pts2,eps,alpha2,tol
12  parameter(pts1=0.05d0,pts2=0.02d0)
13  parameter(eps=1.0d-06,alpha2=0.09d0,tol=1.0d-10)
14 *
15 * Obtain stellar parameters at current epoch (body #I may be ghost).
16  kw = kstar(i)
17  m0 = body0(i)*zmbar
18  IF(m1.LE.0.0) m1 = radius(i)*su
19  m10 = m1
20  mc = 0.d0
21  age = tev0(i)*tstar - epoch(i)
22  CALL star(kw,m0,m1,tm,tn,tscls,lums,gb,zpars)
23  CALL hrdiag(m0,age,m1,tm,tn,tscls,lums,gb,zpars,
24  & rm,lum,kw,mc,rcc,menv,renv,k2)
25 *
26 * Quit if there is a change of type at the current TEV.
27  if((kstar(i).le.6.and.kw.gt.6).or.
28  & (kstar(i).le.9.and.kw.gt.9))then
29  m1 = m10
30  dtm = 0.d0
31  goto 10
32  endif
33 ***
34 *
35 * Base new time scale for changes in radius & mass on stellar type.
36  if(kw.lt.0)then
37  dtm = pts1*tscls(15)
38  dtr = abs(age)
39  elseif(kw.le.1)then
40  dtm = pts1*tm
41  dtr = tm - age
42  elseif(kw.ge.10)then
43  dtm = 1.0d+02
44  dtr = dtm
45  elseif(kw.eq.2)then
46  dtm = pts1*(tscls(1) - tm)
47  dtr = tscls(1) - age
48  elseif(kw.eq.3)then
49  if(age.lt.tscls(6))then
50  dtm = pts2*(tscls(4) - age)
51  else
52  dtm = pts2*(tscls(5) - age)
53  endif
54  dtr = min(tscls(2),tn) - age
55  elseif(kw.eq.4)then
56  dtm = pts1*tscls(3)
57  dtr = min(tn,tscls(2) + tscls(3)) - age
58  elseif(kw.eq.5)then
59  if(age.lt.tscls(9))then
60  dtm = pts2*(tscls(7) - age)
61  else
62  dtm = pts2*(tscls(8) - age)
63  endif
64  dtr = min(tn,tscls(13)) - age
65  elseif(kw.eq.6)then
66  if(age.lt.tscls(12))then
67  dtm = pts2*(tscls(10) - age)
68  else
69  dtm = pts2*(tscls(11) - age)
70  endif
71 * dtm = MIN(dtm,0.005d0)
72  dtr = tn - age
73  elseif(kw.eq.7)then
74  dtm = pts1*tm
75  dtr = tm - age
76  elseif(kw.eq.8.or.kw.eq.9)then
77  if(age.lt.tscls(6))then
78  dtm = pts2*(tscls(4) - age)
79  else
80  dtm = pts2*(tscls(5) - age)
81  endif
82  dtr = tn - age
83  endif
84 *
85 * Record radius.
86 *
87  rm0 = rm
88  if(kw.ge.10) goto 30
89  age0 = age
90  kw0 = kw
91  mc1 = mc
92 *
93 * Check for type change.
94 *
95  it = 0
96  if((dtr-dtm).le.tol)then
97 *
98 * Check final radius for too large a jump.
99 *
100  age = max(age,age*(1.d0-eps) + dtr)
101  CALL hrdiag(m0,age,m1,tm,tn,tscls,lums,gb,zpars,
102  & rm,lum,kw,mc1,rcc,menv,renv,k2)
103  dr = rm - rm0
104  if(abs(dr).gt.0.1*rm0)then
105  dtm = dtr - age0*eps
106  dtdr = dtm/abs(dr)
107  dtm = alpha2*max(rm,rm0)*dtdr
108  goto 20
109  else
110  dtm = dtr
111  goto 30
112  endif
113  endif
114 *
115 * Limit to a 10% increase assuming no further mass loss
116 * and thus that the pertubation functions due to small envelope mass
117 * will not change the radius.
118 *
119  20 age = age0 + dtm
120  mc1 = mc
121  CALL hrdiag(m0,age,m1,tm,tn,tscls,lums,gb,zpars,
122  & rm,lum,kw,mc1,rcc,menv,renv,k2)
123  dr = rm - rm0
124  it = it + 1
125  if(it.eq.20.and.kw.eq.4) goto 30
126  IF(it.GT.30)THEN
127  WRITE (6,22) it, kstar(i), m0, dr, rm
128  22 FORMAT (' DANGER! TRDOT: IT K* M0 DR RM ',2i4,1p,3e10.2)
129  goto 30
130  ENDIF
131  if(abs(dr).gt.0.1*rm0)then
132  dtdr = dtm/abs(dr)
133  dtm = alpha2*max(rm0,rm)*dtdr
134  if(it.ge.20) dtm = 0.5d0*dtm
135  goto 20
136  endif
137 *
138  30 continue
139 *
140 * Impose a lower limit and convert time interval to scaled units.
141  dtm = max(dtm,1.0d-04)/tstar
142 *
143 * Use dummy for routine CHINIT (new chain or chain collision).
144  10 IF(iphase.EQ.8.OR.iphase.EQ.9)THEN
145  m1 = rm
146  ENDIF
147 *
148  RETURN
149  END