Skip to content

Commit 2c15480

Browse files
authored
Add user setting for free gas threshold (#3593)
1 parent 50071aa commit 2c15480

8 files changed

Lines changed: 49 additions & 8 deletions

File tree

docs/source/io_formats/settings.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,16 @@ history-based parallelism.
178178

179179
*Default*: false
180180

181+
--------------------------------
182+
``<free_gas_threshold>`` Element
183+
--------------------------------
184+
185+
The ``<free_gas_threshold>`` element specifies the energy multiplier, expressed
186+
in units of :math:`kT`, that determines when the free gas scattering approach is
187+
used for elastic scattering. Values must be positive.
188+
189+
*Default*: 400.0
190+
181191
-----------------------------------
182192
``<generations_per_batch>`` Element
183193
-----------------------------------

include/openmc/physics.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,6 @@
1010

1111
namespace openmc {
1212

13-
//==============================================================================
14-
// Constants
15-
//==============================================================================
16-
17-
// Monoatomic ideal-gas scattering treatment threshold
18-
constexpr double FREE_GAS_THRESHOLD {400.0};
19-
2013
//==============================================================================
2114
// Non-member functions
2215
//==============================================================================

include/openmc/settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ extern std::unordered_set<int>
147147
source_write_surf_id; //!< Surface ids where sources will be written
148148
extern double source_rejection_fraction; //!< Minimum fraction of source sites
149149
//!< that must be accepted
150+
extern double free_gas_threshold; //!< Threshold multiplier for free gas
151+
//!< scattering treatment
150152

151153
extern int
152154
max_history_splits; //!< maximum number of particle splits for weight windows

openmc/settings.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ class Settings:
8484
history-based parallelism.
8585
8686
.. versionadded:: 0.12
87+
free_gas_threshold : float
88+
Energy multiplier (in units of :math:`kT`) below which the free gas
89+
scattering treatment is applied for elastic scattering. If not
90+
specified, a value of 400.0 is used.
8791
generations_per_batch : int
8892
Number of generations per batch
8993
ifp_n_generation : int
@@ -376,6 +380,7 @@ def __init__(self, **kwargs):
376380
self._seed = None
377381
self._stride = None
378382
self._survival_biasing = None
383+
self._free_gas_threshold = None
379384

380385
# Shannon entropy mesh
381386
self._entropy_mesh = None
@@ -1255,6 +1260,17 @@ def source_rejection_fraction(self, source_rejection_fraction: float):
12551260
cv.check_less_than('source_rejection_fraction', source_rejection_fraction, 1)
12561261
self._source_rejection_fraction = source_rejection_fraction
12571262

1263+
@property
1264+
def free_gas_threshold(self) -> float | None:
1265+
return self._free_gas_threshold
1266+
1267+
@free_gas_threshold.setter
1268+
def free_gas_threshold(self, free_gas_threshold: float | None):
1269+
if free_gas_threshold is not None:
1270+
cv.check_type('free gas threshold', free_gas_threshold, Real)
1271+
cv.check_greater_than('free gas threshold', free_gas_threshold, 0.0)
1272+
self._free_gas_threshold = free_gas_threshold
1273+
12581274
def _create_run_mode_subelement(self, root):
12591275
elem = ET.SubElement(root, "run_mode")
12601276
elem.text = self._run_mode.value
@@ -1733,6 +1749,11 @@ def _create_source_rejection_fraction_subelement(self, root):
17331749
element = ET.SubElement(root, "source_rejection_fraction")
17341750
element.text = str(self._source_rejection_fraction)
17351751

1752+
def _create_free_gas_threshold_subelement(self, root):
1753+
if self._free_gas_threshold is not None:
1754+
element = ET.SubElement(root, "free_gas_threshold")
1755+
element.text = str(self._free_gas_threshold)
1756+
17361757
def _eigenvalue_from_xml_element(self, root):
17371758
elem = root.find('eigenvalue')
17381759
if elem is not None:
@@ -2171,6 +2192,11 @@ def _source_rejection_fraction_from_xml_element(self, root):
21712192
if text is not None:
21722193
self.source_rejection_fraction = float(text)
21732194

2195+
def _free_gas_threshold_from_xml_element(self, root):
2196+
text = get_text(root, 'free_gas_threshold')
2197+
if text is not None:
2198+
self.free_gas_threshold = float(text)
2199+
21742200
def to_xml_element(self, mesh_memo=None):
21752201
"""Create a 'settings' element to be written to an XML file.
21762202
@@ -2241,6 +2267,7 @@ def to_xml_element(self, mesh_memo=None):
22412267
self._create_random_ray_subelement(element, mesh_memo)
22422268
self._create_use_decay_photons_subelement(element)
22432269
self._create_source_rejection_fraction_subelement(element)
2270+
self._create_free_gas_threshold_subelement(element)
22442271

22452272
# Clean the indentation in the file to be user-readable
22462273
clean_indentation(element)
@@ -2352,6 +2379,7 @@ def from_xml_element(cls, elem, meshes=None):
23522379
settings._random_ray_from_xml_element(elem, meshes)
23532380
settings._use_decay_photons_from_xml_element(elem)
23542381
settings._source_rejection_fraction_from_xml_element(elem)
2382+
settings._free_gas_threshold_from_xml_element(elem)
23552383

23562384
return settings
23572385

src/finalize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ int openmc_finalize()
8585
settings::time_cutoff = {INFTY, INFTY, INFTY, INFTY};
8686
settings::entropy_on = false;
8787
settings::event_based = false;
88+
settings::free_gas_threshold = 400.0;
8889
settings::gen_per_batch = 1;
8990
settings::legendre_to_tabular = true;
9091
settings::legendre_to_tabular_points = -1;

src/physics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ Direction sample_target_velocity(const Nuclide& nuc, double E, Direction u,
851851

852852
// otherwise, use free gas model
853853
} else {
854-
if (E >= FREE_GAS_THRESHOLD * kT && nuc.awr_ > 1.0) {
854+
if (E >= settings::free_gas_threshold * kT && nuc.awr_ > 1.0) {
855855
return {};
856856
} else {
857857
sampling_method = ResScatMethod::cxs;

src/settings.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ SolverType solver_type {SolverType::MONTE_CARLO};
126126
std::unordered_set<int> sourcepoint_batch;
127127
std::unordered_set<int> statepoint_batch;
128128
double source_rejection_fraction {0.05};
129+
double free_gas_threshold {400.0};
129130
std::unordered_set<int> source_write_surf_id;
130131
int64_t ssw_max_particles;
131132
int64_t ssw_max_files;
@@ -651,6 +652,10 @@ void read_settings_xml(pugi::xml_node root)
651652
std::stod(get_node_value(root, "source_rejection_fraction"));
652653
}
653654

655+
if (check_for_node(root, "free_gas_threshold")) {
656+
free_gas_threshold = std::stod(get_node_value(root, "free_gas_threshold"));
657+
}
658+
654659
// Survival biasing
655660
if (check_for_node(root, "survival_biasing")) {
656661
survival_biasing = get_node_value_bool(root, "survival_biasing");

tests/unit_tests/test_settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def test_export_to_xml(run_in_tmpdir):
8080
s.max_particle_events = 100
8181
s.max_secondaries = 1_000_000
8282
s.source_rejection_fraction = 0.01
83+
s.free_gas_threshold = 800.0
8384

8485
# Make sure exporting XML works
8586
s.export_to_xml()
@@ -170,3 +171,4 @@ def test_export_to_xml(run_in_tmpdir):
170171
assert s.random_ray['sample_method'] == 'halton'
171172
assert s.max_secondaries == 1_000_000
172173
assert s.source_rejection_fraction == 0.01
174+
assert s.free_gas_threshold == 800.0

0 commit comments

Comments
 (0)