1 //! \file constants.h
2 //! A collection of constants
3 
4 #ifndef OPENMC_CONSTANTS_H
5 #define OPENMC_CONSTANTS_H
6 
7 #include <cmath>
8 #include <limits>
9 
10 #include "openmc/array.h"
11 #include "openmc/vector.h"
12 #include "openmc/version.h"
13 
14 namespace openmc {
15 
16 using double_2dvec = vector<vector<double>>;
17 using double_3dvec = vector<vector<vector<double>>>;
18 using double_4dvec = vector<vector<vector<vector<double>>>>;
19 
20 // ============================================================================
21 // VERSIONING NUMBERS
22 
23 // HDF5 data format
24 constexpr int HDF5_VERSION[] {3, 0};
25 
26 // Version numbers for binary files
27 constexpr array<int, 2> VERSION_STATEPOINT {17, 0};
28 constexpr array<int, 2> VERSION_PARTICLE_RESTART {2, 0};
29 constexpr array<int, 2> VERSION_TRACK {2, 0};
30 constexpr array<int, 2> VERSION_SUMMARY {6, 0};
31 constexpr array<int, 2> VERSION_VOLUME {1, 0};
32 constexpr array<int, 2> VERSION_VOXEL {2, 0};
33 constexpr array<int, 2> VERSION_MGXS_LIBRARY {1, 0};
34 
35 // ============================================================================
36 // ADJUSTABLE PARAMETERS
37 
38 // NOTE: This is the only section of the constants module that should ever be
39 // adjusted. Modifying constants in other sections may cause the code to fail.
40 
41 // Monoatomic ideal-gas scattering treatment threshold
42 constexpr double FREE_GAS_THRESHOLD {400.0};
43 
44 // Significance level for confidence intervals
45 constexpr double CONFIDENCE_LEVEL {0.95};
46 
47 // Used for surface current tallies
48 constexpr double TINY_BIT {1e-8};
49 
50 // User for precision in geometry
51 constexpr double FP_PRECISION {1e-14};
52 constexpr double FP_REL_PRECISION {1e-5};
53 constexpr double FP_COINCIDENT {1e-12};
54 
55 // Maximum number of collisions/crossings
56 constexpr int MAX_EVENTS {1000000};
57 constexpr int MAX_SAMPLE {100000};
58 
59 // Maximum number of words in a single line, length of line, and length of
60 // single word
61 constexpr int MAX_LINE_LEN {250};
62 constexpr int MAX_WORD_LEN {150};
63 
64 // Maximum number of external source spatial resamples to encounter before an
65 // error is thrown.
66 constexpr int EXTSRC_REJECT_THRESHOLD {10000};
67 constexpr double EXTSRC_REJECT_FRACTION {0.05};
68 
69 // ============================================================================
70 // MATH AND PHYSICAL CONSTANTS
71 
72 // TODO: replace with <numbers> when we go for C++20
73 constexpr double PI {3.141592653589793238462643383279502884L};
74 const double SQRT_PI {std::sqrt(PI)};
75 constexpr double INFTY {std::numeric_limits<double>::max()};
76 
77 // Values here are from the Committee on Data for Science and Technology
78 // (CODATA) 2018 recommendation (https://physics.nist.gov/cuu/Constants/).
79 
80 // Physical constants
81 constexpr double MASS_NEUTRON     {1.00866491595}; // mass of a neutron in amu
82 constexpr double MASS_NEUTRON_EV  {939.56542052e6}; // mass of a neutron in eV/c^2
83 constexpr double MASS_PROTON      {1.007276466621}; // mass of a proton in amu
84 constexpr double MASS_ELECTRON_EV {0.51099895000e6}; // electron mass energy equivalent in eV/c^2
85 constexpr double FINE_STRUCTURE   {137.035999084}; // inverse fine structure constant
86 constexpr double PLANCK_C         {1.2398419839593942e4}; // Planck's constant times c in eV-Angstroms
87 constexpr double AMU              {1.66053906660e-27}; // 1 amu in kg
88 constexpr double C_LIGHT          {2.99792458e8}; // speed of light in m/s
89 constexpr double N_AVOGADRO       {0.602214076}; // Avogadro's number in 10^24/mol
90 constexpr double K_BOLTZMANN      {8.617333262e-5}; // Boltzmann constant in eV/K
91 
92 // Electron subshell labels
93 constexpr array<const char*, 39> SUBSHELLS = {"K", "L1", "L2", "L3", "M1", "M2",
94   "M3", "M4", "M5", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "O1", "O2", "O3",
95   "O4", "O5", "O6", "O7", "O8", "O9", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
96   "P8", "P9", "P10", "P11", "Q1", "Q2", "Q3"};
97 
98 // Void material and nuclide
99 // TODO: refactor and remove
100 constexpr int MATERIAL_VOID {-1};
101 constexpr int NUCLIDE_NONE  {-1};
102 
103 // ============================================================================
104 // CROSS SECTION RELATED CONSTANTS
105 
106 // Temperature treatment method
107 enum class TemperatureMethod {
108   NEAREST,
109   INTERPOLATION
110 };
111 
112 // Reaction types
113 enum ReactionType {
114   REACTION_NONE = 0,
115   TOTAL_XS = 1,
116   ELASTIC = 2,
117   N_NONELASTIC = 3,
118   N_LEVEL = 4,
119   MISC    = 5,
120   N_2ND   = 11,
121   N_2N    = 16,
122   N_3N    = 17,
123   N_FISSION = 18,
124   N_F     = 19,
125   N_NF    = 20,
126   N_2NF   = 21,
127   N_NA    = 22,
128   N_N3A   = 23,
129   N_2NA   = 24,
130   N_3NA   = 25,
131   N_NP    = 28,
132   N_N2A   = 29,
133   N_2N2A  = 30,
134   N_ND    = 32,
135   N_NT    = 33,
136   N_N3HE  = 34,
137   N_ND2A  = 35,
138   N_NT2A  = 36,
139   N_4N    = 37,
140   N_3NF   = 38,
141   N_2NP   = 41,
142   N_3NP   = 42,
143   N_N2P   = 44,
144   N_NPA   = 45,
145   N_N1    = 51,
146   N_N40   = 90,
147   N_NC    = 91,
148   N_DISAPPEAR = 101,
149   N_GAMMA = 102,
150   N_P     = 103,
151   N_D     = 104,
152   N_T     = 105,
153   N_3HE   = 106,
154   N_A     = 107,
155   N_2A    = 108,
156   N_3A    = 109,
157   N_2P    = 111,
158   N_PA    = 112,
159   N_T2A   = 113,
160   N_D2A   = 114,
161   N_PD    = 115,
162   N_PT    = 116,
163   N_DA    = 117,
164   N_5N    = 152,
165   N_6N    = 153,
166   N_2NT   = 154,
167   N_TA    = 155,
168   N_4NP   = 156,
169   N_3ND   = 157,
170   N_NDA   = 158,
171   N_2NPA  = 159,
172   N_7N    = 160,
173   N_8N    = 161,
174   N_5NP   = 162,
175   N_6NP   = 163,
176   N_7NP   = 164,
177   N_4NA   = 165,
178   N_5NA   = 166,
179   N_6NA   = 167,
180   N_7NA   = 168,
181   N_4ND   = 169,
182   N_5ND   = 170,
183   N_6ND   = 171,
184   N_3NT   = 172,
185   N_4NT   = 173,
186   N_5NT   = 174,
187   N_6NT   = 175,
188   N_2N3HE = 176,
189   N_3N3HE = 177,
190   N_4N3HE = 178,
191   N_3N2P  = 179,
192   N_3N2A  = 180,
193   N_3NPA  = 181,
194   N_DT    = 182,
195   N_NPD   = 183,
196   N_NPT   = 184,
197   N_NDT   = 185,
198   N_NP3HE = 186,
199   N_ND3HE = 187,
200   N_NT3HE = 188,
201   N_NTA   = 189,
202   N_2N2P  = 190,
203   N_P3HE  = 191,
204   N_D3HE  = 192,
205   N_3HEA  = 193,
206   N_4N2P  = 194,
207   N_4N2A  = 195,
208   N_4NPA  = 196,
209   N_3P    = 197,
210   N_N3P   = 198,
211   N_3N2PA = 199,
212   N_5N2P  = 200,
213   N_XP    = 203,
214   N_XD    = 204,
215   N_XT    = 205,
216   N_X3HE  = 206,
217   N_XA    = 207,
218   HEATING = 301,
219   DAMAGE_ENERGY = 444,
220   COHERENT = 502,
221   INCOHERENT = 504,
222   PAIR_PROD_ELEC = 515,
223   PAIR_PROD = 516,
224   PAIR_PROD_NUC = 517,
225   PHOTOELECTRIC = 522,
226   N_P0    = 600,
227   N_PC    = 649,
228   N_D0    = 650,
229   N_DC    = 699,
230   N_T0    = 700,
231   N_TC    = 749,
232   N_3HE0  = 750,
233   N_3HEC  = 799,
234   N_A0    = 800,
235   N_AC    = 849,
236   N_2N0   = 875,
237   N_2NC   = 891,
238   HEATING_LOCAL = 901
239 };
240 
241 constexpr array<int, 6> DEPLETION_RX {N_GAMMA, N_P, N_A, N_2N, N_3N, N_4N};
242 
243 enum class URRTableParam {
244   CUM_PROB,
245   TOTAL,
246   ELASTIC,
247   FISSION,
248   N_GAMMA,
249   HEATING
250 };
251 
252 // Maximum number of partial fission reactions
253 constexpr int PARTIAL_FISSION_MAX {4};
254 
255 // Resonance elastic scattering methods
256 enum class ResScatMethod {
257   rvs, // Relative velocity sampling
258   dbrc, // Doppler broadening rejection correction
259   cxs // Constant cross section
260 };
261 
262 enum class ElectronTreatment {
263   LED, // Local Energy Deposition
264   TTB  // Thick Target Bremsstrahlung
265 };
266 
267 // ============================================================================
268 // MULTIGROUP RELATED
269 
270 // Flag to denote this was a macroscopic data object
271 constexpr double MACROSCOPIC_AWR {-2.};
272 
273 // Number of mu bins to use when converting Legendres to tabular type
274 constexpr int DEFAULT_NMU {33};
275 
276 // Mgxs::get_xs enumerated types
277 enum class MgxsType {
278   TOTAL,
279   ABSORPTION,
280   INVERSE_VELOCITY,
281   DECAY_RATE,
282   NU_SCATTER,
283   SCATTER,
284   NU_SCATTER_FMU,
285   SCATTER_FMU,
286   FISSION,
287   KAPPA_FISSION,
288   PROMPT_NU_FISSION,
289   DELAYED_NU_FISSION,
290   NU_FISSION,
291   CHI_PROMPT,
292   CHI_DELAYED
293 };
294 
295 // ============================================================================
296 // TALLY-RELATED CONSTANTS
297 
298 enum class TallyResult {
299   VALUE,
300   SUM,
301   SUM_SQ
302 };
303 
304 enum class TallyType {
305   VOLUME,
306   MESH_SURFACE,
307   SURFACE
308 };
309 
310 enum class TallyEstimator {
311   ANALOG,
312   TRACKLENGTH,
313   COLLISION
314 };
315 
316 enum class TallyEvent {
317   SURFACE,
318   LATTICE,
319   KILL,
320   SCATTER,
321   ABSORB
322 };
323 
324 // Tally score type -- if you change these, make sure you also update the
325 // _SCORES dictionary in openmc/capi/tally.py
326 //
327 // These are kept as a normal enum and made negative, since variables which
328 // store one of these enum values usually also may be responsible for storing
329 // MT numbers from the long enum above.
330 enum TallyScore {
331   SCORE_FLUX = -1, // flux
332   SCORE_TOTAL = -2, // total reaction rate
333   SCORE_SCATTER = -3, // scattering rate
334   SCORE_NU_SCATTER = -4, // scattering production rate
335   SCORE_ABSORPTION = -5, // absorption rate
336   SCORE_FISSION = -6, // fission rate
337   SCORE_NU_FISSION = -7, // neutron production rate
338   SCORE_KAPPA_FISSION = -8, // fission energy production rate
339   SCORE_CURRENT = -9, // current
340   SCORE_EVENTS = -10, // number of events
341   SCORE_DELAYED_NU_FISSION = -11, // delayed neutron production rate
342   SCORE_PROMPT_NU_FISSION = -12, // prompt neutron production rate
343   SCORE_INVERSE_VELOCITY = -13, // flux-weighted inverse velocity
344   SCORE_FISS_Q_PROMPT = -14, // prompt fission Q-value
345   SCORE_FISS_Q_RECOV = -15, // recoverable fission Q-value
346   SCORE_DECAY_RATE = -16 // delayed neutron precursor decay rate
347 };
348 
349 // Global tally parameters
350 constexpr int N_GLOBAL_TALLIES {4};
351 enum class GlobalTally {
352   K_COLLISION,
353   K_ABSORPTION,
354   K_TRACKLENGTH,
355   LEAKAGE
356 };
357 
358 // Miscellaneous
359 constexpr int C_NONE {-1};
360 constexpr int F90_NONE {0}; //TODO: replace usage of this with C_NONE
361 
362 // Interpolation rules
363 enum class Interpolation {
364   histogram = 1, lin_lin = 2, lin_log = 3, log_lin = 4, log_log = 5
365 };
366 
367 enum class RunMode {
368   UNSET, // default value, OpenMC throws error if left to this
369   FIXED_SOURCE,
370   EIGENVALUE,
371   PLOTTING,
372   PARTICLE,
373   VOLUME
374 };
375 
376 // ============================================================================
377 // CMFD CONSTANTS
378 
379 // For non-accelerated regions on coarse mesh overlay
380 constexpr int CMFD_NOACCEL {-1};
381 
382 } // namespace openmc
383 
384 #endif // OPENMC_CONSTANTS_H
385