Translation coefficients now correctly account for csphase
Former-commit-id: 13bf2de0847b57fe8723968e00000a4ea6bfd315
This commit is contained in:
parent
75e0d135d3
commit
e9b97ba808
|
@ -152,9 +152,13 @@ static inline double qpms_trans_normlogfac(qpms_normalisation_t norm,
|
||||||
|
|
||||||
static inline double qpms_trans_normfac(qpms_normalisation_t norm,
|
static inline double qpms_trans_normfac(qpms_normalisation_t norm,
|
||||||
int m, int n, int mu, int nu) {
|
int m, int n, int mu, int nu) {
|
||||||
int csphase = qpms_normalisation_t_csphase(norm); // FIXME USEME TODO
|
int csphase = qpms_normalisation_t_csphase(norm);
|
||||||
norm = qpms_normalisation_t_normonly(norm);
|
norm = qpms_normalisation_t_normonly(norm);
|
||||||
double normfac = 1.;
|
/* Account for csphase here. Alternatively, this could be done by
|
||||||
|
* using appropriate csphase in the legendre polynomials when calculating
|
||||||
|
* the translation operator.
|
||||||
|
*/
|
||||||
|
double normfac = (1 == csphase) ? min1pow(m-mu) : 1.;
|
||||||
switch(norm) {
|
switch(norm) {
|
||||||
case QPMS_NORMALISATION_KRISTENSSON:
|
case QPMS_NORMALISATION_KRISTENSSON:
|
||||||
normfac *= sqrt((n*(n+1.))/(nu*(nu+1.)));
|
normfac *= sqrt((n*(n+1.))/(nu*(nu+1.)));
|
||||||
|
@ -191,7 +195,6 @@ complex double qpms_trans_single_A(qpms_normalisation_t norm,
|
||||||
gaunt_xu(-m,n,mu,nu,qmax,a1q,&err);
|
gaunt_xu(-m,n,mu,nu,qmax,a1q,&err);
|
||||||
double a1q0 = a1q[0];
|
double a1q0 = a1q[0];
|
||||||
if (err) abort();
|
if (err) abort();
|
||||||
int csphase = qpms_normalisation_t_csphase(norm); //FIXME EITHER TO NORMFAC OR USE HERE
|
|
||||||
|
|
||||||
double leg[gsl_sf_legendre_array_n(n+nu)];
|
double leg[gsl_sf_legendre_array_n(n+nu)];
|
||||||
if (gsl_sf_legendre_array_e(GSL_SF_LEGENDRE_NONE,n+nu,costheta,csphase,leg)) abort();
|
if (gsl_sf_legendre_array_e(GSL_SF_LEGENDRE_NONE,n+nu,costheta,csphase,leg)) abort();
|
||||||
|
@ -221,7 +224,19 @@ complex double qpms_trans_single_A(qpms_normalisation_t norm,
|
||||||
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
||||||
|
|
||||||
// ipow(n-nu) is the difference from the Taylor formula!
|
// ipow(n-nu) is the difference from the Taylor formula!
|
||||||
presum *= /*ipow(n-nu) * */(normfac * exp(normlogfac));
|
presum *= /*ipow(n-nu) * */
|
||||||
|
(normfac * exp(normlogfac))
|
||||||
|
#ifdef AN1
|
||||||
|
* ipow(n-nu)
|
||||||
|
#elif defined AN2
|
||||||
|
* min1pow(-n+nu)
|
||||||
|
#elif defined AN3
|
||||||
|
* ipow (nu - n)
|
||||||
|
#endif
|
||||||
|
#ifdef AM2
|
||||||
|
* min1pow(-m+mu)
|
||||||
|
#endif //NNU
|
||||||
|
;
|
||||||
return presum * sum;
|
return presum * sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,7 +371,6 @@ complex double qpms_trans_single_B(qpms_normalisation_t norm,
|
||||||
a3q0 = a3q[0];
|
a3q0 = a3q[0];
|
||||||
|
|
||||||
double leg[gsl_sf_legendre_array_n(n+nu+1)];
|
double leg[gsl_sf_legendre_array_n(n+nu+1)];
|
||||||
int csphase = qpms_normalisation_t_csphase(norm);// FIXME EITHER TO NORMFAC OR USE HERE
|
|
||||||
if (gsl_sf_legendre_array_e(GSL_SF_LEGENDRE_NONE,n+nu+1,costheta,csphase,leg)) abort();
|
if (gsl_sf_legendre_array_e(GSL_SF_LEGENDRE_NONE,n+nu+1,costheta,csphase,leg)) abort();
|
||||||
complex double bes[n+nu+2];
|
complex double bes[n+nu+2];
|
||||||
if (qpms_sph_bessel_fill(J, n+nu+1, kdlj.r, bes)) abort();
|
if (qpms_sph_bessel_fill(J, n+nu+1, kdlj.r, bes)) abort();
|
||||||
|
@ -389,7 +403,18 @@ complex double qpms_trans_single_B(qpms_normalisation_t norm,
|
||||||
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
||||||
|
|
||||||
// ipow(n-nu) is the difference from the "old Taylor" formula
|
// ipow(n-nu) is the difference from the "old Taylor" formula
|
||||||
presum *= /*ipow(n-nu) * */(exp(normlogfac) * normfac);
|
presum *= /*ipow(n-nu) * */(exp(normlogfac) * normfac)
|
||||||
|
#ifdef AN1
|
||||||
|
* ipow(n-nu)
|
||||||
|
#elif defined AN2
|
||||||
|
* min1pow(-n+nu)
|
||||||
|
#elif defined AN3
|
||||||
|
* ipow (nu - n)
|
||||||
|
#endif
|
||||||
|
#ifdef AM2
|
||||||
|
* min1pow(-m+mu)
|
||||||
|
#endif //NNU
|
||||||
|
;
|
||||||
|
|
||||||
return presum * sum;
|
return presum * sum;
|
||||||
}
|
}
|
||||||
|
@ -500,14 +525,11 @@ static void qpms_trans_calculator_multipliers_A_general(
|
||||||
if (err) abort();
|
if (err) abort();
|
||||||
double a1q0 = a1q[0];
|
double a1q0 = a1q[0];
|
||||||
|
|
||||||
int csphase = qpms_normalisation_t_csphase(norm); //TODO FIXME use this
|
|
||||||
norm = qpms_normalisation_t_normonly(norm);
|
|
||||||
double normlogfac = qpms_trans_normlogfac(norm,m,n,mu,nu);
|
double normlogfac = qpms_trans_normlogfac(norm,m,n,mu,nu);
|
||||||
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
||||||
|
|
||||||
// TODO use csphase to modify normfac here!!!!
|
|
||||||
// normfac = xxx ? -normfac : normfac;
|
|
||||||
normfac *= min1pow(m); //different from old Taylor
|
normfac *= min1pow(m); //different from old Taylor
|
||||||
|
|
||||||
double exponent=(lgamma(2*n+1)-lgamma(n+2)+lgamma(2*nu+3)-lgamma(nu+2)
|
double exponent=(lgamma(2*n+1)-lgamma(n+2)+lgamma(2*nu+3)-lgamma(nu+2)
|
||||||
+lgamma(n+nu+m-mu+1)-lgamma(n-m+1)-lgamma(nu+mu+1)
|
+lgamma(n+nu+m-mu+1)-lgamma(n-m+1)-lgamma(nu+mu+1)
|
||||||
+lgamma(n+nu+1) - lgamma(2*(n+nu)+1))
|
+lgamma(n+nu+1) - lgamma(2*(n+nu)+1))
|
||||||
|
@ -561,13 +583,8 @@ void qpms_trans_calculator_multipliers_B_general(
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int csphase = qpms_normalisation_t_csphase(norm); //TODO FIXME use this
|
|
||||||
norm = qpms_normalisation_t_normonly(norm);
|
|
||||||
double normlogfac= qpms_trans_normlogfac(norm,m,n,mu,nu);
|
double normlogfac= qpms_trans_normlogfac(norm,m,n,mu,nu);
|
||||||
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
double normfac = qpms_trans_normfac(norm,m,n,mu,nu);
|
||||||
// TODO use csphase to modify normfac here!!!!
|
|
||||||
// normfac = xxx ? -normfac : normfac;
|
|
||||||
//normfac *= min1pow(m);//different from old taylor
|
|
||||||
|
|
||||||
double presum = min1pow(1-m) * (2*nu+1)/(2.*(n*(n+1)))
|
double presum = min1pow(1-m) * (2*nu+1)/(2.*(n*(n+1)))
|
||||||
* exp(lgamma(n+m+1) - lgamma(n-m+1) + lgamma(nu-mu+1) - lgamma(nu+mu+1)
|
* exp(lgamma(n+m+1) - lgamma(n-m+1) + lgamma(nu-mu+1) - lgamma(nu+mu+1)
|
||||||
|
|
Loading…
Reference in New Issue