Skip to content

Commit f4114a1

Browse files
committed
Merge remote-tracking branch 'upstream/develop' into vg-refactor-2
2 parents 0fb9bed + 6643363 commit f4114a1

28 files changed

+677
-90
lines changed

doc/_static/zotero.bib

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3605,3 +3605,18 @@ @article{wright-geant4bertini-2015
36053605
issn = {01689002},
36063606
doi = {10.1016/j.nima.2015.09.058}
36073607
}
3608+
3609+
@article{kamimura-mucf-2023,
3610+
title = {Comprehensive study of muon-catalyzed nuclear reaction processes in the $dt\ensuremath{\mu}$ molecule},
3611+
author = {Kamimura, M. and Kino, Y. and Yamashita, T.},
3612+
journal = {Phys. Rev. C},
3613+
volume = {107},
3614+
issue = {3},
3615+
pages = {034607},
3616+
numpages = {21},
3617+
year = {2023},
3618+
month = {Mar},
3619+
publisher = {American Physical Society},
3620+
doi = {10.1103/PhysRevC.107.034607},
3621+
url = {https://link.aps.org/doi/10.1103/PhysRevC.107.034607}
3622+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
.. Copyright Celeritas contributors: see top-level COPYRIGHT file for details
2+
.. SPDX-License-Identifier: CC-BY-4.0
3+
4+
.. _api_mucf_physics:
5+
6+
************
7+
MuCF Physics
8+
************
9+
10+
The muon-catalyzed fusion physics in Celeritas is derived from custom
11+
implementations written by Ara Knaian (Acceleron Fusion), Kevin Lynch
12+
(Fermilab), and Sridhar Tripathy (UC Davis), not available in the standard
13+
Geant4 source code.
14+
15+
Currently, the physics is managed by a single ``Executor`` that is responsible
16+
for the full cycle, from atom formation to generating the outgoing secondaries
17+
after fusion occurred.
18+
19+
Physics overview
20+
================
21+
22+
Muons can be used to fuse deuterium-tritium mixtures at low temperatures
23+
:cite:`kamimura-mucf-2023`. This is caused by the fact that molecular orbital
24+
radii are inversely proportional to the mass of the lepton: the muon, with a
25+
mass approximately 207 times larger than the electron's, leads to an orbital
26+
radius about 207 times smaller. The reduced molecular orbital leads to a higher
27+
nuclear wavefunction overlap, which in turn leads to a fusion reaction that does
28+
not require high-temperature, magnetic-confined plasma to happen.
29+
30+
The full cycle time is a few orders of magnitude smaller than the average decay
31+
time of the muon (:math:`2.2 \times 10^{-6}` s). Muonic atom formation takes
32+
about :math:`10^{-12}-10^{-13}` s, muonic molecule formation takes
33+
:math:`10^{-8}-10^{-10}` s, and the fusion process itself is at the order of
34+
:math:`10^{-12}` s. In most instances, the muon is free after the fusion
35+
process, leading to another cycle and giving the muon-catalyzed fusion its name.
36+
The possible channels for all deuterium-tritium molecules are outlined below:
37+
38+
- :math:`(dd)_\mu`
39+
40+
- :math:`\longrightarrow ^3\text{He} + \mu + n + 3.27 \ \text{MeV}`
41+
42+
- :math:`\longrightarrow (^3\text{He})_\mu + n + 3.27 \ \text{MeV}`
43+
44+
- :math:`\longrightarrow t + \mu + p + 4.03 \ \text{MeV}`
45+
46+
- :math:`\longrightarrow (t)_\mu + p + 4.03 \ \text{MeV}`
47+
48+
- :math:`(dt)_\mu`
49+
50+
- :math:`\longrightarrow \alpha + \mu + n + 17.6 \ \text{MeV}`
51+
52+
- :math:`\longrightarrow (\alpha)_\mu + n + 17.6 \ \text{MeV}`
53+
54+
- :math:`(tt)_\mu`
55+
56+
- :math:`\longrightarrow \alpha + \mu + 2n + 11.33 \ \text{MeV}`
57+
58+
- :math:`\longrightarrow (\alpha)_\mu + 2n + 11.33 \ \text{MeV}`
59+
60+
In the cases where the muon sticks to an outgoing nucleus, e.g. generating a
61+
:math:`(\alpha)_\mu`, the catalysis is halted. This happens at a fraction of a
62+
percent to a few percent level, and the number that represents the fraction of
63+
times this happens, with respect to the case where the muon is free, is called
64+
the sticking factor.
65+
66+
A single muon can repeat this fusion cycle somewhat between 100 to 400 times.
67+
The total number of fusion cycles produced by a single muon defines how much
68+
energy can be extracted from it, in the effort of reaching a break-even
69+
scenario. This is the threshold point where the energy required to generate the
70+
muon is equal to the energy produced by said muon through the muCF cycles. The
71+
sticking factor and the fusion cycle time are the main conditions that define
72+
how many fusion cycles a muon can undergo. The fusion cycle time depends on the
73+
d-t mixture, its temperature, and on the final spin of the molecule. Only muonic
74+
molecules where the total spin :math:`F = I_N \pm 1/2` is on, or has a
75+
projection onto the total angular momentum J = 1 are reactive. The spin states
76+
of the three possible muonic molecules are summarized in table
77+
:numref:`muon_spin_states`.
78+
79+
80+
.. _muon_spin_states:
81+
82+
.. table:: Spin states of dt muonic molecules
83+
84+
+------------------+-----------+--------------+-------------------------+---------------------+
85+
| Molecule | Nuclei | :math:`I_N` | :math:`F = I_N \pm 1/2` | Reactive states (F) |
86+
+==================+===========+==============+=========================+=====================+
87+
| :math:`(dd)_\mu` | 1, 1 | 0, 1, 2 | 1/2, 3/2, 5/2 | 1/2, 3/2 |
88+
+------------------+-----------+--------------+-------------------------+---------------------+
89+
| :math:`(dt)_\mu` | 1, 1/2 | 1/2, 3/2 | 0, 1, 2 | 0, 1 |
90+
+------------------+-----------+--------------+-------------------------+---------------------+
91+
| :math:`(tt)_\mu` | 1/2, 1/2 | 0, 1 | 1/2 | 1/2 |
92+
+------------------+-----------+--------------+-------------------------+---------------------+
93+
94+
Input
95+
=====
96+
97+
The input data is currently hardcoded in the
98+
:cpp:class:`celeritas::inp::MucfPhysics` structure, which includes
99+
temperature-dependent rates for mean cycle time, muonic atom transfer, and
100+
muonic atom spin flip. The muon-catalyzed fusion process is activated by
101+
enabling the ``mucf_physics`` option in
102+
:cpp:class:`celeritas::ext::GeantPhysicsOptions`.
103+
104+
.. doxygenclass:: celeritas::inp::MucfPhysics
105+
106+
.. todo:: Expand description when hardcoded data is finalized.
107+
108+
Geant4 integration
109+
------------------
110+
111+
For integration interfaces, if ``mucf_physics`` option in
112+
:cpp:class:`celeritas::ext::GeantPhysicsOptions` is enabled, the muon-catalyzed
113+
fusion data is constructed when the ``G4MuonMinusAtomicCapture`` process is
114+
registered.
115+
116+
.. todo:: Add process/model/executor details

doc/index.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ astroparticle, high energy physics, and nuclear physics experiments including
184184
LZ, Calvision, DUNE, and
185185
ePIC. See the :ref:`api_optical_physics` section of the implementation details.
186186

187+
MuCF Physics
188+
------------
189+
190+
Celeritas has a limited implementation of muon-catalyzed fusion physics.
191+
Details are documented in :ref:`api_mucf_physics`.
192+
187193
Stepping loop
188194
-------------
189195

@@ -284,6 +290,7 @@ configuration attributes.
284290
implementation/em-physics.rst
285291
implementation/optical-physics.rst
286292
implementation/decay-physics.rst
293+
implementation/mucf-physics.rst
287294
implementation/geant4-interface.rst
288295

289296

scripts/cmake-presets/hudson.json

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"CELERITAS_USE_HIP": {"type": "BOOL", "value": "OFF"},
1616
"CELERITAS_USE_OpenMP": {"type": "BOOL", "value": "OFF"},
1717
"CELERITAS_USE_MPI": {"type": "BOOL", "value": "OFF"},
18-
"CMAKE_CXX_FLAGS": "-Wall -Wextra -pedantic -Werror",
18+
"CMAKE_CXX_FLAGS": "-Wall -Wextra -pedantic -Werror -Wno-stringop-overread",
1919
"CMAKE_CXX_STANDARD": "20",
2020
"CMAKE_CXX_COMPILER": "/usr/bin/c++",
2121
"CMAKE_CXX_EXTENSIONS": {"type": "BOOL", "value": "OFF"},
@@ -63,6 +63,26 @@
6363
"CELERITAS_DEVICE_DEBUG":{"type": "BOOL", "value": "OFF"},
6464
"CELERITAS_USE_VecGeom": {"type": "BOOL", "value": "OFF"}
6565
}
66+
},
67+
{
68+
"name": "release-vecgeom2-solid",
69+
"displayName": "Build with full optimizations (VecGeom 2 with solid geo)",
70+
"inherits": ["release"],
71+
"environment": {
72+
"CMAKE_PREFIX_PATH": "$env{SPACK_ROOT}/var/spack/environments/celeritas-vg2/.spack-env/view"
73+
},
74+
"cacheVariables": {
75+
"CELERITAS_VecGeom_SURFACE": {"type": "BOOL", "value": "OFF"}
76+
}
77+
},
78+
{
79+
"name": "release-vecgeom2-surface",
80+
"displayName": "Build with full optimizations (VecGeom 2 with surface geo)",
81+
"inherits": ["release-vecgeom2-solid"],
82+
"cacheVariables": {
83+
"CELERITAS_USE_VecGeom": {"type": "BOOL", "value": "ON"},
84+
"CELERITAS_VecGeom_SURFACE": {"type": "BOOL", "value": "ON"}
85+
}
6686
}
6787
],
6888
"buildPresets": [
@@ -76,7 +96,9 @@
7696
{"name": "reldeb", "configurePreset": "reldeb", "inherits": ".base"},
7797
{"name": "release-orange", "configurePreset": "release-orange", "inherits": ".base"},
7898
{"name": "reldeb-orange", "configurePreset": "reldeb-orange", "inherits": ".base"},
79-
{"name": "debug-orange", "configurePreset": "debug-orange", "inherits": ".base"}
99+
{"name": "debug-orange", "configurePreset": "debug-orange", "inherits": ".base"},
100+
{"name": "release-vecgeom2-solid", "configurePreset": "release-vecgeom2-solid", "inherits": ".base"},
101+
{"name": "release-vecgeom2-surface", "configurePreset": "release-vecgeom2-surface", "inherits": ".base"}
80102
],
81103
"testPresets": [
82104
{
@@ -89,6 +111,8 @@
89111
{"name": "reldeb", "configurePreset": "reldeb", "inherits": ".base"},
90112
{"name": "release-orange", "configurePreset": "release-orange", "inherits": ".base"},
91113
{"name": "reldeb-orange", "configurePreset": "reldeb-orange", "inherits": ".base"},
92-
{"name": "debug-orange", "configurePreset": "debug-orange", "inherits": ".base"}
114+
{"name": "debug-orange", "configurePreset": "debug-orange", "inherits": ".base"},
115+
{"name": "release-vecgeom2-solid", "configurePreset": "release-vecgeom2-solid", "inherits": ".base"},
116+
{"name": "release-vecgeom2-surface", "configurePreset": "release-vecgeom2-surface", "inherits": ".base"}
93117
]
94118
}

