Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1dc19e6
Add initial muon CDF data
stognini Dec 29, 2025
23c8585
Add process/model skeletons
stognini Dec 29, 2025
1b8df65
Draft host/device data
stognini Dec 29, 2025
1a4d2ff
Add model implementation; draft host/device data initialization
stognini Dec 29, 2025
7e9e527
Add mucf executor + interactors + helper classes skeletons
stognini Dec 29, 2025
2f87468
Make sure it builds
stognini Dec 29, 2025
f517bbb
Expand documentation
stognini Dec 29, 2025
dc20634
Fixup
stognini Dec 29, 2025
91fdbbf
Address most comments:
stognini Jan 2, 2026
67be430
Move component id getter function into DTMixMucfData
stognini Jan 5, 2026
0842322
Assign all current PDG numbers
stognini Jan 5, 2026
7123f3e
Address comments:
stognini Jan 9, 2026
31a72c5
Minor improvements
stognini Jan 13, 2026
38667c5
Update documentation
stognini Jan 13, 2026
88acf69
Fixup
stognini Jan 14, 2026
39b329e
Improve documentation
stognini Jan 14, 2026
f734763
Fix `RootInterfaceLinkDef`
stognini Jan 14, 2026
c16afeb
Merge branch 'develop' into mucf-interactor
stognini Jan 15, 2026
cea2b35
Address comments:
stognini Jan 15, 2026
97cf729
Fix missing CELER_FUNCTION
stognini Jan 16, 2026
d3b6354
Fix device data
stognini Jan 19, 2026
64ece57
Fix tidy warnings
sethrj Jan 20, 2026
1fc65c9
Use double-precision for input to fix root errors, and un-inline from…
sethrj Jan 20, 2026
e9e141d
Add operator bool
sethrj Jan 20, 2026
153d269
Merge remote-tracking branch 'upstream/develop' into mucf-interactor
sethrj Jan 20, 2026
c1bc9e5
fixup! Use double-precision for input to fix root errors, and un-inli…
sethrj Jan 20, 2026
f67069a
fixup! Fix tidy warnings
sethrj Jan 20, 2026
ef30f0c
fixup! Fix tidy warnings
sethrj Jan 20, 2026
c571e0d
Merge remote-tracking branch 'upstream/develop' into mucf-interactor
sethrj Jan 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions doc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,12 @@ file(GLOB _DOXYGEN_SOURCE
"${PROJECT_SOURCE_DIR}/src/celeritas/em/msc/detail/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/em/process/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/em/xs/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/data/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/executor/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/interactor/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/model/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/model/detail/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/mucf/process/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/neutron/interactor/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/neutron/interactor/detail/*.hh"
"${PROJECT_SOURCE_DIR}/src/celeritas/neutron/model/*.hh"
Expand Down
41 changes: 34 additions & 7 deletions doc/implementation/mucf-physics.rst
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ sticking factor and the fusion cycle time are the main conditions that define
how many fusion cycles a muon can undergo. The fusion cycle time depends on the
d-t mixture, its temperature, and on the final spin of the molecule. Only muonic
molecules where the total spin :math:`F = I_N \pm 1/2` is on, or has a
projection onto the total angular momentum J = 1 are reactive. The spin states
of the three possible muonic molecules are summarized in table
projection onto the total angular momentum :math:`J = 1` are reactive. The spin
states of the three possible muonic molecules are summarized in table
:numref:`muon_spin_states`.


Expand Down Expand Up @@ -108,9 +108,36 @@ enabling the ``mucf_physics`` option in
Geant4 integration
------------------

For integration interfaces, if ``mucf_physics`` option in
:cpp:class:`celeritas::ext::GeantPhysicsOptions` is enabled, the muon-catalyzed
fusion data is constructed when the ``G4MuonMinusAtomicCapture`` process is
registered.
For integration interfaces, enabling the ``mucf_physics`` option in
:cpp:class:`celeritas::ext::GeantPhysicsOptions` will check if the
``G4MuonMinusAtomicCapture`` process is registered in the Geant4's Physics List.
If the process is present, the :cpp:class:`celeritas::inp::MucfPhysics` will be
populated, and the :cpp:class:`celeritas::MucfProcess` will be initialized.

.. todo:: Add process/model/executor details
Code implementation
===================

The :cpp:class:`celeritas::MucfProcess` process has only the
:cpp:class:`celeritas::DTMixMucfModel` attached to it, responsible for
deuterium-tritium mixtures. It can simulate materials from near absolute zero to
1500 kelvin. It is an *at rest* model that encompasses the full cycle---atom
formation, molecule formation, and fusion.

.. doxygenclass:: celeritas::MucfProcess
.. doxygenclass:: celeritas::DTMixMucfModel

Most of the data is material-dependent, being calculated and cached during model
construction. All of the cached quantities are calculated and added to
host/device data via :cpp:class:`celeritas::detail::MucfMaterialInserter`.

.. doxygenclass:: celeritas::detail::MucfMaterialInserter

The main cycle is managed by the model's
:cpp:class:`celeritas::DTMixMucfExecutor`, with the Interactors reserved for
sampling final states of the outgoing secondaries.

.. note:: Only reactive channels are implemented.

.. doxygenclass:: celeritas::DDMucfInteractor
.. doxygenclass:: celeritas::DTMucfInteractor
.. doxygenclass:: celeritas::TTMucfInteractor
3 changes: 3 additions & 0 deletions src/celeritas/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ list(APPEND SOURCES
mat/MaterialParams.cc
mat/MaterialParamsOutput.cc
mat/detail/Utils.cc
mucf/model/detail/MucfMaterialInserter.cc
mucf/process/MucfProcess.cc
neutron/model/CascadeOptions.cc
neutron/model/CascadeOptionsIO.json.cc
neutron/process/NeutronElasticProcess.cc
Expand Down Expand Up @@ -375,6 +377,7 @@ celeritas_polysource(em/model/CoulombScatteringModel)
celeritas_polysource(geo/detail/BoundaryAction)
celeritas_polysource(global/detail/KillActive)
celeritas_polysource(global/detail/TrackSlotUtils)
celeritas_polysource(mucf/model/DTMixMucfModel)
celeritas_polysource(neutron/model/ChipsNeutronElasticModel)
celeritas_polysource(neutron/model/NeutronInelasticModel)
celeritas_polysource(optical/model/AbsorptionModel)
Expand Down
19 changes: 0 additions & 19 deletions src/celeritas/Types.hh
Original file line number Diff line number Diff line change
Expand Up @@ -227,25 +227,6 @@ enum class CylAxis
size_
};

//---------------------------------------------------------------------------//
//! Muon-catalyzed fusion atoms
enum class MucfMuonicAtom
{
deuterium,
tritium,
size_
};

//---------------------------------------------------------------------------//
//! Muon-catalyzed fusion molecules
enum class MucfMuonicMolecule
{
deuterium_deuterium,
deuterium_tritium,
tritium_tritium,
size_
};

//---------------------------------------------------------------------------//
// HELPER STRUCTS
//---------------------------------------------------------------------------//
Expand Down
8 changes: 6 additions & 2 deletions src/celeritas/ext/RootInterfaceLinkDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,11 @@
#pragma link C++ class celeritas::inp::Grid+;
#pragma link C++ class celeritas::inp::GridReflection+;
#pragma link C++ class celeritas::inp::Interpolation+;
#pragma link C++ class celeritas::inp::MucfPhysics+;
#pragma link C++ class celeritas::inp::MucfCycleRate+;
#pragma link C++ class celeritas::inp::MucfAtomTransferRate+;
#pragma link C++ class celeritas::inp::MucfAtomSpinFlipRate+;
#pragma link C++ class celeritas::inp::MucfCycleRate+;
#pragma link C++ class celeritas::inp::MucfPhysics+;
#pragma link C++ class celeritas::inp::MucfScalars+;
#pragma link C++ class celeritas::inp::MuPairProductionEnergyTransferTable+;
#pragma link C++ class celeritas::inp::NoRoughness+;
#pragma link C++ class celeritas::inp::OpticalPhysics+;
Expand Down Expand Up @@ -82,6 +83,9 @@
// Quantities
#pragma link C++ class celeritas::Quantity<celeritas::units::EElectron,double>+;
#pragma link C++ class celeritas::Quantity<celeritas::units::MevPerCsq,double>+;
#pragma link C++ class celeritas::Quantity<celeritas::units::Amu,double>+;
#pragma link C++ class celeritas::Quantity<celeritas::units::InvCentimeterCubed,double>+;


// Event data used by Geant4/Celeritas offloading applications
#pragma link C++ class celeritas::EventData+;
Expand Down
123 changes: 116 additions & 7 deletions src/celeritas/inp/MucfPhysics.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,117 @@ namespace celeritas
{
namespace inp
{
namespace
{
//---------------------------------------------------------------------------//
/*!
* Muon energy CDF data for muon-catalyzed fusion.
*/
Grid mucf_muon_energy_cdf()
{
Grid cdf;
cdf.interpolation.type = InterpolationType::cubic_spline;

// Cumulative distribution data [unitless]
cdf.x = {
0,
0.04169381107491854,
0.08664495114006499,
0.14332247557003264,
0.20456026058631915,
0.2723127035830618,
0.34136807817589576,
0.41563517915309456,
0.48990228013029324,
0.5667752442996744,
0.6306188925081434,
0.6866449511400652,
0.7309446254071662,
0.7778501628664496,
0.8104234527687297,
0.8403908794788275,
0.8618892508143323,
0.8814332247557004,
0.8970684039087949,
0.903583061889251,
1.0,
};

// Energy [keV]
cdf.y = {
0,
0.48850540675768084,
0.8390389347819425,
1.2521213482687141,
1.7153033196164724,
2.253638712180777,
2.854653691809707,
3.606073540073316,
4.470346052913727,
5.560291219507215,
6.700556502915258,
7.953772477101693,
9.194596305637525,
10.849180562221111,
12.353474314071864,
14.045888515617822,
15.650634617544647,
17.38079707555165,
19.111008546659452,
19.976130619913615,
80.0,
};

CELER_ENSURE(cdf);
return cdf;
}

//---------------------------------------------------------------------------//
/*!
* Cycle rate data for muon-catalyzed fusion.
*/
std::vector<MucfCycleRate> mucf_cycle_rates()
{
//! \todo Implement
return {};
}

//---------------------------------------------------------------------------//
/*!
* Spin-flip data for muon-catalyzed fusion.
*/
std::vector<MucfAtomSpinFlipRate> mucf_atom_spin_flip_rates()
{
//! \todo Implement
return {};
}

//---------------------------------------------------------------------------//
/*!
* Atom transfer data for muon-catalyzed fusion.
*/
std::vector<MucfAtomTransferRate> mucf_atom_transfer_rates()
{
//! \todo Implement
return {};
}
//---------------------------------------------------------------------------//
} // namespace

//---------------------------------------------------------------------------//
/*!
* Initialize with hardcoded values.
*/
MucfScalars MucfScalars::from_default()
{
MucfScalars result;
result.protium = AmuMass{1.007825031898};
result.deuterium = AmuMass{2.014101777844};
result.tritium = AmuMass{3.016049281320};
result.liquid_hydrogen_density = InvCcDensity{4.25e22};
return result;
}

//---------------------------------------------------------------------------//
/*!
* Construct hardcoded muon-catalyzed fusion physics data.
Expand All @@ -21,16 +132,14 @@ namespace inp
MucfPhysics MucfPhysics::from_default()
{
MucfPhysics result;

//! \todo Initialize hardcoded CDF data
//! \todo Initialize hardcoded cycle rate data
//! \todo Initialize hardcoded atom transfer data
//! \todo Initialize hardcoded spin flip data
result.scalars = MucfScalars::from_default();
result.muon_energy_cdf = mucf_muon_energy_cdf();
result.cycle_rates = mucf_cycle_rates();
result.atom_transfer = mucf_atom_transfer_rates();
result.atom_spin_flip = mucf_atom_spin_flip_rates();

// Temporary test dummy data to verify correct import
{
result.muon_energy_cdf = Grid::from_constant(1.0);

MucfCycleRate dt_cycle;
dt_cycle.molecule = MucfMuonicMolecule::deuterium_tritium;

Expand Down
51 changes: 45 additions & 6 deletions src/celeritas/inp/MucfPhysics.hh
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,43 @@
#include <vector>

#include "corecel/inp/Grid.hh"
#include "celeritas/Types.hh"
#include "corecel/math/Quantity.hh"
#include "celeritas/UnitTypes.hh"
#include "celeritas/mucf/Types.hh"

namespace celeritas
{
namespace inp
{
//---------------------------------------------------------------------------//
/*!
* Muon-catalyzed fusion scalars.
*
* Default values are the same used by Acceleron.
*/
struct MucfScalars
{
using AmuMass = Quantity<units::Amu, double>;
using InvCcDensity = Quantity<units::InvCentimeterCubed, double>;

// Atomic masses
AmuMass protium; //!< Protium atomic mass [AMU]
AmuMass deuterium; //!< Deuterium atomic mass [AMU]
AmuMass tritium; //!< Tritium atomic mass [AMU]
InvCcDensity liquid_hydrogen_density; //!< LHD unit [1/cm^3]

//! Whether scalars have been defined
explicit operator bool() const
{
return protium > zero_quantity() && deuterium > zero_quantity()
&& tritium > zero_quantity()
&& liquid_hydrogen_density > zero_quantity();
}

// Initialize with hardcoded values
static MucfScalars from_default();
};

//---------------------------------------------------------------------------//
/*!
* Muon-catalyzed fusion mean cycle rate data.
Expand Down Expand Up @@ -68,6 +99,9 @@ struct MucfCycleRate
struct MucfAtomTransferRate
{
//! \todo Implement

//! True if data is assigned \todo Implement
explicit operator bool() const { return true; }
};

//---------------------------------------------------------------------------//
Expand All @@ -91,14 +125,18 @@ struct MucfAtomTransferRate
struct MucfAtomSpinFlipRate
{
//! \todo Implement

//! True if data is assigned \todo Implement
explicit operator bool() const { return true; }
};

//---------------------------------------------------------------------------//
/*!
* Muon-catalyzed fusion physics options and data import.
*
* Minimum requirements for muon-catalyzed fusion:
* - Muon energy CDF data, required for sampling the outgoing muCF muon, and
* - Muon energy CDF data, required for sampling the outgoing muCF muon,
* and
* - Mean cycle rate data for dd, dt, and tt muonic molecules.
*
* Muonic atom transfer and muonic atom spin flip are secondary effects and not
Expand All @@ -109,15 +147,16 @@ struct MucfPhysics
template<class T>
using Vec = std::vector<T>;

Grid muon_energy_cdf; //!< CDF for outgoing muCF muon
MucfScalars scalars;
Grid muon_energy_cdf; //!< CDF for sampling the outgoing muCF muon
Vec<MucfCycleRate> cycle_rates; //!< Mean cycle rates for muonic molecules
Vec<MucfAtomTransferRate> atom_transfer; //!< Muon atom transfer rates
Vec<MucfAtomSpinFlipRate> atom_spin_flip; //!< Muon atom spin flip rates
Vec<MucfAtomTransferRate> atom_transfer; //!< Muonic atom transfer rates
Vec<MucfAtomSpinFlipRate> atom_spin_flip; //!< Muonic atom spin flip rates

//! Whether muon-catalyzed fusion physics is enabled
explicit operator bool() const
{
return muon_energy_cdf && !cycle_rates.empty();
return scalars && muon_energy_cdf && !cycle_rates.empty();
}

//! Construct hardcoded muon-catalyzed fusion physics data
Expand Down
Loading
Loading