File indexing completed on 2026-11-07 10:11:36
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <map>
0010
0011 #include "corecel/data/CollectionBuilder.hh"
0012 #include "celeritas/inp/MucfPhysics.hh"
0013 #include "celeritas/mat/MaterialView.hh"
0014 #include "celeritas/mucf/Types.hh"
0015 #include "celeritas/mucf/data/DTMixMucfData.hh"
0016
0017 #include "EquilibrateDensitiesSolver.hh"
0018 #include "InterpolatorHelper.hh"
0019
0020 namespace celeritas
0021 {
0022 namespace detail
0023 {
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 class MucfMaterialInserter
0039 {
0040 public:
0041
0042 explicit MucfMaterialInserter(HostVal<DTMixMucfData>* host_data,
0043 inp::MucfPhysics const& data);
0044
0045
0046 bool operator()(MaterialView const& material);
0047
0048 private:
0049 using MoleculeCycles = Array<real_type, 2>;
0050 using CycleTimesArray = EnumArray<MucfMuonicMolecule, MoleculeCycles>;
0051 using EquilibriumArray = EquilibrateDensitiesSolver::EquilibriumArray;
0052 using MaterialFractionsArray = EnumArray<MucfIsotope, real_type>;
0053 using AtomicMassNumber = AtomicNumber;
0054 using InterpolatorsMap
0055 = std::map<std::pair<inp::CycleTableType, units::HalfSpinInt>,
0056 InterpolatorHelper>;
0057
0058
0059
0060
0061 CollectionBuilder<PhysMatId, MemSpace::host, MuCfMatId> mucfmatid_to_matid_;
0062 CollectionBuilder<MaterialFractionsArray, MemSpace::host, MuCfMatId>
0063 isotopic_fractions_;
0064 CollectionBuilder<CycleTimesArray, MemSpace::host, MuCfMatId> cycle_times_;
0065
0066 std::map<AtomicMassNumber, MucfIsotope> const mass_isotope_map_{
0067 {AtomicMassNumber{1}, MucfIsotope::protium},
0068 {AtomicMassNumber{2}, MucfIsotope::deuterium},
0069 {AtomicMassNumber{3}, MucfIsotope::tritium},
0070 };
0071 inp::MucfPhysics const& data_;
0072 InterpolatorsMap interpolators_;
0073
0074
0075
0076
0077 Array<real_type, 2> calc_dd_cycle(EquilibriumArray const& eq_dens,
0078 real_type const temperature);
0079
0080
0081 Array<real_type, 2> calc_dt_cycle(EquilibriumArray const& eq_dens,
0082 real_type const temperature);
0083
0084
0085 Array<real_type, 2> calc_tt_cycle(EquilibriumArray const& eq_dens,
0086 real_type const temperature);
0087
0088
0089 InterpolatorHelper const& interpolator(inp::CycleTableType type,
0090 units::HalfSpinInt spin) const;
0091 };
0092
0093
0094 }
0095 }