We provide a C++ library and Python, Mathematica and Fortran interfaces to thermal functions, defined \f[ J_{B/F}(y^2)=\Re\int_0^{\infty} dx,x^2 \ln\left(1\mp\exp\left(-\sqrt{x^2 + y^2}\right)\right). \f]
We offer Taylor expansion, numerical integration (quadrature), a Bessel function representation, an approximation, a Hurwitz zeta function representation, and an upper bound for the integrals. First and second derivatives with respect to \f$y^2\f$ are also implemented.
The accompanying manual is 1802.02720. If you use this library, please cite,
@article{Fowlie:2018eiu,
author = "Fowlie, Andrew",
title = "{A fast C++ implementation of thermal functions}",
doi = "10.1016/j.cpc.2018.02.015",
year = "2018",
eprint = "1802.02720",
archivePrefix = "arXiv",
primaryClass = "hep-ph"
}
The documentation is at codedocs. To build this documentation in doxygen,
make docs
The C++ requires gsl and gslcblas and a c++11 compiler. The Python interface requires Python 2 or 3, SWIG and a Python.h header file (which is part of python-dev in Ubuntu). The Mathematica interface was tested for Mathematica 11.
Build the library via
make lib
This should build ./lib/thermal_funcs.so. The header file is ./src/thermal_funcs.h.
There is a C example ./src/example.cpp, built by
make example
This should build a program ./bin/example, which when executed prints the result of evaluating a thermal function.
Build the interface via
make python
The interface
from thermal_funcs import J_B, J_F
J_F(100., method='quad')
is compatible with Python 2 and 3, though must be built for a specific version. It has no module dependencies. By default,
SWIG will build for your python --version. To alter this, change the PYTHON variable in the makefile to compile with
your chosen Python.h header. The derivatives are called by a keyword argument e.g., J_F(100., derivative=1).
This is slightly more involved. This may work in Linux if math is in your PATH:
make mathematica
But otherwise you may have to tweak the ./src/makefile variable MATH_INC for the locations of your wscc linker and wstp.h header file. You can find this on any platform in Mathematica from FileNameJoin[{$InstallationDirectory, "SystemFiles", "Links", "WSTP", "DeveloperKit", $SystemID, "CompilerAdditions"}].
Then within Mathematica,
Install["./src/math.exe"];
Plot[{JB[ysq], JF[ysq]}, {ysq, -100, 100}]
Note well that you should use the correct (relative or absolute) path to ./src/math.exe in the command Install["./src/math.exe"]. The interface was built and tested with Mathematica 11.1.1. The derivatives are called by a keyword argument e.g., JB[100., derivative->1].
If the executable ./src/math.exe was built but Install fails, try installing step by step to find debugging information. First, run the created executable,
./src/math.exe
This should prompt you to Create link:. Enter e.g. foo. Don't exit that session. In Mathematica, try
$VersionNumber
link = LinkConnect["foo"]
Install[link]
JB[100]
to find the step that fails.
You can also try one of the pre-built examples provided by Mathematica, e.g.,
Install["/usr/local/Wolfram/Mathematica/11.1/SystemFiles/Links/WSTP/DeveloperKit/Linux-x86-64/PrebuiltExamples/addtwo"]
AddTwo[2, 2]
and re-building it locally,
MATH=/usr/local/Wolfram/Mathematica/11.1/SystemFiles/Links/WSTP/DeveloperKit/Linux-x86-64/
mkdir ~/addtwo
cd ~/addtwo
cp $MATH/WSTPExamples/addtwo* ./
$MATH/CompilerAdditions/wscc addtwo.tm addtwo.c -o addtwo
then in Mathematica,
Install["~/addtwo/addtwo"]
AddTwo[2, 2]
This may help find the origin of any problems. You must, of course, replace the paths to the ones on your machine.
There is a basic Fortran example, built by
make fortran
and executed by
./bin/fortran_example
This requires a Fortran compiler with support for iso_c_binding, which is included in the Fortran 2003 or later standard and GNU extensions.
This Stack Exchange answer was helpful for removing linker warnings from wscc, and this one was helpful for automatically locating Mathematica header files.