libcerf

This is the home page of libcerf, a self-contained numeric library that provides an efficient and accurate implementation of complex error functions, along with Dawson, Faddeeva, and Voigt functions.

Introduction

On current GNU/Linux systems, the man page complex(7) has a “see also” section that lists complex mathematical functions like cabs(3), cacos(3), and so on. Among them, there is a complex error function. However, its manual page cerf(3) describes the functions cerf and cerfc as “unimplemented” and “reserved for future use”. The present library libcerf provides the missing implementation, along with a related functions. It comes with a set of man pages, including a page cerf(3) that overwrites the standard one.

Synopsis

In the following, “complex” stands for the C99 data type “double _Complex”:

  • complex cerf (complex): The complex error function erf(z).
  • complex cerfc (complex): The complex complementary error function erfc(z) = 1 - erf(z).
  • complex cerfcx (complex z): The underflow-compensating function erfcx(z) = exp(z^2) erfc(z).
  • double erfcx (double x): The same for real x.
  • complex cerfi (complex z): The imaginary error function erfi(z) = -i erf(iz).
  • double erfi (double x): The same for real x.
  • complex w_of_z (complex z): Faddeeva's scaled complex error function w(z) = exp(-z^2) erfc(-iz).
  • double im_w_of_x (double x): The same for real x, returning the purely imaginary result as a real number.
  • complex cdawson (complex z): Dawson's integral D(z) = sqrt(pi)/2 * exp(-z^2) * erfi(z).
  • double dawson (double x): The same for real x.
  • double voigt (double x, double sigma, double gamma): The convolution of a Gaussian and a Lorentzian.

References

Most function evaluations in this library rely on Faddeeva's function w(z).

This function has been reimplemented from scratch by Steven G. Johnson; project web site http://ab-initio.mit.edu/Faddeeva. The implementation partly relies on algorithms from the following publications:

  • Walter Gautschi, Efficient computation of the complex error function, SIAM J. Numer. Anal. 7, 187 (1970).
  • G. P. M. Poppe and C. M. J. Wijers, More efficient computation of the complex error function, ACM Trans. Math. Soft. 16, 38 (1990).
  • Mofreh R. Zaghloul and Ahmed N. Ali, Algorithm 916: Computing the Faddeyeva and Voigt Functions, ACM Trans. Math. Soft. 38, 15 (2011).

Accuracy

By construction, it is expected that the relative accuracy is generally better than 1E-13. This has been confirmed by comparison with high-precision Maple computations and with a long double computation using Fourier transform representation and double-exponential transform.

Source distribution

Authors: Steven G. Johnson, Joachim Wuttke
Maintainer: Joachim Wuttke, Jülich Centre for Neutron Science, Scientific Computing Group at FRM II.
Copyright: Massachusetts Institute of Technology, 2012; Forschungszentrum Jülich, 2013.
License: MIT License
Download: http://apps.jcns.fz-juelich.de/src/libcerf/

Language bindings

The C library libcerf can be wrapped for use with other programming languages. Such language bindings are added to the libcerf package as contributed by their authors.

The following bindings are available:

  • fortran, by Antonio Cervellino (Paul Scherrer Institut)

Further contributions will be highly welcome.

Citation

When using libcerf in scientific work, please cite as follows: