Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
egw_model.cc
Go to the documentation of this file.
1 #include "numpy.hh"
2 
3 #include "stdio.h"
4 
5 static const double pi = 3.14159265358979312;
6 
7 double E_ecc(double e)
8 { double e2 = e*e;
9  return (1+73.0/24*e2+37.0/96*e2*e2)/pow(1.0+e,3.5);
10 }
11 
12 double J_ecc(double e)
13 { return (1.0+7.0/8*e*e)/(1.0+e)/(1+e);
14 }
15 
16 double bisect(double (*f)(double), double a, double b)
17 { double fa = f(a);
18  double fb = f(b);
19  if (fa == 0.) return a;
20  if (fb == 0.) return b;
21 
22  double tol = 1.0e-14;
23 
24  while(fabs(b-a)>tol){
25  double c = 0.5*(a+b);
26  double fc = f(c);
27  if (fc==0.)return c;
28  if (fb*fc < 0.0){
29  a = c;
30  fa = fc;
31  }
32  else{
33  b = c;
34  fb = fc;
35  }
36  }
37  return 0.5*(a+b);
38 }
39 
40 double zw_func(double p, double e, double a)
41 { //"Equals zero for zoom-whirl parameters"
42  // Formulae from Glampedakis and Kennefick
43  double Mbh = 1.0;
44  double F = ( p*p*p - 2*Mbh*(3.0+e*e)*p*p + Mbh*Mbh*pow(3.0+e*e, 2)*p -
45  4*Mbh*a*a*pow(1.0-e*e, 2) )/p/p/p;
46  double N = (2.0/p)*(-Mbh*p*p+(Mbh*Mbh*(3.0+e*e)-a*a)*p-Mbh*a*a*(1+3*e*e) );
47  double C = a*a-Mbh*p;
48  C *= C;
49  double xsq, des = fabs(N*N-4.0*F*C);
50  if (a==0.)des = 0;
51  if (a>0)xsq = (-N - sqrt(des))/2.0/F; // Prograde motion
52  else xsq = (-N + sqrt(des))/2.0/F; // Retrograde motion
53 
54  return p*p-xsq*(1.0+e)*(3.0-e);
55 }
56 
57 double rw_e, rw_a;
58 
59 double rw_f(double p)
60 { return zw_func(p, rw_e, rw_a);
61 }
62 
63 double rzoom_whirl(double e, double a)
64 { //"Value of rp for zoom-whirl orbit in Kerr spacetime"
65  rw_e = e;
66  rw_a = a;
67  double plow, phigh;
68  if (a>0){
69  plow = 1.0+e;
70  phigh = 6.0 + 2.0*e;
71  }
72  else if(a<0){
73  plow = 6.0+2.0*e;
74  phigh = 15;
75  }
76  else return (6.0+2.0*e)/(1.0+e);
77 
78  double p = bisect(rw_f, plow, phigh);
79  return p/(1.0+e);
80 }
81 
82 double scaling_exp_zw(double a, double r0)
83 { // "Instability exponent as a function of BH spin and radius of unstable circular orbit"
84  double r = r0;
85  double m = 1;
86  double w, R0 =sqrt(r*r + a*a*(1+2*m/r));
87  if (a>0)w = m/(m*a + r*sqrt(m*r));
88  else w = m/(m*a- r*sqrt(m*r));
89  double Delta = r*r + a*a - 2*m*r;
90  return r*r/(2*pi)/sqrt( fabs( 3.0*r*r*Delta + 4.0*m/w/w*(r*R0*R0*w*w - 4*m*a*w - r + 2*m) ) );
91 }
92 
93 double scaling_exp(double e, double a)
94 { double gamma_parabolic = 0.19; //# Exponent for e=1 a=a_para
95  double a_para = 0.5;
96  return scaling_exp_zw(a, rzoom_whirl(e,a))/scaling_exp_zw(a_para, rzoom_whirl(1,a_para))*gamma_parabolic;
97 }
98 
99 
100 void close_encounter_pm(double e, double rmin, double mu, double& e_new, double& rmin_new)
101 { //"Change in orbital parameters due to a close encounter according to Peters & Mathews"
102  double a = mu/rmin;
103  double E = a*(e-1.0)/2.0;
104  double const b = (64.0*3.14159265358979312)/5.0;
105  double L = mu*sqrt(rmin*(1.0+e));
106  double deltaE = b*mu*mu*pow(1.0/rmin, 3.5)*E_ecc(e);
107  double deltaL = b*a*a*J_ecc(e);
108 
109  E -= deltaE;
110  L -= deltaL;
111  e_new = sqrt(1.0+2*E*L*L/mu/mu/mu);
112  rmin_new = (e_new-1.0)/2.0/(E/mu);
113 }
114 
115 void gwave_data(double e, double rmin, double mu, double& e_new, double& rmin_new)
116 { // "Change in orbital parameters due to g-wave results from simulations"
117  double E = mu*(e-1.0)/2.0/rmin;
118  double L = mu*sqrt(rmin*(1.0+e));
119  double rp[7] = {6.95, 7.22, 7.5, 8.75, 10, 12.5, 15};
120  double E_data[7] = { 0.006753, 0.003573, 0.002420,
121  0.000730, 0.000334, 0.000105, 3.081720e-05};
122  double J_data[7] = { 0.071858, 0.044782, 0.035159,
123  0.015815, 0.009692, 0.004601, 2.144661e-03};
124 
125 
126  double deltaE = interp(rmin, rp, E_data, 7)*E_ecc(e)/E_ecc(1);
127  double deltaL = interp(rmin, rp, J_data, 7)*J_ecc(e)/J_ecc(1);
128  E -= deltaE;
129  L -= deltaL;
130  e_new = rmin_new = 0;
131  if ((1.0+2*E*L*L/mu/mu/mu)<0)return;
132  e_new = sqrt(1.0+2*E*L*L/mu/mu/mu);
133  rmin_new = (e_new-1.0)/2.0/(E/mu);
134 }
135 
136 double getDelta()
137 { return 3;
138 }
139 
140 double getE0(double e, double rmin, double mu, double rc)
141 { return mu*(e-1.0)/2.0/rmin + mu/2.0/rc;
142 }
143 
144 
145 double newt_crit_radius(double e, double a)
146 { // "Effective periastron distance at large separation for the BH-NS system to merge function of eccentricity and BH spin"
147  double rparabolic = 6.89; // # Capture for e=1, a=0.5 orbit
148  double a_para = 0.5;
149  double r = (rparabolic/rzoom_whirl(1.0,a_para))*rzoom_whirl(e,a);
150  return r;
151 }
152 
153 double newt_getDeltaE(double e, double rmin, double mu, double a)
154 { double rc = newt_crit_radius(e, a);
155  double E0 = getE0(e,rmin,mu,rc);
156  double Delta = getDelta();
157  double gamma = scaling_exp(e,a);
158  return E0*( 1 - pow((rmin-rc)/Delta,gamma) );
159 }
160 
161 double newt_getDeltaL(double e, double rmin, double mu, double a)
162 { double rc = newt_crit_radius(e, a);
163  double L0 = mu*(sqrt(rmin*(1.0+e)) - sqrt(rc));
164  double Delta = getDelta();
165  double gamma = scaling_exp(e,a);
166  return L0*( 1 - pow((rmin-rc)/Delta, gamma) );
167 }
168 
169 void newt_close_encounter(double e, double rmin, double mu, double a, double& e_new, double& rmin_new)
170 { //"Change in orbital parameters due to a close encounter according to ZW model"
171  double E = mu*(e-1.0)/2.0/rmin;
172  double L = mu*sqrt(rmin*(1.0+e));
173  double deltaE = newt_getDeltaE(e, rmin, mu, a);
174  double deltaL = newt_getDeltaL(e, rmin, mu, a);
175  double Delta = getDelta();
176  double rc = newt_crit_radius(e, a);
177  // Stitch on P&M for large rmin
178 
179  if ((rmin-rc)>=Delta or (64.0*pi)/5.0*mu*mu*pow(1.0/rmin,3.5)*E_ecc(e)>deltaE)
180  return close_encounter_pm(e, rmin, mu, e_new, rmin_new);
181 
182  E -= deltaE;
183  L -= deltaL;
184  double f = 1.0+2*E*L*L/mu/mu/mu;
185  if (f<0){
186  printf("E=%e deltaE=%e rmin=%e e=%e\n", E, deltaE, rmin, e);
187  f = 0;
188  }
189  e_new = sqrt(f);
190  rmin_new = (e_new-1.0)/2.0/(E/mu);
191 }
192 
193 
194 double newt_amp_enhance(double e, double rmin, double mu, double a)
195 { double gamma = scaling_exp(e,a);
196  double Delta = getDelta();
197  double rc = newt_crit_radius(e, a);
198  double E0 = getE0(e,rmin,mu,rc);
199  double deltaE = E0;
200  if (rmin>rc)deltaE = E0*(1- pow((rmin-rc)/Delta, gamma) );
201 
202  double deltaEpm = (64.0*pi)/5.0*mu*mu*pow(1.0/rmin, 3.5)*E_ecc(e);
203  double ratio = deltaE/deltaEpm;
204  if (fabs(rmin-rc)>Delta || ratio < 1)ratio = 1;
205  return sqrt(ratio);
206 }
207 
208 
209 double energy_geo(double rp, double e, double a)
210 {
211  double p = rp*(1+e);
212  double Mbh = 1.0;
213  double F = ( p*p*p - 2*Mbh*(3+e*e)*p*p + p*Mbh*Mbh*pow(3.0+e*e, 2)-4*Mbh*a*a*pow(1.0-e*e,2) )/p/p/p;
214  double N = (2/p)*( -Mbh*p*p + p*( Mbh*Mbh*(3.0+e*e)-a*a) - Mbh*a*a*(1+3*e*e) );
215  double C = a*a-Mbh*p;
216  C *=C;
217 
218  double xsq, des = fabs(N*N-4*F*C);
219  if(a==0)des = 0;
220  if (a>=0)xsq = (-N - sqrt(des))/2/F; // Prograde motion
221  else xsq = (-N + sqrt(des))/2/F; // Retrograde motion
222  return sqrt( fabs( 1 - (Mbh/p)*(1.0-e*e)*(1.0-xsq/p/p*(1.0-e*e)) ) );
223 }
224 
225 double ang_mom_geo(double rp, double e, double a)
226 {
227  double p = rp*(1+e);
228  double Mbh = 1.0;
229  double F = ( p*p*p - 2*Mbh*(3+e*e)*p*p + p*Mbh*Mbh*pow(3.0+e*e, 2)-4*Mbh*a*a*pow(1.0-e*e,2) )/p/p/p;
230  double N = (2/p)*( -Mbh*p*p + p*( Mbh*Mbh*(3.0+e*e)-a*a) - Mbh*a*a*(1+3*e*e) );
231  double C = a*a-Mbh*p;
232  C *=C;
233 
234  double xsq, des = fabs(N*N-4*F*C);
235  if(a==0)des = 0;
236  if (a>=0)xsq = (-N - sqrt(des))/2/F; // Prograde motion
237  else xsq = (-N + sqrt(des))/2/F; // Retrograde motion
238  double E = sqrt( 1 - (Mbh/p)*(1.0-e*e)*(1.0-xsq/p/p*(1.0-e*e)) );
239  return sqrt(fabs(xsq)) + a*E;
240 }
241 
242 double ang_mom_eff_geo(double rp, double e, double Jspin, double mu)
243 { double a = Jspin+mu*sqrt((1+e)*rp);
244  double a1 = Jspin+mu*ang_mom_geo(rp, e, a);
245  while(fabs(a-a1)>1.0e-5){
246  a = a1;
247  a1 = Jspin+mu*ang_mom_geo(rp,e,a);
248  }
249  return ang_mom_geo(rp,e,a);
250 }
251 
252 double opg_x;
253 double opg_E;
254 double opg_L;
255 double opg_a;
256 
257 double opg_ecc(double p)
258 { double x = opg_x;
259  double E = opg_E;
260  double des = pow(p/x,4) + 4*p*p*p/x/x*(E*E-1);
261  if (des<0)des = 0;
262  double y = 0.5*(pow(p/x, 2)-sqrt(des));
263  return sqrt(fabs(1-y));
264 }
265 
266 double opg_f(double p)
267 { double e = opg_ecc(p);
268  return opg_E - energy_geo(p/(1+e),e,opg_a);
269 }
270 
271 double opg_g(double p)
272 { return ang_mom_geo(p/2.0,1.0, opg_a)- opg_L;
273 }
274 
275 void orbital_param_geo(double E, double L, double a, double& rp, double& e)
276 { opg_x = L-a*E;
277  opg_E = E;
278  opg_a = a;
279  opg_L = L;
280  if (E>1)printf("Error in orbital_param_geo, E>0\n");
281  double p;
282  if (E==1.)p = bisect(opg_g,1.0,100);
283  else p = bisect(opg_f, 1.0, 100);
284  e = opg_ecc(p);
285  rp = p/(1.0+e);
286 }
287 
288 double geo_crit_radius(double e, double a)
289 { return rzoom_whirl(e, a);
290 }
291 
292 double geo_getDeltaE(double e, double rmin, double mu, double a)
293 { double rc = geo_crit_radius(e, a);
294  double E0 = getE0(e,rmin,mu,rc);
295  double Delta = getDelta();
296  double gamma = scaling_exp(e,a);
297  return E0*(1.0 - pow ((rmin-rc)/Delta, gamma) );
298 }
299 
300 
301 double geo_getDeltaL(double e, double rmin, double mu, double a)
302 { double rc = geo_crit_radius(e, a);
303  double L0 = mu*(sqrt(rmin*(1.0+e)) - sqrt(rc));
304  double Delta = getDelta();
305  double gamma = scaling_exp(e,a);
306  return L0*(1.0 - pow( (rmin-rc)/Delta, gamma ) );
307 }
308 
309 void geo_close_encounter(double e, double rmin, double mu, double a, double& e_new, double& rmin_new)
310 { double E = mu*energy_geo(rmin,e,a);
311  double L = mu*ang_mom_geo(rmin,e,a);
312 
313  double deltaE = geo_getDeltaE(e, rmin, mu, a);
314  double deltaL = geo_getDeltaL(e, rmin, mu, a);
315  double Delta = getDelta();
316  double rc = geo_crit_radius(e, a);
317 
318  if ((rmin-rc)>=Delta || (64.0*pi)/5.0*mu*mu*pow(1.0/rmin, 3.5)*E_ecc(e)>deltaE){
319  deltaE = (64.0*pi)/5.0*mu*mu*pow(1.0/rmin,3.5)*E_ecc(e);
320  deltaL = (64.0*pi)/5.0*mu*mu/rmin/rmin*J_ecc(e);
321  }
322  E = E - deltaE;
323  L = L - deltaL;
324  orbital_param_geo(E/mu,L/mu,a,rmin_new, e_new);
325  if (e_new==1)
326  printf("%lf %lf %lf %lf\n", E/mu, L/mu,
327  energy_geo(rmin_new,e_new,a), ang_mom_geo(rmin_new,e_new,a) );
328 }
329 
330 
331 double crit_radius(double e, double a)
332 { // "Effective periastron distance at large separation for the BH-NS system to merge function of eccentricity and BH spin"
333  double rparabolic = 6.89; // Capture for e=1, a=0.5 orbit
334  double a_para = 0.5;
335  return ( rparabolic/rzoom_whirl(1, a_para) )*rzoom_whirl(e,a);
336 }
337 
338 
339 double geo_amp_enhance(double e, double rmin, double mu, double a)
340 { return 1;}
341 
342 double amp_enhance(double e, double rmin, double mu, double a)
343 { double gamma = scaling_exp(e,a);
344  double Delta = getDelta();
345  double rc = crit_radius(e, a);
346  double E0 = getE0(e,rmin,mu,rc);
347  double deltaE = E0;
348  if (rmin>rc)deltaE = E0*(1.0-pow((rmin-rc)/Delta, gamma) );
349 
350  double deltaEpm = (64.0*pi)/5.0*mu*mu*pow(1.0/rmin,3.5)*E_ecc(e);
351  double ratio = deltaE/deltaEpm;
352  if (fabs(rmin-rc)>Delta || ratio < 1)ratio = 1.0;
353  return sqrt(ratio);
354 }
355 
356 
357 void orbital_param_newt_to_geo(double rmin,double e, double a, double& rp, double& ee)
358 { double E = 1+(e-1.0)/2.0/rmin;
359  double L = sqrt(rmin*(1.0+e));
360  orbital_param_geo(E,L,a, rp, ee);
361 }
362 
363 void orbital_param_geo_to_newt(double rmin, double e, double a, double& rmin_new, double& e_new)
364 { double E = energy_geo(rmin,e,a) - 1.0;
365  double L = ang_mom_geo(rmin,e,a);
366  double f = 1.0+2*E*L*L;
367  e_new = sqrt(f);
368  if (E>0)rmin_new = (e_new-1.0)/2.0/E;
369  else if (E==0.) rmin_new = L*L/2.0;
370 }
371 
372 
373 double a_eff(double e, double rp, double mu, double Jbh)
374 { return 0.5*sqrt( (1+e)*rp/(2*6.89) )+Jbh;
375 }
double E_ecc(double e)
Definition: egw_model.cc:7
static const double C
Definition: GNGen.cc:10
double geo_crit_radius(double e, double a)
Definition: egw_model.cc:288
tuple f
Definition: cwb_online.py:91
printf("total live time: non-zero lags = %10.1f \n", liveTot)
double newt_crit_radius(double e, double a)
Definition: egw_model.cc:145
double bisect(double(*f)(double), double a, double b)
Definition: egw_model.cc:16
double rw_a
Definition: egw_model.cc:57
wavearray< double > a(hp.size())
double rzoom_whirl(double e, double a)
Definition: egw_model.cc:63
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\t layers : "<< nLAYERS<< "\t dF(hz) : "<< dF<< "\t dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1)*itime+ifreq;double time=itime *dT;double freq=(ifreq >0)?ifreq *dF:dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
double geo_amp_enhance(double e, double rmin, double mu, double a)
Definition: egw_model.cc:339
double J_ecc(double e)
Definition: egw_model.cc:12
double opg_x
Definition: egw_model.cc:252
double ang_mom_geo(double rp, double e, double a)
Definition: egw_model.cc:225
int m
Definition: cwb_net.C:10
#define N
void orbital_param_geo_to_newt(double rmin, double e, double a, double &rmin_new, double &e_new)
Definition: egw_model.cc:363
double newt_getDeltaE(double e, double rmin, double mu, double a)
Definition: egw_model.cc:153
wavearray< double > w
Definition: Test1.C:27
double scaling_exp(double e, double a)
Definition: egw_model.cc:93
double opg_L
Definition: egw_model.cc:254
double geo_getDeltaE(double e, double rmin, double mu, double a)
Definition: egw_model.cc:292
double newt_amp_enhance(double e, double rmin, double mu, double a)
Definition: egw_model.cc:194
double opg_E
Definition: egw_model.cc:253
double rw_e
Definition: egw_model.cc:57
double crit_radius(double e, double a)
Definition: egw_model.cc:331
double getE0(double e, double rmin, double mu, double rc)
Definition: egw_model.cc:140
double amp_enhance(double e, double rmin, double mu, double a)
Definition: egw_model.cc:342
double geo_getDeltaL(double e, double rmin, double mu, double a)
Definition: egw_model.cc:301
double rp
void gwave_data(double e, double rmin, double mu, double &e_new, double &rmin_new)
Definition: egw_model.cc:115
double scaling_exp_zw(double a, double r0)
Definition: egw_model.cc:82
void newt_close_encounter(double e, double rmin, double mu, double a, double &e_new, double &rmin_new)
Definition: egw_model.cc:169
double rw_f(double p)
Definition: egw_model.cc:59
double F
double e
double opg_g(double p)
Definition: egw_model.cc:271
regression r
Definition: Regression_H1.C:44
void close_encounter_pm(double e, double rmin, double mu, double &e_new, double &rmin_new)
Definition: egw_model.cc:100
double getDelta()
Definition: egw_model.cc:136
void orbital_param_geo(double E, double L, double a, double &rp, double &e)
Definition: egw_model.cc:275
double opg_a
Definition: egw_model.cc:255
double newt_getDeltaL(double e, double rmin, double mu, double a)
Definition: egw_model.cc:161
double opg_ecc(double p)
Definition: egw_model.cc:257
double a_eff(double e, double rp, double mu, double Jbh)
Definition: egw_model.cc:373
double interp(double v, double *x, double *y, int n)
Definition: numpy.cc:3
double fabs(const Complex &x)
Definition: numpy.cc:37
void geo_close_encounter(double e, double rmin, double mu, double a, double &e_new, double &rmin_new)
Definition: egw_model.cc:309
double energy_geo(double rp, double e, double a)
Definition: egw_model.cc:209
static const double pi
Definition: egw_model.cc:5
double ang_mom_eff_geo(double rp, double e, double Jspin, double mu)
Definition: egw_model.cc:242
void orbital_param_newt_to_geo(double rmin, double e, double a, double &rp, double &ee)
Definition: egw_model.cc:357
double zw_func(double p, double e, double a)
Definition: egw_model.cc:40
double opg_f(double p)
Definition: egw_model.cc:266
wavearray< double > y
Definition: Test10.C:31
static double Delta
Definition: geodesics.cc:8