/* In: tau (lattice parameter) Out: g2 -> g[0] g3 -> g[1] */ void compute_invariants(gsl_complex tau, gsl_complex *g) { gsl_complex q, q14; gsl_complex t2,t3,t24,t34; gsl_complex g3_term1, g3_term2; gsl_complex g2, g3; q = gsl_complex_exp(gsl_complex_mul_imag(tau,M_PI)); q14 = gsl_complex_exp(gsl_complex_mul_imag(tau,M_PI_4)); t2=theta20(q,q14); t3=theta30(q); t24 = pow4(t2); t34 = pow4(t3); g2 = gsl_complex_mul_real(gsl_complex_sub(gsl_complex_add(gsl_complex_mul(t24,t24),gsl_complex_mul(t34,t34)),gsl_complex_mul(t24,t34)),_CONST_43PI4); g3_term1 = gsl_complex_add(gsl_complex_mul(t24,gsl_complex_mul(t24,t24)),gsl_complex_mul(t34,gsl_complex_mul(t34,t34))); g3_term2 = gsl_complex_mul(gsl_complex_add(t24,t34),gsl_complex_mul(t24,t34)); g3 = gsl_complex_sub( gsl_complex_mul_real(g3_term1, _CONST_827PI6), gsl_complex_mul_real(g3_term2, _CONST_49PI6) ); g[0] = g2; g[1] = g3; }
gsl_complex gsl_complex_arcsinh(gsl_complex a) { /* z = arcsinh(a) */ gsl_complex z = gsl_complex_mul_imag(a, 1.0); z = gsl_complex_arcsin(z); z = gsl_complex_mul_imag(z, -1.0); return z; }
void gsl_complex_arcsinh (complex_t const *a, complex_t *res) { /* z = arcsinh(a) */ gsl_complex_mul_imag (a, 1.0, res); gsl_complex_arcsin (res, res); gsl_complex_mul_imag (res, -1.0, res); }
gsl_complex gsl_complex_arctanh(gsl_complex a) { /* z = arctanh(a) */ if (GSL_IMAG(a) == 0.0) { return gsl_complex_arctanh_real(GSL_REAL(a)); } else { gsl_complex z = gsl_complex_mul_imag(a, 1.0); z = gsl_complex_arctan(z); z = gsl_complex_mul_imag(z, -1.0); return z; } }
void gsl_complex_arctanh (complex_t const *a, complex_t *res) { /* z = arctanh(a) */ if (GSL_IMAG (a) == 0.0) { gsl_complex_arctanh_real (GSL_REAL (a), res); } else { gsl_complex_mul_imag (a, 1.0, res); gsl_complex_arctan (res, res); gsl_complex_mul_imag (res, -1.0, res); } }
complex_spinor complex_spinor::op(OPERATOR_SPIN spinOperator) const{ int i; double result; //Spin Parameters int new_numSites = this->_numSites; complex_spinor complex_spinor_resu(new_numSites); if(spinOperator == S_X ){ for(i=0 ; i<new_numSites ; i++){ gsl_complex oldUP = this->complex_spinor_get(i, UP); gsl_complex oldDOWN = this->complex_spinor_get(i, DOWN); complex_spinor_resu.complex_spinor_set(i, UP, gsl_complex_mul_real(oldDOWN, 0.5)); complex_spinor_resu.complex_spinor_set(i, DOWN, gsl_complex_mul_real(oldUP, 0.5)); } } else if(spinOperator == S_Y){ for(i=0 ; i<new_numSites ; i++){ gsl_complex oldUP = this->complex_spinor_get(i, UP); gsl_complex oldDOWN = this->complex_spinor_get(i, DOWN); complex_spinor_resu.complex_spinor_set(i, UP, gsl_complex_mul_imag(oldDOWN, 0.5)); complex_spinor_resu.complex_spinor_set(i, DOWN, gsl_complex_mul_imag(oldUP, -0.5)); } } else{ //S_Z for(i=0 ; i<new_numSites ; i++){ gsl_complex oldUP = this->complex_spinor_get(i, UP); gsl_complex oldDOWN = this->complex_spinor_get(i, DOWN); complex_spinor_resu.complex_spinor_set(i, UP, gsl_complex_mul_real(oldUP, 0.5)); complex_spinor_resu.complex_spinor_set(i, DOWN, gsl_complex_mul_real(oldDOWN, -0.5)); } } return complex_spinor_resu; }
gsl_complex gsl_complex_arccosh (gsl_complex a) { /* z = arccosh(a) */ gsl_complex z = gsl_complex_arccos (a); z = gsl_complex_mul_imag (z, GSL_IMAG(z) > 0 ? -1.0 : 1.0); return z; }
gsl_complex f_integrand(gsl_complex p, const Params *params) { double r = params->r; return gsl_complex_mul( f_envelope(p, params), gsl_complex_exp(gsl_complex_mul_imag(p, r))); }
void LALInferenceTemplateROQ(LALInferenceModel *model) { double m1,m2,mc,eta,q,iota=0; /* Prefer m1 and m2 if available (i.e. for injection template) */ if(LALInferenceCheckVariable(model->params,"mass1")&&LALInferenceCheckVariable(model->params,"mass2")) { m1=*(REAL8 *)LALInferenceGetVariable(model->params,"mass1"); m2=*(REAL8 *)LALInferenceGetVariable(model->params,"mass2"); eta=m1*m2/((m1+m2)*(m1+m2)); mc=pow(eta , 0.6)*(m1+m2); } else { if (LALInferenceCheckVariable(model->params,"q")) { q = *(REAL8 *)LALInferenceGetVariable(model->params,"q"); q2eta(q, &eta); } else eta = *(REAL8*) LALInferenceGetVariable(model->params, "eta"); mc = *(REAL8*) LALInferenceGetVariable(model->params, "chirpmass"); mc2masses(mc, eta, &m1, &m2); } iota = acos(LALInferenceGetREAL8Variable(model->params, "costheta_jn")); /* zenith angle between J and N in radians */ double cosiota = cos(iota); double plusCoef = 0.5 * (1.0 + cosiota*cosiota); double crossCoef = cosiota; /* external: SI; internal: solar masses */ const REAL8 m = m1 + m2; const REAL8 m_sec = m * LAL_MTSUN_SI; /* total mass in seconds */ const REAL8 etap2 = eta * eta; const REAL8 etap3 = etap2 * eta; const REAL8 piM = LAL_PI * m_sec; const REAL8 mSevenBySix = -7./6.; const REAL8 phic = *(REAL8 *)LALInferenceGetVariable(model->params,"phase"); const REAL8 r = 1e6*LAL_PC_SI; REAL8 logv0 = log(1.); //the standard tf2 definition is log(v0), but I've changed it to reflect Scott's convention REAL8 shft, amp0;//, f_max; REAL8 psiNewt, psi2, psi3, psi4, psi5, psi6, psi6L, psi7, psi3S, psi4S, psi5S; REAL8 eta_fac = -113. + 76. * eta; REAL8 chi=0; //NOTE: chi isn't used here yet, so we just set it to zero gsl_complex h_i; /* extrinsic parameters */ amp0 = -pow(m_sec, 5./6.) * sqrt(5.*eta / 24.) / (Pi_p2by3 * r / LAL_C_SI); shft = 0;//LAL_TWOPI * (tStart.gpsSeconds + 1e-9 * tStart.gpsNanoSeconds); /* spin terms in the amplitude and phase (in terms of the reduced * spin parameter */ psi3S = 113.*chi/3.; psi4S = 63845.*(-81. + 4.*eta)*chi*chi/(8. * eta_fac * eta_fac); psi5S = -565.*(-146597. + 135856.*eta + 17136.*etap2)*chi/(2268.*eta_fac); /* coefficients of the phase at PN orders from 0 to 3.5PN */ psiNewt = 3./(128.*eta); psi2 = 3715./756. + 55.*eta/9.; psi3 = psi3S - 16.*LAL_PI; psi4 = 15293365./508032. + 27145.*eta/504. + 3085.*eta*eta/72. + psi4S; psi5 = (38645.*LAL_PI/756. - 65.*LAL_PI*eta/9. + psi5S); psi6 = 11583231236531./4694215680. - (640.*Pi_p2)/3. - (6848.*LAL_GAMMA)/21. + (-5162.983708047263 + 2255.*Pi_p2/12.)*eta + (76055.*etap2)/1728. - (127825.*etap3)/1296.; psi6L = -6848./21.; psi7 = (77096675.*LAL_PI)/254016. + (378515.*LAL_PI*eta)/1512. - (74045.*LAL_PI*eta*eta)/756.; for (unsigned int i = 0; i < model->roq->frequencyNodes->size; i++) { /* fourier frequency corresponding to this bin */ const REAL8 f = gsl_vector_get(model->roq->frequencyNodes, i); const REAL8 v3 = piM*f; /* PN expansion parameter */ REAL8 v, v2, v4, v5, v6, v7, logv, Psi, amp; v = cbrt(v3); v2 = v*v; v4 = v3*v; v5 = v4*v; v6 = v3*v3; v7 = v6*v; logv = log(v); /* compute the phase and amplitude */ Psi = psiNewt / v5 * (1. + psi2 * v2 + psi3 * v3 + psi4 * v4 + psi5 * v5 * (1. + 3. * (logv - logv0)) + (psi6 + psi6L * (log4 + logv)) * v6 + psi7 * v7); amp = amp0 * pow(f, mSevenBySix); GSL_SET_COMPLEX(&h_i, amp * cos(Psi + shft * f - 2.*phic - LAL_PI_4), - amp * sin(Psi + shft * f - 2.*phic - LAL_PI_4)); gsl_vector_complex_set(model->roq->hplus, i, gsl_complex_mul_real(h_i,plusCoef)); gsl_vector_complex_set(model->roq->hcross, i, gsl_complex_mul_real(gsl_complex_mul_imag(h_i,-1.0),crossCoef)); } return; }
gsl_complex integrate_line_segment(Params *params, gsl_complex p0, gsl_complex p1) { gsl_complex k = gsl_complex_sub(p1, p0); const double r = params->r; const double a = 0.0; // parameter interval start const double b = 1.0; // parameter interval end const double L = b - a; // length of parameter interval const size_t table_size = 1000; // calculate frequency of oscillatory part double omega = GSL_REAL(k) * r; gsl_integration_workspace *ws = gsl_integration_workspace_alloc(table_size); // prepare sine/cosine tables for integration gsl_integration_qawo_table *table_cos = gsl_integration_qawo_table_alloc(omega, L, GSL_INTEG_COSINE, table_size); gsl_integration_qawo_table *table_sin = gsl_integration_qawo_table_alloc(omega, L, GSL_INTEG_SINE, table_size); LineSegmentParams lsp; lsp.p0 = p0; lsp.k = k; lsp.damping = params->r * GSL_IMAG(k); lsp.params = params; //fprintf(stderr, "p0 = %g %g, p1 = %g %g, k = %g %g, r = %g, omega = %g, damping = %g\n", // GSL_REAL(p0), GSL_IMAG(p0), GSL_REAL(p1), GSL_IMAG(p1), // GSL_REAL(k), GSL_IMAG(k), r, omega, lsp.damping); gsl_function F; F.function = &line_segment_integrand_wrapper; F.params = &lsp; double result_real_cos, abserr_real_cos; double result_real_sin, abserr_real_sin; double result_imag_cos, abserr_imag_cos; double result_imag_sin, abserr_imag_sin; double epsabs = 1e-9; double epsrel = 1e-9; lsp.part = REAL; gsl_integration_qawo(&F, a, epsabs, epsrel, table_size, ws, table_cos, &result_real_cos, &abserr_real_cos); gsl_integration_qawo(&F, a, epsabs, epsrel, table_size, ws, table_sin, &result_real_sin, &abserr_real_sin); lsp.part = IMAG; gsl_integration_qawo(&F, a, epsabs, epsrel, table_size, ws, table_cos, &result_imag_cos, &abserr_imag_cos); gsl_integration_qawo(&F, a, epsabs, epsrel, table_size, ws, table_sin, &result_imag_sin, &abserr_imag_sin); //fprintf(stderr, " cos: %g (+- %g) %g (+- %g) sin: %g (+- %g) %g (+- %g)\n", // result_real_cos, abserr_real_cos, result_imag_cos, abserr_imag_cos, // result_real_sin, abserr_real_sin, result_imag_sin, abserr_imag_sin); gsl_complex cos_part = gsl_complex_rect(result_real_cos, result_imag_cos); gsl_complex sin_part = gsl_complex_rect(-result_imag_sin, result_real_sin); gsl_complex sum = gsl_complex_add(cos_part, sin_part); gsl_complex result = gsl_complex_mul( k, gsl_complex_mul(sum, gsl_complex_exp(gsl_complex_mul_imag(p0, params->r)))); gsl_integration_qawo_table_free(table_sin); gsl_integration_qawo_table_free(table_cos); gsl_integration_workspace_free(ws); return result; }
void gsl_complex_arccosh (complex_t const *a, complex_t *res) { /* z = arccosh(a) */ gsl_complex_arccos (a, res); gsl_complex_mul_imag (res, GSL_IMAG (res) > 0 ? -1.0 : 1.0, res); }