28#include <gsl/gsl_sf_zeta.h>
35 std::vector<double> &series) {
38 auto const deriv =
static_cast<double>(2 * n);
43 series[0] = 2. * (1. - std::numbers::egamma);
44 for (
int order = 1;; order += 1) {
45 auto const x_order =
static_cast<double>(2 * order);
46 auto const coeff = -2. * gsl_sf_hzeta(x_order + 1., 2.);
49 series.push_back(coeff);
58 for (
int order = 0;; order++) {
60 auto const x_order =
static_cast<double>(2 * order);
61 auto const coeff = pref * gsl_sf_hzeta(1. + deriv + x_order, 2.);
65 series.push_back(-binom * coeff);
68 pref *= (1.0 + deriv / (x_order + 1.));
69 pref *= (1.0 + deriv / (x_order + 2.));
75 std::vector<double> &series) {
76 auto const deriv =
static_cast<double>(2 * n + 1);
79 auto pref = 2 * deriv * (1 + deriv);
81 for (
int order = 0;; order++) {
83 auto const x_order =
static_cast<double>(2 * order + 1);
84 auto const coeff = pref * gsl_sf_hzeta(1. + deriv + x_order, 2.);
89 series.push_back(-binom * coeff);
91 pref *= (1.0 + deriv / (x_order + 1));
92 pref *= (1.0 + deriv / (x_order + 2));
96void CoulombMMM1D::create_mod_psi_up_to(
int new_n) {
97 auto const old_n =
static_cast<int>(modPsi.size() >> 1);
99 modPsi.resize(2 * new_n);
102 for (
int n = 0; n < old_n; n++)
103 binom *= (-0.5 - n) /
static_cast<double>(n + 1);
105 for (
int n = old_n; n < new_n; n++) {
108 binom *= (-0.5 - n) /
static_cast<double>(n + 1);
constexpr auto round_error_prec
Precision below which a double-precision float is assumed to be zero.
static void preparePolygammaOdd(int n, double binom, std::vector< double > &series)
static void preparePolygammaEven(int n, double binom, std::vector< double > &series)
MMM1D algorithm for long-range Coulomb interactions on the CPU.