23 #include <lal/LALSimIMR.h>
24 #include <lal/SphericalHarmonics.h>
25 #include <lal/Sequence.h>
27 #include <lal/Units.h>
28 #include <lal/LALConstants.h>
29 #include <lal/FrequencySeries.h>
30 #include <lal/LALDatatypes.h>
31 #include <lal/LALStdlib.h>
32 #include <lal/XLALError.h>
44 #ifndef PHENOMXHMDEBUG
50 #ifndef PHENOMXHMMBAND
53 #define MBAND PHENOMXHMMBAND
125 INT4 lalParams_In = 0;
126 if (lalParams == NULL)
134 if (ModeArray == NULL)
158 if(lalParams_In == 1)
195 printf(
"npts = %zu\n",npts);
196 printf(
"fMin = %.6f\n",
f_min);
197 printf(
"fMax = %.6f\n",
f_max);
198 printf(
"dF = %.6f\n",pWF->
deltaF);
199 printf(
"f_max / deltaF = %.6f\n",
f_max / pWF->
deltaF);
214 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.", iStart, iStop, npts);
217 printf(
"f_min asked returned = %.16e %.16e \n",
f_min, iStart*pWF->
deltaF);
218 printf(
"f_max asked returned = %.16e %.16e \n",
f_max, iStop*pWF->
deltaF);
228 for (
UINT4 i = iStart;
i < iStop;
i++)
230 (*freqs)->data[
i-iStart] =
i * pWF->
deltaF;
239 XLAL_CHECK (*htildelm,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries of length %zu from sequence.", npts);
252 (*freqs)->data[
i] = freqs_In->
data[
i];
256 memset((*htildelm)->data->data, 0, npts *
sizeof(
COMPLEX16));
306 if(ell == 2 && abs(emm) == 2){
323 printf(
"\nTransforming to positive m by doing (-1)^l*Conjugate, frequencies must be negatives.\n");
325 for(
UINT4 idx=0; idx<(*htildelm)->data->length; idx++){
326 (*htildelm)->data->data[idx] = conj((*htildelm)->data->data[idx]);
329 size_t iStart = (size_t) (
f_min / deltaF);
338 printf(
"\n**********************************************************************\n");
339 printf(
"\n* IMRPhenomXHMGenereateFDOneMode %i%i *\n", ell, abs(emm));
340 printf(
"\n**********************************************************************\n");
341 printf(
"fRef_In : %e\n",fRef_In);
342 printf(
"m1_SI : %e\n",m1_SI);
343 printf(
"m2_SI : %e\n",m2_SI);
344 printf(
"chi1L : %e\n",chi1L);
345 printf(
"chi2L : %e\n\n",chi2L);
346 printf(
"Performing sanity checks...\n");
351 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
357 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
370 mass_ratio = m1_SI / m2_SI;
374 mass_ratio = m2_SI / m1_SI;
376 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
377 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
378 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
381 LALDict *lalParams_aux;
383 if (lalParams == NULL)
397 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
403 REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
406 printf(
"\n\n **** Initializing waveform struct... **** \n\n");
418 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, 0.0, lalParams_aux,
DEBUG);
422 printf(
"\n f_max_prime = %.16f, fMax = %.16f \n",pWF->
f_max_prime, pWF->
fMax);
429 size_t iStart = (size_t) (
f_min / deltaF);
430 size_t iStop = (size_t) (pWF->
f_max_prime / deltaF);
432 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.", iStart, iStop, npts);
441 printf(
"\n\nfstart, fend = %.16f %.16f\n\n", freqs->
data[0], freqs->
data[1]);
442 printf(
"\n\n **** Calling IMRPhenomXHMGenerateFDOneMode... **** \n\n");
443 printf(
"\n f_max_prime = %.16f, fMax = %.16f \n", pWF->
f_max_prime, pWF->
fMax);
451 printf(
"\n\n **** Call to IMRPhenomXHMGenerateFD complete. **** \n\n");
452 printf(
"\n f_max_prime = %.16f, fMax = %.16f \n",pWF->
f_max_prime, pWF->
fMax);
458 printf(
"\nTransforming to positive m by doing (-1)^l*Conjugate, frequencies must be negatives.\n");
467 for(
UINT4 idx=0; idx<(*htildelm)->data->length; idx++){
468 (*htildelm)->data->data[idx] = minus1l*conj((*htildelm)->data->data[idx]);
478 lastfreq = pWF->
fMax;
479 XLAL_PRINT_WARNING(
"The input f_max = %.2f Hz is larger than the internal cutoff of Mf=0.3 (%.2f Hz). Array will be filled with zeroes between these two frequencies.\n", pWF->
fMax, pWF->
f_max_prime);
485 size_t n = (*htildelm)->data->length;
491 XLAL_CHECK (*htildelm,
XLAL_ENOMEM,
"Failed to resize waveform COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).", n, pWF->
f_max_prime, n_full, pWF->
fMax );
501 printf(
"\n Leaving XLALSimIMRPhenomXHMGenerateFDOneMode \n");
522 printf(
"\n\n ***** IMRPhenomXHMGenerateFDOneMode **** \n\n");
534 printf(
"\nIMRPhenomXHMGenerateFDOneMode: Length@freqs, offset %i %u",freqs->
length,offset);
535 printf(
"\nIMRPhenomXHMGenerateFDOneMode: fstart, fend = %.16f %.16f\n\n", freqs->
data[0], freqs->
data[freqs->
length-1]);
539 INT4 lalParams_In = 0;
540 if(lalParams == NULL)
610 sprintf(fileSpec,
"simulation%i_SM.dat", pWFHM->
modeTag);
611 printf(
"\nOutput file: %s\r\n",fileSpec);
612 file = fopen(fileSpec,
"w");
614 fprintf(
file,
"# Frequency (Hz) Amplitude Phase\n");
625 Mf = Msec * freqs->
data[idx];
634 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
641 phi += lina + Mf*linb;
644 ((*htildelm)->data->data)[idx+offset] = Amp0 * amp * cexp(I * phi);
653 ((*htildelm)->data->data)[idx+offset] = 0.0 + I*0.0;
670 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
678 phi += lina + Mf*linb;
696 ((*htildelm)->data->data)[idx+offset] = phi;
699 ((*htildelm)->data->data)[idx+offset] = Amp0 * amp * cexp(I * phi);
709 ((*htildelm)->data->data)[idx+offset] = 0.0 + I*0.0;
728 if(lalParams_In == 1)
734 printf(
"\nIMRPhenomXHMGenerateFDOneMode: Leaving... \n");
738 return initial_status;
767 if(ell == 2 && abs(emm) == 2){
783 for(
UINT4 idx=0; idx<(*htildelm)->data->length; idx++){
784 (*htildelm)->data->data[idx] = conj((*htildelm)->data->data[idx]);
796 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
799 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
812 mass_ratio = m1_SI / m2_SI;
816 mass_ratio = m2_SI / m1_SI;
818 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
819 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
820 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
823 LALDict *lalParams_aux;
825 if (lalParams == NULL)
839 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
845 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
865 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef, phiRef, f_min_In, f_max_In, distance, 0.0, lalParams_aux,
PHENOMXDEBUG);
885 for(
UINT4 idx=0; idx<(*htildelm)->data->length; idx++){
886 (*htildelm)->data->data[idx] = minus1l*conj((*htildelm)->data->data[idx]);
924 INT4 LALparams_In = 0;
925 LALValue *InputModeArray = NULL;
928 if(LALparams != NULL)
952 if(InputModeArray == NULL)
984 if (thresholdMB == 0){
985 XLALSimIMRPhenomXHMGenerateFDOneMode(&htildelm, m1_SI, m2_SI, S1z, S2z, ell, emm, distance,
f_min,
f_max, deltaF, phiRef, f_ref, LALparams);
988 if(ell==3 && abs(emm)==2){
989 XLALSimIMRPhenomXHMMultiBandOneModeMixing(&htildelm, htilde22, m1_SI, m2_SI, S1z, S2z, ell, emm, distance,
f_min,
f_max, deltaF, phiRef, f_ref, LALparams);
992 XLALSimIMRPhenomXHMMultiBandOneMode(&htildelm, m1_SI, m2_SI, S1z, S2z, ell, emm, distance,
f_min,
f_max, deltaF, phiRef, f_ref, LALparams);
995 if(ell==2 && emm==-2 && htildelm){
1040 for (
INT4 i = -length;
i<=length;
i++)
1042 freqs->
data[
i+length] =
i*deltaF;
1051 if (LALparams_In == 0)
1086 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1089 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1102 mass_ratio = m1_SI / m2_SI;
1106 mass_ratio = m2_SI / m1_SI;
1108 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
1109 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
1110 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
1113 LALDict *lalParams_aux;
1115 if (lalParams == NULL)
1129 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
1152 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef_In, phiRef, f_min_In, f_max_In, distance, 0.0, lalParams_aux,
PHENOMXDEBUG);
1198 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
1243 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1246 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1259 mass_ratio = m1_SI / m2_SI;
1263 mass_ratio = m2_SI / m1_SI;
1265 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
1266 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
1267 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
1270 LALDict *lalParams_aux;
1272 if (lalParams == NULL)
1286 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
1309 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef_In, phiRef, f_min_In, f_max_In, distance, 0.0, lalParams_aux,
PHENOMXDEBUG);
1356 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
1436 mass_ratio = m1_SI / m2_SI;
1440 mass_ratio = m2_SI / m1_SI;
1442 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
1443 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
1444 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
1470 printf(
"\n******Leaving XLALSimIMRPhenomXHM*****\n");
1507 printf(
"\n*** IMRPhenomXHM2 ***\n");
1508 printf(
"fRef_In : %e\n",fRef_In);
1509 printf(
"m1_SI : %.16e\n",m1_SI);
1510 printf(
"m2_SI : %.16e\n",m2_SI);
1511 printf(
"chi1L : %.16e\n",chi1L);
1512 printf(
"chi2L : %.16e\n",chi2L);
1513 printf(
"f_min : %.16e \n",
f_min);
1514 printf(
"Performing sanity checks...\n");
1520 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1526 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1538 mass_ratio = m1_SI / m2_SI;
1542 mass_ratio = m2_SI / m1_SI;
1544 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
1545 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
1546 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
1552 REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
1556 printf(
"\nInitializing waveform struct...\n");
1566 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams, debug);
1574 size_t iStart = (size_t) (
f_min / deltaF);
1575 size_t iStop = (size_t) (pWF->
f_max_prime / deltaF);
1577 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.", iStart, iStop, npts);
1591 printf(
"\n\n **** Call to IMRPhenomXHM_MultiMode2 complete. **** \n\n");
1601 lastfreq = pWF->
fMax;
1602 XLAL_PRINT_WARNING(
"The input f_max = %.2f Hz is larger than the internal cutoff of Mf=0.3 (%.2f Hz). Array will be filled with zeroes between these two frequencies.\n", pWF->
fMax, pWF->
f_max_prime);
1608 size_t n_full =
NextPow2(lastfreq / deltaF) + 1;
1609 size_t n = (*hptilde)->data->length;
1613 XLAL_CHECK (*hptilde,
XLAL_ENOMEM,
"Failed to resize h_+ COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).", n, pWF->
fCut, n_full, pWF->
fMax );
1617 XLAL_CHECK (*hctilde,
XLAL_ENOMEM,
"Failed to resize h_x COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).", n, pWF->
fCut, n_full, pWF->
fMax );
1658 XLAL_CHECK(distance > 0,
XLAL_EFUNC,
"Error: Distance must be positive and greater than 0. \n");
1672 mass_ratio = m1_SI / m2_SI;
1676 mass_ratio = m2_SI / m1_SI;
1678 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
1679 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
1680 if(fabs(chi1z) > 0.99 || fabs(chi2z) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
1683 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1695 LALDict *lalParams_aux;
1697 if (lalParams == NULL)
1706 XLAL_PRINT_WARNING(
"Warning: Function is aimed for non-uniform frequency grid, switching off Multibanding.");
1717 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1z, chi2z, 0.0, fRef, phiRef, f_min_In, f_max_In, distance, inclination, lalParams_aux,
DEBUG);
1760 LALDict *lalParams_aux;
1762 if (lalParams == NULL)
1774 if (ModeArray == NULL)
1788 INT4 posMode, negMode;
1795 for (
UINT4 emm = 1; emm <= ell; emm++)
1802 if ( posMode != 1 && negMode != 1)
1807 printf(
"\n Mode %i%i\n",ell, emm);
1815 XLALSimIMRPhenomXHMGenerateFDOneMode(&htildelm, m1_SI, m2_SI, chi1z, chi2z, ell, -emm, distance,
f_min,
f_max, deltaF, phiRef, fRef_In, lalParams_aux);
1818 if(ell==3 && emm==2){
1819 XLALSimIMRPhenomXHMMultiBandOneModeMixing(&htildelm, htilde22, m1_SI, m2_SI, chi1z, chi2z, ell, -emm, distance,
f_min,
f_max, deltaF, phiRef, fRef_In, lalParams_aux);
1822 XLALSimIMRPhenomXHMMultiBandOneMode(&htildelm, m1_SI, m2_SI, chi1z, chi2z, ell, -emm, distance,
f_min,
f_max, deltaF, phiRef, fRef_In, lalParams_aux);
1825 if(ell==2 && emm==2 && htildelm){
1838 sprintf(fileSpec,
"simulation%i%i_MM.dat", ell,emm);
1839 printf(
"\nOutput file: %s\r\n",fileSpec);
1840 file = fopen(fileSpec,
"w");
1841 REAL8 m2_SI_a, m1_SI_a, chi1z_a, chi2z_a;
1854 fprintf(
file,
"# q = %.16f chi1 = %.16f chi2 = %.16f lm = %i%i Mtot = %.16f distance = %.16f\n", m1_SI_a/m2_SI_a, chi1z_a, chi2z_a, ell, emm, (m1_SI+m2_SI)/
LAL_MSUN_SI, distance/
LAL_PC_SI/pow(10.,6));
1855 fprintf(
file,
"# Frequency (Hz) Real Imaginary\n");
1857 for(
UINT4 idx = 0; idx < ((htildelm)->
data->length); idx++)
1859 data = ((htildelm)->
data->data)[idx];
1882 XLAL_CHECK(
XLALGPSAdd(&ligotimegps_zero, -1. / deltaF),
XLAL_EFUNC,
"Failed to shift the coalescence time to t=0. Tried to apply a shift of -1/df with df = %g.", deltaF);
1883 size_t n = (htildelm)->
data->length;
1886 memset((*hptilde)->data->data, 0, n *
sizeof(
COMPLEX16));
1890 memset((*hctilde)->data->data, 0, n *
sizeof(
COMPLEX16));
1895 if(ell == 2 && emm == 2 && add22 == 0){
1900 if(posMode==1 && negMode!=1){
1903 else if(posMode!=1 && negMode==1){
1921 printf(
"\n******Leaving IMRPhenomXHM_MultiMode*****\n");
1940 printf(
"\n\n**** IMRPhenomXHM_MultiMode2 **** \n\n");
1959 printf(
"\n\nfstart, fend, lenfreqs lenhtildelm = %.16f %.16f %i %i\n\n", freqs->
data[0], freqs->
data[len-1], len, htildelm->
data->
length);
1976 for (
UINT4 idx = 0; idx < len; idx++){
1977 Mf[idx] = Msec * freqs->
data[idx];
1982 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
1989 LALDict *lalParams_aux;
1991 if (lalParams == NULL)
2003 if (ModeArray == NULL)
2010 size_t n = (htildelm)->
data->length;
2016 memset((*hptilde)->data->data, 0, n *
sizeof(
COMPLEX16));
2021 memset((*hctilde)->data->data, 0, n *
sizeof(
COMPLEX16));
2025 printf(
"\nlength htildelm = %zu\n", n);
2033 if (pos22 == 1 || neg22 == 1){
2035 printf(
"\n\nCalling IMRPhenomXASFrequencySequence...\n\n");
2041 for(
UINT4 idx = 0; idx < offset; idx++)
2045 for(
UINT4 idx = 0; idx < ((htilde22tmp)->
data->length); idx++)
2047 ((htilde22)->
data->data)[idx+offset] = ((htilde22tmp)->
data->data)[idx];
2049 for(
UINT4 idx = ((htilde22tmp)->data->length); idx < ((htildelm)->
data->length) - offset; idx++)
2051 (htilde22->
data->
data)[idx+offset] = 0.;
2053 if(pos22==1 && neg22!=1){
2056 else if(pos22!=1 && neg22==1){
2065 printf(
"phifRef22=%f\n",pWF->
phifRef);
2067 char fileSpec22[40];
2069 sprintf(fileSpec22,
"simulation%i_MM2.dat", 22);
2070 printf(
"\nOutput file: %s\r\n",fileSpec22);
2071 file22 = fopen(fileSpec22,
"w");
2073 fprintf(file22,
"# q = %.16f m1 = %.16f m2 = %.16f chi1 = %.16f chi2 = %.16f lm = %i Mtot = %.16f distance = %.16f\n", pWF->
q, pWF->
m1, pWF->
m2, pWF->
chi1L, pWF->
chi2L, 22, pWF->
Mtot, pWF->
distance/
LAL_PC_SI/pow(10.,6));
2074 fprintf(file22,
"# Frequency (Hz) Real Imaginary\n");
2077 for(
UINT4 idx = 0; idx < ((htilde22)->
data->length); idx++)
2079 data22 = ((htilde22)->
data->data)[idx];
2080 fprintf(file22,
"%.16f %.16e %.16e\n", idx*pWF->
deltaF, creal(data22), cimag(data22));
2083 printf(
"\n lenhtilde22 = %i\n", htilde22->
data->
length);
2091 printf(
"\n\nlenfreqs lenhtildelm = %i %i\n\n", len, htildelm->
data->
length);
2102 INT4 minus1l, posMode, negMode;
2113 Amp0 = minus1l * pWF->
amp0;
2115 for (
INT4 emm = 1; emm < (
INT4)ell + 1; emm++){
2121 if ((posMode != 1 && negMode != 1) || (ell == 2 && abs(emm) == 2))
2147 printf(
"\n\nInitializing amplitude struct of %i...\n\n",pWFHM->
modeTag);
2168 printf(
"\n\n **** Amplitude and Phase struct initialized. **** \n\n");
2175 if(pos22 == 1 || neg22 == 1){
2176 for (
UINT4 idx = 0; idx < len; idx++)
2182 ((htildelm)->
data->data)[idx+offset] = Amp0 * amp * cexp(I * phi);
2187 for (
UINT4 idx = 0; idx < len; idx++)
2192 ((htildelm)->
data->data)[idx+offset] = Amp0 * amp * cexp(I * phi);
2197 for (
UINT4 idx = 0; idx < len; idx++)
2202 ((htildelm)->
data->data)[idx+offset] = Amp0 * amp * cexp(I * phi);
2207 pPhase22->
C1Int = 0;
2208 pPhase22->
C2Int = 0;
2209 pPhase22->
C1MRD = 0;
2210 pPhase22->
C2MRD = 0;
2221 for (
UINT4 idx = 0; idx < len; idx++)
2223 ((htildelm)->
data->data)[idx+offset] = 0.;
2233 sprintf(fileSpec,
"simulation%i_MM2.dat", pWFHM->
modeTag);
2234 printf(
"\nOutput file: %s\r\n",fileSpec);
2235 file = fopen(fileSpec,
"w");
2237 fprintf(
file,
"# q = %.16f m1 = %.16f m2 = %.16f chi1 = %.16f chi2 = %.16f lm = %i Mtot = %.16f distance = %.16f\n", pWF->
q, pWF->
m1, pWF->
m2, pWF->
chi1L, pWF->
chi2L, pWFHM->
modeTag, pWF->
Mtot, pWF->
distance/
LAL_PC_SI/pow(10.,6));
2238 fprintf(
file,
"# Frequency (Hz) Amplitude Phase\n");
2243 data0 = ((htildelm)->
data->data)[idx];
2244 fprintf(
file,
"%.16f %.16e %.16e\n", idx*pWF->
deltaF, creal(data0), cimag(data0));
2250 if(posMode==1 && negMode!=1){
2253 else if(posMode!=1 && negMode==1){
2312 COMPLEX16 factorp = 0.5 * (Ym + minus1l * Ystar);
2313 COMPLEX16 factorc = I * 0.5 * ( Ym - minus1l * Ystar);
2316 printf(
"\nfactorp = %.16e", cabs(factorp));
2317 printf(
"\nfactorc = %.16e",cabs(factorc));
2318 printf(
"\nhtildelm length = %i\n", htildelm->
data->
length);
2322 for (j = 0; j < htildelm->
data->
length; ++j) {
2324 hptilde->
data->
data[j] += (factorp * hlm);
2325 hctilde->
data->
data[j] += (factorc * hlm);
2333 factorp = 0.5*minus1l*Ylm;
2334 factorc = -I*0.5*minus1l*Ylm;
2339 factorc = I*0.5*Ylm;
2345 for ( j = 0; j < htildelm->
data->
length; ++j ) {
2347 datap[j] += factorp*hlm;
2348 datac[j] += factorc*hlm;
2419 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
2422 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
2434 mass_ratio = m1_SI / m2_SI;
2438 mass_ratio = m2_SI / m1_SI;
2440 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
2441 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
2442 if(fabs(S1z) > 0.99 || fabs(S2z) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
2445 LALDict *lalParams_aux;
2447 if (lalParams == NULL)
2461 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
2468 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
2478 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, S1z, S2z, 0., fRef, phiRef, freqs->
data[0], freqs->
data[freqs->
length-1], distance, 0.0, lalParams_aux,
DEBUG);
2482 if((S1x*S1x + S1y*S1y + S2x*S2x + S2y*S2y) > 0){
2516 REAL8 Amp0 = 0, amp = 0, Mf;
2519 if(ell ==2 && abs(emm) == 2){
2558 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
2562 if(ell == 2 && abs(emm) == 2){
2573 ((*amplitude)->data)[idx] = Amp0 * amp;
2616 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
2619 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
2631 mass_ratio = m1_SI / m2_SI;
2635 mass_ratio = m2_SI / m1_SI;
2637 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
2638 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
2639 if(fabs(S1z) > 0.99 || fabs(S2z) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
2643 LALDict *lalParams_aux;
2645 if (lalParams == NULL)
2659 XLALPrintError(
"XLAL Error - %i%i mode is not included\n", ell, emm);
2666 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
2676 status =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, S1z, S2z, 0, fRef, phiRef, freqs->
data[0], freqs->
data[freqs->
length-1], distance, 0.0, lalParams_aux,
DEBUG);
2680 if((S1x*S1x + S1y*S1y + S2x*S2x + S2y*S2y) > 0){
2714 REAL8 lina = 0, linb = 0, inveta=1./pWF->
eta;
2715 if (ell == 2 && abs(emm) == 2){
2769 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
2773 if (ell ==2 && abs(emm) == 2){
2775 phi += linb*Mf + lina + pWF->
phifRef;
2785 ((*phase)->data)[idx] = phi + addpi;
2794 ((*phase)->data)[idx] = addpi - ((*phase)->data)[idx];
2885 *phase = fmod(*phase,2*
LAL_PI);
void XLALDestroyDict(LALDict *dict)
LALDict * XLALDictDuplicate(LALDict *old)
LALDict * XLALCreateDict(void)
static size_t NextPow2(const size_t n)
IMRPhenomX_UsefulPowers powers_of_lalpi
void IMRPhenomXHM_PNR_EnforceXHMPhaseAlignment(double *lina, double *linb, INT4 ell, INT4 emm, IMRPhenomXWaveformStruct *pWF, LALDict *lalParams)
int IMRPhenomXSetWaveformVariables(IMRPhenomXWaveformStruct *wf, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi1L_In, const REAL8 chi2L_In, const REAL8 deltaF, const REAL8 fRef, const REAL8 phi0, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const REAL8 inclination, LALDict *LALParams, UNUSED const UINT4 debug)
double IMRPhenomX_TimeShift_22(IMRPhenomXPhaseCoefficients *pPhase, IMRPhenomXWaveformStruct *pWF)
void IMRPhenomX_Phase_22_ConnectionCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
int IMRPhenomXGetAmplitudeCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp)
int IMRPhenomX_Initialize_Powers(IMRPhenomX_UsefulPowers *p, REAL8 number)
double IMRPhenomX_Phase_22(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXPhaseCoefficients *pPhase, IMRPhenomXWaveformStruct *pWF)
int IMRPhenomXGetPhaseCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
INT4 check_input_mode_array(LALDict *lalParams)
double IMRPhenomX_Amplitude_22(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXAmpCoefficients *pAmp, IMRPhenomXWaveformStruct *pWF)
int IMRPhenomXGetAndSetPrecessionVariables(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams, INT4 debug_flag)
Function to populate the IMRPhenomXPrecessionStruct:
static LALDict * IMRPhenomXHM_setup_mode_array(LALDict *lalParams)
int SetupWFArrays(REAL8Sequence **freqs, COMPLEX16FrequencySeries **htildelm, const REAL8Sequence *freqs_In, IMRPhenomXWaveformStruct *pWF, LIGOTimeGPS ligotimegps_zero)
int IMRPhenomXHMGenerateFDOneMode(COMPLEX16FrequencySeries **htildelm, const REAL8Sequence *freqs_In, IMRPhenomXWaveformStruct *pWF, UINT4 ell, UINT4 emm, LALDict *lalParams)
static int IMRPhenomXHM_MultiMode2(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, const REAL8Sequence *freqs_In, IMRPhenomXWaveformStruct *pWF, LALDict *lalParams)
static int IMRPhenomXHMFDAddMode(COMPLEX16FrequencySeries *hptilde, COMPLEX16FrequencySeries *hctilde, COMPLEX16FrequencySeries *hlmtilde, REAL8 theta, REAL8 phi, INT4 l, INT4 m, INT4 sym)
static int IMRPhenomXHM_MultiMode(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1z, REAL8 chi2z, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 distance, REAL8 inclination, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
IMRPhenomX_UsefulPowers powers_of_lalpiHM
REAL8 IMRPhenomXHM_Amplitude_ModeMixing(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp22, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXWaveformStruct *pWF22)
void IMRPhenomXHM_SetHMWaveformVariables(int ell, int emm, IMRPhenomXHMWaveformStruct *wf, IMRPhenomXWaveformStruct *wf22, QNMFits *qnms, LALDict *LALParams)
int ParametersToFile(IMRPhenomXWaveformStruct *pWF, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXHMAmpCoefficients *pAmp, UNUSED IMRPhenomXHMPhaseCoefficients *pPhase)
double IMRPhenomXHM_dPhase_ModeMixing(double f, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp22, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXWaveformStruct *pWF22)
REAL8 IMRPhenomXHM_Phase_ModeMixingRecycle(IMRPhenomX_UsefulPowers *powers_of_Mf, COMPLEX16 wf22, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF)
void IMRPhenomXHM_GetAmplitudeCoefficients(IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXAmpCoefficients *pAmp22, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXWaveformStruct *pWF22)
void IMRPhenomXHM_GetPhaseCoefficients(IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXAmpCoefficients *pAmp22, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXWaveformStruct *pWF22, UNUSED LALDict *lalParams)
REAL8 IMRPhenomXHM_Amplitude_ModeMixingRecycle(IMRPhenomX_UsefulPowers *powers_of_Mf, COMPLEX16 wf22, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF)
REAL8 IMRPhenomXHM_Amplitude_noModeMixing(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMWaveformStruct *pWF)
void GetSpheroidalCoefficients(IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXWaveformStruct *pWF22)
void IMRPhenomXHM_FillAmpFitsArray(IMRPhenomXHMAmpCoefficients *pAmp)
void IMRPhenomXHM_FillPhaseFitsArray(IMRPhenomXHMPhaseCoefficients *pPhase)
REAL8 IMRPhenomXHM_Phase_noModeMixing(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF, UNUSED IMRPhenomXWaveformStruct *pWF22)
double IMRPhenomXHM_dPhase_noModeMixing(double f, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF, UNUSED IMRPhenomXWaveformStruct *pWF22)
REAL8 IMRPhenomXHM_Phase_ModeMixing(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXHMAmpCoefficients *pAmp, IMRPhenomXHMPhaseCoefficients *pPhase, IMRPhenomXHMWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp22, IMRPhenomXPhaseCoefficients *pPhase22, IMRPhenomXWaveformStruct *pWF22)
void IMRPhenomXHM_Initialize_QNMs(QNMFits *qnms)
static double IMRPhenomXHM_RD_Phase_AnsatzInt(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXHMPhaseCoefficients *pPhase)
static double IMRPhenomXHM_RD_Amp_Ansatz(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXHMWaveformStruct *pWFHM, IMRPhenomXHMAmpCoefficients *pAmp)
void XLALDestroyValue(LALValue *value)
COMPLEX16FrequencySeries * XLALResizeCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series, int first, size_t length)
COMPLEX16FrequencySeries * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
void XLALDestroyCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series)
void * XLALMalloc(size_t n)
int XLALSimIMRPhenomXHMMultiBandOneMode(COMPLEX16FrequencySeries **htildelm, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, UINT4 ell, INT4 emm, REAL8 distance, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Return htildelm, the waveform of one mode without mode-mixing.
INT4 IMRPhenomXHM_Phase_for_Initialization(double *phase, double *dphase, double Mf, INT4 ell, INT4 emm, IMRPhenomXWaveformStruct *pWF, LALDict *lalParams)
int XLALSimIMRPhenomXASGenerateFD(COMPLEX16FrequencySeries **htilde22, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Driver routine to calculate an IMRPhenomX aligned-spin, inspiral-merger-ringdown phenomenological wav...
int XLALSimIMRPhenomXHMFrequencySequence(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1z, REAL8 chi2z, REAL8 distance, REAL8 inclination, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns hptilde and hctilde as a complex frequency series with entries exactly at the frequencies spe...
int XLALSimIMRPhenomXHMModes(SphHarmFrequencySeries **hlms, REAL8 m1_SI, REAL8 m2_SI, REAL8 S1z, REAL8 S2z, REAL8 deltaF, REAL8 f_min, REAL8 f_max, REAL8 f_ref, REAL8 phiRef, REAL8 distance, LALDict *LALparams)
Function to obtain a SphHarmFrequencySeries with the individual modes h_lm.
int XLALSimIMRPhenomXHMGenerateFDOneMode(COMPLEX16FrequencySeries **htildelm, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, UINT4 ell, INT4 emm, REAL8 distance, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns the Fourier domain strain of just one mode: h_lm.
int XLALSimIMRPhenomXHMFrequencySequenceOneMode(COMPLEX16FrequencySeries **htildelm, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, UINT4 ell, INT4 emm, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Get the model evaluated in a prebuilt frequency array.
int XLALSimIMRPhenomXASFrequencySequence(COMPLEX16FrequencySeries **htilde22, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Compute waveform in LAL format at specified frequencies for the IMRPhenomX model.
int XLALSimIMRPhenomXHMPhase(REAL8Sequence **phase, const REAL8Sequence *freqs, UINT4 ell, INT4 emm, REAL8 m1_SI, REAL8 m2_SI, REAL8 S1x, REAL8 S1y, REAL8 S1z, REAL8 S2x, REAL8 S2y, REAL8 S2z, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns phase of one single mode in a custom frequency array.
int XLALSimIMRPhenomXHM(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 distance, REAL8 inclination, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns the hptilde and hctilde of the multimode waveform for positive frequencies.
int XLALSimIMRPhenomXHM_SpheroidalPhase(REAL8Sequence **phase, const REAL8Sequence *freqs, UINT4 ell, INT4 emm, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
int XLALSimIMRPhenomXHMMultiBandOneModeMixing(COMPLEX16FrequencySeries **htildelm, COMPLEX16FrequencySeries *htilde22, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, UINT4 ell, INT4 emm, REAL8 distance, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns htildelm the waveform of one mode that present mode-mixing.
int XLALSimIMRPhenomXHMAmplitude(REAL8Sequence **amplitude, const REAL8Sequence *freqs, UINT4 ell, INT4 emm, REAL8 m1_SI, REAL8 m2_SI, REAL8 S1x, REAL8 S1y, REAL8 S1z, REAL8 S2x, REAL8 S2y, REAL8 S2z, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns amplitude of one single mode in a custom frequency array.
int XLALSimIMRPhenomXHM_SpheroidalAmplitude(REAL8Sequence **amplitude, const REAL8Sequence *freqs, UINT4 ell, INT4 emm, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
int XLALSimIMRPhenomXHM2(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 distance, REAL8 inclination, REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Returns the hptilde and hctilde of the multimode waveform for positive frequencies.
SphHarmFrequencySeries * XLALSphHarmFrequencySeriesAddMode(SphHarmFrequencySeries *appended, const COMPLEX16FrequencySeries *inmode, UINT4 l, INT4 m)
Prepend a node to a linked list of SphHarmFrequencySeries, or create a new head.
void XLALSphHarmFrequencySeriesSetFData(SphHarmFrequencySeries *ts, REAL8Sequence *fdata)
Set the tdata member for all nodes in the list.
void XLALDestroyREAL8Sequence(REAL8Sequence *sequence)
REAL8Sequence * XLALCreateREAL8Sequence(size_t length)
COMPLEX16 XLALSpinWeightedSphericalHarmonic(REAL8 theta, REAL8 phi, int s, int l, int m)
const LALUnit lalStrainUnit
const LALUnit lalSecondUnit
LALUnit * XLALUnitMultiply(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
#define XLAL_PRINT_INFO(...)
#define XLAL_CHECK(assertion,...)
#define XLAL_PRINT_WARNING(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_PRINT_ERROR(...)
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)