src/celeritas/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ list(APPEND SOURCES
8080
grid/TwodGridBuilder.cc
8181
grid/UniformGridInserter.cc
8282
grid/XsGridInserter.cc
83+
inp/MucfPhysics.cc
8384
io/AtomicRelaxationReader.cc
8485
io/GammaNuclearXsReader.cc
8586
io/ImportData.cc

src/celeritas/Types.hh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,25 @@ enum class CylAxis
237237
size_
238238
};
239239

240+
//---------------------------------------------------------------------------//
241+
//! Muon-catalyzed fusion atoms
242+
enum class MucfMuonicAtom
243+
{
244+
deuterium,
245+
tritium,
246+
size_
247+
};
248+
249+
//---------------------------------------------------------------------------//
250+
//! Muon-catalyzed fusion molecules
251+
enum class MucfMuonicMolecule
252+
{
253+
deuterium_deuterium,
254+
deuterium_tritium,
255+
tritium_tritium,
256+
size_
257+
};
258+
240259
//---------------------------------------------------------------------------//
241260
// HELPER STRUCTS
242261
//---------------------------------------------------------------------------//

src/celeritas/ext/GeantImporter.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <G4MscStepLimitType.hh>
3030
#include <G4MuPairProduction.hh>
3131
#include <G4MuPairProductionModel.hh>
32+
#include <G4MuonMinusAtomicCapture.hh>
3233
#include <G4Navigator.hh>
3334
#include <G4NuclearFormfactorType.hh>
3435
#include <G4NucleiProperties.hh>
@@ -994,6 +995,15 @@ auto import_processes(GeantImporter::DataSelection selected,
994995
std::make_move_iterator(new_msc_models.begin()),
995996
std::make_move_iterator(new_msc_models.end()));
996997
}
998+
else if (dynamic_cast<G4MuonMinusAtomicCapture const*>(&process))
999+
{
1000+
// G4MuonMinusAtomicCapture is a G4ProcessType::fHadronic
1001+
// It is also a G4VRestProcess and does not require import data
1002+
CELER_LOG(debug) << "Initializing default muCF data for particle "
1003+
<< particle.GetParticleName() << " ("
1004+
<< particle.GetPDGEncoding() << ')';
1005+
imported.mucf_physics = inp::MucfPhysics::from_default();
1006+
}
9971007
else if (import_optical_model
9981008
&& dynamic_cast<G4OpAbsorption const*>(&process))
9991009
{

src/celeritas/ext/GeantPhysicsOptions.hh

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ struct GeantPhysicsOptions
151151
//! Muon EM physics
152152
GeantMuonPhysicsOptions muon{GeantMuonPhysicsOptions::deactivated()};
153153

154+
//! Muon-catalyzed fusion physics
155+
bool mucf_physics{false};
156+
154157
//!@{
155158
//! \name Physics options
156159

@@ -249,41 +252,50 @@ constexpr bool
249252
operator==(GeantPhysicsOptions const& a, GeantPhysicsOptions const& b)
250253
{
251254
// clang-format off
252-
return a.coulomb_scattering == b.coulomb_scattering
253-
&& a.photoelectric == b.photoelectric
254-
&& a.rayleigh_scattering == b.rayleigh_scattering
255-
&& a.gamma_conversion == b.gamma_conversion
256-
&& a.gamma_general == b.gamma_general
257-
&& a.compton_scattering == b.compton_scattering
258-
&& a.ionization == b.ionization
259-
&& a.annihilation == b.annihilation
260-
&& a.brems == b.brems
261-
&& a.seltzer_berger_limit == b.seltzer_berger_limit
262-
&& a.msc == b.msc
263-
&& a.relaxation == b.relaxation
264-
&& a.em_bins_per_decade == b.em_bins_per_decade
265-
&& a.eloss_fluctuation == b.eloss_fluctuation
266-
&& a.lpm == b.lpm
267-
&& a.integral_approach == b.integral_approach
268-
&& a.min_energy == b.min_energy
269-
&& a.max_energy == b.max_energy
270-
&& a.linear_loss_limit == b.linear_loss_limit
271-
&& a.lowest_electron_energy == b.lowest_electron_energy
272-
&& a.lowest_muhad_energy == b.lowest_muhad_energy
273-
&& a.apply_cuts == b.apply_cuts
274-
&& a.msc_range_factor == b.msc_range_factor
275-
&& a.msc_muhad_range_factor == b.msc_muhad_range_factor
276-
&& a.msc_safety_factor == b.msc_safety_factor
277-
&& a.msc_lambda_limit == b.msc_lambda_limit
278-
&& a.msc_theta_limit == b.msc_theta_limit
279-
&& a.angle_limit_factor == b.angle_limit_factor
280-
&& a.msc_displaced == b.msc_displaced
281-
&& a.msc_muhad_displaced == b.msc_muhad_displaced
282-
&& a.msc_step_algorithm == b.msc_step_algorithm
283-
&& a.msc_muhad_step_algorithm == b.msc_muhad_step_algorithm
284-
&& a.form_factor == b.form_factor
285-
&& a.verbose == b.verbose
286-
&& a.optical == b.optical;
255+
return a.compton_scattering == b.compton_scattering
256+
&& a.photoelectric == b.photoelectric
257+
&& a.rayleigh_scattering == b.rayleigh_scattering
258+
&& a.gamma_conversion == b.gamma_conversion
259+
&& a.gamma_general == b.gamma_general
260+
// Electron and positron
261+
&& a.coulomb_scattering == b.coulomb_scattering
262+
&& a.ionization == b.ionization
263+
&& a.annihilation == b.annihilation
264+
&& a.brems == b.brems
265+
&& a.seltzer_berger_limit == b.seltzer_berger_limit
266+
&& a.msc == b.msc
267+
&& a.relaxation == b.relaxation
268+
// Muon EM physics
269+
&& a.muon == b.muon
270+
// Muon-catalyzed fusion physics
271+
&& a.mucf_physics == b.mucf_physics
272+
// Physics options
273+
&& a.em_bins_per_decade == b.em_bins_per_decade
274+
&& a.eloss_fluctuation == b.eloss_fluctuation
275+
&& a.lpm == b.lpm
276+
&& a.integral_approach == b.integral_approach
277+
// Cutoff options
278+
&& a.min_energy == b.min_energy
279+
&& a.max_energy == b.max_energy
280+
&& a.linear_loss_limit == b.linear_loss_limit
281+
&& a.lowest_electron_energy == b.lowest_electron_energy
282+
&& a.lowest_muhad_energy == b.lowest_muhad_energy
283+
&& a.apply_cuts == b.apply_cuts
284+
&& a.default_cutoff == b.default_cutoff
285+
// Multiple scattering configuration
286+
&& a.msc_range_factor == b.msc_range_factor
287+
&& a.msc_muhad_range_factor == b.msc_muhad_range_factor
288+
&& a.msc_safety_factor == b.msc_safety_factor
289+
&& a.msc_lambda_limit == b.msc_lambda_limit
290+
&& a.msc_theta_limit == b.msc_theta_limit
291+
&& a.angle_limit_factor == b.angle_limit_factor
292+
&& a.msc_displaced == b.msc_displaced
293+
&& a.msc_muhad_displaced == b.msc_muhad_displaced
294+
&& a.msc_step_algorithm == b.msc_step_algorithm
295+
&& a.msc_muhad_step_algorithm == b.msc_muhad_step_algorithm
296+
&& a.form_factor == b.form_factor
297+
&& a.verbose == b.verbose
298+
&& a.optical == b.optical;
287299
// clang-format on
288300
}
289301

0 commit comments

Comments
 (0)