28 #include <lal/LALSimReadData.h>
29 #include <gsl/gsl_interp.h>
30 #include <lal/LALSimNeutronStar.h>
35 static double non_causal_Nparams(
double p,
double esec[],
double psec[],
double gsec[],
size_t nsec){
39 for (k = 0; k <= (int)nsec - 2; ++k)
43 e = (esec[k] - psec[k] / (gsec[k] - 1)) * pow(p / psec[k], 1 / gsec[k]) +
p / (gsec[k] - 1);
48 static double causal_Nparams(
double p,
double esec[],
double psec[],
double usec[],
double vsec[],
size_t nsec){
52 for (k = 0; k <= (int)nsec - 2; ++k)
56 e = esec[k] +
p - psec[k] + (psec[k] * usec[k] / (1 + vsec[k+1])) * (pow(p / psec[k], 1 + vsec[k+1]) - 1);
80 if (causal!=0 && causal!=1)
91 double pmax = 9.829054605e-8;
92 double p0 = 4.43784199e-13;
97 for (
int i=1;
i < (int)nsec;
i++)
101 if (psec[nsec-1]>pmax)
106 double SLYdat_p[] = {2.497300e-31, 1.592353e-30,
107 1.015332e-29, 6.474064e-29, 4.128057e-28,
108 2.632173e-27, 1.678353e-26, 1.070168e-25,
109 6.823712e-25, 4.351004e-24, 1.915235e-23,
110 8.060015e-23, 3.231442e-22, 4.345220e-22,
111 1.185661e-21, 3.166995e-21, 8.312020e-21,
112 2.151541e-20, 5.516008e-20, 7.219725e-20,
113 1.345952e-19, 2.502695e-19, 3.411564e-19,
114 4.160967e-19, 5.668037e-19, 1.050983e-18,
115 1.946632e-18, 3.604079e-18, 4.678197e-18,
116 6.363735e-18, 8.659043e-18, 1.177398e-17,
117 1.601262e-17, 2.068090e-17, 2.812536e-17,
118 3.823860e-17, 4.915329e-17, 6.683492e-17,
119 9.088690e-17, 1.198055e-16, 1.235236e-16,
120 1.679755e-16, 2.145757e-16, 2.389499e-16,
121 2.718344e-16, 3.695792e-16, 4.805438e-16,
122 6.228231e-16, 6.448839e-16, 6.519069e-16,
123 6.900794e-16, 7.517173e-16, 7.841887e-16,
124 8.122810e-16, 8.948228e-16, 1.780309e-15,
125 2.831705e-15, 4.352574e-15, 6.442724e-15,
126 9.210148e-15, 1.726355e-14, 2.961343e-14,
127 4.760077e-14, 7.280619e-14, 1.069739e-13,
128 1.786341e-13, 3.178976e-13, 4.169395e-13,
129 4.437842e-13, 8.192049e-13, 2.464440e-12,
130 5.749505e-12, 1.129311e-11, 1.962992e-11,
131 3.125683e-11, 4.664233e-11, 6.623341e-11,
132 9.045725e-11, 1.197311e-10, 1.544499e-10,
133 1.949854e-10, 2.417178e-10, 2.949858e-10,
134 3.551282e-10, 4.224506e-10, 4.972587e-10,
135 5.798254e-10, 6.704065e-10, 7.692419e-10,
136 8.765628e-10, 9.925676e-10, 1.117413e-09,
137 1.251265e-09, 1.394370e-09, 1.546730e-09,
138 1.708591e-09, 1.880037e-09, 2.061232e-09, 2.252177e-09};
141 size_t SLYdat_p_size =
sizeof(SLYdat_p) /
sizeof(*SLYdat_p);
142 if (psec[0] > SLYdat_p[SLYdat_p_size - 1])
144 if (psec[0] < SLYdat_p[0])
147 double SLYdat_e[] = {9.768004e-24, 3.088914e-23,
148 9.768005e-23, 3.088915e-22, 9.768010e-22,
149 3.088918e-21, 9.768031e-21, 3.088931e-20,
150 9.768115e-20, 3.088985e-19, 7.759067e-19,
151 1.949099e-18, 4.896221e-18, 6.163579e-18,
152 1.229692e-17, 2.454210e-17, 4.898236e-17,
153 9.773109e-17, 1.950244e-16, 2.455315e-16,
154 3.892642e-16, 6.169263e-16, 7.768370e-16,
155 9.006424e-16, 1.192376e-15, 1.890371e-15,
156 3.094528e-15, 4.906359e-15, 5.964589e-15,
157 7.510611e-15, 9.797770e-15, 1.233538e-14,
158 1.553357e-14, 1.881882e-14, 2.462712e-14,
159 3.100969e-14, 3.743924e-14, 4.918149e-14,
160 6.194543e-14, 7.622245e-14, 8.111554e-14,
161 1.052007e-13, 1.264362e-13, 1.370769e-13,
162 1.557999e-13, 2.029004e-13, 2.471392e-13,
163 3.112816e-13, 3.195299e-13, 3.221410e-13,
164 3.362136e-13, 3.585373e-13, 3.701139e-13,
165 3.800336e-13, 4.248215e-13, 1.571192e-12,
166 2.360837e-12, 3.331525e-12, 4.497152e-12,
167 5.875556e-12, 9.359056e-12, 1.398990e-11,
168 2.000679e-11, 2.762451e-11, 3.691961e-11,
169 5.352249e-11, 7.810201e-11, 9.194762e-11,
170 9.546290e-11, 1.258593e-10, 1.895055e-10,
171 2.539315e-10, 3.194416e-10, 3.863255e-10,
172 4.548506e-10, 5.252990e-10, 5.979231e-10,
173 6.729756e-10, 7.507236e-10, 8.312713e-10,
174 9.150863e-10, 1.002169e-09, 1.092816e-09,
175 1.187250e-09, 1.285694e-09, 1.388296e-09,
176 1.495280e-09, 1.606794e-09, 1.723060e-09,
177 1.844228e-09, 1.970445e-09, 2.101934e-09,
178 2.238770e-09, 2.381175e-09, 2.529225e-09,
179 2.683140e-09, 2.842997e-09, 3.008942e-09, 3.181052e-09};
182 ((void)
sizeof(
char[1 - 2*!!(
sizeof(SLYdat_p) !=
sizeof(SLYdat_e))]));
187 for (limit = 1; limit < SLYdat_p_size; ++limit)
188 if (psec[0] < SLYdat_p[limit])
192 size_t ndat = 100 + limit;
200 if (pdat == NULL || edat == NULL) {
206 double logpmax = log(pmax);
207 double logp0 = log(psec[0]);
208 double dlogp = (logpmax-logp0)/(ndat-limit);
211 for (
int i = 0;
i < (int)limit;
i++){
212 pdat[
i] = SLYdat_p[
i];
213 edat[
i] = SLYdat_e[
i];
217 double b = SLYdat_e[limit-1];
218 double dedp = (SLYdat_e[limit]-SLYdat_e[limit-1])/(SLYdat_p[limit]-SLYdat_p[limit-1]);
219 double x = psec[0]-SLYdat_p[limit-1];
220 double e0 = (dedp*
x) + b;
232 vsec[0] = log(usec[0]);
234 vsec[1] = parameters[0];
235 for (
int i = 1;
i < (int)nsec;
i++)
237 vsec[
i+1] = parameters[
i*2];
238 for (
int k=1; k < (int)nsec; ++k){
240 usec[k] = usec[k-1] * pow(psec[k] / psec[k-1],vsec[k]);
242 esec[k] = esec[k-1] + psec[k] - psec[k-1] + ( psec[k-1] * usec[k-1] / (1 + vsec[k])) * (pow(psec[k] / psec[k-1], 1 + vsec[k]) - 1);
245 for (
int i = limit;
i < (int)ndat;
i++){
246 pdat[
i] = exp(logp0 + (dlogp*(
i-limit)));
247 edat[
i] = causal_Nparams(pdat[
i],esec,psec,usec,vsec,nsec);
251 gsec[0]=parameters[0];
252 for (
int i = 1;
i < (int)nsec;
i++)
254 gsec[
i] = parameters[
i*2];
255 for (
int k = 0; k < (int)nsec-1; ++k)
257 esec[k+1] = (esec[k] - psec[k] / (gsec[k] - 1)) * pow(psec[k+1] / psec[k], 1 / gsec[k]) + psec[k+1] / (gsec[k] - 1);
259 for (
int i = limit;
i < (int)ndat;
i++){
260 pdat[
i] = exp(logp0 + (dlogp*(
i-limit)));
261 edat[
i] = non_causal_Nparams(pdat[
i],esec,psec,gsec,nsec);
267 double *nbdat = NULL;
268 double *mubdat = NULL;
269 double *muedat = NULL;
270 double *yedat = NULL;
271 double *cs2dat = NULL;
275 eos = eos_alloc_tabular(nbdat, edat, pdat, mubdat, muedat, hdat, yedat, cs2dat, ndat, ncol);
317 double params[]={v1,log10p1_si,v2,log10p2_si,v3};
344 if (causal!=0 && causal!=1)
362 const double logpmin = 75.5;
364 double dlogp = (logpmax - logpmin) / 100.;
366 for (
int i = 0;
i < 4; ++
i) {
367 pdat = exp(logpmin +
i * dlogp);
370 if (mdat <= mdat_prev){
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.
void * XLALCalloc(size_t m, size_t n)
int XLALSimNeutronStarEOS3PDViableFamilyCheck(double p0, double log10p1_si, double p1, double log10p2_si, double p2, int causal)
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.
LALSimNeutronStarEOS * XLALSimNeutronStarEOS3PieceCausalAnalytic(double v1, double log10p1_si, double v2, double log10p2_si, double v3)
Reads 5 causal analytic eos parameters to make an eos.
LALSimNeutronStarEOS * XLALSimNeutronStarEOSDynamicAnalytic(double parameters[], size_t nsec, int causal)
Reads dynamic analytic eos parameters to make an eos.
LALSimNeutronStarEOS * XLALSimNeutronStarEOS3PieceDynamicPolytrope(double g0, double log10p1_si, double g1, double log10p2_si, double g2)
Reads 5 dynamic polytrope eos parameters to make an eos.
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(...)