Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <array> 7 : #include <pup.h> 8 : #include <string> 9 : #include <vector> 10 : 11 : #include "DataStructures/BoostMultiArray.hpp" 12 : #include "DataStructures/Tensor/TypeAliases.hpp" 13 : #include "NumericalAlgorithms/Interpolation/MultiLinearSpanInterpolation.hpp" 14 : #include "Options/String.hpp" 15 : #include "Utilities/Gsl.hpp" 16 : #include "Utilities/Serialization/CharmPupable.hpp" 17 : 18 : /// \cond 19 : class DataVector; 20 : /// \endcond 21 : 22 : namespace Particles::MonteCarlo { 23 : 24 : /// Class responsible for reading neutrino-matter interaction 25 : /// tables. 26 : template <size_t EnergyBins, size_t NeutrinoSpecies> 27 1 : class NeutrinoInteractionTable : public PUP::able { 28 : public: 29 : /// Read table from disk and stores interaction rates. 30 1 : explicit NeutrinoInteractionTable(const std::string& filename); 31 : 32 0 : static constexpr Options::String help = { 33 : "Tabulated neutrino-matter interactions in NuLib format.\n" 34 : "Emissivity, absorption and scattering opacities are \n" 35 : "tabulated as a function of density, eletron fraction \n" 36 : "and temperature."}; 37 : 38 0 : struct TableFilename { 39 0 : using type = std::string; 40 0 : static constexpr Options::String help{"File name of the NuLib table"}; 41 : }; 42 : 43 0 : using options = tmpl::list<TableFilename>; 44 : 45 : /// Explicit instantiation from table values, for tests 46 1 : NeutrinoInteractionTable( 47 : std::vector<double> table_data_, 48 : const std::array<double, EnergyBins>& table_neutrino_energies_, 49 : std::vector<double> table_log_density_, 50 : std::vector<double> table_log_temperature_, 51 : std::vector<double> table_electron_fraction_); 52 : 53 0 : explicit NeutrinoInteractionTable(CkMigrateMessage* msg) : PUP::able(msg) {} 54 : 55 : using PUP::able::register_constructor; 56 0 : void pup(PUP::er& p) override; 57 0 : WRAPPED_PUPable_decl_template(NeutrinoInteractionTable); 58 : 59 : /// Interpolate interaction rates to given values of density, 60 : /// temperature and electron fraction. 61 1 : void get_neutrino_matter_interactions( 62 : gsl::not_null< 63 : std::array<std::array<DataVector, EnergyBins>, NeutrinoSpecies>*> 64 : emissivity_in_cell, 65 : gsl::not_null< 66 : std::array<std::array<DataVector, EnergyBins>, NeutrinoSpecies>*> 67 : absorption_opacity, 68 : gsl::not_null< 69 : std::array<std::array<DataVector, EnergyBins>, NeutrinoSpecies>*> 70 : scattering_opacity, 71 : const Scalar<DataVector>& electron_fraction, 72 : const Scalar<DataVector>& rest_mass_density, 73 : const Scalar<DataVector>& temperature, 74 : const double& minimum_temperature) const; 75 : 76 0 : const std::array<double, EnergyBins>& get_neutrino_energies() const { 77 : return table_neutrino_energies; 78 : } 79 : 80 : private: 81 0 : void initialize_interpolator(); 82 : 83 : // Stores emissivity, absorption_opacity, scattering_opacity 84 : // For each quantities, there are NeutrinoSpecies * EnergyBins 85 : // variables store as a function of log(density), log(temperature) 86 : // and electron fraction. 87 : // The indexing varies fastest in EnergyBins, then Species, then 88 : // log(density), then log(temperature), and finally Ye. 89 0 : std::vector<double> table_data{}; 90 : // Central energy of each bin 91 0 : std::array<double, EnergyBins> table_neutrino_energies; 92 : // Table discretization 93 0 : std::vector<double> table_log_density{}; 94 0 : std::vector<double> table_log_temperature{}; 95 0 : std::vector<double> table_electron_fraction{}; 96 : 97 : intrp::UniformMultiLinearSpanInterpolation<3, 98 : 3 * EnergyBins * NeutrinoSpecies> 99 0 : interpolator_{}; 100 : 101 0 : const double min_kappa = 1.e-70; 102 0 : const double max_kappa = 1.e70; 103 : }; 104 : 105 : } // namespace Particles::MonteCarlo