diff --git a/docs/source/io_formats/plots.rst b/docs/source/io_formats/plots.rst index 9b1a79081c..966d2b8023 100644 --- a/docs/source/io_formats/plots.rst +++ b/docs/source/io_formats/plots.rst @@ -72,7 +72,7 @@ sub-elements: default Gnome viewer, IrfanView, etc.). The "voxel" plot type produces a binary datafile containing voxel grid positioning and the cell or material (specified by the ``color`` tag) at the center of each voxel. These - datafiles can be processed into 3D SILO files using the :ref:`scripts_voxel` + datafiles can be processed into VTK files using the :ref:`scripts_voxel` script provided with OpenMC, and subsequently viewed with a 3D viewer such as VISIT or Paraview. See the :ref:`io_voxel` for information about the datafile structure. @@ -82,7 +82,7 @@ sub-elements: the PNG format can often times reduce the file size by orders of magnitude without any loss of image quality. Likewise, high-resolution voxel files produced by OpenMC can be quite large, - but the equivalent SILO files will be significantly smaller. + but the equivalent VTK files will be significantly smaller. *Default*: "slice" diff --git a/docs/source/usersguide/cross_sections.rst b/docs/source/usersguide/cross_sections.rst index a5adb3dcc0..dc0e9092ad 100644 --- a/docs/source/usersguide/cross_sections.rst +++ b/docs/source/usersguide/cross_sections.rst @@ -10,15 +10,16 @@ or multi-group mode. In continuous-energy mode, OpenMC uses a native `HDF5 `_ format (see :ref:`io_nuclear_data`) to -store all nuclear data. If you have ACE format data that was produced with -NJOY_, such as that distributed with MCNP_ or Serpent_, it can be converted to -the HDF5 format using the :ref:`scripts_ace` script (or :ref:`using the Python -API `). Several sources provide openly available ACE data as -described below and can be easily converted using the provided scripts. The -TALYS-based evaluated nuclear data library, TENDL_, is also available in ACE -format. In addition to tabulated cross sections in the HDF5 files, OpenMC relies -on :ref:`windowed multipole ` data to perform on-the-fly -Doppler broadening. +store all nuclear data. Pregenerated HDF5 libraries can be found at +https://openmc.mcs.anl.gov; unless you have specific data needs, it is highly +recommended to use one of the pregenerated libraries. Alternatively, if you have +ACE format data that was produced with NJOY_, such as that distributed with +MCNP_ or Serpent_, it can be converted to the HDF5 format using the :ref:`using +the Python API `. Several sources provide openly available +ACE data including the `ENDF/B`_, JEFF_, and TENDL_ +libraries. In addition to tabulated cross sections in the HDF5 files, OpenMC +relies on :ref:`windowed multipole ` data to perform +on-the-fly Doppler broadening. In multi-group mode, OpenMC utilizes an HDF5-based library format which can be used to describe nuclide- or material-specific quantities. @@ -56,85 +57,16 @@ profile (``.profile`` or ``.bashrc`` in bash_). Continuous-Energy Cross Sections -------------------------------- -Using ENDF/B-VII.1 Cross Sections from NNDC -------------------------------------------- +Using Pregenerated Libraries +---------------------------- -The NNDC_ provides ACE data from the ENDF/B-VII.1 neutron and thermal scattering -sublibraries at room temperature processed using NJOY_. To use this data with -OpenMC, the :ref:`scripts_nndc` script can be used to automatically download and -extract the ACE data, fix any deficiencies, and create an HDF5 library: - -.. code-block:: sh - - openmc-get-nndc-data - -At this point, you should set the :envvar:`OPENMC_CROSS_SECTIONS` environment -variable to the absolute path of the file ``nndc_hdf5/cross_sections.xml``. This -cross section set is used by the test suite. - -Using JEFF Cross Sections from OECD/NEA ---------------------------------------- - -The NEA_ provides processed ACE data from the JEFF_ library. To use this data -with OpenMC, the :ref:`scripts_jeff` script can be used to automatically -download and extract the ACE data, fix any deficiencies, and create an HDF5 -library. - -.. code-block:: sh - - openmc-get-jeff-data - -At this point, you should set the :envvar:`OPENMC_CROSS_SECTIONS` environment -variable to the absolute path of the file ``jeff-3.2-hdf5/cross_sections.xml``. - -Using Cross Sections from MCNP ------------------------------- - -OpenMC provides two scripts (:ref:`scripts_mcnp70` and :ref:`scripts_mcnp71`) -that will automatically convert ENDF/B-VII.0 and ENDF/B-VII.1 ACE data that is -provided with MCNP5 or MCNP6. To convert the ENDF/B-VII.0 ACE files -(``endf70[a-k]`` and ``endf70sab``) into the native HDF5 format, run the -following: - -.. code-block:: sh - - openmc-convert-mcnp70-data /path/to/mcnpdata/ - -where ``/path/to/mcnpdata`` is the directory containing the ``endf70[a-k]`` -files. - -To convert the ENDF/B-VII.1 ACE files (the endf71x and ENDF71SaB libraries), use -the following script: - -.. code-block:: sh - - openmc-convert-mcnp71-data /path/to/mcnpdata - -where ``/path/to/mcnpdata`` is the directory containing the ``endf71x`` and -``ENDF71SaB`` directories. - -.. _other_cross_sections: - -Using Other Cross Sections --------------------------- - -If you have a library of ACE format cross sections other than those listed above -that you need to convert to OpenMC's HDF5 format, the :ref:`scripts_ace` script -can be used. There are four different ways you can specify ACE libraries that -are to be converted: - -1. List each ACE library as a positional argument. This is very useful in - conjunction with the usual shell utilities (ls, find, etc.). -2. Use the ``--xml`` option to specify a pre-v0.9 cross_sections.xml file. -3. Use the ``--xsdir`` option to specify a MCNP xsdir file. -4. Use the ``--xsdata`` option to specify a Serpent xsdata file. - -The script does not use any extra information from cross_sections.xml/ xsdir/ -xsdata files to determine whether the nuclide is metastable. Instead, the -``--metastable`` argument can be used to specify whether the ZAID naming -convention follows the NNDC data convention (1000*Z + A + 300 + 100*m), or the -MCNP data convention (essentially the same as NNDC, except that the first -metastable state of Am242 is 95242 and the ground state is 95642). +Various evaluated nuclear data libraries have been processed into the HDF5 +format required by OpenMC and can be found at https://openmc.mcs.anl.gov. You +can find both libraries generated by the OpenMC development team as well as +libraries based on ACE files distributed elsewhere. To use these libraries, +download the archive file, unpack it, and then set your +:envvar:`OPENMC_CROSS_SECTIONS` environment variable to the absolute path of +the ``cross_sections.xml`` file contained in the unpacked directory. .. _create_xs_library: @@ -201,7 +133,7 @@ If you need to create a nuclear data library and you do not already have suitable ACE files or you need to further customize the data (for example, adding more temperatures), the :meth:`IncidentNeutron.from_njoy` and :meth:`ThermalScattering.from_njoy` methods can be used to create data instances -by directly running NJOY. Both methods require that you pass the name of ENDF +by directly running NJOY_. Both methods require that you pass the name of ENDF file(s) that are passed on to NJOY. For example, to generate data for Zr-92:: zr92 = openmc.data.IncidentNeutron.from_njoy('n-040_Zr_092.endf') @@ -235,8 +167,10 @@ Enabling Resonance Scattering Treatments In order for OpenMC to correctly treat elastic scattering in heavy nuclides where low-lying resonances might be present (see :ref:`energy_dependent_xs_model`), the elastic scattering cross section at 0 K -must be present. To add the 0 K elastic scattering cross section to existing -:class:`IncidentNeutron` instance, you can use the +must be present. If the data you are using was generated via +:meth:`IncidentNeutron.from_njoy`, you will already have 0 K elastic scattering +cross sections available. Otherwise, to add 0 K elastic scattering cross +sections to an existing :class:`IncidentNeutron` instance, you can use the :meth:`IncidentNeutron.add_elastic_0K_from_endf` method which requires an ENDF file for the nuclide you are modifying:: @@ -260,21 +194,15 @@ Photon interaction data is needed to run OpenMC with photon transport enabled. Some of this data, namely bremsstrahlung cross sections from `Seltzer and Berger`_, stopping powers from the `NIST ESTAR database`_, and Compton profiles calculated by `Biggs et al.`_ and available in the Geant4 G4EMLOW data file, is -distributed with OpenMC. The rest is available from the NNDC, which provides +distributed with OpenMC. The rest is available from the NNDC_, which provides ENDF data from the photo-atomic and atomic relaxation sublibraries of the -ENDF/B-VII.1 library. By default, the :ref:`scripts_nndc` script will download -the ENDF data in addition to the neutron and thermal scattering data, extract -it, combine it with the data from other sources, and convert it to an HDF5 -library. Alternatively, the :ref:`scripts_photon` script can be used to -download the photon data on its own and create the HDF5 library: +ENDF/B-VII.1 library. -.. code-block:: sh - - openmc-get-photon-data - -As with neutrons and thermal scattering, it is possible to use the Python API -directly to convert photon interaction data from an ENDF or ACE file to an HDF5 -file. The :class:`openmc.data.IncidentPhoton` class contains an +Most of the pregenerated HDF5 libraries available at https://openmc.mcs.anl.gov +already have photon interaction data included. If you are building a data +library yourself, it is possible to use the Python API directly to convert +photon interaction data from an ENDF or ACE file to an HDF5 file. The +:class:`openmc.data.IncidentPhoton` class contains an :meth:`IncidentPhoton.from_ace` method that will generate photon data from an ACE table and an :meth:`IncidentPhoton.export_to_hdf5` method that writes the data to an HDF5 file: @@ -285,7 +213,7 @@ data to an HDF5 file: u.export_to_hdf5('U.h5') Similarly, the :meth:`IncidentPhoton.from_endf` method can be used to read -photon data from an ENDF file. In the case, both the photo-atomic and atomic +photon data from an ENDF file. In this case, both the photo-atomic and atomic relaxation sublibrary files are required: :: @@ -308,6 +236,11 @@ and unpack an archive (.zip or .tag.gz) from GitHub. Once unpacked, you can use the :class:`openmc.data.DataLibrary` class to register the .h5 files as described in :ref:`create_xs_library`. +The `official ENDF/B-VII.1 HDF5 library +`_ includes the windowed +multipole library, so if you are using this library, the windowed multipole data +will already be available to you. + -------------------------- Multi-Group Cross Sections -------------------------- @@ -322,13 +255,13 @@ to the absolute path of the file library expected to used most frequently. For an example of how to create a multi-group library, see :ref:`notebook_mg_mode_part_i`. -.. _NJOY: https://njoy.github.io/NJOY2016/ -.. _NNDC: http://www.nndc.bnl.gov/endf/b7.1/acefiles.html -.. _NEA: http://www.oecd-nea.org -.. _JEFF: https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/ -.. _MCNP: http://mcnp.lanl.gov +.. _NJOY: http://www.njoy21.io/ +.. _NNDC: https://www.nndc.bnl.gov/endf +.. _MCNP: https://mcnp.lanl.gov .. _Serpent: http://montecarlo.vtt.fi -.. _TENDL: https://tendl.web.psi.ch/tendl_2015/tendl2015.html -.. _Seltzer and Berger: https://www.sciencedirect.com/science/article/pii/0092640X86900148?via%3Dihub +.. _ENDF/B: https://www.nndc.bnl.gov/endf/b7.1/acefiles.html +.. _JEFF: http://www.oecd-nea.org/dbdata/jeff/jeff33/ +.. _TENDL: https://tendl.web.psi.ch/tendl_2017/tendl2017.html +.. _Seltzer and Berger: https://doi.org/10.1016/0092-640X(86)90014-8 .. _NIST ESTAR database: https://physics.nist.gov/PhysRefData/Star/Text/ESTAR.html -.. _Biggs et al.: https://www.sciencedirect.com/science/article/pii/0092640X75900303 +.. _Biggs et al.: https://doi.org/10.1016/0092-640X(75)90030-3 diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index d3e59c06e1..75d8d432e1 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -167,7 +167,7 @@ Prerequisites `_). For use in OpenMC, only the ``MOAB_DIR`` and ``BUILD_TALLY`` variables need to be specified in the CMake configuration step. - | + * git_ version control software for obtaining source code @@ -478,10 +478,6 @@ as for OpenMC. The Python VTK bindings are needed to convert voxel and track files to VTK format. - `silomesh `_ - The silomesh package is needed to convert voxel and track files to SILO - format. - `pytest `_ The pytest framework is used for unit testing the Python API. diff --git a/docs/source/usersguide/plots.rst b/docs/source/usersguide/plots.rst index 630ee1adf6..f21d2c8c59 100644 --- a/docs/source/usersguide/plots.rst +++ b/docs/source/usersguide/plots.rst @@ -125,10 +125,10 @@ can subsequently be converted into a standard mesh format that can be viewed in `ParaView `_, `VisIt `_, etc. This typically will compress the size of the file significantly. The provided -:ref:`scripts_voxel` script can convert the HDF5 voxel file to VTK or SILO -formats. Once processed into a standard 3D file format, colors and masks can be -defined using the stored ID numbers to better explore the geometry. The process -for doing this will depend on the 3D viewer, but should be straightforward. +:ref:`scripts_voxel` script can convert the HDF5 voxel file to VTK formats. Once +processed into a standard 3D file format, colors and masks can be defined using +the stored ID numbers to better explore the geometry. The process for doing this +will depend on the 3D viewer, but should be straightforward. .. note:: 3D voxel plotting can be very computer intensive for the viewing program (Visit, ParaView, etc.) if the number of voxels is large (>10 diff --git a/docs/source/usersguide/scripts.rst b/docs/source/usersguide/scripts.rst index 3246a0e67c..76c7c2f222 100644 --- a/docs/source/usersguide/scripts.rst +++ b/docs/source/usersguide/scripts.rst @@ -95,94 +95,6 @@ otherwise. --fission_energy_release FISSION_ENERGY_RELEASE HDF5 file containing fission energy release data -.. _scripts_mcnp70: - ------------------------------- -``openmc-convert-mcnp70-data`` ------------------------------- - -This script converts ENDF/B-VII.0 ACE data from the MCNP5/6 distribution into an -HDF5 library that can be used by OpenMC. This assumes that you have a directory -containing files named endf70a, endf70b, ..., endf70k, and endf70sab. The path -to the directory containing these files should be given as a positional -argument. The following optional arguments are available: - --d DESTINATION, --destination DESTINATION - Directory to create new library in (Default: mcnp_endfb70) - -.. _scripts_mcnp71: - ------------------------------- -``openmc-convert-mcnp71-data`` ------------------------------- - -This script converts ENDF/B-VII.1 ACE data from the MCNP6 distribution into an -HDF5 library that can be used by OpenMC. This assumes that you have a directory -containing subdirectories 'endf71x' and 'ENDF71SaB'. The path to the directory -containing these subdirectories should be given as a positional argument. The -following optional arguments are available: - --d DESTINATION, --destination DESTINATION - Directory to create new library in (Default: mcnp_endfb71) - --f FER, --fission_energy_release FER - HDF5 file containing fission energy release data - -.. _scripts_jeff: - ------------------------- -``openmc-get-jeff-data`` ------------------------- - -This script downloads `JEFF 3.2 ACE data -`_ from OECD/NEA -and converts it to a multi-temperature HDF5 library for use with OpenMC. It has -the following optional arguments: - --b, --batch - Suppress standard in - --d DESTINATION, --destination DESTINATION - Directory to create new library in (default: jeff-3.2-hdf5) - -.. warning:: This script will download approximately 9 GB of data. Extracting - and processing the data may require as much as 40 GB of additional - free disk space. - -.. _scripts_nndc: - ------------------------- -``openmc-get-nndc-data`` ------------------------- - -This script downloads `ENDF/B-VII.1 -`_ incident neutron ACE data -and incident photon ENDF data from NNDC and converts it to an HDF5 library for -use with OpenMC. This script has the following optional arguments: - --b, --batch - Suppress standard in - --n, --neutron_only - Whether to exclude photon interaction/atomic data - -.. _scripts_photon: - --------------------------- -``openmc-get-photon-data`` --------------------------- - -This script downloads `ENDF data `_ -from NNDC for photo-atomic and atomic relaxation sublibraries and converts it -to an HDF5 library for use with photon transport in OpenMC. This script has the -following optional arguments: - --b, --batch - Suppress standard in - --c, --cross-sections - cross_sections.xml file to append libraries to - .. _scripts_compton: ----------------------- @@ -294,24 +206,21 @@ Message Description .. _scripts_voxel: --------------------------- -``openmc-voxel-to-silovtk`` +``openmc-voxel-to-vtk`` --------------------------- When OpenMC generates :ref:`voxel plots `, they are in an :ref:`HDF5 format ` that is not terribly useful by itself. The -``openmc-voxel-to-silovtk`` script converts a voxel HDF5 file to `VTK -`_ or `SILO -`_ file. For VTK, you need -to have the VTK Python bindings installed. For SILO, you need to have `silomesh -`_ installed. To convert a voxel file, -simply provide the path to the file: +``openmc-voxel-to-vtk`` script converts a voxel HDF5 file to a `VTK +`_ file. To run this script, you will need to have the VTK +Python bindings installed. To convert a voxel file, simply provide the path to +the file: .. code-block:: sh - openmc-voxel-to-silovtk voxel_1.h5 + openmc-voxel-to-vtk voxel_1.h5 -The ``openmc-voxel-to-silovtk`` script also takes the following optional +The ``openmc-voxel-to-vtk`` script also takes the following optional command-line arguments: --o, --output Path to output VTK or SILO file --s, --silo Flag to convert to SILO instead of VTK +-o, --output Path to output VTK file diff --git a/scripts/openmc-convert-lib80x-data b/scripts/openmc-convert-lib80x-data deleted file mode 100755 index 9a8acc68e5..0000000000 --- a/scripts/openmc-convert-lib80x-data +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -from collections import defaultdict -import glob -import os - -import openmc.data - - -description = """ -Convert ENDF/B-VIII.0 ACE data from LANL into an HDF5 library -that can be used by OpenMC. This assumes that you have a directory containing -subdirectories 'Lib80x' and 'ENDF80SaB'. - -""" - - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - - -parser = argparse.ArgumentParser( - description=description, - formatter_class=CustomFormatter -) -parser.add_argument('-o', '--output_dir', default='lib80x_hdf5', - help='Directory to create new library in') -parser.add_argument('--libver', choices=['earliest', 'latest'], - default='earliest', help="Output HDF5 versioning. Use " - "'earliest' for backwards compatibility or 'latest' for " - "performance") -parser.add_argument('--datadir', help='Directory containing Lib80x and ENDF80SaB', - default=os.curdir) -args = parser.parse_args() -assert os.path.isdir(args.datadir) - -# Get a list of all ACE files -lib80x = glob.glob(os.path.join(args.datadir, 'Lib80x', '**', '*.80?nc'), recursive=True) -lib80sab = glob.glob(os.path.join(args.datadir, 'ENDF80SaB', '**', '*.??t'), recursive=True) - -# Find and fix B10 ACE files -b10files = glob.glob(os.path.join(args.datadir, 'Lib80x', '**', '5010.80?nc'), recursive=True) -nxs1_position = 523 -for filename in b10files: - with open(filename, 'r+') as fh: - # Read NXS(1) - fh.seek(nxs1_position) - nxs1 = int(fh.read(5)) - - # Increase length to match actual length of XSS, but make sure this - # isn't done twice by checking the current length - if nxs1 < 86870: - fh.seek(nxs1_position) - fh.write(str(nxs1 + 53)) - -# Group together tables for the same nuclide -suffixes = defaultdict(list) -for filename in sorted(lib80x + lib80sab): - dirname, basename = os.path.split(filename) - zaid, xs = basename.split('.') - suffixes[os.path.join(dirname, zaid)].append(xs) - -# Create output directory if it doesn't exist -if not os.path.isdir(args.output_dir): - os.mkdir(args.output_dir) - -library = openmc.data.DataLibrary() - -for basename, xs_list in sorted(suffixes.items()): - # Convert first temperature for the table - filename = '.'.join((basename, xs_list[0])) - print('Converting: ' + filename) - if filename.endswith('t'): - data = openmc.data.ThermalScattering.from_ace(filename) - else: - data = openmc.data.IncidentNeutron.from_ace(filename, 'mcnp') - - # For each higher temperature, add cross sections to the existing table - for xs in xs_list[1:]: - filename = '.'.join((basename, xs)) - print('Adding: ' + filename) - if filename.endswith('t'): - data.add_temperature_from_ace(filename) - else: - data.add_temperature_from_ace(filename, 'mcnp') - - # Export HDF5 file - h5_file = os.path.join(args.output_dir, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# Write cross_sections.xml -libpath = os.path.join(args.output_dir, 'cross_sections.xml') -library.export_to_xml(libpath) diff --git a/scripts/openmc-convert-mcnp70-data b/scripts/openmc-convert-mcnp70-data deleted file mode 100755 index 75b3b0a5a8..0000000000 --- a/scripts/openmc-convert-mcnp70-data +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -from collections import defaultdict -import glob -import os - -import openmc.data - - -description = """ -Convert ENDF/B-VII.0 ACE data from the MCNP5/6 distribution into an HDF5 library -that can be used by OpenMC. This assumes that you have a directory containing -files named endf70a, endf70b, ..., endf70k, and endf70sab. - -""" - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - -parser = argparse.ArgumentParser( - description=description, - formatter_class=CustomFormatter -) -parser.add_argument('-d', '--destination', default='mcnp_endfb70', - help='Directory to create new library in') -parser.add_argument('--libver', choices=['earliest', 'latest'], - default='earliest', help="Output HDF5 versioning. Use " - "'earliest' for backwards compatibility or 'latest' for " - "performance") -parser.add_argument('mcnpdata', help='Directory containing endf70[a-k] and endf70sab') -args = parser.parse_args() -assert os.path.isdir(args.mcnpdata) - -# Get a list of all neutron ACE files -endf70 = glob.glob(os.path.join(args.mcnpdata, 'endf70[a-k]')) - -# Create output directory if it doesn't exist -if not os.path.isdir(args.destination): - os.mkdir(args.destination) - -library = openmc.data.DataLibrary() - -for path in sorted(endf70): - print('Loading data from {}...'.format(path)) - lib = openmc.data.ace.Library(path) - - # Group together tables for the same nuclide - tables = defaultdict(list) - for table in lib.tables: - zaid, xs = table.name.split('.') - tables[zaid].append(table) - - for zaid, tables in sorted(tables.items()): - # Convert first temperature for the table - print('Converting: ' + tables[0].name) - data = openmc.data.IncidentNeutron.from_ace(tables[0], 'mcnp') - - # For each higher temperature, add cross sections to the existing table - for table in tables[1:]: - print('Adding: ' + table.name) - data.add_temperature_from_ace(table, 'mcnp') - - # Export HDF5 file - h5_file = os.path.join(args.destination, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# Handle S(a,b) tables -endf70sab = os.path.join(args.mcnpdata, 'endf70sab') -if os.path.exists(endf70sab): - lib = openmc.data.ace.Library(endf70sab) - - # Group together tables for the same nuclide - tables = defaultdict(list) - for table in lib.tables: - name, xs = table.name.split('.') - tables[name].append(table) - - for zaid, tables in sorted(tables.items()): - # Convert first temperature for the table - print('Converting: ' + tables[0].name) - data = openmc.data.ThermalScattering.from_ace(tables[0]) - - # For each higher temperature, add cross sections to the existing table - for table in tables[1:]: - print('Adding: ' + table.name) - data.add_temperature_from_ace(table) - - # Export HDF5 file - h5_file = os.path.join(args.destination, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# Write cross_sections.xml -libpath = os.path.join(args.destination, 'cross_sections.xml') -library.export_to_xml(libpath) diff --git a/scripts/openmc-convert-mcnp71-data b/scripts/openmc-convert-mcnp71-data deleted file mode 100755 index eaaad078dd..0000000000 --- a/scripts/openmc-convert-mcnp71-data +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -from collections import defaultdict -import glob -import os - -import openmc.data - - -description = """ -Convert ENDF/B-VII.1 ACE data from the MCNP6 distribution into an HDF5 library -that can be used by OpenMC. This assumes that you have a directory containing -subdirectories 'endf71x' and 'ENDF71SaB'. - -""" - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - -parser = argparse.ArgumentParser( - description=description, - formatter_class=CustomFormatter -) -parser.add_argument('-d', '--destination', default='mcnp_endfb71', - help='Directory to create new library in') -parser.add_argument('--libver', choices=['earliest', 'latest'], - default='earliest', help="Output HDF5 versioning. Use " - "'earliest' for backwards compatibility or 'latest' for " - "performance") -parser.add_argument('mcnpdata', help='Directory containing endf71x and ENDF71SaB') -args = parser.parse_args() -assert os.path.isdir(args.mcnpdata) - -# Get a list of all ACE files -endf71x = glob.glob(os.path.join(args.mcnpdata, 'endf71x', '*', '*.71?nc')) -endf71sab = glob.glob(os.path.join(args.mcnpdata, 'ENDF71SaB' , '*.2?t')) - -# There's a bug in H-Zr at 1200 K -endf71sab.remove(os.path.join(args.mcnpdata, 'ENDF71SaB' , 'h-zr.27t')) - -# Group together tables for the same nuclide -suffixes = defaultdict(list) -for filename in sorted(endf71x + endf71sab): - dirname, basename = os.path.split(filename) - zaid, xs = basename.split('.') - suffixes[os.path.join(dirname, zaid)].append(xs) - -# Create output directory if it doesn't exist -if not os.path.isdir(args.destination): - os.mkdir(args.destination) - -library = openmc.data.DataLibrary() - -for basename, xs_list in sorted(suffixes.items()): - # Convert first temperature for the table - filename = '.'.join((basename, xs_list[0])) - print('Converting: ' + filename) - if filename.endswith('t'): - data = openmc.data.ThermalScattering.from_ace(filename) - else: - data = openmc.data.IncidentNeutron.from_ace(filename, 'mcnp') - - # For each higher temperature, add cross sections to the existing table - for xs in xs_list[1:]: - filename = '.'.join((basename, xs)) - print('Adding: ' + filename) - if filename.endswith('t'): - data.add_temperature_from_ace(filename) - else: - data.add_temperature_from_ace(filename, 'mcnp') - - # Export HDF5 file - h5_file = os.path.join(args.destination, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# Write cross_sections.xml -libpath = os.path.join(args.destination, 'cross_sections.xml') -library.export_to_xml(libpath) diff --git a/scripts/openmc-get-jeff-data b/scripts/openmc-get-jeff-data deleted file mode 100755 index 03b58163b0..0000000000 --- a/scripts/openmc-get-jeff-data +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/env python3 - -import os -from collections import defaultdict -import sys -import tarfile -import zipfile -import glob -import argparse -from string import digits -from urllib.request import urlopen - -import openmc.data - - -description = """ -Download JEFF 3.2 ACE data from OECD/NEA and convert it to a multi-temperature -HDF5 library for use with OpenMC. - -""" - -download_warning = """ -WARNING: This script will download approximately 9 GB of data. Extracting and -processing the data may require as much as 40 GB of additional free disk -space. Note that if you don't need all 11 temperatures, you can modify the -'files' list in the script to download only the data you want. - -Are you sure you want to continue? ([y]/n) -""" - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - -parser = argparse.ArgumentParser( - description=description, - formatter_class=CustomFormatter -) -parser.add_argument('-b', '--batch', action='store_true', - help='supresses standard in') -parser.add_argument('-d', '--destination', default='jeff-3.2-hdf5', - help='Directory to create new library in') -parser.add_argument('--libver', choices=['earliest', 'latest'], - default='latest', help="Output HDF5 versioning. Use " - "'earliest' for backwards compatibility or 'latest' for " - "performance") -args = parser.parse_args() - -response = input(download_warning) if not args.batch else 'y' -if response.lower().startswith('n'): - sys.exit() - -base_url = 'https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/Processed/' -files = ['JEFF32-ACE-293K.tar.gz', - 'JEFF32-ACE-400K.tar.gz', - 'JEFF32-ACE-500K.tar.gz', - 'JEFF32-ACE-600K.tar.gz', - 'JEFF32-ACE-700K.tar.gz', - 'JEFF32-ACE-800K.zip', - 'JEFF32-ACE-900K.tar.gz', - 'JEFF32-ACE-1000K.tar.gz', - 'JEFF32-ACE-1200K.tar.gz', - 'JEFF32-ACE-1500K.tar.gz', - 'JEFF32-ACE-1800K.tar.gz', - 'TSLs.tar.gz'] - -block_size = 16384 - -# ============================================================================== -# DOWNLOAD FILES FROM OECD SITE - -files_complete = [] -for f in files: - # Establish connection to URL - url = base_url + f - req = urlopen(url) - - # Get file size from header - if sys.version_info[0] < 3: - file_size = int(req.info().getheaders('Content-Length')[0]) - else: - file_size = req.length - downloaded = 0 - - # Check if file already downloaded - if os.path.exists(f): - if os.path.getsize(f) == file_size: - print('Skipping {}, already downloaded'.format(f)) - files_complete.append(f) - continue - else: - overwrite = input('Overwrite {}? ([y]/n) '.format(f)) - if overwrite.lower().startswith('n'): - continue - - # Copy file to disk - print('Downloading {}... '.format(f), end='') - with open(f, 'wb') as fh: - while True: - chunk = req.read(block_size) - if not chunk: break - fh.write(chunk) - downloaded += len(chunk) - status = '{:10} [{:3.2f}%]'.format(downloaded, downloaded * 100. / file_size) - print(status + chr(8)*len(status), end='') - print('') - files_complete.append(f) - -# ============================================================================== -# EXTRACT FILES FROM TGZ - -for f in files: - if f not in files_complete: - continue - - # Extract files - if f.endswith('.zip'): - with zipfile.ZipFile(f, 'r') as zipf: - print('Extracting {}...'.format(f)) - zipf.extractall('jeff-3.2') - - else: - suffix = 'ACEs_293K' if '293' in f else '' - with tarfile.open(f, 'r') as tgz: - print('Extracting {}...'.format(f)) - tgz.extractall(os.path.join('jeff-3.2', suffix)) - - # Remove thermal scattering tables from 293K data since they are - # redundant - if '293' in f: - for path in glob.glob(os.path.join('jeff-3.2', 'ACEs_293K', '*-293.ACE')): - os.remove(path) - -# ============================================================================== -# CHANGE ZAID FOR METASTABLES - -metastables = glob.glob(os.path.join('jeff-3.2', '**', '*M.ACE')) -for path in metastables: - print(' Fixing {} (ensure metastable)...'.format(path)) - text = open(path, 'r').read() - mass_first_digit = int(text[3]) - if mass_first_digit <= 2: - text = text[:3] + str(mass_first_digit + 4) + text[4:] - open(path, 'w').write(text) - -# ============================================================================== -# GENERATE HDF5 LIBRARY -- NEUTRON FILES - -# Get a list of all ACE files -neutron_files = glob.glob(os.path.join('jeff-3.2', '*', '*.ACE')) - -# Group together tables for same nuclide -tables = defaultdict(list) -for filename in sorted(neutron_files): - dirname, basename = os.path.split(filename) - name = basename.split('.')[0] - tables[name].append(filename) - -# Sort temperatures from lowest to highest -for name, filenames in sorted(tables.items()): - filenames.sort(key=lambda x: int( - x.split(os.path.sep)[1].split('_')[1][:-1])) - -# Create output directory if it doesn't exist -if not os.path.isdir(args.destination): - os.mkdir(args.destination) - -library = openmc.data.DataLibrary() - -for name, filenames in sorted(tables.items()): - # Convert first temperature for the table - print('Converting: ' + filenames[0]) - data = openmc.data.IncidentNeutron.from_ace(filenames[0]) - - # For each higher temperature, add cross sections to the existing table - for filename in filenames[1:]: - print('Adding: ' + filename) - data.add_temperature_from_ace(filename) - - # Export HDF5 file - h5_file = os.path.join(args.destination, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# ============================================================================== -# GENERATE HDF5 LIBRARY -- S(A,B) FILES - -sab_files = glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '*', '*.ace')) - -# Group together tables for same nuclide -tables = defaultdict(list) -for filename in sorted(sab_files): - dirname, basename = os.path.split(filename) - name = basename.split('-')[0] - tables[name].append(filename) - -# Sort temperatures from lowest to highest -for name, filenames in sorted(tables.items()): - filenames.sort(key=lambda x: int( - os.path.split(x)[1].split('-')[1].split('.')[0])) - -for name, filenames in sorted(tables.items()): - # Convert first temperature for the table - print('Converting: ' + filenames[0]) - - # Take numbers out of table name, e.g. lw10.32t -> lw.32t - table = openmc.data.ace.get_table(filenames[0]) - name, xs = table.name.split('.') - table.name = '.'.join((name.strip(digits), xs)) - data = openmc.data.ThermalScattering.from_ace(table) - - # For each higher temperature, add cross sections to the existing table - for filename in filenames[1:]: - print('Adding: ' + filename) - table = openmc.data.ace.get_table(filename) - name, xs = table.name.split('.') - table.name = '.'.join((name.strip(digits), xs)) - data.add_temperature_from_ace(table) - - # Export HDF5 file - h5_file = os.path.join(args.destination, data.name + '.h5') - print('Writing {}...'.format(h5_file)) - data.export_to_hdf5(h5_file, 'w', libver=args.libver) - - # Register with library - library.register_file(h5_file) - -# Write cross_sections.xml -libpath = os.path.join(args.destination, 'cross_sections.xml') -library.export_to_xml(libpath) diff --git a/scripts/openmc-get-nndc-data b/scripts/openmc-get-nndc-data deleted file mode 100755 index ff02d3e4c3..0000000000 --- a/scripts/openmc-get-nndc-data +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python - -""" -Download ENDF/B-VII.1 incident neutron ACE data and incident photon ENDF data -from NNDC and convert it to an HDF5 library for use with OpenMC. This data is -used for OpenMC's regression test suite. -""" - -import os -import shutil -import subprocess -import sys -import tarfile -import glob -import hashlib -import argparse -from urllib.request import urlopen - -import openmc.data - - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - -parser = argparse.ArgumentParser( - description=__doc__, - formatter_class=CustomFormatter -) -parser.add_argument('-b', '--batch', action='store_true', - help='supresses standard in') -parser.add_argument('-n', '--neutron-only', action='store_true', - help='Whether to exclude photon interaction/atomic data') -parser.add_argument('--libver', choices=['earliest', 'latest'], - default='earliest', help="Output HDF5 versioning. Use " - "'earliest' for backwards compatibility or 'latest' for " - "performance") -args = parser.parse_args() - -base_url = 'http://www.nndc.bnl.gov/endf/b7.1/aceFiles/' -files = ['ENDF-B-VII.1-neutron-293.6K.tar.gz', - 'ENDF-B-VII.1-tsl.tar.gz'] -checksums = ['9729a17eb62b75f285d8a7628ace1449', - 'e17d827c92940a30f22f096d910ea186'] -block_size = 16384 - -# ============================================================================== -# DOWNLOAD FILES FROM NNDC SITE - -files_complete = [] -for f in files: - # Establish connection to URL - url = base_url + f - req = urlopen(url) - - # Get file size from header - file_size = req.length - downloaded = 0 - - # Check if file already downloaded - if os.path.exists(f): - if os.path.getsize(f) == file_size: - print('Skipping ' + f) - files_complete.append(f) - continue - else: - overwrite = input('Overwrite {}? ([y]/n) '.format(f)) - if overwrite.lower().startswith('n'): - continue - - # Copy file to disk - print('Downloading {}... '.format(f), end='') - with open(f, 'wb') as fh: - while True: - chunk = req.read(block_size) - if not chunk: break - fh.write(chunk) - downloaded += len(chunk) - status = '{0:10} [{1:3.2f}%]'.format( - downloaded, downloaded * 100. / file_size) - print(status + chr(8)*len(status), end='') - print('') - files_complete.append(f) - -# ============================================================================== -# VERIFY MD5 CHECKSUMS - -print('Verifying MD5 checksums...') -for f, checksum in zip(files, checksums): - downloadsum = hashlib.md5(open(f, 'rb').read()).hexdigest() - if downloadsum != checksum: - raise IOError("MD5 checksum for {} does not match. If this is your first " - "time receiving this message, please re-run the script. " - "Otherwise, please contact OpenMC developers by emailing " - "openmc-users@googlegroups.com.".format(f)) - -# ============================================================================== -# EXTRACT FILES FROM TGZ - -for f in files: - if f not in files_complete: - continue - - # Extract files - suffix = f[f.rindex('-') + 1:].rstrip('.tar.gz') - with tarfile.open(f, 'r') as tgz: - print('Extracting {}...'.format(f)) - tgz.extractall(path='nndc/' + suffix) - -# Move ACE files down one level -for filename in glob.glob('nndc/293.6K/ENDF-B-VII.1-neutron-293.6K/*'): - shutil.move(filename, 'nndc/293.6K/' + os.path.basename(filename)) - -# ============================================================================== -# FIX ZAID ASSIGNMENTS FOR VARIOUS S(A,B) TABLES - -def fix_zaid(table, old, new): - filename = os.path.join('nndc', 'tsl', table) - with open(filename, 'r') as fh: - text = fh.read() - text = text.replace(old, new, 1) - with open(filename, 'w') as fh: - fh.write(text) - -print('Fixing ZAIDs for S(a,b) tables') -fix_zaid('bebeo.acer', '8016', ' 0') -fix_zaid('obeo.acer', '4009', ' 0') - -# ============================================================================== -# PROMPT USER TO DELETE .TAR.GZ FILES - -# Ask user to delete -if not args.batch: - response = input('Delete *.tar.gz files? ([y]/n) ') -else: - response = 'y' - -# Delete files if requested -if not response or response.lower().startswith('y'): - for f in files: - if os.path.exists(f): - print('Removing {}...'.format(f)) - os.remove(f) - -# ============================================================================== -# GENERATE HDF5 LIBRARY - -# get a list of all ACE files -ace_files = sorted(glob.glob(os.path.join('nndc', '**', '*.ace*'))) - -# Call the ace-to-hdf5 conversion script -pwd = os.path.dirname(os.path.realpath(__file__)) -ace2hdf5 = os.path.join(pwd, 'openmc-ace-to-hdf5') -subprocess.call([ace2hdf5, - '-d', 'nndc_hdf5', - '--libver', args.libver] + ace_files) - -# Generate photo interaction library files -if not args.neutron_only: - pwd = os.path.dirname(os.path.realpath(__file__)) - photo_endf = os.path.join(pwd, 'openmc-get-photon-data') - subprocess.call([photo_endf, '-c', 'cross_sections.xml'], - cwd='nndc_hdf5')