High-precision calculations for one- and two-valence atomic systems
Hypergeometric Namespace Reference

Detailed Description

Hypergeometric functions.

Functions

std::complex< double > lngamma_complex (std::complex< double > z)
 
std::pair< std::complex< double >, double > series_1f1 (std::complex< double > a, double b, std::complex< double > z, double s)
 
std::pair< std::complex< double >, double > asymptotic_sum (std::complex< double > p, std::complex< double > q, std::complex< double > w)
 
std::pair< std::complex< double >, double > asymptotic_1f1 (std::complex< double > a, double b, std::complex< double > z, double s)
 
std::pair< std::complex< double >, double > fast_1f1 (std::complex< double > a, double b, std::complex< double > z, double s)
 
template<typename T >
T H1f1 (T a, double b, T z, double s=0.0)
 Scaled confluent hypergeometric function: e^{s} * 1F1(a, b, z)
 
template double H1f1 (double, double, double, double)
 
template std::complex< double > H1f1 (std::complex< double >, double, std::complex< double >, double)
 

Variables

constexpr bool use_arb = true
 
constexpr long fixed_prec = 64
 
constexpr bool use_fast_path = true
 
constexpr double fast_path_tol = 1.0e-13
 
constexpr bool has_flint
 True if compiled with FLINT support; complex H1f1 returns zero otherwise.
 

Function Documentation

◆ H1f1()

template<typename T >
T Hypergeometric::H1f1 ( T  a,
double  b,
T  z,
double  s = 0.0 
)

Scaled confluent hypergeometric function: e^{s} * 1F1(a, b, z)

  • a and z may be complex (via template). s and b must be real

T (template param) may be double or std::complex<double>.

Real (double) arguments: evaluated with GSL (double precision); the scale e^{s} is applied as an ordinary double factor.

Complex arguments: first attempts a fast double-precision evaluation (Maclaurin series at small |z|, asymptotic expansion at large |z|, each with a running error estimate); this covers most continuum-state calls at ~100x the speed of ball arithmetic. Where the estimated error is too large (strong cancellation: large Im(a) with moderate |z|), falls back to FLINT ball arithmetic, increasing the working precision until the result is accurate to (at least) full double precision. The scale e^{s} is applied inside the evaluation, so exponentially small 1F1 values (e.g. like e^{-pi*nu/2} for continuum Coulomb functions) can be paired with their compensating normalisation factors without under/overflowing double.

Note
Requires FLINT library to work with complex values. Compile with -lflint and set -DAMPSCI_USE_FLINT3 (FLINT 3+), or with -lflint-arb -lflint and -DAMPSCI_USE_FLINT2 (FLINT 2.x + Arb) (done automatically by Makefile/configure.sh)
Warning
Uses IFDEF to allow compilation if FLINT is not available. However, functions must not be called if FLINT is not installed. Will abort, or return nan if called without FLINT. Always use if constexpr (Hypergeometric::has_flint) {} in code, to check if available; see Hypergeometric::has_flint

Variable Documentation

◆ has_flint

constexpr bool Hypergeometric::has_flint
constexpr
Initial value:
=
false

True if compiled with FLINT support; complex H1f1 returns zero otherwise.