27 #include <gsl/gsl_errno.h>
28 #include <gsl/gsl_odeiv.h>
30 #include <lal/LALStdlib.h>
31 #include <lal/LALConstants.h>
32 #include <lal/LALSimNeutronStar.h>
38 static double tidal_Love_number_k2(
double c,
double y)
43 num = (8.0 / 5.0) * pow(1 - 2 *
c, 2.0) * pow(
c, 5)
44 * (2 *
c * (
y - 1) - y + 2);
45 den = 2 *
c * (4 * (
y + 1) * pow(
c, 4) + (6 *
y - 4) * pow(
c, 3)
46 + (26 - 22 *
y) *
c *
c + 3 * (5 * y - 8) *
c - 3 *
y + 6);
47 den -= 3 * pow(1 - 2 *
c, 2) * (2 *
c * (
y - 1) - y + 2)
48 * log(1.0 / (1 - 2 *
c));
62 #define TOV_ODE_VARS_DIM (sizeof(struct tov_ode_vars)/sizeof(double))
65 static struct tov_ode_vars *tov_ode_vars_cast(
const double *y)
69 struct tov_ode_vars *v;
81 static int tov_ode(
double h,
const double *y,
double *dy,
void *
params)
83 struct tov_ode_vars *vars = tov_ode_vars_cast(y);
84 struct tov_ode_vars *derivs = tov_ode_vars_cast(dy);
99 double A = 1.0 / (1.0 - 2.0 *
m /
r);
101 double C1 = 2.0 /
r + A * (2.0 *
m / (
r *
r) + 4.0 * LAL_PI *
r * (p -
e));
104 A * (-(2) * (2 + 1) / (
r *
r) + 4.0 * LAL_PI * (
e + p) * dedp +
105 4.0 *
LAL_PI * (5.0 *
e + 9.0 *
p)) - pow(2.0 * (
m +
106 4.0 * LAL_PI *
r *
r *
r * p) / (
r * (
r - 2.0 *
m)), 2.0);
107 double dr = -
r * (
r - 2.0 *
m) / (
m + 4.0 * LAL_PI *
r *
r *
r * p);
108 double dm = 4.0 *
LAL_PI *
r *
r *
e * dr;
110 double db = -(
C0 *
H +
C1 * b) * dr;
138 double *love_number_k2,
double central_pressure_si,
142 const double epsabs = 0.0;
143 double y[TOV_ODE_VARS_DIM];
144 double dy[TOV_ODE_VARS_DIM];
145 struct tov_ode_vars *vars = tov_ode_vars_cast(
y);
146 gsl_odeiv_system sys = { tov_ode, NULL, TOV_ODE_VARS_DIM, eos };
147 gsl_odeiv_step *step =
148 gsl_odeiv_step_alloc(gsl_odeiv_step_rk8pd, TOV_ODE_VARS_DIM);
149 gsl_odeiv_control *ctrl = gsl_odeiv_control_y_new(epsabs, epsrel);
150 gsl_odeiv_evolve *evolv = gsl_odeiv_evolve_alloc(TOV_ODE_VARS_DIM);
162 double dhdp_c = 1.0 / (ec +
pc);
163 double dedh_c = dedp_c / dhdp_c;
164 double dh = -1
e-12 * hc;
166 double h1 = 0.0 - dh;
167 double r0 = sqrt(-3.0 * dh / (2.0 *
LAL_PI * (ec + 3.0 *
pc)));
168 double m0 = 4.0 *
LAL_PI * r0 * r0 * r0 * ec / 3.0;
170 double b0 = 2.0 * r0;
180 r0 *= 1.0 + 0.25 * dh * (ec - 3.0 *
pc - 0.6 * dedh_c) / (ec + 3.0 *
pc);
182 m0 *= 1.0 + 0.6 * dh * dedh_c / ec;
192 gsl_odeiv_evolve_apply(evolv, ctrl, step, &sys, &h, h1, &dh,
y);
193 if (
s != GSL_SUCCESS)
195 "Error encountered in GSL's ODE integrator\n");
199 tov_ode(h,
y, dy, eos);
200 for (
i = 0;
i < TOV_ODE_VARS_DIM; ++
i)
201 y[
i] += dy[
i] * (0.0 - h1);
204 c = vars->m / vars->r;
205 yy = vars->r * vars->b / vars->H;
210 *love_number_k2 = tidal_Love_number_k2(
c, yy);
213 gsl_odeiv_evolve_free(evolv);
214 gsl_odeiv_control_free(ctrl);
215 gsl_odeiv_step_free(step);
232 #define TOV_VIRIAL_ODE_VARS_DIM (sizeof(struct tov_virial_ode_vars)/sizeof(double))
270 double A = 1.0 / (1.0 - 2.0 *
m /
r);
272 double C1 = 2.0 /
r + A * (2.0 *
m / (
r *
r) + 4.0 *
LAL_PI *
r * (
p -
e));
275 A * (-(2) * (2 + 1) / (
r *
r) + 4.0 *
LAL_PI * (
e +
p) * dedp +
276 4.0 *
LAL_PI * (5.0 *
e + 9.0 *
p)) - pow(2.0 * (
m +
278 double dr = -
r * (
r - 2.0 *
m) / (
m + 4.0 *
LAL_PI *
r *
r *
r *
p);
279 double dm = 4.0 *
LAL_PI *
r *
r *
e * dr;
281 double db = -(
C0 *
H +
C1 *
b) * dr;
283 double alpha = 1.0 - 2.0 *
m /
r;
286 double dI1 = 8.0 *
LAL_PI *
r * pow(
alpha, (-1.0/2.0)) *
p * dr;
287 double dI2 =
r * pow(
alpha, (-1.5)) * pow(
beta, (2.0)) * dr;
288 double dJ1 = 4.0 *
LAL_PI *
r *
r * pow(
alpha, (-0.5)) * 3.0 *
p * dr;
289 double dJ2 = pow(
alpha, (-0.5)) * (pow(
alpha, (-1.0)) * pow((
beta *
r), (2.0)) - 0.5 * pow((sqrt(
alpha) - 1.0), (2.0))) * dr;
328 double *int1,
double *int2,
double *int3,
double *int4,
double *int5,
double *int6,
329 double *love_number_k2,
double central_pressure_si,
333 const double epsabs = 0.0;
338 gsl_odeiv_step *step =
340 gsl_odeiv_control *ctrl = gsl_odeiv_control_y_new(epsabs, epsrel);
353 double dhdp_c = 1.0 / (ec +
pc);
354 double dedh_c = dedp_c / dhdp_c;
355 double dh = -1
e-12 * hc;
357 double h1 = 0.0 - dh;
358 double r0 = sqrt(-3.0 * dh / (2.0 *
LAL_PI * (ec + 3.0 *
pc)));
359 double m0 = 4.0 *
LAL_PI * r0 * r0 * r0 * ec / 3.0;
361 double b0 = 2.0 * r0;
371 r0 *= 1.0 + 0.25 * dh * (ec - 3.0 *
pc - 0.6 * dedh_c) / (ec + 3.0 *
pc);
373 m0 *= 1.0 + 0.6 * dh * dedh_c / ec;
386 double I1_0 = - 8.0 *
LAL_PI * r0 * r0 *
pc * dh - dh * dh;
388 double J1_0 = - 12.0 *
LAL_PI * r0 * r0 * r0 *
pc * dh - 3.0 * r0 * dh * dh * dh;
405 gsl_odeiv_evolve_apply(evolv, ctrl, step, &sys, &h, h1, &dh,
y);
406 if (
s != GSL_SUCCESS)
408 "Error encountered in GSL's ODE integrator\n");
412 for (
int w = 0 ;
w < 1 ; ++
w){
414 for (
i = 0;
i < TOV_ODE_VARS_DIM; ++
i)
415 y[
i] += dy[
i] * (0.0 - h1);
419 c = vars->
m / vars->
r;
420 yy = vars->
r * vars->
b / vars->
H;
422 *int3 = (1.0 - vars->
m / vars->
r) * pow((1.0 - 2.0 * vars->
m / vars->
r), (-0.5)) - 1.0;
423 *int6 = vars->
r * (*int3);
433 *love_number_k2 = tidal_Love_number_k2(
c, yy);
436 gsl_odeiv_evolve_free(evolv);
437 gsl_odeiv_control_free(ctrl);
438 gsl_odeiv_step_free(step);
445 const double epsrel = 1
e-6;
450 double *int1,
double *int2,
double *int3,
double *int4,
double *int5,
double *int6,
451 double *love_number_k2,
double central_pressure_si,
454 const double epsrel = 1
e-6;
456 int1, int2, int3, int4, int5, int6, love_number_k2, central_pressure_si, eos, epsrel);
static double beta(const double a, const double b, const sysq *system)
Internal function that computes the spin-orbit couplings.
static REAL8 UNUSED C1(REAL8 Mtotal)
static REAL8 UNUSED C0(REAL8 eta)
struct tagLALSimNeutronStarEOS LALSimNeutronStarEOS
Incomplete type for the neutron star Equation of State (EOS).
#define LAL_G_C4_SI
Factor to convert pressure in Pa to geometerized units of m^-2.
double XLALSimNeutronStarEOSEnergyDensityOfPressureGeometerized(double p, LALSimNeutronStarEOS *eos)
Returns the energy density in geometerized units (m^-2) at a given pressure in geometerized units (m^...
double XLALSimNeutronStarEOSEnergyDensityDerivOfPressureGeometerized(double p, LALSimNeutronStarEOS *eos)
Returns the gradient of the energy density with respect to the pressure (dimensionless) at a given va...
double XLALSimNeutronStarEOSEnergyDensityOfPseudoEnthalpyGeometerized(double h, LALSimNeutronStarEOS *eos)
Returns the energy density in geometerized units (m^-2) at a given value of the dimensionless pseudo-...
double XLALSimNeutronStarEOSPressureOfPseudoEnthalpyGeometerized(double h, LALSimNeutronStarEOS *eos)
Returns the pressure in geometerized units (m^-2) at a given value of the dimensionless pseudo-enthal...
double XLALSimNeutronStarEOSPseudoEnthalpyOfPressureGeometerized(double p, LALSimNeutronStarEOS *eos)
Returns the dimensionless pseudo-enthalpy at a given pressure in geometerized units (m^-2).
int XLALSimNeutronStarTOVODEIntegrate(double *radius, double *mass, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos)
int XLALSimNeutronStarVirialODEIntegrateWithTolerance(double *radius, double *mass, double *int1, double *int2, double *int3, double *int4, double *int5, double *int6, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos, double epsrel)
Integrates the Tolman-Oppenheimer-Volkov stellar structure equations and the Virial Equations.
static struct tov_virial_ode_vars * tov_virial_ode_vars_cast(const double *y)
static int tov_virial_ode(double h, const double *y, double *dy, void *params)
#define TOV_VIRIAL_ODE_VARS_DIM
int XLALSimNeutronStarTOVODEIntegrateWithTolerance(double *radius, double *mass, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos, double epsrel)
Integrates the Tolman-Oppenheimer-Volkov stellar structure equations.
int XLALSimNeutronStarVirialODEIntegrate(double *radius, double *mass, double *int1, double *int2, double *int3, double *int4, double *int5, double *int6, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos)