28 #include <gsl/gsl_errno.h>
29 #include <gsl/gsl_interp.h>
30 #include <gsl/gsl_min.h>
33 #include <lal/LALStdlib.h>
34 #include <lal/LALSimNeutronStar.h>
39 struct tagLALSimNeutronStarFamily {
45 gsl_interp *p_of_m_interp;
46 gsl_interp *r_of_m_interp;
47 gsl_interp *k_of_m_interp;
48 gsl_interp_accel *p_of_m_acc;
49 gsl_interp_accel *r_of_m_acc;
50 gsl_interp_accel *k_of_m_acc;
54 static double fminimizer_gslfunction(
double x,
void *
params);
55 static double fminimizer_gslfunction(
double x,
void *
params)
72 gsl_interp_accel_free(fam->k_of_m_acc);
73 gsl_interp_accel_free(fam->r_of_m_acc);
74 gsl_interp_accel_free(fam->p_of_m_acc);
75 gsl_interp_free(fam->k_of_m_interp);
76 gsl_interp_free(fam->r_of_m_interp);
77 gsl_interp_free(fam->p_of_m_interp);
102 const size_t ndatmax = 100;
103 const double logpmin = 75.5;
106 size_t ndat = ndatmax;
113 fam->pdat =
LALMalloc(ndat *
sizeof(*fam->pdat));
114 fam->mdat =
LALMalloc(ndat *
sizeof(*fam->mdat));
115 fam->rdat =
LALMalloc(ndat *
sizeof(*fam->rdat));
116 fam->kdat =
LALMalloc(ndat *
sizeof(*fam->kdat));
117 if (!fam->mdat || !fam->rdat || !fam->kdat)
122 dlogp = (logpmax - logpmin) / ndat;
123 for (
i = 0;
i < ndat; ++
i) {
124 fam->pdat[
i] = exp(logpmin +
i * dlogp);
126 &fam->kdat[
i], fam->pdat[
i], eos);
128 if (
i > 0 && fam->mdat[
i] <= fam->mdat[
i-1])
134 const double epsabs = 0.0, epsrel = 1
e-6;
135 double a = fam->pdat[
i - 2];
136 double x = fam->pdat[
i - 1];
137 double b = fam->pdat[
i];
138 double fa = -fam->mdat[
i - 2];
139 double fx = -fam->mdat[
i - 1];
140 double fb = -fam->mdat[
i];
143 gsl_min_fminimizer *
s;
144 F.function = &fminimizer_gslfunction;
146 s = gsl_min_fminimizer_alloc(gsl_min_fminimizer_brent);
147 gsl_min_fminimizer_set_with_values(
s, &F,
x, fx,
a, fa, b, fb);
149 status = gsl_min_fminimizer_iterate(
s);
150 x = gsl_min_fminimizer_x_minimum(
s);
151 a = gsl_min_fminimizer_x_lower(
s);
152 b = gsl_min_fminimizer_x_upper(
s);
153 status = gsl_min_test_interval(
a, b, epsabs, epsrel);
154 }
while (
status == GSL_CONTINUE);
155 gsl_min_fminimizer_free(
s);
158 &fam->kdat[
i], fam->pdat[
i], eos);
161 if(fam->pdat[
i] <= fam->pdat[
i-1]){
162 fam->pdat[
i-1] = fam->pdat[
i];
169 fam->pdat =
LALRealloc(fam->pdat, ndat *
sizeof(*fam->pdat));
170 fam->mdat =
LALRealloc(fam->mdat, ndat *
sizeof(*fam->mdat));
171 fam->rdat =
LALRealloc(fam->rdat, ndat *
sizeof(*fam->rdat));
172 fam->kdat =
LALRealloc(fam->kdat, ndat *
sizeof(*fam->kdat));
178 fam->p_of_m_acc = gsl_interp_accel_alloc();
179 fam->r_of_m_acc = gsl_interp_accel_alloc();
180 fam->k_of_m_acc = gsl_interp_accel_alloc();
182 fam->p_of_m_interp = gsl_interp_alloc(gsl_interp_cspline, ndat);
186 gsl_interp_init(fam->p_of_m_interp, fam->mdat, fam->pdat, ndat);
187 gsl_interp_init(fam->r_of_m_interp, fam->mdat, fam->rdat, ndat);
188 gsl_interp_init(fam->k_of_m_interp, fam->mdat, fam->kdat, ndat);
210 return fam->mdat[fam->ndat - 1];
223 p = gsl_interp_eval(fam->p_of_m_interp, fam->mdat, fam->pdat,
m,
237 r = gsl_interp_eval(fam->r_of_m_interp, fam->mdat, fam->rdat,
m,
251 k = gsl_interp_eval(fam->k_of_m_interp, fam->mdat, fam->kdat,
m,
struct tagLALSimNeutronStarFamily LALSimNeutronStarFamily
Incomplete type for a neutron star family having a particular EOS.
struct tagLALSimNeutronStarEOS LALSimNeutronStarEOS
Incomplete type for the neutron star Equation of State (EOS).
double XLALSimNeutronStarEOSMaxPressure(LALSimNeutronStarEOS *eos)
Returns the maximum pressure of the EOS in Pa.
double XLALSimNeutronStarLoveNumberK2(double m, LALSimNeutronStarFamily *fam)
Returns the tidal Love number k2 of a neutron star of mass m.
void XLALDestroySimNeutronStarFamily(LALSimNeutronStarFamily *fam)
Frees the memory associated with a pointer to a neutron star family.
double XLALSimNeutronStarRadius(double m, LALSimNeutronStarFamily *fam)
Returns the radius of a neutron star of mass m.
GSL_VAR const gsl_interp_type * lal_gsl_interp_steffen
double XLALSimNeutronStarFamMinimumMass(LALSimNeutronStarFamily *fam)
Returns the minimum mass of a neutron star family.
double XLALSimNeutronStarCentralPressure(double m, LALSimNeutronStarFamily *fam)
Returns the central pressure of a neutron star of mass m.
LALSimNeutronStarFamily * XLALCreateSimNeutronStarFamily(LALSimNeutronStarEOS *eos)
Creates a neutron star family structure for a given equation of state.
double XLALSimNeutronStarMaximumMass(LALSimNeutronStarFamily *fam)
Returns the maximum mass of a neutron star family.
int XLALSimNeutronStarTOVODEIntegrate(double *radius, double *mass, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos)
#define XLAL_ERROR_NULL(...)