Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
eBBH.cc
Go to the documentation of this file.
1 #include "eBBH.hh"
2 
3 #include "egw_model.hh"
4 #include "geodesics.hh"
5 #include "merger.hh"
6 #include "numpy.hh"
7 
8 
9 #include "stdio.h"
10 #include "stdlib.h"
11 #include "math.h"
12 
13 inline double min(double x, double y)
14 { return x<y? x: y;}
15 
16 int Sample(Complex* H, double* t, int N, double totalMass, double Rate, wavearray<double>& hps, wavearray<double>& hxs)
17 { const double C = 299792458;
18  const double G = 6.67428e-11;
19  const double SolarMass = 1.98892e30;
20  const double L = G/C/C*SolarMass*totalMass;
21  const double T = L/C; //printf("T = %lf\n", T);
22 
23  double* tt = new double[N];
24 
25  for(int i=0; i<N; ++i){
26  tt[i] = t[i]*T;
27  if(i)tt[i] -= tt[0];
28  }
29  tt[0] = 0;
30  //printf("T*16384 = %lf\n", T*16384);
31  double tMax = tt[N-1]; //printf("tMax = %lf\n", tMax);
32  int nSamples = 0;
33  if(tMax*Rate<2.1e9)nSamples = tMax*Rate;
34  //printf("nSamples = %d\n", nSamples);
35 
36  hps.resize(nSamples); hps.rate(Rate);
37  hxs.resize(nSamples); hxs.rate(Rate);
38 
39  int j=1;
40  for(int i=0; i<nSamples; ++i){
41  double ts = i/Rate;
42  while(ts>tt[j])++j;
43  if(j>=N)printf("ERROR\n");
44  double frac = (ts - tt[j-1])/(tt[j] - tt[j-1]);
45  hps[i] = H[j-1].Re() + (H[j].Re() - H[j-1].Re())*frac;
46  hxs[i] = H[j-1].Im() + (H[j].Im() - H[j-1].Im())*frac;
47  }
48  delete [] tt;
49 
50  return nSamples;
51 }
52 
53 int getEBBH(double m1, double m2, double rmin0, double e0, wavearray<double>& Hp, wavearray<double>& Hx, double t_end)
54 { if(m1<0 || m2<0){
55  printf("Error! masses must be >=0\n");
56  return -1;
57  }
58 
59  if(rmin0<0){
60  printf("Error! rmin must be >=0\n");
61  return -2;
62  }
63  if(e0>1){
64  printf("Error! Orbit must be initially parabolic or bound.\n");
65  return -3;
66  }
67 
68  //double q = m1*m2/(m1+m2)/(m1+m2);
69  double q = m1/m2;
70  if(q>1)q=1./q;
71  double rmin = rmin0;
72  double e = e0;
73  double Mbh = 1/(1+q);
74  double Mns = 1 - Mbh;
75  //printf("Mbh = %.3lf\nMns = %.3lf\n", Mbh, Mns);
76  double mu = Mns*Mbh;
77 
78  double abh = 0.0;
79  double dt = 1;
80  double a_final = 0;
81  double t_post_merger = 400;
82 
83  double Jspin = abh*Mbh*Mbh;
84  double L0 = ang_mom_eff_geo(rmin0, e0, Jspin, mu);
85  double a0 = Jspin+mu*L0;
86  double E0 = energy_geo(rmin0, e0, a0);
87  double r0 = 1000;
88  if (e0<1 && r0 > rmin0*(1+e0)/(1-e0)) r0 = rmin0*(1+e0)/(1-e0);
89 
90  int dir = -1; //inward
91  int N_plot = t_end/dt; //printf("%d\n", N_plot);
92  double phi0 = 0;
93  //printf("%.6le %.6le %.6le %.6le %d %.6le %.6le\n", r0, phi0, E0, L0, dir, Jspin, mu);
94  geodesic geo(r0, phi0, E0, L0, dir, Jspin, mu);
95 
96  bool success = geo.integrate(t_end, N_plot, 0, true); // memory LEAK!
97 
98  double tmerge;
99  if (success){
100  tmerge = -1;
101  t_post_merger=0;
102  }
103  else{
104  double* r_LR = new double[N_plot];
105  for(int i=0; i<N_plot; ++i)
106  r_LR[i] = 2*(1+cos(2*(acos(-min(mu*geo.Lt[i] + Jspin, 1.))/3))) - geo.r[i]; //Light ring
107  tmerge = interp(0, r_LR, geo.t, N_plot, 1., 1.);
108  delete [] r_LR;
109  }
110 
111  int Ntsig = (geo.t[N_plot-1]+t_post_merger)/dt;
112  double* tsig = new double[Ntsig];
113  for(int i=0; i<Ntsig; ++i) tsig[i] = dt*i;
114 
115  double* hr = interp(tsig, Ntsig, geo.t, geo.hplus, N_plot, 0, 0);
116  double* hi = interp(tsig, Ntsig, geo.t, geo.hcross, N_plot, 0, 0);
117 
118  Complex* hsig = new Complex[Ntsig];
119  for(int i=0; i<Ntsig; ++i)hsig[i] = Complex(hr[i], hi[i]);
120 
121  a_final = mu*geo.Lt[N_plot-1] + abh*Mbh*Mbh; // Spin of final BH
122 
123  double tstart_merger = tmerge;
124  if (tmerge>0) irs_merger(dt, tmerge, tsig, hsig, Ntsig, a_final, tstart_merger);
125 
126  int retVal = Sample(hsig, tsig, Ntsig, m1+m2, 16384., Hp, Hx)==0;
127  delete [] hsig;
128  delete [] hr;
129  delete [] hi;
130  delete [] tsig;
131  return retVal;
132 }
wavearray< double > t(hp.size())
static const double C
Definition: GNGen.cc:10
printf("total live time: non-zero lags = %10.1f \n", liveTot)
double min(double x, double y)
Definition: eBBH.cc:13
virtual void rate(double r)
Definition: wavearray.hh:123
double Im() const
Definition: numpy.hh:15
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 SolarMass()
Definition: constants.hh:184
double * hcross
Definition: geodesics.hh:18
int j
Definition: cwb_net.C:10
i drho i
bool integrate(double D_t, int &N, double rmin=0, bool stop_alr=false)
Definition: geodesics.cc:242
#define N
double * t
Definition: geodesics.hh:18
int Sample(Complex *H, double *t, int N, double totalMass, double Rate, wavearray< double > &hps, wavearray< double > &hxs)
Definition: eBBH.cc:16
double G
Definition: DrawEBHH.C:12
double * hplus
Definition: geodesics.hh:18
m1
Definition: cbc_plots.C:606
int Rate
double * r
Definition: geodesics.hh:18
double e
double dt
double * Lt
Definition: geodesics.hh:18
double e0
Definition: RescaleEBBH.C:17
double T
Definition: testWDM_4.C:11
wavearray< double > ts(N)
double interp(double v, double *x, double *y, int n)
Definition: numpy.cc:3
int getEBBH(double m1, double m2, double rmin0, double e0, wavearray< double > &Hp, wavearray< double > &Hx, double t_end)
Definition: eBBH.cc:53
double energy_geo(double rp, double e, double a)
Definition: egw_model.cc:209
double ang_mom_eff_geo(double rp, double e, double Jspin, double mu)
Definition: egw_model.cc:242
virtual void resize(unsigned int)
Definition: wavearray.cc:445
wavearray< double > y
Definition: Test10.C:31
void irs_merger(double dt, double tmerge, double *tsig, Complex *hsig, int lentsig, double a, double tstart=-1)
Definition: merger.cc:14
Definition: numpy.hh:11
m2
Definition: cbc_plots.C:607
double Re() const
Definition: numpy.hh:14