1 #include <lal/LALStdio.h>
2 #include <lal/LALDict.h>
3 #include <lal/LALSimInspiral.h>
4 #include <lal/LALSimInspiralWaveformFlags.h>
5 #include <lal/LALSimInspiralWaveformParams.h>
7 #include <gsl/gsl_poly.h>
16 #define UNREVIEWED_CODE_WARNING \
17 int debug_level = XLALGetDebugLevel(); \
18 XLALClobberDebugLevel(2); \
19 XLAL_PRINT_WARNING("This code is currently UNREVIEWED, use with caution!"); \
20 XLALClobberDebugLevel(debug_level);
24 #define DEFINE_INSERT_FUNC(NAME, TYPE, KEY, DEFAULT) \
25 int XLALSimInspiralWaveformParamsInsert ## NAME(LALDict *params, TYPE value) \
27 return XLALDictInsert ## TYPE ## Value(params, KEY, value); \
30 #define DEFINE_LOOKUP_FUNC(NAME, TYPE, KEY, DEFAULT) \
31 TYPE XLALSimInspiralWaveformParamsLookup ## NAME(LALDict *params) \
33 TYPE value = DEFAULT; \
34 if (params && XLALDictContains(params, KEY)) \
35 value = XLALDictLookup ## TYPE ## Value(params, KEY); \
39 #define DEFINE_ISDEFAULT_FUNC(NAME, TYPE, KEY, DEFAULT) \
40 int XLALSimInspiralWaveformParams ## NAME ## IsDefault(LALDict *params) \
42 return XLALSimInspiralWaveformParamsLookup ## NAME(params) == DEFAULT; \
47 #define DEFINE_INSERT_FUNC(NAME, TYPE, KEY, DEFAULT) \
48 int XLALSimInspiralWaveformParamsInsert ## NAME(LALDict *params, TYPE value);
50 #define DEFINE_LOOKUP_FUNC(NAME, TYPE, KEY, DEFAULT) \
51 TYPE XLALSimInspiralWaveformParamsLookup ## NAME(LALDict *params);
53 #define DEFINE_ISDEFAULT_FUNC(NAME, TYPE, KEY, DEFAULT) \
54 int XLALSimInspiralWaveformParams ## NAME ## IsDefault(LALDict *params);
62 #define String const char *
74 for(
size_t i = 0;
i < num_par;
i++) {
90 UINT2 nodim_number = 0;
92 const char *dimensionful_masses[6] = {
"mass1",
"mass2",
"total_mass", \
93 "chirp_mass",
"mass_difference",
"reduced_mass"};
94 const char *dimensionless_masses[2] = {
"mass_ratio",
"sym_mass_ratio"};
95 const char *symetric_masses[6] = {
"mass1",
"mass2",
"total_mass",
"chirp_mass",
"sym_mass_ratio",
"reduced_mass"};
97 for (
size_t j = 0; j <
sizeof(dimensionful_masses)/
sizeof(*dimensionful_masses); ++j){
102 for (
size_t j = 0; j <
sizeof(dimensionless_masses)/
sizeof(*dimensionless_masses); ++j){
107 for (
size_t j = 0; j <
sizeof(symetric_masses)/
sizeof(*symetric_masses); ++j){
116 if ((dim_number == 2 && nodim_number == 0) || (dim_number == 1 && nodim_number == 1)){
122 else if ((dim_number == 1 && nodim_number == 0) || dim_number == 0){
124 " one dimensionless and one dimensionful mass parameters, or two dimensionful masses.");
128 " one dimensionless and one dimensionful mass parameters, or two dimensionful masses.");
432 if (sym_mass_ratio <= 0.25){
433 x = 1.0 - 4.0 * sym_mass_ratio;
434 mass_ratio = 0.5 * (1. - pow(
x, 0.5)) / sym_mass_ratio - 1.0;
453 c = pow((chirp_mass / component_mass), 5);
454 x = 1.5 * pow((3.0/
c), 0.5);
456 mass_ratio = 3.0 * cos(acos(
x) / 3.0) /
x;
477 REAL8 sym_mass_ratio;
478 REAL8 mass_difference;
500 mass1 = mass2 / mass_ratio;
505 mass1 = mass2 / mass_ratio;
509 mass1 = mass2 + mass_difference;
513 mass1 = total_mass - mass2;
517 mass1 = reduced_mass * mass2 / (mass2 - reduced_mass);
522 mass1 = mass2 / mass_ratio;
529 mass1 = total_mass / (1. + mass_ratio);
534 mass1 = total_mass / (1. + mass_ratio);
538 mass1 = 0.5 * (total_mass + mass_difference);
542 if (total_mass < 4.0 * reduced_mass){
545 x = total_mass * (total_mass - 4.0 * reduced_mass);
546 mass_difference = pow(
x, 0.5);
547 mass1 = total_mass - 0.5 * (total_mass - mass_difference);
551 sym_mass_ratio = pow((chirp_mass / total_mass), 5.0/3.0);
553 mass1 = total_mass / (1.0 + mass_ratio);
560 mass1 = (1. + mass_ratio) * reduced_mass / mass_ratio;
565 mass1 = (1. + mass_ratio) * reduced_mass / mass_ratio;
569 x = 4.0 * pow(reduced_mass,2) + pow(mass_difference,2);
570 mass1 = reduced_mass + 0.5 * mass_difference + 0.5 * pow(
x, 0.5);
574 total_mass = pow(pow(chirp_mass, 5) / pow(reduced_mass, 3), 0.5);
575 x = total_mass * (total_mass - 4.0 * reduced_mass);
577 mass_difference = pow(
x, 0.5);
578 mass1 = total_mass - 0.5 * (total_mass - mass_difference);
587 XLAL_CHECK(fabs(mass_difference) > 0,
XLAL_EDOM,
"Mass difference cannot be zero if it is combined with a dimensionless mass parameter.");
590 mass1 = mass_difference / (1.0 - mass_ratio);
591 XLAL_CHECK(mass1 > 0,
XLAL_EDOM,
"Inconsistent values of mass_difference and mass_ratio.");
596 if (mass_difference < 0){
597 mass_ratio = 1./mass_ratio;
599 mass1 = mass_difference / (1.0 - mass_ratio);
608 double chirp_mass_5 = pow(chirp_mass, 5);
609 double coefficients[7] = { -mass_difference * chirp_mass_5, -2 * chirp_mass_5, 0, pow(mass_difference, 3), 3 * pow(mass_difference, 2), 3 * mass_difference, 1 };
610 double complex m2[6];
612 gsl_poly_complex_workspace *
w = gsl_poly_complex_workspace_alloc(7);
613 gsl_poly_complex_solve(coefficients, 7,
w, (
double *)m2);
614 gsl_poly_complex_workspace_free(
w);
619 if(cimag(m2[
i]) == 0 && creal(m2[
i])>0){
620 mass1 = creal(m2[
i]) + mass_difference;
621 if (mass1 > 0)
break;
631 sym_mass_ratio = mass_ratio / pow((1.0 + mass_ratio), 2);
632 total_mass = chirp_mass / pow(sym_mass_ratio, 3.0/5.0);
633 mass1 = total_mass / (1.0 + mass_ratio);
638 total_mass = chirp_mass / pow(sym_mass_ratio, 3.0/5.0);
639 mass1 = total_mass / (1.0 + mass_ratio);
658 REAL8 sym_mass_ratio;
659 REAL8 mass_difference;
678 mass2 = mass1 * mass_ratio;
683 mass2 = mass1 * mass_ratio;
687 mass2 = mass1 - mass_difference;
691 mass2 = total_mass - mass1;
695 mass2 = reduced_mass * mass1 / (mass1 - reduced_mass);
700 mass2 = mass1 * mass_ratio;
708 mass2 = total_mass / (1. + mass_ratio) * mass_ratio;
713 mass2 = total_mass / (1. + mass_ratio) * mass_ratio;
717 mass2 = 0.5 * (total_mass - mass_difference);
721 if (total_mass < 4.0 * reduced_mass){
724 x = total_mass * (total_mass - 4.0 * reduced_mass);
725 mass_difference = pow(
x, 0.5);
726 mass2 = 0.5 * (total_mass - mass_difference);
730 sym_mass_ratio = pow((chirp_mass / total_mass), 5.0/3.0);
732 mass2 = total_mass / (1.0 + mass_ratio) * mass_ratio;
740 mass2 = (1. + mass_ratio) * reduced_mass;
745 mass2 = (1. + mass_ratio) * reduced_mass;
749 x = 4.0 * pow(reduced_mass,2) + pow(mass_difference,2);
750 mass2 = reduced_mass + 0.5 * mass_difference + 0.5 * pow(
x, 0.5) - mass_difference;
754 total_mass = pow(pow(chirp_mass, 5) / pow(reduced_mass, 3), 0.5);
755 x = total_mass * (total_mass - 4.0 * reduced_mass);
757 mass_difference = pow(
x, 0.5);
758 mass2 = 0.5 * (total_mass - mass_difference);
768 XLAL_CHECK(fabs(mass_difference) > 0,
XLAL_EDOM,
"Mass difference cannot be zero if it is combined with a dimensionless mass parameter.");
771 mass2 = mass_difference / (1.0 - mass_ratio) * mass_ratio;
772 XLAL_CHECK(mass2 > 0,
XLAL_EDOM,
"Inconsistent values of mass_difference and mass_ratio.");
777 if (mass_difference < 0){
778 mass_ratio = 1./mass_ratio;
780 mass2 = mass_ratio * mass_difference / (1.0 - mass_ratio);
789 double chirp_mass_5 = pow(chirp_mass, 5);
790 double coefficients[7] = { -mass_difference * chirp_mass_5, -2 * chirp_mass_5, 0, pow(mass_difference, 3), 3 * pow(mass_difference, 2), 3 * mass_difference, 1 };
791 double complex m2[6];
793 gsl_poly_complex_workspace *
w = gsl_poly_complex_workspace_alloc(7);
794 gsl_poly_complex_solve(coefficients, 7,
w, (
double *)m2);
795 gsl_poly_complex_workspace_free(
w);
800 if(cimag(m2[
i]) == 0 && creal(m2[
i])>0){
801 mass1 = creal(m2[
i]) + mass_difference;
803 mass2 = creal(m2[
i]);
815 sym_mass_ratio = mass_ratio / pow((1.0 + mass_ratio), 2);
816 total_mass = chirp_mass / pow(sym_mass_ratio, 3.0/5.0);
817 mass2 = total_mass / (1.0 + mass_ratio) * mass_ratio;
822 total_mass = chirp_mass / pow(sym_mass_ratio, 3.0/5.0);
823 mass2 = total_mass / (1.0 + mass_ratio) * mass_ratio;
845 total_mass = mass1 + mass2;
863 mass_ratio = mass2 / mass1;
872 REAL8 sym_mass_ratio;
876 XLAL_CHECK(sym_mass_ratio > 0 && sym_mass_ratio <= 0.25,
XLAL_EDOM,
"sym_mass_ratio must be between (0, 0.25]");
881 sym_mass_ratio = mass1 * mass2 / pow(mass1 + mass2, 2);
883 return sym_mass_ratio;
899 chirp_mass = pow(mass1 * mass2, 3.0 / 5.0) / pow(mass1 + mass2, 1.0 / 5.0);
908 REAL8 mass_difference;
916 mass_difference = mass1 - mass2;
918 return mass_difference;
934 reduced_mass = mass1 * mass2 / (mass1 + mass2);
947 spinx = spin_norm * sin(spin_tilt) * cos(spin_phi);
955 spiny = spin_norm * sin(spin_tilt) * sin(spin_phi);
962 spinz = spin_norm * cos(spin_tilt);
969 spin_norm = sqrt(spinx* spinx+ spiny* spiny+ spinz * spinz);
976 spin_tilt = acos(spinz / sqrt(spinx* spinx+ spiny* spiny+ spinz * spinz));
983 spin_phi = atan(spiny / spinz);
1011 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin1x. Assuming zero as a default value. \n");
1034 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin1y. Assuming zero as a default value. \n");
1054 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin1z. Assuming zero as a default value. \n");
1077 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin2x. Assuming zero as a default value. \n");
1100 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin2y. Assuming zero as a default value. \n");
1120 XLAL_PRINT_WARNING(
"Not enough information provided to determine spin2z. Assuming zero as a default value. \n");
1128 REAL8 spin1_norm = -1;
1149 REAL8 spin1_tilt = -1;
1171 REAL8 spin1_phi = -1;
1191 REAL8 spin2_norm = -1;
1212 REAL8 spin2_tilt = -1;
1233 REAL8 spin2_phi = -1;
1271 LALValue * value = NULL;
1283 LALValue * value = NULL;
1740 LALDict*
XLALSimInspiralParamsDict(const
REAL8 m1, const
REAL8 m2, const
REAL8 S1x, const
REAL8 S1y, const
REAL8 S1z, const
REAL8 S2x, const
REAL8 S2y, const
REAL8 S2z, const
REAL8 distance, const
REAL8 inclination, const
REAL8 phiRef, const
REAL8 longAscNodes, const
REAL8 eccentricity, const
REAL8 f_ref, LALDict *LALparams)
int XLALDictContains(const LALDict *dict, const char *key)
LALDictEntry * XLALDictLookup(LALDict *dict, const char *key)
LALDict * XLALDictDuplicate(LALDict *old)
const LALValue * XLALDictEntryGetValue(const LALDictEntry *entry)
int XLALDictInsertValue(LALDict *dict, const char *key, const LALValue *value)
REAL8 XLALDictLookupREAL8Value(LALDict *dict, const char *key)
LALValue * XLALValueDuplicate(const LALValue *value)
#define LAL_DEFAULT_F_ECC
@ LAL_SIM_INSPIRAL_MODES_CHOICE_ALL
Include all available modes.
@ LAL_SIM_INSPIRAL_GETIDES_GSF23
@ LAL_SIM_INSPIRAL_FRAME_AXIS_ORBITAL_L
Set z-axis along the initial orbital angular momentum.
@ LAL_SIM_INSPIRAL_GMTIDES_PN
@ Eccentricity
UNDOCUMENTED.
#define XLAL_ERROR_REAL8(...)
#define XLAL_CHECK(assertion,...)
#define XLAL_PRINT_WARNING(...)