CUDAProb3++ calculates the effect of 3-flavor neutrino oscillation for neutrinos propagating through a sphere with piecewise constant density. Given a matter profile (body), a list of trajectories through this body, and a list of neutrino energies, CUDAProb3++ can propagate the neutrinos for all pairs of (trajectory, neutrino energy) in parallel on multiple CUDA-capable GPUs, or on the host using multi-threading.
Computations can be performed in either 32-bit single-precision (float) or 64-bit double-precision (double)
CUDAProb3++ is a header-only CUDA implementation of Prob3++ http://webhome.phy.duke.edu/~raw22/public/Prob3++/.
1.Create propagator
CUDAProb3++ provides three different classes for computing. All classes have a template parameter which specifies the floating point datatype to use, i.e. FLOAT_T=float or FLOAT_T=double
// cpu propagator with 4 threads
std::unique_ptr<Propagator<FLOAT_T>> propagator( new CpuPropagator<FLOAT_T>(n_cosines, n_energies, 4));
// Single GPU propagator using GPU 0
std::unique_ptr<Propagator<FLOAT_T>> propagator( new CudaPropagatorSingle<FLOAT_T>(0, n_cosines, n_energies));
// Multi GPU propagator which uses GPU 0 and GPU 1
std::unique_ptr<Propagator<FLOAT_T>> propagator( new CudaPropagator<FLOAT_T>(std::vector<int>{0, 1}, n_cosines, n_energies));
2.Specify neutrino parameters and simulation settings
propagator->setEnergyList(energyList); // set energy list
propagator->setCosineList(cosineList); //set cosine list
propagator->setMNSMatrix(theta12, theta13, theta23, dcp); // set mixing matrix. angles in radians
propagator->setNeutrinoMasses(dm12sq, dm23sq); // set neutrino mass differences. unit: eV^2
propagator->setDensityFromFile("models/PREM_12layer.dat"); // set density model
propagator->setProductionHeight(22.0); // set neutrino production height in kilometers above earth
3.Perform calculation
propagator->calculateProbabilities(cudaprob3::Neutrino); parameter is either cudaprob3::Neutrino or cudaprob3::Antineutrino
4.Get results
FLOAT_T prob = propagator->getProbability(i, j, ProbType::m_e); // returns probability P(nu_m -> nu_e) for cosine bin i and energy bin j
A complete example is shown in example/main.cpp
To compile and run the example code, please set the GPU architecture flag in the Makefile according to your architecture.
This work is presented in the following paper.
Felix Kallenborn, Christian Hundt, Sebastian Böser, Bertil Schmidt, Massively parallel computation of atmospheric neutrino oscillations on CUDA-enabled accelerators, Computer Physics Communications, Volume 234, https://doi.org/10.1016/j.cpc.2018.07.022