28 #include <lal/LALSimReadData.h>
29 #include <gsl/gsl_interp.h>
30 #include <lal/LALSimNeutronStar.h>
35 static void GLBoundConversion(
double a,
double b,
double abscissae[],
int nEval)
42 abscissae[
i]=((b-
a)/2.0)*abscissae[
i] + (
a+b)/2.0;
47 static void resetAbscissae(
double abscissae[])
49 abscissae[0] = -0.9739065285171717;
50 abscissae[1] = -0.8650633666889845;
51 abscissae[2] = -0.6794095682990244;
52 abscissae[3] = -0.4333953941292472;
53 abscissae[4] = -0.1488743389816312;
54 abscissae[5] = 0.1488743389816312;
55 abscissae[6] = 0.4333953941292472;
56 abscissae[7] = 0.6794095682990244;
57 abscissae[8] = 0.8650633666889845;
58 abscissae[9] = 0.9739065285171717;
62 static double AdiabaticIndex(
double gamma[],
double x,
int size)
64 double Gamma, logGamma = 0;
68 logGamma +=
gamma[
i]*pow(x,(
double)
i);
70 Gamma = exp(logGamma);
75 static double eos_e_of_p_spectral_decomposition(
double x,
double gamma[],
int size,
double p0,
double e0)
86 double abscissae[nEval], abscissaePrime[nEval];
87 resetAbscissae(abscissae);
117 GLBoundConversion(0.0,x,abscissae, nEval);
121 Integral += weights[
i]*pow(AdiabaticIndex(
gamma,abscissae[
i],size),-1.0);
147 resetAbscissae(abscissaePrime);
148 GLBoundConversion(0.0,abscissae[
i],abscissaePrime, nEval);
152 IPrime += weights[j]*pow(AdiabaticIndex(
gamma,abscissaePrime[j],size),-1.0);
155 IPrime *= (abscissae[
i]/2.0);
156 IPrime = exp(-IPrime);
158 Integral += weights[
i]*(exp(abscissae[
i])*IPrime/AdiabaticIndex(
gamma,abscissae[
i],size));
163 e = e0/
mu +(p0/
mu)*Integral;
184 size_t ndat_low = 69;
185 size_t ndat = ndat_low + 500;
192 double e0 = 9.54629006e-11;
193 double p0 = 4.43784199e-13;
195 double xmax = 12.3081;
196 double pmax = p0*exp(xmax);
201 double xdat[ndat-ndat_low];
205 if (pdat == NULL || edat == NULL) {
214 0.00000000e+00, 2.49730009e-31, 1.59235347e-30,
215 1.01533235e-29, 6.47406376e-29, 4.12805731e-28,
216 2.63217321e-27, 1.67835262e-26, 1.07016799e-25,
217 6.82371225e-25, 4.35100369e-24, 1.91523482e-23,
218 8.06001537e-23, 3.23144235e-22, 4.34521997e-22,
219 1.18566090e-21, 3.16699528e-21, 8.31201995e-21,
220 2.15154075e-20, 5.51600847e-20, 7.21972469e-20,
221 1.34595234e-19, 2.50269468e-19, 3.41156366e-19,
222 4.16096744e-19, 5.66803746e-19, 1.05098304e-18,
223 1.94663211e-18, 3.60407863e-18, 4.67819652e-18,
224 6.36373536e-18, 8.65904266e-18, 1.17739845e-17,
225 1.60126190e-17, 2.06809005e-17, 2.81253637e-17,
226 3.82385968e-17, 4.91532870e-17, 6.68349199e-17,
227 9.08868981e-17, 1.19805457e-16, 1.23523557e-16,
228 1.67975513e-16, 2.14575704e-16, 2.38949918e-16,
229 2.71834450e-16, 3.69579177e-16, 4.80543818e-16,
230 6.22823125e-16, 6.44883854e-16, 6.51906933e-16,
231 6.90079430e-16, 7.51717272e-16, 7.84188682e-16,
232 8.12280996e-16, 8.94822824e-16, 1.78030908e-15,
233 2.83170525e-15, 4.35257355e-15, 6.44272433e-15,
234 9.21014776e-15, 1.72635532e-14, 2.96134301e-14,
235 4.76007735e-14, 7.28061891e-14, 1.06973879e-13,
236 1.78634067e-13, 3.17897582e-13, 4.16939514e-13};
239 0.00000000e+00, 9.76800363e-24, 3.08891410e-23,
240 9.76800489e-23, 3.08891490e-22, 9.76801000e-22,
241 3.08891816e-21, 9.76803078e-21, 3.08893141e-20,
242 9.76811525e-20, 3.08898527e-19, 7.75906672e-19,
243 1.94909879e-18, 4.89622085e-18, 6.16357861e-18,
244 1.22969164e-17, 2.45420997e-17, 4.89823567e-17,
245 9.77310869e-17, 1.95024387e-16, 2.45531498e-16,
246 3.89264229e-16, 6.16926264e-16, 7.76837038e-16,
247 9.00642353e-16, 1.19237569e-15, 1.89037060e-15,
248 3.09452823e-15, 4.90635934e-15, 5.96458915e-15,
249 7.51061114e-15, 9.79776989e-15, 1.23353809e-14,
250 1.55335650e-14, 1.88188196e-14, 2.46271194e-14,
251 3.10096915e-14, 3.74392368e-14, 4.91814886e-14,
252 6.19454280e-14, 7.62224545e-14, 8.11155415e-14,
253 1.05200677e-13, 1.26436151e-13, 1.37076948e-13,
254 1.55799897e-13, 2.02900352e-13, 2.47139208e-13,
255 3.11281590e-13, 3.19529901e-13, 3.22140999e-13,
256 3.36213572e-13, 3.58537297e-13, 3.70113877e-13,
257 3.80033593e-13, 4.24821517e-13, 1.57119195e-12,
258 2.36083738e-12, 3.33152493e-12, 4.49715211e-12,
259 5.87555551e-12, 9.35905600e-12, 1.39898961e-11,
260 2.00067862e-11, 2.76245081e-11, 3.69196076e-11,
261 5.35224936e-11, 7.81020115e-11, 9.19476188e-11};
264 for(
i=0;
i<ndat_low;
i++)
271 double logpmax = log(pmax);
272 double logp0 = log(p0);
273 double dlogp = (logpmax-logp0)/(ndat - ndat_low);
276 for(
i=0;
i < ndat-ndat_low;
i++)
278 pdat[
i+ndat_low] = exp(logp0 + dlogp*(
i));
282 for(
i = 0;
i<ndat - ndat_low;
i++) {
283 xdat[
i] = log(pdat[
i+ndat_low]/p0);
285 for(
i = ndat_low;
i < ndat;
i++)
288 edat[
i] = eos_e_of_p_spectral_decomposition(xdat[
i-ndat_low],
gamma, size, p0,e0);
292 double *nbdat = NULL;
293 double *mubdat = NULL;
294 double *muedat = NULL;
295 double *yedat = NULL;
296 double *cs2dat = NULL;
300 eos = eos_alloc_tabular(nbdat, edat, pdat, mubdat, muedat, hdat, yedat, cs2dat, ndat, ncol);
303 if(snprintf(eos->name,
sizeof(eos->name),
"4-Param Spec Decomp (g0=%.4g, g1=%.4g, g2=%.4g, g3=%.4g)",
322 double gamma[] = {SDgamma0, SDgamma1, SDgamma2, SDgamma3};
340 double p0 = 4.43784199e-13;
341 double xmax = 12.3081;
342 double pmax = p0 * exp(xmax);
352 if (pdat == NULL || adat == NULL || xdat == NULL) {
361 double logpmax = log(pmax);
362 double logp0 = log(p0);
363 double dlogp = (logpmax-logp0)/ndat;
365 for(
i = 0;
i < (int) ndat;
i++)
367 pdat[
i] = exp(logp0 + dlogp*
i);
368 xdat[
i] = log(pdat[
i]/p0);
369 adat[
i] = AdiabaticIndex(
gamma, xdat[
i], 4);
373 for(
i = 0;
i<(int) ndat;
i++) {
375 if(adat[
i] < 0.6 || adat[
i] > 4.5) {
414 const double logpmin = 75.5;
416 double dlogp = (logpmax - logpmin) / 100.;
418 for (
int i = 0;
i < 4; ++
i) {
419 pdat = exp(logpmin +
i * dlogp);
422 if (mdat <= mdat_prev){
struct tagLALSimNeutronStarEOS LALSimNeutronStarEOS
Incomplete type for the neutron star Equation of State (EOS).
void * XLALCalloc(size_t m, size_t n)
LALSimNeutronStarEOS * XLALSimNeutronStarEOSSpectralDecomposition(double gamma[], int size)
Reads spectral decomposition eos parameters to make an eos.
LALSimNeutronStarEOS * XLALSimNeutronStarEOS4ParameterSpectralDecomposition(double SDgamma0, double SDgamma1, double SDgamma2, double SDgamma3)
Reads 4 spectral decomposition eos parameters to make an eos.
int XLALSimNeutronStarEOS4ParamSDGammaCheck(double g0, double g1, double g2, double g3)
Check that EOS has adiabatic index in range (0.6,4.5)
int XLALSimNeutronStarEOS4ParamSDViableFamilyCheck(double g0, double g1, double g2, double g3)
Check that EOS has enough points (>4) in M-R space to interpolate.
double XLALSimNeutronStarEOSMaxPressure(LALSimNeutronStarEOS *eos)
Returns the maximum pressure of the EOS in Pa.
void XLALDestroySimNeutronStarEOS(LALSimNeutronStarEOS *eos)
Frees the memory associated with a pointer to an EOS structure.
int XLALSimNeutronStarTOVODEIntegrate(double *radius, double *mass, double *love_number_k2, double central_pressure_si, LALSimNeutronStarEOS *eos)
#define XLAL_ERROR_NULL(...)
#define XLAL_PRINT_WARNING(...)