From e653feb960766d7d59d907c4b986f4e8df230576 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Tue, 30 Jul 2024 16:53:16 -0400 Subject: [PATCH 01/26] first attempt of merging filename and path --- src/openmc_fusion_benchmarks/read_results.py | 73 +++++++++----------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/src/openmc_fusion_benchmarks/read_results.py b/src/openmc_fusion_benchmarks/read_results.py index 81d4d66f..6f93de60 100644 --- a/src/openmc_fusion_benchmarks/read_results.py +++ b/src/openmc_fusion_benchmarks/read_results.py @@ -7,8 +7,8 @@ _del_columns = ['cell', 'particle', 'nuclide', 'score', 'energyfunction'] -def to_hdf(df: pd.DataFrame, hdf_file: str, tally_name: str, xs_library: str = None, - xaxis_name: str = None, path_to_folder: str = '', +def to_hdf(df: pd.DataFrame, file: str, tally_name: str, xs_library: str = None, + xaxis_name: str = None, when: str = 'n/a', where: str = 'n/a', code_version: str = None, batches: int = None, particles_per_batch: int = None, literature: int = 'n/a'): """Stores a DataFrame to a given hdf5 file. Useful function to generate new @@ -18,8 +18,8 @@ def to_hdf(df: pd.DataFrame, hdf_file: str, tally_name: str, xs_library: str = N ---------- df : pd.DataFrame DataFrame of results to store in the hdf5 file - hdf_file : str - name of the hdf5 file of results + file : str + name of the hdf5 file of results. Can include the path to the file tally_name : str name of the tally to store xs_library : str, optional @@ -28,9 +28,6 @@ def to_hdf(df: pd.DataFrame, hdf_file: str, tally_name: str, xs_library: str = N xaxis_name : str, optional name of the x_axis to store in order to be retrieved with the ResultsFromDatabase.get_tally_xaxis method, by default None - path_to_folder : str, optional - path to the folder where the hdf5 file is/has to be stored, - by default '' when : str, optional Can be the year(s) (YYYY-YYYY) or the month and year (Month, YYYY) of the model run, by default 'n/a' @@ -50,15 +47,13 @@ def to_hdf(df: pd.DataFrame, hdf_file: str, tally_name: str, xs_library: str = N by default None """ - path = Path(path_to_folder) - # merge path to hdf file - path_to_file = path / hdf_file + filepath = Path(file) # write the tally in the hdf file - df.to_hdf(path_to_file, tally_name, mode='a', + df.to_hdf(filepath, tally_name, mode='a', format='table', data_columns=True, index=False) # write attributes to the hdf file - with h5py.File(path_to_file, 'a') as f: + with h5py.File(filepath, 'a') as f: f[tally_name + '/table'].attrs['x_axis'] = xaxis_name f.attrs['when'] = str(when) f.attrs['where'] = where @@ -110,27 +105,23 @@ class ResultsFromDatabase: that have been stored there. """ - def __init__(self, filename: str, path: str = ''): + def __init__(self, file: str): """ResultsFromDatabase class constructor Parameters ---------- - filename : str - Name of the hdf file present in the results_database folder - path : str, optional - path to the hdf file, by default 'results_database' + file : str + Name of the hdf file present in the results_database folder. + Can include the path to the file """ - self.filename = filename - source_folder = Path(path) - - # merge path to the file - self._myfile = source_folder / filename + self.filename = file.strip().split('/') + self.filepath = Path(file) def list_tallies(self): """Prints the names of all the tallies available in the hdf file """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: print(f.keys()) def get_tally_dataframe(self, tally_name: str) -> pd.DataFrame: @@ -148,7 +139,7 @@ def get_tally_dataframe(self, tally_name: str) -> pd.DataFrame: pd.DataFrame DataFrame with tally results """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: df = pd.DataFrame(f[tally_name+'/table'][()]).drop(columns='index') # decode hdf5 strings to strings if necessary try: @@ -177,7 +168,7 @@ def get_tally_xaxis(self, tally_name: str) -> str: str Name used for the dataframe column with the x-axis info """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: return f[tally_name+'/table'].attrs['x_axis'] @property @@ -190,7 +181,7 @@ def literature_info(self) -> str: str DOI or link to the publication """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: try: return f.attrs['literature'] except KeyError: @@ -205,7 +196,7 @@ def when(self) -> str: str Experiment or simulation execution year """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: try: return f.attrs['when'] except KeyError: @@ -220,7 +211,7 @@ def where(self) -> str: str Experiment or simulation execution place """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: try: return f.attrs['where'] except KeyError: @@ -236,7 +227,7 @@ def code_version(self) -> str: str Code version """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: try: return f.attrs['code_version'] except KeyError: @@ -252,7 +243,7 @@ def xs_library(self) -> str: str Nuclear data library name """ - with h5py.File(self._myfile) as f: + with h5py.File(self.filepath) as f: try: return f.attrs['xs_library'] except KeyError: @@ -283,22 +274,19 @@ class ResultsFromOpenmc: results_database folder it is necessary to use ResultsFromDatabase class. """ - def __init__(self, statepoint_file: str = 'statepoint.100.h5', path: str = 'results'): + def __init__(self, file: str = 'statepoint.100.h5'): """ResultsFromOpenmc class constructor. Parameters ---------- - statepoint_file : str, optional - name of the statepoint.h5 file, by default 'statepoint.100.h5' - path : str, optional - path to the hdf file, by default 'results' + file : str, optional + name of the statepoint.h5 file. Can include the path to the file, + by default 'statepoint.100.h5' """ - self.statepoint_file = statepoint_file - source_folder = Path(path) - # merge path to statepoint file - self._myfile = source_folder / statepoint_file + self.filename = file.strip().split('/') + self.filepath = Path(file) # open statepoint file with openmc - self.statepoint = openmc.StatePoint(self._myfile) + self.statepoint = openmc.StatePoint(self.filepath) def list_tallies(self): """Prints the names of all the tallies available in the statepoint.h5 @@ -399,8 +387,9 @@ def tally_to_hdf(self, tally_name: str, normalize_over: Iterable, xs_library: st Name of the institution that run the simulation """ - hdf_file = build_hdf_filename( + filename = build_hdf_filename( 'openmc', self.get_openmc_version, xs_library) + file = path_to_database + '/' + filename # extract tally in dataframe format from statepoint file tally_df = self.get_tally_dataframe( @@ -417,6 +406,6 @@ def tally_to_hdf(self, tally_name: str, normalize_over: Iterable, xs_library: st code_version = 'openmc-' + '.'.join(map(str, self.get_openmc_version)) - to_hdf(tally_df, hdf_file, tally_name, xs_library, xaxis_name, + to_hdf(tally_df, file, tally_name, xs_library, xaxis_name, path_to_database, when, where, code_version, self.get_batches, self.get_particles_per_batch, literature) From 653a27f61c8d6a9586cfbcb1cbb71d8ef78302e1 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Tue, 30 Jul 2024 17:01:05 -0400 Subject: [PATCH 02/26] fixed all tutorial notebooks --- notebooks/plotting_results.ipynb | 4 +-- notebooks/push_openmc_to_database.ipynb | 4 +-- notebooks/read_database_hdf.ipynb | 26 ++++++++++---------- notebooks/read_openmc_statepoints.ipynb | 2 +- src/openmc_fusion_benchmarks/read_results.py | 5 ++-- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/notebooks/plotting_results.ipynb b/notebooks/plotting_results.ipynb index fcf9af8e..8343ebe7 100644 --- a/notebooks/plotting_results.ipynb +++ b/notebooks/plotting_results.ipynb @@ -33,10 +33,10 @@ "outputs": [], "source": [ "# experimental results\n", - "experiment_file = ofb.ResultsFromDatabase(filename='experiment.h5', path='example_database')\n", + "experiment_file = ofb.ResultsFromDatabase(file='example_database/experiment.h5')\n", "experiment_results = experiment_file.get_tally_dataframe(tally_name='rr_nb93')\n", "# mcnp results \n", - "mcnp_file = ofb.ResultsFromDatabase('mcnp-4b-c_fendl2.h5', path='example_database')\n", + "mcnp_file = ofb.ResultsFromDatabase(file='example_database/mcnp-4b-c_fendl2.h5')\n", "mcnp_results = mcnp_file.get_tally_dataframe(tally_name='rr_nb93')" ] }, diff --git a/notebooks/push_openmc_to_database.ipynb b/notebooks/push_openmc_to_database.ipynb index c505af41..c3d370c8 100644 --- a/notebooks/push_openmc_to_database.ipynb +++ b/notebooks/push_openmc_to_database.ipynb @@ -31,7 +31,7 @@ "metadata": {}, "outputs": [], "source": [ - "openmc_results = ofb.ResultsFromOpenmc(statepoint_file='example_statepoint.100.h5', path='example_results')" + "openmc_results = ofb.ResultsFromOpenmc(file='example_results/example_statepoint.100.h5')" ] }, { @@ -472,7 +472,7 @@ } ], "source": [ - "openmc_file = ofb.ResultsFromDatabase(filename='openmc-0-13-3_fendl32b.h5', path='example_database')\n", + "openmc_file = ofb.ResultsFromDatabase(file='example_database/openmc-0-13-3_fendl32b.h5')\n", "openmc_file.get_tally_dataframe(tally_name='rr_onaxis1_nb93')" ] }, diff --git a/notebooks/read_database_hdf.ipynb b/notebooks/read_database_hdf.ipynb index 0a4e1ff8..eff54a48 100644 --- a/notebooks/read_database_hdf.ipynb +++ b/notebooks/read_database_hdf.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -23,17 +23,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "First we need to instantiate a `ResultsFromDatabase` object by providing the name of the file to read (`filename`) and its path (`path`)." + "First we need to instantiate a `ResultsFromDatabase` object by providing the path to the file, including the name (`file`)." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "experiment_file = ofb.ResultsFromDatabase(filename='experiment.h5', path='example_database')\n", - "mcnp_fendl2_file = ofb.ResultsFromDatabase(filename='mcnp-4b-c_fendl2.h5', path='example_database')" + "experiment_file = ofb.ResultsFromDatabase(file='example_database/experiment.h5')\n", + "mcnp_fendl2_file = ofb.ResultsFromDatabase(file='example_database/mcnp-4b-c_fendl2.h5')" ] }, { @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -97,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -127,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -161,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -194,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -218,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -333,7 +333,7 @@ "10 11 NaN NaN" ] }, - "execution_count": 13, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -353,7 +353,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [ { diff --git a/notebooks/read_openmc_statepoints.ipynb b/notebooks/read_openmc_statepoints.ipynb index 9d2a062a..af3b0b06 100644 --- a/notebooks/read_openmc_statepoints.ipynb +++ b/notebooks/read_openmc_statepoints.ipynb @@ -38,7 +38,7 @@ "metadata": {}, "outputs": [], "source": [ - "statepoint = ofb.ResultsFromOpenmc(statepoint_file='example_statepoint.100.h5', path='example_results')" + "statepoint = ofb.ResultsFromOpenmc(file='example_results/example_statepoint.100.h5')" ] }, { diff --git a/src/openmc_fusion_benchmarks/read_results.py b/src/openmc_fusion_benchmarks/read_results.py index 6f93de60..10810dcb 100644 --- a/src/openmc_fusion_benchmarks/read_results.py +++ b/src/openmc_fusion_benchmarks/read_results.py @@ -406,6 +406,5 @@ def tally_to_hdf(self, tally_name: str, normalize_over: Iterable, xs_library: st code_version = 'openmc-' + '.'.join(map(str, self.get_openmc_version)) - to_hdf(tally_df, file, tally_name, xs_library, xaxis_name, - path_to_database, when, where, code_version, self.get_batches, - self.get_particles_per_batch, literature) + to_hdf(tally_df, file, tally_name, xs_library, xaxis_name, when, where, + code_version, self.get_batches, self.get_particles_per_batch, literature) From 6e595ffb8b5cb68c16fa4e74392ce3ef23b66ccf Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 1 Aug 2024 16:19:55 -0400 Subject: [PATCH 03/26] fng_str fixed --- models/fng_str/openmc_model.py | 4 +--- models/fng_str/postprocessing.ipynb | 14 +++++++------- models/fng_str/run_and_store.py | 6 +++--- src/openmc_fusion_benchmarks/read_results.py | 5 ++--- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/models/fng_str/openmc_model.py b/models/fng_str/openmc_model.py index 52a05635..0ba8e2a4 100644 --- a/models/fng_str/openmc_model.py +++ b/models/fng_str/openmc_model.py @@ -2177,13 +2177,11 @@ def main(): settings.batches = args.batches settings.particles = args.particles settings.source = source + settings.weight_windows = openmc.wwinp_to_wws("weight_windows.cadis.wwinp") if args.heating: settings.survival_biasing = True settings.photon_transport = True settings.electron_treatment = 'ttb' - settings.weight_windows = openmc.wwinp_to_wws("ww_heating.cadis.wwinp") - else: - settings.weight_windows = openmc.wwinp_to_wws("ww_rr.cadis.wwinp") settings.output = {'tallies': False} ############################################################################ diff --git a/models/fng_str/postprocessing.ipynb b/models/fng_str/postprocessing.ipynb index 9226bf83..876b24d1 100644 --- a/models/fng_str/postprocessing.ipynb +++ b/models/fng_str/postprocessing.ipynb @@ -39,10 +39,10 @@ "outputs": [], "source": [ "# read sinbad data\n", - "experiment_file = ofb.ResultsFromDatabase('experiment.h5', path='results_database')\n", - "mcnp_eff3_file = ofb.ResultsFromDatabase('mcnp-4a-b_eff3.h5', path='results_database')\n", - "mcnp_fendl1_file = ofb.ResultsFromDatabase('mcnp-4a-b_fendl1.h5', path='results_database')\n", - "mcnp_fendl2_file = ofb.ResultsFromDatabase('mcnp-4a-b_fendl2.h5', path='results_database')" + "experiment_file = ofb.ResultsFromDatabase('results_database/experiment.h5')\n", + "mcnp_eff3_file = ofb.ResultsFromDatabase('results_database/mcnp-4a-b_eff3.h5')\n", + "mcnp_fendl1_file = ofb.ResultsFromDatabase('results_database/mcnp-4a-b_fendl1.h5')\n", + "mcnp_fendl2_file = ofb.ResultsFromDatabase('results_database/mcnp-4a-b_fendl2.h5')" ] }, { @@ -52,9 +52,9 @@ "outputs": [], "source": [ "# read openmc results in results_database/\n", - "openmc_fendl3_file = ofb.ResultsFromDatabase('openmc-0-14-0_fendl32b.h5', path='results_database')\n", - "openmc_endfb8_file = ofb.ResultsFromDatabase('openmc-0-14-0_endfb80.h5', path='results_database')\n", - "openmc_jeff3_file = ofb.ResultsFromDatabase('openmc-0-14-0_jeff33.h5', path='results_database')" + "openmc_fendl3_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_fendl32b.h5')\n", + "openmc_endfb8_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_endfb80.h5')\n", + "openmc_jeff3_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_jeff33.h5')" ] }, { diff --git a/models/fng_str/run_and_store.py b/models/fng_str/run_and_store.py index 65c6071b..b1a8efe3 100644 --- a/models/fng_str/run_and_store.py +++ b/models/fng_str/run_and_store.py @@ -60,10 +60,10 @@ def main(): # read statepoint file onaxis_file = ofb.ResultsFromOpenmc( - 'statepoint.100.h5', 'reaction_rates_onaxis') + 'reaction_rates_onaxis/statepoint.100.h5') offaxis_file = ofb.ResultsFromOpenmc( - 'statepoint.100.h5', 'reaction_rates_offaxis') - heating_file = ofb.ResultsFromOpenmc('statepoint.100.h5', 'heating') + 'reaction_rates_offaxis/statepoint.100.h5') + heating_file = ofb.ResultsFromOpenmc('heating/statepoint.100.h5') # openmc hdf file filename = ofb.build_hdf_filename( diff --git a/src/openmc_fusion_benchmarks/read_results.py b/src/openmc_fusion_benchmarks/read_results.py index 10810dcb..79151b35 100644 --- a/src/openmc_fusion_benchmarks/read_results.py +++ b/src/openmc_fusion_benchmarks/read_results.py @@ -291,9 +291,8 @@ def __init__(self, file: str = 'statepoint.100.h5'): def list_tallies(self): """Prints the names of all the tallies available in the statepoint.h5 """ - sp = self.statepoint - for k in sp.tallies.keys(): - print(sp.tallies[k].name) + for k in self.statepoint.tallies.keys(): + print(self.statepoint.tallies[k].name) def get_tally_dataframe(self, tally_name: str, normalize_over: Iterable = None) -> pd.DataFrame: """Retrieves the results of a given tally in a Pandas DataFrame format. From 072662ba1a1ecdabed95bbb88cc343cb5cb9764f Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 1 Aug 2024 16:21:50 -0400 Subject: [PATCH 04/26] fixed fng_w --- models/fng_w/postprocessing.ipynb | 10 +++++----- models/fng_w/run_and_store.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/models/fng_w/postprocessing.ipynb b/models/fng_w/postprocessing.ipynb index 0bee8413..505efd0b 100644 --- a/models/fng_w/postprocessing.ipynb +++ b/models/fng_w/postprocessing.ipynb @@ -39,9 +39,9 @@ "outputs": [], "source": [ "# read sinbad data\n", - "experiment_file = ofb.ResultsFromDatabase('experiment.h5', path='results_database')\n", - "mcnp_eff2_file = ofb.ResultsFromDatabase('mcnp-4c_eff24.h5', path='results_database')\n", - "mcnp_fendl2_file = ofb.ResultsFromDatabase('mcnp-4c_fendl2.h5', path='results_database')" + "experiment_file = ofb.ResultsFromDatabase('results_database/experiment.h5')\n", + "mcnp_eff2_file = ofb.ResultsFromDatabase('results_database/mcnp-4c_eff24.h5')\n", + "mcnp_fendl2_file = ofb.ResultsFromDatabase('results_database/mcnp-4c_fendl2.h5')" ] }, { @@ -51,8 +51,8 @@ "outputs": [], "source": [ "# get openmc results\n", - "openmc_fendl3_file = ofb.ResultsFromDatabase('openmc-0-14-0_fendl32b.h5', path='results_database')\n", - "openmc_endfb8_file = ofb.ResultsFromDatabase('openmc-0-14-0_endfb80.h5', path='results_database')" + "openmc_fendl3_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_fendl32b.h5')\n", + "openmc_endfb8_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_endfb80.h5')" ] }, { diff --git a/models/fng_w/run_and_store.py b/models/fng_w/run_and_store.py index 1133d6f1..90287843 100644 --- a/models/fng_w/run_and_store.py +++ b/models/fng_w/run_and_store.py @@ -50,8 +50,8 @@ def main(): # read statepoint file reaction_rates_file = ofb.ResultsFromOpenmc( - 'statepoint.100.h5', 'reaction_rates') - heating_file = ofb.ResultsFromOpenmc('statepoint.100.h5', 'heating') + 'reaction_rates/statepoint.100.h5') + heating_file = ofb.ResultsFromOpenmc('heating/statepoint.100.h5') # generate openmc hdf file filename = ofb.build_hdf_filename( From a9e20a5d5a85c914b57748a880d33f1a1a4176f7 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 1 Aug 2024 16:29:24 -0400 Subject: [PATCH 05/26] fixed fns_clean_w --- models/fns_clean_w/postprocessing.ipynb | 4 ++-- models/fns_clean_w/run_and_store.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/fns_clean_w/postprocessing.ipynb b/models/fns_clean_w/postprocessing.ipynb index ce530b07..9dcff49b 100644 --- a/models/fns_clean_w/postprocessing.ipynb +++ b/models/fns_clean_w/postprocessing.ipynb @@ -44,7 +44,7 @@ "outputs": [], "source": [ "# read sinbad data\n", - "experiment_file = ofb.ResultsFromDatabase('experiment.h5', path='results_database')" + "experiment_file = ofb.ResultsFromDatabase('results_database/experiment.h5')" ] }, { @@ -54,7 +54,7 @@ "outputs": [], "source": [ "# read openmc results in results_database/\n", - "openmc_fendl3_file = ofb.ResultsFromDatabase('openmc-0-14-0_fendl32b.h5', path='results_database')" + "openmc_fendl3_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_fendl32b.h5')" ] }, { diff --git a/models/fns_clean_w/run_and_store.py b/models/fns_clean_w/run_and_store.py index 298bb614..908d0b79 100644 --- a/models/fns_clean_w/run_and_store.py +++ b/models/fns_clean_w/run_and_store.py @@ -45,7 +45,7 @@ def main(): p.wait() # read statepoint file - openmc_file = ofb.ResultsFromOpenmc('statepoint.100.h5', 'results') + openmc_file = ofb.ResultsFromOpenmc('results/statepoint.100.h5') # openmc hdf file filename = ofb.build_hdf_filename( From 8ac306e3c741bb25c0299ddb72d313ce96520c33 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 1 Aug 2024 16:31:14 -0400 Subject: [PATCH 06/26] fixed fns_duct --- models/fns_duct/postprocessing.ipynb | 10 +++++----- models/fns_duct/run_and_store.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/models/fns_duct/postprocessing.ipynb b/models/fns_duct/postprocessing.ipynb index ebc4c7e8..7fdb1525 100644 --- a/models/fns_duct/postprocessing.ipynb +++ b/models/fns_duct/postprocessing.ipynb @@ -41,9 +41,9 @@ "outputs": [], "source": [ "# read sinbad data\n", - "experiment_file = ofb.ResultsFromDatabase('experiment.h5', path='results_database')\n", - "mcnp_jendl33_file = ofb.ResultsFromDatabase('mcnp-4b-c_jendl33.h5', path='results_database')\n", - "mcnp_fendl2_file = ofb.ResultsFromDatabase('mcnp-4b-c_fendl2.h5', path='results_database')" + "experiment_file = ofb.ResultsFromDatabase('results_database/experiment.h5')\n", + "mcnp_jendl33_file = ofb.ResultsFromDatabase('results_database/mcnp-4b-c_jendl33.h5')\n", + "mcnp_fendl2_file = ofb.ResultsFromDatabase('results_database/mcnp-4b-c_fendl2.h5')" ] }, { @@ -53,8 +53,8 @@ "outputs": [], "source": [ "# read openmc results in results_database/\n", - "openmc_fendl3_file = ofb.ResultsFromDatabase('openmc-0-14-0_fendl32b.h5', path='results_database')\n", - "openmc_endfb8_file = ofb.ResultsFromDatabase('openmc-0-14-0_endfb80.h5', path='results_database')" + "openmc_fendl3_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_fendl32b.h5')\n", + "openmc_endfb8_file = ofb.ResultsFromDatabase('results_database/openmc-0-14-0_endfb80.h5')" ] }, { diff --git a/models/fns_duct/run_and_store.py b/models/fns_duct/run_and_store.py index bdf9e229..228299ef 100644 --- a/models/fns_duct/run_and_store.py +++ b/models/fns_duct/run_and_store.py @@ -41,7 +41,7 @@ def main(): p.wait() # read statepoint file - openmc_file = ofb.ResultsFromOpenmc('statepoint.100.h5', 'results') + openmc_file = ofb.ResultsFromOpenmc('results/statepoint.100.h5') # store activation foil results xaxis_name = 'Detector No.' From a6a157d5a0c71120491059b84bdee25d4e426f60 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Mon, 5 Aug 2024 15:47:43 -0400 Subject: [PATCH 07/26] + help args in agparser of run_and_store files --- models/fng_str/run_and_store.py | 9 ++++++--- models/fng_w/run_and_store.py | 9 ++++++--- models/fns_clean_w/run_and_store.py | 9 ++++++--- models/fns_duct/run_and_store.py | 9 ++++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/models/fng_str/run_and_store.py b/models/fng_str/run_and_store.py index b1a8efe3..fd661eed 100644 --- a/models/fng_str/run_and_store.py +++ b/models/fng_str/run_and_store.py @@ -17,9 +17,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-x", "--xslib", type=str) - parser.add_argument("-t", "--when", type=str, default='n/a') - parser.add_argument("-w", "--where", type=str, default='n/a') + parser.add_argument("-x", "--xslib", type=str, + help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") + parser.add_argument("-t", "--when", type=str, default='n/a', + help="String with the month and year the simulation was run as (e.g. 'June 2021')") + parser.add_argument("-w", "--where", type=str, default='n/a', + help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") args = parser.parse_args() diff --git a/models/fng_w/run_and_store.py b/models/fng_w/run_and_store.py index 90287843..2c7df669 100644 --- a/models/fng_w/run_and_store.py +++ b/models/fng_w/run_and_store.py @@ -17,9 +17,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-x", "--xslib", type=str) - parser.add_argument("-t", "--when", type=str, default='n/a') - parser.add_argument("-w", "--where", type=str, default='n/a') + parser.add_argument("-x", "--xslib", type=str, + help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") + parser.add_argument("-t", "--when", type=str, default='n/a', + help="String with the month and year the simulation was run as (e.g. 'June 2021')") + parser.add_argument("-w", "--where", type=str, default='n/a', + help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") args = parser.parse_args() diff --git a/models/fns_clean_w/run_and_store.py b/models/fns_clean_w/run_and_store.py index 908d0b79..bec7e56e 100644 --- a/models/fns_clean_w/run_and_store.py +++ b/models/fns_clean_w/run_and_store.py @@ -17,9 +17,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-x", "--xslib", type=str) - parser.add_argument("-t", "--when", type=str, default='n/a') - parser.add_argument("-w", "--where", type=str, default='n/a') + parser.add_argument("-x", "--xslib", type=str, + help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") + parser.add_argument("-t", "--when", type=str, default='n/a', + help="String with the month and year the simulation was run as (e.g. 'June 2021')") + parser.add_argument("-w", "--where", type=str, default='n/a', + help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") args = parser.parse_args() diff --git a/models/fns_duct/run_and_store.py b/models/fns_duct/run_and_store.py index 228299ef..0bfbc250 100644 --- a/models/fns_duct/run_and_store.py +++ b/models/fns_duct/run_and_store.py @@ -13,9 +13,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-x", "--xslib", type=str) - parser.add_argument("-t", "--when", type=str, default='n/a') - parser.add_argument("-w", "--where", type=str, default='n/a') + parser.add_argument("-x", "--xslib", type=str, + help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") + parser.add_argument("-t", "--when", type=str, default='n/a', + help="String with the month and year the simulation was run as (e.g. 'June 2021')") + parser.add_argument("-w", "--where", type=str, default='n/a', + help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") args = parser.parse_args() From 437b1bc22ce6a3c490ff961ebeddf1f372b34725 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Mon, 5 Aug 2024 15:54:05 -0400 Subject: [PATCH 08/26] + help arg in argparser of openmc_models --- models/fng_str/openmc_model.py | 15 +++++++++------ models/fng_w/openmc_model.py | 13 ++++++++----- models/fns_clean_w/openmc_model.py | 9 ++++++--- models/fns_duct/openmc_model.py | 10 ++++++---- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/models/fng_str/openmc_model.py b/models/fng_str/openmc_model.py index 0ba8e2a4..b5a20651 100644 --- a/models/fng_str/openmc_model.py +++ b/models/fng_str/openmc_model.py @@ -9,16 +9,19 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-b", "--batches", type=int, default=100) - parser.add_argument("-p", "--particles", type=int, default=int(1e8)) - parser.add_argument("-s", "--threads", type=int) + parser.add_argument("-b", "--batches", type=int, default=100, + help='Number of batches to simulate (int)') + parser.add_argument("-p", "--particles", type=int, + default=int(1e8), help='Number of particles per batch (int)') + parser.add_argument("-s", "--threads", type=int, + help='Number of threads to use in the simulation (int)') group = parser.add_argument_group("tallies") group.add_argument("-r", "--reaction_rates_onaxis", action='store_true', - default=False) + default=False, help='Calculate the reaction rates on-axis case') group.add_argument("-o", "--reaction_rates_offaxis", action='store_true', - default=False) + default=False, help='Calculate the reaction rates off-axis case') group.add_argument("-d", "--heating", action='store_true', - default=False) + default=False, help='Calculate the nuclear heating case') args = parser.parse_args() diff --git a/models/fng_w/openmc_model.py b/models/fng_w/openmc_model.py index b55ee2f2..24ac4cbc 100644 --- a/models/fng_w/openmc_model.py +++ b/models/fng_w/openmc_model.py @@ -9,14 +9,17 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-b", "--batches", type=int, default=100) - parser.add_argument("-p", "--particles", type=int, default=int(1e7)) - parser.add_argument("-s", "--threads", type=int) + parser.add_argument("-b", "--batches", type=int, default=100, + help='Number of batches to simulate (int)') + parser.add_argument("-p", "--particles", type=int, + default=int(1e7), help='Number of particles per batch (int)') + parser.add_argument("-s", "--threads", type=int, + help='Number of threads to use in the simulation (int)') group = parser.add_argument_group("tallies") group.add_argument("-r", "--reaction_rates", action='store_true', - default=False) + default=False, help='Calculate the reaction rates case') group.add_argument("-d", "--heating", action='store_true', - default=False) + default=False, help='Calculate the nuclear heating case') args = parser.parse_args() diff --git a/models/fns_clean_w/openmc_model.py b/models/fns_clean_w/openmc_model.py index 74ebee9f..5c025a4d 100644 --- a/models/fns_clean_w/openmc_model.py +++ b/models/fns_clean_w/openmc_model.py @@ -10,9 +10,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-b", "--batches", type=int, default=100) - parser.add_argument("-p", "--particles", type=int, default=int(1e7)) - parser.add_argument("-s", "--threads", type=int) + parser.add_argument("-b", "--batches", type=int, default=100, + help='Number of batches to simulate (int)') + parser.add_argument("-p", "--particles", type=int, + default=int(1e7), help='Number of particles per batch (int)') + parser.add_argument("-s", "--threads", type=int, + help='Number of threads to use in the simulation (int)') args = parser.parse_args() diff --git a/models/fns_duct/openmc_model.py b/models/fns_duct/openmc_model.py index 9b24f646..6d359372 100644 --- a/models/fns_duct/openmc_model.py +++ b/models/fns_duct/openmc_model.py @@ -10,10 +10,12 @@ def _parse_args(): """Parse and return commandline arguments""" parser = argparse.ArgumentParser() - parser.add_argument("-b", "--batches", type=int, default=100) - parser.add_argument("-p", "--particles", type=int, default=int(1e9)) - parser.add_argument("-s", "--threads", type=int) - parser.add_argument("-c", "--cwd", type=str) + parser.add_argument("-b", "--batches", type=int, default=100, + help='Number of batches to simulate (int)') + parser.add_argument("-p", "--particles", type=int, + default=int(1e9), help='Number of particles per batch (int)') + parser.add_argument("-s", "--threads", type=int, + help='Number of threads to use in the simulation (int)') args = parser.parse_args() From 6627bc2c3d2e9c84b7db5c504bbbabef3ff43a7a Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Mon, 5 Aug 2024 16:24:17 -0400 Subject: [PATCH 09/26] minor change run_and_store --- models/fng_str/run_and_store.py | 2 +- models/fng_w/run_and_store.py | 2 +- models/fns_clean_w/run_and_store.py | 2 +- models/fns_duct/run_and_store.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/models/fng_str/run_and_store.py b/models/fng_str/run_and_store.py index fd661eed..dd50c9fd 100644 --- a/models/fng_str/run_and_store.py +++ b/models/fng_str/run_and_store.py @@ -20,7 +20,7 @@ def _parse_args(): parser.add_argument("-x", "--xslib", type=str, help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") parser.add_argument("-t", "--when", type=str, default='n/a', - help="String with the month and year the simulation was run as (e.g. 'June 2021')") + help="String with the month and year the simulation is run as (e.g. 'June 2021')") parser.add_argument("-w", "--where", type=str, default='n/a', help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") diff --git a/models/fng_w/run_and_store.py b/models/fng_w/run_and_store.py index 2c7df669..eedbc498 100644 --- a/models/fng_w/run_and_store.py +++ b/models/fng_w/run_and_store.py @@ -20,7 +20,7 @@ def _parse_args(): parser.add_argument("-x", "--xslib", type=str, help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") parser.add_argument("-t", "--when", type=str, default='n/a', - help="String with the month and year the simulation was run as (e.g. 'June 2021')") + help="String with the month and year the simulation is run as (e.g. 'June 2021')") parser.add_argument("-w", "--where", type=str, default='n/a', help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") diff --git a/models/fns_clean_w/run_and_store.py b/models/fns_clean_w/run_and_store.py index bec7e56e..02cc166b 100644 --- a/models/fns_clean_w/run_and_store.py +++ b/models/fns_clean_w/run_and_store.py @@ -20,7 +20,7 @@ def _parse_args(): parser.add_argument("-x", "--xslib", type=str, help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") parser.add_argument("-t", "--when", type=str, default='n/a', - help="String with the month and year the simulation was run as (e.g. 'June 2021')") + help="String with the month and year the simulation is run as (e.g. 'June 2021')") parser.add_argument("-w", "--where", type=str, default='n/a', help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") diff --git a/models/fns_duct/run_and_store.py b/models/fns_duct/run_and_store.py index 0bfbc250..06cfc8ab 100644 --- a/models/fns_duct/run_and_store.py +++ b/models/fns_duct/run_and_store.py @@ -16,7 +16,7 @@ def _parse_args(): parser.add_argument("-x", "--xslib", type=str, help="Strign with Cross section library name and version (e.g. 'FENDL-2.3')") parser.add_argument("-t", "--when", type=str, default='n/a', - help="String with the month and year the simulation was run as (e.g. 'June 2021')") + help="String with the month and year the simulation is run as (e.g. 'June 2021')") parser.add_argument("-w", "--where", type=str, default='n/a', help="String with the place/institution where the simulation is run (e.g. 'MIT-PSFC')") From 4f001a27b08b61ddbd1925e226e1937820bd461e Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Tue, 6 Aug 2024 10:03:38 -0400 Subject: [PATCH 10/26] + openmc+jeff3.3 results for fng_w --- .../results_database/openmc-0-14-0_jeff33.h5 | Bin 0 -> 778446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/fng_w/results_database/openmc-0-14-0_jeff33.h5 diff --git a/models/fng_w/results_database/openmc-0-14-0_jeff33.h5 b/models/fng_w/results_database/openmc-0-14-0_jeff33.h5 new file mode 100644 index 0000000000000000000000000000000000000000..c5cc0ca87feb31cf08744f8aa8fa374eb7856ad7 GIT binary patch literal 778446 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 literal 0 HcmV?d00001 From 6059923f1eed35f42531a5b4bebb70b5cb352a91 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Tue, 6 Aug 2024 11:39:28 -0400 Subject: [PATCH 11/26] refactored fng w and str run_and_store --- models/fng_str/run_and_store.py | 18 ++++-------------- models/fng_w/run_and_store.py | 19 ++++--------------- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/models/fng_str/run_and_store.py b/models/fng_str/run_and_store.py index dd50c9fd..4d4f3313 100644 --- a/models/fng_str/run_and_store.py +++ b/models/fng_str/run_and_store.py @@ -6,7 +6,6 @@ import numpy as np import pandas as pd from pathlib import Path -import h5py # ignore NaturalNameWarnings import warnings @@ -135,22 +134,13 @@ def main(): tally_df = pd.DataFrame(d) path_to_file = Path('results_database') / filename - - # write the tally in the hdf file - tally_df.to_hdf(path_to_file, tally_name, mode='a', - format='table', data_columns=True, index=False) code_version = 'openmc-' + \ '.'.join(map(str, heating_file.get_openmc_version)) - # write attributes to the hdf file - with h5py.File(path_to_file, 'a') as f: - f[tally_name + '/table'].attrs['x_axis'] = xaxis_name - f.attrs['code_version'] = code_version - f.attrs['xs_library'] = args.xslib.strip().replace(' ', '') - f.attrs['batches'] = heating_file.get_batches - f.attrs['particles_per_batch'] = heating_file.get_particles_per_batch - f.attrs['when'] = args.when - f.attrs['where'] = args.where + xs_library = args.xslib.strip().replace(' ', '') + ofb.to_hdf(tally_df, path_to_file, tally_name, xs_library, xaxis_name, + args.when, args.where, code_version, + heating_file.get_batches, heating_file.get_particles_per_batch) if __name__ == "__main__": diff --git a/models/fng_w/run_and_store.py b/models/fng_w/run_and_store.py index eedbc498..0167c613 100644 --- a/models/fng_w/run_and_store.py +++ b/models/fng_w/run_and_store.py @@ -3,10 +3,8 @@ import subprocess import openmc_fusion_benchmarks as ofb import helpers -import numpy as np import pandas as pd from pathlib import Path -import h5py # ignore NaturalNameWarnings import warnings @@ -82,22 +80,13 @@ def main(): tally_df = pd.DataFrame(d) path_to_file = Path('results_database') / filename - - # write the tally in the hdf file - tally_df.to_hdf(path_to_file, tally_name, mode='a', - format='table', data_columns=True, index=False) code_version = 'openmc-' + \ '.'.join(map(str, heating_file.get_openmc_version)) - # write attributes to the hdf file - with h5py.File(path_to_file, 'a') as f: - f[tally_name + '/table'].attrs['x_axis'] = xaxis_name - f.attrs['code_version'] = code_version - f.attrs['xs_library'] = args.xslib.strip().replace(' ', '') - f.attrs['batches'] = heating_file.get_batches - f.attrs['particles_per_batch'] = heating_file.get_particles_per_batch - f.attrs['when'] = args.when - f.attrs['where'] = args.where + xs_library = args.xslib.strip().replace(' ', '') + ofb.to_hdf(tally_df, path_to_file, tally_name, xs_library, xaxis_name, + args.when, args.where, code_version, + heating_file.get_batches, heating_file.get_particles_per_batch) if __name__ == "__main__": From 55352e440765c2a9312f9e017170a2ea42324fd9 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 15 Aug 2024 11:24:31 -0400 Subject: [PATCH 12/26] + jeff results in fns_clean --- .../results_database/openmc-0-14-0_jeff33.h5 | Bin 0 -> 1172248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/fns_clean_w/results_database/openmc-0-14-0_jeff33.h5 diff --git a/models/fns_clean_w/results_database/openmc-0-14-0_jeff33.h5 b/models/fns_clean_w/results_database/openmc-0-14-0_jeff33.h5 new file mode 100644 index 0000000000000000000000000000000000000000..8b9d431de88b0129bd2ce601a5fe64a2e9ec6c3b GIT binary patch literal 1172248 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

#Le;c#ZCp)5R>UYcSXq~^jx9oSg z>eaYqyVm*3_gmHr6m179Ir+Jx3PeAQ_hC_Nbe7jm`aVqeC3*dn^OL_&_Qg~54gqJF z=;lWgJsV(x00bZa0SG|g-&?>c-V2WTYRI))Qg$Ur{$tPx^Q2+P@|j{_>;UD=m??g% z=5I^hx#fcsk+&r!%kRDM@v(zm_-RAH$+#uSdF{50dvaIzWcmF*VNk5KRht9Fcdc+I zr)Onu&x#C8{`XeI-a!BY5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0ucEBBM_+s ztDQB8Py3+FWuZ!nUJg>)i&&lAQCHzrl&ef8C0s=4k8%}5Ju0;of1UP3(4rn!7x4iB z2tWV=5P-n%P+)j!Znk Date: Tue, 27 Aug 2024 15:56:42 -0400 Subject: [PATCH 13/26] fixed bug in fng_w postprocessing w --- models/fng_w/postprocessing.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/models/fng_w/postprocessing.ipynb b/models/fng_w/postprocessing.ipynb index 505efd0b..4228427e 100644 --- a/models/fng_w/postprocessing.ipynb +++ b/models/fng_w/postprocessing.ipynb @@ -248,7 +248,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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a9euePHFF+Hr64vk5GRERETgl19+waFDh8r7KRu1aNEihIWFoVOnTpg1axaaNGmC9PR03LlzB/v27cOaNWvg7e1dqnM+9dRTAICPP/4YISEhkMvllS4JJSKiopk8GWvWrBk+/fRThISEGMyNyczMxLJly4yuxE5lp9FoyqWuKUyYMMFo+ZdffomjR4/i3r17OH36tP4OAvXr18dXX32FYcOGYfny5Xj55Zf1x8ycORPp6emYNWsW4uLi0KJFC+zduxedO3fW12nevDnOnTuH9957D2+//Tbi4uLg5OSERo0aGUy+r2ienp44c+YM3nvvPXzyySe4f/8+HBwc4Ofnh379+j1Rb9nzzz+PP//8E6tXr8aiRYsghEBkZCR8fX1N/wSIiKhcSEIIYcoT7t27F88++yw8PDwwePBgeHh4ICYmBjt37kRMTAx2796N/v37m7LJSkutVkOpVEKlUhldgT89PR2RkZHw8/MrMCm8JDQaTYHh4NJKSUmptLdRyuvOnTvw8/PDJ598gjlz5pg7HKpAZf2cEBGZS3F5QC6T94z1798fv/76K9566y2sWrUKOp0OkiShffv22LBhA3r16mXqJomIiIiqrHJZgT84OBjBwcFITU3Fo0ePUKtWLV5FWQ4UCgVSUlLKfA4iIiIyn3K7HZJKpcKpU6eQkJCA0NBQfumXA0mSqsQQoyn4+vrCxCPqRERElUK53Cj8vffeg5eXF0JCQjB27FhERkYCyOkxy72pck0SGBiI5s2bF7hRNREREZHJk7HVq1dj4cKFmDRpEvbu3WvQmzFgwADs3bvX1E1WeqdPn0Z4eHihi5ASERFRzWXyYcqVK1di9uzZWLJkCbRarcG+Ro0a4datW6ZukoiIiKjKMnnP2O3bt9G3b1+j+xwcHPD48WNTN0lERERUZZk8GVMqlYiNjTW6786dO3BzczN1k0RERERVlsmTseDgYCxZssRglXdJkpCdnY0vvvii0F4zIiIioprI5HPGFi1apL96cNCgQZAkCStXrsT58+dx7949bNu2zdRNUmESIoDrvwDNngFqNzB3NEREVB3wu8XkTN4z1rBhQ/z5559o1qwZVq9eDSEEvv32W7i4uOD48ePw8fExdZNkjE4LXN8D/HMEuLYnZ5uIqBSEENBoNGV6cH3AaobfLeWiXNYZa968OX799VckJyfj/v37UKvV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", "text/plain": [ "

" ] @@ -270,10 +270,9 @@ "\n", "# plot\n", "# preprocessing\n", - "dtype_label = reaction_labels[i]\n", "xaxis = experiment_file.get_tally_xaxis('nuclear_heating')\n", "\n", - "plot = ofb.PlotNuclearHeating(xaxis=xaxis, ylabel=ylabel, dtype_label=dtype_label)\n", + "plot = ofb.PlotNuclearHeating(xaxis=xaxis, ylabel=ylabel)\n", "plot.add_reference_results(reference_data=measured, label='Experiment')\n", "plot.add_computed_results(computed_data=mcnp_eff2, marker='d', color='tab:orange', alpha=.5, label='mcnp-eff2')\n", "plot.add_computed_results(computed_data=mcnp_fendl2, marker='^', color='tab:green', alpha=.5, label='mcnp-fendl2')\n", From b612cb5f088d2514fb86337cbccec7fa25616a65 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 15:49:45 -0400 Subject: [PATCH 14/26] + init --- src/openmc_fusion_benchmarks/__init__.py | 1 + src/openmc_fusion_benchmarks/data/__init__.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 src/openmc_fusion_benchmarks/data/__init__.py diff --git a/src/openmc_fusion_benchmarks/__init__.py b/src/openmc_fusion_benchmarks/__init__.py index 6d655ed6..730167ef 100644 --- a/src/openmc_fusion_benchmarks/__init__.py +++ b/src/openmc_fusion_benchmarks/__init__.py @@ -3,3 +3,4 @@ from openmc_fusion_benchmarks.read_results import * from openmc_fusion_benchmarks.visualize import * from openmc_fusion_benchmarks.utils import * +import openmc_fusion_benchmarks.data diff --git a/src/openmc_fusion_benchmarks/data/__init__.py b/src/openmc_fusion_benchmarks/data/__init__.py new file mode 100644 index 00000000..cd8ca009 --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/__init__.py @@ -0,0 +1,6 @@ +from .data_conventions import * +from .sandy_wrapper import * +from .modify_xs_xml import * +from .tmc_engine import * +from .stats_analysis import * +from .jade_sphere import jade_sphere From f3a06bee68a6044e5df0c2883e598ce1fdc222d9 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 15:50:32 -0400 Subject: [PATCH 15/26] + whole uq workflow in data --- .../data/data_conventions.py | 39 ++++++ .../data/jade_sphere.py | 78 +++++++++++ .../data/modify_xs_xml.py | 34 +++++ .../data/sandy_wrapper.py | 126 ++++++++++++++++++ .../data/stats_analysis.py | 89 +++++++++++++ .../data/tmc_engine.py | 42 ++++++ 6 files changed, 408 insertions(+) create mode 100644 src/openmc_fusion_benchmarks/data/data_conventions.py create mode 100644 src/openmc_fusion_benchmarks/data/jade_sphere.py create mode 100644 src/openmc_fusion_benchmarks/data/modify_xs_xml.py create mode 100644 src/openmc_fusion_benchmarks/data/sandy_wrapper.py create mode 100644 src/openmc_fusion_benchmarks/data/stats_analysis.py create mode 100644 src/openmc_fusion_benchmarks/data/tmc_engine.py diff --git a/src/openmc_fusion_benchmarks/data/data_conventions.py b/src/openmc_fusion_benchmarks/data/data_conventions.py new file mode 100644 index 00000000..b503b983 --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/data_conventions.py @@ -0,0 +1,39 @@ +import openmc + + +def zaid_to_zam(zaid): + # Convert ZAID to string for easy manipulation + zaid_str = str(zaid) + + # Extract Z, A, and M based on ZAID length + if len(zaid_str) == 4: # Handles cases like H-1 (1001) + Z = int(zaid_str[0]) # First digit for Z + A = int(zaid_str[1:]) # Last 3 digits for A + M = 0 # Assuming ground state if no additional digit + elif len(zaid_str) == 5: # Typical ZAID with 5 digits + Z = int(zaid_str[:2]) # First 2 digits for Z + A = int(zaid_str[2:]) # Last 3 digits for A + M = 0 # Assuming ground state + elif len(zaid_str) == 6: # ZAID with 6 digits, includes isomeric state + Z = int(zaid_str[:3]) # First 3 digits for Z + A = int(zaid_str[3:5]) # Next 2 digits for A + M = int(zaid_str[5]) # Last digit represents isomeric state + + return (Z, A, M) + + +def get_nuclide_zaid(nuclide): + if type(nuclide) == int: + return nuclide + elif type(nuclide) == str: + return openmc.data.zam(nuclide)[0]*1000 + openmc.data.zam(nuclide)[1] + elif type(nuclide) == tuple: + return nuclide[0]*1000 + nuclide[1] + + +def get_nuclide_gnds(nuclide): + if type(nuclide) == str: + return nuclide + elif type(nuclide) == int: + zam = zaid_to_zam(nuclide) + return openmc.data.gnds_name(zam[0], zam[1], zam[2]) diff --git a/src/openmc_fusion_benchmarks/data/jade_sphere.py b/src/openmc_fusion_benchmarks/data/jade_sphere.py new file mode 100644 index 00000000..513cc9ee --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/jade_sphere.py @@ -0,0 +1,78 @@ +import openmc + + +def jade_sphere(material:openmc.Material, particles:int=int(1e5), + photon_transport:bool=False, nreactions=None, greactions=None): + + materials = openmc.Materials([material]) + + # geometry + s1 = openmc.Sphere(r=5.) + s2 = openmc.Sphere(r= 50.) + s3 = openmc.Sphere(r= 60.0, boundary_type='vacuum') + + region1 = -s1 + region2 = +s1 & -s2 + region3 = +s2 & -s3 + + cell1 = openmc.Cell(region=region1, fill=None) + cell2 = openmc.Cell(region=region2, fill=material) + cell3 = openmc.Cell(region=region3, fill=None) + + geometry = openmc.Geometry([cell1, cell2, cell3]) + + # settings + space = openmc.stats.Point() + angle = openmc.stats.Isotropic() + energy = openmc.stats.Discrete([14.1e6], [1]) + source = openmc.IndependentSource(space=space, angle=angle, energy=energy) + + settings = openmc.Settings(run_mode='fixed source') + settings.particles = particles + settings.source = source + settings.batches = 100 + settings.output = {'tallies': False} + + tallies_file = openmc.Tallies() + # tallies + cell2_filter = openmc.CellFilter(cell2) + s2_filter = openmc.SurfaceFilter(s2) + neutron_filter = openmc.ParticleFilter(['neutron']) + + # neutron tallies + t = openmc.Tally(name='n_flux') + t.filters = [cell2_filter, neutron_filter] + t.scores = ['flux'] + tallies_file.append(t) + + t = openmc.Tally(name='n_leakage') + t.filters = [s2_filter, neutron_filter] + t.scores = ['current'] + tallies_file.append(t) + + if nreactions is not None: + for reaction in nreactions: + t = openmc.Tally(name=f'n_{reaction}') + t.filters = [cell2_filter, neutron_filter] + t.scores = [reaction] + tallies_file.append(t) + + if photon_transport is True: + settings.photon_transport = True + photon_filter = openmc.ParticleFilter(['photon']) + t = openmc.Tally(name='g_flux') + t.filters = [cell2_filter, photon_filter] + t.scores = ['flux'] + tallies_file.append(t) + t = openmc.Tally(name='g_leakage') + t.filters = [s2_filter, photon_filter] + t.scores = ['current'] + tallies_file.append(t) + if nreactions is not None: + for reaction in greactions: + t = openmc.Tally(name=f'g_{reaction}') + t.filters = [cell2_filter, photon_filter] + t.scores = [reaction] + tallies_file.append(t) + + return openmc.model.Model(geometry, materials, settings, tallies_file) \ No newline at end of file diff --git a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py new file mode 100644 index 00000000..320426f9 --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py @@ -0,0 +1,34 @@ +import openmc +import os + + +_this_script_dir = os.path.dirname(os.path.abspath(__file__)) +_model_xml_path = os.path.join(_this_script_dir, 'model_xs.xml') + +def get_env_variable(var_name): + # Retrieve the value of the environment variable + value = os.getenv(var_name) + if value is None: + return f"Environment variable '{var_name}' is not set." + return value + + +def rewrite_xs_xml(model_xs_file:str=_model_xml_path, new_xs_file:str='cross_sections_mod.xml'): + # read xs file + model_xs_file = get_env_variable('OPENMC_CROSS_SECTIONS') + myxs = openmc.data.DataLibrary.from_xml(model_xs_file) + myxs.export_to_xml(new_xs_file) + + +def create_xs_dict(xs_h5_file:str, nuclide: str, type:str='neutron'): + return {'path': xs_h5_file, 'type': type, 'materials': [nuclide]} + +def perturb_xs_xml(xs_file, xs_h5_file, nuclide: str): + # read xs file + myxs = openmc.data.DataLibrary.from_xml(xs_file) + try: + myxs.libraries.get_by_material(nuclide)['path'] = xs_h5_file + except TypeError: + myxs.append(create_xs_dict(xs_h5_file, nuclide)) + # export to modified cross_sections xml file + myxs.export_to_xml(xs_file) \ No newline at end of file diff --git a/src/openmc_fusion_benchmarks/data/sandy_wrapper.py b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py new file mode 100644 index 00000000..11bf968e --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py @@ -0,0 +1,126 @@ +from .data_conventions import get_nuclide_zaid, get_nuclide_gnds +import os +import glob +import argparse +import sandy +import openmc +import openmc.data + + +def remove_ace_files(directory, lib_name): + # List of extensions to remove + extensions = ['03c', '03c.xsd', lib_name] + + # Loop through each extension and remove matching files + for ext in extensions: + files_to_remove = glob.glob(os.path.join(directory, f'*.{ext}')) + for file_path in files_to_remove: + try: + os.remove(file_path) + print(f"Removed {file_path}") + except Exception as e: + print(f"Error removing {file_path}: {e}") + + +def get_ace_files(nsamples, lib_name, nuclide, reaction, nprocesses, error): + # convert nuclide to ZAID + nuclide_zaid = get_nuclide_zaid(nuclide) + tape = sandy.get_endf6_file(lib_name, "xs", nuclide_zaid*10, to_file=True) + + # Generate perturbations + perturbations = tape.get_perturbations( + nsamples, + njoy_kws=dict( + err=error, + chi=False, + mubar=False, + xs=True, + nubar=False, + verbose=True, + errorr33_kws=dict(mt=reaction) + ), + ) + + # Apply perturbations and generate ACE files + ace_files = tape.apply_perturbations( + perturbations, + processes=nprocesses, + njoy_kws=dict(err=error), + to_ace=True, + to_file=True, + ace_kws=dict( + err=error, + temperature=294, + verbose=True, + purr=True, + heatr=True, + thermr=True, + gaspr=True, + groupr=True, + errorr=True, + heatr_kws={'local': True} + ), + verbose=True, + ) + + # Optionally return or process 'outs' if needed + return ace_files + + +def ace_to_hdf5(nsamples, lib_name, nuclide, remove_ace=True): + # convert nuclide to gnds and ZAID + nuclide_gnds = get_nuclide_gnds(nuclide) + nuclide_zaid = get_nuclide_zaid(nuclide) + + directory = f"{nuclide_gnds}_{lib_name}" + if not os.path.exists(directory): + os.makedirs(directory) + + for n in range(0, nsamples): + acefile = f"{nuclide_zaid}_{n}.03c" + h5file = f"{directory}/{nuclide_gnds}_{n}_{lib_name}.h5" + + # Convert ACE to HDF5 using OpenMC + try: + nuc_data = openmc.data.IncidentNeutron.from_ace(acefile) + print(f'Writing to {os.getcwd()}/{h5file}') + nuc_data.export_to_hdf5(h5file) + except FileNotFoundError: + print(f'Error: ACE file {acefile} not found.') + except Exception as e: + print(f'Error processing {acefile}: {e}') + + if remove_ace: + remove_ace_files('', lib_name) + + +def perturb_to_hdf5(nsamples, lib_name, nuclide, reaction, nprocesses=1, error=.001): + get_ace_files(nsamples, lib_name, nuclide, reaction, nprocesses, error) + ace_to_hdf5(nsamples, lib_name, nuclide, remove_ace=True) + + +def main(): + parser = argparse.ArgumentParser( + description="Generate ACE files with perturbed nuclear data.") + parser.add_argument("-n", "--nuclide", required=True, + help="Nuclide identifier (ZA number)") + parser.add_argument("-xs", "--lib_name", type=str, default=1, + help="Cross section choice ['JEFF_32', 'JEFF_33', 'ENDFB_71', 'ENDFB_80', 'JENDL_40U', 'IRDFF_2']") + parser.add_argument("-r", "--reaction", type=int, + nargs='+', help="MT value for specific reaction") + parser.add_argument("-e", "--error", type=float, + default=0.001, help="Error tolerance for processing") + parser.add_argument("-p", "--nprocesses", type=int, default=1, + help="Number of processes for parallel processing") + parser.add_argument("-ns", "--nsamples", type=int, + default=1, help="Number of perturbations") + + args = parser.parse_args() + + # Call function with arguments from command line + perturb_to_hdf5(args.nsamples, args.lib_name, args.nuclide, args.reaction, + args.nprocesses) + + +if __name__ == "__main__": + main() diff --git a/src/openmc_fusion_benchmarks/data/stats_analysis.py b/src/openmc_fusion_benchmarks/data/stats_analysis.py new file mode 100644 index 00000000..77760a1d --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/stats_analysis.py @@ -0,0 +1,89 @@ +import re +from pathlib import Path +import numpy as np +import pandas as pd +import h5py +from scipy.stats import norm + +import openmc_fusion_benchmarks as ofb + + +class ResultsFromTMC(ofb.ResultsFromDatabase): + def __init__(self, file): + super().__init__(file) + + # self.filename = file.strip().split('/') + # self.filepath = Path(file) + + # def list_tallies(self): + # # Create a set to store unique base names + # base_names = set() + + # # Regular expression to capture the pattern 'name_N' + # pattern = re.compile(r"(.+?)_(\d+)$") + + # # Open the HDF5 file + # with h5py.File(self.filepath, 'r') as hdf: + # # List all datasets in the HDF5 file + # dataset_names = list(hdf.keys()) + + # # Loop through the dataset names + # for name in dataset_names: + # match = pattern.match(name) + # if match: + # # Capture the base name + # base_name = match.group(1) + # # Add to the set of unique base names + # base_names.add(base_name) + + def find_nsamples(self, tally): + + # Open the HDF5 file + with h5py.File(self.filepath, 'r') as hdf: + # List all datasets in the HDF5 file + dataset_names = list(hdf.keys()) + # Initialize to track the highest N + max_n = -1 + # Loop through the datasets to find the ones that match the pattern base_name_N + for name in dataset_names: + if name.startswith(tally + '_'): + # Extract N and update max_n if N is larger + n = int(name.split('_')[-1]) + if n > max_n: + max_n = n + + if max_n == -1: + msg = f"No datasets found with base name '{tally}' in the HDF5 file." + raise ValueError(msg) + else: + return max_n + + def get_means(self, tally): + mean = [] + nsamples = self.find_nsamples(tally) + with h5py.File(self.filepath, 'r') as f: + for n in range(nsamples): + df = pd.DataFrame( + f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + mean.append(df['mean'][0]) + + return mean + + def get_std_devs(self, tally): + std_dev = [] + nsamples = self.find_nsamples(tally) + with h5py.File(self.filepath, 'r') as f: + for n in range(nsamples): + df = pd.DataFrame( + f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + std_dev.append(df['std. dev.'][0]) + + return std_dev + + +def get_gauss(mu, sigma): + x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000) + y = norm.pdf(x, mu, sigma) + y = y / max(y) + + return x, y diff --git a/src/openmc_fusion_benchmarks/data/tmc_engine.py b/src/openmc_fusion_benchmarks/data/tmc_engine.py new file mode 100644 index 00000000..cc59a182 --- /dev/null +++ b/src/openmc_fusion_benchmarks/data/tmc_engine.py @@ -0,0 +1,42 @@ +from .sandy_wrapper import perturb_to_hdf5 +from .data_conventions import get_nuclide_gnds +from .modify_xs_xml import rewrite_xs_xml, perturb_xs_xml +import os +import openmc +import numpy as np + + +def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, + reaction: int, perturb_xs: bool = False): + # convert nuclide to gnds name + nuclide = get_nuclide_gnds(nuclide) + xs_file = f'cross_sections_mod.xml' + path_to_file = f'results_{nuclide}.h5' + + if perturb_xs: + perturb_to_hdf5(nsamples, lib_name, nuclide, reaction, nprocesses=1, + error=.001) + + for n in np.arange(nsamples): + + rewrite_xs_xml(new_xs_file=xs_file) + + directory = f"{nuclide}_{lib_name}" + xs_h5_file = f"{directory}/{nuclide}_{n}_{lib_name}.h5" + perturb_xs_xml(xs_file, xs_h5_file, nuclide) + openmc.config['cross_sections'] = xs_file + + # run simulation + model.run() + + # postprocess result + sp = openmc.StatePoint('statepoint.100.h5') + # open tally and push to hdf5 + for t in sp.tallies: + tally = sp.get_tally(id=t) + tally_df = tally.get_pandas_dataframe() + tally_df.to_hdf(path_to_file, tally.name+f'_{n}', mode='a', + format='table', data_columns=True, index=False) + + os.remove('summary.h5') + os.remove('statepoint.100.h5') From f8c1f913c9752eb50ce65a08b5363778dfd02f18 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 15:50:52 -0400 Subject: [PATCH 16/26] + ResultsFromTMC class --- src/openmc_fusion_benchmarks/read_results.py | 121 +++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/src/openmc_fusion_benchmarks/read_results.py b/src/openmc_fusion_benchmarks/read_results.py index 79151b35..5d516867 100644 --- a/src/openmc_fusion_benchmarks/read_results.py +++ b/src/openmc_fusion_benchmarks/read_results.py @@ -2,7 +2,9 @@ import openmc from pathlib import Path from typing import Iterable +import numpy as np import pandas as pd +import re _del_columns = ['cell', 'particle', 'nuclide', 'score', 'energyfunction'] @@ -97,6 +99,53 @@ def build_hdf_filename(code_name: str, code_version: Iterable, xs_library: str) return filename +# class ResultsFrom(ABC): +# def __init__(self, file: str): +# """ResultsFrom class constructor + +# Parameters +# ---------- +# file : str +# Name of the hdf file present in the results_database folder. +# Can include the path to the file +# """ + +# self.filename = file.strip().split('/') +# self.filepath = Path(file) + +# def list_tallies(self): +# """Prints the names of all the tallies available in the hdf file +# """ +# with h5py.File(self.filepath) as f: +# print(f.keys()) + +# def get_tally_dataframe(self, tally_name: str) -> pd.DataFrame: +# """Retrieves the results of a given tally in a Pandas DataFrame format. +# It relies on the openmc.Statepoint().get_tally().get_pandas_dataframe() +# method + +# Parameters +# ---------- +# tally_name : str +# Exact name of the tally in the hdf file + +# Returns +# ------- +# pd.DataFrame +# DataFrame with tally results +# """ +# with h5py.File(self.filepath) as f: +# df = pd.DataFrame(f[tally_name+'/table'][()]).drop(columns='index') +# # decode hdf5 strings to strings if necessary +# try: +# df[self.get_tally_xaxis(tally_name)] = [el.decode() +# for el in df[self.get_tally_xaxis(tally_name)]] +# except: +# pass + +# return df + + class ResultsFromDatabase: """This class takes in a hdf file and its path and generates a generic object by reading it. It is specifically designed for hdf files present @@ -407,3 +456,75 @@ def tally_to_hdf(self, tally_name: str, normalize_over: Iterable, xs_library: st to_hdf(tally_df, file, tally_name, xs_library, xaxis_name, when, where, code_version, self.get_batches, self.get_particles_per_batch, literature) + + +class ResultsFromTMC(ResultsFromDatabase): + def __init__(self, file): + super().__init__(file) + + def list_tally_names(self): + # Create a set to store unique base names + base_names = set() + + # Regular expression to capture the pattern 'name_N' + pattern = re.compile(r"(.+?)_(\d+)$") + + # Open the HDF5 file + with h5py.File(self.filepath, 'r') as hdf: + # List all datasets in the HDF5 file + dataset_names = list(hdf.keys()) + + # Loop through the dataset names + for name in dataset_names: + match = pattern.match(name) + if match: + # Capture the base name + base_name = match.group(1) + # Add to the set of unique base names + base_names.add(base_name) + + print(list(base_names)) + + def find_nsamples(self, tally): + + # Open the HDF5 file + with h5py.File(self.filepath, 'r') as hdf: + # List all datasets in the HDF5 file + dataset_names = list(hdf.keys()) + # Initialize to track the highest N + max_n = -1 + # Loop through the datasets to find the ones that match the pattern base_name_N + for name in dataset_names: + if name.startswith(tally + '_'): + # Extract N and update max_n if N is larger + n = int(name.split('_')[-1]) + if n > max_n: + max_n = n + + if max_n == -1: + msg = f"No datasets found with base name '{tally}' in the HDF5 file." + raise ValueError(msg) + else: + return max_n + + def get_means(self, tally): + mean = [] + nsamples = self.find_nsamples(tally) + with h5py.File(self.filepath, 'r') as f: + for n in range(nsamples): + df = pd.DataFrame( + f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + mean.append(np.array(df['mean'])) + + return np.array(mean) + + def get_stds(self, tally): + stds = [] + nsamples = self.find_nsamples(tally) + with h5py.File(self.filepath, 'r') as f: + for n in range(nsamples): + df = pd.DataFrame( + f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + stds.append(np.array(df['std. dev.'])) + + return np.array(stds) From 3273229977cb0624f9a570f0899f1ed63769dff5 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 16:01:12 -0400 Subject: [PATCH 17/26] + doc in data_conventions --- .../data/data_conventions.py | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/data_conventions.py b/src/openmc_fusion_benchmarks/data/data_conventions.py index b503b983..eb085481 100644 --- a/src/openmc_fusion_benchmarks/data/data_conventions.py +++ b/src/openmc_fusion_benchmarks/data/data_conventions.py @@ -1,8 +1,18 @@ import openmc -def zaid_to_zam(zaid): - # Convert ZAID to string for easy manipulation +def zaid_to_zam(zaid) -> tuple: + """Converts a ZAID to Z, A, and M. + + Parameters + ---------- + zaid : nuclide ZAID + + Returns + ------- + tuple + Z, A, and M values + """ zaid_str = str(zaid) # Extract Z, A, and M based on ZAID length @@ -23,6 +33,20 @@ def zaid_to_zam(zaid): def get_nuclide_zaid(nuclide): + """Gets the ZAID of a nuclide from its name as a GNDS string (e.g. 'H1', + 'U238) or as a ZAM tuple (e.g. (1, 1, 0)). + See openmc.data.zam() for more details. + + Parameters + ---------- + nuclide : int or str or tuple + The nuclide identifier or name + + Returns + ------- + int + The ZAID of the nuclide + """ if type(nuclide) == int: return nuclide elif type(nuclide) == str: @@ -32,6 +56,18 @@ def get_nuclide_zaid(nuclide): def get_nuclide_gnds(nuclide): + """Gets the GNDS name from a nuclide ZAID + + Parameters + ---------- + nuclide : str or int + The nuclide ZAID or GNDS name + + Returns + ------- + str + The GNDS name of the nuclide + """ if type(nuclide) == str: return nuclide elif type(nuclide) == int: From c78721244e2a0592777128cee09526af8c15b272 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 16:16:00 -0400 Subject: [PATCH 18/26] improved tmc_engine --- src/openmc_fusion_benchmarks/data/tmc_engine.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/tmc_engine.py b/src/openmc_fusion_benchmarks/data/tmc_engine.py index cc59a182..37d788fd 100644 --- a/src/openmc_fusion_benchmarks/data/tmc_engine.py +++ b/src/openmc_fusion_benchmarks/data/tmc_engine.py @@ -11,8 +11,9 @@ def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, # convert nuclide to gnds name nuclide = get_nuclide_gnds(nuclide) xs_file = f'cross_sections_mod.xml' - path_to_file = f'results_{nuclide}.h5' + path_to_file = f'tmc_results_{nuclide}.h5' + # runs sandy and generates perturbed xs only if perturb_xs is True if perturb_xs: perturb_to_hdf5(nsamples, lib_name, nuclide, reaction, nprocesses=1, error=.001) @@ -30,7 +31,8 @@ def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, model.run() # postprocess result - sp = openmc.StatePoint('statepoint.100.h5') + sp_name = f'statepoint.{model.settings.batches}.h5' + sp = openmc.StatePoint(sp_name) # open tally and push to hdf5 for t in sp.tallies: tally = sp.get_tally(id=t) @@ -39,4 +41,4 @@ def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, format='table', data_columns=True, index=False) os.remove('summary.h5') - os.remove('statepoint.100.h5') + os.remove(sp_name) From ab64891559afb6fcd24f469ab49a75b33dd75f47 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 16:19:58 -0400 Subject: [PATCH 19/26] reduced stats_analysis --- .../data/stats_analysis.py | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/stats_analysis.py b/src/openmc_fusion_benchmarks/data/stats_analysis.py index 77760a1d..21bb4bb9 100644 --- a/src/openmc_fusion_benchmarks/data/stats_analysis.py +++ b/src/openmc_fusion_benchmarks/data/stats_analysis.py @@ -36,49 +36,49 @@ def __init__(self, file): # # Add to the set of unique base names # base_names.add(base_name) - def find_nsamples(self, tally): - - # Open the HDF5 file - with h5py.File(self.filepath, 'r') as hdf: - # List all datasets in the HDF5 file - dataset_names = list(hdf.keys()) - # Initialize to track the highest N - max_n = -1 - # Loop through the datasets to find the ones that match the pattern base_name_N - for name in dataset_names: - if name.startswith(tally + '_'): - # Extract N and update max_n if N is larger - n = int(name.split('_')[-1]) - if n > max_n: - max_n = n - - if max_n == -1: - msg = f"No datasets found with base name '{tally}' in the HDF5 file." - raise ValueError(msg) - else: - return max_n - - def get_means(self, tally): - mean = [] - nsamples = self.find_nsamples(tally) - with h5py.File(self.filepath, 'r') as f: - for n in range(nsamples): - df = pd.DataFrame( - f[tally+f'_{n}'+'/table'][()]).drop(columns='index') - mean.append(df['mean'][0]) - - return mean - - def get_std_devs(self, tally): - std_dev = [] - nsamples = self.find_nsamples(tally) - with h5py.File(self.filepath, 'r') as f: - for n in range(nsamples): - df = pd.DataFrame( - f[tally+f'_{n}'+'/table'][()]).drop(columns='index') - std_dev.append(df['std. dev.'][0]) - - return std_dev + # def find_nsamples(self, tally): + + # # Open the HDF5 file + # with h5py.File(self.filepath, 'r') as hdf: + # # List all datasets in the HDF5 file + # dataset_names = list(hdf.keys()) + # # Initialize to track the highest N + # max_n = -1 + # # Loop through the datasets to find the ones that match the pattern base_name_N + # for name in dataset_names: + # if name.startswith(tally + '_'): + # # Extract N and update max_n if N is larger + # n = int(name.split('_')[-1]) + # if n > max_n: + # max_n = n + + # if max_n == -1: + # msg = f"No datasets found with base name '{tally}' in the HDF5 file." + # raise ValueError(msg) + # else: + # return max_n + + # def get_means(self, tally): + # mean = [] + # nsamples = self.find_nsamples(tally) + # with h5py.File(self.filepath, 'r') as f: + # for n in range(nsamples): + # df = pd.DataFrame( + # f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + # mean.append(df['mean'][0]) + + # return mean + + # def get_std_devs(self, tally): + # std_dev = [] + # nsamples = self.find_nsamples(tally) + # with h5py.File(self.filepath, 'r') as f: + # for n in range(nsamples): + # df = pd.DataFrame( + # f[tally+f'_{n}'+'/table'][()]).drop(columns='index') + # std_dev.append(df['std. dev.'][0]) + + # return std_dev def get_gauss(mu, sigma): From 5267bbea7b2653325b97c5a360a50597f8f5456b Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 16:43:44 -0400 Subject: [PATCH 20/26] doc to modify_xs_xml --- .../data/modify_xs_xml.py | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py index 320426f9..b950b4b4 100644 --- a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py +++ b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py @@ -5,25 +5,78 @@ _this_script_dir = os.path.dirname(os.path.abspath(__file__)) _model_xml_path = os.path.join(_this_script_dir, 'model_xs.xml') -def get_env_variable(var_name): - # Retrieve the value of the environment variable + +def get_env_variable(var_name: str) -> str: + """Get the value of an environment variable. + + Parameters + ---------- + var_name : str + The name of the environment variable. + + Returns + ------- + str + The value of the environment variable. + """ value = os.getenv(var_name) if value is None: return f"Environment variable '{var_name}' is not set." return value -def rewrite_xs_xml(model_xs_file:str=_model_xml_path, new_xs_file:str='cross_sections_mod.xml'): +def rewrite_xs_xml(new_xs_file: str = 'cross_sections_mod.xml'): + """Rewrite the cross_sections.xml file locally, in order not to modify the + original file. + + Parameters + ---------- + new_xs_file : str, optional + name of the new xs file to be created, + by default 'cross_sections_mod.xml' + """ # read xs file model_xs_file = get_env_variable('OPENMC_CROSS_SECTIONS') myxs = openmc.data.DataLibrary.from_xml(model_xs_file) myxs.export_to_xml(new_xs_file) -def create_xs_dict(xs_h5_file:str, nuclide: str, type:str='neutron'): +def create_xs_dict(xs_h5_file: str, nuclide: str, type: str = 'neutron') -> dict: + """Create a dictionary with the correct format for an cross_sections.xml file + for a given target nuclide and the path to its corresponding h5 xs file. + + + Parameters + ---------- + xs_h5_file : str + path to the target nuclide h5 xs file + nuclide : str + nuclide name in gnds format + type : str, optional + type of incident particle (i.e. neutron, photon), by default 'neutron' + + Returns + ------- + dict + dictionary with the path to the h5 xs file, the type of incident + particle and the target nuclide + """ return {'path': xs_h5_file, 'type': type, 'materials': [nuclide]} -def perturb_xs_xml(xs_file, xs_h5_file, nuclide: str): + +def perturb_xs_xml(xs_file: str, xs_h5_file: str, nuclide: str): + """Perturb the cross_sections.xml file by replacing the original path of a + nuclide xs with a new path to a new (perturbed) h5 xs file. + + Parameters + ---------- + xs_file : str + name of the xs xml file to perturb + xs_h5_file : str + path to the new (perturbed) h5 xs file + nuclide : str + nuclide name in gnds format + """ # read xs file myxs = openmc.data.DataLibrary.from_xml(xs_file) try: @@ -31,4 +84,4 @@ def perturb_xs_xml(xs_file, xs_h5_file, nuclide: str): except TypeError: myxs.append(create_xs_dict(xs_h5_file, nuclide)) # export to modified cross_sections xml file - myxs.export_to_xml(xs_file) \ No newline at end of file + myxs.export_to_xml(xs_file) From 2d9557e79b42d9ccf48a3222837702b56ca93b7f Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 17:28:42 -0400 Subject: [PATCH 21/26] minor mod in modify_xs_xml --- src/openmc_fusion_benchmarks/data/modify_xs_xml.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py index b950b4b4..610f861c 100644 --- a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py +++ b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py @@ -3,7 +3,6 @@ _this_script_dir = os.path.dirname(os.path.abspath(__file__)) -_model_xml_path = os.path.join(_this_script_dir, 'model_xs.xml') def get_env_variable(var_name: str) -> str: From 9ecebbc7ce4bf5dee13f1235dea26aab0aa3bcd8 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 17:31:26 -0400 Subject: [PATCH 22/26] refactored stats_analysis --- .../data/stats_analysis.py | 79 ------------------- 1 file changed, 79 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/stats_analysis.py b/src/openmc_fusion_benchmarks/data/stats_analysis.py index 21bb4bb9..1ec08755 100644 --- a/src/openmc_fusion_benchmarks/data/stats_analysis.py +++ b/src/openmc_fusion_benchmarks/data/stats_analysis.py @@ -1,85 +1,6 @@ -import re -from pathlib import Path import numpy as np -import pandas as pd -import h5py from scipy.stats import norm -import openmc_fusion_benchmarks as ofb - - -class ResultsFromTMC(ofb.ResultsFromDatabase): - def __init__(self, file): - super().__init__(file) - - # self.filename = file.strip().split('/') - # self.filepath = Path(file) - - # def list_tallies(self): - # # Create a set to store unique base names - # base_names = set() - - # # Regular expression to capture the pattern 'name_N' - # pattern = re.compile(r"(.+?)_(\d+)$") - - # # Open the HDF5 file - # with h5py.File(self.filepath, 'r') as hdf: - # # List all datasets in the HDF5 file - # dataset_names = list(hdf.keys()) - - # # Loop through the dataset names - # for name in dataset_names: - # match = pattern.match(name) - # if match: - # # Capture the base name - # base_name = match.group(1) - # # Add to the set of unique base names - # base_names.add(base_name) - - # def find_nsamples(self, tally): - - # # Open the HDF5 file - # with h5py.File(self.filepath, 'r') as hdf: - # # List all datasets in the HDF5 file - # dataset_names = list(hdf.keys()) - # # Initialize to track the highest N - # max_n = -1 - # # Loop through the datasets to find the ones that match the pattern base_name_N - # for name in dataset_names: - # if name.startswith(tally + '_'): - # # Extract N and update max_n if N is larger - # n = int(name.split('_')[-1]) - # if n > max_n: - # max_n = n - - # if max_n == -1: - # msg = f"No datasets found with base name '{tally}' in the HDF5 file." - # raise ValueError(msg) - # else: - # return max_n - - # def get_means(self, tally): - # mean = [] - # nsamples = self.find_nsamples(tally) - # with h5py.File(self.filepath, 'r') as f: - # for n in range(nsamples): - # df = pd.DataFrame( - # f[tally+f'_{n}'+'/table'][()]).drop(columns='index') - # mean.append(df['mean'][0]) - - # return mean - - # def get_std_devs(self, tally): - # std_dev = [] - # nsamples = self.find_nsamples(tally) - # with h5py.File(self.filepath, 'r') as f: - # for n in range(nsamples): - # df = pd.DataFrame( - # f[tally+f'_{n}'+'/table'][()]).drop(columns='index') - # std_dev.append(df['std. dev.'][0]) - - # return std_dev - def get_gauss(mu, sigma): x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000) From 6947d40b5ea02452a8b16b1065a27d7ff3c3d878 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 23 Oct 2024 18:15:56 -0400 Subject: [PATCH 23/26] perturb_xs=true in tmc_engine --- src/openmc_fusion_benchmarks/data/tmc_engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openmc_fusion_benchmarks/data/tmc_engine.py b/src/openmc_fusion_benchmarks/data/tmc_engine.py index 37d788fd..5dd3b534 100644 --- a/src/openmc_fusion_benchmarks/data/tmc_engine.py +++ b/src/openmc_fusion_benchmarks/data/tmc_engine.py @@ -7,7 +7,7 @@ def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, - reaction: int, perturb_xs: bool = False): + reaction: int, perturb_xs: bool = True): # convert nuclide to gnds name nuclide = get_nuclide_gnds(nuclide) xs_file = f'cross_sections_mod.xml' From 9fd7a2811baa70274d759ba7262b342a37f1e986 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 31 Oct 2024 14:34:48 -0400 Subject: [PATCH 24/26] + doc to tmc_engine --- .../data/tmc_engine.py | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/openmc_fusion_benchmarks/data/tmc_engine.py b/src/openmc_fusion_benchmarks/data/tmc_engine.py index 5dd3b534..9728655b 100644 --- a/src/openmc_fusion_benchmarks/data/tmc_engine.py +++ b/src/openmc_fusion_benchmarks/data/tmc_engine.py @@ -7,7 +7,36 @@ def tmc_engine(model: openmc.Model, nsamples: int, lib_name: str, nuclide, - reaction: int, perturb_xs: bool = True): + reaction: int = None, perturb_xs: bool = True): + """Runs a TMC simulation on a given OpenMC model object. + With perturb_xs=True it is possible to perturb the cross sections of a + specific nuclide and reaction from a given nuclear data library + automatically before the starting of the actual TMC simulation. + The results of the TMC simulation are stored in a .h5 file as OpenMC + tallies in PandasDataFrame format. + + Parameters + ---------- + model : openmc.Model + OpenMC model object to run TMC simulations on + nsamples : int + Number of samples to run in the TMC simulation + (i.e. number of times the xs is perturbed) + lib_name : str + Name of the nuclear data library to perturb the xs from + (e.g. 'ENDF/B-VIII.0') + nuclide : str or int + Identifier of the nuclide for which the cross section is perturbed + (GNDS, ZAID or ZAM) + reaction : int, optional + MT value for the specific reaction to perturb, by default None + perturb_xs : bool, optional + Flag for the automatic generation of perturbed .h5 xs files right + before running the TMC simulation. Set to False if the use has already + a set of perturbed xs in .h5 format + to point to, by default True + """ + # convert nuclide to gnds name nuclide = get_nuclide_gnds(nuclide) xs_file = f'cross_sections_mod.xml' From 2cfae063455cf695ed7cac0cc29ee09ddce16f4b Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Thu, 31 Oct 2024 16:14:45 -0400 Subject: [PATCH 25/26] + doc in sandy_wrapper --- .../data/sandy_wrapper.py | 78 ++++++++++++++++++- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/sandy_wrapper.py b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py index 11bf968e..0306d774 100644 --- a/src/openmc_fusion_benchmarks/data/sandy_wrapper.py +++ b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py @@ -7,7 +7,16 @@ import openmc.data -def remove_ace_files(directory, lib_name): +def remove_ace_files(directory: str, lib_name: str): + """Remove ACE files generated by sandy from a given directory. + + Parameters + ---------- + directory : str + Path to the directory where the ACE files are located + lib_name : str + Name of the nuclear data library used to generate the ACE files + """ # List of extensions to remove extensions = ['03c', '03c.xsd', lib_name] @@ -22,7 +31,32 @@ def remove_ace_files(directory, lib_name): print(f"Error removing {file_path}: {e}") -def get_ace_files(nsamples, lib_name, nuclide, reaction, nprocesses, error): +def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, + nprocesses: int, error: float): + """Generate ACE files for a given nuclide and reaction from a defined + nuclear data library using sandy. + + Parameters + ---------- + nsamples : int + Number of perturbed cross section samples to generate + lib_name : str + Name of the nuclear data library to generate the ACE files from + nuclide : str or int or tuple + Identifier of the nuclide for which the cross section is perturbed + (GNDS, ZAID or ZAM) + reaction : int + MT value for the specific reaction to perturb + nprocesses : int + Number of processes for parallel processing + error : float + Error tolerance for processing in sandy + + Returns + ------- + list + List of ACE files generated + """ # convert nuclide to ZAID nuclide_zaid = get_nuclide_zaid(nuclide) tape = sandy.get_endf6_file(lib_name, "xs", nuclide_zaid*10, to_file=True) @@ -67,7 +101,21 @@ def get_ace_files(nsamples, lib_name, nuclide, reaction, nprocesses, error): return ace_files -def ace_to_hdf5(nsamples, lib_name, nuclide, remove_ace=True): +def ace_to_hdf5(nsamples: int, lib_name: str, nuclide, remove_ace: bool = True): + """Convert ACE files to HDF5 using OpenMC. + + Parameters + ---------- + nsamples : int + Number of perturbed cross section samples to convert + lib_name : str + Name of the nuclear data library used to generate the ACE files + nuclide : str or int or tuple + Identifier of the nuclide for which the cross section is perturbed + (GNDS, ZAID or ZAM) + remove_ace : bool, optional + removes the original ACE files, by default True + """ # convert nuclide to gnds and ZAID nuclide_gnds = get_nuclide_gnds(nuclide) nuclide_zaid = get_nuclide_zaid(nuclide) @@ -94,12 +142,34 @@ def ace_to_hdf5(nsamples, lib_name, nuclide, remove_ace=True): remove_ace_files('', lib_name) -def perturb_to_hdf5(nsamples, lib_name, nuclide, reaction, nprocesses=1, error=.001): +def perturb_to_hdf5(nsamples: int, lib_name: str, nuclide, reaction: int, + nprocesses: int = 1, error: float = .001): + """Perturb nuclear data and convert to HDF5 format. + + Parameters + ---------- + nsamples : int + Number of perturbed cross section samples to generate + lib_name : str + Name of the nuclear data library to generate the ACE files from + nuclide : int or str or tuple + Identifier of the nuclide for which the cross section is perturbed + (GNDS, ZAID or ZAM) + reaction : int + MT value for the specific reaction to perturb + nprocesses : int, optional + Number of processes for parallel processing, by default 1 + error : float, optional + Error tolerance for processing in sandy, by default .001 + """ get_ace_files(nsamples, lib_name, nuclide, reaction, nprocesses, error) ace_to_hdf5(nsamples, lib_name, nuclide, remove_ace=True) def main(): + """Main function to run the perturbation and conversion to HDF5 + via command line. + """ parser = argparse.ArgumentParser( description="Generate ACE files with perturbed nuclear data.") parser.add_argument("-n", "--nuclide", required=True, From dae343e2d03fcfc30c95da0e1844f7385f4702ba Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Fri, 1 Nov 2024 08:57:42 -0400 Subject: [PATCH 26/26] + arg types in functions definition --- .../data/data_conventions.py | 31 ++++++++++++-- .../data/jade_sphere.py | 15 +++---- .../data/modify_xs_xml.py | 16 ++++---- .../data/sandy_wrapper.py | 40 ++++++++++--------- 4 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/openmc_fusion_benchmarks/data/data_conventions.py b/src/openmc_fusion_benchmarks/data/data_conventions.py index eb085481..8fb1a551 100644 --- a/src/openmc_fusion_benchmarks/data/data_conventions.py +++ b/src/openmc_fusion_benchmarks/data/data_conventions.py @@ -1,12 +1,14 @@ -import openmc +import openmc.data +from typing import Union -def zaid_to_zam(zaid) -> tuple: +def zaid_to_zam(zaid: int) -> tuple: """Converts a ZAID to Z, A, and M. Parameters ---------- - zaid : nuclide ZAID + zaid : int + nuclide ZAID Returns ------- @@ -55,7 +57,7 @@ def get_nuclide_zaid(nuclide): return nuclide[0]*1000 + nuclide[1] -def get_nuclide_gnds(nuclide): +def get_nuclide_gnds(nuclide: Union[str, int]) -> str: """Gets the GNDS name from a nuclide ZAID Parameters @@ -73,3 +75,24 @@ def get_nuclide_gnds(nuclide): elif type(nuclide) == int: zam = zaid_to_zam(nuclide) return openmc.data.gnds_name(zam[0], zam[1], zam[2]) + + +def get_reaction_mt(reaction: Union[str, int]) -> int: + """Gets the MT value from a reaction name + + Parameters + ---------- + reaction : str or int + The reaction name or MT value + + Returns + ------- + int + The MT value of the reaction + """ + try: + mt = openmc.data.REACTION_MT[reaction] + except KeyError: + mt = reaction + + return mt diff --git a/src/openmc_fusion_benchmarks/data/jade_sphere.py b/src/openmc_fusion_benchmarks/data/jade_sphere.py index 513cc9ee..21959eeb 100644 --- a/src/openmc_fusion_benchmarks/data/jade_sphere.py +++ b/src/openmc_fusion_benchmarks/data/jade_sphere.py @@ -1,15 +1,16 @@ import openmc -def jade_sphere(material:openmc.Material, particles:int=int(1e5), - photon_transport:bool=False, nreactions=None, greactions=None): +def jade_sphere(material: openmc.Material, particles: int = int(1e5), + photon_transport: bool = False, nreactions=None, + greactions=None) -> openmc.model.Model: materials = openmc.Materials([material]) # geometry - s1 = openmc.Sphere(r=5.) - s2 = openmc.Sphere(r= 50.) - s3 = openmc.Sphere(r= 60.0, boundary_type='vacuum') + s1 = openmc.Sphere(r=5.) + s2 = openmc.Sphere(r=50.) + s3 = openmc.Sphere(r=60.0, boundary_type='vacuum') region1 = -s1 region2 = +s1 & -s2 @@ -74,5 +75,5 @@ def jade_sphere(material:openmc.Material, particles:int=int(1e5), t.filters = [cell2_filter, photon_filter] t.scores = [reaction] tallies_file.append(t) - - return openmc.model.Model(geometry, materials, settings, tallies_file) \ No newline at end of file + + return openmc.model.Model(geometry, materials, settings, tallies_file) diff --git a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py index 610f861c..aeefb3ed 100644 --- a/src/openmc_fusion_benchmarks/data/modify_xs_xml.py +++ b/src/openmc_fusion_benchmarks/data/modify_xs_xml.py @@ -31,7 +31,7 @@ def rewrite_xs_xml(new_xs_file: str = 'cross_sections_mod.xml'): Parameters ---------- new_xs_file : str, optional - name of the new xs file to be created, + Name of the new xs file to be created, by default 'cross_sections_mod.xml' """ # read xs file @@ -48,16 +48,16 @@ def create_xs_dict(xs_h5_file: str, nuclide: str, type: str = 'neutron') -> dict Parameters ---------- xs_h5_file : str - path to the target nuclide h5 xs file + Path to the target nuclide h5 xs file nuclide : str - nuclide name in gnds format + Nuclide name in gnds format type : str, optional - type of incident particle (i.e. neutron, photon), by default 'neutron' + Type of incident particle (i.e. neutron, photon), by default 'neutron' Returns ------- dict - dictionary with the path to the h5 xs file, the type of incident + Dictionary with the path to the h5 xs file, the type of incident particle and the target nuclide """ return {'path': xs_h5_file, 'type': type, 'materials': [nuclide]} @@ -70,11 +70,11 @@ def perturb_xs_xml(xs_file: str, xs_h5_file: str, nuclide: str): Parameters ---------- xs_file : str - name of the xs xml file to perturb + Name of the xs xml file to perturb xs_h5_file : str - path to the new (perturbed) h5 xs file + Path to the new (perturbed) h5 xs file nuclide : str - nuclide name in gnds format + Nuclide name in gnds format """ # read xs file myxs = openmc.data.DataLibrary.from_xml(xs_file) diff --git a/src/openmc_fusion_benchmarks/data/sandy_wrapper.py b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py index 0306d774..209e3e98 100644 --- a/src/openmc_fusion_benchmarks/data/sandy_wrapper.py +++ b/src/openmc_fusion_benchmarks/data/sandy_wrapper.py @@ -1,10 +1,11 @@ -from .data_conventions import get_nuclide_zaid, get_nuclide_gnds +from .data_conventions import get_nuclide_zaid, get_nuclide_gnds, get_reaction_mt import os import glob import argparse import sandy import openmc import openmc.data +from typing import Union def remove_ace_files(directory: str, lib_name: str): @@ -31,8 +32,8 @@ def remove_ace_files(directory: str, lib_name: str): print(f"Error removing {file_path}: {e}") -def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, - nprocesses: int, error: float): +def get_ace_files(nsamples: int, lib_name: str, nuclide: Union[str, int], + reaction: Union[str, int], nprocesses: int, error: float): """Generate ACE files for a given nuclide and reaction from a defined nuclear data library using sandy. @@ -42,11 +43,11 @@ def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, Number of perturbed cross section samples to generate lib_name : str Name of the nuclear data library to generate the ACE files from - nuclide : str or int or tuple + nuclide : str or int Identifier of the nuclide for which the cross section is perturbed - (GNDS, ZAID or ZAM) - reaction : int - MT value for the specific reaction to perturb + (GNDS, ZAID) + reaction : str or int + String name or MT value for the specific reaction to perturb nprocesses : int Number of processes for parallel processing error : float @@ -59,6 +60,7 @@ def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, """ # convert nuclide to ZAID nuclide_zaid = get_nuclide_zaid(nuclide) + reaction_mt = get_reaction_mt(reaction) tape = sandy.get_endf6_file(lib_name, "xs", nuclide_zaid*10, to_file=True) # Generate perturbations @@ -71,7 +73,7 @@ def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, xs=True, nubar=False, verbose=True, - errorr33_kws=dict(mt=reaction) + errorr33_kws=dict(mt=reaction_mt) ), ) @@ -101,7 +103,8 @@ def get_ace_files(nsamples: int, lib_name: str, nuclide, reaction: int, return ace_files -def ace_to_hdf5(nsamples: int, lib_name: str, nuclide, remove_ace: bool = True): +def ace_to_hdf5(nsamples: int, lib_name: str, nuclide: Union[str, int], + remove_ace: bool = True): """Convert ACE files to HDF5 using OpenMC. Parameters @@ -110,9 +113,9 @@ def ace_to_hdf5(nsamples: int, lib_name: str, nuclide, remove_ace: bool = True): Number of perturbed cross section samples to convert lib_name : str Name of the nuclear data library used to generate the ACE files - nuclide : str or int or tuple + nuclide : str or int Identifier of the nuclide for which the cross section is perturbed - (GNDS, ZAID or ZAM) + (GNDS, ZAID) remove_ace : bool, optional removes the original ACE files, by default True """ @@ -142,8 +145,9 @@ def ace_to_hdf5(nsamples: int, lib_name: str, nuclide, remove_ace: bool = True): remove_ace_files('', lib_name) -def perturb_to_hdf5(nsamples: int, lib_name: str, nuclide, reaction: int, - nprocesses: int = 1, error: float = .001): +def perturb_to_hdf5(nsamples: int, lib_name: str, nuclide: Union[str, int], + reaction: Union[str, int], nprocesses: int = 1, + error: float = .001): """Perturb nuclear data and convert to HDF5 format. Parameters @@ -152,11 +156,11 @@ def perturb_to_hdf5(nsamples: int, lib_name: str, nuclide, reaction: int, Number of perturbed cross section samples to generate lib_name : str Name of the nuclear data library to generate the ACE files from - nuclide : int or str or tuple + nuclide : int or str Identifier of the nuclide for which the cross section is perturbed - (GNDS, ZAID or ZAM) - reaction : int - MT value for the specific reaction to perturb + (GNDS, ZAID) + reaction : str or int + Str name or MT value for the specific reaction to perturb nprocesses : int, optional Number of processes for parallel processing, by default 1 error : float, optional @@ -176,7 +180,7 @@ def main(): help="Nuclide identifier (ZA number)") parser.add_argument("-xs", "--lib_name", type=str, default=1, help="Cross section choice ['JEFF_32', 'JEFF_33', 'ENDFB_71', 'ENDFB_80', 'JENDL_40U', 'IRDFF_2']") - parser.add_argument("-r", "--reaction", type=int, + parser.add_argument("-r", "--reaction", type=Union[str, int], nargs='+', help="MT value for specific reaction") parser.add_argument("-e", "--error", type=float, default=0.001, help="Error tolerance for processing")