Sigma0 ready, it's time for writing some tests.

Former-commit-id: 956254dcd4c337374d945465ff228fc40595fc3e
This commit is contained in:
Marek Nečada 2018-09-05 11:09:22 +00:00
parent 03ab9755a5
commit 16ce3a6ba8
2 changed files with 24 additions and 0 deletions

View File

@ -28,6 +28,7 @@
#endif #endif
// sloppy implementation of factorial // sloppy implementation of factorial
static inline double factorial(const int n) { static inline double factorial(const int n) {
assert(n >= 0); assert(n >= 0);
@ -133,6 +134,22 @@ void qpms_ewald32_constants_free(qpms_ewald32_constants_t *c) {
int ewald32_sigma0(complex double *result, double *err,
const qpms_ewald32_constants_t *c,
const double eta, const double k)
{
qpms_csf_result gam;
int retval = complex_gamma_inc_e(-0.5, -k/sq(2*eta), &gam);
if (0 != retval)
abort();
*result = gam.val * c->legendre0[gsl_sf_legendre_array_index(0,0)] / 2 / M_SQRTPI;
if(err)
*err = gam.err * c->legendre0[gsl_sf_legendre_array_index(0,0)] / 2 / M_SQRTPI;
return 0;
}
int ewald32_sigma_long_shiftedpoints ( int ewald32_sigma_long_shiftedpoints (
complex double *target, // must be c->nelem long complex double *target, // must be c->nelem long
double *err, double *err,

View File

@ -78,6 +78,12 @@ int ewald32_sr_integral(double r, double k, double n, double eta, double *result
#include "lattices.h" #include "lattices.h"
int ewald32_sigma0(complex double *result, double *err,
const qpms_ewald32_constants_t *c,
double eta, double k
);
// TODO make "compressed versions" where the (m+n)-odd terms (which are zero) // TODO make "compressed versions" where the (m+n)-odd terms (which are zero)
// are not included. // are not included.
@ -114,6 +120,7 @@ int ewald32_sigma_short_shiftedpoints(
const qpms_ewald32_constants_t *c, // N.B. not too useful here const qpms_ewald32_constants_t *c, // N.B. not too useful here
double eta, double k, double eta, double k,
size_t npoints, const point2d *Rpoints_plus_particle_shift, size_t npoints, const point2d *Rpoints_plus_particle_shift,
point2d beta,
point2d particle_shift // used only in the very end to multiply it by the phase point2d particle_shift // used only in the very end to multiply it by the phase
); );
int ewald32_sigma_short_points_and_shift(//NI int ewald32_sigma_short_points_and_shift(//NI