mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-22 06:55:35 -04:00
100 lines
No EOL
3.3 KiB
Python
100 lines
No EOL
3.3 KiB
Python
from difflib import unified_diff
|
|
import glob
|
|
import filecmp
|
|
import os
|
|
from pathlib import Path
|
|
|
|
import openmc
|
|
import pytest
|
|
|
|
from tests.testing_harness import PyAPITestHarness, colorize
|
|
|
|
# use a few models from other tests to make sure the same results are
|
|
# produced when using a single model.xml file as input
|
|
from ..adj_cell_rotation.test import model as adj_cell_rotation_model
|
|
from ..lattice_multiple.test import model as lattice_multiple_model
|
|
from ..energy_laws.test import model as energy_laws_model
|
|
from ..photon_production.test import model as photon_production_model
|
|
|
|
|
|
class ModelXMLTestHarness(PyAPITestHarness):
|
|
"""Accept a results file to check against and assume inputs_true is the contents of a model.xml file.
|
|
"""
|
|
def __init__(self, model=None, inputs_true=None, results_true=None):
|
|
statepoint_name = f'statepoint.{model.settings.batches}.h5'
|
|
super().__init__(statepoint_name, model, inputs_true)
|
|
|
|
self.results_true = 'results_true.dat' if results_true is None else results_true
|
|
|
|
def _build_inputs(self):
|
|
self._model.export_to_model_xml()
|
|
|
|
def _get_inputs(self):
|
|
return open('model.xml').read()
|
|
|
|
def _compare_results(self):
|
|
"""Make sure the current results agree with the reference."""
|
|
compare = filecmp.cmp('results_test.dat', self.results_true)
|
|
if not compare:
|
|
expected = open(self.results_true).readlines()
|
|
actual = open('results_test.dat').readlines()
|
|
diff = unified_diff(expected, actual, self.results_true,
|
|
'results_test.dat')
|
|
print('Result differences:')
|
|
print(''.join(colorize(diff)))
|
|
os.rename('results_test.dat', 'results_error.dat')
|
|
assert compare, 'Results do not agree'
|
|
|
|
def _cleanup(self):
|
|
super()._cleanup()
|
|
if os.path.exists('model.xml'):
|
|
os.remove('model.xml')
|
|
|
|
|
|
test_names = [
|
|
'adj_cell_rotation',
|
|
'lattice_multiple',
|
|
'energy_laws',
|
|
'photon_production'
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize("test_name", test_names, ids=lambda test: test)
|
|
def test_model_xml(test_name, request):
|
|
openmc.reset_auto_ids()
|
|
|
|
test_path = '../' + test_name
|
|
results = test_path + "/results_true.dat"
|
|
inputs = test_name + "_inputs_true.dat"
|
|
model_name = test_name + "_model"
|
|
harness = ModelXMLTestHarness(request.getfixturevalue(model_name), inputs, results)
|
|
harness.main()
|
|
|
|
def test_input_arg(run_in_tmpdir):
|
|
|
|
pincell = openmc.examples.pwr_pin_cell()
|
|
|
|
pincell.settings.particles = 100
|
|
|
|
# export to separate XML files and run
|
|
pincell.export_to_xml()
|
|
openmc.run()
|
|
|
|
# make sure the executable isn't falling back on the separate XMLs
|
|
for f in glob.glob('*.xml'):
|
|
os.remove(f)
|
|
# now export to a single XML file with a custom name
|
|
pincell.export_to_model_xml('pincell.xml')
|
|
assert Path('pincell.xml').exists()
|
|
|
|
# run by specifying that single file
|
|
openmc.run(path_input='pincell.xml')
|
|
|
|
# check that this works for plotting too
|
|
openmc.plot_geometry(path_input='pincell.xml')
|
|
|
|
# now ensure we get an error for an incorrect filename,
|
|
# even in the presence of other, valid XML files
|
|
pincell.export_to_model_xml()
|
|
with pytest.raises(RuntimeError, match='ex-em-ell.xml'):
|
|
openmc.run(path_input='ex-em-ell.xml') |