Former-commit-id: cffd4c06ee69fb27f3aacb25508bf1e0532cadc2
This commit is contained in:
Marek Nečada 2017-12-21 06:35:39 +02:00
parent 0df626a194
commit 37896ad022
2 changed files with 21 additions and 4 deletions

View File

@ -1,4 +1,5 @@
#include "vswf.h"
#include <math.h>
// Legendre functions also for negative m, see DLMF 14.9.3
qpms_errno_t qpms_legendre_deriv_y_fill(double *target, double *target_deriv, double x, qpms_l_t lMax,
@ -25,12 +26,22 @@ qpms_errno_t qpms_legendre_deriv_y_fill(double *target, double *target_deriv, do
// viz DLMF 14.9.3, čert ví, jak je to s cs fasí.
double factor = exp(lgamma(l-m+1)-lgamma(n+m+1))*((m%2)?-1:1);
target[y] = factor * legendre_tmp[i];
target_deriv[y] = factor * legendre_deriv_tmp;
target_deriv[y] = factor * legendre_deriv_tmp[i];
}
break;
case GSL_SF_LEGENDRE_SCHMIDT:
case GSL_SF_LEGENDRE_SPHARM:
case GSL_SF_LEGENDRE_FULL:
for (qpms_l_t l = 0; l <= lMax; ++l)
for (qpms_m_t m = 1; m <= l; ++m) {
qpms_y_t y = gpms_mn2y(-m,l);
size_t i = gsl_sf_legenre_array_index(l,m);
// viz DLMF 14.9.3, čert ví, jak je to s cs fasí.
double factor = ((m%2)?-1:1); // this is the difference from the unnormalised case
target[y] = factor * legendre_tmp[i];
target_deriv[y] = factor * legendre_deriv_tmp[i];
}
break;
default:
abort(); //NI
break;

View File

@ -20,9 +20,15 @@ typedef struct {
} qpms_vswfset_sph_t;
double *qpms_legenre_deriv_y_get(double x, qpms_l_t lMax,
gsle_sf_legendre_t lnorm, double csphase);
qpms_errno_t qpms_legenre_deriv_y_fill(double *where, double x,
/*
* N.B. for the norm definitions, see
* https://www.gnu.org/software/gsl/manual/html_node/Associated-Legendre-Polynomials-and-Spherical-Harmonics.html
* ( gsl/specfunc/legendre_source.c and 7.24.2 of gsl docs
*
double *qpms_legendre_deriv_y_get(double x, qpms_l_t lMax,
gsle_sf_legendre_t lnorm, double csphase); //FIXME what about derivative?
qpms_errno_t qpms_legendre_deriv_y_fill(double *where, double *where_deriv, double x,
qpms_l_t lMax, gsl_sf_legendre_t lnorm, double csphase); //NI
qpms_vswfset_sph_t *qpms_vswfset_make(qpms_l_t lMax, sph_t kdlj,