Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4FermiFragmentPoolAN.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// G4FermiBreakUpAN alternative FermiBreakUp model
28// by A. Novikov (January 2025)
29//
30//
31// Created by Artem Novikov on 30.01.2024.
32//
33
35#include "G4FermiDataTypes.hh"
36#include "G4VFermiFragmentAN.hh"
40#include "G4SystemOfUnits.hh"
41
42namespace
43{
44 std::size_t GetSlot(G4FermiAtomicMass atomicMass, G4FermiChargeNumber chargeNumber)
45 {
46 const auto mass = static_cast<std::uint32_t>(atomicMass);
47 const auto charge = static_cast<std::uint32_t>(chargeNumber);
48 return (mass * (mass + 1)) / 2 + charge;
49 }
50} // namespace
51
52G4FermiFragmentPoolAN::G4FermiFragmentPoolAN()
53{
54 auto pool = G4FermiFragmentPoolAN::DefaultPoolANSource();
55 pool.Initialize();
56 Initialize(pool);
57}
58
60 G4FermiChargeNumber chargeNumber) const
61{
62 // if (unlikely(static_cast<std::uint32_t>(atomicMass) < static_cast<std::uint32_t>(chargeNumber)))
63 if (static_cast<std::uint32_t>(atomicMass) < static_cast<std::uint32_t>(chargeNumber)) {
64 return 0;
65 }
66
67 const auto slot = GetSlot(atomicMass, chargeNumber);
68 // if (unlikely(slot >= fragments_.size())) {
69 if (slot >= fragments_.size()) {
70 return 0;
71 }
72
73 return fragments_[slot].size();
74}
75
78 G4FermiChargeNumber chargeNumber) const
79{
80 // if (unlikely(static_cast<std::uint32_t>(atomicMass) < static_cast<std::uint32_t>(chargeNumber)))
81 if (static_cast<std::uint32_t>(atomicMass) < static_cast<std::uint32_t>(chargeNumber)) {
82 return {EmptyContainer_.begin(), EmptyContainer_.end()};
83 }
84
85 const auto slot = GetSlot(atomicMass, chargeNumber);
86 if (slot >= fragments_.size()) {
87 return {EmptyContainer_.begin(), EmptyContainer_.end()};
88 }
89
90 return {fragments_[slot].begin(), fragments_[slot].end()};
91}
92
94{
95 const auto slot = GetSlot(fragment.GetAtomicMass(), fragment.GetChargeNumber());
96 if (slot >= fragments_.size()) {
97 fragments_.resize(slot + static_cast<std::uint32_t>(fragment.GetAtomicMass()));
98 }
99 fragments_[slot].push_back(&fragment);
100}
101
103{
104#define FERMI_CONCAT(x, y) x##y
105#define FERMI_INSTANTIATE_MACRO(x, y) FERMI_CONCAT(x, y)
106
107#define FERMI_ADD_FRAGMENT_IMPL(NAME, VALUE) \
108 static auto NAME = VALUE; \
109 push_back(&NAME);
110
111// automatic unique names are added
112#define FERMI_ADD_FRAGMENT(VALUE) \
113 FERMI_ADD_FRAGMENT_IMPL(FERMI_INSTANTIATE_MACRO(G4VFermiFragmentAN, __COUNTER__), VALUE)
114
115 FERMI_ADD_FRAGMENT(G4FermiStableFragment(1_m, 0_c, 2, 0.00 * CLHEP::MeV));
116 FERMI_ADD_FRAGMENT(G4FermiStableFragment(1_m, 1_c, 2, 0.00 * CLHEP::MeV));
117 FERMI_ADD_FRAGMENT(G4FermiStableFragment(2_m, 1_c, 3, 0.00 * CLHEP::MeV));
118 FERMI_ADD_FRAGMENT(G4FermiStableFragment(3_m, 1_c, 2, 0.00 * CLHEP::MeV));
119 FERMI_ADD_FRAGMENT(G4FermiStableFragment(3_m, 2_c, 2, 0.00 * CLHEP::MeV));
120 FERMI_ADD_FRAGMENT(G4FermiStableFragment(4_m, 2_c, 1, 0.00 * CLHEP::MeV));
121 FERMI_ADD_FRAGMENT(He5Fragment(5_m, 2_c, 4, 16.76 * CLHEP::MeV));
122 FERMI_ADD_FRAGMENT(Li5Fragment(5_m, 3_c, 4, 16.66 * CLHEP::MeV));
123 FERMI_ADD_FRAGMENT(G4FermiStableFragment(6_m, 2_c, 1, 0.00 * CLHEP::MeV));
124 FERMI_ADD_FRAGMENT(G4FermiStableFragment(6_m, 3_c, 3, 0.00 * CLHEP::MeV));
125
126 FERMI_ADD_FRAGMENT(G4FermiStableFragment(6_m, 3_c, 1, 3.56 * CLHEP::MeV));
127 FERMI_ADD_FRAGMENT(G4FermiStableFragment(7_m, 3_c, 4, 0.00 * CLHEP::MeV));
128 FERMI_ADD_FRAGMENT(G4FermiStableFragment(7_m, 3_c, 2, 0.48 * CLHEP::MeV));
129 FERMI_ADD_FRAGMENT(G4FermiStableFragment(7_m, 4_c, 4, 0.00 * CLHEP::MeV));
130 FERMI_ADD_FRAGMENT(G4FermiStableFragment(7_m, 4_c, 2, 0.43 * CLHEP::MeV));
131 FERMI_ADD_FRAGMENT(G4FermiStableFragment(8_m, 3_c, 5, 0.00 * CLHEP::MeV));
132 FERMI_ADD_FRAGMENT(G4FermiStableFragment(8_m, 3_c, 3, 0.98 * CLHEP::MeV));
133 FERMI_ADD_FRAGMENT(Be8Fragment(8_m, 4_c, 1, 0.00 * CLHEP::MeV));
134 FERMI_ADD_FRAGMENT(G4FermiStableFragment(9_m, 4_c, 4, 0.00 * CLHEP::MeV));
135 FERMI_ADD_FRAGMENT(B9Fragment(9_m, 5_c, 4, 0.00 * CLHEP::MeV));
136
137 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 4_c, 1, 0.00 * CLHEP::MeV));
138 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 4_c, 5, 3.37 * CLHEP::MeV));
139 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 4_c, 8, 5.96 * CLHEP::MeV));
140 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 4_c, 1, 6.18 * CLHEP::MeV));
141 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 4_c, 5, 6.26 * CLHEP::MeV));
142 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 5_c, 7, 0.00 * CLHEP::MeV));
143 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 5_c, 3, 0.72 * CLHEP::MeV));
144 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 5_c, 1, 1.74 * CLHEP::MeV));
145 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 5_c, 3, 2.15 * CLHEP::MeV));
146 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 5_c, 5, 3.59 * CLHEP::MeV));
147
148 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 6_c, 3, 0.00 * CLHEP::MeV));
149 FERMI_ADD_FRAGMENT(G4FermiStableFragment(10_m, 6_c, 5, 3.35 * CLHEP::MeV));
150 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 4, 0.00 * CLHEP::MeV));
151 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 2, 2.13 * CLHEP::MeV));
152 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 6, 4.44 * CLHEP::MeV));
153 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 4, 5.02 * CLHEP::MeV));
154 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 10, 6.76 * CLHEP::MeV));
155 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 6, 7.29 * CLHEP::MeV));
156 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 4, 7.98 * CLHEP::MeV));
157 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 5_c, 6, 8.56 * CLHEP::MeV));
158
159 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 4, 0.00 * CLHEP::MeV));
160 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 2, 2.00 * CLHEP::MeV));
161 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 6, 4.32 * CLHEP::MeV));
162 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 4, 4.80 * CLHEP::MeV));
163 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 2, 6.34 * CLHEP::MeV));
164 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 8, 6.48 * CLHEP::MeV));
165 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 6, 6.90 * CLHEP::MeV));
166 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 4, 7.50 * CLHEP::MeV));
167 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 4, 8.10 * CLHEP::MeV));
168 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 6, 8.42 * CLHEP::MeV));
169
170 FERMI_ADD_FRAGMENT(G4FermiStableFragment(11_m, 6_c, 8, 8.66 * CLHEP::MeV));
171 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 5_c, 3, 0.00 * CLHEP::MeV));
172 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 5_c, 5, 0.95 * CLHEP::MeV));
173 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 5_c, 5, 1.67 * CLHEP::MeV));
174 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 5_c, 4, 2.65 * CLHEP::MeV));
175 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 6_c, 1, 0.00 * CLHEP::MeV));
176 FERMI_ADD_FRAGMENT(G4FermiStableFragment(12_m, 6_c, 5, 4.44 * CLHEP::MeV));
177 FERMI_ADD_FRAGMENT(G4FermiStableFragment(13_m, 6_c, 2, 0.00 * CLHEP::MeV));
178 FERMI_ADD_FRAGMENT(G4FermiStableFragment(13_m, 6_c, 2, 3.09 * CLHEP::MeV));
179 FERMI_ADD_FRAGMENT(G4FermiStableFragment(13_m, 6_c, 4, 3.68 * CLHEP::MeV));
180
181 FERMI_ADD_FRAGMENT(G4FermiStableFragment(13_m, 6_c, 6, 3.85 * CLHEP::MeV));
182 FERMI_ADD_FRAGMENT(G4FermiStableFragment(13_m, 7_c, 2, 0.00 * CLHEP::MeV));
183 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 6_c, 1, 0.00 * CLHEP::MeV));
184 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 6_c, 3, 6.09 * CLHEP::MeV));
185 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 6_c, 8, 6.69 * CLHEP::MeV));
186 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 6_c, 6, 6.96 * CLHEP::MeV));
187 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 6_c, 5, 7.34 * CLHEP::MeV));
188 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 3, 0.00 * CLHEP::MeV));
189 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 1, 2.31 * CLHEP::MeV));
190 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 3, 3.95 * CLHEP::MeV));
191
192 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 1, 4.92 * CLHEP::MeV));
193 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 5, 5.11 * CLHEP::MeV));
194 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 3, 5.69 * CLHEP::MeV));
195 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 7, 5.83 * CLHEP::MeV));
196 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 3, 6.20 * CLHEP::MeV));
197 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 7, 6.44 * CLHEP::MeV));
198 FERMI_ADD_FRAGMENT(G4FermiStableFragment(14_m, 7_c, 5, 7.03 * CLHEP::MeV));
199 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 2, 0.00 * CLHEP::MeV));
200 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 8, 5.28 * CLHEP::MeV));
201 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 4, 6.32 * CLHEP::MeV));
202
203 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 10, 7.22 * CLHEP::MeV));
204 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 8, 7.57 * CLHEP::MeV));
205 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 2, 8.31 * CLHEP::MeV));
206 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 4, 8.57 * CLHEP::MeV));
207 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 14, 9.15 * CLHEP::MeV));
208 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 14, 9.79 * CLHEP::MeV));
209 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 7_c, 8, 10.00 * CLHEP::MeV));
210 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 8_c, 2, 0.00 * CLHEP::MeV));
211 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 8_c, 8, 5.22 * CLHEP::MeV));
212 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 8_c, 4, 6.18 * CLHEP::MeV));
213
214 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 8_c, 10, 6.83 * CLHEP::MeV));
215 FERMI_ADD_FRAGMENT(G4FermiStableFragment(15_m, 8_c, 8, 7.28 * CLHEP::MeV));
216 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 7_c, 5, 0.00 * CLHEP::MeV));
217 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 7_c, 1, 0.12 * CLHEP::MeV));
218 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 7_c, 7, 0.30 * CLHEP::MeV));
219 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 7_c, 3, 0.40 * CLHEP::MeV));
220 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 8_c, 1, 0.00 * CLHEP::MeV));
221 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 8_c, 8, 6.10 * CLHEP::MeV));
222 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 8_c, 5, 6.92 * CLHEP::MeV));
223 FERMI_ADD_FRAGMENT(G4FermiStableFragment(16_m, 8_c, 3, 7.12 * CLHEP::MeV));
224
225#undef FERMI_ADD_FRAGMENT
226#undef FERMI_ADD_FRAGMENT_IMPL
227#undef FERMI_INSTANTIATE_MACRO
228#undef FERMI_CONCAT
229}
230
232{
233 for (auto & fragmentPtr : *this) {
234 fragmentPtr->Initialize();
235 }
236}
#define FERMI_ADD_FRAGMENT(VALUE)
IteratorRange GetFragments(G4FermiAtomicMass atomicMass, G4FermiChargeNumber chargeNumber) const
std::size_t Count(G4FermiAtomicMass atomicMass, G4FermiChargeNumber chargeNumber) const
void Initialize(const DataSource &dataSource)
void AddFragment(const G4VFermiFragmentAN &fragment)
G4FermiChargeNumber GetChargeNumber() const
G4FermiAtomicMass GetAtomicMass() const