diff --git a/.travis.yml b/.travis.yml index c1d3c86b2..64fbdc9df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,23 @@ addons: packages: - gfortran - g++ + - mpich + - libmpich-dev cache: directories: - - $HOME/mpich_install - - $HOME/hdf5_install - - $HOME/phdf5_install - $HOME/nndc_hdf5 +env: + - OPENMC_CONFIG="check_source" + - OPENMC_CONFIG="^hdf5-debug$" + - OPENMC_CONFIG="^omp-hdf5-debug$" + - OPENMC_CONFIG="^mpi-hdf5-debug$" + - OPENMC_CONFIG="^phdf5-debug$" + +# We aren't testing the check_source script so just run it with Python 3. +matrix: + exclude: + - python: "2.7" + env: OPENMC_CONFIG="check_source" before_install: # ============== Handle Python third-party packages ============== @@ -29,30 +40,37 @@ before_install: - conda config --set always_yes yes --set changeps1 no - conda update -q conda - conda info -a - - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION six numpy scipy h5py=2.5 pandas - - source activate test-environment - - # Install GCC, MPICH, HDF5, PHDF5 - - ./tests/travis_install.sh - - export FC=gfortran - - export MPI_DIR=$HOME/mpich_install - - export PHDF5_DIR=$HOME/phdf5_install - - export HDF5_DIR=$HOME/hdf5_install + - if [[ $OPENMC_CONFIG != "check_source" ]]; then + conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION six numpy scipy h5py=2.5 pandas; + source activate test-environment; + sudo add-apt-repository ppa:nschloe/hdf5-backports -y; + sudo apt-get update -q; + sudo apt-get install libhdf5-serial-dev libhdf5-mpich-dev -y; + export FC=gfortran; + export MPI_DIR=/usr; + export PHDF5_DIR=/usr; + export HDF5_DIR=/usr; + fi install: true before_script: - - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://anl.box.com/shared/static/a6sw2cep34wlz6b9i9jwiotaqoayxcxt.xz -O - | tar -C $HOME -xvJ; + - if [[ $OPENMC_CONFIG != "check_source" ]]; then + if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then + wget https://anl.box.com/shared/static/a6sw2cep34wlz6b9i9jwiotaqoayxcxt.xz -O - | tar -C $HOME -xvJ; + fi; + export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml; + git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib; + tar xzvf wmp_lib/multipole_lib.tar.gz; + export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib; fi - - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml - - - git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib - - tar xzvf wmp_lib/multipole_lib.tar.gz - - export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib script: - cd tests - export OMP_NUM_THREADS=2 - - ./travis.sh + - if [[ $OPENMC_CONFIG == "check_source" ]]; then + ./check_source.py; + else + ./run_tests.py -C $OPENMC_CONFIG -j 2; + fi - cd .. diff --git a/CMakeLists.txt b/CMakeLists.txt index 19d2d3886..c21b44cc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) project(openmc Fortran C CXX) # Setup output directories @@ -21,6 +21,11 @@ if (${UNIX}) add_definitions(-DUNIX) endif() +# Set MACOSX_RPATH +if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif() + #=============================================================================== # Command line options #=============================================================================== @@ -62,10 +67,12 @@ endif() # this, we check for the environment variable HDF5_ROOT and if it exists, use it # to check whether its a parallel version. -if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc) - set(HDF5_PREFER_PARALLEL TRUE) -else() - set(HDF5_PREFER_PARALLEL FALSE) +if(NOT DEFINED HDF5_PREFER_PARALLEL) + if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc) + set(HDF5_PREFER_PARALLEL TRUE) + else() + set(HDF5_PREFER_PARALLEL FALSE) + endif() endif() find_package(HDF5 COMPONENTS Fortran_HL) @@ -98,6 +105,8 @@ endif() # endif() #endif() +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # Make sure version is sufficient execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -dumpversion @@ -107,60 +116,47 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) endif() # GCC compiler options - list(APPEND f90flags -cpp -std=f2008 -fbacktrace -O2) - list(APPEND cflags -cpp -std=c99 -O2) + list(APPEND f90flags -cpp -std=f2008ts -fbacktrace -O2) if(debug) list(REMOVE_ITEM f90flags -O2) - list(REMOVE_ITEM cflags -O2) list(APPEND f90flags -g -Wall -pedantic -fbounds-check -ffpe-trap=invalid,overflow,underflow) - list(APPEND cflags -g -Wall -pedantic -fbounds-check) list(APPEND ldflags -g) endif() if(profile) list(APPEND f90flags -pg) - list(APPEND cflags -pg) list(APPEND ldflags -pg) endif() if(optimize) list(REMOVE_ITEM f90flags -O2) - list(REMOVE_ITEM cflags -O2) list(APPEND f90flags -O3) - list(APPEND cflags -O3) endif() if(openmp) list(APPEND f90flags -fopenmp) - list(APPEND cflags -fopenmp) list(APPEND ldflags -fopenmp) endif() if(coverage) list(APPEND f90flags -coverage) - list(APPEND cflags -coverage) list(APPEND ldflags -coverage) endif() elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) # Intel compiler options list(APPEND f90flags -fpp -std08 -assume byterecl -traceback) - list(APPEND cflags -std=c99) if(debug) list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check "-check all" -fpe0 -O0) - list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check -O0) list(APPEND ldflags -g) endif() if(profile) list(APPEND f90flags -pg) - list(APPEND cflags -pg) list(APPEND ldflags -pg) endif() if(optimize) list(APPEND f90flags -O3) - list(APPEND cflags -O3) endif() if(openmp) list(APPEND f90flags -qopenmp) - list(APPEND cflags -qopenmp) list(APPEND ldflags -qopenmp) endif() @@ -212,6 +208,49 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Cray) endif() +if(CMAKE_C_COMPILER_ID STREQUAL GNU) + # GCC compiler options + list(APPEND cflags -std=c99 -O2) + if(debug) + list(REMOVE_ITEM cflags -O2) + list(APPEND cflags -g -Wall -pedantic -fbounds-check) + endif() + if(profile) + list(APPEND cflags -pg) + endif() + if(optimize) + list(REMOVE_ITEM cflags -O2) + list(APPEND cflags -O3) + endif() + if(coverage) + list(APPEND cflags -coverage) + endif() + +elseif(CMAKE_C_COMPILER_ID STREQUAL Intel) + # Intel compiler options + list(APPEND cflags -std=c99) + if(debug) + list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check -O0) + endif() + if(profile) + list(APPEND cflags -pg) + endif() + if(optimize) + list(APPEND cflags -O3) + endif() + +elseif(CMAKE_C_COMPILER_ID MATCHES Clang) + # Clang options + list(APPEND cflags -std=c99) + if(debug) + list(APPEND cflags -g -O0 -ftrapv) + endif() + if(optimize) + list(APPEND cflags -O3) + endif() + +endif() + # Show flags being used message(STATUS "Fortran flags: ${f90flags}") message(STATUS "C flags: ${cflags}") @@ -262,6 +301,7 @@ set(LIBOPENMC_FORTRAN_SRC src/angle_distribution.F90 src/angleenergy_header.F90 src/bank_header.F90 + src/api.F90 src/cmfd_data.F90 src/cmfd_execute.F90 src/cmfd_header.F90 @@ -279,9 +319,7 @@ set(LIBOPENMC_FORTRAN_SRC src/endf.F90 src/endf_header.F90 src/energy_distribution.F90 - src/energy_grid.F90 src/error.F90 - src/finalize.F90 src/geometry.F90 src/geometry_header.F90 src/global.F90 @@ -344,34 +382,18 @@ set(LIBOPENMC_FORTRAN_SRC src/volume_calc.F90 src/volume_header.F90 src/xml_interface.F90) -add_library(libopenmc STATIC ${LIBOPENMC_FORTRAN_SRC}) +add_library(libopenmc SHARED ${LIBOPENMC_FORTRAN_SRC}) set_target_properties(libopenmc PROPERTIES OUTPUT_NAME openmc) add_executable(${program} src/main.F90) set_property(TARGET ${program} libopenmc pugixml_fortran PROPERTY LINKER_LANGUAGE Fortran) -# target_include_directories was added in CMake 2.8.11 and is the recommended -# way to set include directories. For lesser versions, we revert to set_property -if(CMAKE_VERSION VERSION_LESS 2.8.11) - include_directories(${HDF5_INCLUDE_DIRS}) -else() - target_include_directories(libopenmc PUBLIC ${HDF5_INCLUDE_DIRS}) -endif() +target_include_directories(libopenmc PUBLIC ${HDF5_INCLUDE_DIRS}) -# target_compile_options was added in CMake 2.8.12 and is the recommended way to -# set compile flags. Note that this sets the COMPILE_OPTIONS property (also -# available only in 2.8.12+) rather than the COMPILE_FLAGS property, which is -# deprecated. The former can handle lists whereas the latter cannot. -if (CMAKE_VERSION VERSION_LESS 2.8.12) - string(REPLACE ";" " " f90flags "${f90flags}") - string(REPLACE ";" " " cflags "${cflags}") - set_property(TARGET ${program} PROPERTY COMPILE_FLAGS "${f90flags}") - set_property(TARGET faddeeva PROPERTY COMPILE_FLAGS "${cflags}") -else() - target_compile_options(${program} PUBLIC ${f90flags}) - target_compile_options(libopenmc PUBLIC ${f90flags}) - target_compile_options(faddeeva PRIVATE ${cflags}) -endif() +# set compile flags via target_compile_options +target_compile_options(${program} PUBLIC ${f90flags}) +target_compile_options(libopenmc PUBLIC ${f90flags}) +target_compile_options(faddeeva PRIVATE ${cflags}) # Add HDF5 library directories to link line with -L foreach(LIBDIR ${HDF5_LIBRARY_DIRS}) @@ -383,6 +405,16 @@ endforeach() target_link_libraries(libopenmc ${ldflags} ${HDF5_LIBRARIES} pugixml_fortran faddeeva) target_link_libraries(${program} ${ldflags} libopenmc) +#=============================================================================== +# Python package +#=============================================================================== + +add_custom_command(TARGET libopenmc POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + $ + ${CMAKE_CURRENT_SOURCE_DIR}/openmc/capi/_$ + COMMENT "Copying libopenmc to Python module directory") + #=============================================================================== # Install executable, scripts, manpage, license #=============================================================================== diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst new file mode 100644 index 000000000..1e30eacf1 --- /dev/null +++ b/docs/source/capi/index.rst @@ -0,0 +1,261 @@ +.. _capi: + +===== +C API +===== + +.. c:function:: void openmc_calculate_voumes() + + Run a stochastic volume calculation + +.. c:function:: int openmc_cell_get_id(int32_t index, int32_t* id) + + Get the ID of a cell + + :param index: Index in the cells array + :type index: int32_t + :param id: ID of the cell + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_cell_set_temperature(index index, double T, int32_t* instance) + + Set the temperature of a cell. + + :param index: Index in the cells array + :type index: int32_t + :param T: Temperature in Kelvin + :type T: double + :param instance: Which instance of the cell. To set the temperature for all + instances, pass a null pointer. + :type instance: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: void openmc_finalize() + + Finalize a simulation + +.. c:function:: void openmc_find(double* xyz, int rtype, int32_t* id, int32_t* instance) + + Determine the ID of the cell/material containing a given point + + :param xyz: Cartesian coordinates + :type xyz: double[3] + :param rtype: Which ID to return (1=cell, 2=material) + :type rtype: int + :param id: ID of the cell/material found. If a material is requested and the + point is in a void, the ID is 0. If an error occurs, the ID is -1. + :type id: int32_t* + :param instance: If a cell is repetaed in the geometry, the instance of the + cell that was found and zero otherwise. + :type instance: int32_t* + +.. c:function:: int openmc_get_cell(int32_t id, int32_t* index) + + Get the index in the cells array for a cell with a given ID + + :param id: ID of the cell + :type id: int32_t + :param index: Index in the cells array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_keff(double k_combined[]) + + :param k_combined: Combined estimate of k-effective + :type k_combined: double[2] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_nuclide(char name[], int* index) + + Get the index in the nuclides array for a nuclide with a given name + + :param name: Name of the nuclide + :type name: char[] + :param index: Index in the nuclides array + :type index: int* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_tally(int32_t id, int32_t* index) + + Get the index in the tallies array for a tally with a given ID + + :param id: ID of the tally + :type id: int32_t + :param index: Index in the tallies array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_material(int32_t id, int32_t* index) + + Get the index in the materials array for a material with a given ID + + :param id: ID of the material + :type id: int32_t + :param index: Index in the materials array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: void openmc_hard_reset() + + Reset tallies, timers, and pseudo-random number generator state + +.. c:function:: void openmc_init(int intracomm) + + Initialize OpenMC + + :param intracomm: MPI intracommunicator + :type intracomm: int + +.. c:function:: int openmc_load_nuclide(char name[]) + + Load data for a nuclide from the HDF5 data library. + + :param name: Name of the nuclide. + :type name: char[] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_add_nuclide(int32_t index, char name[], double density) + + Add a nuclide to an existing material. If the nuclide already exists, the + density is overwritten. + + :param index: Index in the materials array + :type index: int32_t + :param name: Name of the nuclide + :type name: char[] + :param density: Density in atom/b-cm + :type density: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_get_densities(int32_t index, int* nuclides[], double* densities[]) + + Get density for each nuclide in a material. + + :param index: Index in the materials array + :type index: int32_t + :param nuclides: Pointer to array of nuclide indices + :type nuclides: int** + :param densities: Pointer to the array of densities + :type densities: double** + :param n: Length of the array + :type n: int + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_get_id(int32_t index, int32_t* id) + + Get the ID of a material + + :param index: Index in the materials array + :type index: int32_t + :param id: ID of the material + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_material_set_density(int32_t index, double density) + + Set the density of a material. + + :param index: Index in the materials array + :type index: int32_t + :param density: Density of the material in atom/b-cm + :type density: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_set_densities(int32_t, n, char* name[], double density[]) + + :param index: Index in the materials array + :type index: int32_t + :param n: Length of name/density + :type n: int + :param name: Array of nuclide names + :type name: char** + :param density: Array of densities + :type density: double[] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_nuclide_name(int index, char* name[]) + + Get name of a nuclide + + :param index: Index in the nuclides array + :type index: int + :param name: Name of the nuclide + :type name: char** + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: void openmc_plot_geometry() + + Run plotting mode. + +.. c:function:: void openmc_reset() + + Resets all tally scores + +.. c:function:: void openmc_run() + + Run a simulation + +.. c:function:: int openmc_tally_get_id(int32_t index, int32_t* id) + + Get the ID of a tally + + :param index: Index in the tallies array + :type index: int32_t + :param id: ID of the tally + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_get_nuclides(int32_t index, int* nuclides[], int* n) + + Get nuclides specified in a tally + + :param index: Index in the tallies array + :type index: int32_t + :param nuclides: Array of nuclide indices + :type nuclides: int** + :param n: Number of nuclides + :type n: int* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_results(int32_t index, double** ptr, int shape_[3]) + + Get a pointer to tally results array. + + :param index: Index in the tallies array + :type index: int32_t + :param ptr: Pointer to the results array + :type ptr: double** + :param shape_: Shape of the results array + :type shape_: int[3] + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_set_nuclides(int32_t index, int n, char* nuclides[]) + + Set the nuclides for a tally + + :param index: Index in the tallies array + :type index: int32_t + :param n: Number of nuclides + :type n: int + :param nuclides: Array of nuclide names + :type nuclides: char** + :return: Return status (negative if an error occurred) + :rtype: int diff --git a/docs/source/conf.py b/docs/source/conf.py index c3434914b..95930fedb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -25,8 +25,9 @@ except ImportError: MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial', - 'h5py', 'pandas', 'uncertainties', 'openmoc', - 'openmc.data.reconstruct'] + 'numpy.ctypeslib', 'scipy', 'scipy.sparse', 'scipy.interpolate', + 'scipy.integrate', 'scipy.optimize', 'scipy.special', 'h5py', + 'pandas', 'uncertainties', 'openmoc', 'openmc.data.reconstruct'] sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES) import numpy as np diff --git a/docs/source/index.rst b/docs/source/index.rst index ce4a5f6f8..00b09db9e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -36,6 +36,7 @@ free to send a message to the User's Group `mailing list`_. usersguide/index devguide/index pythonapi/index + capi/index io_formats/index publications license diff --git a/docs/source/io_formats/materials.rst b/docs/source/io_formats/materials.rst index fc57280f8..5f0aa3a5e 100644 --- a/docs/source/io_formats/materials.rst +++ b/docs/source/io_formats/materials.rst @@ -107,9 +107,13 @@ Each ``material`` element can have the following attributes or sub-elements: multi-group :ref:`energy_mode`. :sab: - Associates an S(a,b) table with the material. This element has one + Associates an S(a,b) table with the material. This element has an attribute/sub-element called ``name``. The ``name`` attribute is the name of the S(a,b) table that should be associated with the material. + There is also an optional ``fraction`` element which indicates what fraction + of the relevant nuclides will be affected by the S(a,b) table (e.g. which + fraction of a material is crystalline versus amorphous). ``fraction`` + defaults to unity. *Default*: None diff --git a/docs/source/io_formats/settings.rst b/docs/source/io_formats/settings.rst index e9bb5ef53..0aa058cdb 100644 --- a/docs/source/io_formats/settings.rst +++ b/docs/source/io_formats/settings.rst @@ -661,6 +661,17 @@ methods like "nearest" and "interpolation" in the resolved resonance range. *Default*: False +------------------------------- +```` Element +------------------------------- + +The ```` element specifies a minimum and maximum temperature +in Kelvin above and below which cross sections should be loaded for all nuclides +and thermal scattering tables. This can be used for multi-physics simulations +where the temperatures might change from one iteration to the next. + + *Default*: None + .. _temperature_tolerance: ----------------------------------- diff --git a/docs/source/pythonapi/capi.rst b/docs/source/pythonapi/capi.rst new file mode 100644 index 000000000..6e4e860fa --- /dev/null +++ b/docs/source/pythonapi/capi.rst @@ -0,0 +1,39 @@ +--------------------------------------------------- +:data:`openmc.capi` -- Python bindings to the C API +--------------------------------------------------- + +.. automodule:: openmc.capi + +Functions +--------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myfunction.rst + + openmc.capi.calculate_volumes + openmc.capi.finalize + openmc.capi.find_cell + openmc.capi.find_material + openmc.capi.hard_reset + openmc.capi.init + openmc.capi.keff + openmc.capi.load_nuclide + openmc.capi.plot_geometry + openmc.capi.reset + openmc.capi.run + openmc.capi.run_in_memory + +Classes +------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.capi.CellView + openmc.capi.MaterialView + openmc.capi.NuclideView + openmc.capi.TallyView diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 5492f362d..bb99dd470 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -47,5 +47,6 @@ Modules mgxs model data + capi examples openmoc diff --git a/docs/source/usersguide/geometry.rst b/docs/source/usersguide/geometry.rst index 0c18e56ae..bb800699b 100644 --- a/docs/source/usersguide/geometry.rst +++ b/docs/source/usersguide/geometry.rst @@ -19,7 +19,7 @@ surface is a locus of zeros of a function of Cartesian coordinates :math:`x,y,z`, e.g. - A plane perpendicular to the :math:`x` axis: :math:`x - x_0 = 0` -- A cylinder perpendicular to the :math:`z` axis: :math:`(x - x_0)^2 + (y - +- A cylinder parallel to the :math:`z` axis: :math:`(x - x_0)^2 + (y - y_0)^2 - R^2 = 0` - A sphere: :math:`(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 - R^2 = 0` diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index bf7ed5cb0..497e09b4d 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -401,14 +401,6 @@ distributions. NumPy is used extensively within the Python API for its powerful N-dimensional array. - `h5py `_ - h5py provides Python bindings to the HDF5 library. Since OpenMC outputs - various HDF5 files, h5py is needed to provide access to data within these - files from Python. - -.. admonition:: Optional - :class: note - `SciPy `_ SciPy's special functions, sparse matrices, and spatial data structures are used for several optional features in the API. @@ -417,6 +409,14 @@ distributions. Pandas is used to generate tally DataFrames as demonstrated in :ref:`examples_pandas` example notebook. + `h5py `_ + h5py provides Python bindings to the HDF5 library. Since OpenMC outputs + various HDF5 files, h5py is needed to provide access to data within these + files from Python. + +.. admonition:: Optional + :class: note + `Matplotlib `_ Matplotlib is used to providing plotting functionality in the API like the :meth:`Universe.plot` method and the :func:`openmc.plot_xs` function. diff --git a/examples/jupyter/mg-mode-part-i.ipynb b/examples/jupyter/mg-mode-part-i.ipynb index b8fd33d49..cdd56db03 100644 --- a/examples/jupyter/mg-mode-part-i.ipynb +++ b/examples/jupyter/mg-mode-part-i.ipynb @@ -678,7 +678,7 @@ "fission_rates.shape = mesh.dimension\n", "\n", "# Normalize to the average pin power\n", - "fission_rates /= np.mean(fission_rates)\n", + "fission_rates /= np.mean(fission_rates[fission_rates > 0.])\n", "\n", "# Force zeros to be NaNs so their values are not included when matplotlib calculates\n", "# the color scale\n", diff --git a/examples/jupyter/mg-mode-part-ii.ipynb b/examples/jupyter/mg-mode-part-ii.ipynb index 7d3cf305c..7a2b029de 100644 --- a/examples/jupyter/mg-mode-part-ii.ipynb +++ b/examples/jupyter/mg-mode-part-ii.ipynb @@ -1187,7 +1187,7 @@ "mg_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "mg_fission_rates /= np.mean(mg_fission_rates)" + "mg_fission_rates /= np.mean(mg_fission_rates[mg_fission_rates > 0.])" ] }, { @@ -1213,7 +1213,7 @@ "ce_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "ce_fission_rates /= np.mean(ce_fission_rates)" + "ce_fission_rates /= np.mean(ce_fission_rates[ce_fission_rates > 0.])" ] }, { diff --git a/examples/jupyter/mg-mode-part-iii.ipynb b/examples/jupyter/mg-mode-part-iii.ipynb index 6150bb92c..055389131 100644 --- a/examples/jupyter/mg-mode-part-iii.ipynb +++ b/examples/jupyter/mg-mode-part-iii.ipynb @@ -1413,7 +1413,7 @@ " fiss_rates[-1].shape = mesh.dimension\n", " \n", " # Normalize the fission rates\n", - " fiss_rates[-1] /= np.mean(fiss_rates[-1])\n", + " fiss_rates[-1] /= np.mean(fiss_rates[-1][fiss_rates[-1] > 0.])\n", " \n", " # Set 0s to NaNs so they show as white\n", " fiss_rates[-1][fiss_rates[-1] == 0.] = np.nan\n", diff --git a/examples/jupyter/mgxs-part-i.ipynb b/examples/jupyter/mgxs-part-i.ipynb index c05516a89..6fa0c02b1 100644 --- a/examples/jupyter/mgxs-part-i.ipynb +++ b/examples/jupyter/mgxs-part-i.ipynb @@ -89,7 +89,7 @@ "\n", "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", "\n", - "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](http://openmc.readthedocs.io/en/latest/usersguide/tallies.html#filters) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." ] }, { @@ -764,7 +764,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." + "Since the `openmc.mgxs` module uses [tally arithmetic](http://openmc.readthedocs.io/en/latest/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." ] }, { @@ -875,7 +875,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](http://openmc.readthedocs.io/en/latest/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." ] }, { @@ -1176,7 +1176,7 @@ "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", "sum_ratio = absorption_to_total + scattering_to_total\n", "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "# The sum ratio is a derived tally which can generate Pandas DataFrames for inspection\n", "sum_ratio.get_pandas_dataframe()" ] } diff --git a/examples/jupyter/mgxs-part-ii.ipynb b/examples/jupyter/mgxs-part-ii.ipynb index 3346027ee..b12cc4143 100644 --- a/examples/jupyter/mgxs-part-ii.ipynb +++ b/examples/jupyter/mgxs-part-ii.ipynb @@ -8,7 +8,7 @@ "\n", "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", - "* The use of **[tally precision triggers](http://openmc.readthedocs.io/en/latest/usersguide/input.html#trigger-element)** with multi-group cross sections\n", + "* The use of **[tally precision triggers](http://openmc.readthedocs.io/en/latest/io_formats/settings.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", "* The use of the **`openmc.data`** module to plot continuous-energy vs. multi-group cross sections\n", "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", @@ -254,7 +254,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10,000 particles." + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 10,000 particles." ] }, { @@ -350,7 +350,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we showcase the use of OpenMC's [tally precision trigger](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + "Next, we showcase the use of OpenMC's [tally precision trigger](http://openmc.readthedocs.io/en/latest/io_formats/settings.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." ] }, { @@ -962,7 +962,7 @@ }, "outputs": [], "source": [ - "# Extract the 16-group transport cross section for the fuel\n", + "# Extract the 8-group transport cross section for the fuel\n", "fine_xs = xs_library[fuel_cell.id]['transport']\n", "\n", "# Condense to the 2-group structure\n", @@ -973,7 +973,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 16-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." + "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 8-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." ] }, { diff --git a/examples/jupyter/mgxs-part-iii.ipynb b/examples/jupyter/mgxs-part-iii.ipynb index bf871501c..65d8a069f 100644 --- a/examples/jupyter/mgxs-part-iii.ipynb +++ b/examples/jupyter/mgxs-part-iii.ipynb @@ -299,7 +299,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the assembly and then assign it to the root universe." ] }, { @@ -513,7 +513,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with our the fuel assembly geometry." + "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with the fuel assembly geometry." ] }, { @@ -524,7 +524,7 @@ }, "outputs": [], "source": [ - "# Initialize an 2-group MGXS Library for OpenMOC\n", + "# Initialize a 2-group MGXS Library for OpenMOC\n", "mgxs_lib = openmc.mgxs.Library(geometry)\n", "mgxs_lib.energy_groups = groups" ] @@ -1575,7 +1575,7 @@ "openmc_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "openmc_fission_rates /= np.mean(openmc_fission_rates)" + "openmc_fission_rates /= np.mean(openmc_fission_rates[openmc_fission_rates > 0.])" ] }, { @@ -1607,7 +1607,7 @@ "openmoc_fission_rates = np.fliplr(openmoc_fission_rates)\n", "\n", "# Normalize to the average pin fission rate\n", - "openmoc_fission_rates /= np.mean(openmoc_fission_rates)" + "openmoc_fission_rates /= np.mean(openmoc_fission_rates[openmoc_fission_rates > 0.])" ] }, { diff --git a/examples/jupyter/pandas-dataframes.ipynb b/examples/jupyter/pandas-dataframes.ipynb index a44ecfe96..8c409822e 100644 --- a/examples/jupyter/pandas-dataframes.ipynb +++ b/examples/jupyter/pandas-dataframes.ipynb @@ -10,9 +10,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import glob\n", @@ -44,9 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# 1.6 enriched fuel\n", @@ -79,9 +75,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a Materials collection\n", @@ -101,9 +95,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create cylinders for the fuel and clad\n", @@ -130,9 +122,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create fuel Cell\n", @@ -163,9 +153,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create fuel assembly Lattice\n", @@ -185,9 +173,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create root Cell\n", @@ -211,9 +197,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create Geometry and export to \"geometry.xml\"\n", @@ -270,9 +254,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a Plot\n", @@ -281,7 +263,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [21.5, 21.5]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -298,9 +280,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -321,13 +301,11 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX////pgJFyEhJNv8RV\nUZDeAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+EEDRUXN7H1XJgAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA0LTEzVDE3OjIzOjU1LTA0OjAwSGKjuQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNC0xM1QxNzoyMzo1NS0wNDowMDk/GwUAAAAASUVORK5C\nYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA2LTA3VDEzOjE4\nOjQ5LTA0OjAwxfC/BgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNi0wN1QxMzoxODo0OS0wNDow\nMLStB7oAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -374,9 +352,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a tally Mesh\n", @@ -411,9 +387,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate tally Filter\n", @@ -439,9 +413,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate tally Filter\n", @@ -483,9 +455,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -519,22 +489,22 @@ " | The OpenMC Monte Carlo Code\n", " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", - " Version | 0.8.0\n", - " Git SHA1 | bc4683be1c853fe6d0e31bccad416ef219e3efaf\n", - " Date/Time | 2017-04-13 17:23:58\n", + " Version | 0.9.0\n", + " Git SHA1 | 897db1389dec7871026442bae96d9410ade85192\n", + " Date/Time | 2017-06-07 13:18:50\n", " MPI Processes | 1\n", - " OpenMP Threads | 1\n", + " OpenMP Threads | 12\n", "\n", " Reading settings XML file...\n", " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /home/smharper/openmc/data/nndc_hdf5/U235.h5\n", - " Reading U238 from /home/smharper/openmc/data/nndc_hdf5/U238.h5\n", - " Reading O16 from /home/smharper/openmc/data/nndc_hdf5/O16.h5\n", - " Reading H1 from /home/smharper/openmc/data/nndc_hdf5/H1.h5\n", - " Reading B10 from /home/smharper/openmc/data/nndc_hdf5/B10.h5\n", - " Reading Zr90 from /home/smharper/openmc/data/nndc_hdf5/Zr90.h5\n", + " Reading U235 from /home/johnny/Github/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/johnny/Github/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/johnny/Github/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/johnny/Github/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/johnny/Github/openmc/scripts/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/johnny/Github/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -578,20 +548,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 2.4022E-01 seconds\n", - " Reading cross sections = 1.9056E-01 seconds\n", - " Total time in simulation = 7.5438E+00 seconds\n", - " Time in transport only = 7.5290E+00 seconds\n", - " Time in inactive batches = 1.0482E+00 seconds\n", - " Time in active batches = 6.4956E+00 seconds\n", - " Time synchronizing fission bank = 2.3117E-03 seconds\n", - " Sampling source sites = 1.3344E-03 seconds\n", - " SEND/RECV source sites = 6.8338E-04 seconds\n", - " Time accumulating tallies = 3.9461E-04 seconds\n", - " Total time for finalization = 1.3648E-05 seconds\n", - " Total time elapsed = 7.7964E+00 seconds\n", - " Calculation Rate (inactive) = 11925.2 neutrons/second\n", - " Calculation Rate (active) = 5773.18 neutrons/second\n", + " Total time for initialization = 3.6433E-01 seconds\n", + " Reading cross sections = 2.7963E-01 seconds\n", + " Total time in simulation = 1.4715E+00 seconds\n", + " Time in transport only = 1.3171E+00 seconds\n", + " Time in inactive batches = 2.2329E-01 seconds\n", + " Time in active batches = 1.2482E+00 seconds\n", + " Time synchronizing fission bank = 2.3145E-03 seconds\n", + " Sampling source sites = 1.4054E-03 seconds\n", + " SEND/RECV source sites = 7.6241E-04 seconds\n", + " Time accumulating tallies = 5.8822E-04 seconds\n", + " Total time for finalization = 5.0159E-05 seconds\n", + " Total time elapsed = 1.8511E+00 seconds\n", + " Calculation Rate (inactive) = 55980.8 neutrons/second\n", + " Calculation Rate (active) = 30044.0 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -632,9 +602,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# We do not know how many batches were needed to satisfy the \n", @@ -655,9 +623,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -692,21 +658,19 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22614381]]\n", + "[[[ 0.17581417]]\n", "\n", - " [[ 0.3789572 ]]\n", + " [[ 0.30578219]]\n", "\n", - " [[ 0.05763899]]\n", + " [[ 0.06842901]]\n", "\n", - " [[ 0.14265074]]]\n" + " [[ 0.12436752]]]\n" ] } ], @@ -723,14 +687,25 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -763,8 +738,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -774,8 +749,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -785,8 +760,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -796,8 +771,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -807,8 +782,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -818,8 +793,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -829,8 +804,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -841,7 +816,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -851,8 +826,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -862,8 +837,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -873,8 +848,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -884,8 +859,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -895,8 +870,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -906,8 +881,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -917,8 +892,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -928,8 +903,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -939,8 +914,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -950,8 +925,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -961,8 +936,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -972,8 +947,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
0.00e+006.25e-01fission2.28e-045.15e-052.24e-043.94e-05
10.00e+006.25e-01nu-fission5.55e-041.26e-045.46e-049.59e-05
26.25e-012.00e+07fission8.65e-059.06e-068.42e-056.79e-06
36.25e-012.00e+07nu-fission2.28e-042.19e-052.22e-041.65e-05
40.00e+006.25e-01fission1.83e-043.54e-051.85e-042.70e-05
50.00e+006.25e-01nu-fission4.47e-048.62e-054.52e-046.58e-05
66.25e-012.00e+07fission6.91e-056.94e-066.82e-055.29e-06
72.00e+07nu-fission1.81e-041.77e-051.35e-05
80.00e+006.25e-01fission1.98e-042.55e-052.05e-042.25e-05
90.00e+006.25e-01nu-fission4.82e-046.20e-055.00e-045.49e-05
106.25e-012.00e+07fission7.76e-059.73e-067.53e-057.06e-06
116.25e-012.00e+07nu-fission2.05e-042.48e-051.99e-041.81e-05
120.00e+006.25e-01fission2.32e-043.38e-052.06e-042.79e-05
130.00e+006.25e-01nu-fission5.66e-048.23e-055.03e-046.80e-05
146.25e-012.00e+07fission6.54e-054.61e-066.65e-053.91e-06
156.25e-012.00e+07nu-fission1.73e-041.23e-051.75e-041.04e-05
160.00e+006.25e-01fission2.18e-043.68e-052.03e-042.78e-05
170.00e+006.25e-01nu-fission5.32e-048.97e-054.94e-046.78e-05
186.25e-012.00e+07fission5.92e-056.63e-066.26e-055.71e-06
196.25e-012.00e+07nu-fission1.56e-041.82e-051.64e-041.53e-05
\n", @@ -982,49 +957,49 @@ "text/plain": [ " mesh 1 energy low [eV] energy high [eV] score mean \\\n", " x y z \n", - "0 1 1 1 0.00e+00 6.25e-01 fission 2.28e-04 \n", - "1 1 1 1 0.00e+00 6.25e-01 nu-fission 5.55e-04 \n", - "2 1 1 1 6.25e-01 2.00e+07 fission 8.65e-05 \n", - "3 1 1 1 6.25e-01 2.00e+07 nu-fission 2.28e-04 \n", - "4 1 2 1 0.00e+00 6.25e-01 fission 1.83e-04 \n", - "5 1 2 1 0.00e+00 6.25e-01 nu-fission 4.47e-04 \n", - "6 1 2 1 6.25e-01 2.00e+07 fission 6.91e-05 \n", + "0 1 1 1 0.00e+00 6.25e-01 fission 2.24e-04 \n", + "1 1 1 1 0.00e+00 6.25e-01 nu-fission 5.46e-04 \n", + "2 1 1 1 6.25e-01 2.00e+07 fission 8.42e-05 \n", + "3 1 1 1 6.25e-01 2.00e+07 nu-fission 2.22e-04 \n", + "4 1 2 1 0.00e+00 6.25e-01 fission 1.85e-04 \n", + "5 1 2 1 0.00e+00 6.25e-01 nu-fission 4.52e-04 \n", + "6 1 2 1 6.25e-01 2.00e+07 fission 6.82e-05 \n", "7 1 2 1 6.25e-01 2.00e+07 nu-fission 1.81e-04 \n", - "8 1 3 1 0.00e+00 6.25e-01 fission 1.98e-04 \n", - "9 1 3 1 0.00e+00 6.25e-01 nu-fission 4.82e-04 \n", - "10 1 3 1 6.25e-01 2.00e+07 fission 7.76e-05 \n", - "11 1 3 1 6.25e-01 2.00e+07 nu-fission 2.05e-04 \n", - "12 1 4 1 0.00e+00 6.25e-01 fission 2.32e-04 \n", - "13 1 4 1 0.00e+00 6.25e-01 nu-fission 5.66e-04 \n", - "14 1 4 1 6.25e-01 2.00e+07 fission 6.54e-05 \n", - "15 1 4 1 6.25e-01 2.00e+07 nu-fission 1.73e-04 \n", - "16 1 5 1 0.00e+00 6.25e-01 fission 2.18e-04 \n", - "17 1 5 1 0.00e+00 6.25e-01 nu-fission 5.32e-04 \n", - "18 1 5 1 6.25e-01 2.00e+07 fission 5.92e-05 \n", - "19 1 5 1 6.25e-01 2.00e+07 nu-fission 1.56e-04 \n", + "8 1 3 1 0.00e+00 6.25e-01 fission 2.05e-04 \n", + "9 1 3 1 0.00e+00 6.25e-01 nu-fission 5.00e-04 \n", + "10 1 3 1 6.25e-01 2.00e+07 fission 7.53e-05 \n", + "11 1 3 1 6.25e-01 2.00e+07 nu-fission 1.99e-04 \n", + "12 1 4 1 0.00e+00 6.25e-01 fission 2.06e-04 \n", + "13 1 4 1 0.00e+00 6.25e-01 nu-fission 5.03e-04 \n", + "14 1 4 1 6.25e-01 2.00e+07 fission 6.65e-05 \n", + "15 1 4 1 6.25e-01 2.00e+07 nu-fission 1.75e-04 \n", + "16 1 5 1 0.00e+00 6.25e-01 fission 2.03e-04 \n", + "17 1 5 1 0.00e+00 6.25e-01 nu-fission 4.94e-04 \n", + "18 1 5 1 6.25e-01 2.00e+07 fission 6.26e-05 \n", + "19 1 5 1 6.25e-01 2.00e+07 nu-fission 1.64e-04 \n", "\n", " std. dev. \n", " \n", - "0 5.15e-05 \n", - "1 1.26e-04 \n", - "2 9.06e-06 \n", - "3 2.19e-05 \n", - "4 3.54e-05 \n", - "5 8.62e-05 \n", - "6 6.94e-06 \n", - "7 1.77e-05 \n", - "8 2.55e-05 \n", - "9 6.20e-05 \n", - "10 9.73e-06 \n", - "11 2.48e-05 \n", - "12 3.38e-05 \n", - "13 8.23e-05 \n", - "14 4.61e-06 \n", - "15 1.23e-05 \n", - "16 3.68e-05 \n", - "17 8.97e-05 \n", - "18 6.63e-06 \n", - "19 1.82e-05 " + "0 3.94e-05 \n", + "1 9.59e-05 \n", + "2 6.79e-06 \n", + "3 1.65e-05 \n", + "4 2.70e-05 \n", + "5 6.58e-05 \n", + "6 5.29e-06 \n", + "7 1.35e-05 \n", + "8 2.25e-05 \n", + "9 5.49e-05 \n", + "10 7.06e-06 \n", + "11 1.81e-05 \n", + "12 2.79e-05 \n", + "13 6.80e-05 \n", + "14 3.91e-06 \n", + "15 1.04e-05 \n", + "16 2.78e-05 \n", + "17 6.78e-05 \n", + "18 5.71e-06 \n", + "19 1.53e-05 " ] }, "execution_count": 22, @@ -1046,15 +1021,13 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nJenaNP0hSRMy6l4qKSQN3r9VMbPebNasWdTV1bFkyRJWrlzJkiVLqKurY9asWbVuWp/UYXhIqgMW\nAJOABmCqpIaKYpOAMWmYDlxXTV1JI4DTgF/u95qYWa+2adMmli5dysSJE+nXrx8TJ05k6dKlbNq0\nqdZN65OqOfM4HlgfEU9FxO+BW4EpFWWmAEujcB8wSNLQKup+BZgFxP6uiJmZdZ9q7rYaBmwsvd8E\nnFBFmWHt1ZU0BXgmIh6UtNeFS5pOcTbDkCFDaG5urqLJlqOlpcXb1Q54gwcP5swzz2TAgAE8//zz\nHHXUUWzdupXBgwd7/62BmtyqK+n1wGcpuqzaFRHXA9cDNDY2hn96svP5Jz2tJzjnnHNYuHAhAwcO\nRBKS2LZtG+eff7733xqoptvqGWBE6f3wNK6aMnsb/xZgNPCgpA1p/M8lvTGn8WbWd6xatYo5c+Zw\n5JFHAnDkkUcyZ84cVq1aVeOW9U2KaP9yg6R+wJPAyRQH/tXAuRHxSKnM+4CLgckU3VLXRsTx1dRN\n9TcAjRHxQnttaWxsjDVr1mStoHXMZx7WE9TV1fHb3/6W/v37v7bP7tixg/r6enbt2lXr5vUaku6P\niMaOynV45hEROymC4S7gMeC2iHhE0gxJM1KxFcBTwHpgMfDx9uruw/qYWR83duxY7r333j3G3Xvv\nvYwdO7ZGLerbqrrmERErKAKiPG5R6XUAF1Vbt40yo6pph5n1XXPnzuWCCy7ga1/7Grt27WLVqlVc\ncMEFzJs3r9ZN65P8bCszO2C1dSfmSSedtMf7c889l3PPPXePcR11x9v+8+NJzOyAFRFtDiM/8+29\nTnNwdA+Hh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iY\nmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZ\nNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaH\nh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWWrKjwknS7pCUnrJc1uY7okXZumPyRpQkd1Jf1TKvuA\npJWSju6cVTIzs67WYXhIqgMWAJOABmCqpIaKYpOAMWmYDlxXRd2rI2J8RBwHfBv43P6vjpmZdYdq\nzjyOB9ZHxFMR8XvgVmBKRZkpwNIo3AcMkjS0vboR8Uqp/gAg9nNdzMysm/SroswwYGPp/SbghCrK\nDOuorqR5wHnAFmBi1a02M7OaqiY8ukxEzAXmSpoDXAxcXllG0nSKrjCGDBlCc3Nzt7axL2hpafF2\ntR7H+2xtVRMezwAjSu+Hp3HVlOlfRV2AbwAraCM8IuJ64HqAxsbGaGpqqqLJlqO5uRlvV+tRvrPc\n+2yNVXPNYzUwRtJoSQcB5wDLKsosA85Ld129G9gSEZvbqytpTKn+FODx/VwXMzPrJh2eeUTETkkX\nA3cBdcCSiHhE0ow0fRHFWcNkYD2wDZjWXt006yslvQ3YDTwNzOjUNTMzsy5T1TWPiFhBERDlcYtK\nrwO4qNq6afwHs1pqZmYHDH/D3MzMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8\nzMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzM\nLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCyb\nw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsW1Xh\nIel0SU9IWi9pdhvTJenaNP0hSRM6qivpakmPp/K3SxrUOatkZmZdrcPwkFQHLAAmAQ3AVEkNFcUm\nAWPSMB24roq63wX+OCLGA08Cc/Z7bczMrFtUc+ZxPLA+Ip6KiN8DtwJTKspMAZZG4T5gkKSh7dWN\niJURsTPVvw8Y3gnrY2Zm3aCa8BgGbCy935TGVVOmmroAfwPcWUVbzMzsANCv1g2QNBfYCXxjL9On\nU3SFMWTIEJqbm7uvcX1ES0uLt6v1ON5na6ua8HgGGFF6PzyNq6ZM//bqSjofeD9wckREWwuPiOuB\n6wEaGxujqampiiZbjubmZrxdrUf5znLvszVWTbfVamCMpNGSDgLOAZZVlFkGnJfuuno3sCUiNrdX\nV9LpwCzgjIjY1knrY2Zm3aDDM4+I2CnpYuAuoA5YEhGPSJqRpi8CVgCTgfXANmBae3XTrL8KHAx8\nVxLAfRExozNXzszMukZV1zwiYgVFQJTHLSq9DuCiauum8cdktdTMzA4Y/oa5mZllc3iYmVk2h4eZ\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1070,14 +1043,12 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1086,9 +1057,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1120,9 +1091,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1150,14 +1119,25 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1175,144 +1155,144 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
10000U235scatter-Y0,03.87e-028.61e-043.86e-026.85e-04
110000U235scatter-Y1,-16.88e-043.63e-046.95e-043.15e-04
210000U235scatter-Y1,0-3.38e-044.37e-04-1.06e-043.79e-04
310000U235scatter-Y1,1-4.27e-043.74e-04-3.63e-043.18e-04
410000U235scatter-Y2,-21.88e-041.86e-041.20e-041.59e-04
510000U235scatter-Y2,-18.96e-052.02e-043.93e-051.86e-04
610000U235scatter-Y2,04.03e-042.04e-041.81e-041.85e-04
710000U235scatter-Y2,11.48e-042.24e-041.24e-041.81e-04
810000U235scatter-Y2,21.11e-042.01e-042.06e-042.26e-04
910000U238scatter-Y0,02.34e+001.08e-022.33e+001.10e-02
1010000U238scatter-Y1,-12.93e-022.81e-032.90e-022.33e-03
1110000U238scatter-Y1,04.25e-031.83e-033.45e-032.38e-03
1210000U238scatter-Y1,1-2.60e-023.28e-03-2.72e-022.76e-03
1310000U238scatter-Y2,-2-1.10e-031.58e-03-2.02e-031.44e-03
1410000U238scatter-Y2,-1-4.81e-041.67e-038.07e-061.49e-03
1510000U238scatter-Y2,0-7.95e-041.53e-03-3.74e-071.79e-03
1610000U238scatter-Y2,11.06e-031.96e-036.54e-041.49e-03
1710000U238scatter-Y2,2-7.65e-041.67e-03-1.93e-031.36e-03
\n", @@ -1320,24 +1300,24 @@ ], "text/plain": [ " cell nuclide score mean std. dev.\n", - "0 10000 U235 scatter-Y0,0 3.87e-02 8.61e-04\n", - "1 10000 U235 scatter-Y1,-1 6.88e-04 3.63e-04\n", - "2 10000 U235 scatter-Y1,0 -3.38e-04 4.37e-04\n", - "3 10000 U235 scatter-Y1,1 -4.27e-04 3.74e-04\n", - "4 10000 U235 scatter-Y2,-2 1.88e-04 1.86e-04\n", - "5 10000 U235 scatter-Y2,-1 8.96e-05 2.02e-04\n", - "6 10000 U235 scatter-Y2,0 4.03e-04 2.04e-04\n", - "7 10000 U235 scatter-Y2,1 1.48e-04 2.24e-04\n", - "8 10000 U235 scatter-Y2,2 1.11e-04 2.01e-04\n", - "9 10000 U238 scatter-Y0,0 2.34e+00 1.08e-02\n", - "10 10000 U238 scatter-Y1,-1 2.93e-02 2.81e-03\n", - "11 10000 U238 scatter-Y1,0 4.25e-03 1.83e-03\n", - "12 10000 U238 scatter-Y1,1 -2.60e-02 3.28e-03\n", - "13 10000 U238 scatter-Y2,-2 -1.10e-03 1.58e-03\n", - "14 10000 U238 scatter-Y2,-1 -4.81e-04 1.67e-03\n", - "15 10000 U238 scatter-Y2,0 -7.95e-04 1.53e-03\n", - "16 10000 U238 scatter-Y2,1 1.06e-03 1.96e-03\n", - "17 10000 U238 scatter-Y2,2 -7.65e-04 1.67e-03" + "0 10000 U235 scatter-Y0,0 3.86e-02 6.85e-04\n", + "1 10000 U235 scatter-Y1,-1 6.95e-04 3.15e-04\n", + "2 10000 U235 scatter-Y1,0 -1.06e-04 3.79e-04\n", + "3 10000 U235 scatter-Y1,1 -3.63e-04 3.18e-04\n", + "4 10000 U235 scatter-Y2,-2 1.20e-04 1.59e-04\n", + "5 10000 U235 scatter-Y2,-1 3.93e-05 1.86e-04\n", + "6 10000 U235 scatter-Y2,0 1.81e-04 1.85e-04\n", + "7 10000 U235 scatter-Y2,1 1.24e-04 1.81e-04\n", + "8 10000 U235 scatter-Y2,2 2.06e-04 2.26e-04\n", + "9 10000 U238 scatter-Y0,0 2.33e+00 1.10e-02\n", + "10 10000 U238 scatter-Y1,-1 2.90e-02 2.33e-03\n", + "11 10000 U238 scatter-Y1,0 3.45e-03 2.38e-03\n", + "12 10000 U238 scatter-Y1,1 -2.72e-02 2.76e-03\n", + "13 10000 U238 scatter-Y2,-2 -2.02e-03 1.44e-03\n", + "14 10000 U238 scatter-Y2,-1 8.07e-06 1.49e-03\n", + "15 10000 U238 scatter-Y2,0 -3.74e-07 1.79e-03\n", + "16 10000 U238 scatter-Y2,1 6.54e-04 1.49e-03\n", + "17 10000 U238 scatter-Y2,2 -1.93e-03 1.36e-03" ] }, "execution_count": 26, @@ -1350,7 +1330,7 @@ "df = tally.get_pandas_dataframe()\n", "\n", "# Print the first twenty rows in the dataframe\n", - "df.head(100)" + "df.head(20)" ] }, { @@ -1363,16 +1343,14 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.0016699 0.01076055]\n", - " [ 0.00020076 0.00086098]]]\n" + "[[[ 0.00136183 0.01104314]\n", + " [ 0.00022601 0.00068479]]]\n" ] } ], @@ -1394,9 +1372,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1431,15 +1407,31 @@ { "cell_type": "code", "execution_count": 29, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.04126529]]]\n" + "[[[ 0.03500496]]\n", + "\n", + " [[ 0.03004793]]\n", + "\n", + " [[ 0.02536586]]\n", + "\n", + " [[ 0.03403647]]\n", + "\n", + " [[ 0.02498 ]]\n", + "\n", + " [[ 0.01892844]]\n", + "\n", + " [[ 0.02662923]]\n", + "\n", + " [[ 0.02875671]]\n", + "\n", + " [[ 0.01945598]]\n", + "\n", + " [[ 0.02612378]]]\n" ] } ], @@ -1447,7 +1439,7 @@ "# Get the relative error for the scattering reaction rates in\n", "# the first 10 distribcell instances \n", "data = tally.get_values(scores=['scatter'], filters=[openmc.DistribcellFilter],\n", - " filter_bins=[(i,) for i in range(10)], value='rel_err')\n", + " filter_bins=[tuple(range(10))], value='rel_err')\n", "print(data)" ] }, @@ -1461,14 +1453,25 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1520,8 +1523,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1534,8 +1537,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1548,8 +1551,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1562,8 +1565,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1576,8 +1579,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1590,8 +1593,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1604,8 +1607,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1618,8 +1621,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1633,7 +1636,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1647,7 +1650,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1660,8 +1663,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1674,8 +1677,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1688,8 +1691,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1702,8 +1705,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1716,8 +1719,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1730,8 +1733,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1744,8 +1747,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1758,8 +1761,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1773,7 +1776,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1786,8 +1789,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
10002279absorption7.37e-057.77e-067.77e-057.87e-06
55910002279scatter1.27e-026.76e-041.28e-025.09e-04
56010002280absorption9.14e-059.21e-068.92e-057.32e-06
56110002280scatter1.39e-025.27e-041.37e-024.99e-04
56210002281absorption8.98e-058.99e-069.50e-057.80e-06
56310002281scatter1.47e-026.07e-041.49e-024.74e-04
56410002282absorption1.13e-041.28e-051.15e-041.00e-05
56510002282scatter1.54e-026.58e-041.58e-026.18e-04
566283absorption1.13e-049.64e-061.01e-05
567283scatter1.75e-025.84e-045.66e-04
56810002284absorption1.10e-041.12e-051.08e-049.66e-06
56910002284scatter1.72e-027.15e-041.73e-025.40e-04
57010002285absorption1.27e-041.92e-051.16e-041.44e-05
57110002285scatter1.75e-028.93e-041.70e-026.90e-04
57210002286absorption1.24e-041.26e-051.16e-041.02e-05
57310002286scatter1.78e-029.03e-041.77e-026.80e-04
57410002287absorption1.24e-041.64e-051.20e-041.36e-05
57510002287scatter1.85e-021.01e-031.80e-027.80e-04
576288absorption1.32e-041.37e-051.30e-05
57710002288scatter1.87e-028.24e-041.86e-027.12e-04
\n", @@ -1821,26 +1824,26 @@ " mean std. dev. \n", " \n", " \n", - "558 7.37e-05 7.77e-06 \n", - "559 1.27e-02 6.76e-04 \n", - "560 9.14e-05 9.21e-06 \n", - "561 1.39e-02 5.27e-04 \n", - "562 8.98e-05 8.99e-06 \n", - "563 1.47e-02 6.07e-04 \n", - "564 1.13e-04 1.28e-05 \n", - "565 1.54e-02 6.58e-04 \n", - "566 1.13e-04 9.64e-06 \n", - "567 1.75e-02 5.84e-04 \n", - "568 1.10e-04 1.12e-05 \n", - "569 1.72e-02 7.15e-04 \n", - "570 1.27e-04 1.92e-05 \n", - "571 1.75e-02 8.93e-04 \n", - "572 1.24e-04 1.26e-05 \n", - "573 1.78e-02 9.03e-04 \n", - "574 1.24e-04 1.64e-05 \n", - "575 1.85e-02 1.01e-03 \n", - "576 1.32e-04 1.37e-05 \n", - "577 1.87e-02 8.24e-04 " + "558 7.77e-05 7.87e-06 \n", + "559 1.28e-02 5.09e-04 \n", + "560 8.92e-05 7.32e-06 \n", + "561 1.37e-02 4.99e-04 \n", + "562 9.50e-05 7.80e-06 \n", + "563 1.49e-02 4.74e-04 \n", + "564 1.15e-04 1.00e-05 \n", + "565 1.58e-02 6.18e-04 \n", + "566 1.13e-04 1.01e-05 \n", + "567 1.75e-02 5.66e-04 \n", + "568 1.08e-04 9.66e-06 \n", + "569 1.73e-02 5.40e-04 \n", + "570 1.16e-04 1.44e-05 \n", + "571 1.70e-02 6.90e-04 \n", + "572 1.16e-04 1.02e-05 \n", + "573 1.77e-02 6.80e-04 \n", + "574 1.20e-04 1.36e-05 \n", + "575 1.80e-02 7.80e-04 \n", + "576 1.32e-04 1.30e-05 \n", + "577 1.86e-02 7.12e-04 " ] }, "execution_count": 30, @@ -1859,14 +1862,25 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1893,38 +1907,38 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
mean4.19e-042.40e-054.17e-042.05e-05
std2.42e-041.03e-058.32e-06
min2.31e-054.39e-062.27e-054.04e-06
25%2.03e-041.64e-052.01e-041.40e-05
50%4.01e-042.39e-054.00e-042.05e-05
75%6.17e-043.02e-056.08e-042.60e-05
max9.28e-045.88e-059.38e-044.27e-05
\n", @@ -1935,13 +1949,13 @@ " \n", " \n", "count 2.89e+02 2.89e+02\n", - "mean 4.19e-04 2.40e-05\n", - "std 2.42e-04 1.03e-05\n", - "min 2.31e-05 4.39e-06\n", - "25% 2.03e-04 1.64e-05\n", - "50% 4.01e-04 2.39e-05\n", - "75% 6.17e-04 3.02e-05\n", - "max 9.28e-04 5.88e-05" + "mean 4.17e-04 2.05e-05\n", + "std 2.42e-04 8.32e-06\n", + "min 2.27e-05 4.04e-06\n", + "25% 2.01e-04 1.40e-05\n", + "50% 4.00e-04 2.05e-05\n", + "75% 6.08e-04 2.60e-05\n", + "max 9.38e-04 4.27e-05" ] }, "execution_count": 31, @@ -1955,7 +1969,7 @@ "absorption[['mean', 'std. dev.']].dropna().describe()\n", "\n", "# Note that the maximum standard deviation does indeed\n", - "# meet the 5e-4 threshold set by the tally trigger" + "# meet the 5e-5 threshold set by the tally trigger" ] }, { @@ -1968,20 +1982,18 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.7108210033985298\n" + "Mann-Whitney Test p-value: 0.3933685843661936\n" ] } ], "source": [ - "# Extract tally data from pins in the pins divided along y=x diagonal \n", + "# Extract tally data from pins in the pins divided along y=-x diagonal \n", "multi_index = ('level 2', 'lat',)\n", "lower = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] < 16]\n", "upper = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] > 16]\n", @@ -1998,7 +2010,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the symmetry implied by the y=x diagonal ensures that the two sampling distributions are identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **not reject** the null hypothesis that the two sampling distributions are identical.\n", + "Note that the symmetry implied by the y=-x diagonal ensures that the two sampling distributions are identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **not reject** the null hypothesis that the two sampling distributions are identical.\n", "\n", "Next, perform the same test but with two groupings of pins which are not symmetrically identical to one another." ] @@ -2006,20 +2018,18 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 7.454144155212731e-42\n" + "Mann-Whitney Test p-value: 7.927841393301949e-42\n" ] } ], "source": [ - "# Extract tally data from pins in the pins divided along y=-x diagonal\n", + "# Extract tally data from pins in the pins divided along y=x diagonal\n", "multi_index = ('level 2', 'lat',)\n", "lower = df[df[multi_index + ('x',)] > df[multi_index + ('y',)]]\n", "upper = df[df[multi_index + ('x',)] < df[multi_index + ('y',)]]\n", @@ -2036,31 +2046,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the asymmetry implied by the y=-x diagonal ensures that the two sampling distributions are *not* identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **reject** the null hypothesis that the two sampling distributions are identical." + "Note that the asymmetry implied by the y=x diagonal ensures that the two sampling distributions are *not* identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **reject** the null hypothesis that the two sampling distributions are identical." ] }, { "cell_type": "code", "execution_count": 34, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/ipykernel/__main__.py:4: SettingWithCopyWarning: \n", + "/home/johnny/miniconda3/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", - "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n" + "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", + " after removing the cwd from sys.path.\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 34, @@ -2069,9 +2078,9 @@ }, { "data": { - "image/png": "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\nUPj1vgRTmxvBNPcvNLPXEEw9v8ODqc5/Er2AmT0J7HT3B6qU43cARxxxBL29vU28vfYzbdq03N8j\n6D7zRveZP1PlXqfKfYZa2t2j40KOu381XJDuMoJmqnsJVvf9VXjIi4BnIm95AfAjSmvuXBhuGwjW\nfEm8TLPLLSIiIhOr40IOgLtfA1yT8lp/7OufU+d8QPFziIiISOfpxMkARURERDIp5EimwcHByS7C\nhNB95ovuM3+myr1OlfucCFqFvEFm1guMjIyMTKUOYiIiIuO2ZcsW+vr6APrcfUurrqOaHBEREckl\nhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWF\nHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUc\nERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcmljgw5\nZnaemT1kZk+b2UYzW1Dl2HlmdnN4/B4zW55wzAfNbJOZ/beZPW5m3zCzOa29CxEREWmljgs5ZnYG\n8EngI8DRwH3AsJkdmvKWA4AdwAeA/0o5ZiHwT8CxwBJgX2CdmT27iUUXERGRCbTPZBegASuA69z9\nRgAzOwc4DXgX8I/xg939h8APw2M/nnRCd18a/drM/hL4JdAHfL+JZRcREZEJ0lE1OWa2L0HwuK24\nz90dWA8c38RLTQccGG3iOUVERGQCdVTIAQ4FuoHHY/sfBw5rxgXMzIBPA993958045wiIiIy8Tqx\nuarVrgHmAa+t5eAVK1Ywbdq0sn2Dg4MMDg62oGgiIiKdZWhoiKGhobJ9u3fvnpBrd1rIeQIYA2bG\n9s8EHhvvyc3sM8BSYKG7p3VSLnPllVfS29s73kuLiIjkUtIf/lu2bKGvr6/l1+6o5ip3/yMwAry+\nuC9sXno9cNd4zh0GnNOBk9z94fGcS0RERCZfp9XkAHwKuMHMRoBNBKOtDgBuADCzG4FH3f1D4df7\nEjQ/GbAf8EIzew3wW3ffER5zDTAIvAl40syKNUW73f13E3VjIiIi0jwdF3Lc/avhnDiXETRT3QsM\nuPuvwkNeBDwTecsLgB8RjJYCuDDcNgD94b5zwtfviF3uncCNTb4FERERmQAdF3IA3P0agg7CSa/1\nx77+ORnNcu7eUc12IiIikk0PdxEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERER\nySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJ\nJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJpX0muwCSD4VCgR07djBr\n1ixmz5492cURERFRTY6Mz+joKKecchpz585l6dKlzJkzh1NOOY1du3ZNdtFERGSKU8iRcTnzzGWs\nX78RWAU8DKxi/fqNDA6eNcklExGRqU7NVdKwQqHA8PAagoDz9nDv2xkbc4aHl7Ft2zY1XYmIyKRR\nTY40bMeOHeF/LYq9shiA7du3T2h5REREohRypGGHH354+F/fi72yAYBZs2ZNaHlERESiFHKkYXPm\nzGFgYCnd3csJmqweAVbR3X0BAwNL1VQlIiKTqiNDjpmdZ2YPmdnTZrbRzBZUOXaemd0cHr/HzJaP\n95xSMjS0iiVLjgOWAS8BlrFkyXEMDa2a5JKJiMhU13Edj83sDOCTwNnAJmAFMGxmc9z9iYS3HADs\nAL4KXNmkc0qop6eHtWtvYdu2bWzfvl3z5IiISNvoxJqcFcB17n6ju/8UOAd4CnhX0sHu/kN3/4C7\nfxX4QzPOKZVmz57NqaeeqoAjIiJto6NCjpntC/QBtxX3ubsD64Hj2+WcIiIiMvk6KuQAhwLdwOOx\n/Y8Dh7XROUVERGSSdVrIEREREalJp3U8fgIYA2bG9s8EHpuMc65YsYJp06aV7RscHGRwcLDB4oiI\niOTH0NAQQ0NDZft27949Ide2oPtJ5zCzjcA97n5B+LURLJp0tbtfkfHeh4Ar3f3q8Z7TzHqBkZGR\nEXp7e8d7WyIiIlPGli1b6OvrA+hz9y2tuk6n1eQAfAq4wcxGKA33PgC4AcDMbgQedfcPhV/vC8wD\nDNgPeKGZvQb4rbvvqOWc0hyFQoEdO3ZomLmIiEyIjgs57v5VMzsUuIygSeleYMDdfxUe8iLgmchb\nXgD8CChWWV0YbhuA/hrPKeMwOjrKmWcuCxfzDAwMLGVoaBU9PT2TWDIREcmzjgs5AO5+DXBNymv9\nsa9/Tg0drKudU8bnzDOXsX79RoKlHxYB32P9+uUMDp7F2rW3THLpREQkrzoy5EjnKBQKYQ3OKuDt\n4d63MzbmDA8vY9u2bWq6EhGRltAQcmmpHTuK3Z4WxV5ZDMD27dsntDwiIjJ1KORISx1++OHhf30v\n9soGAGbNmjWh5RERkalDIUdaas6cOQwMLKW7ezlBk9UjwCq6uy9gYGCpmqpERKRlFHKk5YaGVrFk\nyXHAMuAlwDKWLDmOoaFVk1wyERHJM3U8lpbr6elh7dpb2LZtG9u3b9c8OSIiMiEUcmTCzJ49W+FG\nREQmjJqrREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRE\nRCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyRERE\nJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSX9pnsAojEFQoFduzYwaxZs5g9e/ZkF0dERDpU\nR9bkmNl5ZvaQmT1tZhvNbEHG8W81swfC4+8zs1Njrz/HzD5jZo+Y2VNm9mMz+9+tvQuJGx0d5ZRT\nTmPu3LksXbqUOXPmcMopp7Fr167JLpqIiHSgjgs5ZnYG8EngI8DRwH3AsJkdmnL8CcBNwErgKOBb\nwDfNbF7ksCuBPwXOBF4BfBr4jJm9oVX3IZXOPHMZ69dvBFYBDwOrWL9+I4ODZ01yyUREpBN1XMgB\nVgDXufuN7v5T4BzgKeBdKccvB25190+5+1Z3/zCwBTg/cszxwJfc/U53f9jdVxKEp2NadxsSVSgU\nGB5ew9jY1cDbgRcDb2ds7CqGh9ewbdu2SS6hiIh0mo4KOWa2L9AH3Fbc5+4OrCcIKkmOD1+PGo4d\nfxfwJjN7QXidk4DZ4XEyAXbs2BH+16LYK4sB2L59+4SWR0REOl9HhRzgUKAbeDy2/3HgsJT3HFbD\n8e8DHgAeNbM/AGuA89z9B+MusdTk8MMPD//re7FXNgAwa9asCS2PiIh0vk4LOa2yHDgWeAPQC/w1\ncI2Z9U9qqaaQOXPmMDCwlO7u5QR9ch4BVtHdfQEDA0s1ykpEROrWaUPInwDGgJmx/TOBx1Le81i1\n483sWcDfA6e7+9rw9f8ws6OBC4HbqxVoxYoVTJs2rWzf4OAgg4OD1e9EKgwNrWJw8CyGh5ft3bdk\nyVKGhlZNYqlERGQ8hoaGGBoaKtu3e/fuCbm2BV1aOoeZbQTucfcLwq+NYCjO1e5+RcLxXwGe7e6n\nR/b9ALjP3c81s4OA3cCp7j4cOeZa4KXufkpKOXqBkZGREXp7e5t4h/nSyJw327ZtY/v27ZonR0Qk\np7Zs2UJfXx9An7tvadV1Oq0mB+BTwA1mNgJsIhhtdQBwA4CZ3Qg86u4fCo+/CrjDzN4P3AIMEnRe\nfg+Au//GzDYAV5jZ74CfA68D3gH81QTdU+6Mjo5y5pnLGB5es3ffwEBQK9PT01P1vbNnz1a4ERGR\nceu4Pjnu/lWCZqTLgB8BRwID7v6r8JAXEelU7O53E8x/czZwL/Bmgqapn0ROewawmaAzyI+BvwE+\n6O6fb+3d5JfmvBERkcnWcc1V7ULNVekKhQJz584lCDhvj7yyClhGoVBQTY2IyBQ2Uc1VHVeTI+3v\n3nvvDf9Lc96IiMjkUciRpvunf/ps+F+a80ZERCZPJ3Y8ljZWKBT4/ve/R7BM2HLACWpwNgDns3Dh\nYjVViYjIhFDIkaYqLc9wI3AxsCzyahfnn3/uxBdKRESmJDVXSVOVlme4n2DEfoFglYwrgD0cffTR\nk1U0ERGZYhRypKkql2d4FrCT7u6PaXkGERGZUAo50nRDQ6tYsuQ4gqaqlwDLWLLkOC3PICIiE0p9\ncqTpenp6WLv2lpYsz9DIMhEiIjI1KeRIyzRzeYbxLBMhIiJTk5qrpCNomQgREamXanKk7RUKhbAG\nJ7pMxNsZG3OGh5exbds2NV2JiEiFptXkmNkXzGxds84nUlSae0fLRIiISO2a2Vz1BPB4E88nAkTn\n3tEyESIiUrumNVe5+weadS6RqOLcO+vXL2dsrLRMRHf3BSxZorl3REQkWV01OWa2r5ntMLMjWlUg\nkSSae0dEROpVV02Ou//RzJ7VqsKIpGnl3DsiIpJPjTRXfRb4gJm9292faXaBRKpp5tw7IiKSb42E\nnAXA64E/NbN/B56Mvujub25GwURERETGo5GQ82vg680uiIiIiEgz1RVyzMyAjwC/cvenW1MkERER\nkfGrd54cA7YDL2pBWWQKKRQK3HrrrWzbtm2yiyIiIjlVV8hx9z3ANmBGa4ojeTc6Osopp5zG3Llz\nWbp0KXPmzOGUU05j165dCj4iItJUjcx4fDFwhZm9qtmFkfxLWmjzO9+5i9mzj0gMPiIiIo1qJOTc\nCBwD3GdmT5vZaHRrcvkkR4oLbY6NXU2w0OaLgbezZ89L2bnzd2iFcRERaaZGRlf9VdNLIVNC8kKb\nBeBetMK4iIg0W90hx92/1IqCSP6VL7RZDDTZK4wr5IiISCMaWoXczA43s78zsyEze16471Qze2Vz\niyd5Ulxos7t7OUHNzSPAf4SvaoVxERFprrpDjpktBv4dOBZ4M3Bg+NJrgEubVzTJo8qFNi8m+DE8\nj1LwWUV39wUMDGiFcRERaVwjNTn/APytu58M/CGy/3bguKaUKoOZnWdmD4Udnzea2YKM499qZg+E\nx99nZqcmHHOEmX3LzH5tZr81s3vMTPMBNVlxoc1CoUBv7wK6u6cDnwP6iK8wfvnll2hIuYiINKyR\nkPNq4BsJ+38JHDq+4mQzszOATxLMvHw0cB8wbGaJ1zazE4CbgJXAUcC3gG+a2bzIMYcDdwI/Iegc\n8mrgcuB3rbuTqc3d2bJlczjS6mzgNoJOyBcC8OSTT3LMMcdoSLmIiDSskZDza+D5CfuPBn4xvuLU\nZAVwnbvf6O4/Bc4BngLelXL8cuBWd/+Uu2919w8DW4DzI8f8HXCLu3/Q3e9394fc/dvu/kQrb2Qq\nSx5pNZvg2wV33TVCs4aUa5JBEZGpqZGQ8xXg42Z2GOBAl5m9FvgEwRw6LWNm+xK0a9xW3OfuDqwH\njk952/Hh61HDxePD9bhOA7aZ2VozezxsAju92eWXkvKRVlFBh+M9ey4hOpfO2NhVDA+vqSuoVJtd\nWURE8q+RkPMh4KcEPUQPJGji+R5wF0GNSCsdCnQDj8f2Pw4clvKewzKOfx7BfXwAWAOcTNAc9y9m\ntrAJZZYEySOtVtHVtZzgx/JtsXeUhpTXKml2ZU0yKCIyddQdctz9D+7+HuDlwBuAs4BXuPsydx9r\ndgEnQPEz+Ka7Xx02V30c+DZBU5i0SOVIq2WccMKRwB7GO6Q8bXblRmqERESkMzUy4zEA7v4IwZ/f\nE+kJYAyYGds/E3gs5T2PZRz/BPAM8EDsmAeA12YVaMWKFUybNq1s3+DgIIODg1lvnfJ6enq4+uor\n+d73/hyAxYsXM3v2bE455TTWr1/O2JgT1OBsoLv7ApYsqX1IeXKfH9AkgyIiE2toaIihoaGyfbt3\n756Qa1vQpaVzmNlG4B53vyD82gjaIq529ysSjv8K8Gx3Pz2y7wfAfe5+buTr7e7+PyPH/AvwlLsn\ntm2YWS8wMjIyQm9vb/NucIoYHR3lzDOXMTy8Zu++gYGlDA2tYteuXRxzzAns3FlqZZwxYyabN9/N\ny172sprOXygUmDt3LuXLRRB+vYxCoaCQIyIySbZs2UJfXx9An7tvadV1Gq7JmUSfAm4wsxFgE8Fo\nqwOAGwDM7EbgUXf/UHj8VcAdZvZ+4BZgkKDz8nsi57wC+IqZ3Ql8FziVoCluccvvZooq7y+zCPge\n69cv39tf5te//iNBX/bnAr/i17/+KO997/msXXtLTecv9vkZb42QiIh0ro4LOe7+1XBOnMsImp3u\nBQbc/VfhIS8iaH4qHn+3mZ0J/H24bQNOd/efRI75ppmdQ9Cp+ipgK/Bmd797Iu5pqin2l0lblDNQ\nXgMzNjaz7gU7h4ZWMTh4VuScsGRJUFskIiL513EhB8DdrwGuSXmtP2Hf14GvZ5zzBsLaIGmtrP4y\n1V6rpy9NcXblbdu2sX37dmbNmqUaHBGRKaQjQ450tuTVyKE4gqraa40s2Dl79myFGxGRKahpIcfM\nHgDmuHt3s84p+ZTVXwZoeV+aQqHAjh07VLsjIpJjzazJ+SAwLfMoEbL7y7SqL03SqK6FCxfzrW99\ng56ennGfX0RE2kfTQo67f7NZ55L8y+ovs3btLaxbt46NGzdy/PHHc/LJJzflukmjuu688zxmzz6C\nbdseUNAREckR9cmRSZXUX6baHDo9PT0NNzWljeoCZ+fOZbzpTX/OnXfeMd5byiyDmslERCZGTSHH\nzH5EsBhnJnfXzHgyLmlz6LzlLW9jv/32Sw0/1YyOjjI4WAw2ySO3vv/9DXUNUa9HVnATEZHmq7Um\nR01RMiGqzaHz3e/+T7q7p5M0gWDWJIFnnrmMe+8trleVPqqrVcs9VJv8sNYJDkVEpD41hRx3v7TV\nBRGBanPovBjYE1lwE6ITCKbVwBQKBTZs2BAJTiuB8wgqJoORW3ABcBRwb+YQ9XqbmyqvX3vZRURk\nfOpehRzAzKab2bvN7GNmdki4r9fMXtjc4kneFQoFbr311r2rgpfPoRN1Y/hv+iSBUaOjo5xyymnM\nnTuXs88+O9z7GeAdwL5EVz6Hl9DV9TNOPHER27dvT1yhPHq+pUuXMmfOHE455TR27dqVeF/J108u\n+1/8xZmp5xERkXFw97o24EjglwTLI/wReHm4/++AG+s9X6duQC/gIyMjLvXbuXOnDwwsdYIqFQd8\nYGCpj46O+sDAUu/uPsThyw73OxwVOW6Vg0e2LzvghUKh7Pylc6xKOAcO08u+njFjZmJZks/3sMMq\n7+4+xAcGlibeX/nxd1Qte1fXtNTziIjk0cjISPH3ba+38lld9xtgPfCP4X//JhJyTgB+1srCttOm\nkDM+1UJ0nHLOAAAgAElEQVRDMegE/wN0OUwLj+t36AnDwcMOX04MGlu3bo2FiqVhqIkHnX38yCOP\n8oULF1cNMJXnqx6wko9fWlF2OCTcn3weEZG8mqiQ00hz1QLguoT9vwAOa+B8MsUUOxeX+te8mKCP\nylUMD6/hiSeeYO3aWxgeHgb2AJ8Nj7sZOJ5oU9OSJcdVTBJY3q+nAKwBXgo8TNAvpvjvc+jq6ubO\nOzeklmXbtm2Za23Fm8qSj18FHE15M9mrw/3J5xERkfFpJOT8Hjg4Yf8c4FcJ+0XK1BoaxsbGYsf1\nALdQHA21cuVK1q69pWIIdnm/nuK17gXKgwx8hnvvHcksS3o/oeT1tJKP7wHeCljs/WcRhLDG1uUS\nEZF0jYScfwU+bGb7hl+7mb0E+DgZK32LQLXOxeWhIf24hwFYvHgxSYprY3V3Lwf+I/JKtVXP08tS\nfr5VwCPAKrq7L2BgoHI9rbTj4a8I/j6I1ibdDSSfR0RExqne9i2C9am+A+wCniH4bf0HgqfCc1rZ\nttZOG+qTMy7lnYvT+9fUelxceb8eq9qnZv78BZnXKD9fcufk9OtHt+QybN68efwfqohIh2jbjsd7\n3wivBc4F/gZY0spCtuOmkDM+tYaGesNFXKFQ8IsvvtihO+zAHO/42+WrV6+u+RqFQsHXrFlTcyfh\n4vErV64Mz/1wLOQ87ICvWbOmpvOJiOTBRIUc8+CBXZOwiWotcI67V04mMoWYWS8wMjIyQm+vVrJo\nVNoCnY0el6RQKDB37lxgHvCTyCvBBICFQoHZs2eP6xq1lyE6ISDh18v2lkFEZCrYsmULfX19AH3u\nvqVV16lrgU53/6OZHdmqwsjUk7RA53iOS1LsI7N+/UbGxq4Angf8ku7uj7FkSakvzHiukSY6Q3JQ\nhuWMjTnF2Za7uy8oK4OIiDRPI6uQrwL+F3Bxk8sisjcUdHd3MzY21rRalaGhVQwOnsXw8EV79y1Z\nsrRi+HmzJC3I2d9/MosX93H77csmpAwiIlNdIyFnH+BdZrYEGAGejL7o7u9vRsFkakkKBcHgvz1N\nWa27p6eHtWtvaWmTVFTSgpwbNixnyZLjKBQKE1IGEZGprpGQ8yqg2H42J/Za7R18RCKSQgEsB17C\n+vUbm7ZadyuapIqitVDVFuSET3Pqqae2pAwiIlJSd8hx95NaURCZuoozIMdDQZCZlzE2dgXDwxc1\nvFp30srh9a4mXk16LVS8+1ppgsFmBq1q99LM+xQR6TSN1OSINFXWDMhBR+H6w0FS+DjppCWYGbff\n/p29+8bbHHb66X/OXXdtAT4BvI2gFuo8ghXPf0SwtMQO4MdA82Y2Trq/4r24e+pr42n2ExHpJI3M\neCzSVFkzIAeL3peHg0KhwK233sq2bekzGZQ3gQUzDH/3u3fy3e9uLttXbA6rJul6o6OjLFz4Or7/\n/e+xZ89vgQuBc4ClwGcIlpI4HJgb7ruIgw/uYffu3VWvVauk+yveS7XXRESmjFZOwpPnDU0G2FRJ\nMxsHk/UdVTb78M6dOzMn7tu6dat//vOfT5hhuL7VxLOuNzCw1Lu6espWLy+tLP5wwmzHRzkc7NBV\n14SGSbJWRq/3PkVEJlLbz3g81TeFnOZKXgahqyLElMJQKVh0dx/ivb0LfNOmTQnn6HcYDR/ya+qe\ndTgIMtMcLnLYsPd6J564KCNkXBH++4lYADrKAe/qmpa5NEU1a9ZUv5d671NEZCJNVMhRnxxpC/Eh\n3vvssw/PPPNMRWfhtFFLW7Ys45hjjsOsuABmcYTW+whW+r4SeDR8z/con3U4eTXxTZs2MTy8FtgD\nXBFuSxkb+yjf//454VFp/Yg+QjCj8l/vLWexIzXAnj3vYXj4Ew13pi5v4qu8l2qvabVzEZkqFHKk\nrVQb4p3dQXkP7p+hfITWbwg6ARc74HaFX1fOOuzu3HrrrXuD1Xvfez5wEPBZyoe1/y5y7bSQ8TRw\nY0o5Ad4IfKLhkValWZzLZ1CGCwj6//xn6n1O5Cgrje4SkUnVymqiVm0Ev70fIniSbAQWZBz/VuCB\n8Pj7gFOrHHstwZ/uyzPOqeaqCZbeD+VzXlppPN5E0+/BwpzF5q3rHPYva9Lq7z/Z+/tPLtuX3Rxl\n4Xl6vLwf0TTv6zsm472Lm9I/ZnR01Ht7F8Sa55aGzXP/tre5r7iNtx9QPe655x7v7Z0/adcXkfam\nPjnp4eIMgj+l3wG8ArgOGAUOTTn+BOCPwPsJhrlcBvwemJdw7J8TjPl9RCGnPSV3UN7f4aCEYFG9\nc+68ea/yQqGQ2M+nq+vAGvq8XBeGivJ+RJs3b04p5zSH5zpcW9aZupqtW7dWXfW8FPwucig47Kwo\nU2/vfN+8eXOzvxWJkjpqB0HzuprvWUTyTyEnPVxsBK6KfG0EnS3+JuX4rwD/Gtt3N3BNbN8LCcba\nHhHWEinktKHkDsrFILPUg869xWBxYWZQGR4eTglC/5hRGxM9b8GDTs0bnLBjb7WO1MVajU2bNqUG\nmFpGkRWVB6p+D2qXyjtmF8NFVmgar6TAWBpxptFdIhJQyEkOFvuGtTJviu2/AfhGynt+Hg8swCXA\njyJfG3AbcH74tUJOG9u5c6efeOLiWIB42INmmrQAlBxULr300ipBqCscIl6qjQlGVi2uet7iQ3zr\n1q2+cuVKX7lypRcKBS8UCr5mzZrEUWDxAJM2iiypJqQyUCWXK/6ZNbv5KHtYeykEisjUppCTHCye\nT9Bf5tjY/o8Dd6e85/fAGbF97wX+K/L1B4FbI18r5LSx8gBwR8KDteDFWpw/+ZOXe9BMVDn/TvWa\nnODBvHBhcjBIao4qhpCsWpisAJMVFtJqQlauXFklsBE2wWWHpkZlD2u/sGr5867VtWginUQhZ4JC\nDtAH/BdwWOT1mkPOokWL/I1vfGPZdtNNN9XxrZZ6VAaArQ4LvLIDcI8X+8fMmDGzLHDAUd7VNX3v\nA75aYHH3vTUw0YdTUnNUZQCqDBS1BJissJBWE5Jdk/KJukLT+L835dcZ79xAnaqepsc4BSPJg5tu\nuqniObloUXFwh0JONFg0vbmKYMztM+F5i9uecN+DVcqimpxJUAoA93t501T5SCLY3/v7T3b3IJD0\n9S1IfchUCyxZ4gEo60GfVduyZs2a2Dm2etDfp1BTKEkKbEGTW1fdoakexYfxwoWLUzpcj3+W505V\nT9Nj0XiCkUgnUE1OerhI6nj8CHBRyvFfAb4V2/cDwo7HQA8wL7Y9CnwUmF2lHAo5k6AUAI7yoNkp\n2sH1QC8OJS8+EJIeFgsXLk58WCTV2NQrqxYmebmJ8hA0PDzsr3zlkR4f6g77+8KFryv7LOLl3bRp\nU8XQ7Vr7EMU/51o+i6TPN15z1tu7YMJGd7WbRpseGwlGIp1EISc9XLwNeIryIeQ7geeGr98IfDRy\n/PEETVbFIeSXEAxBrxhCHnnPQ/Han4RjFHImSdYcNuvWrSs7NuiL8omaHxa1DNuO194Uv67loVZZ\n2/K5hEDT7eXz+6xymOaHHPK8xGBx0klLKub6iYaL8mve4XBhYvNRvTUIaQ/jE09c3HBgzFMTTSNN\nj40GI5FOopBTPWCcC/yMYHK/u4H5kdduB66PHf8W4Kfh8fcDAxnnf1Ahp32tXr0688GRPAKrOFFe\n5SioWkY91VJrMTCw1Pv7T65osjGb7rNmzfVCoZDQPNblZtMjQaG47lXyQ66vb0HCMO39Y+coD3Oj\no6N+0klLPN6s199/csOjupr9MM5jE00jn1GjfbJEOolCTptvCjmTJ+vBMTw87L29893s4FgQKF8h\nfPXq1Qlz2ezncJkHtR0XldV2VAaAozxe29LdfYj3959cZY6cLl+48HU+OjrqhUIhpfmqlsU3a5/0\n8Itf/GJK+cs7RGc1pcUfyM1+GOe1iSarY3ucanJkKlDIafNNIWdypT04KkdSFWtvSg+JYk3J/PnH\nJNSIHORBU1F5QLn55ptjD57sB9H06TMcDvDylch7HPbf+4BLDgpZo6Tix2eHoqAsWedMOnd6aFm7\ndm3THsbJo+bW7P1edfKDvZGO7fUGI5FOo5DT5ptCzuRKenDMmDHTu7rKm2xKtTfRh36pg3LlA7qy\ndgam+cteNisWAKoHi8svvzxy/soRUsUHd/pf7cVylI9Smj790ITjaxk6fkBGELrIk+ccqgwtwbpU\nxdFqXRXlbORhXGqCjI+aC66xevXqVvwYTahix/bh4eHMPkfjGfEn0gkUctp8U8hpD9EHR/UHfTRg\nHBF5eNRbg1JbTc7y5cvD1/tjD+zS18WakeR1rqaHW3mIe/DBB6us35U06WEx4MWXqSivKQk+Hw+P\nr5zluXySw2KwucLhs7HPs/QwrqcDcakzedKouWm+cOHiFv8ktV4jfY6aMeJPpB0p5LT5ppDTXmqb\nbfdghxd7V9e0lBFaWed4uZevjVVZ21IMBEFTTpfH15EqTlIYrRmpts7V/PkL/OKLLy4bMZZ0/JFH\nHu2VcwVFm+oeDl8/2IuzPZe250aOG60IZtFJDru6pkXCSPQcQdBZt25d3Q/zUm3WKxK+J6Xg2MxJ\nC6Oj4eoNEY2O/sprnyORRijktPmmkNNesmf7rRxVVDkKKmtRzn/zyqaU8v470VqMauc68cTFFfdQ\n/Kt93bp1NT1Eo3/ll673bi81UVVe98ADp3tlc1yPl2p8SscW19wq/3wvCj/LpEU4u3zNmjV1P8xL\nAfVcrxYyxzuqKHmF9PJFU6vVqox35uKJCHAinUIhp803hZz2k9ZZ8+CDe8JZf2sZBfVcT2quCR6G\nxQdUcdXxoKknKZRk1Sy1oo9J6f6LQSbenyer8/EGT+tTU7qfL1c9x/XXX1/Xwzx5qH/2/Efj+3zi\nAa8/MYjFa2yyRqdVC6YaFi5STiGnzTeFnPYzOjpa8cDMmjiwUCj45s2bY7MEl9f6pM19M9HDgLMe\npOXNWOU1TDNmzIwEkGpD05NrJ8prctLPUb6qe7TDdfD6xRdfXFb+9GH5lctC1FNzkvTZVQ94pT5b\nSfMlpc8a/bnEn5f0z081OSLuCjltvynktJekpoQTT1xc08SBRdHmn3iHz6R+MCeeWFoeIimANGsY\ncK3NJMUyFGuWvvjFL/qll17q69atq2kenHnzXpU4i3P0fkp9crJqcuJ9dqZXlP9rX/tawrlGE957\nlAejrrJrW9Jk99las/e/e3vnV9TYlNb/+pKXOmm7B7VAlXMlJX2PJ2tY+ETPIJ2nGauldRRy2nxT\nyGkv6csLZNfk1Grnzp2+cOHisgdwsW9PUgBp1jDgrD4u1UJQ5WvF5SLKa0r23ffZqWt9Fc+1Y8cO\nP/jg4sM+aSRX0CcnGOZeOQw/CCvB18HszMVh/NVqlpL7Fm3atKmi1q62zs21jL6rdly0U/emun62\nJnpY+ETPIJ3HGauldRRy2nxTyGkfWQ+wpJWxG/kLOilsBA/r/VMDyNatW/3yyy/35cuX+/XXX9/Q\nSJ6sB2m1EFT+2h2eXMtyVJ3nus4rh8YH56htKH88NKTPJVRZcxIEoIMOquxAnfU9TR56X+yTE/xM\nlOb/SQteX/JSR+uXVz02rZ/NRA0Lb/Vornr6LGW9t920e/nyQCGnzTeFnPZRSyff8f6FWVtNQPm+\nY489wSuHddfXt2S8q5qXvxY9V7HzdKHBc3n43gsd2Lv8RW3NQtGvj/bKxUn382nTDontW+CwuUpZ\nSuVMW1V99erVFTVx8dFVmzZVr51JD2m1laPaz1czH6qt7AOU3DRcvca0uLRIu9f2tHv58kQhp803\nhZz2Uesv9Phf0PU8WGp/eEf37eeV8+Qc4nBUzX9RZ93bypUrI+Wq7OhbXuZ6zpV0j+mv9fbOzxg6\nXxyevy4WEl7rQX+d8sVGK/cVOx/v71nNXNEalGp9tZL6Xrmn1fhEJ1aM3veCcdUSZj1UGw0/rRzN\nlVRj09V1YObPzowZM33RopPaurZHcxlNHIWcNt8UctpLPZ06G/lrrZGanOrHB8PPa5niv9Th90KP\nD/MulSt5cr7KMpzs8f40ZtO9v//kGu6xtpqB8u/F/QllK46gSvrrP6sMB3qp9qWestT+0EqenPEo\nL02YWLrW5s2bx/WXf1r5kqY3qOe8rarJyQ6x1ZYWObCmMk1WbYpGwE0shZw23xRy2ks9nTob/Wst\nKUiV+uSU9gUjcbI61X7Waxl6vHPnzoqOzdDl/f0n7z02WJT0oIowse++z04Y+v4qr2we2t/7+09O\nvcdSLUpXeL/pQbKyWajYSTleK7OPw/kJn1EtM1fj8GIvn326VM5aJ2SsdbLFvr4FYU3FFan33Ug/\nm6zyBcE2WlsyzXt759d8jVaM5qpeQ9QV/uyn1YBdWOW9ScucTGxtiuYymlgKOW2+KeS0p6yHzXge\nfElBKml0Vfmon7S/bI+oePgn/SLP+oVfXpNTuebTcce9NqFWYpWX98kp3Xsw19Ci2PHFIdzXeTwg\npY/iwvv6Fnj1zyDpM8qqydkQ/rufx9fMCjoQX7f38xnvQ6vaDMnNqFnIbgK9KPx6p8dn2q7l+vWO\n5qqleaiWTv7ln1d0aZE7qr63+oK1ra9NUU3OxFLIafNNIaezFH+BZ/U7qeWvtaQgFd8XPFz29/js\nyUEQOaKmX6a1/NItPSirH1coFGIT9VXee1IHbZjnSc00s2fP9s2bN++9/0b6aaxcuTKxT0v1xUaj\nASneqbv4QA2OyRrplfXQOvHEReE9fCJyTz01LRbajMAAH/cghC71eICtp2YjK/jX2zyUVUP0hS98\nITxP0vD/ytqe6HsnuzZlsuYymooUctp8U8jpDMl/jbf+r7XR0dGwhid5dFUtv8hr+YVfelBmn6/2\nofbxjtJLvdSpuViTcoDPmDGzxs7G6Z91rbVjQS3NtR6En1eHX8c7JxfLWrrvag+ttCCSvNREeYBq\nZWCIzvBc+pm5rmU/r/U2D9VSQxQ0oVbOx9TT89zMjtaTWZsy0XMZTWUKOW2+KeR0hqRf4LB/Zt+S\nZikUCr5y5UpfuXLl3pmIa61hqPUXfj0THqY99NPPUblsQfB1UCt07LEnRJbEqK2fRtJnnVTbULnc\nRrHpLGuY9xV777vWELVwYWn26qCjd9KouPIAlaQZgSGoyboucu1pHoS6+Gc7/pqN8YSKajVEDz74\nYBh0Svd10EHT/bbbbst8bzvUpkzUXEZTmUJOm28KOe0v/Rf4tRUP7vH+tVbvcNdaf5H3959cEciK\no6GKRkdHE/9yTjpf0kP1pJOW+Gtec3RKUOn3yo7D0700GWCXmx1c9UEZzIBcut6MGTP9wQcfrPkz\nrGxqq17D1dV1YNUQlRx8p/mMGTNrmCenFKCSyj+ewJA9T1HlCL7xPoRb3Tx08803++GHz6nr/zXV\npkwNCjltvinkTI5mzm2zcuXKcf+11uhw11p/kQc1DumjoaLni3f6TButFb/ujBkzU4JKLUPKi68X\n+42Uh6wZM2aGgeITHswW/ImK8FXLZ1geIKqXK7qmWFxWEJk371V1B6ii8QaG7I7IF3qzazayPo9a\npjioppGRUvE12JpRm6IZjNuPQk6bbwo5E6sVc9tMRn+GuGrV4uUrf6/zpNFQ9ZwvrbyldaXiQaX6\nkN9SbdjDHvRXKf/+zJv36po+//Iy3eFw0d4ZlJPL/mUPapLKm8Fq6RScHSSq99lKC1BBP57xrZNW\n2zxF9dVsZD3ct27d6r2988Ph6tHPcnpFc1O9tSn1/v/XivlxNINx+1LIafNNIWdiNXNum4n6K3i8\nNUSldZSinV83eVAjUn9TQvZDdHNFUKl+/AUJr5eWeqhlJFupTNcmXLurbARXZe1X/U2OtQSJ17ym\nt6KJsDgcP+2cpaBQnOjwwvAaFyYGtjTVfl7rmbE76+FebXh8sXZvvHPV1FuzVc//40n3nrRvsubc\nkWwKOW2+KeRMnGbPbdOsv+Qqf4mXj0Bq7tT513q82SraWbax8pY/dEpLU5SCyvTph1YZ/fOwJzVT\ndXX17B29lPV9K5Wp35Pm+entXVBxH9GHffS/a22SCObvOcCDGrIvedDP5hAvTqZ43HEnVHzWSU2E\nyUHheRWBASibvLGaWn5ea6mdyHq4p9XoHXxwj998880N//8W/R7U8/9trccm3XtSR/KBgex1yNR0\nNbkUctp8U8iZOM3oHNmK0RL11EI0dt7oL+elHl8Hq96/SLNrMUoz+gbXOiqx2aK8GaqymSo+Uqla\nTVr5EPjGHka1NklUr72Y7mYHhwGnWJbkCROL0pv+pvt45rVxr3X0UdYEken9bJJfD4b8z5o1u67/\n34qzXMeH3Q8MLE2YcTt5luysOZyqzYZcmnW8/POoPupPMxhPNoWcNt8UcibOZM+dUU35pH/lv3gb\nrRJPriFqzv2nhY5p02YkPPxP9iDAUdEJtPI8V3hX14F+4omLy65XS83EeB9GtTZJJIeSYg3OND/k\nkOeljDLb6vEmwuzAmDQR3vh/VuurHUv+PM8666zY65UzKjdaq1KaHTt7Da7091dOPllLzVC968c1\n8r1QB+bmUchp800hZ2K1w9wZSVpRJV75y7x5w3zTQseRRx7twQKKF3nQ3FYMAP2J16i3GbBazcR4\nPsNaA3BttVjxB3zlw79YS5UcJEphKPh3fN+rJFkB5vOf/3zKUPSdnrxQarEmrnIuqbQpCYoP+uqT\nR5Z/D4aHh/3SSy/1devW7b2X6p3gK/8fz25u/byXat6CfeNdJb74s5NWU6UOzI1TyGnzTSFnYrXr\n3BmtmmekPNTd0XAISBPvy1I9AKRfIym8NPLXbqMhttbPP/sB+fHIz1ZX5GGbXENU/pkl1YQkL4dR\n62eS9hnWMwIrCCrXhmUvdoiOB4pXpJyvci6p5Jmoq9WqFING+YSOtfSXSfp/vL57DwLdeFaJr6Wm\narL/yOpkCjnVA8Z5wEPA08BGYEHG8W8FHgiPvw84NfLaPsDHgfuB3wK/AL4EPD/jnAo5k6DdZiJt\nVVNa0kiiVs3SnBUAenvn13Se8QzXbXQxyWbNHl0KN5eFD7G0h3/pvKVglrw4alqNxHg/w6RAWN4v\n5Q4PauQO8vKgUu3e04fUr1y5Mna/1zq8JuN9a/aePxh1doVH50nKaqK89NJLE//fSZocM/isy/vk\nwDSfPv3Qve+r5fdGPFimN29W1lRJ/RRy0sPFGcDvgHcArwCuA0aBQ1OOPwH4I/B+YC5wGfB7YF74\n+sHAMPAWYDZwTBicNmWUQyFH3L21TWnFX87j+Ys0SykAXOGl6v7SL/FaO1BX6xtTa+1OI4tJTp8+\nI/Hz7+1dkLmkRdCXqj8STIoPsGKTz4bEh/CaNWtiK7bXXiMx3s9w/fr1FZ3Bodvhck/qAH/22Wdn\nBplq5S8f6l+c+HFaxvuuCO+jy5Obyapftxis4pInx+zytLW9qk0MWe1nKvv7WqqpUgfmxijkpIeL\njcBVka8NeBT4m5TjvwL8a2zf3cA1Va4xHxgDXlTlGIUccfeJbUprRU3Wzp07Ex6awciqtKAWDy3p\nNSWVa1+N57MZGFjqXV3TKx6c++777IQHX/n1kteJKi68GX2ALc48pnjfWbVgZs+q6IydpvbmmGKt\nXmkW6aA/1cGe1CSVNSkjvMSTV30/au+9lu7zjsi5KqcPiC4uGszzZF5ZyxWEn6T+MsF9VX7vKj+f\n4si36nMxVZuhOvozFQ+WwerztdVUqSanMQo5ycFiX4JamTfF9t8AfCPlPT8Hlsf2XQL8qMp1lgDP\nAAdWOUYhR8q0W1NardI6gBZXGY9Ka05ZvXp1ykOhv+LB22gtV+khl9w8NH/+MZFJ+dKv9+lPfzo8\nT3ItTRAYoucu1vZ8ee/nUmtzWbW1ruKy+w1d5JX9s5L6A1WGslIn4cplN4L3dMfOUR5yy2ffLpax\ncvqA5zxnmn/hC1/wQqHga9eurfrZfP3rX08IndHFSctH7KV39q72+QfljXZ4Tv6ZSh5On1VTpT45\njVPISQ4Wzwf2AMfG9n8cuDvlPb8Hzojtey/wXynH7w/8ELgxoywKOdLx6u1TlNacUhp5Ej1PfeeO\nBoeksFh6yGXVdoy3f07y8O9ge5XHa6aCtb+SakKyVy2PuueeezLKVay9iD7ok0ZGRfuNBNdfvXp1\nYjjdsWNHZM0zq3g93hcoCJDxMpYmj4zO7lxrp/DKxUmTR7Wld1YudqqON0Nm1yBWL2NXuBp9ck1V\nOwx86GQKOZMQcgg6If8rsLlaLY4r5EhO1DM6LCscnHhivLag+tpXxXNXm6QvubmiWm1HbfeS3D8n\nOpNz0rlXelrNVHyl9VJtSu1NGuVzLsXL1e+VwbGWeWPKrx+vbawMrZ9InO/IPdosWxx9lhTqsua1\n2br35yL6mZT/HBaDW6mzcnEW7eTv28EOz419/v1eqslJr0HM+pmOL3q7cOFiX716dcfV1rYjhZzk\nYNGy5qow4HwD+BHQU0NZegFftGiRv/GNbyzbbrrpptq/0yKTqJ6anKxAlFRbUMu5q03SF38w1dbR\nN32m3+IDPql/TnJtVPTcX6j6el/fgrAvR2nm6FqbNErfh+s8qfNwMOqreL3i7NdZC6heWPX6jY4M\nvPnmm/2ww14YK2Mx1JUHytL39nOR4FGtv01xvqLkzspJHfBLHY8rZ6hOmiAwvXYyeeBApzZDt5Ob\nbrqp4jm5aFHx/2WFnHi4SOp4/AhwUcrxXwG+Fdv3AyIdjyMB5z7gkBrLoZocyYVaR4fV+lCMPhRq\nX9ahtj4to6OjYT+SpOaJfk9quijve1L+gE2v2YjXpERrCmoPebU2aZQC5JfCB3Pxgb0h3H+gl+ZM\nOt/LRxilB75q1693jqfkGrfDPVjYtfjeoC9LsQ9MZe1Pel+poDnswPDY5M7K0Sauaj9j5bVf1e+r\nXefgyjvV5KSHi7cBT1E+hHwn8Nzw9RuBj0aOP56gyao4hPwSgiHoxSHk+wDfIqjxeTUwM7LtW6Uc\nCuKeLagAABSdSURBVDmSC/X8kq93uHzWubM721auuD46OlrRjFCqSRj1eC3AjBkzwxFZ2Z2fk0dg\ndYcPzWItQ+0hrxY7d+6smE03GOFVau6CEzzex2TBgmP9oIOmezzUdXVVDp9PUuoYnNwHKT6Mu/oM\nxfdXfO7F73Ot4Xh0dNT7+uZXPTbagbjYhyu5dscc3ue11OQUqcZmYinkVA865wI/I5jc725gfuS1\n24HrY8e/BfhpePz9wEDktT8hGC4e3faE/y6qUgaFHMmVWn7JN/pXb9q5663JiVq5sjh8OHmU1KWX\nXlrzZIFp5a18f+Ww6fGOskkPD8UAE62hKg9q/f0nVwS+rO9H9Zl8P+fxeWhqn6E4uaamlqUoip91\n1kKdvb3zfceOHYk/g5s3b/bVq1cnBOB+h2s1GqrNKOS0+aaQI1NZM//qTW5uSO6TE9WMxSqzRj1V\nvr9y2HS9TRvROYayQ1609ib9PmtZXqP6mlPFTteVzUpm01MWLi19jkHNSXpfqOyAFO1fk35sV1cw\nhD9twsT0wNjlvb3za57YUlpPIafNN4UckeZIbiKqbZjuePv8ZIW09PcHNUxp868kSWqWylreAPDl\ny5fXFdSSamoqJ3usv+N29mvps0NnL0UR7XtT2QQXH71VfZh/c2afltZSyGnzTSFHpLmKtRHr1q2r\nuZaoluaz8S67kdzROahRqFVpVunyWpLkeWfKH8zJq4qXjqllLqNS35niKun1D8F/yUtelhI+osO1\nk8u3Y8eOhKBVHBWVdN/xIfldDid70KRW7KtVfM9OLx+5Va1/1xWpQ+RlYinktPmmkCPSPqo1n41n\n9Ez5LMvxPiy1T+lffeh72rwzpWs0awQc1NJ0lPzahz70IY93fg5qV64N/7tyVFuxfKXyF5eieHdG\nIDEPRpRd5EENUWlagcqanOKQ+uodw4OJHEtlX7gwe10raR2FnDbfFHJEOksj/YjK++RE52GprU+P\ne22TGB58cE9FiIouq1BrUMserbbG0zpPB01pXV45GWEwe3AxbAW1TxeG4aP4+smeNEtx+uiqWtbp\nSn6tfEHWO2LHJq2nVb4eVlDrc93eCQZlcijktPmmkCOSf+Pt0+Ne23IUmzdvruivkxRisoJadk1O\nwZOG2RevlbzK9/7e33+yu6f1n+r30lpZBY8P+08PXsXZo+OBakHVoHb99dcnlCG9Y3j5eljRZS+0\nwOZkUshp800hR2RqGG+fnsqFRcv79ixcuHjvsc0YtZY+Od5RHq+5iV+r1hqjyvWm0gNgevC61iub\nv/odqg9Xj85HlF6GKyLnTAt8G8rCmEwshZw23xRyRKaGZsyIGzTzTK+oQUla6b0V5U2b8TlNrWGr\n1gBY7bjksFL7fERp5+7trV4jlLSGlkwchZw23xRyRKaW8dSypK2V1cqOr/HytmJG31oDYP2j4NJn\nUK61DFkTGEZXTJeJN1Ehxzx4YEudzKwXGBkZGaG3t3eyiyMiHWDbtm1s376dWbNmMXv27MkuTtPU\nel/Vjtu1axeDg2cxPLxm774TT1zM+953LkcffXTm55V07lNOOY316zcyNnYVsBjYAJwP/IaBgVMY\nGlpFT09Pg3ct47Flyxb6+voA+tx9S6uuo5DTIIUcEZHma2YQTApOvb0LuO66a5g/f/54iyrjMFEh\nZ59WnVhERKRes2fPblotV09PD2vX3pLbGjTJppAjIiK51szgJJ2la7ILICIiItIKCjkiIiKSSwo5\nIiIikksKOSIiIpJLCjkiIiKSSwo5IiIikksKOSIiIpJLCjkiIiKSSwo5IiIikksKOSIiIpJLCjki\nIiKSSwo5IiIikksKOSIiIpJLCjkiIiKSSwo5IiIikksKOSIiIpJLHRlyzOw8M3vIzJ42s41mtiDj\n+Lea2QPh8feZ2akJx1xmZv9pZk+Z2XfMbFbr7kBERERareNCjpmdAXwS+AhwNHAfMGxmh6YcfwJw\nE7ASOAr4FvBNM5sXOeYDwPnA2cAxwJPhOfdr4a2IiIhIC3VcyAFWANe5+43u/lPgHOAp4F0pxy8H\nbnX3T7n7Vnf/MLCFINQUXQBc7u7fdvf/AN4BvAD4s5bdhYiIiLRUR4UcM9sX6ANuK+5zdwfWA8en\nvO348PWo4eLxZvZy4LDYOf8buKfKOUVERKTNdVTIAQ4FuoHHY/sfJwgqSQ7LOH4m4HWeU0RERNpc\np4UcERERkZrsM9kFqNMTwBhB7UvUTOCxlPc8lnH8Y4CF+x6PHfOjrAKtWLGCadOmle0bHBxkcHAw\n660iIiK5NzQ0xNDQUNm+3bt3T8i1LejS0jnMbCNwj7tfEH5twMPA1e5+RcLxXwGe7e6nR/b9ALjP\n3c8Nv/5P4Ap3vzL8+mCCwPMOd/9aSjl6gZGRkRF6e3ubeo8iIiJ5tmXLFvr6+gD63H1Lq67TaTU5\nAJ8CbjCzEWATwWirA4AbAMzsRuBRd/9QePxVwB1m9n7gFmCQoPPyeyLn/DTwt2a2HfgZcDnwKMFw\ncxEREelAHRdy3P2r4Zw4lxE0Kd0LDLj7r8JDXgQ8Ezn+bjM7E/j7cNsGnO7uP4kc849mdgBwHTAd\nuBM41d3/MBH3JCIiIs3XcSEHwN2vAa5Jea0/Yd/Xga9nnPMS4JImFE9ERETagEZXiYiISC4p5IiI\niEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiI\nSC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhI\nLinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEgu\nKeSIiIhILinkiIiISC51VMgxsx4z+2cz221mu8zs/5nZczLes7+ZfdbMnjCz35jZzWb2vMjrR5rZ\nTWb2sJk9ZWY/NrPlrb+bzjE0NDTZRZgQus980X3mz1S516lynxOho0IOcBNwBPB64DRgEXBdxns+\nHR77lvD4FwD/Enm9D3gceDswD/h74GNmdm5TS97Bpsr/cLrPfNF95s9Uudepcp8TYZ/JLkCtzOwV\nwADQ5+4/Cve9D7jFzC5098cS3nMw8C7gL9x9Q7jvncADZnaMu29y9y/G3vYzMzsBeDNwTQtvSURE\nRFqok2pyjgd2FQNOaD3gwLEp7+kjCHK3FXe4+1bg4fB8aaYBo+MqrYiIiEyqjqnJAQ4Dfhnd4e5j\nZjYavpb2nj+4+3/H9j+e9p6wFudtwNLxFVdEREQm06SHHDP7GPCBKoc4QT+ciSjLq4BvApe4+20Z\nhz8L4IEHHmh5uSbb7t272bJly2QXo+V0n/mi+8yfqXKvU+E+I8/OZ7XyOuburTx/dgHMZgAzMg57\nEFgGfMLd9x5rZt3A74D/4e7fSjj3SQRNWj3R2hwz+xlwpbtfFdk3D7gd+Ly7f7iGcp8J/HPWcSIi\nIpLq7e5+U6tOPuk1Oe6+E9iZdZyZ3Q1MN7OjI/1yXg8YcE/K20aAZ8LjvhGeZy7wEuDuyLlfSdBv\n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\nRK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2091,14 +2100,12 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 35, @@ -2107,9 +2114,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGHCAYAAACJeOnXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8VNX9//HXJ2EJYRWiiGBYZBcRQVFRFEEFtSqtW6MI\notS6FPyh1dZqVWjdv4ptLda2VFwgrVJFURAFFDcqSEBQQ2SPshp2EsKSnN8fd8BJSEIymZk7M3k/\nH4/7CDn3zr2fuQTynnvPPcecc4iIiIhEU5LfBYiIiEjNowAiIiIiUacAIiIiIlGnACIiIiJRpwAi\nIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiEWFmD5lZsd91iEhsUgARiSIzO8nM\nppjZGjPbY2bfm9l7ZvarCB4zw8zuKKO9hZk9aGbdI3RoB/gSQMzsBTMrDloKzSzHzMaYWd1q7Pde\nM7s8nLWK1FSmuWBEosPM+gBzgLXAi8BG4HjgDOAE51zHCB13GnCic65dqfZewALgBufcSxE4bhJQ\nyzm3L9z7rsSxXwCuAW4CDGgMXA5cCExyzl0f4n53Aa85524MV60iNVUtvwsQqUHuA7YDpzrndgWv\nMLM0H+qxiOzULNU5V+CcKwaiHj6CHHDOZQZ9/5yZfQZkmNmdzrkf/CpMRHQLRiSa2gFflw4fAM65\nvNJtZjbEzD43s3wz22pmc83s/KD1l5nZ22a2LnCLYYWZ3R+48nBwmw+AS4DWQbcjVpnZucB8vNsk\nEwPtRWY2NOi1p5vZu2a2PVDDh4GrOME1PhR4bRczm2xmW4GPg9eV2r7YzP5sZpeb2dJA3V+Z2cAy\n3n8/M/sicKtquZndHIZ+JZ/gBa/SV4N+bWafmlmemRUEjntF6dqBVOCGoHP5r6D1x5nZv8xsY9D7\nGl7G+xoZWHfw73WBmf28Gu9JJC7pCohI9KwFzjCzE51zX1e0oZk9CDwIfAr8Hu9KwulAf2BWYLMb\ngF3AU8DuwLqxQEPgN4Ft/oh3+6El8P/wfvnuBr4BHghs/zyB0AB8Fjh+f2A68AXwEF5fjuHAHDM7\n2zn3RWD7g/dwXwO+Be7lxysrLmh9sL7Az4DxgfpHAVPMLN05ty1w/FOAGcD6wPuvFfiaV84+K6tt\n4Ou2Uu2jgDeBV4A6wM+BV83sJ865GYFthgATgM+BvwfaVgbqPSbQXgT8OVDnRcAEM2vonPtzYLtf\nAH8CXgWeAVKA7nh/t/+uxvsSiT/OOS1atERhAc7HCxL78YLFY8AFeP0kgrc7ATiA19egov3VLaPt\nObxf6rWD2qYBq8rYthdesBhaxroc4J3Sx8P7hftuUNuDgX28XMY+HgSKSrUVA3uANkFtJwXabwtq\neyvwPpoHtbULnL+i0scq49gvADuBZoGlHXAXXkBYfKRzCSQDS4D3S7XvAv5Vxuv/CXwPNCnVPhnY\nenD/wBvAEr9/FrVoiYVFt2BEosQ5Nws4E++TdnfgbmAmsM7MLg3a9Kd4VxHGHmF/ew/+2cwamFkz\nvFsMqUDnUOs0sx5AByDTzJodXPCurMwGzildCt5VlMp63zm35tCLnVuKFxbaBY6fBAwApjrnNgVt\ntwrvqkhlNQB+CCwrgCfxzs/g0huWOpdNgKPwrgr1rOSxfoYX9JJLnbP3gCZB+9kOtDKzU6vwPkQS\nkm7BiESRc24hcKWZ1QJOxgsbo4HXzKyHc24Z3i/iYiC7on2ZWVfgYeA8oFHwYfBuu4SqQ+BreU/G\nFJtZY+fcjqC21VXY/3dltG3D+6UPcAxQDy80lFZWW3n2AD/BC3OtgHsC+95TekMz+wleJ+EeeFd6\nDjpifxMzOxovZNwM/LKMTVzguACP44Wr+Wa2Ai+gTHbOfVa5tySSOBRARHzgnDsALAQWmtlyvFsG\nVwF/qMzrzawx8BHeJ+r7gVVAId5tlceoXgfzg6+9C/iynG12l/r+sF/qFSgqpz3cT+UUOec+OLRz\ns/eAZXhXawYHtffFuyr1IXArsAHvNtmNQEYljnPwfL2C93h1WZYAOOeWmVknvGA0CO/KyW1mNsY5\nN6bS70wkASiAiPjvYIfOFoGvK/F+qXUl8IurDP3wrhhc7pz79GCjmZ1Qxrblddosr31l4Osu59yc\ncraJpM14Yap9Ges6lNFWKc65jWY2DnjAzHo75+YHVv0ML0ANDARDAMzsprJ2U0bbD3h9Q5Irc76c\nc3vwOu2+FrgS9gZwn5k96nwYM0XEL+oDIhIlZtavnFWXBL4uC3ydiveL7gEzK++qQBHeFYPgR27r\nALeVsW0+Zd+SyQ98bVKqfSFeCPm1mdUv/aJIj1nivPFDZgGDzezYoOO2x7tqUB1/wQsbvw1qK8I7\n34c+kJlZG7yBy0rLp9T5CtT7X+AKMzux9AuCz5eZNS312gN4t9oMqF2ldyIS53QFRCR6/mJmqXif\neJfhPe55FnA13i2UiQDOuZVm9jDerZWPzex1YC9wGrDOOXcf3uOy24CXzOzPgf0PoexP6AuBq83s\nKbyRT3c7597GCxnbgVvMbDfeL9fPnXNrzGwE3mO4X5s3qug6vEd5zwN2UPYv53B6CG/U0s/M7Dm8\n/6tuB5bi9dMIiXNua+D93GpmnZxzOcA7wJ3ATDObDDTHC3LL8ToLB1sInG9mo/EeEV4duJLyW7yr\nUp+b2T/wHnNuindLrD9wMIS8Z2Yb8Z6C2oR3let24G3nXD4iNYnfj+Fo0VJTFrxfqP8Avsb7Jb4H\n73HXcUBaGdsPw7s9U4A3rsQcoH/Q+jPwfpHtxuvY+Qjeo75FwDlB26UCLwNbAutWBa37Cd4v9b2B\ndUOD1nXHu1WwOVDDKiAT6Be0zYOB1zUto/4H8UYjDW4rAv5UxrargAml2voF3v8evDFGhuM9yZJf\niXP9ArCjnHVt8R7n/VdQ2w14obAg8PczlLIfI+4IfBA450Wl9pGGNwbIGrxbSOvwOpneGLTNiMDr\nD57Tb4FHgQZ+/3xq0RLtRXPBiEjcMLM3gK7OuU5+1yIi1eN7HxDzZpecb2Y7zWyTmb1hZh1LbfOh\nlZzZssjMxvtVs4hEnpmllPq+A3Ax3hUEEYlzvl8BMbPpeJd1v8C7z/so0A3o4rze4gfns8jBG4r5\nYKe8Audc6UcBRSRBmNl6vH4xq4A2wC14HTV7OudWlv9KEYkHvndCdc5dHPy9md2Ad3+0F96ohQcV\nOM1eKVKTzMCbk+VYvD4qnwG/U/gQSQy+XwEpLfCoXQ5wknPum0DbB3i9xZOAjXhDHv/h4BUSERER\niS8xFUACYx5MAxo6584Nah+BN5Poerye+U/gPS54pS+FioiISLXEWgB5DhgInOWc21DBdufhDVTU\n3jl32BwUgUmgBvLj43AiIiJSOSl4/a5mOue2ROogvvcBOcjMnsXr4d63ovAR8DleZ9T2lD0J1kBg\nUngrFBERqVGuAyZHaucxEUAC4eNy4FznXG4lXnIK3oiP5QWVNQCvvPIKXbp0CUuNNcXo0aMZN26c\n32XEFZ2z0Oi8VZ3OWWh03qomOzubIUOGQOB3aaT4HkAC43lkAJcB+WbWPLBqh3Ou0MzaAdfiDQu9\nBW8K86eBuc65r8rZbSFAly5d6NmzZ0TrTzSNGzfWOasinbPQ6LxVnc5ZaHTeQhbRLgy+BxC8Z/sd\n3lTYwYYDL+ENmXw+cAdQH2/I6deAh6NXooiIiIST7wHEOVfhaKzOue/x5oQQERGRBOH7UOwiIiJS\n8yiASAkZGRl+lxB3dM5Co/NWdTpnodF5i00xNQ5IuJhZT2DhwoUL1fFIRBJKbm4ueXl5fpchcS4t\nLY309PQy12VlZdGrVy+AXs65rEjV4HsfEBERqZzc3Fy6dOlCQUGB36VInEtNTSU7O7vcEBINCiAi\nInEiLy+PgoICjXEk1XJwnI+8vDwFEBERqTyNcSSJQJ1QRUREJOoUQERERCTqFEBEREQk6hRARERE\nJOoUQERERCTqFEBERCQmvPjiiyQlJZGVVXLsq507d9K7d29SU1N57733GDNmDElJSYeW+vXr07p1\nay677DImTpzIvn37Dtv38OHDS7wmeElNTY3WW5QgegxXRERihpmV+H7Xrl1ccMEFfPXVV0ydOpUL\nL7yQefPmYWb87W9/o379+uzdu5d169Yxc+ZMbrzxRp555hneeecdWrZsWWJfKSkpTJgwgdIjgCcn\nJ0f8fcnhFEBERCQm7d69mwsvvJAlS5bwxhtvcOGFF5ZYf8UVV9C0adND399///1kZmZy/fXXc9VV\nV/HZZ5+V2L5WrVqaFyaG6BaMiIjEnPz8fAYOHMjixYt5/fXXGTRoUKVel5GRwYgRI/j888+ZPXt2\nhKuU6lAAERGRmLJ7924GDRrEwoULmTJlChdddFGVXn/99dfjnOO99947bN2WLVsOW3bt2hWu0qUK\ndAtGRERihnOOYcOGsWHDBqZMmcIll1xS5X1069YNgJUrV5Zo3717N0cfffRh2w8aNIjp06eHVrCE\nTAFERCQBFewvYFnesogfp3NaZ1Jrh/cpks2bN5OSkkKrVq1Cen2DBg0ADruyUa9ePd5+++3DOqGm\npaWFVqhUiwKISJzIzc0lLy/vsPa0tDRfZ7SU2LQsbxm9/t4r4sdZePNCerYI38R4Zsbzzz/P6NGj\nGThwIJ988gkdOnSo0j52794NQMOGDUu0Jycnc95554WtVqkeBRCROJCbm0unTl0oLCw4bF1KSio5\nOdkKIVJC57TOLLx5YVSOE25du3ZlxowZ9O/fnwsuuIBPP/30sEdqK/LVV18B0L59+7DXJuGjACIS\nB/Ly8gLh4xWgS9CabAoLh5CXl6cAIiWk1k4N65WJaDv11FOZOnUql1xyCRdccAEff/wxzZo1q9Rr\nX3rpJcyMgQMHRrhKqQ49BSMSV7oAPYOWLhVvLhLH+vfvT2ZmJsuXL2fQoEGHbq1UZPLkyUyYMIE+\nffrodkuM0xUQERGJGaU7iA4ePJh//OMf3HjjjVx22WXMmDHj0HavvfYaDRo0YN++fYdGQv300085\n5ZRTePXVVw/b94EDB5g0aVKZx/3Zz35GvXr1wv+GpFwKICIiEjNKD8UOcMMNN7B161buvvturr76\nak4++WTMjNtuuw3whlhPS0ujR48eTJw4kYyMDGrXrn3Yfvbu3cvQoUPLPG7fvn11GzPKFEBERCQm\nDBs2jGHDhpW57s477+TOO+889P3YsWOrtO8XXniBF154oVr1SXipD4iIiIhEnQKIiIiIRJ0CiIiI\niESdAoiIiIhEnQKIiIiIRJ0CiIiIiESdAoiIiIhEnQKIiIiIRJ0CiIiIiESdAoiIiIhEnQKIiIiI\nRJ0CiIiIxKU2bdpw4403+l2GhEiT0YmIJIDc3Fzy8vL8LoO0tLSQZ5V98cUXGT58OF988QU9e/Y8\nbH2/fv3YunUrS5YsASApKanM2XMrMmPGDObPn8+DDz4YUo0SPgogIiJxLjc3l06dulBYWOB3KaSk\npJKTkx1yCKkoUJRel5OTQ1JS1S7kT58+nfHjxyuAxAAFEBGROJeXlxcIH68AXXysJJvCwiHk5eWF\nHECqonbt2lV+jXMuApVUXkFBAampqb7WECvUB0REJGF0AXr6uEQ3/JTuA3LgwAHGjBlDx44dqVev\nHmlpafTt25fZs2cDMHz4cMaPHw94t2+SkpJITk4+9PqCggLuuusu0tPTSUlJoXPnzjz11FOHHbew\nsJBRo0Zx9NFH06hRIwYPHsz69etJSkpi7Nixh7Z76KGHSEpKIjs7m2uvvZamTZvSt29fAJYuXcrw\n4cM54YQTqFevHi1atOCmm25i69atJY51cB/Lly9nyJAhNGnShGOOOYYHHngAgO+++47BgwfTuHFj\nWrRowdNPPx2msxt5ugIiIiIxZceOHWzZsqVEm3OO/fv3l2grfUvmwQcf5LHHHuPmm2/mtNNOY+fO\nnXzxxRdkZWUxYMAAbrnlFtavX8+sWbOYNGnSYVdDLr30UubOncuIESM4+eSTmTlzJnfffTfr168v\nEUSGDRvGlClTGDp0KKeffjpz587lkksuOayeg99fddVVdOzYkUcfffTQMd9//31Wr17NjTfeyLHH\nHsvXX3/N888/zzfffMO8efMO28c111xD165defzxx3nnnXd4+OGHadq0Kc8//zwDBgzgiSeeYNKk\nSdx999307t2bs88+O5RTH13OuYRb8KK4W7hwoRNJBAsXLnSAg4UOXNDitetnvWY4+HNQ+u+7/J+P\naC/V+3mcOHGiM7MKl5NOOunQ9m3atHHDhw8/9H2PHj3cpZdeWuExfvWrX7mkpKTD2qdOnerMzD36\n6KMl2q+66iqXnJzsVq1a5ZxzLisry5mZu+uuu0psN3z4cJeUlOTGjBlzqO2hhx5yZuaGDBly2PEK\nCwsPa/v3v//tkpKS3CeffHLYPm699dZDbUVFRe744493ycnJ7sknnzzUvn37dpeamlrinJSlvJ+j\n0uuBni6Cv6t1C0ZERGKGmfHcc88xa9asw5bu3btX+NomTZrw9ddfs2LFiiofd8aMGdSqVYuRI0eW\naL/rrrsoLi5mxowZh7YzM2699dYS240cObLM/iVmxi9/+cvD2uvWrXvoz3v37mXLli2cfvrpOOfI\nyso6bB833XTToe+TkpI49dRTcc6VuAXVuHFjOnXqxKpVq6rwzv2jWzAiIhJTTjvttDIfwz3qqKMO\nuzUTbOzYsQwePJiOHTvSrVs3Bg0axPXXX89JJ510xGOuXbuW4447jvr165do79Kly6H14D1xlJSU\nRNu2bUts1759+3L3XXpbgG3btvHQQw/xn//8h82bNx9qNzN27Nhx2PalO/U2btyYlJQUmjZtelh7\n6X4ksUpXQEREJCH07duXlStX8sILL3DSSScxYcIEevbsyb/+9S9f66pXr95hbVdddRUTJkzgtttu\n44033uD9999n5syZOOcoLi4+bPvgzrIVtYH/T/pUlgKIiIgkjCZNmjBs2DAmTZrEd999R/fu3Xno\noYcOrS9vnJHWrVuzfv168vPzS7RnZ2cD3hM3B7crLi5m9erVJbZbvnx5pWvcvn07c+bM4d577+WB\nBx7g8ssvZ8CAAWVeKUlkCiAiIpIQSt96SE1NpX379uzdu/dQ28FbLDt37iyx7cUXX8yBAwd49tln\nS7SPGzeOpKQkBg0aBMDAgQNxzh16nPegv/zlL5UelfXglYvSVzrGjRtX5ZFd45n6gIiISMyozu2D\nrl270q9fP3r16kXTpk1ZsGABU6ZMYdSoUYe26dWrF845Ro4cycCBA0lOTuaaa67h0ksv5bzzzuO+\n++5j9erVhx7DnTZtGqNHjz50daJnz55cccUVPPPMM+Tl5XHGGWcwd+7cQ1dAKhMgGjZsyDnnnMMT\nTzzBvn37aNmyJe+99x5r1qyJm9sn4aAAIiKSMLLj/vhH+gUevN7MSnx/xx138NZbb/H++++zd+9e\nWrduzSOPPMKvf/3rQ9v87Gc/Y9SoUfz73/8+NBbINddcg5kxbdo0HnjgAf7zn/8wceJE2rRpw//9\n3/8xevToEjW8/PLLtGjRgszMTKZOncoFF1zAf/7zHzp27EhKSkql3mdmZiYjR45k/PjxOOcYOHAg\nM2bM4Ljjjqv0VZDytoubqyiRfMbXrwWNAyIJRuOAiHPlj9+wdu1al5KSenDsBl+XlJRUt3btWp/O\nkH8WLVrkzMxNnjzZ71KOKFbGAfH9CoiZ3Qv8FOgM7AE+A37jnPs2aJu6wNPANUBdYCZwm3Nu8+F7\nFBGpWdLT08nJyY772XDjRWFh4WFXOp555hmSk5M555xzfKoq/vgeQIC+wF+AL/DqeRR4z8y6OOf2\nBLZ5BrgIuALYCfwV+G/gtSIiNV56enrC/+KPFU888QQLFy7kvPPOo1atWkyfPp2ZM2fyy1/+kpYt\nW/pdXtzwPYA45y4O/t7MbgA2A72AT8ysEXAj8HPn3NzANsOBbDPr7ZybH+WSRUSkBuvTpw+zZs3i\nj3/8I7t37yY9PZ0xY8bwu9/9zu/S4orvAaQMTfDuPR18nqoXXp2zD27gnMsxs1zgTEABREREoub8\n88/n/PPP97uMuBdT44CY13X3GeAT59w3geZjgX3OuZ2lNt8UWCciIiJxJtaugIwHugJxMI+wSOzL\nzc0tt2NiTegsKCKxK2YCiJk9C1wM9HXOrQ9atRGoY2aNSl0FaR5YV67Ro0fTuHHjEm0ZGRlkZGSE\nqWqR2JWbm0unTl0oLCwoc31KSio5OdkKISI1WGZmJpmZmSXaypoMLxJiIoAEwsflwLnOudxSqxcC\nB4ABwBuB7TsB6cC8ivY7bty4MmdUFKkJ8vLyAuHjFaBLqbXZFBYOIS8vTwFEpAYr60N5VlYWvXr1\nivixfQ8gZjYeyAAuA/LNrHlg1Q7nXKFzbqeZTQCeNrNtwC7gz8CnegJGpDK64I3NJ4ni4ARpIqGI\nlZ8f3wMIcAveUy8flmofDrwU+PNooAiYgjcQ2bvA7VGqT0QkJqSlpZGamsqQIUP8LkXiXGpqKmlp\nab7W4HsAcc4d8Ukc59xeYGRgERGpkdLT08nOjo0RTyW+xUIndN8DiIiIVJ5GPJVEEVPjgIiIiEjN\noAAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGn\nACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacA\nIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAi\nIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIi\nIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIi\nIlFXy+8CRCQx5ObmkpeXV+a6tLQ00tPTo1yRiMQyBRARqbbc3Fw6depCYWFBmetTUlLJyclWCBGR\nQxRARKTa8vLyAuHjFaBLqbXZFBYOIS8vTwFERA5RABGRMOoC9PS7CBGJA+qEKiIiIlGnACIiIiJR\npwAiIiIiUacAIiIiIlEXEwHEzPqa2Vtmts7Mis3sslLrXwi0By/T/apXREREqicmAghQH1gM3Aa4\ncraZATQHjg0sGdEpTURERMItJh7Ddc69C7wLYGZWzmZ7nXM/RK8qERERiZRYuQJSGf3MbJOZLTOz\n8WbW1O+CREREJDQxcQWkEmYA/wVWAycAjwLTzexM51x5t2xEREQkRsVFAHHOvRr07ddmthRYCfQD\nPvClKBGJOZoQTyR+xEUAKc05t9rM8oD2VBBARo8eTePGjUu0ZWRkkJGh/qsiiUYT4olUXWZmJpmZ\nmSXaduzYEZVjx2UAMbNWQDNgQ0XbjRs3jp49NS+FSE2gCfFEqq6sD+VZWVn06tUr4seOiQBiZvXx\nrmYcfAKmnZmdDGwNLA/i9QHZGNjuceBbYGb0qxWR2KYJ8UTiQUwEEOBUvFspLrA8FWh/EW9skO7A\nUKAJsB4veDzgnNsf/VJFRESkumIigDjn5lLxI8GDolWLiIiIRF48jQMiIiIiCUIBRERERKIupABi\nZu3CXYiIiIjUHKFeAVlhZh+Y2RAzSwlrRSIiIpLwQg0gPYElwNPARjN73sx6h68sERERSWQhBRDn\n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\n", + "image/png": "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\n1llnccIJJ/D444/nuLpo6IhARHLvHyPgswU1u8y9usLgUTucZMuWLZxyyilMnz6dAw88cIfT9urV\ni8WLF297fd5559GgQQMAjj/+eG677bbq11xLKAhEJDYKCwvp168fDz30EHfeeecOp93+Xi353DSk\nIBCR3NvJJ/dsSSQSjB8/noEDB3Lrrbdy/fXXVzrt22+/nbf/+Len7whEJFZ22203Jk2axLhx43jo\noYcqnObpp5/mpZde4pxzzslxddHQEYGIxE6zZs144YUXOProo7edFXTHHXcwduxYNm7cyCGHHMK0\nadO2jYP//o6gRYsWTJkyJZLas0FBICKxsWHDhm3P27Vrx7JlywAYNmwYI0eOrHS+6dOnZ7myaKlp\nSEQk5nREILWGLkATiYaOCEREYk5BICIScwoCEZGYUxCIiMScviwWkUhUdnJAVWVyUkGjRo3+6xTS\nRx55hNmzZ3P33Xdz7733sttuu3HhhRdWOO/06dMpKiqiX79+NVZzbZG1IDCzdsBfgVaAA/e7+51m\n1gx4CugILAe+6+5fZ6sOEZFMXHrppTscP336dBo1alQjQVBWVkZBQe35HJ7NpqEy4Bp37wL0BS43\nsy7ACGCqu3cCpoavRUQiNXLkSG6//XYA7rrrLrp06UK3bt04++yzWb58Offeey933HEHPXr04LXX\nXmP58uUce+yxdOvWjYEDB/LRRx8B8OGHH9K3b1+6du3KjTfeuO1mONOnT+eoo45i2LBhdOnSBYBT\nTjmFQw89lIMPPpj7779/Wy2NGjXiuuuu4+CDD+a4445j1qxZ9O/fn3333ZcJEybU+LZnLZLc/VPg\n0/D5ejNbBLQBTgb6h5M9CkwHfpGtOkREttq0aRM9evTY9vqrr75i2LBh35pu1KhRLFu2jHr16rFm\nzRqaNm3KpZdeSqNGjbbdvGbo0KEMHz6c4cOHM2bMGK688kqeffZZrrrqKq666irOOecc7r333v9a\n7ty5c3n33XfZZ599ABgzZgzNmjVj06ZN9OnTh9NPP53mzZuzceNGjj32WG677TZOPfVUbrzxRl5+\n+WUWLlzI8OHDK6y5OnLyZbGZdQR6Am8CrcKQAPiMoOlIRCTrGjRowDvvvLPtcfPNN1c4Xbdu3Tjv\nvPMYO3ZspU04M2fO5NxzzwXgggsuYMaMGduGn3nmmQDbxm912GGHbQsBCI48unfvTt++fVm5ciVL\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2143,9 +2150,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/examples/jupyter/pincell.ipynb b/examples/jupyter/pincell.ipynb index fcb0b412d..163429688 100644 --- a/examples/jupyter/pincell.ipynb +++ b/examples/jupyter/pincell.ipynb @@ -240,7 +240,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So far you've seen the \"hard\" way to create a material. The \"easy\" way is to just pass strings to `add_nuclide()` and `add_element()` -- they are implicitly coverted to `Nuclide` and `Element` objects. For example, we could have created our UO2 material as follows:" + "So far you've seen the \"hard\" way to create a material. The \"easy\" way is to just pass strings to `add_nuclide()` and `add_element()` -- they are implicitly converted to `Nuclide` and `Element` objects. For example, we could have created our UO2 material as follows:" ] }, { @@ -509,12 +509,12 @@ "At this point, we have three materials defined, exported to XML, and ready to be used in our model. To finish our model, we need to define the geometric arrangement of materials. OpenMC represents physical volumes using constructive solid geometry (CSG), also known as combinatorial geometry. The object that allows us to assign a material to a region of space is called a `Cell` (same concept in MCNP, for those familiar). In order to define a region that we can assign to a cell, we must first define surfaces which bound the region. A *surface* is a locus of zeros of a function of Cartesian coordinates $x$, $y$, and $z$, e.g.\n", "\n", "- A plane perpendicular to the x axis: $x - x_0 = 0$\n", - "- A cylinder perpendicular to the z axis: $(x - x_0)^2 + (y - y_0)^2 - R^2 = 0$\n", + "- A cylinder parallel to the z axis: $(x - x_0)^2 + (y - y_0)^2 - R^2 = 0$\n", "- A sphere: $(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 - R^2 = 0$\n", "\n", - "Between those three classes of surfaces (planes, cylinders, spheres), one can construct a wide variety of models. It is also possible to define cones and general second-order surfaces (torii are not currently supported).\n", + "Between those three classes of surfaces (planes, cylinders, spheres), one can construct a wide variety of models. It is also possible to define cones and general second-order surfaces (tori are not currently supported).\n", "\n", - "Note that defining a surface is not sufficient to specify a volume -- in order to define an actual volume, one must reference the half-space of a surface. A surface *half-space* is the region whose points satisfy a positive of negative inequality of the surface equation. For example, for a sphere of radius one centered at the origin, the surface equation is $f(x,y,z) = x^2 + y^2 + z^2 - 1 = 0$. Thus, we say that the negative half-space of the sphere, is defined as the collection of points satisfying $f(x,y,z) < 0$, which one can reason is the inside of the sphere. Conversely, the positive half-space of the sphere would correspond to all points outside of the sphere.\n", + "Note that defining a surface is not sufficient to specify a volume -- in order to define an actual volume, one must reference the half-space of a surface. A surface *half-space* is the region whose points satisfy a positive or negative inequality of the surface equation. For example, for a sphere of radius one centered at the origin, the surface equation is $f(x,y,z) = x^2 + y^2 + z^2 - 1 = 0$. Thus, we say that the negative half-space of the sphere, is defined as the collection of points satisfying $f(x,y,z) < 0$, which one can reason is the inside of the sphere. Conversely, the positive half-space of the sphere would correspond to all points outside of the sphere.\n", "\n", "Let's go ahead and create a sphere and confirm that what we've told you is true." ] @@ -792,7 +792,7 @@ "\n", "We now have enough knowledge to create our pin-cell. We need three surfaces to define the fuel and clad:\n", "\n", - "1. The outer surface of the fuel -- a cylinder perpendicular to the z axis\n", + "1. The outer surface of the fuel -- a cylinder parallel to the z axis\n", "2. The inner surface of the clad -- same as above\n", "3. The outer surface of the clad -- same as above\n", "\n", diff --git a/examples/jupyter/post-processing.ipynb b/examples/jupyter/post-processing.ipynb index 831a9750a..72fb73758 100644 --- a/examples/jupyter/post-processing.ipynb +++ b/examples/jupyter/post-processing.ipynb @@ -131,7 +131,6 @@ "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", "\n", "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", @@ -292,7 +291,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [1.26, 1.26]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -686,8 +685,7 @@ "Tally\n", "\tID =\t10000\n", "\tName =\tflux\n", - "\tFilters =\t\n", - " \t\tMeshFilter\t[10000]\n", + "\tFilters =\tMeshFilter\t[10000]\n", "\tNuclides =\ttotal \n", "\tScores =\t['flux', 'fission']\n", "\tEstimator =\ttracklength\n", @@ -704,7 +702,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint file actually stores the sum and sum-of-squares for each tally bin from which the mean and variance can be calculated as described [here](http://mit-crpg.github.io/openmc/methods/tallies.html#variance). The sum and sum-of-squares can be accessed using the ``sum`` and ``sum_sq`` properties:" + "The statepoint file actually stores the sum and sum-of-squares for each tally bin from which the mean and variance can be calculated as described [here](http://openmc.readthedocs.io/en/latest/methods/tallies.html#variance). The sum and sum-of-squares can be accessed using the ``sum`` and ``sum_sq`` properties:" ] }, { @@ -821,8 +819,7 @@ "Tally\n", "\tID =\t10001\n", "\tName =\tflux\n", - "\tFilters =\t\n", - " \t\tMeshFilter\t[10000]\n", + "\tFilters =\tMeshFilter\t[10000]\n", "\tNuclides =\ttotal \n", "\tScores =\t['flux']\n", "\tEstimator =\ttracklength\n", @@ -1043,7 +1040,7 @@ } ], "source": [ - "# Create log-spaced energy bins from 1 keV to 100 MeV\n", + "# Create log-spaced energy bins from 1 keV to 10 MeV\n", "energy_bins = np.logspace(3,7)\n", "\n", "# Calculate pdf for source energies\n", diff --git a/examples/jupyter/search.ipynb b/examples/jupyter/search.ipynb index 69359470c..b84411e20 100644 --- a/examples/jupyter/search.ipynb +++ b/examples/jupyter/search.ipynb @@ -37,7 +37,7 @@ "\n", "To perform the search we will use the `openmc.search_for_keff` function. This function requires a different function be defined which creates an parametrized model to analyze. This model is required to be stored in an `openmc.model.Model` object. The first parameter of this function will be modified during the search process for our critical eigenvalue.\n", "\n", - "Our model will be a pin-cell from the [Multi-Group Mode Part II](./mg-mode-part-ii.rst) assembly, except this time the entire model building process will be contained within a function, and the Boron concentration will be parametrized." + "Our model will be a pin-cell from the [Multi-Group Mode Part II](http://openmc.readthedocs.io/en/latest/examples/mg-mode-part-ii.html) assembly, except this time the entire model building process will be contained within a function, and the Boron concentration will be parametrized." ] }, { diff --git a/examples/jupyter/tally-arithmetic.ipynb b/examples/jupyter/tally-arithmetic.ipynb index fd8d6f551..1b189769d 100644 --- a/examples/jupyter/tally-arithmetic.ipynb +++ b/examples/jupyter/tally-arithmetic.ipynb @@ -115,7 +115,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six planes." ] }, { @@ -293,7 +293,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [1.26, 1.26]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -412,7 +412,7 @@ "tally.nuclides = [o16, h1]\n", "tallies_file.append(tally)\n", "\n", - "# Instantiate a tally mesh \n", + "# Instantiate a tally mesh\n", "mesh = openmc.Mesh(mesh_id=1)\n", "mesh.type = 'regular'\n", "mesh.dimension = [1, 1, 1]\n", diff --git a/examples/xml/basic/tallies.xml b/examples/xml/basic/tallies.xml index 26e61995d..a125e9ca2 100644 --- a/examples/xml/basic/tallies.xml +++ b/examples/xml/basic/tallies.xml @@ -1,21 +1,30 @@ + + 100 + + + + 0 20.0e6 + + + + 0 20.0e6 + + - + 1 total scatter nu-scatter absorption fission nu-fission - - + 1 2 total scatter nu-scatter absorption fission nu-fission - - - + 1 2 3 scatter nu-scatter nu-fission diff --git a/examples/xml/lattice/nested/tallies.xml b/examples/xml/lattice/nested/tallies.xml index 89c0774f1..d342174a9 100644 --- a/examples/xml/lattice/nested/tallies.xml +++ b/examples/xml/lattice/nested/tallies.xml @@ -8,8 +8,12 @@ 1.0 1.0 + + 1 + + - + 1 total diff --git a/examples/xml/lattice/simple/tallies.xml b/examples/xml/lattice/simple/tallies.xml index 89c0774f1..d342174a9 100644 --- a/examples/xml/lattice/simple/tallies.xml +++ b/examples/xml/lattice/simple/tallies.xml @@ -8,8 +8,12 @@ 1.0 1.0 + + 1 + + - + 1 total diff --git a/examples/xml/pincell/tallies.xml b/examples/xml/pincell/tallies.xml index f740530cf..642bdd7cd 100644 --- a/examples/xml/pincell/tallies.xml +++ b/examples/xml/pincell/tallies.xml @@ -7,9 +7,16 @@ 0.62992 0.62992 1.e50 + + 1 + + + + 0. 4. 20.0e6 + + - - + 1 2 flux fission nu-fission diff --git a/examples/xml/pincell_multigroup/tallies.xml b/examples/xml/pincell_multigroup/tallies.xml index 1591a556b..d84e129f2 100644 --- a/examples/xml/pincell_multigroup/tallies.xml +++ b/examples/xml/pincell_multigroup/tallies.xml @@ -5,9 +5,14 @@ -0.63 -0.63 -1e+50 0.63 0.63 1e+50 + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 1 + - - + 1 2 flux fission nu-fission diff --git a/openmc/__init__.py b/openmc/__init__.py index 98bf19f98..d692ebbae 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -1,7 +1,6 @@ from openmc.arithmetic import * from openmc.cell import * from openmc.mesh import * -from openmc.lattice import * from openmc.element import * from openmc.geometry import * from openmc.nuclide import * @@ -14,6 +13,7 @@ from openmc.source import * from openmc.settings import * from openmc.surface import * from openmc.universe import * +from openmc.lattice import * from openmc.filter import * from openmc.trigger import * from openmc.tally_derivative import * diff --git a/openmc/arithmetic.py b/openmc/arithmetic.py index 9593042d9..57afacac3 100644 --- a/openmc/arithmetic.py +++ b/openmc/arithmetic.py @@ -4,6 +4,7 @@ from collections import Iterable from six import string_types import numpy as np +import pandas as pd import openmc from openmc.filter import _FILTER_TYPES @@ -786,9 +787,6 @@ class AggregateFilter(object): CrossFilter.get_pandas_dataframe() """ - - import pandas as pd - # Create NumPy array of the bin tuples for repeating / tiling filter_bins = np.empty(self.num_bins, dtype=tuple) for i, bin in enumerate(self.bins): diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py new file mode 100644 index 000000000..355304a31 --- /dev/null +++ b/openmc/capi/__init__.py @@ -0,0 +1,38 @@ +""" +This module provides bindings to C functions defined by OpenMC shared library. +When the :mod:`openmc` package is imported, the OpenMC shared library is +automatically loaded. Calls to the OpenMC library can then be via functions or +objects in the :mod:`openmc.capi` subpackage, for example: + +.. code-block:: python + + openmc.capi.init() + openmc.capi.run() + openmc.capi.finalize() + +""" + +from ctypes import CDLL +import sys +from warnings import warn + +import pkg_resources + + +# Determine shared-library suffix +if sys.platform == 'darwin': + _suffix = 'dylib' +else: + _suffix = 'so' + +# Open shared library +_filename = pkg_resources.resource_filename( + __name__, '_libopenmc.{}'.format(_suffix)) +_dll = CDLL(_filename) + +from .error import * +from .core import * +from .nuclide import * +from .material import * +from .cell import * +from .tally import * diff --git a/openmc/capi/cell.py b/openmc/capi/cell.py new file mode 100644 index 000000000..f519d2f6d --- /dev/null +++ b/openmc/capi/cell.py @@ -0,0 +1,87 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np + +from . import _dll +from .error import _error_handler + +__all__ = ['CellView', 'cells'] + +# Cell functions +_dll.openmc_cell_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_cell_get_id.restype = c_int +_dll.openmc_cell_get_id.errcheck = _error_handler +_dll.openmc_cell_set_temperature.argtypes = [ + c_int32, c_double, POINTER(c_int32)] +_dll.openmc_cell_set_temperature.restype = c_int +_dll.openmc_cell_set_temperature.errcheck = _error_handler +_dll.openmc_get_cell.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_cell.restype = c_int +_dll.openmc_get_cell.errcheck = _error_handler + + +class CellView(object): + """View of a cell. + + This class exposes a cell that is stored internally in the OpenMC solver. To + obtain a view of a cell with a given ID, use the + :data:`openmc.capi.nuclides` mapping. + + Parameters + ---------- + index : int + Index in the `cells` array. + + Attributes + ---------- + id : int + ID of the cell + + """ + __instances = WeakValueDictionary() + + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + cell_id = c_int32() + _dll.openmc_cell_get_id(self._index, cell_id) + return cell_id.value + + def set_temperature(self, T, instance=None): + """Set the temperature of a cell + + Parameters + ---------- + T : float + Temperature in K + instance : int or None + Which instance of the cell + + """ + _dll.openmc_cell_set_temperature(self._index, T, instance) + + +class _CellMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_cell(key, index) + return CellView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield CellView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_cells').value + +cells = _CellMapping() diff --git a/openmc/capi/core.py b/openmc/capi/core.py new file mode 100644 index 000000000..fe5416dd6 --- /dev/null +++ b/openmc/capi/core.py @@ -0,0 +1,157 @@ +from contextlib import contextmanager +from ctypes import CDLL, c_int, c_int32, c_double, POINTER +from warnings import warn + +from . import _dll +from .error import _error_handler + + +_dll.openmc_calculate_volumes.restype = None +_dll.openmc_finalize.restype = None +_dll.openmc_find.argtypes = [POINTER(c_double*3), c_int, POINTER(c_int32), + POINTER(c_int32)] +_dll.openmc_find.restype = c_int +_dll.openmc_find.errcheck = _error_handler +_dll.openmc_hard_reset.restype = None +_dll.openmc_init.argtypes = [POINTER(c_int)] +_dll.openmc_init.restype = None +_dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] +_dll.openmc_get_keff.restype = c_int +_dll.openmc_get_keff.errcheck = _error_handler +_dll.openmc_plot_geometry.restype = None +_dll.openmc_run.restype = None +_dll.openmc_reset.restype = None + + +def calculate_volumes(): + """Run stochastic volume calculation""" + _dll.openmc_calculate_volumes() + + +def finalize(): + """Finalize simulation and free memory""" + _dll.openmc_finalize() + + +def find_cell(xyz): + """Find the cell at a given point + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + + Returns + ------- + int + ID of the cell. + int + If the cell at the given point is repeated in the geometry, this + indicates which instance it is, i.e., 0 would be the first instance. + + """ + uid = c_int32() + instance = c_int32() + _dll.openmc_find((c_double*3)(*xyz), 1, uid, instance) + return uid.value, instance.value + + +def find_material(xyz): + """Find the material at a given point + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + + Returns + ------- + int or None + ID of the material or None is no material is found + + """ + uid = c_int32() + instance = c_int32() + _dll.openmc_find((c_double*3)(*xyz), 2, uid, instance) + return uid.value if uid != 0 else None + + +def hard_reset(): + """Reset tallies, timers, and pseudo-random number generator state.""" + _dll.openmc_hard_reset() + + +def init(intracomm=None): + """Initialize OpenMC + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + if intracomm is not None: + # If an mpi4py communicator was passed, convert it to an integer to + # be passed to openmc_init + try: + intracomm = intracomm.py2f() + except AttributeError: + pass + _dll.openmc_init(c_int(intracomm)) + else: + _dll.openmc_init(None) + + +def keff(): + """Return the calculated k-eigenvalue and its standard deviation. + + Returns + ------- + tuple + Mean k-eigenvalue and standard deviation of the mean + + """ + k = (c_double*2)() + _dll.openmc_get_keff(k) + return tuple(k) + + +def plot_geometry(): + """Plot geometry""" + _dll.openmc_plot_geometry() + + +def reset(): + """Reset tallies and timers.""" + _dll.openmc_reset() + + +def run(): + """Run simulation""" + _dll.openmc_run() + + +@contextmanager +def run_in_memory(intracomm=None): + """Provides context manager for calling OpenMC shared library functions. + + This function is intended to be used in a 'with' statement and ensures that + OpenMC is properly initialized/finalized. At the completion of the 'with' + block, all memory that was allocated during the block is freed. For + example:: + + with openmc.capi.run_in_memory(): + for i in range(n_iters): + openmc.capi.reset() + do_stuff() + openmc.capi.run() + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + init(intracomm) + yield + finalize() diff --git a/openmc/capi/error.py b/openmc/capi/error.py new file mode 100644 index 000000000..2058ceb20 --- /dev/null +++ b/openmc/capi/error.py @@ -0,0 +1,66 @@ +from ctypes import c_int + +from . import _dll + + +class GeometryError(Exception): + pass + + +def _error_handler(err, func, args): + """Raise exception according to error code.""" + + # Get error code corresponding to global constant. + def errcode(s): + return c_int.in_dll(_dll, s).value + + if err == errcode('e_out_of_bounds'): + raise IndexError('Array index out of bounds.') + + elif err == errcode('e_cell_not_allocated'): + raise MemoryError("Memory has not been allocated for cells.") + + elif err == errcode('e_cell_invalid_id'): + raise KeyError("No cell exists with ID={}.".format(args[0])) + + elif err == errcode('e_cell_not_found'): + raise GeometryError("Could not find cell at position ({}, {}, {})" + .format(*args[0])) + + elif err == errcode('e_nuclide_not_allocated'): + raise MemoryError("Memory has not been allocated for nuclides.") + + elif err == errcode('e_nuclide_not_loaded'): + raise KeyError("No nuclide named '{}' has been loaded.") + + elif err == errcode('e_nuclide_not_in_library'): + raise KeyError("Specified nuclide doesn't exist in the cross " + "section library.") + + elif err == errcode('e_material_not_allocated'): + raise MemoryError("Memory has not been allocated for materials.") + + elif err == errcode('e_material_invalid_id'): + raise KeyError("No material exists with ID={}.".format(args[0])) + + elif err == errcode('e_tally_not_allocated'): + raise MemoryError("Memory has not been allocated for tallies.") + + elif err == errcode('e_tally_invalid_id'): + raise KeyError("No tally exists with ID={}.".format(args[0])) + + elif err == errcode('e_invalid_size'): + raise MemoryError("Array size mismatch with memory allocated.") + + elif err == errcode('e_cell_no_material'): + raise GeometryError("Operation on cell requires that it be filled" + " with a material.") + + elif err == errcode('w_below_min_bound'): + warn("Data has not been loaded beyond lower bound of {}.".format(args[0])) + + elif err == errcode('w_above_max_bound'): + warn("Data has not been loaded beyond upper bound of {}.".format(args[0])) + + elif err < 0: + raise Exception("Unknown error encountered (code {}).".format(err)) diff --git a/openmc/capi/material.py b/openmc/capi/material.py new file mode 100644 index 000000000..d07d7aa8a --- /dev/null +++ b/openmc/capi/material.py @@ -0,0 +1,170 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np +from numpy.ctypeslib import as_array + +from . import _dll, NuclideView +from .error import _error_handler + + +__all__ = ['MaterialView', 'materials'] + +# Material functions +_dll.openmc_get_material.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_material.restype = c_int +_dll.openmc_get_material.errcheck = _error_handler +_dll.openmc_material_add_nuclide.argtypes = [ + c_int32, c_char_p, c_double] +_dll.openmc_material_add_nuclide.restype = c_int +_dll.openmc_material_add_nuclide.errcheck = _error_handler +_dll.openmc_material_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_material_get_id.restype = c_int +_dll.openmc_material_get_id.errcheck = _error_handler +_dll.openmc_material_get_densities.argtypes = [ + c_int32, POINTER(POINTER(c_int)), POINTER(POINTER(c_double)), + POINTER(c_int)] +_dll.openmc_material_get_densities.restype = c_int +_dll.openmc_material_get_densities.errcheck = _error_handler +_dll.openmc_material_set_density.argtypes = [c_int32, c_double] +_dll.openmc_material_set_density.restype = c_int +_dll.openmc_material_set_density.errcheck = _error_handler +_dll.openmc_material_set_densities.argtypes = [ + c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] +_dll.openmc_material_set_densities.restype = c_int +_dll.openmc_material_set_densities.errcheck = _error_handler + + +class MaterialView(object): + """View of a material. + + This class exposes a material that is stored internally in the OpenMC + solver. To obtain a view of a material with a given ID, use the + :data:`openmc.capi.materials` mapping. + + Parameters + ---------- + index : int + Index in the `materials` array. + + Attributes + ---------- + id : int + ID of the material + nuclides : list of str + List of nuclides in the material + densities : numpy.ndarray + Array of densities in atom/b-cm + + """ + __instances = WeakValueDictionary() + + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + mat_id = c_int32() + _dll.openmc_material_get_id(self._index, mat_id) + return mat_id.value + + @property + def nuclides(self): + return self._get_densities()[0] + return nuclides + + @property + def densities(self): + return self._get_densities()[1] + + def _get_densities(self): + """Get atom densities in a material. + + Returns + ------- + list of string + List of nuclide names + numpy.ndarray + Array of densities in atom/b-cm + + """ + # Allocate memory for arguments that are written to + nuclides = POINTER(c_int)() + densities = POINTER(c_double)() + n = c_int() + + # Get nuclide names and densities + _dll.openmc_material_get_densities(self._index, nuclides, densities, n) + + # Convert to appropriate types and return + nuclide_list = [NuclideView(nuclides[i]).name for i in range(n.value)] + density_array = as_array(densities, (n.value,)) + return nuclide_list, density_array + + def add_nuclide(name, density): + """Add a nuclide to a material. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_add_nuclide(self._index, name.encode(), density) + + def set_density(self, density): + """Set density of a material. + + Parameters + ---------- + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_set_density(self._index, density) + + def set_densities(self, nuclides, densities): + """Set the densities of a list of nuclides in a material + + Parameters + ---------- + nuclides : iterable of str + Nuclide names + densities : iterable of float + Corresponding densities in atom/b-cm + + """ + # Convert strings to an array of char* + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + + # Get numpy array as a double* + d = np.asarray(densities) + dp = d.ctypes.data_as(POINTER(c_double)) + + _dll.openmc_material_set_densities(self._index, len(nuclides), nucs, dp) + + +class _MaterialMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_material(key, index) + return MaterialView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield MaterialView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_materials').value + +materials = _MaterialMapping() diff --git a/openmc/capi/nuclide.py b/openmc/capi/nuclide.py new file mode 100644 index 000000000..4c6248d6b --- /dev/null +++ b/openmc/capi/nuclide.py @@ -0,0 +1,93 @@ +from collections import Mapping +from ctypes import c_int, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np +from numpy.ctypeslib import as_array + +from . import _dll +from .error import _error_handler + + +__all__ = ['NuclideView', 'nuclides', 'load_nuclide'] + +# Nuclide functions +_dll.openmc_get_nuclide.argtypes = [c_char_p, POINTER(c_int)] +_dll.openmc_get_nuclide.restype = c_int +_dll.openmc_get_nuclide.errcheck = _error_handler +_dll.openmc_load_nuclide.argtypes = [c_char_p] +_dll.openmc_load_nuclide.restype = c_int +_dll.openmc_load_nuclide.errcheck = _error_handler +_dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] +_dll.openmc_nuclide_name.restype = c_int +_dll.openmc_nuclide_name.errcheck = _error_handler + + +def load_nuclide(name): + """Load cross section data for a nuclide. + + Parameters + ---------- + name : str + Name of the nuclide, e.g. 'U235' + + """ + _dll.openmc_load_nuclide(name.encode()) + + +class NuclideView(object): + """View of a nuclide. + + This class exposes a nuclide that is stored internally in the OpenMC + solver. To obtain a view of a nuclide with a given name, use the + :data:`openmc.capi.nuclides` mapping. + + Parameters + ---------- + index : int + Index in the `nuclides` array. + + Attributes + ---------- + name : str + Name of the nuclide, e.g. 'U235' + + """ + __instances = WeakValueDictionary() + + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def name(self): + name = c_char_p() + _dll.openmc_nuclide_name(self._index, name) + + # Find blank in name + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() + + +class _NuclideMapping(Mapping): + """Provide mapping from nuclide name to index in nuclides array.""" + def __getitem__(self, key): + index = c_int() + _dll.openmc_get_nuclide(key.encode(), index) + return NuclideView(index) + + def __iter__(self): + for i in range(len(self)): + yield NuclideView(i + 1).name + + def __len__(self): + return c_int.in_dll(_dll, 'n_nuclides').value + +nuclides = _NuclideMapping() diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py new file mode 100644 index 000000000..611f1ce87 --- /dev/null +++ b/openmc/capi/tally.py @@ -0,0 +1,107 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +from numpy.ctypeslib import as_array + +from . import _dll, NuclideView +from .error import _error_handler + + +__all__ = ['TallyView', 'tallies'] + +# Tally functions +_dll.openmc_get_tally.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_tally.restype = c_int +_dll.openmc_get_tally.errcheck = _error_handler +_dll.openmc_tally_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_tally_get_id.restype = c_int +_dll.openmc_tally_get_id.errcheck = _error_handler +_dll.openmc_tally_get_nuclides.argtypes = [ + c_int32, POINTER(POINTER(c_int)), POINTER(c_int)] +_dll.openmc_tally_get_nuclides.restype = c_int +_dll.openmc_tally_get_nuclides.errcheck = _error_handler +_dll.openmc_tally_results.argtypes = [ + c_int32, POINTER(POINTER(c_double)), POINTER(c_int*3)] +_dll.openmc_tally_results.restype = c_int +_dll.openmc_tally_results.errcheck = _error_handler +_dll.openmc_tally_set_nuclides.argtypes = [c_int32, c_int, POINTER(c_char_p)] +_dll.openmc_tally_set_nuclides.restype = c_int +_dll.openmc_tally_set_nuclides.errcheck = _error_handler + + +class TallyView(object): + """View of a tally. + + This class exposes a tally that is stored internally in the OpenMC + solver. To obtain a view of a tally with a given ID, use the + :data:`openmc.capi.tallies` mapping. + + Parameters + ---------- + index : int + Index in the `tallys` array. + + Attributes + ---------- + id : int + ID of the tally + nuclides : list of str + List of nuclides to score results for + results : numpy.ndarray + Array of tally results + + """ + __instances = WeakValueDictionary() + + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + tally_id = c_int32() + _dll.openmc_tally_get_id(self._index, tally_id) + return tally_id.value + + @property + def nuclides(self): + nucs = POINTER(c_int)() + n = c_int() + _dll.openmc_tally_get_nuclides(self._index, nucs, n) + return [NuclideView(nucs[i]).name if nucs[i] > 0 else 'total' + for i in range(n.value)] + + @property + def results(self): + data = POINTER(c_double)() + shape = (c_int*3)() + _dll.openmc_tally_results(self._index, data, shape) + return as_array(data, tuple(shape[::-1])) + + @nuclides.setter + def nuclides(self, nuclides): + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + _dll.openmc_tally_set_nuclides(self._index, len(nuclides), nucs) + + +class _TallyMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_tally(key, index) + return TallyView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield TallyView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_tallies').value + +tallies = _TallyMapping() diff --git a/openmc/cell.py b/openmc/cell.py index 4496062f7..d962c2725 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -13,19 +13,10 @@ import openmc import openmc.checkvalue as cv from openmc.surface import Halfspace from openmc.region import Region, Intersection, Complement +from .mixin import IDManagerMixin -# A static variable for auto-generated Cell IDs -AUTO_CELL_ID = 10000 - - -def reset_auto_cell_id(): - """Reset counter for auto-generated cell IDs.""" - global AUTO_CELL_ID - AUTO_CELL_ID = 10000 - - -class Cell(object): +class Cell(IDManagerMixin): r"""A region of space defined as the intersection of half-space created by quadric surfaces. @@ -93,6 +84,9 @@ class Cell(object): """ + next_id = 1 + used_ids = set() + def __init__(self, cell_id=None, name='', fill=None, region=None): # Initialize Cell class attributes self.id = cell_id @@ -103,7 +97,8 @@ class Cell(object): self._rotation_matrix = None self._temperature = None self._translation = None - self._paths = [] + self._paths = None + self._num_instances = None self._volume = None self._atoms = None @@ -163,10 +158,6 @@ class Cell(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -214,7 +205,7 @@ class Cell(object): @property def paths(self): - if not self._paths: + if self._paths is None: raise ValueError('Cell instance paths have not been determined. ' 'Call the Geometry.determine_paths() method.') return self._paths @@ -229,18 +220,11 @@ class Cell(object): @property def num_instances(self): - return len(self.paths) - - @id.setter - def id(self, cell_id): - if cell_id is None: - global AUTO_CELL_ID - self._id = AUTO_CELL_ID - AUTO_CELL_ID += 1 - else: - cv.check_type('cell ID', cell_id, Integral) - cv.check_greater_than('cell ID', cell_id, 0, equality=True) - self._id = cell_id + if self._num_instances is None: + raise ValueError( + 'Number of cell instances have not been determined. Call the ' + 'Geometry.determine_paths() method.') + return self._num_instances @name.setter def name(self, name): @@ -373,7 +357,7 @@ class Cell(object): self.region = region else: if isinstance(self.region, Intersection): - self.region.nodes.append(region) + self.region &= region else: self.region = Intersection(self.region, region) @@ -527,8 +511,17 @@ class Cell(object): # If no nemoize'd clone exists, instantiate one if self not in memo: + # Temporarily remove paths + paths = self._paths + self._paths = None + clone = deepcopy(self) clone.id = None + clone._num_instances = None + + # Restore paths on original instance + self._paths = paths + if self.region is not None: clone.region = self.region.clone(memo) if self.fill is not None: @@ -542,7 +535,7 @@ class Cell(object): memo[self] = clone return memo[self] - + def create_xml_subelement(self, xml_element): element = ET.Element("cell") element.set("id", str(self.id)) @@ -586,7 +579,7 @@ class Cell(object): elif isinstance(node, Complement): create_surface_elements(node.node, element) else: - for subnode in node.nodes: + for subnode in node: create_surface_elements(subnode, element) # Call the recursive function from the top node diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index 6aaf64c66..2497d0d9f 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -45,8 +45,8 @@ def sort_xml_elements(tree): key = element.get('id') # If this element has an "ID" tag, append it to the list to sort - if not key is None: - tagged_data.append((key, element)) + if key is not None: + tagged_data.append((int(key), element)) # Sort the elements according to the IDs for this tag tagged_data.sort() @@ -65,7 +65,7 @@ def sort_xml_elements(tree): tree.extend(sorted_elements) -def clean_xml_indentation(element, level=0, spaces_per_level=4): +def clean_xml_indentation(element, level=0, spaces_per_level=2): """ copy and paste from http://effbot.org/zone/elementent-lib.htm#prettyprint it basically walks your tree and adds spaces and newlines so the tree is diff --git a/openmc/data/endf.py b/openmc/data/endf.py index 292d73ae3..0fa75ded8 100644 --- a/openmc/data/endf.py +++ b/openmc/data/endf.py @@ -353,8 +353,9 @@ class Evaluation(object): # Information about target/projectile items = get_head_record(file_obj) - self.target['atomic_number'] = items[0] // 1000 - self.target['mass_number'] = items[0] % 1000 + Z, A = divmod(items[0], 1000) + self.target['atomic_number'] = Z + self.target['mass_number'] = A self.target['mass'] = items[1] self._LRP = items[2] self.target['fissionable'] = (items[3] == 1) @@ -370,10 +371,14 @@ class Evaluation(object): self.target['excitation_energy'] = items[0] self.target['stable'] = (int(items[1]) == 0) self.target['state'] = items[2] - self.target['isomeric_state'] = items[3] + self.target['isomeric_state'] = m = items[3] self.info['format'] = items[5] assert self.info['format'] == 6 + # Set correct excited state for Am242_m1, which is wrong in ENDF/B-VII.1 + if Z == 95 and A == 242 and m == 1: + self.target['state'] = 2 + # Control record 2 items = get_cont_record(file_obj) self.projectile['mass'] = items[0] diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 1d3a0176d..ed2f4f8b7 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -866,12 +866,13 @@ class IncidentNeutron(EqualityMixin): data.fission_energy = FissionEnergyRelease.from_endf(ev, data) # Add 0K elastic scattering cross section - pendf = Evaluation(pendf_file) - file_obj = StringIO(pendf.section[3, 2]) - get_head_record(file_obj) - params, xs = get_tab1_record(file_obj) - data.energy['0K'] = xs.x - data[2].xs['0K'] = xs + if '0K' not in data.energy: + pendf = Evaluation(pendf_file) + file_obj = StringIO(pendf.section[3, 2]) + get_head_record(file_obj) + params, xs = get_tab1_record(file_obj) + data.energy['0K'] = xs.x + data[2].xs['0K'] = xs finally: # Get rid of temporary files diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index e7d3cd284..ac98af7fb 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -50,48 +50,45 @@ _THERMAL_DATA = { 75: ThermalTuple('ouo2', [8016, 8017, 8018], 1), } - -_PENDF_TEMPLATE = """ +_TEMPLATE_RECONR = """ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 22 +{nendf} {npendf} '{library} PENDF for {zsymam}'/ {mat} 2/ -0.001 0.0 0.003/ err tempr errmax +{error}/ err '{library}: {zsymam}'/ 'Processed by NJOY'/ 0/ -stop """ -_ACE_TEMPLATE = """ -reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 21 -'{library} PENDF for {zsymam}'/ -{mat} 2/ -0.001 0.0 0.003/ err tempr errmax -'{library}: {zsymam}'/ -'Processed by NJOY'/ -0/ +_TEMPLATE_BROADR = """ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 21 22 +{nendf} {npendf} {nbroadr} {mat} {num_temp} 0 0 0. / -0.001 1.0e6 0.003 / +{error}/ errthn {temps} 0/ +""" + +_TEMPLATE_HEATR = """ heatr / %%%%%%%%%%%%%%%%%%%%%%%%% Add heating kerma %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 22 23 / +{nendf} {nheatr_in} {nheatr} / {mat} 3 / 302 318 402 / +""" + +_TEMPLATE_PURR = """ purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% -20 23 24 +{nendf} {npurr_in} {npurr} / {mat} {num_temp} 1 20 64 / {temps} 1.e10 0/ """ -_ACE_TEMPLATE_ACER = """acer / -20 24 0 {nace} {ndir} +_TEMPLATE_ACER = """ +acer / %%%%%%%%%%%%%%%%%%%%%%%% Write out in ACE format %%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {nacer_in} 0 {nace} {ndir} 1 0 1 .{ext} / '{library}: {zsymam} at {temperature}'/ {mat} {temperature} @@ -99,35 +96,22 @@ _ACE_TEMPLATE_ACER = """acer / / """ -_ACE_THERMAL_TEMPLATE = """ -reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 22 -'{library} PENDF for {zsymam}'/ -{mat} 2/ -0.001 0. 0.001/ err tempr errmax -'{library}: PENDF for {zsymam}'/ -'Processed by NJOY'/ -0/ -broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 22 23 -{mat} {num_temp} 0 0 0./ -0.001 2.0e+6 0.001/ errthn thnmax errmax -{temps} -0/ +_THERMAL_TEMPLATE_THERMR = """ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% -0 23 62 +0 {nthermr1_in} {nthermr1} 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ {temps} -0.001 4.0 +{error} {energy_max} thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (bound) %%%%%%%%%%%%%%%%%% -60 62 27 +{nthermal_endf} {nthermr2_in} {nthermr2} {mat_thermal} {mat} 16 {num_temp} {inelastic} {elastic} {iform} {natom} 222 1/ {temps} -0.001 4.0 +{error} {energy_max} """ -_ACE_THERMAL_TEMPLATE_ACER = """acer / -20 27 0 {nace} {ndir} +_THERMAL_TEMPLATE_ACER = """ +acer / %%%%%%%%%%%%%%%%%%%%%%%% Write out in ACE format %%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {nthermal_acer_in} 0 {nace} {ndir} 2 0 1 .{ext}/ '{library}: {zsymam_thermal} processed by NJOY'/ {mat} {temperature} '{data.name}' / @@ -136,7 +120,8 @@ _ACE_THERMAL_TEMPLATE_ACER = """acer / """ -def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): +def run(commands, tapein, tapeout, input_filename=None, stdout=False, + njoy_exec='njoy'): """Run NJOY with given commands Parameters @@ -147,6 +132,8 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): Dictionary mapping tape numbers to paths for any input files tapeout : dict Dictionary mapping tape numbers to paths for any output files + input_filename : str, optional + File name to write out NJOY input commands stdout : bool, optional Whether to display output when running NJOY njoy_exec : str, optional @@ -159,6 +146,10 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): """ + if input_filename is not None: + with open(input_filename, 'w') as f: + f.write(commands) + # Create temporary directory -- it would be preferable to use # TemporaryDirectory(), but it is only available in Python 3.2 tmpdir = tempfile.mkdtemp() @@ -195,7 +186,7 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): return njoy.returncode -def make_pendf(filename, pendf='pendf', stdout=False): +def make_pendf(filename, pendf='pendf', error=0.001, stdout=False): """Generate ACE file from an ENDF file Parameters @@ -204,6 +195,8 @@ def make_pendf(filename, pendf='pendf', stdout=False): Path to ENDF file pendf : str, optional Path of pointwise ENDF file to write + error : float, optional + Fractional error tolerance for NJOY processing stdout : bool Whether to display NJOY standard output @@ -213,21 +206,14 @@ def make_pendf(filename, pendf='pendf', stdout=False): Return code of NJOY process """ - ev = endf.Evaluation(filename) - mat = ev.material - zsymam = ev.target['zsymam'] - # Determine name of library - library = '{}-{}.{}'.format(*ev.info['library']) - - commands = _PENDF_TEMPLATE.format(**locals()) - tapein = {20: filename} - tapeout = {22: pendf} - return run(commands, tapein, tapeout, stdout) + return make_ace(filename, pendf=pendf, error=error, broadr=False, + heatr=False, purr=False, acer=False, stdout=stdout) -def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', - pendf=None, **kwargs): +def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, + error=0.001, broadr=True, heatr=True, purr=True, acer=True, + **kwargs): """Generate incident neutron ACE file from an ENDF file Parameters @@ -243,6 +229,16 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', Path of xsdir file to write pendf : str, optional Path of pendf file to write. If omitted, the pendf file is not saved. + error : float, optional + Fractional error tolerance for NJOY processing + broadr : bool, optional + Indicating whether to Doppler broaden XS when running NJOY + heatr : bool, optional + Indicating whether to add heating kerma when running NJOY + purr : bool, optional + Indicating whether to add probability table when running NJOY + acer : bool, optional + Indicating whether to generate ACE file when running NJOY **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -264,26 +260,59 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', num_temp = len(temperatures) temps = ' '.join(str(i) for i in temperatures) - commands = _ACE_TEMPLATE.format(**locals()) - tapein = {20: filename} + # Create njoy commands by modules + commands = "" + + nendf, npendf = 20, 21 + tapein = {nendf: filename} tapeout = {} if pendf is not None: - tapeout[21] = pendf - fname = '{}_{:.1f}' - for i, temperature in enumerate(temperatures): - # Extend input with an ACER run for each temperature - nace = 25 + 2*i - ndir = 25 + 2*i + 1 - ext = '{:02}'.format(i + 1) - commands += _ACE_TEMPLATE_ACER.format(**locals()) + tapeout[npendf] = pendf - # Indicate tapes to save for each ACER run - tapeout[nace] = fname.format(ace, temperature) - tapeout[ndir] = fname.format(xsdir, temperature) + # reconr + commands += _TEMPLATE_RECONR + nlast = npendf + + # broadr + if broadr: + nbroadr = nlast + 1 + commands += _TEMPLATE_BROADR + nlast = nbroadr + + # heatr + if heatr: + nheatr_in = nlast + nheatr = nheatr_in + 1 + commands += _TEMPLATE_HEATR + nlast = nheatr + + # purr + if purr: + npurr_in = nlast + npurr = npurr_in + 1 + commands += _TEMPLATE_PURR + nlast = npurr + + commands = commands.format(**locals()) + + # acer + if acer: + nacer_in = nlast + fname = '{}_{:.1f}' + for i, temperature in enumerate(temperatures): + # Extend input with an ACER run for each temperature + nace = nacer_in + 1 + 2*i + ndir = nace + 1 + ext = '{:02}'.format(i + 1) + commands += _TEMPLATE_ACER.format(**locals()) + + # Indicate tapes to save for each ACER run + tapeout[nace] = fname.format(ace, temperature) + tapeout[ndir] = fname.format(xsdir, temperature) commands += 'stop\n' retcode = run(commands, tapein, tapeout, **kwargs) - if retcode == 0: + if acer and retcode == 0: with open(ace, 'w') as ace_file, open(xsdir, 'w') as xsdir_file: for temperature in temperatures: # Get contents of ACE file @@ -311,8 +340,8 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', return retcode -def make_ace_thermal(filename, filename_thermal, temperatures=None, - ace='ace', xsdir='xsdir', **kwargs): +def make_ace_thermal(filename, filename_thermal, temperatures=None, + ace='ace', xsdir='xsdir', error=0.001, **kwargs): """Generate thermal scattering ACE file from ENDF files Parameters @@ -328,6 +357,8 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, Path of ACE file to write xsdir : str, optional Path of xsdir file to write + error : float, optional + Fractional error tolerance for NJOY processing **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -347,7 +378,6 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, data = _THERMAL_DATA[mat_thermal] zaids = ' '.join(str(zaid) for zaid in data.zaids[:3]) - energy_max = ev_thermal.info['energy_max'] # Determine name of library library = '{}-{}.{}'.format(*ev_thermal.info['library']) @@ -359,7 +389,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, # Determine whether elastic is incoherent (0) or coherent (1) file_obj = StringIO(ev_thermal.section[7, 2]) - elastic_type = endf.get_head_record(file_obj)[2] + elastic_type = endf.get_head_record(file_obj)[2] - 1 else: elastic = 0 mt_elastic = 0 @@ -369,6 +399,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, file_obj = StringIO(ev_thermal.section[7, 4]) items = endf.get_head_record(file_obj) items, values = endf.get_list_record(file_obj) + energy_max = values[3] natom = int(values[5]) # Note that the 'iform' parameter is omitted in NJOY 99. We assume that the @@ -390,16 +421,41 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, num_temp = len(temperatures) temps = ' '.join(str(i) for i in temperatures) - commands = _ACE_THERMAL_TEMPLATE.format(**locals()) - tapein = {20: filename, 60: filename_thermal} + # Create njoy commands by modules + commands = "" + + nendf, nthermal_endf, npendf = 20, 21, 22 + tapein = {nendf: filename, nthermal_endf:filename_thermal} tapeout = {} + + # reconr + commands += _TEMPLATE_RECONR + nlast = npendf + + # broadr + nbroadr = nlast + 1 + commands += _TEMPLATE_BROADR + nlast = nbroadr + + # thermr + nthermr1_in = nlast + nthermr1 = nthermr1_in + 1 + nthermr2_in = nthermr1 + nthermr2 = nthermr2_in + 1 + commands += _THERMAL_TEMPLATE_THERMR + nlast = nthermr2 + + commands = commands.format(**locals()) + + # acer + nthermal_acer_in = nlast fname = '{}_{:.1f}' for i, temperature in enumerate(temperatures): # Extend input with an ACER run for each temperature - nace = 28 + 2*i - ndir = 28 + 2*i + 1 + nace = nthermal_acer_in + 1 + 2*i + ndir = nace + 1 ext = '{:02}'.format(i + 1) - commands += _ACE_THERMAL_TEMPLATE_ACER.format(**locals()) + commands += _THERMAL_TEMPLATE_ACER.format(**locals()) # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 627f3956c..ac3a049ab 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -94,7 +94,7 @@ def _get_products(ev, mt): # Get yield for this product params, yield_ = get_tab1_record(file_obj) - za = params[0] + za = int(params[0]) awr = params[1] lip = params[2] law = params[3] @@ -106,9 +106,8 @@ def _get_products(ev, mt): elif za == 1000: p = Product('electron') else: - z = za // 1000 - a = za % 1000 - p = Product('{}{}'.format(ATOMIC_SYMBOL[z], a)) + Z, A = divmod(za, 1000) + p = Product('{}{}'.format(ATOMIC_SYMBOL[Z], A)) p.yield_ = yield_ @@ -467,6 +466,93 @@ def _get_fission_products_endf(ev): return products, derived_products +def _get_activation_products(ev, rx): + """Generate activation products from an ENDF evaluation + + Parameters + ---------- + ev : openmc.data.endf.Evaluation + The ENDF evaluation + rx : openmc.data.Reaction + Reaction which generates activation products + + Returns + ------- + products : list of openmc.data.Product + Activation products + + """ + file_obj = StringIO(ev.section[8, rx.mt]) + + # Determine total number of states and whether decay chain is given in a + # decay sublibrary + items = get_head_record(file_obj) + n_states = items[4] + decay_sublib = (items[5] == 1) + + # Determine if file 9/10 are present + present = {9: False, 10: False} + for i in range(n_states): + if decay_sublib: + items = get_cont_record(file_obj) + else: + items, values = get_list_record(file_obj) + lmf = items[2] + if lmf == 9: + present[9] = True + elif lmf == 10: + present[10] = True + + products = [] + + for mf in (9, 10): + if not present[mf]: + continue + + file_obj = StringIO(ev.section[mf, rx.mt]) + items = get_head_record(file_obj) + n_states = items[4] + for i in range(n_states): + # Determine what the product is + items, xs = get_tab1_record(file_obj) + Z, A = divmod(items[2], 1000) + excited_state = items[3] + + # Get GND name for product + symbol = ATOMIC_SYMBOL[Z] + if excited_state > 0: + name = '{}{}_e{}'.format(symbol, A, excited_state) + else: + name = '{}{}'.format(symbol, A) + + p = Product(name) + if mf == 9: + p.yield_ = xs + else: + # Re-interpolate production cross section and neutron cross + # section to union energy grid + energy = np.union1d(xs.x, rx.xs['0K'].x) + prod_xs = xs(energy) + neutron_xs = rx.xs['0K'](energy) + idx = np.where(neutron_xs > 0) + + # Calculate yield as ratio + yield_ = np.zeros_like(energy) + yield_[idx] = prod_xs[idx] / neutron_xs[idx] + p.yield_ = Tabulated1D(energy, yield_) + + # Check if product already exists from MF=6 and if it does, just + # overwrite the existing yield. + for product in rx.products: + if name == product.particle: + product.yield_ = p.yield_ + break + else: + products.append(p) + + return products + + def _get_photon_products_ace(ace, rx): """Generate photon products from an ACE table @@ -653,7 +739,7 @@ def _get_photon_products_endf(ev, rx): photon = Product('photon') items, xs = get_tab1_record(file_obj) - # Re-interpolation photon production cross section and neutron cross + # Re-interpolate photon production cross section and neutron cross # section to union energy grid energy = np.union1d(xs.x, rx.xs['0K'].x) photon_prod_xs = xs(energy) @@ -1086,6 +1172,9 @@ class Reaction(EqualityMixin): else: rx.products.append(neutron) + if (8, mt) in ev.section: + rx.products += _get_activation_products(ev, rx) + if (12, mt) in ev.section or (13, mt) in ev.section: rx.products += _get_photon_products_endf(ev, rx) diff --git a/openmc/filter.py b/openmc/filter.py index 514e96f26..2b329ef0e 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -8,14 +8,13 @@ from xml.etree import ElementTree as ET from six import add_metaclass import numpy as np +import pandas as pd import openmc import openmc.checkvalue as cv +from .mixin import IDManagerMixin -# "Static" variable for auto-generated Filter IDs -AUTO_FILTER_ID = 10000 - _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', 'distribcell', 'delayedgroup', 'energyfunction', 'cellfrom'] @@ -28,12 +27,6 @@ _CURRENT_NAMES = {1: 'x-min out', 2: 'x-min in', 11: 'z-max out', 12: 'z-max in'} -def reset_auto_filter_id(): - """Reset counter for auto-generated filter IDs.""" - global AUTO_FILTER_ID - AUTO_FILTER_ID = 10000 - - class FilterMeta(ABCMeta): def __new__(cls, name, bases, namespace, **kwargs): # Check the class name. @@ -73,7 +66,7 @@ class FilterMeta(ABCMeta): @add_metaclass(FilterMeta) -class Filter(object): +class Filter(IDManagerMixin): """Tally modifier that describes phase-space and other characteristics. Parameters @@ -99,6 +92,9 @@ class Filter(object): """ + next_id = 1 + used_ids = set() + def __init__(self, bins, filter_id=None): self.bins = bins self.id = filter_id @@ -194,10 +190,6 @@ class Filter(object): def bins(self): return self._bins - @property - def id(self): - return self._id - @property def num_bins(self): return self._num_bins @@ -216,17 +208,6 @@ class Filter(object): self._bins = bins - @id.setter - def id(self, filter_id): - if filter_id is None: - global AUTO_FILTER_ID - self._id = AUTO_FILTER_ID - AUTO_FILTER_ID += 1 - else: - cv.check_type('filter ID', filter_id, Integral) - cv.check_greater_than('filter ID', filter_id, 0, equality=True) - self._id = filter_id - @num_bins.setter def num_bins(self, num_bins): cv.check_type('filter num_bins', num_bins, Integral) @@ -460,9 +441,7 @@ class Filter(object): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) @@ -748,9 +727,7 @@ class SurfaceFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) @@ -908,9 +885,7 @@ class MeshFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Initialize dictionary to build Pandas Multi-index column @@ -1156,9 +1131,7 @@ class EnergyFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper energy bounds, then repeat and tile @@ -1368,9 +1341,7 @@ class DistribcellFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() level_df = None @@ -1564,9 +1535,7 @@ class MuFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper energy bounds, then repeat and tile @@ -1671,9 +1640,7 @@ class PolarFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper angle bounds, then repeat and tile @@ -1778,9 +1745,7 @@ class AzimuthalFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper angle bounds, then repeat and tile @@ -2072,8 +2037,6 @@ class EnergyFunctionFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - - import pandas as pd df = pd.DataFrame() # There is no clean way of sticking all the energy, y data into a diff --git a/openmc/geometry.py b/openmc/geometry.py index 27fee6573..0b02210b7 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -9,14 +9,6 @@ from openmc.clean_xml import sort_xml_elements, clean_xml_indentation from openmc.checkvalue import check_type -def reset_auto_ids(): - """Reset counters for all auto-generated IDs""" - openmc.reset_auto_material_id() - openmc.reset_auto_surface_id() - openmc.reset_auto_cell_id() - openmc.reset_auto_universe_id() - - class Geometry(object): """Geometry representing a collection of surfaces, cells, and universes. @@ -258,7 +250,7 @@ class Geometry(object): lattices[cell.fill.id] = cell.fill return lattices - + def get_all_surfaces(self): """ Return all surfaces used in the geometry @@ -270,11 +262,11 @@ class Geometry(object): """ surfaces = OrderedDict() - + for cell in self.get_all_cells().values(): surfaces = cell.region.get_surfaces(surfaces) return surfaces - + def get_materials_by_name(self, name, case_sensitive=False, matching=False): """Return a list of materials with matching names. @@ -482,22 +474,30 @@ class Geometry(object): lattices.sort(key=lambda x: x.id) return lattices - def determine_paths(self): + def determine_paths(self, instances_only=False): """Determine paths through CSG tree for cells and materials. This method recursively traverses the CSG tree to determine each unique path that reaches every cell and material. The paths are stored in the :attr:`Cell.paths` and :attr:`Material.paths` attributes. + Parameters + ---------- + instances_only : bool, optional + If true, this method will only determine the number of instances of + each cell and material. + """ # (Re-)initialize all cell instances to 0 for cell in self.get_all_cells().values(): cell._paths = [] + cell._num_instances = 0 for material in self.get_all_materials().values(): material._paths = [] + material._num_instances = 0 # Recursively traverse the CSG tree to count all cell instances - self.root_universe._determine_paths() + self.root_universe._determine_paths(instances_only=instances_only) def clone(self): """Create a copy of this geometry with new unique IDs for all of its diff --git a/openmc/lattice.py b/openmc/lattice.py index be5f22db9..3d078bd01 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -12,10 +12,11 @@ import numpy as np import openmc.checkvalue as cv import openmc +from openmc.mixin import IDManagerMixin @add_metaclass(ABCMeta) -class Lattice(object): +class Lattice(IDManagerMixin): """A repeating structure wherein each element is a universe. Parameters @@ -41,6 +42,10 @@ class Lattice(object): of the lattice """ + + next_id = 1 + used_ids = openmc.Universe.used_ids + def __init__(self, lattice_id=None, name=''): # Initialize Lattice class attributes self.id = lattice_id @@ -68,10 +73,6 @@ class Lattice(object): def __ne__(self, other): return not self == other - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -88,16 +89,6 @@ class Lattice(object): def universes(self): return self._universes - @id.setter - def id(self, lattice_id): - if lattice_id is None: - self._id = openmc.universe.AUTO_UNIVERSE_ID - openmc.universe.AUTO_UNIVERSE_ID += 1 - else: - cv.check_type('lattice ID', lattice_id, Integral) - cv.check_greater_than('lattice ID', lattice_id, 0, equality=True) - self._id = lattice_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/material.py b/openmc/material.py index 202f46c1b..03ef7fbc4 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -11,16 +11,7 @@ import openmc import openmc.data import openmc.checkvalue as cv from openmc.clean_xml import sort_xml_elements, clean_xml_indentation - - -# A static variable for auto-generated Material IDs -AUTO_MATERIAL_ID = 10000 - - -def reset_auto_material_id(): - """Reset counter for auto-generated material IDs.""" - global AUTO_MATERIAL_ID - AUTO_MATERIAL_ID = 10000 +from .mixin import IDManagerMixin # Units for density supported by OpenMC @@ -28,7 +19,7 @@ DENSITY_UNITS = ['g/cm3', 'g/cc', 'kg/cm3', 'atom/b-cm', 'atom/cm3', 'sum', 'macro'] -class Material(object): +class Material(IDManagerMixin): """A material composed of a collection of nuclides/elements. To create a material, one should create an instance of this class, add @@ -89,6 +80,9 @@ class Material(object): """ + next_id = 1 + used_ids = set() + def __init__(self, material_id=None, name='', temperature=None): # Initialize class attributes self.id = material_id @@ -97,7 +91,8 @@ class Material(object): self._density = None self._density_units = '' self._depletable = False - self._paths = [] + self._paths = None + self._num_instances = None self._volume = None self._atoms = {} @@ -183,10 +178,6 @@ class Material(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -209,14 +200,18 @@ class Material(object): @property def paths(self): - if not self._paths: + if self._paths is None: raise ValueError('Material instance paths have not been determined. ' 'Call the Geometry.determine_paths() method.') return self._paths @property def num_instances(self): - return len(self.paths) + if self._num_instances is None: + raise ValueError( + 'Number of material instances have not been determined. Call ' + 'the Geometry.determine_paths() method.') + return self._num_instances @property def elements(self): @@ -259,18 +254,6 @@ class Material(object): def volume(self): return self._volume - @id.setter - def id(self, material_id): - - if material_id is None: - global AUTO_MATERIAL_ID - self._id = AUTO_MATERIAL_ID - AUTO_MATERIAL_ID += 1 - else: - cv.check_type('material ID', material_id, Integral) - cv.check_greater_than('material ID', material_id, 0, equality=True) - self._id = material_id - @name.setter def name(self, name): if name is not None: @@ -298,11 +281,6 @@ class Material(object): cv.check_type('material volume', volume, Real) self._volume = volume - @num_instances.setter - def num_instances(self, num_instances): - cv.check_type('num_instances', num_instances, Integral) - self._num_instances = num_instances - @classmethod def from_hdf5(cls, group): """Create material from HDF5 group @@ -640,13 +618,18 @@ class Material(object): if element == elm[0]: self._elements.remove(elm) - def add_s_alpha_beta(self, name): + def add_s_alpha_beta(self, name, fraction=1.0): r"""Add an :math:`S(\alpha,\beta)` table to the material Parameters ---------- name : str Name of the :math:`S(\alpha,\beta)` table + fraction : float + The fraction of relevant nuclei that are affected by the + :math:`S(\alpha,\beta)` table. For example, if the material is a + block of carbon that is 60% graphite and 40% amorphous then add a + graphite :math:`S(\alpha,\beta)` table with fraction=0.6. """ @@ -660,13 +643,17 @@ class Material(object): 'non-string table name "{}"'.format(self._id, name) raise ValueError(msg) + cv.check_type('S(a,b) fraction', fraction, Real) + cv.check_greater_than('S(a,b) fraction', fraction, 0.0, True) + cv.check_less_than('S(a,b) fraction', fraction, 1.0, True) + new_name = openmc.data.get_thermal_name(name) if new_name != name: msg = 'OpenMC S(a,b) tables follow the GND naming convention. ' \ 'Table "{}" is being renamed as "{}".'.format(name, new_name) warnings.warn(msg) - self._sab.append(new_name) + self._sab.append((new_name, fraction)) def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: @@ -820,8 +807,18 @@ class Material(object): # If no nemoize'd clone exists, instantiate one if self not in memo: + # Temporarily remove paths -- this is done so that when the clone is + # made, it doesn't create a copy of the paths (which are specific to + # an instance) + paths = self._paths + self._paths = None + clone = deepcopy(self) clone.id = None + clone._num_instances = None + + # Restore paths on original instance + self._paths = paths # Memoize the clone memo[self] = clone @@ -984,7 +981,9 @@ class Material(object): if len(self._sab) > 0: for sab in self._sab: subelement = ET.SubElement(element, "sab") - subelement.set("name", sab) + subelement.set("name", sab[0]) + if sab[1] != 1.0: + subelement.set("fraction", str(sab[1])) return element diff --git a/openmc/mesh.py b/openmc/mesh.py index 1ad01e2ca..76a33d8e2 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -8,20 +8,10 @@ import numpy as np import openmc.checkvalue as cv import openmc -from openmc.mixin import EqualityMixin +from openmc.mixin import EqualityMixin, IDManagerMixin -# "Static" variable for auto-generated and Mesh IDs -AUTO_MESH_ID = 10000 - - -def reset_auto_mesh_id(): - """Reset counter for auto-generated mesh IDs.""" - global AUTO_MESH_ID - AUTO_MESH_ID = 10000 - - -class Mesh(EqualityMixin): +class Mesh(EqualityMixin, IDManagerMixin): """A structured Cartesian mesh in one, two, or three dimensions Parameters @@ -52,6 +42,9 @@ class Mesh(EqualityMixin): """ + next_id = 1 + used_ids = set() + def __init__(self, mesh_id=None, name=''): # Initialize Mesh class attributes self.id = mesh_id @@ -62,10 +55,6 @@ class Mesh(EqualityMixin): self._upper_right = None self._width = None - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -94,17 +83,6 @@ class Mesh(EqualityMixin): def num_mesh_cells(self): return np.prod(self._dimension) - @id.setter - def id(self, mesh_id): - if mesh_id is None: - global AUTO_MESH_ID - self._id = AUTO_MESH_ID - AUTO_MESH_ID += 1 - else: - cv.check_type('mesh ID', mesh_id, Integral) - cv.check_greater_than('mesh ID', mesh_id, 0, equality=True) - self._id = mesh_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 8fcf93cb9..93a3607d9 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -5,6 +5,9 @@ import os from six import string_types import numpy as np import h5py +from scipy.interpolate import interp1d +from scipy.integrate import simps +from scipy.special import eval_legendre import openmc import openmc.mgxs @@ -1808,10 +1811,6 @@ class XSdata(object): """ - from scipy.interpolate import interp1d - from scipy.integrate import simps - from scipy.special import eval_legendre - check_value('target_format', target_format, _SCATTER_TYPES) check_type('target_order', target_order, Integral) if target_format == 'legendre': diff --git a/openmc/mixin.py b/openmc/mixin.py index dd97e8924..d724fc32a 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -1,5 +1,10 @@ +from numbers import Integral +from warnings import warn + import numpy as np +import openmc.checkvalue as cv + class EqualityMixin(object): """A Class which provides generic __eq__ and __ne__ functionality which @@ -18,3 +23,81 @@ class EqualityMixin(object): def __ne__(self, other): return not self.__eq__(other) + + +class IDWarning(UserWarning): + pass + + +class IDManagerMixin(object): + """A Class which automatically manages unique IDs. + + This mixin gives any subclass the ability to assign unique IDs through an + 'id' property and keeps track of which ones have already been + assigned. Crucially, each subclass must define class variables 'next_id' and + 'used_ids' as they are used in the 'id' property that is supplied here. + + """ + + @property + def id(self): + return self._id + + @id.setter + def id(self, uid): + cls = type(self) + name = cls.__name__ + if uid is None: + while cls.next_id in cls.used_ids: + cls.next_id += 1 + self._id = cls.next_id + cls.used_ids.add(cls.next_id) + else: + cv.check_type('{} ID'.format(name), uid, Integral) + cv.check_greater_than('{} ID'.format(name), uid, 0, equality=True) + if uid in cls.used_ids: + msg = 'Another {} instance already exists with id={}.'.format( + name, uid) + warn(msg, IDWarning) + else: + cls.used_ids.add(uid) + self._id = uid + + +def reset_auto_ids(): + """Reset counters for all auto-generated IDs""" + for cls in IDManagerMixin.__subclasses__(): + cls.used_ids.clear() + cls.next_id = 1 + + +def reserve_ids(ids, cls=None): + """Reserve a set of IDs that won't be used for auto-generated IDs. + + Parameters + ---------- + ids : iterable of int + IDs to reserve + cls : type or None + Class for which IDs should be reserved (e.g., :class:`openmc.Cell`). If + None, all classes that have auto-generated IDs will be used. + + """ + if cls is None: + for cls in IDManagerMixin.__subclasses__(): + cls.used_ids |= set(ids) + else: + cls.used_ids |= set(ids) + + +def set_auto_id(next_id): + """Set the next ID for auto-generated IDs. + + Parameters + ---------- + next_id : int + The next ID to assign to objects with auto-generated IDs. + + """ + for cls in IDManagerMixin.__subclasses__(): + cls.next_id = next_id diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 2090dc977..67bf3bc44 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -513,7 +513,7 @@ def create_triso_lattice(trisos, lower_left, pitch, shape, background): universes = np.empty(shape[::-1], dtype=openmc.Universe) for idx, triso_list in sorted(triso_locations.items()): if len(triso_list) > 0: - outside_trisos = openmc.Intersection(*[~t.region for t in triso_list]) + outside_trisos = openmc.Intersection(~t.region for t in triso_list) background_cell = openmc.Cell(fill=background, region=outside_trisos) else: background_cell = openmc.Cell(fill=background) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 03062ee0e..fc0d7ef07 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -11,12 +11,12 @@ class Nuclide(object): Parameters ---------- name : str - Name of the nuclide, e.g. U235 + Name of the nuclide, e.g. 'U235' Attributes ---------- name : str - Name of the nuclide, e.g. U235 + Name of the nuclide, e.g. 'U235' scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use diff --git a/openmc/openmoc_compatible.py b/openmc/openmoc_compatible.py index 21dc4b6a6..d18070740c 100644 --- a/openmc/openmoc_compatible.py +++ b/openmc/openmoc_compatible.py @@ -371,11 +371,11 @@ def get_openmoc_region(openmc_region): openmoc.Halfspace(halfspace, get_openmoc_surface(surface)) elif isinstance(openmc_region, openmc.Intersection): openmoc_region = openmoc.Intersection() - for openmc_node in openmc_region.nodes: + for openmc_node in openmc_region: openmoc_region.addNode(get_openmoc_region(openmc_node)) elif isinstance(openmc_region, openmc.Union): openmoc_region = openmoc.Union() - for openmc_node in openmc_region.nodes: + for openmc_node in openmc_region: openmoc_region.addNode(get_openmoc_region(openmc_node)) elif isinstance(openmc_region, openmc.Complement): openmoc_region = openmoc.Complement() @@ -411,12 +411,12 @@ def get_openmc_region(openmoc_region): openmc_region = openmc.Intersection() for openmoc_node in openmoc_region.getNodes(): openmc_node = get_openmc_region(openmoc_node) - openmc_region.nodes.append(openmc_node) + openmc_region.append(openmc_node) elif openmoc_region.getRegionType() == openmoc.UNION: openmc_region = openmc.Union() for openmoc_node in openmoc_region.getNodes(): openmc_node = get_openmc_region(openmoc_node) - openmc_region.nodes.append(openmc_node) + openmc_region.append(openmc_node) elif openmoc_region.getRegionType() == openmoc.COMPLEMENT: openmoc_nodes = openmoc_region.getNodes() openmc_node = get_openmc_region(openmoc_nodes[0]) diff --git a/openmc/plots.py b/openmc/plots.py index cc2fcc4b6..ad0d48d11 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -10,16 +10,7 @@ import numpy as np import openmc import openmc.checkvalue as cv from openmc.clean_xml import clean_xml_indentation - - -# A static variable for auto-generated Plot IDs -AUTO_PLOT_ID = 10000 - - -def reset_auto_plot_id(): - """Reset counter for auto-generated plot IDs.""" - global AUTO_PLOT_ID - AUTO_PLOT_ID = 10000 +from openmc.mixin import IDManagerMixin _BASES = ['xy', 'xz', 'yz'] @@ -175,7 +166,7 @@ _SVG_COLORS = { } -class Plot(object): +class Plot(IDManagerMixin): """Definition of a finite region of space to be plotted. OpenMC is capable of generating two-dimensional slice plots and @@ -227,6 +218,9 @@ class Plot(object): """ + next_id = 1 + used_ids = set() + def __init__(self, plot_id=None, name=''): # Initialize Plot class attributes self.id = plot_id @@ -245,10 +239,6 @@ class Plot(object): self._level = None self._meshlines = None - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -305,17 +295,6 @@ class Plot(object): def meshlines(self): return self._meshlines - @id.setter - def id(self, plot_id): - if plot_id is None: - global AUTO_PLOT_ID - self._id = AUTO_PLOT_ID - AUTO_PLOT_ID += 1 - else: - cv.check_type('plot ID', plot_id, Integral) - cv.check_greater_than('plot ID', plot_id, 0, equality=True) - self._id = plot_id - @name.setter def name(self, name): cv.check_type('plot name', name, string_types) diff --git a/openmc/region.py b/openmc/region.py index 854852ba4..eeafd2832 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from collections import Iterable, OrderedDict +from collections import Iterable, OrderedDict, MutableSequence from copy import deepcopy from six import add_metaclass @@ -20,21 +20,21 @@ class Region(object): """ def __and__(self, other): - return Intersection(self, other) + return Intersection((self, other)) def __or__(self, other): - return Union(self, other) + return Union((self, other)) def __invert__(self): return Complement(self) @abstractmethod def __contains__(self, point): - return False + pass @abstractmethod def __str__(self): - return '' + pass def __eq__(self, other): if not isinstance(other, type(self)): @@ -55,7 +55,7 @@ class Region(object): ---------- surfaces: collections.OrderedDict, optional Dictionary mapping surface IDs to :class:`openmc.Surface` instances - + Returns ------- surfaces: collections.OrderedDict @@ -150,32 +150,26 @@ class Region(object): r2 = output.pop() if operator == ' ': r1 = output.pop() - if isinstance(r1, Intersection) and can_be_combined(r2): - r1.nodes.append(r2) + if isinstance(r1, Intersection): + r1 &= r2 output.append(r1) elif isinstance(r2, Intersection) and can_be_combined(r1): - r2.nodes.insert(0, r1) + r2.insert(0, r1) output.append(r2) - elif isinstance(r1, Intersection) and isinstance(r2, Intersection): - r1.nodes += r2.nodes - output.append(r1) else: - output.append(Intersection(r1, r2)) + output.append(r1 & r2) elif operator == '|': r1 = output.pop() - if isinstance(r1, Union) and can_be_combined(r2): - r1.nodes.append(r2) + if isinstance(r1, Union): + r1 |= r2 output.append(r1) elif isinstance(r2, Union) and can_be_combined(r1): - r2.nodes.insert(0, r1) + r2.insert(0, r1) output.append(r2) - elif isinstance(r1, Union) and isinstance(r2, Union): - r1.nodes += r2.nodes - output.append(r1) else: - output.append(Union(r1, r2)) + output.append(r1 | r2) elif operator == '~': - output.append(Complement(r2)) + output.append(~r2) # The following is an implementation of the shunting yard algorithm to # generate an abstract syntax tree for the region expression. @@ -248,12 +242,12 @@ class Region(object): 'the abstract region class.') -class Intersection(Region): +class Intersection(Region, MutableSequence): r"""Intersection of two or more regions. - Instances of Intersection are generally created via the __and__ operator - applied to two instances of :class:`openmc.Region`. This is illustrated in - the following example: + Instances of Intersection are generally created via the & operator applied + to two instances of :class:`openmc.Region`. This is illustrated in the + following example: >>> equator = openmc.ZPlane(z0=0.0) >>> earth = openmc.Sphere(R=637.1e6) @@ -262,31 +256,51 @@ class Intersection(Region): >>> type(northern_hemisphere) + Instances of this class behave like a mutable sequence, e.g., they can be + indexed and have an append() method. + Parameters ---------- - \*nodes + nodes : iterable of openmc.Region Regions to take the intersection of Attributes ---------- - nodes : list of openmc.Region - Regions to take the intersection of bounding_box : tuple of numpy.array Lower-left and upper-right coordinates of an axis-aligned bounding box """ - def __init__(self, *nodes): - self.nodes = list(nodes) + def __init__(self, nodes): + self._nodes = list(nodes) def __and__(self, other): - new = Intersection(*self.nodes) - new.nodes.append(other) + new = Intersection(self) + new &= other return new - def __iter__(self): - for n in self.nodes: - yield n + def __iand__(self, other): + if isinstance(other, Intersection): + self.extend(other) + else: + self.append(other) + return self + + # Implement mutable sequence protocol by delegating to list + def __getitem__(self, key): + return self._nodes[key] + + def __setitem__(self, key, value): + self._nodes[key] = value + + def __delitem__(self, key): + del self._nodes[key] + + def __len__(self): + return len(self._nodes) + + def insert(self, index, value): + self._nodes.insert(index, value) def __contains__(self, point): """Check whether a point is contained in the region. @@ -302,30 +316,21 @@ class Intersection(Region): Whether the point is in the region """ - return all(point in n for n in self.nodes) + return all(point in n for n in self) def __str__(self): - return '(' + ' '.join(map(str, self.nodes)) + ')' - - @property - def nodes(self): - return self._nodes + return '(' + ' '.join(map(str, self)) + ')' @property def bounding_box(self): lower_left = np.array([-np.inf, -np.inf, -np.inf]) upper_right = np.array([np.inf, np.inf, np.inf]) - for n in self.nodes: + for n in self: lower_left_n, upper_right_n = n.bounding_box lower_left[:] = np.maximum(lower_left, lower_left_n) upper_right[:] = np.minimum(upper_right, upper_right_n) return lower_left, upper_right - @nodes.setter - def nodes(self, nodes): - check_type('nodes', nodes, Iterable, Region) - self._nodes = nodes - def clone(self, memo=None): """Create a copy of this region - each of the surfaces in the intersection's nodes will be cloned and will have new unique IDs. @@ -347,47 +352,67 @@ class Intersection(Region): memo = {} clone = deepcopy(self) - clone.nodes = [n.clone(memo) for n in self.nodes] + clone[:] = [n.clone(memo) for n in self] return clone -class Union(Region): +class Union(Region, MutableSequence): r"""Union of two or more regions. - Instances of Union are generally created via the __or__ operator applied to - two instances of :class:`openmc.Region`. This is illustrated in the - following example: + Instances of Union are generally created via the | operator applied to two + instances of :class:`openmc.Region`. This is illustrated in the following + example: >>> s1 = openmc.ZPlane(z0=0.0) >>> s2 = openmc.Sphere(R=637.1e6) >>> type(-s2 | +s1) + Instances of this class behave like a mutable sequence, e.g., they can be + indexed and have an append() method. + Parameters ---------- - \*nodes + nodes : iterable of openmc.Region Regions to take the union of Attributes ---------- - nodes : tuple of openmc.Region - Regions to take the union of bounding_box : 2-tuple of numpy.array Lower-left and upper-right coordinates of an axis-aligned bounding box """ - def __init__(self, *nodes): - self.nodes = list(nodes) + def __init__(self, nodes): + self._nodes = list(nodes) def __or__(self, other): - new = Union(*self.nodes) - new.nodes.append(other) + new = Union(self) + new |= other return new - def __iter__(self): - for n in self.nodes: - yield n + def __ior__(self, other): + if isinstance(other, Union): + self.extend(other) + else: + self.append(other) + return self + + # Implement mutable sequence protocol by delegating to list + def __getitem__(self, key): + return self._nodes[key] + + def __setitem__(self, key, value): + self._nodes[key] = value + + def __delitem__(self, key): + del self._nodes[key] + + def __len__(self): + return len(self._nodes) + + def insert(self, index, value): + self._nodes.insert(index, value) def __contains__(self, point): """Check whether a point is contained in the region. @@ -403,30 +428,21 @@ class Union(Region): Whether the point is in the region """ - return any(point in n for n in self.nodes) + return any(point in n for n in self) def __str__(self): - return '(' + ' | '.join(map(str, self.nodes)) + ')' - - @property - def nodes(self): - return self._nodes + return '(' + ' | '.join(map(str, self)) + ')' @property def bounding_box(self): lower_left = np.array([np.inf, np.inf, np.inf]) upper_right = np.array([-np.inf, -np.inf, -np.inf]) - for n in self.nodes: + for n in self: lower_left_n, upper_right_n = n.bounding_box lower_left[:] = np.minimum(lower_left, lower_left_n) upper_right[:] = np.maximum(upper_right, upper_right_n) return lower_left, upper_right - @nodes.setter - def nodes(self, nodes): - check_type('nodes', nodes, Iterable, Region) - self._nodes = nodes - def clone(self, memo=None): """Create a copy of this region - each of the surfaces in the union's nodes will be cloned and will have new unique IDs. @@ -448,7 +464,7 @@ class Union(Region): memo = {} clone = copy.deepcopy(self) - clone.nodes = [n.clone(memo) for n in self.nodes] + clone[:] = [n.clone(memo) for n in self] return clone @@ -456,7 +472,7 @@ class Complement(Region): """Complement of a region. The Complement of an existing :class:`openmc.Region` can be created by using - the __invert__ operator as the following example demonstrates: + the ~ operator as the following example demonstrates: >>> xl = openmc.XPlane(x0=-10.0) >>> xr = openmc.XPlane(x0=10.0) @@ -518,9 +534,9 @@ class Complement(Region): # only applies to surface half-spaces, thus allowing us to calculate the # bounding box in the usual recursive manner. if isinstance(self.node, Union): - temp_region = Intersection(*[~n for n in self.node.nodes]) + temp_region = Intersection(~n for n in self.node) elif isinstance(self.node, Intersection): - temp_region = Union(*[~n for n in self.node.nodes]) + temp_region = Union(~n for n in self.node) elif isinstance(self.node, Complement): temp_region = self.node.node else: diff --git a/openmc/search.py b/openmc/search.py index 128a725d9..7f91438fd 100644 --- a/openmc/search.py +++ b/openmc/search.py @@ -1,6 +1,8 @@ from collections import Callable from numbers import Real +import scipy.optimize as sopt + import openmc import openmc.model import openmc.checkvalue as cv @@ -144,8 +146,6 @@ def search_for_keff(model_builder, initial_guess=None, target=1.0, model = model_builder(initial_guess, **model_args) cv.check_type('model_builder return', model, openmc.model.Model) - import scipy.optimize as sopt - # Set the iteration data storage variables guesses = [] results = [] diff --git a/openmc/settings.py b/openmc/settings.py index b1ff4c0c6..3efdf1ab7 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -125,13 +125,16 @@ class Settings(object): temperature : dict Defines a default temperature and method for treating intermediate temperatures at which nuclear data doesn't exist. Accepted keys are - 'default', 'method', 'tolerance', and 'multipole'. The value for - 'default' should be a float representing the default temperature in + 'default', 'method', 'range', 'tolerance', and 'multipole'. The value + for 'default' should be a float representing the default temperature in Kelvin. The value for 'method' should be 'nearest' or 'interpolation'. If the method is 'nearest', 'tolerance' indicates a range of temperature - within which cross sections may be used. 'multipole' is a boolean - indicating whether or not the windowed multipole method should be used - to evaluate resolved resonance cross sections. + within which cross sections may be used. The value for 'range' should be + a pair a minimum and maximum temperatures which are used to indicate + that cross sections be loaded at all temperatures within the + range. 'multipole' is a boolean indicating whether or not the windowed + multipole method should be used to evaluate resolved resonance cross + sections. threads : int Number of OpenMP threads trace : tuple or list @@ -639,7 +642,8 @@ class Settings(object): cv.check_type('temperature settings', temperature, Mapping) for key, value in temperature.items(): cv.check_value('temperature key', key, - ['default', 'method', 'tolerance', 'multipole']) + ['default', 'method', 'tolerance', 'multipole', + 'range']) if key == 'default': cv.check_type('default temperature', value, Real) elif key == 'method': @@ -649,6 +653,11 @@ class Settings(object): cv.check_type('temperature tolerance', value, Real) elif key == 'multipole': cv.check_type('temperature multipole', value, bool) + elif key == 'range': + cv.check_length('temperature range', value, 2) + for T in value: + cv.check_type('temperature', T, Real) + self._temperature = temperature @threads.setter @@ -999,6 +1008,8 @@ class Settings(object): "temperature_{}".format(key)) if isinstance(value, bool): element.text = str(value).lower() + elif key == 'range': + element.text = ' '.join(str(T) for T in value) else: element.text = str(value) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 543e8a302..474b03033 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -356,71 +356,76 @@ class StatePoint(object): else: tally_ids = [] - # Iterate over all tallies - for tally_id in tally_ids: - group = tallies_group['tally {}'.format(tally_id)] + # Ignore warnings about duplicate IDs + with warnings.catch_warnings(): + warnings.simplefilter('ignore', openmc.IDWarning) - # Read the number of realizations - n_realizations = group['n_realizations'].value + # Iterate over all tallies + for tally_id in tally_ids: + group = tallies_group['tally {}'.format(tally_id)] - # Create Tally object and assign basic properties - tally = openmc.Tally(tally_id) - tally._sp_filename = self._f.filename - tally.name = group['name'].value.decode() if 'name' in group else '' - tally.estimator = group['estimator'].value.decode() - tally.num_realizations = n_realizations + # Read the number of realizations + n_realizations = group['n_realizations'].value - # Read derivative information. - if 'derivative' in group: - deriv_id = group['derivative'].value - tally.derivative = self.tally_derivatives[deriv_id] + # Create Tally object and assign basic properties + tally = openmc.Tally(tally_id) + tally._sp_filename = self._f.filename + tally.name = group['name'].value.decode() if 'name' in group else '' + tally.estimator = group['estimator'].value.decode() + tally.num_realizations = n_realizations - # Read all filters - n_filters = group['n_filters'].value - if n_filters > 0: - filter_ids = group['filters'].value - filters_group = self._f['tallies/filters'] - for filter_id in filter_ids: - filter_group = filters_group['filter {}'.format(filter_id)] - new_filter = openmc.Filter.from_hdf5(filter_group, - meshes=self.meshes) - tally.filters.append(new_filter) + # Read derivative information. + if 'derivative' in group: + deriv_id = group['derivative'].value + tally.derivative = self.tally_derivatives[deriv_id] - # Read nuclide bins - nuclide_names = group['nuclides'].value + # Read all filters + n_filters = group['n_filters'].value + if n_filters > 0: + filter_ids = group['filters'].value + filters_group = self._f['tallies/filters'] + for filter_id in filter_ids: + filter_group = filters_group['filter {}'.format( + filter_id)] + new_filter = openmc.Filter.from_hdf5( + filter_group, meshes=self.meshes) + tally.filters.append(new_filter) - # Add all nuclides to the Tally - for name in nuclide_names: - nuclide = openmc.Nuclide(name.decode().strip()) - tally.nuclides.append(nuclide) + # Read nuclide bins + nuclide_names = group['nuclides'].value - scores = group['score_bins'].value - n_score_bins = group['n_score_bins'].value + # Add all nuclides to the Tally + for name in nuclide_names: + nuclide = openmc.Nuclide(name.decode().strip()) + tally.nuclides.append(nuclide) - # Compute and set the filter strides - for i in range(n_filters): - tally_filter = tally.filters[i] - tally_filter.stride = n_score_bins * len(nuclide_names) + scores = group['score_bins'].value + n_score_bins = group['n_score_bins'].value - for j in range(i+1, n_filters): - tally_filter.stride *= tally.filters[j].num_bins + # Compute and set the filter strides + for i in range(n_filters): + tally_filter = tally.filters[i] + tally_filter.stride = n_score_bins * len(nuclide_names) - # Read scattering moment order strings (e.g., P3, Y1,2, etc.) - moments = group['moment_orders'].value + for j in range(i+1, n_filters): + tally_filter.stride *= tally.filters[j].num_bins - # Add the scores to the Tally - for j, score in enumerate(scores): - score = score.decode() + # Read scattering moment order strings (e.g., P3, Y1,2, etc.) + moments = group['moment_orders'].value - # If this is a moment, use generic moment order - pattern = r'-n$|-pn$|-yn$' - score = re.sub(pattern, '-' + moments[j].decode(), score) + # Add the scores to the Tally + for j, score in enumerate(scores): + score = score.decode() - tally.scores.append(score) + # If this is a moment, use generic moment order + pattern = r'-n$|-pn$|-yn$' + score = re.sub(pattern, '-' + moments[j].decode(), score) - # Add Tally to the global dictionary of all Tallies - tally.sparse = self.sparse - self._tallies[tally_id] = tally + tally.scores.append(score) + + # Add Tally to the global dictionary of all Tallies + tally.sparse = self.sparse + self._tallies[tally_id] = tally self._tallies_read = True diff --git a/openmc/summary.py b/openmc/summary.py index 61596cc38..34743757b 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -1,5 +1,6 @@ from collections import Iterable import re +import warnings import numpy as np import h5py @@ -31,8 +32,6 @@ class Summary(object): """ def __init__(self, filename): - openmc.reset_auto_ids() - if not filename.endswith(('.h5', '.hdf5')): msg = 'Unable to open "{0}" which is not an HDF5 summary file' raise ValueError(msg) @@ -52,7 +51,9 @@ class Summary(object): self._nuclides = {} self._read_nuclides() - self._read_geometry() + with warnings.catch_warnings(): + warnings.simplefilter("ignore", openmc.IDWarning) + self._read_geometry() @property def date_and_time(self): @@ -69,7 +70,7 @@ class Summary(object): @property def nuclides(self): return self._nuclides - + @property def version(self): return tuple(self._f.attrs['openmc_version']) diff --git a/openmc/surface.py b/openmc/surface.py index c7c19cff3..b415ecb93 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -12,6 +12,7 @@ import numpy as np from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.region import Region, Intersection, Union +from openmc.mixin import IDManagerMixin # A static variable for auto-generated Surface IDs @@ -20,13 +21,7 @@ AUTO_SURFACE_ID = 10000 _BOUNDARY_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] -def reset_auto_surface_id(): - """Reset counters for all auto-generated surface IDs""" - global AUTO_SURFACE_ID - AUTO_SURFACE_ID = 10000 - - -class Surface(object): +class Surface(IDManagerMixin): """An implicit surface with an associated boundary condition. An implicit surface is defined as the set of zeros of a function of the @@ -64,6 +59,9 @@ class Surface(object): """ + next_id = 1 + used_ids = set() + def __init__(self, surface_id=None, boundary_type='transmission', name=''): self.id = surface_id self.name = name @@ -105,10 +103,6 @@ class Surface(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -125,17 +119,6 @@ class Surface(object): def coefficients(self): return self._coefficients - @id.setter - def id(self, surface_id): - if surface_id is None: - global AUTO_SURFACE_ID - self._id = AUTO_SURFACE_ID - AUTO_SURFACE_ID += 1 - else: - check_type('surface ID', surface_id, Integral) - check_greater_than('surface ID', surface_id, 0, equality=True) - self._id = surface_id - @name.setter def name(self, name): if name is not None: @@ -1860,15 +1843,15 @@ class Halfspace(Region): def __and__(self, other): if isinstance(other, Intersection): - return Intersection(self, *other.nodes) + return Intersection([self] + other[:]) else: - return Intersection(self, other) + return Intersection((self, other)) def __or__(self, other): if isinstance(other, Union): - return Union(self, *other.nodes) + return Union([self] + other[:]) else: - return Union(self, other) + return Union((self, other)) def __invert__(self): return -self.surface if self.side == '+' else +self.surface diff --git a/openmc/tallies.py b/openmc/tallies.py index 1641d6164..6853db494 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -11,16 +11,16 @@ from xml.etree import ElementTree as ET from six import string_types import numpy as np +import pandas as pd +import scipy.sparse as sps import h5py import openmc import openmc.checkvalue as cv from openmc.clean_xml import clean_xml_indentation +from .mixin import IDManagerMixin -# "Static" variable for auto-generated Tally IDs -AUTO_TALLY_ID = 10000 - # The tally arithmetic product types. The tensor product performs the full # cross product of the data in two tallies with respect to a specified axis # (filters, nuclides, or scores). The entrywise product performs the arithmetic @@ -39,13 +39,7 @@ _FILTER_CLASSES = (openmc.Filter, openmc.CrossFilter, openmc.AggregateFilter) ESTIMATOR_TYPES = ['tracklength', 'collision', 'analog'] -def reset_auto_tally_id(): - """Reset counter for auto-generated tally IDs.""" - global AUTO_TALLY_ID - AUTO_TALLY_ID = 10000 - - -class Tally(object): +class Tally(IDManagerMixin): """A tally defined by a set of scores that are accumulated for a list of nuclides given a set of filters. @@ -107,6 +101,9 @@ class Tally(object): """ + next_id = 1 + used_ids = set() + def __init__(self, tally_id=None, name=''): # Initialize Tally class attributes self.id = tally_id @@ -202,10 +199,6 @@ class Tally(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -295,8 +288,6 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if self.sparse: - import scipy.sparse as sps - self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) self._sum_sq = \ @@ -337,8 +328,6 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - import scipy.sparse as sps - self._mean = \ sps.lil_matrix(self._mean.flatten(), self._mean.shape) @@ -361,8 +350,6 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - import scipy.sparse as sps - self._std_dev = \ sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) @@ -420,17 +407,6 @@ class Tally(object): DeprecationWarning) self.triggers.append(trigger) - @id.setter - def id(self, tally_id): - if tally_id is None: - global AUTO_TALLY_ID - self._id = AUTO_TALLY_ID - AUTO_TALLY_ID += 1 - else: - cv.check_type('tally ID', tally_id, Integral) - cv.check_greater_than('tally ID', tally_id, 0, equality=True) - self._id = tally_id - @name.setter def name(self, name): if name is not None: @@ -608,8 +584,6 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if sparse and not self.sparse: - import scipy.sparse as sps - if self._sum is not None: self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) @@ -1610,7 +1584,6 @@ class Tally(object): raise KeyError(msg) # Initialize a pandas dataframe for the tally data - import pandas as pd df = pd.DataFrame() # Find the total length of the tally data array diff --git a/openmc/tally_derivative.py b/openmc/tally_derivative.py index 185e7ab6a..d6c2fab02 100644 --- a/openmc/tally_derivative.py +++ b/openmc/tally_derivative.py @@ -7,18 +7,10 @@ from xml.etree import ElementTree as ET from six import string_types import openmc.checkvalue as cv -from openmc.mixin import EqualityMixin +from openmc.mixin import EqualityMixin, IDManagerMixin -# "Static" variable for auto-generated TallyDerivative IDs -AUTO_TALLY_DERIV_ID = 10000 - -def reset_auto_tally_deriv_id(): - global AUTO_TALLY_ID - AUTO_TALLY_DERIV_ID = 10000 - - -class TallyDerivative(EqualityMixin): +class TallyDerivative(EqualityMixin, IDManagerMixin): """A material perturbation derivative to apply to a tally. Parameters @@ -48,6 +40,9 @@ class TallyDerivative(EqualityMixin): """ + next_id = 1 + used_ids = set() + def __init__(self, derivative_id=None, variable=None, material=None, nuclide=None): # Initialize Tally class attributes @@ -74,10 +69,6 @@ class TallyDerivative(EqualityMixin): return string - @property - def id(self): - return self._id - @property def variable(self): return self._variable @@ -90,18 +81,6 @@ class TallyDerivative(EqualityMixin): def nuclide(self): return self._nuclide - @id.setter - def id(self, deriv_id): - if deriv_id is None: - global AUTO_TALLY_DERIV_ID - self._id = AUTO_TALLY_DERIV_ID - AUTO_TALLY_DERIV_ID += 1 - else: - cv.check_type('tally derivative ID', deriv_id, Integral) - cv.check_greater_than('tally derivative ID', deriv_id, 0, - equality=True) - self._id = deriv_id - @variable.setter def variable(self, var): if var is not None: diff --git a/openmc/universe.py b/openmc/universe.py index d36b167a5..26977ac0a 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -11,19 +11,10 @@ import numpy as np import openmc import openmc.checkvalue as cv from openmc.plots import _SVG_COLORS +from openmc.mixin import IDManagerMixin -# A static variable for auto-generated Lattice (Universe) IDs -AUTO_UNIVERSE_ID = 10000 - - -def reset_auto_universe_id(): - """Reset counter for auto-generated universe IDs.""" - global AUTO_UNIVERSE_ID - AUTO_UNIVERSE_ID = 10000 - - -class Universe(object): +class Universe(IDManagerMixin): """A collection of cells that can be repeated. Parameters @@ -55,6 +46,9 @@ class Universe(object): """ + next_id = 1 + used_ids = set() + def __init__(self, universe_id=None, name='', cells=None): # Initialize Cell class attributes self.id = universe_id @@ -95,10 +89,6 @@ class Universe(object): list(self._cells.keys())) return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -116,22 +106,11 @@ class Universe(object): regions = [c.region for c in self.cells.values() if c.region is not None] if regions: - return openmc.Union(*regions).bounding_box + return openmc.Union(regions).bounding_box else: # Infinite bounding box return openmc.Intersection().bounding_box - @id.setter - def id(self, universe_id): - if universe_id is None: - global AUTO_UNIVERSE_ID - self._id = AUTO_UNIVERSE_ID - AUTO_UNIVERSE_ID += 1 - else: - cv.check_type('universe ID', universe_id, Integral) - cv.check_greater_than('universe ID', universe_id, 0, equality=True) - self._id = universe_id - @name.setter def name(self, name): if name is not None: @@ -566,7 +545,7 @@ class Universe(object): cell_element.set("universe", str(self._id)) xml_element.append(cell_element) - def _determine_paths(self, path=''): + def _determine_paths(self, path='', instances_only=False): """Count the number of instances for each cell in the universe, and record the count in the :attr:`Cell.num_instances` properties.""" @@ -577,7 +556,7 @@ class Universe(object): # If universe-filled, recursively count cells in filling universe if cell.fill_type == 'universe': - cell.fill._determine_paths(cell_path + '->') + cell.fill._determine_paths(cell_path + '->', instances_only) # If lattice-filled, recursively call for all universes in lattice elif cell.fill_type == 'lattice': @@ -588,18 +567,22 @@ class Universe(object): latt_path = '{}->l{}({})->'.format( cell_path, latt.id, ",".join(str(x) for x in index)) univ = latt.get_universe(index) - univ._determine_paths(latt_path) + univ._determine_paths(latt_path, instances_only) else: if cell.fill_type == 'material': mat = cell.fill elif cell.fill_type == 'distribmat': - mat = cell.fill[len(cell._paths)] + mat = cell.fill[cell._num_instances] else: mat = None if mat is not None: - mat._paths.append('{}->m{}'.format(cell_path, mat.id)) + mat._num_instances += 1 + if not instances_only: + mat._paths.append('{}->m{}'.format(cell_path, mat.id)) # Append current path - cell._paths.append(cell_path) + cell._num_instances += 1 + if not instances_only: + cell._paths.append(cell_path) diff --git a/openmc/volume.py b/openmc/volume.py index 6c4b130f9..cccb3c6a2 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -1,7 +1,7 @@ from collections import Iterable, Mapping, OrderedDict from numbers import Real, Integral from xml.etree import ElementTree as ET -from warnings import warn +import warnings import numpy as np import pandas as pd @@ -85,15 +85,16 @@ class VolumeCalculation(object): continue if (np.any(np.asarray(lower_left) > ll) or np.any(np.asarray(upper_right) < ur)): - warn("Specified bounding box is smaller than computed " - "bounding box for cell {}. Volume calculation may " - "be incorrect!".format(c.id)) + warnings.warn( + "Specified bounding box is smaller than computed " + "bounding box for cell {}. Volume calculation may " + "be incorrect!".format(c.id)) self.lower_left = lower_left self.upper_right = upper_right else: if self.domain_type == 'cell': - ll, ur = openmc.Union(*[c.region for c in domains]).bounding_box + ll, ur = openmc.Union(c.region for c in domains).bounding_box if np.any(np.isinf(ll)) or np.any(np.isinf(ur)): raise ValueError('Could not automatically determine bounding ' 'box for stochastic volume calculation.') @@ -221,12 +222,14 @@ class VolumeCalculation(object): # Instantiate some throw-away domains that are used by the constructor # to assign IDs - if domain_type == 'cell': - domains = [openmc.Cell(uid) for uid in ids] - elif domain_type == 'material': - domains = [openmc.Material(uid) for uid in ids] - elif domain_type == 'universe': - domains = [openmc.Universe(uid) for uid in ids] + with warnings.catch_warnings(): + warnings.simplefilter('ignore', openmc.IDWarning) + if domain_type == 'cell': + domains = [openmc.Cell(uid) for uid in ids] + elif domain_type == 'material': + domains = [openmc.Material(uid) for uid in ids] + elif domain_type == 'universe': + domains = [openmc.Universe(uid) for uid in ids] # Instantiate the class and assign results vol = cls(domains, samples, lower_left, upper_right) diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 72aee9c0f..3eb850207 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -247,6 +247,11 @@ def update_materials(root): if 'name' in nuclide.attrib: nucname = nuclide.attrib['name'] nucname = nucname.replace('-', '') + # If a nuclide name is in the ZAID notation (e.g., a number), + # convert it to the proper nuclide name. + if nucname.strip().isnumeric(): + nucname = \ + openmc.data.neutron._get_metadata(int(nucname))[0] nucname = nucname.replace('Nat', '0') if nucname.endswith('m'): nucname = nucname[:-1] + '_m1' diff --git a/setup.py b/setup.py index b64a806c2..67bc73403 100755 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import glob +import sys import numpy as np try: from setuptools import setup @@ -16,6 +17,12 @@ except ImportError: have_cython = False +# Determine shared library suffix +if sys.platform == 'darwin': + suffix = 'dylib' +else: + suffix = 'so' + # Get version information from __init__.py. This is ugly, but more reliable than # using an import. with open('openmc/__init__.py', 'r') as f: @@ -27,6 +34,12 @@ kwargs = {'name': 'openmc', 'openmc.stats'], 'scripts': glob.glob('scripts/openmc-*'), + # Data files and librarries + 'package_data': { + 'openmc': ['_libopenmc.{}'.format(suffix)], + 'openmc.data': ['mass.mas12', 'fission_Q_data_endfb71.h5'] + }, + # Metadata 'author': 'Will Boyd', 'author_email': 'wbinventor@gmail.com', @@ -45,22 +58,16 @@ kwargs = {'name': 'openmc', if have_setuptools: kwargs.update({ # Required dependencies - 'install_requires': ['six', 'numpy>=1.9', 'h5py'], + 'install_requires': ['six', 'numpy>=1.9', 'h5py', 'scipy', 'pandas>=0.17.0'], # Optional dependencies 'extras_require': { 'decay': ['uncertainties'], - 'pandas': ['pandas>=0.17.0'], 'plot': ['matplotlib', 'ipython'], - 'sparse' : ['scipy'], 'vtk': ['vtk', 'silomesh'], 'validate': ['lxml'] }, - # Data files - 'package_data': { - 'openmc.data': ['mass.mas12', 'fission_Q_data_endfb71.h5'] - }, }) # If Cython is present, add resonance reconstruction capability diff --git a/src/api.F90 b/src/api.F90 new file mode 100644 index 000000000..d45360d28 --- /dev/null +++ b/src/api.F90 @@ -0,0 +1,895 @@ +module openmc_api + + use, intrinsic :: ISO_C_BINDING + + use hdf5, only: HID_T, h5tclose_f, h5close_f + + use constants, only: K_BOLTZMANN + use eigenvalue, only: k_sum, openmc_get_keff + use geometry, only: find_cell + use geometry_header, only: root_universe + use global + use hdf5_interface + use message_passing + use initialize, only: openmc_init + use input_xml, only: assign_0K_elastic_scattering, check_data_version + use particle_header, only: Particle + use plot, only: openmc_plot_geometry + use random_lcg, only: seed, initialize_prng + use simulation, only: openmc_run + use volume_calc, only: openmc_calculate_volumes + + implicit none + + private + public :: openmc_calculate_volumes + public :: openmc_cell_get_id + public :: openmc_cell_set_temperature + public :: openmc_finalize + public :: openmc_find + public :: openmc_get_cell + public :: openmc_get_keff + public :: openmc_get_material + public :: openmc_get_nuclide + public :: openmc_get_tally + public :: openmc_hard_reset + public :: openmc_init + public :: openmc_load_nuclide + public :: openmc_material_add_nuclide + public :: openmc_material_get_id + public :: openmc_material_get_densities + public :: openmc_material_set_density + public :: openmc_material_set_densities + public :: openmc_nuclide_name + public :: openmc_plot_geometry + public :: openmc_reset + public :: openmc_run + public :: openmc_tally_get_id + public :: openmc_tally_get_nuclides + public :: openmc_tally_results + public :: openmc_tally_set_nuclides + + ! Error codes + integer(C_INT), public, bind(C) :: E_UNASSIGNED = -1 + integer(C_INT), public, bind(C) :: E_OUT_OF_BOUNDS = -2 + integer(C_INT), public, bind(C) :: E_CELL_NOT_ALLOCATED = -3 + integer(C_INT), public, bind(C) :: E_CELL_INVALID_ID = -4 + integer(C_INT), public, bind(C) :: E_CELL_NOT_FOUND = -5 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_ALLOCATED = -6 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_LOADED = -7 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_IN_LIBRARY = -8 + integer(C_INT), public, bind(C) :: E_MATERIAL_NOT_ALLOCATED = -9 + integer(C_INT), public, bind(C) :: E_MATERIAL_INVALID_ID = -10 + integer(C_INT), public, bind(C) :: E_TALLY_NOT_ALLOCATED = -11 + integer(C_INT), public, bind(C) :: E_TALLY_INVALID_ID = -12 + integer(C_INT), public, bind(C) :: E_INVALID_SIZE = -13 + integer(C_INT), public, bind(C) :: E_CELL_NO_MATERIAL = -14 + + ! Warning codes + integer(C_INT), public, bind(C) :: W_BELOW_MIN_BOUND = 1 + integer(C_INT), public, bind(C) :: W_ABOVE_MAX_BOUND = 2 + +contains + +!=============================================================================== +! OPENMC_CELL_GET_ID returns the ID of a cell +!=============================================================================== + + function openmc_cell_get_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(cells)) then + id = cells(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_cell_get_id + +!=============================================================================== +! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell +!=============================================================================== + + function openmc_cell_set_temperature(index, T, instance) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index ! cell index in cells + real(C_DOUBLE), value, intent(in) :: T ! temperature + integer(C_INT32_T), optional, intent(in) :: instance ! cell instance + + integer(C_INT) :: err ! error code + integer :: j ! looping variable + integer :: n ! number of cell instances + integer :: material_ID ! material associated with cell + integer :: material_index ! material index in materials array + integer :: num_nuclides ! num nuclides in material + integer :: nuclide_index ! index of nuclide in nuclides array + real(8) :: min_temp ! min common-denominator avail temp + real(8) :: max_temp ! max common-denominator avail temp + real(8) :: temp ! actual temp we'll assign + logical :: outside_low ! lower than available data + logical :: outside_high ! higher than available data + + outside_low = .false. + outside_high = .false. + + err = E_UNASSIGNED + + if (index >= 1 .and. index <= size(cells)) then + + ! error if the cell is filled with another universe + if (cells(index) % fill /= NONE) then + err = E_CELL_NO_MATERIAL + else + ! find which material is associated with this cell + if (present(instance)) then + material_ID = cells(index) % material(instance) + else + material_ID = cells(index) % material(1) + end if + + ! index of that material into the materials array + material_index = material_dict % get_key(material_ID) + + ! number of nuclides associated with this material + num_nuclides = size(materials(material_index) % nuclide) + + min_temp = ZERO + max_temp = INFINITY + + do j = 1, num_nuclides + nuclide_index = materials(material_index) % nuclide(j) + min_temp = max(min_temp, minval(nuclides(nuclide_index) % kTs)) + max_temp = min(max_temp, maxval(nuclides(nuclide_index) % kTs)) + end do + + ! adjust the temperature to be within bounds if necessary + if (K_BOLTZMANN * T < min_temp) then + outside_low = .true. + temp = min_temp / K_BOLTZMANN + else if (K_BOLTZMANN * T > max_temp) then + outside_high = .true. + temp = max_temp / K_BOLTZMANN + else + temp = T + end if + + associate (c => cells(index)) + if (allocated(c % sqrtkT)) then + n = size(c % sqrtkT) + if (present(instance) .and. n > 1) then + if (instance >= 0 .and. instance < n) then + c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * temp) + err = 0 + end if + else + c % sqrtkT(:) = sqrt(K_BOLTZMANN * temp) + err = 0 + end if + end if + end associate + + ! Assign error codes for outside of temperature bounds provided the + ! temperature was changed correctly. This needs to be done after + ! changing the temperature based on the logical structure above. + if (err == 0) then + if (outside_low) err = W_BELOW_MIN_BOUND + if (outside_high) err = W_ABOVE_MAX_BOUND + end if + + end if + + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_cell_set_temperature + +!=============================================================================== +! OPENMC_FINALIZE frees up memory by deallocating arrays and resetting global +! variables +!=============================================================================== + + subroutine openmc_finalize() bind(C) + + integer :: err + + ! Clear results + call openmc_reset() + + ! Reset global variables + assume_separate = .false. + check_overlaps = .false. + confidence_intervals = .false. + create_fission_neutrons = .true. + energy_cutoff = ZERO + energy_max_neutron = INFINITY + energy_min_neutron = ZERO + entropy_on = .false. + gen_per_batch = 1 + i_user_tallies = -1 + i_cmfd_tallies = -1 + keff = ONE + legendre_to_tabular = .true. + legendre_to_tabular_points = 33 + n_batch_interval = 1 + n_filters = 0 + n_meshes = 0 + n_particles = 0 + n_source_points = 0 + n_state_points = 0 + n_tallies = 0 + n_user_filters = 0 + n_user_meshes = 0 + n_user_tallies = 0 + output_summary = .true. + output_tallies = .true. + particle_restart_run = .false. + pred_batches = .false. + reduce_tallies = .true. + res_scat_on = .false. + res_scat_method = RES_SCAT_ARES + res_scat_energy_min = 0.01_8 + res_scat_energy_max = 1000.0_8 + restart_run = .false. + root_universe = -1 + run_CE = .true. + run_mode = NONE + satisfy_triggers = .false. + seed = 1_8 + source_latest = .false. + source_separate = .false. + source_write = .true. + survival_biasing = .false. + temperature_default = 293.6_8 + temperature_method = TEMPERATURE_NEAREST + temperature_multipole = .false. + temperature_range = [ZERO, ZERO] + temperature_tolerance = 10.0_8 + total_gen = 0 + trigger_on = .false. + ufs = .false. + urr_ptables_on = .true. + verbosity = 7 + weight_cutoff = 0.25_8 + weight_survive = ONE + write_all_tracks = .false. + write_initial_source = .false. + + ! Deallocate arrays + call free_memory() + + ! Release compound datatypes + call h5tclose_f(hdf5_bank_t, err) + + ! Close FORTRAN interface. + call h5close_f(err) + +#ifdef MPI + ! Free all MPI types + call MPI_TYPE_FREE(MPI_BANK, err) +#endif + + end subroutine openmc_finalize + +!=============================================================================== +! OPENMC_FIND determines the ID or a cell or material at a given point in space +!=============================================================================== + + function openmc_find(xyz, rtype, id, instance) result(err) bind(C) + real(C_DOUBLE), intent(in) :: xyz(3) ! Cartesian point + integer(C_INT), intent(in), value :: rtype ! 1 for cell, 2 for material + integer(C_INT32_T), intent(out) :: id + integer(C_INT32_T), intent(out) :: instance + integer(C_INT) :: err + + logical :: found + type(Particle) :: p + + call p % initialize() + p % coord(1) % xyz(:) = xyz + p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] + call find_cell(p, found) + + id = -1 + instance = -1 + err = E_UNASSIGNED + + if (found) then + if (rtype == 1) then + id = cells(p % coord(p % n_coord) % cell) % id + elseif (rtype == 2) then + if (p % material == MATERIAL_VOID) then + id = 0 + else + id = materials(p % material) % id + end if + end if + instance = p % cell_instance - 1 + err = 0 + else + err = E_CELL_NOT_FOUND + end if + + end function openmc_find + +!=============================================================================== +! OPENMC_GET_CELL returns the index in the cells array of a cell with a given ID +!=============================================================================== + + function openmc_get_cell(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(cells)) then + if (cell_dict % has_key(id)) then + index = cell_dict % get_key(id) + err = 0 + else + err = E_CELL_INVALID_ID + end if + else + err = E_CELL_NOT_ALLOCATED + end if + end function openmc_get_cell + +!=============================================================================== +! OPENMC_GET_MATERIAL returns the index in the materials array of a material +! with a given ID +!=============================================================================== + + function openmc_get_material(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(materials)) then + if (material_dict % has_key(id)) then + index = material_dict % get_key(id) + err = 0 + else + err = E_MATERIAL_INVALID_ID + end if + else + err = E_MATERIAL_NOT_ALLOCATED + end if + end function openmc_get_material + +!=============================================================================== +! OPENMC_GET_NUCLIDE returns the index in the nuclides array of a nuclide +! with a given name +!=============================================================================== + + function openmc_get_nuclide(name, index) result(err) bind(C) + character(kind=C_CHAR), intent(in) :: name(*) + integer(C_INT), intent(out) :: index + integer(C_INT) :: err + + character(:), allocatable :: name_ + + ! Copy array of C_CHARs to normal Fortran string + name_ = to_f_string(name) + + if (allocated(nuclides)) then + if (nuclide_dict % has_key(to_lower(name_))) then + index = nuclide_dict % get_key(to_lower(name_)) + err = 0 + else + err = E_NUCLIDE_NOT_LOADED + end if + else + err = E_NUCLIDE_NOT_ALLOCATED + end if + end function openmc_get_nuclide + +!=============================================================================== +! OPENMC_GET_TALLY returns the index in the tallies array of a tally +! with a given ID +!=============================================================================== + + function openmc_get_tally(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(tallies)) then + if (tally_dict % has_key(id)) then + index = tally_dict % get_key(id) + err = 0 + else + err = E_TALLY_INVALID_ID + end if + else + err = E_TALLY_NOT_ALLOCATED + end if + end function openmc_get_tally + +!=============================================================================== +! OPENMC_HARD_RESET reset tallies and timers as well as the pseudorandom +! generator state +!=============================================================================== + + subroutine openmc_hard_reset() bind(C) + ! Reset all tallies and timers + call openmc_reset() + + ! Reset total generations and keff guess + keff = ONE + total_gen = 0 + + ! Reset the random number generator state + seed = 1_8 + call initialize_prng() + end subroutine openmc_hard_reset + +!=============================================================================== +! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library +!=============================================================================== + + function openmc_load_nuclide(name) result(err) bind(C) + character(kind=C_CHAR), intent(in) :: name(*) + integer(C_INT) :: err + + integer :: i_library + integer :: n + integer(HID_T) :: file_id + integer(HID_T) :: group_id + character(:), allocatable :: name_ + real(8) :: minmax(2) = [ZERO, INFINITY] + type(VectorReal) :: temperature + type(Nuclide), allocatable :: new_nuclides(:) + + ! Copy array of C_CHARs to normal Fortran string + name_ = to_f_string(name) + + err = 0 + if (.not. nuclide_dict % has_key(to_lower(name_))) then + if (library_dict % has_key(to_lower(name_))) then + ! allocate extra space in nuclides array + n = n_nuclides_total + allocate(new_nuclides(n + 1)) + new_nuclides(1:n) = nuclides(:) + call move_alloc(FROM=new_nuclides, TO=nuclides) + n = n + 1 + + i_library = library_dict % get_key(to_lower(name_)) + + ! Open file and make sure version is sufficient + file_id = file_open(libraries(i_library) % path, 'r') + call check_data_version(file_id) + + ! Read nuclide data from HDF5 + group_id = open_group(file_id, name_) + call nuclides(n) % from_hdf5(group_id, temperature, & + temperature_method, temperature_tolerance, minmax, & + master) + call close_group(group_id) + call file_close(file_id) + + ! Add entry to nuclide dictionary + call nuclide_dict % add_key(to_lower(name_), n) + n_nuclides_total = n + + ! Assign resonant scattering data + if (res_scat_on) call assign_0K_elastic_scattering(nuclides(n)) + + ! Initialize nuclide grid + call nuclides(n) % init_grid(energy_min_neutron, & + energy_max_neutron, n_log_bins) + else + err = E_NUCLIDE_NOT_IN_LIBRARY + end if + end if + + end function openmc_load_nuclide + +!=============================================================================== +! OPENMC_MATERIAL_ADD_NUCLIDE +!=============================================================================== + + function openmc_material_add_nuclide(index, name, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index + character(kind=C_CHAR) :: name(*) + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + integer :: j, k, n + real(8) :: awr + integer, allocatable :: new_nuclide(:) + real(8), allocatable :: new_density(:) + character(:), allocatable :: name_ + + name_ = to_f_string(name) + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + ! Check if nuclide is already in material + do j = 1, size(m % nuclide) + k = m % nuclide(j) + if (nuclides(k) % name == name_) then + awr = nuclides(k) % awr + m % density = m % density + density - m % atom_density(j) + m % density_gpcc = m % density_gpcc + (density - & + m % atom_density(j)) * awr * MASS_NEUTRON / N_AVOGADRO + m % atom_density(j) = density + err = 0 + end if + end do + + ! If nuclide wasn't found, extend nuclide/density arrays + if (err /= 0) then + ! If nuclide hasn't been loaded, load it now + err = openmc_load_nuclide(name) + + if (err == 0) then + ! Extend arrays + n = size(m % nuclide) + allocate(new_nuclide(n + 1)) + new_nuclide(1:n) = m % nuclide + call move_alloc(FROM=new_nuclide, TO=m % nuclide) + + allocate(new_density(n + 1)) + new_density(1:n) = m % atom_density + call move_alloc(FROM=new_density, TO=m % atom_density) + + ! Append new nuclide/density + k = nuclide_dict % get_key(to_lower(name_)) + m % nuclide(n + 1) = k + m % atom_density(n + 1) = density + m % density = m % density + density + m % density_gpcc = m % density_gpcc + & + density * nuclides(k) % awr * MASS_NEUTRON / N_AVOGADRO + m % n_nuclides = n + 1 + end if + end if + end associate + else + err = E_OUT_OF_BOUNDS + end if + + end function openmc_material_add_nuclide + +!=============================================================================== +! OPENMC_MATERIAL_GET_DENSITIES returns an array of nuclide densities in a +! material +!=============================================================================== + + function openmc_material_get_densities(index, nuclides, densities, n) & + result(err) bind(C) + integer(C_INT32_T), value :: index + type(C_PTR), intent(out) :: nuclides + type(C_PTR), intent(out) :: densities + integer(C_INT), intent(out) :: n + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + if (allocated(m % atom_density)) then + nuclides = C_LOC(m % nuclide(1)) + densities = C_LOC(m % atom_density(1)) + n = size(m % atom_density) + err = 0 + end if + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_material_get_densities + +!=============================================================================== +! OPENMC_MATERIAL_GET_ID returns the ID of a material +!=============================================================================== + + function openmc_material_get_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(materials)) then + id = materials(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_material_get_id + +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm +!=============================================================================== + + function openmc_material_set_density(index, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + err = m % set_density(density, nuclides) + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_material_set_density + +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITIES sets the densities for a list of nuclides in a +! material. If the nuclides don't already exist in the material, they will be +! added +!=============================================================================== + + function openmc_material_set_densities(index, n, name, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index + integer(C_INT), value, intent(in) :: n + type(C_PTR), intent(in) :: name(n) + real(C_DOUBLE), intent(in) :: density(n) + integer(C_INT) :: err + + integer :: i + character(C_CHAR), pointer :: string(:) + character(len=:, kind=C_CHAR), allocatable :: name_ + + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + ! If nuclide/density arrays are not correct size, reallocate + if (n /= size(m % nuclide)) then + deallocate(m % nuclide, m % atom_density, m % p0) + allocate(m % nuclide(n), m % atom_density(n), m % p0(n)) + end if + + do i = 1, n + ! Convert C string to Fortran string + call c_f_pointer(name(i), string, [10]) + name_ = to_lower(to_f_string(string)) + + if (.not. nuclide_dict % has_key(name_)) then + err = openmc_load_nuclide(string) + if (err < 0) return + end if + + m % nuclide(i) = nuclide_dict % get_key(name_) + m % atom_density(i) = density(i) + end do + m % n_nuclides = n + + ! Set isotropic flags to flags + m % p0(:) = .false. + + ! Set total density to the sum of the vector + err = m % set_density(sum(density), nuclides) + + ! Assign S(a,b) tables + call m % assign_sab_tables(nuclides, sab_tables) + end associate + else + err = E_OUT_OF_BOUNDS + end if + + end function openmc_material_set_densities + +!=============================================================================== +! OPENMC_NUCLIDE_NAME returns the name of a nuclide with a given index +!=============================================================================== + + function openmc_nuclide_name(index, name) result(err) bind(C) + integer(C_INT), value, intent(in) :: index + type(c_ptr), intent(out) :: name + integer(C_INT) :: err + + character(C_CHAR), pointer :: name_ + + err = E_UNASSIGNED + if (allocated(nuclides)) then + if (index >= 1 .and. index <= size(nuclides)) then + name_ => nuclides(index) % name(1:1) + name = C_LOC(name_) + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + else + err = E_NUCLIDE_NOT_ALLOCATED + end if + end function openmc_nuclide_name + +!=============================================================================== +! OPENMC_RESET resets tallies and timers +!=============================================================================== + + subroutine openmc_reset() bind(C) + integer :: i + + if (allocated(tallies)) then + do i = 1, size(tallies) + tallies(i) % n_realizations = 0 + if (allocated(tallies(i) % results)) then + tallies(i) % results(:, :, :) = ZERO + end if + end do + end if + + ! Reset global tallies + n_realizations = 0 + if (allocated(global_tallies)) then + global_tallies(:, :) = ZERO + end if + k_col_abs = ZERO + k_col_tra = ZERO + k_abs_tra = ZERO + k_sum(:) = ZERO + + ! Turn off tally flags + tallies_on = .false. + active_batches = .false. + + ! Clear active tally lists + call active_analog_tallies % clear() + call active_tracklength_tallies % clear() + call active_current_tallies % clear() + call active_collision_tallies % clear() + call active_tallies % clear() + + ! Reset timers + call time_total % reset() + call time_total % reset() + call time_initialize % reset() + call time_read_xs % reset() + call time_unionize % reset() + call time_bank % reset() + call time_bank_sample % reset() + call time_bank_sendrecv % reset() + call time_tallies % reset() + call time_inactive % reset() + call time_active % reset() + call time_transport % reset() + call time_finalize % reset() + + end subroutine openmc_reset + +!=============================================================================== +! OPENMC_TALLY_GET_ID returns the ID of a tally +!=============================================================================== + + function openmc_tally_get_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(tallies)) then + id = tallies(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_get_id + +!=============================================================================== +! OPENMC_TALLY_NUCLIDES returns the list of nuclides assigned to a tally +!=============================================================================== + + function openmc_tally_get_nuclides(index, nuclides, n) result(err) bind(C) + integer(C_INT32_T), value :: index + type(C_PTR), intent(out) :: nuclides + integer(C_INT), intent(out) :: n + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(tallies)) then + associate (t => tallies(index)) + if (allocated(t % nuclide_bins)) then + nuclides = C_LOC(t % nuclide_bins(1)) + n = size(t % nuclide_bins) + err = 0 + end if + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_get_nuclides + +!=============================================================================== +! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its +! shape. This allows a user to obtain in-memory tally results from Python +! directly. +!=============================================================================== + + function openmc_tally_results(index, ptr, shape_) result(err) bind(C) + integer(C_INT32_T), intent(in), value :: index + type(C_PTR), intent(out) :: ptr + integer(C_INT), intent(out) :: shape_(3) + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(tallies)) then + if (allocated(tallies(index) % results)) then + ptr = C_LOC(tallies(index) % results(1,1,1)) + shape_(:) = shape(tallies(index) % results) + err = 0 + end if + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_results + +!=============================================================================== +! OPENMC_TALLY_SET_NUCLIDES sets the nuclides in the tally which results should +! be scored for +!=============================================================================== + + function openmc_tally_set_nuclides(index, n, nuclides) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT), value :: n + type(C_PTR), intent(in) :: nuclides(n) + integer(C_INT) :: err + + integer :: i + character(C_CHAR), pointer :: string(:) + character(len=:, kind=C_CHAR), allocatable :: nuclide_ + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(tallies)) then + associate (t => tallies(index)) + if (allocated(t % nuclide_bins)) deallocate(t % nuclide_bins) + allocate(t % nuclide_bins(n)) + t % n_nuclide_bins = n + + do i = 1, n + ! Convert C string to Fortran string + call c_f_pointer(nuclides(i), string, [10]) + nuclide_ = to_lower(to_f_string(string)) + + select case (nuclide_) + case ('total') + t % nuclide_bins(i) = -1 + case default + if (nuclide_dict % has_key(nuclide_)) then + t % nuclide_bins(i) = nuclide_dict % get_key(nuclide_) + else + err = E_NUCLIDE_NOT_LOADED + return + end if + end select + end do + + ! Recalculate total number of scoring bins + t % total_score_bins = t % n_score_bins * t % n_nuclide_bins + + ! (Re)allocate results array + if (allocated(t % results)) deallocate(t % results) + allocate(t % results(3, t % total_score_bins, t % total_filter_bins)) + t % results(:,:,:) = ZERO + + err = 0 + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_set_nuclides + +!=============================================================================== +! TO_F_STRING takes a null-terminated array of C chars and turns it into a +! deferred-length character string. Yay Fortran 2003! +!=============================================================================== + + function to_f_string(c_string) result(f_string) + character(kind=C_CHAR), intent(in) :: c_string(*) + character(:), allocatable :: f_string + + integer :: i, n + + ! Determine length of original string + n = 0 + do while (c_string(n + 1) /= C_NULL_CHAR) + n = n + 1 + end do + + ! Copy C string character by character + allocate(character(len=n) :: f_string) + do i = 1, n + f_string(i:i) = c_string(i) + end do + end function to_f_string + +end module openmc_api diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index 0d4a9f4d3..e87bff930 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -108,6 +108,9 @@ contains real(8) :: hxyz(3) ! cell dimensions of current ijk cell real(8) :: vol ! volume of cell real(8),allocatable :: source(:,:,:,:) ! tmp source array for entropy +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif ! Get maximum of spatial and group indices nx = cmfd % indices(1) @@ -232,6 +235,9 @@ contains logical :: outside ! any source sites outside mesh logical :: in_mesh ! source site is inside mesh type(RegularMesh), pointer :: m ! point to mesh +#ifdef MPI + integer :: mpi_err +#endif ! Associate pointer m => meshes(n_user_meshes + 1) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index ce7d97133..83cb4ea25 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -2,7 +2,6 @@ module cross_section use algorithm, only: binary_search use constants - use energy_grid, only: log_spacing use error, only: fatal_error use global use list_header, only: ListElemInt @@ -36,6 +35,7 @@ contains integer :: i_grid ! index into logarithmic mapping array or material ! union grid real(8) :: atom_density ! atom density of a nuclide + real(8) :: sab_frac ! fraction of atoms affected by S(a,b) logical :: check_sab ! should we check for S(a,b) table? ! Set all material macroscopic cross sections to zero @@ -60,21 +60,25 @@ contains ! Add contribution from each nuclide in material do i = 1, mat % n_nuclides - ! ======================================================================== + ! ====================================================================== ! CHECK FOR S(A,B) TABLE i_sab = 0 + sab_frac = ZERO - ! Check if this nuclide matches one of the S(a,b) tables specified -- this - ! relies on i_sab_nuclides being in sorted order + ! Check if this nuclide matches one of the S(a,b) tables specified. + ! This relies on i_sab_nuclides being in sorted order if (check_sab) then if (i == mat % i_sab_nuclides(j)) then ! Get index in sab_tables i_sab = mat % i_sab_tables(j) + sab_frac = mat % sab_fracs(j) - ! If particle energy is greater than the highest energy for the S(a,b) - ! table, don't use the S(a,b) table - if (p % E > sab_tables(i_sab) % data(1) % threshold_inelastic) i_sab = 0 + ! If particle energy is greater than the highest energy for the + ! S(a,b) table, then don't use the S(a,b) table + if (p % E > sab_tables(i_sab) % data(1) % threshold_inelastic) then + i_sab = 0 + end if ! Increment position in i_sab_nuclides j = j + 1 @@ -84,7 +88,7 @@ contains end if end if - ! ======================================================================== + ! ====================================================================== ! CALCULATE MICROSCOPIC CROSS SECTION ! Determine microscopic cross sections for this nuclide @@ -92,13 +96,14 @@ contains ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E & - .or. p % sqrtkT /= micro_xs(i_nuclide) % last_sqrtkT) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, p % sqrtkT) - else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, p % sqrtkT) + .or. p % sqrtkT /= micro_xs(i_nuclide) % last_sqrtkT & + .or. i_sab /= micro_xs(i_nuclide) % index_sab & + .or. sab_frac /= micro_xs(i_nuclide) % sab_frac) then + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, & + p % sqrtkT, sab_frac) end if - ! ======================================================================== + ! ====================================================================== ! ADD TO MACROSCOPIC CROSS SECTION ! Copy atom density of nuclide in material @@ -133,13 +138,15 @@ contains ! given index in the nuclides array at the energy of the given particle !=============================================================================== - subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_log_union, sqrtkT) - integer, intent(in) :: i_nuclide ! index into nuclides array - integer, intent(in) :: i_sab ! index into sab_tables array - real(8), intent(in) :: E ! energy + subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_log_union, sqrtkT, & + sab_frac) + integer, intent(in) :: i_nuclide ! index into nuclides array + integer, intent(in) :: i_sab ! index into sab_tables array + real(8), intent(in) :: E ! energy integer, intent(in) :: i_log_union ! index into logarithmic mapping array or ! material union energy grid - real(8), intent(in) :: sqrtkT ! Square root of kT, material dependent + real(8), intent(in) :: sqrtkT ! square root of kT, material dependent + real(8), intent(in) :: sab_frac ! fraction of atoms affected by S(a,b) logical :: use_mp ! true if XS can be calculated with windowed multipole integer :: i_temp ! index for temperature @@ -243,8 +250,10 @@ contains micro_xs(i_nuclide) % interp_factor = f ! Initialize nuclide cross-sections to zero - micro_xs(i_nuclide) % fission = ZERO - micro_xs(i_nuclide) % nu_fission = ZERO + micro_xs(i_nuclide) % fission = ZERO + micro_xs(i_nuclide) % nu_fission = ZERO + micro_xs(i_nuclide) % thermal = ZERO + micro_xs(i_nuclide) % thermal_elastic = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * xs % total(i_grid) & @@ -271,20 +280,21 @@ contains end if ! Initialize sab treatment to false - micro_xs(i_nuclide) % index_sab = NONE - micro_xs(i_nuclide) % elastic_sab = ZERO + micro_xs(i_nuclide) % index_sab = NONE + micro_xs(i_nuclide) % sab_frac = ZERO ! Initialize URR probability table treatment to false - micro_xs(i_nuclide) % use_ptable = .false. + micro_xs(i_nuclide) % use_ptable = .false. - ! If there is S(a,b) data for this nuclide, we need to do a few - ! things. Since the total cross section was based on non-S(a,b) data, we - ! need to correct it by subtracting the non-S(a,b) elastic cross section and - ! then add back in the calculated S(a,b) elastic+inelastic cross section. + ! If there is S(a,b) data for this nuclide, we need to set the sab_scatter + ! and sab_elastic cross sections and correct the total and elastic cross + ! sections. - if (i_sab > 0) call calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT) + if (i_sab > 0) then + call calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT, sab_frac) + end if - ! if the particle is in the unresolved resonance range and there are + ! If the particle is in the unresolved resonance range and there are ! probability tables, we need to determine cross sections from the table if (urr_ptables_on .and. nuc % urr_present .and. .not. use_mp) then @@ -295,7 +305,6 @@ contains end if micro_xs(i_nuclide) % last_E = E - micro_xs(i_nuclide) % last_index_sab = i_sab micro_xs(i_nuclide) % last_sqrtkT = sqrtkT end associate @@ -303,16 +312,16 @@ contains !=============================================================================== ! CALCULATE_SAB_XS determines the elastic and inelastic scattering -! cross-sections in the thermal energy range. These cross sections replace -! whatever data were taken from the normal Nuclide table. +! cross-sections in the thermal energy range. These cross sections replace a +! fraction of whatever data were taken from the normal Nuclide table. !=============================================================================== - subroutine calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT) - + subroutine calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT, sab_frac) integer, intent(in) :: i_nuclide ! index into nuclides array integer, intent(in) :: i_sab ! index into sab_tables array real(8), intent(in) :: E ! energy real(8), intent(in) :: sqrtkT ! temperature + real(8), intent(in) :: sab_frac ! fraction of atoms affected by S(a,b) integer :: i_grid ! index on S(a,b) energy grid integer :: i_temp ! temperature index @@ -341,7 +350,8 @@ contains ! Randomly sample between temperature i and i+1 f = (kT - sab_tables(i_sab) % kTs(i_temp)) / & - (sab_tables(i_sab) % kTs(i_temp + 1) - sab_tables(i_sab) % kTs(i_temp)) + (sab_tables(i_sab) % kTs(i_temp + 1) & + - sab_tables(i_sab) % kTs(i_temp)) if (f > prn()) i_temp = i_temp + 1 end if @@ -402,16 +412,20 @@ contains end if end associate + ! Store the S(a,b) cross sections. + micro_xs(i_nuclide) % thermal = sab_frac * (elastic + inelastic) + micro_xs(i_nuclide) % thermal_elastic = sab_frac * elastic + ! Correct total and elastic cross sections - micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total - & - micro_xs(i_nuclide) % elastic + inelastic + elastic - micro_xs(i_nuclide) % elastic = inelastic + elastic + micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total & + + micro_xs(i_nuclide) % thermal & + - sab_frac * micro_xs(i_nuclide) % elastic + micro_xs(i_nuclide) % elastic = micro_xs(i_nuclide) % thermal & + + (ONE - sab_frac) * micro_xs(i_nuclide) % elastic - ! Store S(a,b) elastic cross section for sampling later - micro_xs(i_nuclide) % elastic_sab = elastic - - ! Save temperature index + ! Save temperature index and thermal fraction micro_xs(i_nuclide) % index_temp_sab = i_temp + micro_xs(i_nuclide) % sab_frac = sab_frac end subroutine calculate_sab_xs diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 86169d98d..accf80b31 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -1,5 +1,6 @@ module eigenvalue + use, intrinsic :: ISO_C_BINDING use algorithm, only: binary_search use constants, only: ZERO @@ -39,6 +40,7 @@ contains & temp_sites(:) ! local array of extra sites on each node #ifdef MPI + integer :: mpi_err ! MPI error code integer(8) :: n ! number of sites to send/recv integer :: neighbor ! processor to send/recv data from #ifdef MPIF08 @@ -95,8 +97,7 @@ contains ! skip ahead in the sequence using the starting index in the 'global' ! fission bank for each processor. - call set_particle_seed(int((current_batch - 1)*gen_per_batch + & - current_gen,8)) + call set_particle_seed(int(total_gen + overall_generation(), 8)) call advance_prn_seed(start) ! Determine how many fission sites we need to sample from the source bank @@ -371,20 +372,28 @@ contains subroutine calculate_generation_keff() + integer :: i ! overall generation +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif + ! Get keff for this generation by subtracting off the starting value keff_generation = global_tallies(RESULT_VALUE, K_TRACKLENGTH) - keff_generation + ! Determine overall generation + i = overall_generation() + #ifdef MPI ! Combine values across all processors - call MPI_ALLREDUCE(keff_generation, k_generation(overall_gen), 1, & - MPI_REAL8, MPI_SUM, mpi_intracomm, mpi_err) + call MPI_ALLREDUCE(keff_generation, k_generation(i), 1, MPI_REAL8, & + MPI_SUM, mpi_intracomm, mpi_err) #else - k_generation(overall_gen) = keff_generation + k_generation(i) = keff_generation #endif ! Normalize single batch estimate of k ! TODO: This should be normalized by total_weight, not by n_particles - k_generation(overall_gen) = k_generation(overall_gen) / n_particles + k_generation(i) = k_generation(i) / n_particles end subroutine calculate_generation_keff @@ -396,22 +405,24 @@ contains subroutine calculate_average_keff() + integer :: i ! overall generation within simulation integer :: n ! number of active generations real(8) :: alpha ! significance level for CI real(8) :: t_value ! t-value for confidence intervals - ! Determine number of active generations - n = overall_gen - n_inactive*gen_per_batch + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch if (n <= 0) then ! For inactive generations, use current generation k as estimate for next ! generation - keff = k_generation(overall_gen) + keff = k_generation(i) else ! Sample mean of keff - k_sum(1) = k_sum(1) + k_generation(overall_gen) - k_sum(2) = k_sum(2) + k_generation(overall_gen)**2 + k_sum(1) = k_sum(1) + k_generation(i) + k_sum(2) = k_sum(2) + k_generation(i)**2 ! Determine mean keff = k_sum(1) / n @@ -433,8 +444,8 @@ contains end subroutine calculate_average_keff !=============================================================================== -! CALCULATE_COMBINED_KEFF calculates a minimum variance estimate of k-effective -! based on a linear combination of the collision, absorption, and tracklength +! OPENMC_GET_KEFF calculates a minimum variance estimate of k-effective based on +! a linear combination of the collision, absorption, and tracklength ! estimates. The theory behind this can be found in M. Halperin, "Almost ! linearly-optimum combination of unbiased estimates," J. Am. Stat. Assoc., 56, ! 36-43 (1961), doi:10.1080/01621459.1961.10482088. The implementation here @@ -442,7 +453,9 @@ contains ! of keff confidence intervals in MCNP," Nucl. Technol., 111, 169-182 (1995). !=============================================================================== - subroutine calculate_combined_keff() + function openmc_get_keff(k_combined) result(err) bind(C) + real(C_DOUBLE), intent(out) :: k_combined(2) + integer(C_INT) :: err integer :: l ! loop index integer :: i, j, k ! indices referring to collision, absorption, or track @@ -453,9 +466,14 @@ contains real(8) :: g ! sum of weighting factors real(8) :: S(3) ! sums used for variance calculation + k_combined = ZERO + ! Make sure we have at least four realizations. Notice that at the end, ! there is a N-3 term in a denominator. - if (n_realizations <= 3) return + if (n_realizations <= 3) then + err = -1 + return + end if ! Initialize variables n = real(n_realizations, 8) @@ -517,7 +535,6 @@ contains ! Initialize variables g = ZERO S = ZERO - k_combined = ZERO do l = 1, 3 ! Permutations of estimates @@ -584,8 +601,9 @@ contains k_combined(2) = sqrt(k_combined(2)) end if + err = 0 - end subroutine calculate_combined_keff + end function openmc_get_keff !=============================================================================== ! COUNT_SOURCE_FOR_UFS determines the source fraction in each UFS mesh cell and @@ -600,6 +618,7 @@ contains logical :: sites_outside ! were there sites outside the ufs mesh? #ifdef MPI integer :: n ! total number of ufs mesh cells + integer :: mpi_err ! MPI error code #endif if (current_batch == 1 .and. current_gen == 1) then diff --git a/src/energy_grid.F90 b/src/energy_grid.F90 deleted file mode 100644 index 47408943e..000000000 --- a/src/energy_grid.F90 +++ /dev/null @@ -1,67 +0,0 @@ -module energy_grid - - use global - use list_header, only: ListReal - use output, only: write_message - - - implicit none - - integer :: grid_method ! how to treat the energy grid - integer :: n_log_bins ! number of bins for logarithmic grid - real(8) :: log_spacing ! spacing on logarithmic grid - -contains - -!=============================================================================== -! LOGARITHMIC_GRID determines a logarithmic mapping for energies to bounding -! indices on a nuclide energy grid -!=============================================================================== - - subroutine logarithmic_grid() - integer :: i, j, k ! Loop indices - integer :: t ! temperature index - integer :: M ! Number of equally log-spaced bins - real(8) :: E_max ! Maximum energy in MeV - real(8) :: E_min ! Minimum energy in MeV - real(8), allocatable :: umesh(:) ! Equally log-spaced energy grid - - ! Set minimum/maximum energies - E_max = energy_max_neutron - E_min = energy_min_neutron - - ! Determine equal-logarithmic energy spacing - M = n_log_bins - log_spacing = log(E_max/E_min)/M - - ! Create equally log-spaced energy grid - allocate(umesh(0:M)) - umesh(:) = [(i*log_spacing, i=0, M)] - - do i = 1, n_nuclides_total - associate (nuc => nuclides(i)) - do t = 1, size(nuc % grid) - ! Allocate logarithmic mapping for nuclide - allocate(nuc % grid(t) % grid_index(0:M)) - - ! Determine corresponding indices in nuclide grid to energies on - ! equal-logarithmic grid - j = 1 - do k = 0, M - do while (log(nuc % grid(t) % energy(j + 1)/E_min) <= umesh(k)) - ! Ensure that for isotopes where maxval(nuc % energy) << E_max - ! that there are no out-of-bounds issues. - if (j + 1 == size(nuc % grid(t) % energy)) exit - j = j + 1 - end do - nuc % grid(t) % grid_index(k) = j - end do - end do - end associate - end do - - deallocate(umesh) - - end subroutine logarithmic_grid - -end module energy_grid diff --git a/src/finalize.F90 b/src/finalize.F90 deleted file mode 100644 index 0f1af2356..000000000 --- a/src/finalize.F90 +++ /dev/null @@ -1,41 +0,0 @@ -module finalize - - use hdf5, only: h5tclose_f, h5close_f - - use global - use hdf5_interface, only: hdf5_bank_t - use message_passing - - implicit none - -contains - -!=============================================================================== -! FINALIZE_RUN does all post-simulation tasks such as calculating tally -! statistics and writing out tallies -!=============================================================================== - - subroutine openmc_finalize() - - integer :: hdf5_err - - ! Deallocate arrays - call free_memory() - - ! Release compound datatypes - call h5tclose_f(hdf5_bank_t, hdf5_err) - - ! Close FORTRAN interface. - call h5close_f(hdf5_err) - -#ifdef MPI - ! Free all MPI types - call MPI_TYPE_FREE(MPI_BANK, mpi_err) - - ! If MPI is in use and enabled, terminate it - call MPI_FINALIZE(mpi_err) -#endif - - end subroutine openmc_finalize - -end module finalize diff --git a/src/geometry.F90 b/src/geometry.F90 index c451b6127..7f75a817f 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -198,11 +198,9 @@ contains integer :: distribcell_index integer :: i_xyz(3) ! indices in lattice integer :: n ! number of cells to search - integer :: index_cell ! index in cells array + integer :: i_cell ! index in cells array + integer :: i_universe ! index in universes array logical :: use_search_cells ! use cells provided as argument - type(Cell), pointer :: c ! pointer to cell - class(Lattice), pointer :: lat ! pointer to lattice - type(Universe), pointer :: univ ! universe to search in do j = p % n_coord + 1, MAX_COORD call p % coord(j) % reset() @@ -210,172 +208,174 @@ contains j = p % n_coord ! set size of list to search + i_universe = p % coord(j) % universe if (present(search_cells)) then use_search_cells = .true. n = size(search_cells) else use_search_cells = .false. - univ => universes(p % coord(j) % universe) - n = size(univ % cells) + n = size(universes(i_universe) % cells) end if + found = .false. CELL_LOOP: do i = 1, n ! select cells based on whether we are searching a universe or a provided ! list of cells (this would be for lists of neighbor cells) if (use_search_cells) then - index_cell = search_cells(i) + i_cell = search_cells(i) ! check to make sure search cell is in same universe - if (cells(index_cell) % universe /= p % coord(j) % universe) cycle + if (cells(i_cell) % universe /= i_universe) cycle else - index_cell = univ % cells(i) + i_cell = universes(i_universe) % cells(i) end if - ! get pointer to cell - c => cells(index_cell) - ! Move on to the next cell if the particle is not inside this cell - if (.not. cell_contains(c, p)) cycle + if (cell_contains(cells(i_cell), p)) then + ! Set cell on this level + p % coord(j) % cell = i_cell - ! Set cell on this level - p % coord(j) % cell = index_cell + ! Show cell information on trace + if (verbosity >= 10 .or. trace) then + call write_message(" Entering cell " // trim(to_str(& + cells(i_cell) % id))) + end if - ! Show cell information on trace - if (verbosity >= 10 .or. trace) then - call write_message(" Entering cell " // trim(to_str(c % id))) + found = .true. + exit end if - - CELL_TYPE: if (c % type == FILL_MATERIAL) then - ! ====================================================================== - ! AT LOWEST UNIVERSE, TERMINATE SEARCH - - ! Save previous material and temperature - p % last_material = p % material - p % last_sqrtkT = p % sqrtkT - - ! Get distributed offset - if (size(c % material) > 1 .or. size(c % sqrtkT) > 1) then - ! Distributed instances of this cell have different - ! materials/temperatures. Determine which instance this is for - ! assigning the matching material/temperature. - distribcell_index = c % distribcell_index - offset = 0 - do k = 1, p % n_coord - if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then - offset = offset + cells(p % coord(k) % cell) % & - offset(distribcell_index) - elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then - if (lattices(p % coord(k + 1) % lattice) % obj & - % are_valid_indices([& - p % coord(k + 1) % lattice_x, & - p % coord(k + 1) % lattice_y, & - p % coord(k + 1) % lattice_z])) then - offset = offset + lattices(p % coord(k + 1) % lattice) % obj % & - offset(distribcell_index, & - p % coord(k + 1) % lattice_x, & - p % coord(k + 1) % lattice_y, & - p % coord(k + 1) % lattice_z) - end if - end if - end do - end if - - ! Save the material - if (size(c % material) > 1) then - p % material = c % material(offset + 1) - else - p % material = c % material(1) - end if - - ! Save the temperature - if (size(c % sqrtkT) > 1) then - p % sqrtkT = c % sqrtkT(offset + 1) - else - p % sqrtkT = c % sqrtkT(1) - end if - - elseif (c % type == FILL_UNIVERSE) then CELL_TYPE - ! ====================================================================== - ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - - ! Store lower level coordinates - p % coord(j + 1) % xyz = p % coord(j) % xyz - p % coord(j + 1) % uvw = p % coord(j) % uvw - - ! Move particle to next level and set universe - j = j + 1 - p % n_coord = j - p % coord(j) % universe = c % fill - - ! Apply translation - if (allocated(c % translation)) then - p % coord(j) % xyz = p % coord(j) % xyz - c % translation - end if - - ! Apply rotation - if (allocated(c % rotation_matrix)) then - p % coord(j) % xyz = matmul(c % rotation_matrix, p % coord(j) % xyz) - p % coord(j) % uvw = matmul(c % rotation_matrix, p % coord(j) % uvw) - p % coord(j) % rotated = .true. - end if - - call find_cell(p, found) - j = p % n_coord - if (.not. found) exit - - elseif (c % type == FILL_LATTICE) then CELL_TYPE - ! ====================================================================== - ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - - ! Set current lattice - lat => lattices(c % fill) % obj - - ! Determine lattice indices - i_xyz = lat % get_indices(p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw) - - ! Store lower level coordinates - p % coord(j + 1) % xyz = lat % get_local_xyz(p % coord(j) % xyz, i_xyz) - p % coord(j + 1) % uvw = p % coord(j) % uvw - - ! set particle lattice indices - p % coord(j + 1) % lattice = c % fill - p % coord(j + 1) % lattice_x = i_xyz(1) - p % coord(j + 1) % lattice_y = i_xyz(2) - p % coord(j + 1) % lattice_z = i_xyz(3) - - ! Set the next lowest coordinate level. - if (lat % are_valid_indices(i_xyz)) then - ! Particle is inside the lattice. - p % coord(j + 1) % universe = & - lat % universes(i_xyz(1), i_xyz(2), i_xyz(3)) - - else - ! Particle is outside the lattice. - if (lat % outer == NO_OUTER_UNIVERSE) then - call handle_lost_particle(p, "Particle " // trim(to_str(p %id)) & - // " is outside lattice " // trim(to_str(lat % id)) & - // " but the lattice has no defined outer universe.") - return - else - p % coord(j + 1) % universe = lat % outer - end if - end if - - ! Move particle to next level and search for the lower cells. - j = j + 1 - p % n_coord = j - - call find_cell(p, found) - j = p % n_coord - if (.not. found) exit - - end if CELL_TYPE - - ! Found cell so we can return - found = .true. - return end do CELL_LOOP - found = .false. + if (found) then + associate(c => cells(i_cell)) + CELL_TYPE: if (c % type == FILL_MATERIAL) then + ! ====================================================================== + ! AT LOWEST UNIVERSE, TERMINATE SEARCH + + ! Save previous material and temperature + p % last_material = p % material + p % last_sqrtkT = p % sqrtkT + + ! Get distributed offset + if (size(c % material) > 1 .or. size(c % sqrtkT) > 1) then + ! Distributed instances of this cell have different + ! materials/temperatures. Determine which instance this is for + ! assigning the matching material/temperature. + distribcell_index = c % distribcell_index + offset = 0 + do k = 1, p % n_coord + if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then + offset = offset + cells(p % coord(k) % cell) % & + offset(distribcell_index) + elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then + if (lattices(p % coord(k + 1) % lattice) % obj & + % are_valid_indices([& + p % coord(k + 1) % lattice_x, & + p % coord(k + 1) % lattice_y, & + p % coord(k + 1) % lattice_z])) then + offset = offset + lattices(p % coord(k + 1) % lattice) % obj % & + offset(distribcell_index, & + p % coord(k + 1) % lattice_x, & + p % coord(k + 1) % lattice_y, & + p % coord(k + 1) % lattice_z) + end if + end if + end do + + ! Keep track of which instance of the cell the particle is in + p % cell_instance = offset + 1 + else + p % cell_instance = 1 + end if + + ! Save the material + if (size(c % material) > 1) then + p % material = c % material(offset + 1) + else + p % material = c % material(1) + end if + + ! Save the temperature + if (size(c % sqrtkT) > 1) then + p % sqrtkT = c % sqrtkT(offset + 1) + else + p % sqrtkT = c % sqrtkT(1) + end if + + elseif (c % type == FILL_UNIVERSE) then CELL_TYPE + ! ====================================================================== + ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL + + ! Store lower level coordinates + p % coord(j + 1) % xyz = p % coord(j) % xyz + p % coord(j + 1) % uvw = p % coord(j) % uvw + + ! Move particle to next level and set universe + j = j + 1 + p % n_coord = j + p % coord(j) % universe = c % fill + + ! Apply translation + if (allocated(c % translation)) then + p % coord(j) % xyz = p % coord(j) % xyz - c % translation + end if + + ! Apply rotation + if (allocated(c % rotation_matrix)) then + p % coord(j) % xyz = matmul(c % rotation_matrix, p % coord(j) % xyz) + p % coord(j) % uvw = matmul(c % rotation_matrix, p % coord(j) % uvw) + p % coord(j) % rotated = .true. + end if + + call find_cell(p, found) + j = p % n_coord + + elseif (c % type == FILL_LATTICE) then CELL_TYPE + ! ====================================================================== + ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL + + associate (lat => lattices(c % fill) % obj) + ! Determine lattice indices + i_xyz = lat % get_indices(p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw) + + ! Store lower level coordinates + p % coord(j + 1) % xyz = lat % get_local_xyz(p % coord(j) % xyz, i_xyz) + p % coord(j + 1) % uvw = p % coord(j) % uvw + + ! set particle lattice indices + p % coord(j + 1) % lattice = c % fill + p % coord(j + 1) % lattice_x = i_xyz(1) + p % coord(j + 1) % lattice_y = i_xyz(2) + p % coord(j + 1) % lattice_z = i_xyz(3) + + ! Set the next lowest coordinate level. + if (lat % are_valid_indices(i_xyz)) then + ! Particle is inside the lattice. + p % coord(j + 1) % universe = & + lat % universes(i_xyz(1), i_xyz(2), i_xyz(3)) + + else + ! Particle is outside the lattice. + if (lat % outer == NO_OUTER_UNIVERSE) then + call handle_lost_particle(p, "Particle " // trim(to_str(p %id)) & + // " is outside lattice " // trim(to_str(lat % id)) & + // " but the lattice has no defined outer universe.") + return + else + p % coord(j + 1) % universe = lat % outer + end if + end if + end associate + + ! Move particle to next level and search for the lower cells. + j = j + 1 + p % n_coord = j + + call find_cell(p, found) + j = p % n_coord + + end if CELL_TYPE + end associate + end if end subroutine find_cell diff --git a/src/global.F90 b/src/global.F90 index e48480481..8343b49ac 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -43,11 +43,11 @@ module global type(VolumeCalculation), allocatable :: volume_calcs(:) ! Size of main arrays - integer :: n_cells ! # of cells + integer(C_INT32_T), bind(C) :: n_cells ! # of cells integer :: n_universes ! # of universes integer :: n_lattices ! # of lattices integer :: n_surfaces ! # of surfaces - integer :: n_materials ! # of materials + integer(C_INT32_T), bind(C) :: n_materials ! # of materials integer :: n_plots ! # of plots ! These dictionaries provide a fast lookup mechanism -- the key is the @@ -73,7 +73,8 @@ module global ! ============================================================================ ! CROSS SECTION RELATED VARIABLES NEEDED REGARDLESS OF CE OR MG - integer :: n_nuclides_total ! Number of nuclide cross section tables + ! Number of nuclide cross section tables + integer(C_INT), bind(C, name='n_nuclides') :: n_nuclides_total ! Cross section caches type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide @@ -81,6 +82,10 @@ module global ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict + type(DictCharInt) :: library_dict + + ! Cross section libraries + type(Library), allocatable :: libraries(:) ! ============================================================================ ! CONTINUOUS-ENERGY CROSS SECTION RELATED VARIABLES @@ -106,6 +111,10 @@ module global logical :: temperature_multipole = .false. real(8) :: temperature_tolerance = 10.0_8 real(8) :: temperature_default = 293.6_8 + real(8) :: temperature_range(2) = [ZERO, ZERO] + + integer :: n_log_bins ! number of bins for logarithmic grid + real(8) :: log_spacing ! spacing on logarithmic grid ! ============================================================================ ! MULTI-GROUP CROSS SECTION RELATED VARIABLES @@ -132,7 +141,7 @@ module global integer :: max_order ! Whether or not to convert Legendres to tabulars - logical :: legendre_to_tabular = .True. + logical :: legendre_to_tabular = .true. ! Number of points to use in the Legendre to tabular conversion integer :: legendre_to_tabular_points = 33 @@ -185,7 +194,7 @@ module global integer :: n_user_meshes = 0 ! # of structured user meshes integer :: n_filters = 0 ! # of filters integer :: n_user_filters = 0 ! # of user filters - integer :: n_tallies = 0 ! # of tallies + integer(C_INT32_T), bind(C) :: n_tallies = 0 ! # of tallies integer :: n_user_tallies = 0 ! # of user tallies ! Tally derivatives @@ -214,9 +223,9 @@ module global integer :: n_inactive ! # of inactive batches integer :: n_active ! # of active batches integer :: gen_per_batch = 1 ! # of generations per batch - integer :: current_batch = 0 ! current batch - integer :: current_gen = 0 ! current generation within a batch - integer :: overall_gen = 0 ! overall generation in the run + integer :: current_batch ! current batch + integer :: current_gen ! current generation within a batch + integer :: total_gen = 0 ! total number of generations simulated ! ============================================================================ ! TALLY PRECISION TRIGGER VARIABLES @@ -249,7 +258,6 @@ module global real(8) :: k_col_abs = ZERO ! sum over batches of k_collision * k_absorption real(8) :: k_col_tra = ZERO ! sum over batches of k_collision * k_tracklength real(8) :: k_abs_tra = ZERO ! sum over batches of k_absorption * k_tracklength - real(8) :: k_combined(2) ! combined best estimate of k-effective ! Shannon entropy logical :: entropy_on = .false. @@ -460,6 +468,7 @@ contains if (allocated(surfaces)) deallocate(surfaces) if (allocated(materials)) deallocate(materials) if (allocated(plots)) deallocate(plots) + if (allocated(volume_calcs)) deallocate(volume_calcs) ! Deallocate geometry debugging information if (allocated(overlap_check_cnt)) deallocate(overlap_check_cnt) @@ -472,6 +481,7 @@ contains end do deallocate(nuclides) end if + if (allocated(libraries)) deallocate(libraries) if (allocated(res_scat_nuclides)) deallocate(res_scat_nuclides) @@ -480,7 +490,6 @@ contains if (allocated(macro_xs)) deallocate(macro_xs) if (allocated(sab_tables)) deallocate(sab_tables) - if (allocated(micro_xs)) deallocate(micro_xs) ! Deallocate external source if (allocated(external_source)) deallocate(external_source) @@ -495,21 +504,24 @@ contains if (allocated(meshes)) deallocate(meshes) if (allocated(filters)) deallocate(filters) if (allocated(tallies)) deallocate(tallies) - if (allocated(filter_matches)) deallocate(filter_matches) ! Deallocate fission and source bank and entropy !$omp parallel if (allocated(fission_bank)) deallocate(fission_bank) + if (allocated(filter_matches)) deallocate(filter_matches) + if (allocated(tally_derivs)) deallocate(tally_derivs) !$omp end parallel #ifdef _OPENMP if (allocated(master_fission_bank)) deallocate(master_fission_bank) #endif if (allocated(source_bank)) deallocate(source_bank) - if (allocated(entropy_p)) deallocate(entropy_p) ! Deallocate array of work indices if (allocated(work_index)) deallocate(work_index) + if (allocated(energy_bins)) deallocate(energy_bins) + if (allocated(energy_bin_avg)) deallocate(energy_bin_avg) + ! Deallocate CMFD call deallocate_cmfd(cmfd) @@ -536,6 +548,7 @@ contains call plot_dict % clear() call nuclide_dict % clear() call sab_dict % clear() + call library_dict % clear() ! Clear statepoint and sourcepoint batch set call statepoint_batch % clear() @@ -563,4 +576,13 @@ contains end subroutine free_memory +!=============================================================================== +! OVERALL_GENERATION determines the overall generation number +!=============================================================================== + + pure function overall_generation() result(gen) + integer :: gen + gen = gen_per_batch*(current_batch - 1) + current_gen + end function overall_generation + end module global diff --git a/src/initialize.F90 b/src/initialize.F90 index e9718fee1..1e29c638c 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -11,7 +11,6 @@ module initialize use constants use dict_header, only: DictIntInt, ElemKeyValueII use set_header, only: SetInt - use energy_grid, only: logarithmic_grid, grid_method use error, only: fatal_error, warning use geometry, only: neighbor_lists, count_instance, calc_offsets, & maximum_levels @@ -46,11 +45,28 @@ contains ! setting up timers, etc. !=============================================================================== - subroutine openmc_init(intracomm) -#ifdef MPIF08 - type(MPI_Comm), intent(in) :: intracomm ! MPI intracommunicator -#else + subroutine openmc_init(intracomm) bind(C) integer, intent(in), optional :: intracomm ! MPI intracommunicator + + ! Copy the communicator to a new variable. This is done to avoid changing + ! the signature of this subroutine. If MPI is being used but no communicator + ! was passed, assume MPI_COMM_WORLD. +#ifdef MPI +#ifdef MPIF08 + type(MPI_Comm), intent(in) :: comm ! MPI intracommunicator + if (present(intracomm)) then + comm % MPI_VAL = intracomm + else + comm = MPI_COMM_WORLD + end if +#else + integer :: comm + if (present(intracomm)) then + comm = intracomm + else + comm = MPI_COMM_WORLD + end if +#endif #endif ! Start total and initialization timer @@ -59,7 +75,7 @@ contains #ifdef MPI ! Setup MPI - call initialize_mpi(intracomm) + call initialize_mpi(comm) #endif ! Initialize HDF5 interface @@ -101,12 +117,6 @@ contains end if if (run_mode /= MODE_PLOTTING) then - ! Construct information needed for nuclear data - if (run_CE) then - ! Construct log energy grid for cross-sections - call logarithmic_grid() - end if - ! Allocate and setup tally stride, filter_matches, and tally maps call configure_tallies() @@ -162,6 +172,7 @@ contains integer, intent(in) :: intracomm ! MPI intracommunicator #endif + integer :: mpi_err ! MPI error code integer :: bank_blocks(5) ! Count for each datatype #ifdef MPIF08 type(MPI_Datatype) :: bank_types(5) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index cfb80b4fa..efdc3e523 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -7,7 +7,6 @@ module input_xml use distribution_multivariate use distribution_univariate use endf, only: reaction_name - use energy_grid, only: grid_method, n_log_bins use error, only: fatal_error, warning use geometry_header, only: Cell, Lattice, RectLattice, HexLattice, & get_temperatures, root_universe @@ -951,6 +950,9 @@ contains if (check_for_node(root, "temperature_multipole")) then call get_node_value(root, "temperature_multipole", temperature_multipole) end if + if (check_for_node(root, "temperature_range")) then + call get_node_array(root, "temperature_range", temperature_range) + end if ! Check for tabular_legendre options if (check_for_node(root, "tabular_legendre")) then @@ -2068,8 +2070,6 @@ contains subroutine read_materials() integer :: i, j - type(DictCharInt) :: library_dict - type(Library), allocatable :: libraries(:) type(VectorReal), allocatable :: nuc_temps(:) ! List of T to read for each nuclide type(VectorReal), allocatable :: sab_temps(:) ! List of T to read for each S(a,b) real(8), allocatable :: material_temps(:) @@ -2158,9 +2158,9 @@ contains ! Now that the cross_sections.xml or mgxs.h5 has been located, read it in if (run_CE) then - call read_ce_cross_sections_xml(libraries) + call read_ce_cross_sections_xml() else - call read_mg_cross_sections_header(libraries) + call read_mg_cross_sections_header() end if ! Creating dictionary that maps the name of the material to the entry @@ -2181,7 +2181,7 @@ contains end if ! Parse data from materials.xml - call read_materials_xml(libraries, library_dict, material_temps) + call read_materials_xml(material_temps) ! Assign temperatures to cells that don't have temperatures already assigned call assign_temperatures(material_temps) @@ -2194,17 +2194,12 @@ contains ! Read continuous-energy cross sections if (run_CE .and. run_mode /= MODE_PLOTTING) then call time_read_xs % start() - call read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) + call read_ce_cross_sections(nuc_temps, sab_temps) call time_read_xs % stop() end if - - ! Clear dictionary - call library_dict % clear() end subroutine read_materials - subroutine read_materials_xml(libraries, library_dict, material_temps) - type(Library), intent(in) :: libraries(:) - type(DictCharInt), intent(inout) :: library_dict + subroutine read_materials_xml(material_temps) real(8), allocatable, intent(out) :: material_temps(:) integer :: i ! loop index for materials @@ -2565,6 +2560,7 @@ contains ! table is indeed applied to multiple nuclides. allocate(mat % sab_names(n_sab)) allocate(mat % i_sab_tables(n_sab)) + allocate(mat % sab_fracs(n_sab)) do j = 1, n_sab ! Get pointer to S(a,b) table @@ -2578,6 +2574,13 @@ contains name = trim(name) mat % sab_names(j) = name + ! Read the fraction of nuclei affected by this S(a,b) table + if (check_for_node(node_sab, "fraction")) then + call get_node_value(node_sab, "fraction", mat % sab_fracs(j)) + else + mat % sab_fracs(j) = ONE + end if + ! Check that this nuclide is listed in the cross_sections.xml file if (.not. library_dict % has_key(to_lower(name))) then call fatal_error("Could not find S(a,b) table " // trim(name) & @@ -3372,6 +3375,15 @@ contains ! ======================================================================= ! READ DATA FOR FILTERS + ! Check if user is using old XML format and throw an error if so + if (check_for_node(node_tal, "filter")) then + call fatal_error("Tally filters must be specified independently of & + &tallies in a element. The element itself should & + &have a list of filters that apply, e.g., 1 2 & + &where 1 and 2 are the IDs of filters specified outside of & + &.") + end if + ! Determine number of filters if (check_for_node(node_tal, "filters")) then n_filter = node_word_count(node_tal, "filters") @@ -4813,9 +4825,7 @@ contains ! file contains a listing of the CE and MG cross sections that may be used. !=============================================================================== - subroutine read_ce_cross_sections_xml(libraries) - type(Library), allocatable, intent(out) :: libraries(:) - + subroutine read_ce_cross_sections_xml() integer :: i ! loop index integer :: n integer :: n_libraries @@ -4918,9 +4928,7 @@ contains end subroutine read_ce_cross_sections_xml - subroutine read_mg_cross_sections_header(libraries) - type(Library), allocatable, intent(out) :: libraries(:) - + subroutine read_mg_cross_sections_header() integer :: i ! loop index integer :: n_libraries logical :: file_exists ! does mgxs.h5 exist? @@ -5161,103 +5169,7 @@ contains end subroutine normalize_ao -!=============================================================================== -! ASSIGN_SAB_TABLES assigns S(alpha,beta) tables to specific nuclides within -! materials so the code knows when to apply bound thermal scattering data -!=============================================================================== - - subroutine assign_sab_tables() - integer :: i ! index in materials array - integer :: j ! index over nuclides in material - integer :: k ! index over S(a,b) tables in material - integer :: m ! position for sorting - integer :: temp_nuclide ! temporary value for sorting - integer :: temp_table ! temporary value for sorting - logical :: found - type(VectorInt) :: i_sab_tables - type(VectorInt) :: i_sab_nuclides - - do i = 1, size(materials) - ! Skip materials with no S(a,b) tables - if (.not. allocated(materials(i) % i_sab_tables)) cycle - - associate (mat => materials(i)) - - ASSIGN_SAB: do k = 1, size(mat % i_sab_tables) - ! In order to know which nuclide the S(a,b) table applies to, we need - ! to search through the list of nuclides for one which has a matching - ! name - found = .false. - associate (sab => sab_tables(mat % i_sab_tables(k))) - FIND_NUCLIDE: do j = 1, size(mat % nuclide) - if (any(sab % nuclides == nuclides(mat % nuclide(j)) % name)) then - call i_sab_tables % push_back(mat % i_sab_tables(k)) - call i_sab_nuclides % push_back(j) - found = .true. - end if - end do FIND_NUCLIDE - end associate - - ! Check to make sure S(a,b) table matched a nuclide - if (.not. found) then - call fatal_error("S(a,b) table " // trim(mat % & - sab_names(k)) // " did not match any nuclide on material " & - // trim(to_str(mat % id))) - end if - end do ASSIGN_SAB - - ! Update i_sab_tables and i_sab_nuclides - deallocate(mat % i_sab_tables) - m = i_sab_tables % size() - allocate(mat % i_sab_tables(m)) - allocate(mat % i_sab_nuclides(m)) - mat % i_sab_tables(:) = i_sab_tables % data(1:m) - mat % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) - - ! Clear entries in vectors for next material - call i_sab_tables % clear() - call i_sab_nuclides % clear() - - ! If there are multiple S(a,b) tables, we need to make sure that the - ! entries in i_sab_nuclides are sorted or else they won't be applied - ! correctly in the cross_section module. The algorithm here is a simple - ! insertion sort -- don't need anything fancy! - - if (size(mat % i_sab_tables) > 1) then - SORT_SAB: do k = 2, size(mat % i_sab_tables) - ! Save value to move - m = k - temp_nuclide = mat % i_sab_nuclides(k) - temp_table = mat % i_sab_tables(k) - - MOVE_OVER: do - ! Check if insertion value is greater than (m-1)th value - if (temp_nuclide >= mat % i_sab_nuclides(m-1)) exit - - ! Move values over until hitting one that's not larger - mat % i_sab_nuclides(m) = mat % i_sab_nuclides(m-1) - mat % i_sab_tables(m) = mat % i_sab_tables(m-1) - m = m - 1 - - ! Exit if we've reached the beginning of the list - if (m == 1) exit - end do MOVE_OVER - - ! Put the original value into its new position - mat % i_sab_nuclides(m) = temp_nuclide - mat % i_sab_tables(m) = temp_table - end do SORT_SAB - end if - - ! Deallocate temporary arrays for names of nuclides and S(a,b) tables - if (allocated(mat % names)) deallocate(mat % names) - end associate - end do - end subroutine assign_sab_tables - - subroutine read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) - type(Library), intent(in) :: libraries(:) - type(DictCharInt), intent(inout) :: library_dict + subroutine read_ce_cross_sections(nuc_temps, sab_temps) type(VectorReal), intent(in) :: nuc_temps(:) type(VectorReal), intent(in) :: sab_temps(:) @@ -5273,9 +5185,6 @@ contains allocate(nuclides(n_nuclides_total)) allocate(sab_tables(n_sab_tables)) -!$omp parallel - allocate(micro_xs(n_nuclides_total)) -!$omp end parallel ! Read cross sections do i = 1, size(materials) @@ -5296,7 +5205,8 @@ contains ! Read nuclide data from HDF5 group_id = open_group(file_id, name) call nuclides(i_nuclide) % from_hdf5(group_id, nuc_temps(i_nuclide), & - temperature_method, temperature_tolerance, master) + temperature_method, temperature_tolerance, temperature_range, & + master) call close_group(group_id) call file_close(file_id) @@ -5326,6 +5236,13 @@ contains end do end do + ! Set up logarithmic grid for nuclides + do i = 1, size(nuclides) + call nuclides(i) % init_grid(energy_min_neutron, & + energy_max_neutron, n_log_bins) + end do + log_spacing = log(energy_max_neutron/energy_min_neutron) / n_log_bins + do i = 1, size(materials) ! Skip materials with no S(a,b) tables if (.not. allocated(materials(i) % sab_names)) cycle @@ -5348,7 +5265,7 @@ contains ! Read S(a,b) data from HDF5 group_id = open_group(file_id, name) call sab_tables(i_sab) % from_hdf5(group_id, sab_temps(i_sab), & - temperature_method, temperature_tolerance) + temperature_method, temperature_tolerance, temperature_range) call close_group(group_id) call file_close(file_id) @@ -5356,10 +5273,10 @@ contains call already_read % add(name) end if end do - end do - ! Associate S(a,b) tables with specific nuclides - call assign_sab_tables() + ! Associate S(a,b) tables with specific nuclides + call materials(i) % assign_sab_tables(nuclides, sab_tables) + end do ! Show which nuclide results in lowest energy for neutron transport do i = 1, size(nuclides) diff --git a/src/main.F90 b/src/main.F90 index 1cd3a9e54..fadf9f3bb 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -1,20 +1,25 @@ program main use constants - use finalize, only: openmc_finalize use global - use initialize, only: openmc_init use message_passing - use particle_restart, only: run_particle_restart - use plot, only: run_plot - use simulation, only: run_simulation - use volume_calc, only: run_volume_calculations + use openmc_api, only: openmc_init, openmc_finalize, openmc_run, & + openmc_plot_geometry, openmc_calculate_volumes + use particle_restart, only: run_particle_restart implicit none +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif + ! Initialize run -- when run with MPI, pass communicator #ifdef MPI +#ifdef MPIF08 + call openmc_init(MPI_COMM_WORLD % MPI_VAL) +#else call openmc_init(MPI_COMM_WORLD) +#endif #else call openmc_init() #endif @@ -22,16 +27,22 @@ program main ! start problem based on mode select case (run_mode) case (MODE_FIXEDSOURCE, MODE_EIGENVALUE) - call run_simulation() + call openmc_run() case (MODE_PLOTTING) - call run_plot() + call openmc_plot_geometry() case (MODE_PARTICLE) if (master) call run_particle_restart() case (MODE_VOLUME) - call run_volume_calculations() + call openmc_calculate_volumes() end select ! finalize run call openmc_finalize() +#ifdef MPI + ! If MPI is in use and enabled, terminate it + call MPI_FINALIZE(mpi_err) +#endif + + end program main diff --git a/src/material_header.F90 b/src/material_header.F90 index fdc36548f..5d45c40d6 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -1,5 +1,12 @@ module material_header + use constants + use error, only: fatal_error + use nuclide_header, only: Nuclide + use sab_header, only: SAlphaBeta + use stl_vector, only: VectorReal, VectorInt + use string, only: to_str + implicit none !=============================================================================== @@ -22,10 +29,11 @@ module material_header ! Unionized energy grid information integer, allocatable :: nuclide_grid_index(:,:) ! nuclide e_grid pointers - ! S(a,b) data references + ! S(a,b) data integer :: n_sab = 0 ! number of S(a,b) tables integer, allocatable :: i_sab_nuclides(:) ! index of corresponding nuclide integer, allocatable :: i_sab_tables(:) ! index in sab_tables + real(8), allocatable :: sab_fracs(:) ! how often to use S(a,b) ! Temporary names read during initialization character(20), allocatable :: names(:) ! isotope names @@ -38,6 +46,163 @@ module material_header ! enforce isotropic scattering in lab logical, allocatable :: p0(:) + contains + procedure :: set_density => material_set_density + procedure :: assign_sab_tables => material_assign_sab_tables end type Material +contains + +!=============================================================================== +! MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm. +!=============================================================================== + + function material_set_density(m, density, nuclides) result(err) + class(Material), intent(inout) :: m + real(8), intent(in) :: density + type(Nuclide), intent(in) :: nuclides(:) + integer :: err + + integer :: i + real(8) :: sum_percent + real(8) :: awr + + err = -1 + if (allocated(m % atom_density)) then + ! Set total density based on value provided + m % density = density + + ! Determine normalized atom percents + sum_percent = sum(m % atom_density) + m % atom_density(:) = m % atom_density / sum_percent + + ! Recalculate nuclide atom densities based on given density + m % atom_density(:) = density * m % atom_density + + ! Calculate density in g/cm^3. + m % density_gpcc = ZERO + do i = 1, m % n_nuclides + awr = nuclides(m % nuclide(i)) % awr + m % density_gpcc = m % density_gpcc & + + m % atom_density(i) * awr * MASS_NEUTRON / N_AVOGADRO + end do + err = 0 + end if + end function material_set_density + +!=============================================================================== +! ASSIGN_SAB_TABLES assigns S(alpha,beta) tables to specific nuclides within +! materials so the code knows when to apply bound thermal scattering data +!=============================================================================== + + subroutine material_assign_sab_tables(this, nuclides, sab_tables) + class(Material), intent(inout) :: this + type(Nuclide), intent(in) :: nuclides(:) + type(SAlphaBeta), intent(in) :: sab_tables(:) + + integer :: j ! index over nuclides in material + integer :: k ! index over S(a,b) tables in material + integer :: m ! position for sorting + integer :: temp_nuclide ! temporary value for sorting + integer :: temp_table ! temporary value for sorting + real(8) :: temp_frac ! temporary value for sorting + logical :: found + type(VectorInt) :: i_sab_tables + type(VectorInt) :: i_sab_nuclides + type(VectorReal) :: sab_fracs + + if (.not. allocated(this % i_sab_tables)) return + + ASSIGN_SAB: do k = 1, size(this % i_sab_tables) + ! In order to know which nuclide the S(a,b) table applies to, we need + ! to search through the list of nuclides for one which has a matching + ! name + found = .false. + associate (sab => sab_tables(this % i_sab_tables(k))) + FIND_NUCLIDE: do j = 1, size(this % nuclide) + if (any(sab % nuclides == nuclides(this % nuclide(j)) % name)) then + call i_sab_tables % push_back(this % i_sab_tables(k)) + call i_sab_nuclides % push_back(j) + call sab_fracs % push_back(this % sab_fracs(k)) + found = .true. + end if + end do FIND_NUCLIDE + end associate + + ! Check to make sure S(a,b) table matched a nuclide + if (.not. found) then + call fatal_error("S(a,b) table " // trim(this % & + sab_names(k)) // " did not match any nuclide on material " & + // trim(to_str(this % id))) + end if + end do ASSIGN_SAB + + ! Make sure each nuclide only appears in one table. + do j = 1, i_sab_nuclides % size() + do k = j+1, i_sab_nuclides % size() + if (i_sab_nuclides % data(j) == i_sab_nuclides % data(k)) then + call fatal_error(trim( & + nuclides(this % nuclide(i_sab_nuclides % data(j))) % name) & + // " in material " // trim(to_str(this % id)) // " was found & + &in multiple S(a,b) tables. Each nuclide can only appear in & + &one S(a,b) table per material.") + end if + end do + end do + + ! Update i_sab_tables and i_sab_nuclides + deallocate(this % i_sab_tables) + deallocate(this % sab_fracs) + if (allocated(this % i_sab_nuclides)) deallocate(this % i_sab_nuclides) + m = i_sab_tables % size() + allocate(this % i_sab_tables(m)) + allocate(this % i_sab_nuclides(m)) + allocate(this % sab_fracs(m)) + this % i_sab_tables(:) = i_sab_tables % data(1:m) + this % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) + this % sab_fracs(:) = sab_fracs % data(1:m) + + ! Clear entries in vectors for next material + call i_sab_tables % clear() + call i_sab_nuclides % clear() + call sab_fracs % clear() + + ! If there are multiple S(a,b) tables, we need to make sure that the + ! entries in i_sab_nuclides are sorted or else they won't be applied + ! correctly in the cross_section module. The algorithm here is a simple + ! insertion sort -- don't need anything fancy! + + if (size(this % i_sab_tables) > 1) then + SORT_SAB: do k = 2, size(this % i_sab_tables) + ! Save value to move + m = k + temp_nuclide = this % i_sab_nuclides(k) + temp_table = this % i_sab_tables(k) + temp_frac = this % i_sab_tables(k) + + MOVE_OVER: do + ! Check if insertion value is greater than (m-1)th value + if (temp_nuclide >= this % i_sab_nuclides(m-1)) exit + + ! Move values over until hitting one that's not larger + this % i_sab_nuclides(m) = this % i_sab_nuclides(m-1) + this % i_sab_tables(m) = this % i_sab_tables(m-1) + this % sab_fracs(m) = this % sab_fracs(m-1) + m = m - 1 + + ! Exit if we've reached the beginning of the list + if (m == 1) exit + end do MOVE_OVER + + ! Put the original value into its new position + this % i_sab_nuclides(m) = temp_nuclide + this % i_sab_tables(m) = temp_table + this % sab_fracs(m) = temp_frac + end do SORT_SAB + end if + + ! Deallocate temporary arrays for names of nuclides and S(a,b) tables + if (allocated(this % names)) deallocate(this % names) + end subroutine material_assign_sab_tables + end module material_header diff --git a/src/mesh.F90 b/src/mesh.F90 index b778cbdf0..c25e3f7a6 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -137,21 +137,22 @@ contains real(8), intent(in), optional :: energies(:) ! energy grid to search integer(8), intent(in), optional :: size_bank ! # of bank sites (on each proc) logical, intent(inout), optional :: sites_outside ! were there sites outside mesh? + real(8), allocatable :: cnt_(:,:,:,:) integer :: i ! loop index for local fission sites integer :: n_sites ! size of bank array integer :: ijk(3) ! indices on mesh - integer :: n_groups ! number of groups in energies + integer :: n ! number of energy groups / size integer :: e_bin ! energy_bin +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif logical :: in_mesh ! was single site outside mesh? logical :: outside ! was any site outside mesh? -#ifdef MPI - integer :: n ! total size of count variable - real(8) :: dummy ! temporary receive buffer for non-root reductions -#endif ! initialize variables - cnt = ZERO + allocate(cnt_(size(cnt,1), size(cnt,2), size(cnt,3), size(cnt,4))) + cnt_ = ZERO outside = .false. ! Set size of bank @@ -163,9 +164,9 @@ contains ! Determine number of energies in group structure if (present(energies)) then - n_groups = size(energies) - 1 + n = size(energies) - 1 else - n_groups = 1 + n = 1 end if ! loop over fission sites and count how many are in each mesh box @@ -183,42 +184,33 @@ contains if (present(energies)) then if (bank_array(i) % E < energies(1)) then e_bin = 1 - elseif (bank_array(i) % E > energies(n_groups+1)) then - e_bin = n_groups + elseif (bank_array(i) % E > energies(n + 1)) then + e_bin = n else - e_bin = binary_search(energies, n_groups + 1, bank_array(i) % E) + e_bin = binary_search(energies, n + 1, bank_array(i) % E) end if else e_bin = 1 end if ! add to appropriate mesh box - cnt(e_bin,ijk(1),ijk(2),ijk(3)) = cnt(e_bin,ijk(1),ijk(2),ijk(3)) + & + cnt_(e_bin,ijk(1),ijk(2),ijk(3)) = cnt_(e_bin,ijk(1),ijk(2),ijk(3)) + & bank_array(i) % wgt end do FISSION_SITES #ifdef MPI - ! determine total number of mesh cells - n = n_groups * size(cnt,2) * size(cnt,3) * size(cnt,4) - ! collect values from all processors - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, cnt, n, MPI_REAL8, MPI_SUM, 0, & - mpi_intracomm, mpi_err) - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(cnt, dummy, n, MPI_REAL8, MPI_SUM, 0, & - mpi_intracomm, mpi_err) - end if + n = size(cnt_) + call MPI_REDUCE(cnt_, cnt, n, MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) ! Check if there were sites outside the mesh for any processor if (present(sites_outside)) then call MPI_REDUCE(outside, sites_outside, 1, MPI_LOGICAL, MPI_LOR, 0, & mpi_intracomm, mpi_err) end if - #else sites_outside = outside + cnt = cnt_ #endif end subroutine count_bank_sites diff --git a/src/message_passing.F90 b/src/message_passing.F90 index 6c13b00e8..0f2b94d1a 100644 --- a/src/message_passing.F90 +++ b/src/message_passing.F90 @@ -16,7 +16,6 @@ module message_passing integer :: rank = 0 ! rank of process logical :: master = .true. ! master process? logical :: mpi_enabled = .false. ! is MPI in use and initialized? - integer :: mpi_err ! MPI error code #ifdef MPIF08 type(MPI_Datatype) :: MPI_BANK ! MPI datatype for fission bank type(MPI_Comm) :: mpi_intracomm ! MPI intra-communicator diff --git a/src/mgxs_data.F90 b/src/mgxs_data.F90 index a43d45c0e..ad20aca83 100644 --- a/src/mgxs_data.F90 +++ b/src/mgxs_data.F90 @@ -73,9 +73,6 @@ contains ! allocate arrays for MGXS storage and cross section cache allocate(nuclides_MG(n_nuclides_total)) -!$omp parallel - allocate(micro_xs(n_nuclides_total)) -!$omp end parallel ! ========================================================================== ! READ ALL MGXS CROSS SECTION TABLES diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index ea6eab328..bf1ea97b2 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -97,38 +97,41 @@ module nuclide_header contains procedure :: clear => nuclide_clear procedure :: from_hdf5 => nuclide_from_hdf5 + procedure :: init_grid => nuclide_init_grid procedure :: nu => nuclide_nu procedure, private :: create_derived => nuclide_create_derived end type Nuclide !=============================================================================== -! NUCLIDEMICROXS contains cached microscopic cross sections for a -! particular nuclide at the current energy +! NUCLIDEMICROXS contains cached microscopic cross sections for a particular +! nuclide at the current energy !=============================================================================== type NuclideMicroXS - integer :: index_grid ! index on nuclide energy grid - integer :: index_temp ! temperature index for nuclide - real(8) :: last_E = ZERO ! last evaluated energy - real(8) :: interp_factor ! interpolation factor on nuc. energy grid - real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs - real(8) :: absorption ! microscopic absorption xs - real(8) :: fission ! microscopic fission xs - real(8) :: nu_fission ! microscopic production xs + ! Microscopic cross sections in barns + real(8) :: total + real(8) :: elastic ! If sab_frac is not 1 or 0, then this value is + ! averaged over bound and non-bound nuclei + real(8) :: absorption + real(8) :: fission + real(8) :: nu_fission + real(8) :: thermal ! Bound thermal elastic & inelastic scattering + real(8) :: thermal_elastic ! Bound thermal elastic scattering - ! Information for S(a,b) use - integer :: index_sab ! index in sab_tables (zero means no table) - integer :: last_index_sab = 0 ! index in sab_tables last used by this nuclide - integer :: index_temp_sab ! temperature index for sab_tables - real(8) :: elastic_sab ! microscopic elastic scattering on S(a,b) table + ! Indicies and factors needed to compute cross sections from the data tables + integer :: index_grid ! Index on nuclide energy grid + integer :: index_temp ! Temperature index for nuclide + real(8) :: interp_factor ! Interpolation factor on nuc. energy grid + integer :: index_sab = NONE ! Index in sab_tables + integer :: index_temp_sab ! Temperature index for sab_tables + real(8) :: sab_frac ! Fraction of atoms affected by S(a,b) + logical :: use_ptable ! In URR range with probability tables? - ! Information for URR probability table use - logical :: use_ptable ! in URR range with probability tables? - - ! Information for Doppler broadening + ! Energy and temperature last used to evaluate these cross sections. If + ! these values have changed, then the cross sections must be re-evaluated. + real(8) :: last_E = ZERO ! Last evaluated energy real(8) :: last_sqrtkT = ZERO ! Last temperature in sqrt(Boltzmann - ! constant * temperature (eV)) + ! constant * temperature (eV)) end type NuclideMicroXS !=============================================================================== @@ -168,12 +171,13 @@ module nuclide_header end subroutine nuclide_clear subroutine nuclide_from_hdf5(this, group_id, temperature, method, tolerance, & - master) + minmax, master) class(Nuclide), intent(inout) :: this integer(HID_T), intent(in) :: group_id - type(VectorReal), intent(in) :: temperature ! list of desired temperatures + type(VectorReal), intent(in) :: temperature ! list of desired temperatures integer, intent(inout) :: method real(8), intent(in) :: tolerance + real(8), intent(in) :: minmax(2) ! range of temperatures logical, intent(in) :: master ! if this is the master proc integer :: i @@ -233,7 +237,18 @@ module nuclide_header method = TEMPERATURE_NEAREST end if - ! Determine actual temperatures to read + ! Determine actual temperatures to read -- start by checking whether a + ! temperature range was given, in which case all temperatures in the range + ! are loaded irrespective of what temperatures actually appear in the model + if (minmax(2) > ZERO) then + do i = 1, size(temps_available) + temp_actual = temps_available(i) + if (minmax(1) <= temp_actual .and. temp_actual <= minmax(2)) then + call temps_to_read % push_back(nint(temp_actual)) + end if + end do + end if + select case (method) case (TEMPERATURE_NEAREST) ! Find nearest temperatures @@ -671,4 +686,42 @@ module nuclide_header end function nuclide_nu + subroutine nuclide_init_grid(this, E_min, E_max, M) + class(Nuclide), intent(inout) :: this + real(8), intent(in) :: E_min ! Minimum energy in MeV + real(8), intent(in) :: E_max ! Maximum energy in MeV + integer, intent(in) :: M ! Number of equally log-spaced bins + + integer :: i, j, k ! Loop indices + integer :: t ! temperature index + real(8) :: spacing + real(8), allocatable :: umesh(:) ! Equally log-spaced energy grid + + ! Determine equal-logarithmic energy spacing + spacing = log(E_max/E_min)/M + + ! Create equally log-spaced energy grid + allocate(umesh(0:M)) + umesh(:) = [(i*spacing, i=0, M)] + + do t = 1, size(this % grid) + ! Allocate logarithmic mapping for nuclide + allocate(this % grid(t) % grid_index(0:M)) + + ! Determine corresponding indices in nuclide grid to energies on + ! equal-logarithmic grid + j = 1 + do k = 0, M + do while (log(this % grid(t) % energy(j + 1)/E_min) <= umesh(k)) + ! Ensure that for isotopes where maxval(this % energy) << E_max + ! that there are no out-of-bounds issues. + if (j + 1 == size(this % grid(t) % energy)) exit + j = j + 1 + end do + this % grid(t) % grid_index(k) = j + end do + end do + + end subroutine nuclide_init_grid + end module nuclide_header diff --git a/src/output.F90 b/src/output.F90 index ade1a5c05..b239a4c79 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1,8 +1,10 @@ module output + use, intrinsic :: ISO_C_BINDING use, intrinsic :: ISO_FORTRAN_ENV use constants + use eigenvalue, only: openmc_get_keff use endf, only: reaction_name use error, only: fatal_error, warning use geometry_header, only: Cell, Universe, Lattice, RectLattice, & @@ -366,17 +368,23 @@ contains subroutine print_generation() + integer :: i ! overall generation + integer :: n ! number of active generations + + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch + ! write out information about batch and generation write(UNIT=OUTPUT_UNIT, FMT='(2X,A9)', ADVANCE='NO') & trim(to_str(current_batch)) // "/" // trim(to_str(current_gen)) - write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') & - k_generation(overall_gen) + write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') k_generation(i) ! write out entropy info if (entropy_on) write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - entropy(overall_gen) + entropy(i) - if (overall_gen - n_inactive*gen_per_batch > 1) then + if (n > 1) then write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5," +/-",F8.5)', ADVANCE='NO') & keff, keff_std end if @@ -393,18 +401,25 @@ contains subroutine print_batch_keff() + integer :: i ! overall generation + integer :: n ! number of active generations + + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch + ! write out information batch and option independent output write(UNIT=OUTPUT_UNIT, FMT='(2X,A9)', ADVANCE='NO') & trim(to_str(current_batch)) // "/" // trim(to_str(gen_per_batch)) write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') & - k_generation(overall_gen) + k_generation(i) ! write out entropy info if (entropy_on) write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - entropy(current_batch*gen_per_batch) + entropy(i) ! write out accumulated k-effective if after first active batch - if (overall_gen - n_inactive*gen_per_batch > 1) then + if (n > 1) then write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5," +/-",F8.5)', ADVANCE='NO') & keff, keff_std else @@ -590,50 +605,58 @@ contains subroutine print_results() + integer :: n ! number of realizations real(8) :: alpha ! significance level for CI - real(8) :: t_value ! t-value for confidence intervals + real(8) :: t_n1 ! t-value with N-1 degrees of freedom + real(8) :: t_n3 ! t-value with N-3 degrees of freedom + real(8) :: x(2) ! mean and standard deviation + real(C_DOUBLE) :: k_combined(2) + integer(C_INT) :: err ! display header block for results call header("Results", 4) + n = n_realizations + if (confidence_intervals) then ! Calculate t-value for confidence intervals alpha = ONE - CONFIDENCE_LEVEL - t_value = t_percentile(ONE - alpha/TWO, n_realizations - 1) - - ! Adjust sum_sq - global_tallies(RESULT_SUM_SQ,:) = t_value * global_tallies(RESULT_SUM_SQ,:) - - ! Adjust combined estimator - if (n_realizations > 3) then - t_value = t_percentile(ONE - alpha/TWO, n_realizations - 3) - k_combined(2) = t_value * k_combined(2) - end if + t_n1 = t_percentile(ONE - alpha/TWO, n - 1) + t_n3 = t_percentile(ONE - alpha/TWO, n - 3) + else + t_n1 = ONE + t_n3 = ONE end if ! write global tallies - if (n_realizations > 1) then - if (run_mode == MODE_EIGENVALUE) then - write(ou,102) "k-effective (Collision)", global_tallies(RESULT_SUM, & - K_COLLISION), global_tallies(RESULT_SUM_SQ, K_COLLISION) - write(ou,102) "k-effective (Track-length)", global_tallies(RESULT_SUM, & - K_TRACKLENGTH), global_tallies(RESULT_SUM_SQ, K_TRACKLENGTH) - write(ou,102) "k-effective (Absorption)", global_tallies(RESULT_SUM, & - K_ABSORPTION), global_tallies(RESULT_SUM_SQ, K_ABSORPTION) - if (n_realizations > 3) write(ou,102) "Combined k-effective", k_combined - end if - write(ou,102) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE), & - global_tallies(RESULT_SUM_SQ, LEAKAGE) + if (n > 1) then + associate (r => global_tallies(RESULT_SUM:RESULT_SUM_SQ, :)) + if (run_mode == MODE_EIGENVALUE) then + x(:) = mean_stdev(r(:, K_COLLISION), n) + write(ou,102) "k-effective (Collision)", x(1), t_n1 * x(2) + x(:) = mean_stdev(r(:, K_TRACKLENGTH), n) + write(ou,102) "k-effective (Track-length)", x(1), t_n1 * x(2) + x(:) = mean_stdev(r(:, K_ABSORPTION), n) + write(ou,102) "k-effective (Absorption)", x(1), t_n1 * x(2) + if (n > 3) then + err = openmc_get_keff(k_combined) + write(ou,102) "Combined k-effective", k_combined(1), & + t_n3 * k_combined(2) + end if + end if + x(:) = mean_stdev(global_tallies(:, LEAKAGE), n) + write(ou,102) "Leakage Fraction", x(1), t_n1 * x(2) + end associate else if (master) call warning("Could not compute uncertainties -- only one & &active batch simulated!") if (run_mode == MODE_EIGENVALUE) then - write(ou,103) "k-effective (Collision)", global_tallies(RESULT_SUM, K_COLLISION) - write(ou,103) "k-effective (Track-length)", global_tallies(RESULT_SUM, K_TRACKLENGTH) - write(ou,103) "k-effective (Absorption)", global_tallies(RESULT_SUM, K_ABSORPTION) + write(ou,103) "k-effective (Collision)", global_tallies(RESULT_SUM, K_COLLISION) / n + write(ou,103) "k-effective (Track-length)", global_tallies(RESULT_SUM, K_TRACKLENGTH) / n + write(ou,103) "k-effective (Absorption)", global_tallies(RESULT_SUM, K_ABSORPTION) / n end if - write(ou,103) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE) + write(ou,103) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE) / n end if write(ou,*) @@ -698,8 +721,10 @@ contains integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer :: unit_tally ! tallies.out file unit + integer :: nr ! number of realizations real(8) :: t_value ! t-values for confidence intervals real(8) :: alpha ! significance level for CI + real(8) :: x(2) ! mean and standard deviation character(MAX_FILE_LEN) :: filename ! name of output file character(36) :: score_names(N_SCORE_TYPES) ! names of scoring function character(36) :: score_name ! names of scoring function @@ -745,20 +770,20 @@ contains if (confidence_intervals) then alpha = ONE - CONFIDENCE_LEVEL t_value = t_percentile(ONE - alpha/TWO, n_realizations - 1) + else + t_value = ONE end if TALLY_LOOP: do i = 1, n_tallies t => tallies(i) + nr = t % n_realizations if (confidence_intervals) then ! Calculate t-value for confidence intervals - if (confidence_intervals) then - alpha = ONE - CONFIDENCE_LEVEL - t_value = t_percentile(ONE - alpha/TWO, t % n_realizations - 1) - end if - - ! Multiply uncertainty by t-value - t % results(RESULT_SUM_SQ,:,:) = t_value * t % results(RESULT_SUM_SQ,:,:) + alpha = ONE - CONFIDENCE_LEVEL + t_value = t_percentile(ONE - alpha/TWO, nr - 1) + else + t_value = ONE end if ! Write header block @@ -890,24 +915,27 @@ contains do l = 1, t % n_user_score_bins k = k + 1 score_index = score_index + 1 + + associate(r => t % results(RESULT_SUM:RESULT_SUM_SQ, :, :)) + select case(t % score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) score_name = 'P' // trim(to_str(t % moment_order(k))) // " " // & score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + repeat(" ", indent), score_name, to_str(x(1)), & + trim(to_str(t_value * x(2))) case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) score_index = score_index - 1 do n_order = 0, t % moment_order(k) score_index = score_index + 1 score_name = 'P' // trim(to_str(n_order)) // " " //& score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end do k = k + t % moment_order(k) case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & @@ -919,11 +947,10 @@ contains score_name = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) // " " & // score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,& - filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end do end do k = k + (t % moment_order(k) + 1)**2 - 1 @@ -933,11 +960,12 @@ contains else score_name = score_names(abs(t % score_bins(k))) end if + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end select + end associate end do indent = indent - 2 @@ -975,11 +1003,15 @@ contains integer :: stride_surf ! stride for surface filter integer :: n ! number of incoming energy bins integer :: filter_index ! index in results array for filters + integer :: nr ! number of realizations + real(8) :: x(2) ! mean and standard deviation logical :: print_ebin ! should incoming energy bin be displayed? logical :: energy_filters ! energy filters present character(MAX_LINE_LEN) :: string type(RegularMesh), pointer :: m + nr = t % n_realizations + ! Get pointer to mesh i_filter_mesh = t % filter(t % find_filter(FILTER_MESH)) select type(filt => filters(i_filter_mesh) % obj) @@ -1050,104 +1082,101 @@ contains % bins % data(1) - 1) * t % stride(j) end do - ! Left Surface - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Left", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_LEFT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_LEFT - 1) * stride_surf))) + associate(r => t % results(RESULT_SUM:RESULT_SUM_SQ, :, :)) + ! Left Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_LEFT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Left", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_LEFT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_LEFT - 1) * stride_surf))) + "Outgoing Current on Left", to_str(x(1)), trim(to_str(x(2))) + + x(:) = mean_stdev(r(:, 1, filter_index + (IN_LEFT - 1) * & + stride_surf), nr) + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Left", to_str(x(1)), trim(to_str(x(2))) ! Right Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_RIGHT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Right", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_RIGHT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_RIGHT - 1) * stride_surf))) + "Outgoing Current on Right", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_RIGHT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Right", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_RIGHT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_RIGHT - 1) * stride_surf))) + "Incoming Current on Right", to_str(x(1)), trim(to_str(x(2))) if (n_dim >= 2) then ! Back Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_BACK - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Back", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_BACK - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_BACK - 1) * stride_surf))) + "Outgoing Current on Back", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_BACK - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Back", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_BACK - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_BACK - 1) * stride_surf))) + "Incoming Current on Back", to_str(x(1)), trim(to_str(x(2))) ! Front Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_FRONT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Front", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_FRONT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_FRONT - 1) * stride_surf))) + "Outgoing Current on Front", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_FRONT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Front", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_FRONT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_FRONT - 1) * stride_surf))) + "Incoming Current on Front", to_str(x(1)), trim(to_str(x(2))) end if if (n_dim == 3) then ! Bottom Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_BOTTOM - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Bottom", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_BOTTOM - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_BOTTOM - 1) * stride_surf))) + "Outgoing Current on Bottom", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_BOTTOM - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Bottom", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_BOTTOM - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_BOTTOM - 1) * stride_surf))) + "Incoming Current on Bottom", to_str(x(1)), trim(to_str(x(2))) ! Top Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_TOP - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Top", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_TOP - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_TOP - 1) * stride_surf))) + "Outgoing Current on Top", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_TOP - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Top", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_TOP - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_TOP - 1) * stride_surf))) + "Incoming Current on Top", to_str(x(1)), trim(to_str(x(2))) end if + end associate end do end do end subroutine write_surface_current +!=============================================================================== +! MEAN_STDEV computes the sample mean and standard deviation of the mean of a +! single tally score +!=============================================================================== + + pure function mean_stdev(result_, n) result(x) + real(8), intent(in) :: result_(2) ! sum and sum-of-squares + integer, intent(in) :: n ! number of realizations + real(8) :: x(2) ! mean and standard deviation + + x(1) = result_(1) / n + if (n > 1) then + x(2) = sqrt((result_(2) / n - x(1)*x(1))/(n - 1)) + else + x(2) = ZERO + end if + end function mean_stdev + end module output diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 76876f021..3f4680c2f 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -46,6 +46,7 @@ module particle_header ! Particle coordinates integer :: n_coord ! number of current coordinates + integer :: cell_instance ! offset for distributed properties type(LocalCoord) :: coord(MAX_COORD) ! coordinates for all levels ! Particle coordinates before crossing a surface diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index 262cef802..4438c48c0 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -32,6 +32,8 @@ contains ! Set verbosity high verbosity = 10 + allocate(micro_xs(n_nuclides_total)) + ! Initialize the particle to be tracked call p % initialize() @@ -44,8 +46,7 @@ contains ! Compute random number seed select case (previous_run_mode) case (MODE_EIGENVALUE) - particle_seed = ((current_batch - 1)*gen_per_batch + & - current_gen - 1)*n_particles + p % id + particle_seed = (total_gen + overall_generation() - 1)*n_particles + p % id case (MODE_FIXEDSOURCE) particle_seed = p % id end select @@ -58,6 +59,8 @@ contains ! Write output if particle made it call print_particle(p) + deallocate(micro_xs) + end subroutine run_particle_restart !=============================================================================== diff --git a/src/physics.F90 b/src/physics.F90 index 920835d8e..3d557b44f 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -324,6 +324,7 @@ contains real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering real(8) :: phi ! azimuthal angle for iso-in-lab scattering real(8) :: kT ! temperature in eV + logical :: sampled ! whether or not a reaction type has been sampled type(Nuclide), pointer :: nuc ! copy incoming direction @@ -337,36 +338,43 @@ contains ! For tallying purposes, this routine might be called directly. In that ! case, we need to sample a reaction via the cutoff variable - prob = ZERO cutoff = prn() * (micro_xs(i_nuclide) % total - & micro_xs(i_nuclide) % absorption) + sampled = .false. - prob = prob + micro_xs(i_nuclide) % elastic + prob = micro_xs(i_nuclide) % elastic - micro_xs(i_nuclide) % thermal if (prob > cutoff) then ! ======================================================================= - ! ELASTIC SCATTERING - - if (micro_xs(i_nuclide) % index_sab /= NONE) then - ! S(a,b) scattering - call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & - p % E, p % coord(1) % uvw, p % mu) + ! NON-S(A,B) ELASTIC SCATTERING + ! Determine temperature + if (nuc % mp_present) then + kT = p % sqrtkT**2 else - ! Determine temperature - if (nuc % mp_present) then - kT = p % sqrtkT**2 - else - kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) - end if - - ! Perform collision physics for elastic scattering - call elastic_scatter(i_nuclide, nuc % reactions(1), kT, & - p % E, p % coord(1) % uvw, p % mu, p % wgt) + kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) end if - p % event_MT = ELASTIC + ! Perform collision physics for elastic scattering + call elastic_scatter(i_nuclide, nuc % reactions(1), kT, p % E, & + p % coord(1) % uvw, p % mu, p % wgt) - else + p % event_MT = ELASTIC + sampled = .true. + end if + + prob = micro_xs(i_nuclide) % elastic + if (prob > cutoff .and. .not. sampled) then + ! ======================================================================= + ! S(A,B) SCATTERING + + call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, p % E, & + p % coord(1) % uvw, p % mu) + + p % event_MT = ELASTIC + sampled = .true. + end if + + if (.not. sampled) then ! ======================================================================= ! INELASTIC SCATTERING @@ -388,7 +396,7 @@ contains if (rx % MT == N_FISSION .or. rx % MT == N_F .or. rx % MT == N_NF & .or. rx % MT == N_2NF .or. rx % MT == N_3NF) cycle - ! some materials have gas production cross sections with MT > 200 that + ! Some materials have gas production cross sections with MT > 200 that ! are duplicates. Also MT=4 is total level inelastic scattering which ! should be skipped if (rx % MT >= 200 .or. rx % MT == N_LEVEL) cycle @@ -406,24 +414,24 @@ contains ! Perform collision physics for inelastic scattering call inelastic_scatter(nuc, nuc%reactions(i), p) - p % event_MT = nuc%reactions(i)%MT + p % event_MT = nuc % reactions(i) % MT end if ! Set event component p % event = EVENT_SCATTER - ! sample new outgoing angle for isotropic in lab scattering + ! Sample new outgoing angle for isotropic in lab scattering if (materials(p % material) % p0(i_nuc_mat)) then - ! sample isotropic-in-lab outgoing direction + ! Sample isotropic-in-lab outgoing direction uvw_new(1) = TWO * prn() - ONE phi = TWO * PI * prn() uvw_new(2) = cos(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) uvw_new(3) = sin(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) p % mu = dot_product(uvw_old, uvw_new) - ! change direction of particle + ! Change direction of particle p % coord(1) % uvw = uvw_new end if @@ -559,8 +567,8 @@ contains associate (sab => sab_tables(i_sab) % data(i_temp)) ! Determine whether inelastic or elastic scattering will occur - if (prn() < micro_xs(i_nuclide) % elastic_sab / & - micro_xs(i_nuclide) % elastic) then + if (prn() < micro_xs(i_nuclide) % thermal_elastic / & + micro_xs(i_nuclide) % thermal) then ! elastic scattering ! Get index and interpolation factor for elastic grid @@ -818,7 +826,6 @@ contains real(8) :: xs_low ! 0K xs at lowest practical relative energy real(8) :: xs_up ! 0K xs at highest practical relative energy real(8) :: m ! slope for interpolation - real(8) :: xi ! pseudorandom number on [0,1) real(8) :: R ! rejection criterion for DBRC / target speed real(8) :: cdf_low ! xs cdf at lowest practical relative energy real(8) :: cdf_up ! xs cdf at highest practical relative energy diff --git a/src/plot.F90 b/src/plot.F90 index 6a3a19170..067d0c56f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -1,5 +1,9 @@ module plot + use, intrinsic :: ISO_C_BINDING + + use hdf5 + use constants use error, only: fatal_error use geometry, only: find_cell, check_cell_overlap @@ -14,12 +18,10 @@ module plot use progress_header, only: ProgressBar use string, only: to_str - use hdf5 - implicit none private - public :: run_plot + public :: openmc_plot_geometry integer, parameter :: RED = 1 integer, parameter :: GREEN = 2 @@ -31,7 +33,7 @@ contains ! RUN_PLOT controls the logic for making one or many plots !=============================================================================== - subroutine run_plot() + subroutine openmc_plot_geometry() bind(C) integer :: i ! loop index for plots @@ -51,7 +53,7 @@ contains end associate end do - end subroutine run_plot + end subroutine openmc_plot_geometry !=============================================================================== ! POSITION_RGB computes the red/green/blue values for a given plot with the diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index 4ad3ea0f0..d55656536 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -28,7 +28,8 @@ element materials { }* & element sab { - (element name { xsd:string } | attribute name { xsd:string }) + (element name { xsd:string } | attribute name { xsd:string }) & + (element fraction { xsd:double } | attribute fraction { xsd:double })? }* }+ & diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index 0303d361e..0fa81c11b 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -119,14 +119,26 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index a0f100cd8..23a0cfd4b 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -116,6 +116,8 @@ element settings { element temperature_multipole { xsd:boolean }? & + element temperature_range { list { xsd:double, xsd:double } }? & + element temperature_tolerance { xsd:double }? & element threads { xsd:positiveInteger }? & diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 2a9a170f9..e75dc7c15 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -517,6 +517,14 @@ + + + + + + + + diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 1d64711b8..e0b79f248 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -80,12 +80,14 @@ module sab_header contains - subroutine salphabeta_from_hdf5(this, group_id, temperature, method, tolerance) + subroutine salphabeta_from_hdf5(this, group_id, temperature, method, & + tolerance, minmax) class(SAlphaBeta), intent(inout) :: this integer(HID_T), intent(in) :: group_id type(VectorReal), intent(in) :: temperature ! list of temperatures integer, intent(in) :: method real(8), intent(in) :: tolerance + real(8), intent(in) :: minmax(2) integer :: i, j integer :: t @@ -143,6 +145,18 @@ contains end do call sort(temps_available) + ! Determine actual temperatures to read -- start by checking whether a + ! temperature range was given, in which case all temperatures in the range + ! are loaded irrespective of what temperatures actually appear in the model + if (minmax(2) > ZERO) then + do i = 1, size(temps_available) + temp_actual = temps_available(i) + if (minmax(1) <= temp_actual .and. temp_actual <= minmax(2)) then + call temps_to_read % push_back(nint(temp_actual)) + end if + end do + end if + select case (method) case (TEMPERATURE_NEAREST) ! Determine actual temperatures to read diff --git a/src/simulation.F90 b/src/simulation.F90 index 0cdb4c66d..7427443bb 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -1,10 +1,12 @@ module simulation + use, intrinsic :: ISO_C_BINDING + use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & - calculate_combined_keff, calculate_generation_keff, & - shannon_entropy, synchronize_bank, keff_generation + calculate_generation_keff, shannon_entropy, & + synchronize_bank, keff_generation, k_sum #ifdef _OPENMP use eigenvalue, only: join_bank_from_threads #endif @@ -18,40 +20,28 @@ module simulation use source, only: initialize_source, sample_external_source use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies, & - tally_statistics + use tally, only: accumulate_tallies, setup_active_usertallies use trigger, only: check_triggers use tracking, only: transport - use volume_calc, only: run_volume_calculations implicit none private - public :: run_simulation + public :: openmc_run contains !=============================================================================== -! RUN_SIMULATION encompasses all the main logic where iterations are performed +! OPENMC_RUN encompasses all the main logic where iterations are performed ! over the batches, generations, and histories in a fixed source or k-eigenvalue ! calculation. !=============================================================================== - subroutine run_simulation() + subroutine openmc_run() bind(C) type(Particle) :: p integer(8) :: i_work - if (.not. restart_run) call initialize_source() - - ! Display header - if (master) then - if (run_mode == MODE_FIXEDSOURCE) then - call header("FIXED SOURCE TRANSPORT SIMULATION", 3) - elseif (run_mode == MODE_EIGENVALUE) then - call header("K EIGENVALUE SIMULATION", 3) - if (verbosity >= 7) call print_columns() - end if - end if + call initialize_simulation() ! Turn on inactive timer call time_inactive % start() @@ -115,7 +105,7 @@ contains ! Clear particle call p % clear() - end subroutine run_simulation + end subroutine openmc_run !=============================================================================== ! INITIALIZE_HISTORY @@ -137,7 +127,7 @@ contains p % id = work_index(rank) + index_source ! set random number seed - particle_seed = (overall_gen - 1)*n_particles + p % id + particle_seed = (total_gen + overall_generation() - 1)*n_particles + p % id call set_particle_seed(particle_seed) ! set particle trace @@ -202,9 +192,6 @@ contains subroutine initialize_generation() - ! set overall generation number - overall_gen = gen_per_batch*(current_batch - 1) + current_gen - if (run_mode == MODE_EIGENVALUE) then ! Reset number of fission bank sites n_bank = 0 @@ -269,13 +256,20 @@ contains call calculate_average_keff() ! Write generation output - if (master .and. current_gen /= gen_per_batch .and. verbosity >= 7) & - call print_generation() + if (master .and. verbosity >= 7) then + if (current_gen /= gen_per_batch) then + call print_generation() + else + call print_batch_keff() + end if + end if + elseif (run_mode == MODE_FIXEDSOURCE) then ! For fixed-source mode, we need to sample the external source if (path_source == '') then do i = 1, work - call set_particle_seed(overall_gen*n_particles + work_index(rank) + i) + call set_particle_seed((total_gen + overall_generation()) * & + n_particles + work_index(rank) + i) call sample_external_source(source_bank(i)) end do end if @@ -291,9 +285,13 @@ contains subroutine finalize_batch() - ! Collect tallies +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif + + ! Reduce tallies onto master process and accumulate call time_tallies % start() - call synchronize_tallies() + call accumulate_tallies() call time_tallies % stop() ! Reset global tally results @@ -305,12 +303,6 @@ contains if (run_mode == MODE_EIGENVALUE) then ! Perform CMFD calculation if on if (cmfd_on) call execute_cmfd() - - ! Display output - if (master .and. verbosity >= 7) call print_batch_keff() - - ! Calculate combined estimate of k-effective - if (master) call calculate_combined_keff() end if ! Check_triggers @@ -335,13 +327,6 @@ contains call write_source_point() end if - if (master .and. current_batch == n_max_batches .and. & - run_mode == MODE_EIGENVALUE) then - ! Make sure combined estimate of k-effective is calculated at the last - ! batch in case no state point is written - call calculate_combined_keff() - end if - end subroutine finalize_batch !=============================================================================== @@ -358,7 +343,6 @@ contains if (run_mode == MODE_EIGENVALUE) then do current_gen = 1, gen_per_batch - overall_gen = overall_gen + 1 call calculate_average_keff() ! print out batch keff @@ -379,24 +363,88 @@ contains end subroutine replay_batch_history +!=============================================================================== +! INITIALIZE_SIMULATION +!=============================================================================== + + subroutine initialize_simulation() + +!$omp parallel + allocate(micro_xs(n_nuclides_total)) +!$omp end parallel + + if (.not. restart_run) call initialize_source() + + ! Display header + if (master) then + if (run_mode == MODE_FIXEDSOURCE) then + call header("FIXED SOURCE TRANSPORT SIMULATION", 3) + elseif (run_mode == MODE_EIGENVALUE) then + call header("K EIGENVALUE SIMULATION", 3) + if (verbosity >= 7) call print_columns() + end if + end if + + end subroutine initialize_simulation + !=============================================================================== ! FINALIZE_SIMULATION calculates tally statistics, writes tallies, and displays ! execution time and results !=============================================================================== - subroutine finalize_simulation + subroutine finalize_simulation() + +#ifdef MPI + integer :: i ! loop index for tallies + integer :: n ! size of arrays + integer :: mpi_err ! MPI error code + integer(8) :: temp + real(8) :: tempr(3) ! temporary array for communication +#endif + +!$omp parallel + deallocate(micro_xs) +!$omp end parallel + + ! Increment total number of generations + total_gen = total_gen + n_batches*gen_per_batch ! Start finalization timer - call time_finalize%start() + call time_finalize % start() - ! Calculate statistics for tallies and write to tallies.out - if (master) then - if (n_realizations > 1) call tally_statistics() +#ifdef MPI + ! Broadcast tally results so that each process has access to results + if (allocated(tallies)) then + do i = 1, size(tallies) + n = size(tallies(i) % results) + call MPI_BCAST(tallies(i) % results, n, MPI_DOUBLE, 0, & + mpi_intracomm, mpi_err) + end do end if - if (output_tallies) then - if (master) call write_tallies() + + ! Also broadcast global tally results + n = size(global_tallies) + call MPI_BCAST(global_tallies, n, MPI_DOUBLE, 0, mpi_intracomm, mpi_err) + + ! These guys are needed so that non-master processes can calculate the + ! combined estimate of k-effective + tempr(1) = k_col_abs + tempr(2) = k_col_tra + tempr(3) = k_abs_tra + call MPI_BCAST(tempr, 3, MPI_REAL8, 0, mpi_intracomm, mpi_err) + k_col_abs = tempr(1) + k_col_tra = tempr(2) + k_abs_tra = tempr(3) + + if (check_overlaps) then + call MPI_REDUCE(overlap_check_cnt, temp, n_cells, MPI_INTEGER8, & + MPI_SUM, 0, mpi_intracomm, mpi_err) + overlap_check_cnt = temp end if - if (check_overlaps) call reduce_overlap_count() +#endif + + ! Write tally results to tallies.out + if (output_tallies .and. master) call write_tallies() ! Stop timers and show timing statistics call time_finalize%stop() @@ -409,22 +457,4 @@ contains end subroutine finalize_simulation -!=============================================================================== -! REDUCE_OVERLAP_COUNT accumulates cell overlap check counts to master -!=============================================================================== - - subroutine reduce_overlap_count() - -#ifdef MPI - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - else - call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - end if -#endif - - end subroutine reduce_overlap_count - end module simulation diff --git a/src/source.F90 b/src/source.F90 index 81931245a..517715b56 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -73,7 +73,7 @@ contains src => source_bank(i) ! initialize random number seed - id = work_index(rank) + i + id = total_gen*n_particles + work_index(rank) + i call set_particle_seed(id) ! sample external source distribution diff --git a/src/state_point.F90 b/src/state_point.F90 index e4c9a43ae..e2a476e7e 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -11,11 +11,12 @@ module state_point ! intervals, using the tag. !=============================================================================== - use, intrinsic :: ISO_C_BINDING, only: c_loc, c_ptr + use, intrinsic :: ISO_C_BINDING use hdf5 use constants + use eigenvalue, only: openmc_get_keff use endf, only: reaction_name use error, only: fatal_error, warning use global @@ -46,6 +47,8 @@ contains integer(HID_T) :: cmfd_group, tallies_group, tally_group, meshes_group, & mesh_group, filters_group, filter_group, derivs_group, & deriv_group, runtime_group + integer(C_INT) :: err + real(C_DOUBLE) :: k_combined(2) character(MAX_WORD_LEN), allocatable :: str_array(:) character(MAX_FILE_LEN) :: filename type(TallyObject), pointer :: tally @@ -117,6 +120,7 @@ contains call write_dataset(file_id, "k_col_abs", k_col_abs) call write_dataset(file_id, "k_col_tra", k_col_tra) call write_dataset(file_id, "k_abs_tra", k_abs_tra) + err = openmc_get_keff(k_combined) call write_dataset(file_id, "k_combined", k_combined) ! Write out CMFD info @@ -518,7 +522,8 @@ contains real(8), allocatable :: tally_temp(:,:,:) ! contiguous array of results real(8), target :: global_temp(3,N_GLOBAL_TALLIES) #ifdef MPI - real(8) :: dummy ! temporary receive buffer for non-root reduces + integer :: mpi_err ! MPI error code + real(8) :: dummy ! temporary receive buffer for non-root reduces #endif type(TallyObject) :: dummy_tally @@ -535,18 +540,15 @@ contains tallies_group = open_group(file_id, "tallies") end if - ! Copy global tallies into temporary array for reducing - n_bins = 3 * N_GLOBAL_TALLIES - global_temp(:,:) = global_tallies(:,:) - if (master) then - ! The MPI_IN_PLACE specifier allows the master to copy values into a - ! receive buffer without having a temporary variable #ifdef MPI - call MPI_REDUCE(MPI_IN_PLACE, global_temp, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) + ! Reduce global tallies + n_bins = size(global_tallies) + call MPI_REDUCE(global_tallies, global_temp, n_bins, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) #endif + if (master) then ! Transfer values to value on master if (current_batch == n_max_batches .or. satisfy_triggers) then global_tallies(:,:) = global_temp(:,:) @@ -554,12 +556,6 @@ contains ! Write out global tallies sum and sum_sq call write_dataset(file_id, "global_tallies", global_temp) - else - ! Receive buffer not significant at other processors -#ifdef MPI - call MPI_REDUCE(global_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) -#endif end if if (tallies_on) then @@ -647,7 +643,6 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group integer(HID_T) :: tally_group - real(8) :: real_array(3) logical :: source_present character(MAX_WORD_LEN) :: word @@ -727,7 +722,6 @@ contains call read_dataset(k_col_abs, file_id, "k_col_abs") call read_dataset(k_col_tra, file_id, "k_col_tra") call read_dataset(k_abs_tra, file_id, "k_abs_tra") - call read_dataset(real_array(1:2), file_id, "k_combined") ! Take maximum of statepoint n_inactive and input n_inactive n_inactive = max(n_inactive, int_array(1)) @@ -848,6 +842,7 @@ contains #else integer :: i #ifdef MPI + integer :: mpi_err ! MPI error code type(Bank), allocatable, target :: temp_source(:) #endif #endif diff --git a/src/tally.F90 b/src/tally.F90 index 155a31a3e..1bdde1b50 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -22,10 +22,6 @@ module tally implicit none - integer :: position(N_FILTER_TYPES - 3) = 0 ! Tally map positioning array - -!$omp threadprivate(position) - procedure(score_general_), pointer :: score_general => null() procedure(score_analog_tally_), pointer :: score_analog_tally => null() @@ -2410,9 +2406,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_analog_tally_ce subroutine score_analog_tally_mg(p) @@ -2558,9 +2551,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_analog_tally_mg !=============================================================================== @@ -2956,9 +2946,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_tracklength_tally !=============================================================================== @@ -3132,9 +3119,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_collision_tally !=============================================================================== @@ -4334,11 +4318,11 @@ contains end subroutine zero_flux_derivs !=============================================================================== -! SYNCHRONIZE_TALLIES accumulates the sum of the contributions from each history +! ACCUMULATE_TALLIES accumulates the sum of the contributions from each history ! within the batch to a new random variable !=============================================================================== - subroutine synchronize_tallies() + subroutine accumulate_tallies() integer :: i real(C_DOUBLE) :: k_col ! Copy of batch collision estimate of keff @@ -4388,7 +4372,7 @@ contains end do end if - end subroutine synchronize_tallies + end subroutine accumulate_tallies !=============================================================================== ! REDUCE_TALLY_RESULTS collects all the results from tallies onto one processor @@ -4398,73 +4382,55 @@ contains subroutine reduce_tally_results() integer :: i - integer :: n ! number of filter bins - integer :: m ! number of score bins - integer :: n_bins ! total number of bins - real(8), allocatable :: tally_temp(:,:) ! contiguous array of results - real(8) :: global_temp(N_GLOBAL_TALLIES) - real(8) :: dummy ! temporary receive buffer for non-root reduces - type(TallyObject), pointer :: t + integer :: n ! number of filter bins + integer :: m ! number of score bins + integer :: n_bins ! total number of bins + integer :: mpi_err ! MPI error code + real(C_DOUBLE), allocatable :: tally_temp(:,:) ! contiguous array of results + real(C_DOUBLE), allocatable :: tally_temp2(:,:) ! reduced contiguous results + real(C_DOUBLE) :: temp(N_GLOBAL_TALLIES), temp2(N_GLOBAL_TALLIES) do i = 1, active_tallies % size() - t => tallies(active_tallies % data(i)) + associate (t => tallies(active_tallies % data(i))) - m = t % total_score_bins - n = t % total_filter_bins - n_bins = m*n + m = size(t % results, 2) + n = size(t % results, 3) + n_bins = m*n - allocate(tally_temp(m,n)) + allocate(tally_temp(m,n), tally_temp2(m,n)) - tally_temp = t % results(RESULT_VALUE,:,:) - - if (master) then - ! The MPI_IN_PLACE specifier allows the master to copy values into - ! a receive buffer without having a temporary variable - call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & + ! Reduce contiguous set of tally results + tally_temp = t % results(RESULT_VALUE,:,:) + call MPI_REDUCE(tally_temp, tally_temp2, n_bins, MPI_DOUBLE, & MPI_SUM, 0, mpi_intracomm, mpi_err) - ! Transfer values to value on master - t % results(RESULT_VALUE,:,:) = tally_temp - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, & - MPI_SUM, 0, mpi_intracomm, mpi_err) + if (master) then + ! Transfer values to value on master + t % results(RESULT_VALUE,:,:) = tally_temp2 + else + ! Reset value on other processors + t % results(RESULT_VALUE,:,:) = ZERO + end if - ! Reset value on other processors - t % results(RESULT_VALUE,:,:) = ZERO - end if - - deallocate(tally_temp) + deallocate(tally_temp, tally_temp2) + end associate end do - ! Copy global tallies into array to be reduced - global_temp = global_tallies(RESULT_VALUE, :) - + ! Reduce global tallies onto master + temp = global_tallies(RESULT_VALUE, :) + call MPI_REDUCE(temp, temp2, N_GLOBAL_TALLIES, MPI_DOUBLE, MPI_SUM, & + 0, mpi_intracomm, mpi_err) if (master) then - call MPI_REDUCE(MPI_IN_PLACE, global_temp, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) - - ! Transfer values back to global_tallies on master - global_tallies(RESULT_VALUE, :) = global_temp + global_tallies(RESULT_VALUE, :) = temp2 else - ! Receive buffer not significant at other processors - call MPI_REDUCE(global_temp, dummy, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) - - ! Reset value on other processors global_tallies(RESULT_VALUE, :) = ZERO end if ! We also need to determine the total starting weight of particles from the ! last realization - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, total_weight, 1, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(total_weight, dummy, 1, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) - end if + temp(1) = total_weight + call MPI_REDUCE(temp, total_weight, 1, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) end subroutine reduce_tally_results #endif @@ -4502,45 +4468,6 @@ contains end subroutine accumulate_tally -!=============================================================================== -! TALLY_STATISTICS computes the mean and standard deviation of the mean of each -! tally and stores them in the RESULT_SUM and RESULT_SUM_SQ positions -!=============================================================================== - - subroutine tally_statistics() - integer :: i ! index in tallies array - integer :: j, k ! score/filter indices - integer :: n ! number of realizations - - ! Calculate sample mean and standard deviation of the mean -- note that we - ! have used Bessel's correction so that the estimator of the variance of the - ! sample mean is unbiased. - - do i = 1, n_tallies - n = tallies(i) % n_realizations - - associate (r => tallies(i) % results) - do k = 1, size(r, 3) - do j = 1, size(r, 2) - r(RESULT_SUM, j, k) = r(RESULT_SUM, j, k) / n - r(RESULT_SUM_SQ, j, k) = sqrt((r(RESULT_SUM_SQ, j, k)/n - & - r(RESULT_SUM, j, k) * r(RESULT_SUM, j, k))/(n - 1)) - end do - end do - end associate - end do - - ! Calculate statistics for global tallies - n = n_realizations - associate (r => global_tallies) - do j = 1, size(r, 2) - r(RESULT_SUM, j) = r(RESULT_SUM, j) / n - r(RESULT_SUM_SQ, j) = sqrt((r(RESULT_SUM_SQ, j)/n - & - r(RESULT_SUM, j) * r(RESULT_SUM, j))/(n - 1)) - end do - end associate - end subroutine tally_statistics - !=============================================================================== ! SETUP_ACTIVE_USERTALLIES !=============================================================================== diff --git a/src/trigger.F90 b/src/trigger.F90 index 80bdd0e16..cb5f2c4c8 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -1,10 +1,13 @@ module trigger + use, intrinsic :: ISO_C_BINDING + #ifdef MPI use message_passing #endif use constants + use eigenvalue, only: openmc_get_keff use global use string, only: to_str use output, only: warning, write_message @@ -101,10 +104,12 @@ contains integer :: score_index ! scoring bin index integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders + integer(C_INT) :: err real(8) :: uncertainty ! trigger uncertainty real(8) :: std_dev = ZERO ! trigger standard deviation real(8) :: rel_err = ZERO ! trigger relative error real(8) :: ratio ! ratio of the uncertainty/trigger threshold + real(C_DOUBLE) :: k_combined(2) type(TallyObject), pointer :: t ! tally pointer type(TriggerObject), pointer :: trigger ! tally trigger @@ -119,6 +124,7 @@ contains ! Check eigenvalue trigger if (run_mode == MODE_EIGENVALUE) then if (keff_trigger % trigger_type /= 0) then + err = openmc_get_keff(k_combined) select case (keff_trigger % trigger_type) case(VARIANCE) uncertainty = k_combined(2) ** 2 diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index d63955017..f8cf4085a 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -1,5 +1,7 @@ module volume_calc + use, intrinsic :: ISO_C_BINDING + use hdf5, only: HID_T #ifdef _OPENMP use omp_lib @@ -21,16 +23,16 @@ module volume_calc implicit none private - public :: run_volume_calculations + public :: openmc_calculate_volumes contains !=============================================================================== -! RUN_VOLUME_CALCULATIONS runs each of the stochastic volume calculations that +! OPENMC_CALCULATE_VOLUMES runs each of the stochastic volume calculations that ! the user has specified and writes results to HDF5 files !=============================================================================== - subroutine run_volume_calculations() + subroutine openmc_calculate_volumes() bind(C) integer :: i, j integer :: n real(8), allocatable :: volume(:,:) ! volume mean/stdev in each domain @@ -93,7 +95,7 @@ contains call write_message("Elapsed time: " // trim(to_str(time_volume % & get_value())) // " s", 6) end if - end subroutine run_volume_calculations + end subroutine openmc_calculate_volumes !=============================================================================== ! GET_VOLUME stochastically determines the volume of a set of domains along with @@ -130,6 +132,7 @@ contains integer :: min_samples ! minimum number of samples per process integer :: remainder ! leftover samples from uneven divide #ifdef MPI + integer :: mpi_err ! MPI error code integer :: m ! index over materials integer :: n ! number of materials integer, allocatable :: data(:) ! array used to send number of hits diff --git a/tests/run_tests.py b/tests/run_tests.py index 2d9112e92..cd6c02607 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -188,6 +188,10 @@ class Test(object): build_str += "-Dopenmp=OFF " if self.coverage: build_str += "-Dcoverage=ON " + if self.phdf5: + build_str += "-DHDF5_PREFER_PARALLEL=ON " + else: + build_str += "-DHDF5_PREFER_PARALLEL=OFF " self.build_opts = build_str return self.build_opts @@ -214,6 +218,9 @@ class Test(object): # Runs cmake when in non-script mode def run_cmake(self): + build_opts = self.build_opts.split() + self.cmake += build_opts + os.environ['FC'] = self.fc os.environ['CC'] = self.cc os.environ['CXX'] = self.cxx @@ -221,10 +228,10 @@ class Test(object): os.environ['MPI_DIR'] = MPI_DIR if self.phdf5: os.environ['HDF5_ROOT'] = PHDF5_DIR + self.cmake.append('-DHDF5_PREFER_PARALLEL=ON') else: os.environ['HDF5_ROOT'] = HDF5_DIR - build_opts = self.build_opts.split() - self.cmake += build_opts + self.cmake.append('-DHDF5_PREFER_PARALLEL=OFF') rc = call(self.cmake) if rc != 0: self.success = False diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index df9ea209e..672f6bee1 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -1,19 +1,19 @@ - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -31,197 +31,197 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 3 3 - -32.13 -32.13 - + + + 21.42 21.42 + 3 3 + -32.13 -32.13 + 8 7 7 8 8 8 7 7 7 - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -32 -32 0 32 32 32 - - + eigenvalue + 100 + 10 + 5 + + + -32 -32 0 32 32 32 + + - - 27 - - - 10000 - nu-fission - + + 27 + + + 1 + nu-fission + diff --git a/tests/test_asymmetric_lattice/results_true.dat b/tests/test_asymmetric_lattice/results_true.dat index 3e318c343..ef7608f2f 100644 --- a/tests/test_asymmetric_lattice/results_true.dat +++ b/tests/test_asymmetric_lattice/results_true.dat @@ -1 +1 @@ -f388c07481a7333bde8044d2e8805954ec41cc3e73d00f1b92b6acff03dad06e62a74e8b7595994e877f69a051ff34d8e498de69ac0efec6e396434007c10b0c \ No newline at end of file +3b76b468b9c0e7df6508189b75748a1b7b4f2b37486396749e1a15e536526336f70b60bb207095c39ecbd46822e8c8705ea81184a3c8546e7da09bb905d74637 \ No newline at end of file diff --git a/tests/test_create_fission_neutrons/inputs_true.dat b/tests/test_create_fission_neutrons/inputs_true.dat index b4245d2c8..9aeabbb57 100644 --- a/tests/test_create_fission_neutrons/inputs_true.dat +++ b/tests/test_create_fission_neutrons/inputs_true.dat @@ -1,37 +1,37 @@ - - - - - - - + + + + + + + - - - - - + + + + + - fixed source - 100 - 10 - - - -1 -1 -1 1 1 1 - - - - false + fixed source + 100 + 10 + + + -1 -1 -1 1 1 1 + + + + false - - flux - + + flux + diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index 83dfd7ff9..ff134bd5c 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,313 +127,313 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 3 - 0 - - - -160 -160 -183 160 160 183 - - - true + eigenvalue + 100 + 3 + 0 + + + -160 -160 -183 160 160 183 + + + true - - 1 3 - - - 0.0 0.625 20000000.0 - - - 10000 - flux - 1 - - - 10000 - flux - 2 - - - 10000 - flux - 3 - - - 10000 - flux - 4 - - - 10000 - flux - 5 - - - 10000 - total U235 - total absorption scatter fission nu-fission - 1 - - - 10000 - total U235 - total absorption scatter fission nu-fission - 2 - - - 10000 - total U235 - total absorption scatter fission nu-fission - 3 - - - 10000 - total U235 - total absorption scatter fission nu-fission - 4 - - - 10000 - total U235 - total absorption scatter fission nu-fission - 5 - - - 10000 - absorption - analog - 1 - - - 10000 - absorption - analog - 2 - - - 10000 - absorption - analog - 3 - - - 10000 - absorption - analog - 4 - - - 10000 - absorption - analog - 5 - - - 10000 10001 - total U235 - nu-fission scatter - 1 - - - 10000 10001 - total U235 - nu-fission scatter - 2 - - - 10000 10001 - U235 - nu-fission scatter - 3 - - - 10000 10001 - U235 - nu-fission scatter - 4 - - - 10000 10001 - U235 - nu-fission scatter - 5 - - - - - - + + 1 3 + + + 0.0 0.625 20000000.0 + + + 1 + flux + 1 + + + 1 + flux + 2 + + + 1 + flux + 3 + + + 1 + flux + 4 + + + 1 + flux + 5 + + + 1 + total U235 + total absorption scatter fission nu-fission + 1 + + + 1 + total U235 + total absorption scatter fission nu-fission + 2 + + + 1 + total U235 + total absorption scatter fission nu-fission + 3 + + + 1 + total U235 + total absorption scatter fission nu-fission + 4 + + + 1 + total U235 + total absorption scatter fission nu-fission + 5 + + + 1 + absorption + analog + 1 + + + 1 + absorption + analog + 2 + + + 1 + absorption + analog + 3 + + + 1 + absorption + analog + 4 + + + 1 + absorption + analog + 5 + + + 1 2 + total U235 + nu-fission scatter + 1 + + + 1 2 + total U235 + nu-fission scatter + 2 + + + 1 2 + U235 + nu-fission scatter + 3 + + + 1 2 + U235 + nu-fission scatter + 4 + + + 1 2 + U235 + nu-fission scatter + 5 + + + + + + diff --git a/tests/test_diff_tally/results_true.dat b/tests/test_diff_tally/results_true.dat index 4879e8a2f..29c906f2e 100644 --- a/tests/test_diff_tally/results_true.dat +++ b/tests/test_diff_tally/results_true.dat @@ -1,67 +1,27 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,3.9903014e-02,9.1258569e-03 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,9.8213753e-04,9.8213753e-04 -1,,density,nu-fission,2.7945436e-02,2.0999385e-02 -1,,density,scatter,4.0626164e-01,1.7017647e-02 -1,,density,nu-fission,2.4595326e-02,2.1224461e-02 -1,,density,scatter,2.6505966e-03,2.3698970e-03 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,-1.2721691e-01,1.8810988e-01 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,0.0000000e+00,0.0000000e+00 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,4.1950837e-02,7.3679973e-02 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,-1.9798569e-02,1.9798569e-02 -1,O16,nuclide_density,nu-fission,9.3633316e-01,2.0322303e+00 -1,O16,nuclide_density,scatter,-2.2042880e-01,1.6781769e-01 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,2.3761278e+00,2.3761278e+00 -1,U235,nuclide_density,nu-fission,7.7441706e+02,8.6460966e+01 -1,U235,nuclide_density,scatter,9.6917110e+01,1.0750583e+01 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,-2.0607997e-06,2.0607997e-06 -1,,temperature,nu-fission,3.8846012e-06,3.5405078e-05 -1,,temperature,scatter,-6.6772461e-07,2.0750790e-07 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,0.0000000e+00,0.0000000e+00 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,0.0000000e+00,0.0000000e+00 -3,,density,flux,-7.6179773e+00,5.0326448e+00 -3,,density,flux,-1.6242019e+01,6.6231769e+00 -1,,density,flux,-2.2394711e-01,5.4534246e-02 -1,,density,flux,-5.7132388e-02,1.6898131e-01 -1,O16,nuclide_density,flux,-1.3403627e+01,1.3017120e+01 -1,O16,nuclide_density,flux,-1.0499675e+01,2.1684952e+01 -1,U235,nuclide_density,flux,-2.4741168e+03,5.7986931e+01 -1,U235,nuclide_density,flux,-1.9955529e+03,4.3254814e+02 -1,,temperature,flux,1.0601812e-04,3.3076564e-04 -1,,temperature,flux,1.6664397e-04,2.8761161e-04 -3,,density,total,-3.3161583e+00,2.5615932e+00 -3,,density,absorption,-4.3491247e-01,5.1559026e-01 -3,,density,scatter,-2.8812458e+00,2.0540304e+00 -3,,density,fission,-2.3060366e-01,3.1191112e-01 -3,,density,nu-fission,-5.6817321e-01,7.6143397e-01 -3,,density,total,-2.8908006e-01,3.9383187e-01 -3,,density,absorption,-2.5237484e-01,3.6565057e-01 -3,,density,scatter,-3.6705219e-02,2.9275369e-02 -3,,density,fission,-2.1271120e-01,3.0873701e-01 -3,,density,nu-fission,-5.1866339e-01,7.5235541e-01 -3,,density,total,2.7320555e+00,8.7709460e+00 -3,,density,absorption,8.4322459e-02,1.2807898e-01 -3,,density,scatter,2.6477331e+00,8.6432562e+00 +3,,density,flux,-4.5951022e+00,4.0201889e-01 +3,,density,flux,-9.9630192e+00,1.8897688e+00 +1,,density,flux,-4.2074596e-01,6.8569557e-02 +1,,density,flux,-2.8861314e-01,1.0032157e-01 +1,O16,nuclide_density,flux,-1.7146771e+01,1.8740496e+01 +1,O16,nuclide_density,flux,-1.4411733e+01,1.5986415e+01 +1,U235,nuclide_density,flux,-3.1082590e+03,3.5930199e+02 +1,U235,nuclide_density,flux,-2.5816702e+03,2.4275334e+02 +1,,temperature,flux,-2.2847162e-06,3.5489476e-04 +1,,temperature,flux,-8.5566667e-05,4.3023777e-04 +3,,density,total,-1.5582276e+00,2.8496759e-01 +3,,density,absorption,1.5711173e-01,1.7341244e-01 +3,,density,scatter,-1.7153393e+00,1.9431809e-01 +3,,density,fission,2.0152323e-01,7.4786095e-02 +3,,density,nu-fission,4.8687131e-01,1.8265878e-01 +3,,density,total,2.2943608e-01,8.6539576e-02 +3,,density,absorption,2.4646330e-01,8.6186628e-02 +3,,density,scatter,-1.7027217e-02,3.1732345e-03 +3,,density,fission,2.1668870e-01,7.5183313e-02 +3,,density,nu-fission,5.2774399e-01,1.8320780e-01 +3,,density,total,1.3300225e+01,4.2626034e+00 +3,,density,absorption,2.3903751e-01,8.9355264e-02 +3,,density,scatter,1.3061188e+01,4.1751261e+00 3,,density,fission,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,total,0.0000000e+00,0.0000000e+00 @@ -69,19 +29,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 3,,density,scatter,0.0000000e+00,0.0000000e+00 3,,density,fission,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,total,4.7523458e-01,2.5651989e-02 -1,,density,absorption,3.1301277e-02,7.6793124e-03 -1,,density,scatter,4.4393330e-01,1.8023240e-02 -1,,density,fission,1.5559382e-02,3.2310296e-03 -1,,density,nu-fission,3.8658175e-02,7.8012239e-03 -1,,density,total,2.2062973e-02,4.3689056e-03 -1,,density,absorption,1.6845658e-02,4.0750597e-03 -1,,density,scatter,5.2173154e-03,2.9663441e-04 -1,,density,fission,1.3503676e-02,3.2642872e-03 -1,,density,nu-fission,3.2945540e-02,7.9507678e-03 -1,,density,total,-9.4735075e-02,2.5584662e-01 -1,,density,absorption,-4.0246308e-03,5.2111771e-03 -1,,density,scatter,-9.0710444e-02,2.5073759e-01 +1,,density,total,3.3373495e-01,4.6827421e-02 +1,,density,absorption,6.7487092e-04,6.5232977e-03 +1,,density,scatter,3.3306008e-01,4.0307583e-02 +1,,density,fission,-1.8402784e-03,4.2206212e-03 +1,,density,nu-fission,-3.8312038e-03,1.0337874e-02 +1,,density,total,-2.4831544e-04,5.5020059e-03 +1,,density,absorption,-4.0311629e-03,5.0266899e-03 +1,,density,scatter,3.7828475e-03,4.8043964e-04 +1,,density,fission,-3.6379968e-03,4.1821819e-03 +1,,density,nu-fission,-8.8266852e-03,1.0193373e-02 +1,,density,total,-3.6848185e-01,1.9314902e-01 +1,,density,absorption,-7.3640407e-03,4.0184508e-03 +1,,density,scatter,-3.6111780e-01,1.8936612e-01 1,,density,fission,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 1,,density,total,0.0000000e+00,0.0000000e+00 @@ -89,19 +49,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,,density,scatter,0.0000000e+00,0.0000000e+00 1,,density,fission,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,total,4.4488235e+01,5.3981552e+00 -1,O16,nuclide_density,absorption,-2.9372260e-01,9.3282726e-01 -1,O16,nuclide_density,scatter,4.4781958e+01,4.5257514e+00 -1,O16,nuclide_density,fission,9.9830021e-02,4.0698873e-01 -1,O16,nuclide_density,nu-fission,2.3343404e-01,9.8749080e-01 -1,O16,nuclide_density,total,4.0916790e-02,6.2301743e-01 -1,O16,nuclide_density,absorption,8.8291907e-02,5.5570859e-01 -1,O16,nuclide_density,scatter,-4.7375117e-02,6.7714014e-02 -1,O16,nuclide_density,fission,1.3678946e-01,4.4006360e-01 -1,O16,nuclide_density,nu-fission,3.3258041e-01,1.0719299e+00 -1,O16,nuclide_density,total,-1.6055867e+01,2.3439329e+01 -1,O16,nuclide_density,absorption,-3.9601159e-01,3.0131618e-01 -1,O16,nuclide_density,scatter,-1.5659856e+01,2.3140401e+01 +1,O16,nuclide_density,total,3.9050701e+01,8.5131265e+00 +1,O16,nuclide_density,absorption,-7.7573286e-01,7.1182570e-01 +1,O16,nuclide_density,scatter,3.9826434e+01,7.8536529e+00 +1,O16,nuclide_density,fission,-4.2193390e-01,6.0091792e-01 +1,O16,nuclide_density,nu-fission,-1.0411912e+00,1.4662352e+00 +1,O16,nuclide_density,total,-5.8976625e-01,7.9559349e-01 +1,O16,nuclide_density,absorption,-5.0047331e-01,7.1666177e-01 +1,O16,nuclide_density,scatter,-8.9292946e-02,8.9937898e-02 +1,O16,nuclide_density,fission,-3.6634959e-01,6.1270658e-01 +1,O16,nuclide_density,nu-fission,-8.9338374e-01,1.4932014e+00 +1,O16,nuclide_density,total,-3.3511352e+00,2.2365725e+01 +1,O16,nuclide_density,absorption,1.5473875e-01,4.3692662e-01 +1,O16,nuclide_density,scatter,-3.5058740e+00,2.1928948e+01 1,O16,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,total,0.0000000e+00,0.0000000e+00 @@ -109,19 +69,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,total,-6.1444882e+02,6.0111765e+01 -1,U235,nuclide_density,absorption,2.3977145e+02,4.5868416e+01 -1,U235,nuclide_density,scatter,-8.5422027e+02,2.4877998e+01 -1,U235,nuclide_density,fission,3.1319140e+02,3.1465133e+01 -1,U235,nuclide_density,nu-fission,7.6415485e+02,7.6501622e+01 -1,U235,nuclide_density,total,5.0916190e+02,3.5499332e+01 -1,U235,nuclide_density,absorption,3.9477370e+02,3.4326175e+01 -1,U235,nuclide_density,scatter,1.1438820e+02,2.7378233e+00 -1,U235,nuclide_density,fission,3.1360747e+02,3.2243613e+01 -1,U235,nuclide_density,nu-fission,7.6527247e+02,7.8683716e+01 -1,U235,nuclide_density,total,-4.1815705e+03,8.7796625e+02 -1,U235,nuclide_density,absorption,-1.0563225e+02,2.5308631e+01 -1,U235,nuclide_density,scatter,-4.0759382e+03,8.5332198e+02 +1,U235,nuclide_density,total,-9.1643805e+02,1.8814046e+02 +1,U235,nuclide_density,absorption,1.8114000e+02,4.6345847e+01 +1,U235,nuclide_density,scatter,-1.0975781e+03,1.4310981e+02 +1,U235,nuclide_density,fission,2.8765342e+02,2.2586319e+01 +1,U235,nuclide_density,nu-fission,7.0175585e+02,5.5024716e+01 +1,U235,nuclide_density,total,4.6786282e+02,2.8271731e+01 +1,U235,nuclide_density,absorption,3.6134508e+02,2.8453765e+01 +1,U235,nuclide_density,scatter,1.0651774e+02,1.3120589e+00 +1,U235,nuclide_density,fission,2.8859249e+02,2.2522591e+01 +1,U235,nuclide_density,nu-fission,7.0430623e+02,5.4858487e+01 +1,U235,nuclide_density,total,-5.0586963e+03,6.7151365e+02 +1,U235,nuclide_density,absorption,-1.2315731e+02,1.8905184e+01 +1,U235,nuclide_density,scatter,-4.9355390e+03,6.5260939e+02 1,U235,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,total,0.0000000e+00,0.0000000e+00 @@ -129,19 +89,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,total,2.1367126e-04,1.8632825e-04 -1,,temperature,absorption,6.9456243e-05,3.2199405e-05 -1,,temperature,scatter,1.4421502e-04,1.5754186e-04 -1,,temperature,fission,3.0674921e-06,1.8048386e-05 -1,,temperature,nu-fission,7.4768732e-06,4.3976788e-05 -1,,temperature,total,5.8223046e-06,2.3786485e-05 -1,,temperature,absorption,5.2142631e-06,2.1901921e-05 -1,,temperature,scatter,6.0804154e-07,1.9834897e-06 -1,,temperature,fission,3.0674141e-06,1.8048551e-05 -1,,temperature,nu-fission,7.4766883e-06,4.3977175e-05 -1,,temperature,total,2.1510094e-04,4.6388764e-04 -1,,temperature,absorption,2.2409493e-06,8.2901087e-06 -1,,temperature,scatter,2.1285999e-04,4.5560092e-04 +1,,temperature,total,8.6368265e-05,1.7363899e-04 +1,,temperature,absorption,1.9220262e-05,3.4988977e-05 +1,,temperature,scatter,6.7148003e-05,1.4635162e-04 +1,,temperature,fission,-5.2927287e-06,1.2158338e-05 +1,,temperature,nu-fission,-1.2897086e-05,2.9622912e-05 +1,,temperature,total,-4.2009323e-06,1.8263855e-05 +1,,temperature,absorption,-4.3037914e-06,1.6219907e-05 +1,,temperature,scatter,1.0285902e-07,2.0676492e-06 +1,,temperature,fission,-5.2953783e-06,1.2158786e-05 +1,,temperature,nu-fission,-1.2903531e-05,2.9624000e-05 +1,,temperature,total,-1.1160261e-04,6.1705782e-04 +1,,temperature,absorption,-2.0394397e-06,8.4055062e-06 +1,,temperature,scatter,-1.0956317e-04,6.0869070e-04 1,,temperature,fission,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 1,,temperature,total,0.0000000e+00,0.0000000e+00 @@ -149,29 +109,69 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,,temperature,scatter,0.0000000e+00,0.0000000e+00 1,,temperature,fission,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,absorption,-1.6517209e-01,3.0984748e-01 -3,,density,absorption,8.0401451e-03,1.4689308e-01 -1,,density,absorption,2.9069923e-02,2.2139686e-03 -1,,density,absorption,-9.4690017e-03,8.6605404e-03 -1,O16,nuclide_density,absorption,7.6912288e-01,4.1945623e-01 -1,O16,nuclide_density,absorption,-6.3724748e-01,6.6341497e-01 -1,U235,nuclide_density,absorption,1.4109552e+02,1.8518919e+01 -1,U235,nuclide_density,absorption,-1.2052821e+02,3.2084005e+01 -1,,temperature,absorption,3.9995382e-05,2.1703359e-05 -1,,temperature,absorption,2.7274368e-06,8.9339250e-06 +3,,density,absorption,1.3594219e-01,1.0122046e-01 +3,,density,absorption,2.8656499e-01,3.7923985e-02 +1,,density,absorption,-2.2106085e-03,9.8387075e-03 +1,,density,absorption,-3.3239716e-03,8.7768141e-03 +1,O16,nuclide_density,absorption,-1.2640173e+00,9.1596515e-01 +1,O16,nuclide_density,absorption,1.3146714e-01,9.9380272e-01 +1,U235,nuclide_density,absorption,1.5677452e+02,8.1085465e+01 +1,U235,nuclide_density,absorption,-1.4334804e+02,3.2100956e+01 +1,,temperature,absorption,-8.9633351e-06,3.5750907e-05 +1,,temperature,absorption,7.0140498e-07,1.1694324e-05 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,-8.7934549e-01,1.0210652e+00 +3,,density,scatter,4.7213241e-01,1.6556808e-01 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,-3.5236517e-03,3.5236517e-03 -3,,density,nu-fission,7.2952775e-02,2.9725868e-01 -3,,density,scatter,-2.2716407e+00,1.2546346e+00 -3,,density,nu-fission,8.9171241e-02,3.0634860e-01 -3,,density,scatter,-1.0151726e-03,9.6296789e-03 +3,,density,scatter,3.4067110e-02,2.1267271e-02 +3,,density,nu-fission,4.1265284e-01,1.3891654e-01 +3,,density,scatter,-2.1663022e+00,3.2444877e-01 +3,,density,nu-fission,4.4524898e-01,1.4098968e-01 +3,,density,scatter,-2.1357153e-02,1.7423446e-02 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,2.3163919e+00,4.8766694e+00 +3,,density,scatter,8.6343785e+00,2.9292930e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,scatter,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,4.0762347e-01,3.8504133e+00 +3,,density,scatter,4.3792818e+00,1.9915652e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,scatter,0.0000000e+00,0.0000000e+00 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,-5.0479210e-03,9.5688761e-03 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,4.4418327e-04,7.8121620e-04 +1,,density,nu-fission,-1.9240114e-02,1.4935352e-02 +1,,density,scatter,3.4099348e-01,2.8182893e-02 +1,,density,nu-fission,-2.4226858e-02,1.4481188e-02 +1,,density,scatter,1.1073847e-03,2.7478584e-04 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,-2.7695506e-01,1.3529978e-01 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,0.0000000e+00,0.0000000e+00 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,-8.8202815e-02,7.8863942e-02 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,1.1279170e-01,6.9836765e-02 +1,O16,nuclide_density,nu-fission,-1.6695105e+00,1.6777445e+00 +1,O16,nuclide_density,scatter,-1.0671543e-01,1.9127943e-01 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,6.3235790e+00,3.9733167e+00 +1,U235,nuclide_density,nu-fission,6.2368225e+02,1.0172850e+02 +1,U235,nuclide_density,scatter,3.2601903e+01,6.2672072e+00 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,-2.0884127e-06,1.6684645e-06 +1,,temperature,nu-fission,-1.5670247e-05,4.5939944e-05 +1,,temperature,scatter,3.9749436e-06,3.9749436e-06 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,0.0000000e+00,0.0000000e+00 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,0.0000000e+00,0.0000000e+00 diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index cd26a0e7c..85d35b081 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1,62 +1,62 @@ - - - - - - 2.0 2.0 - 1 - 2 2 - -2.0 -2.0 - + + + + + + 2.0 2.0 + 1 + 2 2 + -2.0 -2.0 + 11 11 11 11 - - - - - - + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - eigenvalue - 1000 - 5 - 0 - - - -1 -1 -1 1 1 1 - - + eigenvalue + 1000 + 5 + 0 + + + -1 -1 -1 1 1 1 + + - - 0 0 0 - 7 7 - 400 400 - - - 0 0 0 - 7 7 - 400 400 - + + 0 0 0 + 7 7 + 400 400 + + + 0 0 0 + 7 7 + 400 400 + diff --git a/tests/test_distribmat/results_true.dat b/tests/test_distribmat/results_true.dat index a47d167e2..cd6aa95d4 100644 --- a/tests/test_distribmat/results_true.dat +++ b/tests/test_distribmat/results_true.dat @@ -4,6 +4,6 @@ Cell ID = 11 Name = Fill = [2, 3, None, 2] - Region = -10000 + Region = -9 Rotation = None Translation = None diff --git a/tests/test_energy_cutoff/inputs_true.dat b/tests/test_energy_cutoff/inputs_true.dat index a2d2967c0..17851b05a 100644 --- a/tests/test_energy_cutoff/inputs_true.dat +++ b/tests/test_energy_cutoff/inputs_true.dat @@ -1,42 +1,42 @@ - - - - - - - + + + + + + + - - - - + + + + - fixed source - 100 - 10 - - - -1 -1 -1 1 1 1 - - - - - 4.0 - + fixed source + 100 + 10 + + + -1 -1 -1 1 1 1 + + + + + 4.0 + - - 0.0 4.0 - - - 10000 - flux - + + 0.0 4.0 + + + 1 + flux + diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index cbf6183d1..d857451cb 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,200 +127,200 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 1e-05 0.369 1000.0 100000.0 600000.0 1000000.0 2000000.0 4000000.0 30000000.0 - 0.1 0.1 0.1333 0.158 0.18467 0.25618 0.4297 0.48 0.48 - - - Am241 - (n,gamma) - - - 10000 - Am241 - (n,gamma) - + + 1e-05 0.369 1000.0 100000.0 600000.0 1000000.0 2000000.0 4000000.0 30000000.0 + 0.1 0.1 0.1333 0.158 0.18467 0.25618 0.4297 0.48 0.48 + + + Am241 + (n,gamma) + + + 1 + Am241 + (n,gamma) + diff --git a/tests/test_filter_energyfun/results_true.dat b/tests/test_filter_energyfun/results_true.dat index 8e48e5f3c..4c9f5ec0a 100644 --- a/tests/test_filter_energyfun/results_true.dat +++ b/tests/test_filter_energyfun/results_true.dat @@ -1,2 +1,2 @@ energyfunction nuclide score mean std. dev. -0 ac03185c35fac8 Am241 (n,gamma) 1.00e-01 6.22e-03 +0 02180f5f310ee4 Am241 (n,gamma) 1.00e-01 9.97e-03 diff --git a/tests/test_filter_energyfun/test_filter_energyfun.py b/tests/test_filter_energyfun/test_filter_energyfun.py index 07ae993a9..7e787edff 100644 --- a/tests/test_filter_energyfun/test_filter_energyfun.py +++ b/tests/test_filter_energyfun/test_filter_energyfun.py @@ -29,7 +29,7 @@ class FilterEnergyFunHarness(PyAPITestHarness): assert filt1 == filt2, 'Error with the .from_tabulated1d constructor' # Make tallies. - tallies = [openmc.Tally(), openmc.Tally()] + tallies = [openmc.Tally(1), openmc.Tally(2)] for t in tallies: t.scores = ['(n,gamma)'] t.nuclides = ['Am241'] @@ -42,7 +42,7 @@ class FilterEnergyFunHarness(PyAPITestHarness): sp = openmc.StatePoint(statepoint) # Use tally arithmetic to compute the branching ratio. - br_tally = sp.tallies[10001] / sp.tallies[10000] + br_tally = sp.tallies[2] / sp.tallies[1] # Output the tally in a Pandas DataFrame. return br_tally.get_pandas_dataframe().to_string() + '\n' diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index e5d900624..6d14f9e7e 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,234 +127,234 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 17 - -182.07 - 182.07 - - - 17 17 - -182.07 -182.07 - 182.07 182.07 - - - 17 17 17 - -182.07 -182.07 -183.0 - 182.07 182.07 183.0 - - - 1 - - - 2 - - - 3 - - - 10000 - total - - - 10000 - current - - - 10001 - total - - - 10001 - current - - - 10002 - total - - - 10002 - current - + + 17 + -182.07 + 182.07 + + + 17 17 + -182.07 -182.07 + 182.07 182.07 + + + 17 17 17 + -182.07 -182.07 -183.0 + 182.07 182.07 183.0 + + + 1 + + + 2 + + + 3 + + + 1 + total + + + 1 + current + + + 2 + total + + + 2 + current + + + 3 + total + + + 3 + current + diff --git a/tests/test_filter_mesh/results_true.dat b/tests/test_filter_mesh/results_true.dat index 61ba50e20..ac3439da5 100644 --- a/tests/test_filter_mesh/results_true.dat +++ b/tests/test_filter_mesh/results_true.dat @@ -1 +1 @@ -2416e74f84dd57c46a6e2fc94e8f794d9725cae964beaf4659f06aae5ed2b804b968cf2ca512b461d6e59e998f61a967db2f2fe97ce22e7607444f50ca38f646 \ No newline at end of file +804d161cb8eae506d3247a533d122f44a01d3cedd566b3c65c71a0b51326dd9b97f8bbf45af7304b500476f3f854d91b10ccad94122d15f23641b05b835fada6 \ No newline at end of file diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 9eee57672..098056f5b 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,183 +127,183 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + diff --git a/tests/test_iso_in_lab/results_true.dat b/tests/test_iso_in_lab/results_true.dat index c3fc1cf05..844bc2e8e 100644 --- a/tests/test_iso_in_lab/results_true.dat +++ b/tests/test_iso_in_lab/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.753410E-01 6.608253E-02 +9.672875E-01 3.577848E-02 diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 9e722493a..220b1de24 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1,97 +1,97 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat index 85eeb3a24..e2c3a01fa 100644 --- a/tests/test_mg_convert/inputs_true.dat +++ b/tests/test_mg_convert/inputs_true.dat @@ -1,29 +1,29 @@ - - - - - + + + + + - ./mgxs.h5 - - - - + ./mgxs.h5 + + + + - eigenvalue - 100 - 10 - 5 - - - -5 -5 -5 5 5 5 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + -5 -5 -5 5 5 5 + + + multi-group diff --git a/tests/test_mg_legendre/inputs_true.dat b/tests/test_mg_legendre/inputs_true.dat index 05614b279..9b63fb944 100644 --- a/tests/test_mg_legendre/inputs_true.dat +++ b/tests/test_mg_legendre/inputs_true.dat @@ -1,46 +1,46 @@ - - - - - - - - - - - + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - - false - + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + + false + diff --git a/tests/test_mg_max_order/inputs_true.dat b/tests/test_mg_max_order/inputs_true.dat index 07725dd31..3954bc73a 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -1,44 +1,44 @@ - - - - - - - - - - - + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - 1 + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + 1 diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index 4225f7571..d42b15480 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -1,97 +1,97 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group diff --git a/tests/test_mg_survival_biasing/inputs_true.dat b/tests/test_mg_survival_biasing/inputs_true.dat index de6e04644..057af6810 100644 --- a/tests/test_mg_survival_biasing/inputs_true.dat +++ b/tests/test_mg_survival_biasing/inputs_true.dat @@ -1,98 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - true + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + true diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 9aeb28a94..0c71689ae 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1,229 +1,229 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group - - 1 1 10 - 0.0 0.0 0.0 - 10 10 5 - - - 1 - - - 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - - - 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - - - 10004 - total absorption flux fission nu-fission - analog - - - 10004 - total absorption flux fission nu-fission - tracklength - - - 10005 10000 - total absorption flux fission nu-fission scatter nu-scatter - analog - - - 10005 10000 - total absorption flux fission nu-fission - collision - - - 10005 10000 - total absorption flux fission nu-fission - tracklength - - - 10005 10000 10001 - scatter nu-scatter nu-fission - - - 10005 10002 - total absorption flux fission nu-fission scatter nu-scatter - analog - - - 10005 10002 - total absorption flux fission nu-fission - collision - - - 10005 10002 - total absorption flux fission nu-fission - tracklength - - - 10005 10002 10003 - scatter nu-scatter nu-fission - - - 10004 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - analog - - - 10004 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 10005 10000 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission scatter nu-scatter - analog - - - 10005 10000 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - collision - - - 10005 10000 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 10005 10000 10001 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - scatter nu-scatter nu-fission - - - 10005 10002 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission scatter nu-scatter - analog - - - 10005 10002 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - collision - - - 10005 10002 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 10005 10002 10003 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - scatter nu-scatter nu-fission - + + 1 1 10 + 0.0 0.0 0.0 + 10 10 5 + + + 1 + + + 1 2 3 4 5 6 7 8 9 10 11 12 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 5 + total absorption flux fission nu-fission + analog + + + 5 + total absorption flux fission nu-fission + tracklength + + + 6 1 + total absorption flux fission nu-fission scatter nu-scatter + analog + + + 6 1 + total absorption flux fission nu-fission + collision + + + 6 1 + total absorption flux fission nu-fission + tracklength + + + 6 1 2 + scatter nu-scatter nu-fission + + + 6 3 + total absorption flux fission nu-fission scatter nu-scatter + analog + + + 6 3 + total absorption flux fission nu-fission + collision + + + 6 3 + total absorption flux fission nu-fission + tracklength + + + 6 3 4 + scatter nu-scatter nu-fission + + + 5 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + analog + + + 5 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission scatter nu-scatter + analog + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + collision + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 1 2 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + scatter nu-scatter nu-fission + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission scatter nu-scatter + analog + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + collision + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 3 4 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + scatter nu-scatter nu-fission + diff --git a/tests/test_mg_tallies/results_true.dat b/tests/test_mg_tallies/results_true.dat index db7735cb4..87470bdf4 100644 --- a/tests/test_mg_tallies/results_true.dat +++ b/tests/test_mg_tallies/results_true.dat @@ -1 +1 @@ -0a17877c7cf6dbd3e432b1997669a47c588d2a4074a29406deef27332eb7a0f736ea1fdc2037fc02f8ebca39f00332563bbe2172adc26bfaab2d6144d259daee \ No newline at end of file +9183f8b191f2e62334f992acd865d29e3f4e3f871a6df498e280fc4e2d91f2d2d20c732fbd75fa88e2e8c576f86e744f7655af6bb9da66e9b28b1009c8742899 \ No newline at end of file diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index faddd4645..8e8cde281 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1,248 +1,248 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 10000 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 10001 - - - 10002 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10006 - total - nu-fission - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10006 - total - nu-scatter-P3 - analog - - - 10000 10001 10006 - total - nu-scatter - analog - - - 10000 10001 10006 - total - scatter - analog - - - 10013 10001 - total - flux - tracklength - - - 10013 10001 - total - total - tracklength - - - 10013 10001 - total - flux - tracklength - - - 10013 10001 - total - absorption - tracklength - - - 10013 10001 - total - flux - analog - - - 10013 10001 10006 - total - nu-fission - analog - - - 10013 10001 - total - flux - analog - - - 10013 10001 10006 - total - nu-scatter-P3 - analog - - - 10013 10001 10006 - total - nu-scatter - analog - - - 10013 10001 10006 - total - scatter - analog - - - 10026 10001 - total - flux - tracklength - - - 10026 10001 - total - total - tracklength - - - 10026 10001 - total - flux - tracklength - - - 10026 10001 - total - absorption - tracklength - - - 10026 10001 - total - flux - analog - - - 10026 10001 10006 - total - nu-fission - analog - - - 10026 10001 - total - flux - analog - - - 10026 10001 10006 - total - nu-scatter-P3 - analog - - - 10026 10001 10006 - total - nu-scatter - analog - - - 10026 10001 10006 - total - scatter - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + analog + + + 1 2 7 + total + nu-fission + analog + + + 1 2 + total + flux + analog + + + 1 2 7 + total + nu-scatter-P3 + analog + + + 1 2 7 + total + nu-scatter + analog + + + 1 2 7 + total + scatter + analog + + + 14 2 + total + flux + tracklength + + + 14 2 + total + total + tracklength + + + 14 2 + total + flux + tracklength + + + 14 2 + total + absorption + tracklength + + + 14 2 + total + flux + analog + + + 14 2 7 + total + nu-fission + analog + + + 14 2 + total + flux + analog + + + 14 2 7 + total + nu-scatter-P3 + analog + + + 14 2 7 + total + nu-scatter + analog + + + 14 2 7 + total + scatter + analog + + + 27 2 + total + flux + tracklength + + + 27 2 + total + total + tracklength + + + 27 2 + total + flux + tracklength + + + 27 2 + total + absorption + tracklength + + + 27 2 + total + flux + analog + + + 27 2 7 + total + nu-fission + analog + + + 27 2 + total + flux + analog + + + 27 2 7 + total + nu-scatter-P3 + analog + + + 27 2 7 + total + nu-scatter + analog + + + 27 2 7 + total + scatter + analog + diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index f33efe863..d2f28d0fe 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 10000 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 10001 - - - 10002 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - total - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-fission - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter-0 - analog - - - 10000 10001 10004 - total - scatter-0 - analog - - - 10000 10045 - total - nu-fission - analog - - - 10000 10004 - total - nu-fission - analog - - - 10000 10045 - total - prompt-nu-fission - analog - - - 10000 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10045 - total - delayed-nu-fission - analog - - - 10000 10058 10004 - total - delayed-nu-fission - analog - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - decay-rate - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - nu-scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - kappa-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 - total - nu-scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-fission - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter-0 - analog - - - 10073 10001 10004 - total - scatter-0 - analog - - - 10073 10045 - total - nu-fission - analog - - - 10073 10004 - total - nu-fission - analog - - - 10073 10045 - total - prompt-nu-fission - analog - - - 10073 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - inverse-velocity - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - prompt-nu-fission - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10045 - total - delayed-nu-fission - analog - - - 10073 10058 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - decay-rate - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - nu-scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - kappa-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 - total - nu-scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-fission - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter-0 - analog - - - 10146 10001 10004 - total - scatter-0 - analog - - - 10146 10045 - total - nu-fission - analog - - - 10146 10004 - total - nu-fission - analog - - - 10146 10045 - total - prompt-nu-fission - analog - - - 10146 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - inverse-velocity - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - prompt-nu-fission - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10045 - total - delayed-nu-fission - analog - - - 10146 10058 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - decay-rate - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10058 10001 10004 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index f69814444..0c9adedb1 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,273 +1,273 @@ material group in nuclide mean std. dev. -0 10000 1 total 0.453624 0.021053 +0 1 1 total 0.453624 0.021053 material group in nuclide mean std. dev. -0 10000 1 total 0.4074 0.021863 +0 1 1 total 0.4074 0.021863 material group in nuclide mean std. dev. -0 10000 1 total 0.4074 0.021863 +0 1 1 total 0.4074 0.021863 material group in nuclide mean std. dev. -0 10000 1 total 0.064903 0.004313 +0 1 1 total 0.064903 0.004313 material group in nuclide mean std. dev. -0 10000 1 total 0.028048 0.00458 +0 1 1 total 0.028048 0.00458 material group in nuclide mean std. dev. -0 10000 1 total 0.036855 0.002622 +0 1 1 total 0.036855 0.002622 material group in nuclide mean std. dev. -0 10000 1 total 0.090649 0.00641 +0 1 1 total 0.090649 0.00641 material group in nuclide mean std. dev. -0 10000 1 total 7.137954e+06 507363.468222 +0 1 1 total 7.137954e+06 507363.468222 material group in nuclide mean std. dev. -0 10000 1 total 0.388721 0.01783 +0 1 1 total 0.388721 0.01783 material group in nuclide mean std. dev. -0 10000 1 total 0.389304 0.023076 +0 1 1 total 0.389304 0.023076 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.389304 0.023146 -1 10000 1 1 total P1 0.046224 0.005907 -2 10000 1 1 total P2 0.017984 0.002883 -3 10000 1 1 total P3 0.006628 0.002457 +0 1 1 1 total P0 0.389304 0.023146 +1 1 1 1 total P1 0.046224 0.005907 +2 1 1 1 total P2 0.017984 0.002883 +3 1 1 1 total P3 0.006628 0.002457 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.389304 0.023146 -1 10000 1 1 total P1 0.046224 0.005907 -2 10000 1 1 total P2 0.017984 0.002883 -3 10000 1 1 total P3 0.006628 0.002457 +0 1 1 1 total P0 0.389304 0.023146 +1 1 1 1 total P1 0.046224 0.005907 +2 1 1 1 total P2 0.017984 0.002883 +3 1 1 1 total P3 0.006628 0.002457 material group in group out nuclide mean std. dev. -0 10000 1 1 total 1.0 0.066111 +0 1 1 1 total 1.0 0.066111 material group in group out nuclide mean std. dev. -0 10000 1 1 total 0.085835 0.005592 +0 1 1 1 total 0.085835 0.005592 material group in group out nuclide mean std. dev. -0 10000 1 1 total 1.0 0.066111 +0 1 1 1 total 1.0 0.066111 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.388721 0.031279 -1 10000 1 1 total P1 0.046155 0.006407 -2 10000 1 1 total P2 0.017957 0.003039 -3 10000 1 1 total P3 0.006618 0.002480 +0 1 1 1 total P0 0.388721 0.031279 +1 1 1 1 total P1 0.046155 0.006407 +2 1 1 1 total P2 0.017957 0.003039 +3 1 1 1 total P3 0.006618 0.002480 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.388721 0.040482 -1 10000 1 1 total P1 0.046155 0.007097 -2 10000 1 1 total P2 0.017957 0.003262 -3 10000 1 1 total P3 0.006618 0.002518 +0 1 1 1 total P0 0.388721 0.040482 +1 1 1 1 total P1 0.046155 0.007097 +2 1 1 1 total P2 0.017957 0.003262 +3 1 1 1 total P3 0.006618 0.002518 material group out nuclide mean std. dev. -0 10000 1 total 1.0 0.046071 +0 1 1 total 1.0 0.046071 material group out nuclide mean std. dev. -0 10000 1 total 1.0 0.051471 +0 1 1 total 1.0 0.051471 material group in nuclide mean std. dev. -0 10000 1 total 4.996730e-07 3.650633e-08 +0 1 1 total 4.996730e-07 3.650633e-08 material group in nuclide mean std. dev. -0 10000 1 total 0.090004 0.006367 +0 1 1 total 0.090004 0.006367 material group in group out nuclide mean std. dev. -0 10000 1 1 total 0.084542 0.005716 +0 1 1 1 total 0.084542 0.005716 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.000021 0.000001 -1 10000 2 1 total 0.000110 0.000008 -2 10000 3 1 total 0.000107 0.000007 -3 10000 4 1 total 0.000249 0.000017 -4 10000 5 1 total 0.000112 0.000007 -5 10000 6 1 total 0.000046 0.000003 +0 1 1 1 total 0.000021 0.000001 +1 1 2 1 total 0.000110 0.000008 +2 1 3 1 total 0.000107 0.000007 +3 1 4 1 total 0.000249 0.000017 +4 1 5 1 total 0.000112 0.000007 +5 1 6 1 total 0.000046 0.000003 material delayedgroup group out nuclide mean std. dev. -0 10000 1 1 total 0.0 0.000000 -1 10000 2 1 total 1.0 0.869128 -2 10000 3 1 total 1.0 1.414214 -3 10000 4 1 total 1.0 0.360359 -4 10000 5 1 total 0.0 0.000000 -5 10000 6 1 total 0.0 0.000000 +0 1 1 1 total 0.0 0.000000 +1 1 2 1 total 1.0 0.869128 +2 1 3 1 total 1.0 1.414214 +3 1 4 1 total 1.0 0.360359 +4 1 5 1 total 0.0 0.000000 +5 1 6 1 total 0.0 0.000000 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.000227 0.000020 -1 10000 2 1 total 0.001214 0.000108 -2 10000 3 1 total 0.001184 0.000104 -3 10000 4 1 total 0.002752 0.000240 -4 10000 5 1 total 0.001231 0.000105 -5 10000 6 1 total 0.000512 0.000044 +0 1 1 1 total 0.000227 0.000020 +1 1 2 1 total 0.001214 0.000108 +2 1 3 1 total 0.001184 0.000104 +3 1 4 1 total 0.002752 0.000240 +4 1 5 1 total 0.001231 0.000105 +5 1 6 1 total 0.000512 0.000044 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.013355 0.001207 -1 10000 2 1 total 0.032600 0.002866 -2 10000 3 1 total 0.121083 0.010442 -3 10000 4 1 total 0.305910 0.025627 -4 10000 5 1 total 0.861934 0.068281 -5 10000 6 1 total 2.895065 0.230223 +0 1 1 1 total 0.013355 0.001207 +1 1 2 1 total 0.032600 0.002866 +2 1 3 1 total 0.121083 0.010442 +3 1 4 1 total 0.305910 0.025627 +4 1 5 1 total 0.861934 0.068281 +5 1 6 1 total 2.895065 0.230223 material delayedgroup group in group out nuclide mean std. dev. -0 10000 1 1 1 total 0.000000 0.000000 -1 10000 2 1 1 total 0.000384 0.000236 -2 10000 3 1 1 total 0.000179 0.000180 -3 10000 4 1 1 total 0.000730 0.000188 -4 10000 5 1 1 total 0.000000 0.000000 -5 10000 6 1 1 total 0.000000 0.000000 +0 1 1 1 1 total 0.000000 0.000000 +1 1 2 1 1 total 0.000384 0.000236 +2 1 3 1 1 total 0.000179 0.000180 +3 1 4 1 1 total 0.000730 0.000188 +4 1 5 1 1 total 0.000000 0.000000 +5 1 6 1 1 total 0.000000 0.000000 material group in nuclide mean std. dev. -0 10001 1 total 0.311594 0.013793 +0 2 1 total 0.311594 0.013793 material group in nuclide mean std. dev. -0 10001 1 total 0.280977 0.015683 +0 2 1 total 0.280977 0.015683 material group in nuclide mean std. dev. -0 10001 1 total 0.280977 0.015683 +0 2 1 total 0.280977 0.015683 material group in nuclide mean std. dev. -0 10001 1 total 0.00221 0.000286 +0 2 1 total 0.00221 0.000286 material group in nuclide mean std. dev. -0 10001 1 total 0.00221 0.000286 +0 2 1 total 0.00221 0.000286 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.309384 0.013551 +0 2 1 total 0.309384 0.013551 material group in nuclide mean std. dev. -0 10001 1 total 0.307987 0.029308 +0 2 1 total 0.307987 0.029308 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.307987 0.029308 -1 10001 1 1 total P1 0.030617 0.007464 -2 10001 1 1 total P2 0.018911 0.004323 -3 10001 1 1 total P3 0.006235 0.003338 +0 2 1 1 total P0 0.307987 0.029308 +1 2 1 1 total P1 0.030617 0.007464 +2 2 1 1 total P2 0.018911 0.004323 +3 2 1 1 total P3 0.006235 0.003338 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.307987 0.029308 -1 10001 1 1 total P1 0.030617 0.007464 -2 10001 1 1 total P2 0.018911 0.004323 -3 10001 1 1 total P3 0.006235 0.003338 +0 2 1 1 total P0 0.307987 0.029308 +1 2 1 1 total P1 0.030617 0.007464 +2 2 1 1 total P2 0.018911 0.004323 +3 2 1 1 total P3 0.006235 0.003338 material group in group out nuclide mean std. dev. -0 10001 1 1 total 1.0 0.095039 +0 2 1 1 total 1.0 0.095039 material group in group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10001 1 1 total 1.0 0.095039 +0 2 1 1 total 1.0 0.095039 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.309384 0.032376 -1 10001 1 1 total P1 0.030756 0.007617 -2 10001 1 1 total P2 0.018997 0.004420 -3 10001 1 1 total P3 0.006263 0.003364 +0 2 1 1 total P0 0.309384 0.032376 +1 2 1 1 total P1 0.030756 0.007617 +2 2 1 1 total P2 0.018997 0.004420 +3 2 1 1 total P3 0.006263 0.003364 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.309384 0.043735 -1 10001 1 1 total P1 0.030756 0.008159 -2 10001 1 1 total P2 0.018997 0.004775 -3 10001 1 1 total P3 0.006263 0.003417 +0 2 1 1 total P0 0.309384 0.043735 +1 2 1 1 total P1 0.030756 0.008159 +2 2 1 1 total P2 0.018997 0.004775 +3 2 1 1 total P3 0.006263 0.003417 material group out nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group out nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 5.454762e-07 4.949807e-08 +0 2 1 total 5.454762e-07 4.949807e-08 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -0 10001 1 1 1 total 0.0 0.0 -1 10001 2 1 1 total 0.0 0.0 -2 10001 3 1 1 total 0.0 0.0 -3 10001 4 1 1 total 0.0 0.0 -4 10001 5 1 1 total 0.0 0.0 -5 10001 6 1 1 total 0.0 0.0 +0 2 1 1 1 total 0.0 0.0 +1 2 2 1 1 total 0.0 0.0 +2 2 3 1 1 total 0.0 0.0 +3 2 4 1 1 total 0.0 0.0 +4 2 5 1 1 total 0.0 0.0 +5 2 6 1 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.904999 0.043964 +0 3 1 total 0.904999 0.043964 material group in nuclide mean std. dev. -0 10002 1 total 0.494581 0.046763 +0 3 1 total 0.494581 0.046763 material group in nuclide mean std. dev. -0 10002 1 total 0.494581 0.046763 +0 3 1 total 0.494581 0.046763 material group in nuclide mean std. dev. -0 10002 1 total 0.00606 0.000555 +0 3 1 total 0.00606 0.000555 material group in nuclide mean std. dev. -0 10002 1 total 0.00606 0.000555 +0 3 1 total 0.00606 0.000555 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.898938 0.043493 +0 3 1 total 0.898938 0.043493 material group in nuclide mean std. dev. -0 10002 1 total 0.903415 0.043959 +0 3 1 total 0.903415 0.043959 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.903415 0.043586 -1 10002 1 1 total P1 0.410417 0.015877 -2 10002 1 1 total P2 0.143301 0.007187 -3 10002 1 1 total P3 0.008739 0.003571 +0 3 1 1 total P0 0.903415 0.043586 +1 3 1 1 total P1 0.410417 0.015877 +2 3 1 1 total P2 0.143301 0.007187 +3 3 1 1 total P3 0.008739 0.003571 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.903415 0.043586 -1 10002 1 1 total P1 0.410417 0.015877 -2 10002 1 1 total P2 0.143301 0.007187 -3 10002 1 1 total P3 0.008739 0.003571 +0 3 1 1 total P0 0.903415 0.043586 +1 3 1 1 total P1 0.410417 0.015877 +2 3 1 1 total P2 0.143301 0.007187 +3 3 1 1 total P3 0.008739 0.003571 material group in group out nuclide mean std. dev. -0 10002 1 1 total 1.0 0.056867 +0 3 1 1 total 1.0 0.056867 material group in group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10002 1 1 total 1.0 0.056867 +0 3 1 1 total 1.0 0.056867 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.898938 0.067118 -1 10002 1 1 total P1 0.408384 0.028127 -2 10002 1 1 total P2 0.142591 0.010824 -3 10002 1 1 total P3 0.008696 0.003588 +0 3 1 1 total P0 0.898938 0.067118 +1 3 1 1 total P1 0.408384 0.028127 +2 3 1 1 total P2 0.142591 0.010824 +3 3 1 1 total P3 0.008696 0.003588 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.898938 0.084369 -1 10002 1 1 total P1 0.408384 0.036475 -2 10002 1 1 total P2 0.142591 0.013525 -3 10002 1 1 total P3 0.008696 0.003622 +0 3 1 1 total P0 0.898938 0.084369 +1 3 1 1 total P1 0.408384 0.036475 +2 3 1 1 total P2 0.142591 0.013525 +3 3 1 1 total P3 0.008696 0.003622 material group out nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group out nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 5.773007e-07 5.322133e-08 +0 3 1 total 5.773007e-07 5.322133e-08 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -0 10002 1 1 1 total 0.0 0.0 -1 10002 2 1 1 total 0.0 0.0 -2 10002 3 1 1 total 0.0 0.0 -3 10002 4 1 1 total 0.0 0.0 -4 10002 5 1 1 total 0.0 0.0 -5 10002 6 1 1 total 0.0 0.0 +0 3 1 1 1 total 0.0 0.0 +1 3 2 1 1 total 0.0 0.0 +2 3 3 1 1 total 0.0 0.0 +3 3 4 1 1 total 0.0 0.0 +4 3 5 1 1 total 0.0 0.0 +5 3 6 1 1 total 0.0 0.0 diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 44b7eb1d8..d7a4a186a 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1,464 +1,464 @@ - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10000 10000 10000 -10000 10000 10000 10001 10000 10000 10000 10000 10000 10000 10000 10000 10000 10001 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10001 10000 10000 10000 10000 10000 10000 10000 10000 10000 10001 10000 10000 10000 -10000 10000 10000 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 - - - - - - - + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -10.71 -10.71 -1 10.71 10.71 1 - - + eigenvalue + 100 + 10 + 5 + + + -10.71 -10.71 -1 10.71 10.71 1 + + - - 10000 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - total - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-fission - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter-0 - analog - - - 10000 10001 10004 - total - scatter-0 - analog - - - 10000 10001 - total - nu-fission - analog - - - 10000 10004 - total - nu-fission - analog - - - 10000 10001 - total - prompt-nu-fission - analog - - - 10000 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - analog - - - 10000 10058 10004 - total - delayed-nu-fission - analog - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - decay-rate - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10058 10001 10004 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 2 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 2 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index f33efe863..d2f28d0fe 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 10000 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 10001 - - - 10002 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - total - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-fission - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter-0 - analog - - - 10000 10001 10004 - total - scatter-0 - analog - - - 10000 10045 - total - nu-fission - analog - - - 10000 10004 - total - nu-fission - analog - - - 10000 10045 - total - prompt-nu-fission - analog - - - 10000 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10045 - total - delayed-nu-fission - analog - - - 10000 10058 10004 - total - delayed-nu-fission - analog - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - decay-rate - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - nu-scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - kappa-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 - total - nu-scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-fission - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter-0 - analog - - - 10073 10001 10004 - total - scatter-0 - analog - - - 10073 10045 - total - nu-fission - analog - - - 10073 10004 - total - nu-fission - analog - - - 10073 10045 - total - prompt-nu-fission - analog - - - 10073 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - inverse-velocity - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - prompt-nu-fission - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10045 - total - delayed-nu-fission - analog - - - 10073 10058 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - decay-rate - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - nu-scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - kappa-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 - total - nu-scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-fission - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter-0 - analog - - - 10146 10001 10004 - total - scatter-0 - analog - - - 10146 10045 - total - nu-fission - analog - - - 10146 10004 - total - nu-fission - analog - - - 10146 10045 - total - prompt-nu-fission - analog - - - 10146 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - inverse-velocity - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - prompt-nu-fission - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10045 - total - delayed-nu-fission - analog - - - 10146 10058 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - decay-rate - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10058 10001 10004 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat index 1c9551097..18873664f 100644 --- a/tests/test_mgxs_library_hdf5/results_true.dat +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -1,34 +1,34 @@ -domain=10000 type=total +domain=1 type=total [4.14825464e-01 6.60169863e-01] [2.27929105e-02 4.75188999e-02] -domain=10000 type=transport +domain=1 type=transport [3.63092031e-01 6.44850709e-01] [2.38384843e-02 4.76746408e-02] -domain=10000 type=nu-transport +domain=1 type=nu-transport [3.63092031e-01 6.44850709e-01] [2.38384843e-02 4.76746408e-02] -domain=10000 type=absorption +domain=1 type=absorption [2.74078431e-02 2.64510714e-01] [2.69249666e-03 2.33670618e-02] -domain=10000 type=capture +domain=1 type=capture [1.98445483e-02 7.17193458e-02] [2.64330389e-03 2.52078411e-02] -domain=10000 type=fission +domain=1 type=fission [7.56329483e-03 1.92791369e-01] [5.08483896e-04 1.71059103e-02] -domain=10000 type=nu-fission +domain=1 type=nu-fission [1.94317397e-02 4.69774728e-01] [1.32297611e-03 4.16819716e-02] -domain=10000 type=kappa-fission +domain=1 type=kappa-fission [1.47456979e+06 3.72868925e+07] [9.92353629e+04 3.30837549e+06] -domain=10000 type=scatter +domain=1 type=scatter [3.87417621e-01 3.95659148e-01] [2.06257343e-02 2.51250447e-02] -domain=10000 type=nu-scatter +domain=1 type=nu-scatter [3.85188361e-01 4.12389370e-01] [2.69456191e-02 1.54252759e-02] -domain=10000 type=scatter matrix +domain=1 type=scatter matrix [[[3.84199430e-01 5.18702806e-02 2.00688439e-02 9.47771503e-03] [9.88930322e-04 -2.07234582e-04 -1.03366173e-04 2.34290606e-04]] @@ -39,7 +39,7 @@ domain=10000 type=scatter matrix [[9.24883397e-04 7.67907131e-04 4.93918903e-04 1.71542390e-04] [1.52449343e-02 4.50172764e-03 1.05507486e-02 1.04381870e-02]]] -domain=10000 type=nu-scatter matrix +domain=1 type=nu-scatter matrix [[[3.84199430e-01 5.18702806e-02 2.00688439e-02 9.47771503e-03] [9.88930322e-04 -2.07234582e-04 -1.03366173e-04 2.34290606e-04]] @@ -50,22 +50,22 @@ domain=10000 type=nu-scatter matrix [[9.24883397e-04 7.67907131e-04 4.93918903e-04 1.71542390e-04] [1.52449343e-02 4.50172764e-03 1.05507486e-02 1.04381870e-02]]] -domain=10000 type=multiplicity matrix +domain=1 type=multiplicity matrix [[1.00000000e+00 1.00000000e+00] [1.00000000e+00 1.00000000e+00]] [[7.85164550e-02 6.87184271e-01] [1.41421356e+00 4.11303488e-02]] -domain=10000 type=nu-fission matrix +domain=1 type=nu-fission matrix [[2.01424221e-02 0.00000000e+00] [4.54366342e-01 0.00000000e+00]] [[3.14909051e-03 0.00000000e+00] [2.74255162e-02 0.00000000e+00]] -domain=10000 type=scatter probability matrix +domain=1 type=scatter probability matrix [[9.97432606e-01 2.56739409e-03] [2.24215247e-03 9.97757848e-01]] [[7.82243018e-02 1.25560869e-03] [2.24310192e-03 4.10531468e-02]] -domain=10000 type=consistent scatter matrix +domain=1 type=consistent scatter matrix [[[3.86422967e-01 5.21704775e-02 2.01849914e-02 9.53256688e-03] [9.94653712e-04 -2.08433942e-04 -1.03964400e-04 2.35646553e-04]] @@ -76,7 +76,7 @@ domain=10000 type=consistent scatter matrix [[8.89289900e-04 7.38354757e-04 4.74910776e-04 1.64940700e-04] [2.98710064e-02 4.44330993e-03 1.01307463e-02 1.00367467e-02]]] -domain=10000 type=consistent nu-scatter matrix +domain=1 type=consistent nu-scatter matrix [[[3.86422967e-01 5.21704775e-02 2.01849914e-02 9.53256688e-03] [9.94653712e-04 -2.08433942e-04 -1.03964400e-04 2.35646553e-04]] @@ -87,24 +87,24 @@ domain=10000 type=consistent nu-scatter matrix [[1.53780011e-03 1.27679627e-03 8.21237084e-04 2.85222881e-04] [3.39988352e-02 4.49065920e-03 1.01338659e-02 1.00452944e-02]]] -domain=10000 type=chi +domain=1 type=chi [1.00000000e+00 0.00000000e+00] [4.60705493e-02 0.00000000e+00] -domain=10000 type=chi-prompt +domain=1 type=chi-prompt [1.00000000e+00 0.00000000e+00] [5.14714845e-02 0.00000000e+00] -domain=10000 type=inverse-velocity +domain=1 type=inverse-velocity [5.70932437e-08 2.85573948e-06] [4.68793810e-09 2.44216368e-07] -domain=10000 type=prompt-nu-fission +domain=1 type=prompt-nu-fission [1.92392209e-02 4.66718979e-01] [1.30950644e-03 4.14108424e-02] -domain=10000 type=prompt-nu-fission matrix +domain=1 type=prompt-nu-fission matrix [[2.01424221e-02 0.00000000e+00] [4.45819055e-01 0.00000000e+00]] [[3.14909051e-03 0.00000000e+00] [2.86750878e-02 0.00000000e+00]] -domain=10000 type=delayed-nu-fission +domain=1 type=delayed-nu-fission [[4.31687649e-06 1.06974147e-04] [2.69760050e-05 5.52167849e-04] [2.84366794e-05 5.27147626e-04] @@ -117,7 +117,7 @@ domain=10000 type=delayed-nu-fission [5.22610330e-06 1.04867938e-04] [2.99830756e-06 4.29944539e-05] [1.22654681e-06 1.80102228e-05]] -domain=10000 type=chi-delayed +domain=1 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [1.00000000e+00 0.00000000e+00] [1.00000000e+00 0.00000000e+00] @@ -130,7 +130,7 @@ domain=10000 type=chi-delayed [3.60359016e-01 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10000 type=beta +domain=1 type=beta [[2.22155945e-04 2.27713711e-04] [1.38824446e-03 1.17538858e-03] [1.46341397e-03 1.12212853e-03] @@ -143,7 +143,7 @@ domain=10000 type=beta [3.21434953e-04 2.72840272e-04] [1.82980531e-04 1.11860871e-04] [7.48900067e-05 4.68581181e-05]] -domain=10000 type=decay-rate +domain=1 type=decay-rate [[1.34450193e-02 1.33360001e-02] [3.20638663e-02 3.27389978e-02] [1.22136025e-01 1.20780007e-01] @@ -156,7 +156,7 @@ domain=10000 type=decay-rate [2.71748572e-02 3.28353145e-02] [7.93682892e-02 9.21238900e-02] [2.66253284e-01 3.09396760e-01]] -domain=10000 type=delayed-nu-fission matrix +domain=1 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] @@ -191,37 +191,37 @@ domain=10000 type=delayed-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]]] -domain=10001 type=total +domain=2 type=total [3.13737666e-01 3.00821380e-01] [1.55819223e-02 2.80524816e-02] -domain=10001 type=transport +domain=2 type=transport [2.75508079e-01 3.12035015e-01] [1.77418855e-02 3.23843473e-02] -domain=10001 type=nu-transport +domain=2 type=nu-transport [2.75508079e-01 3.12035015e-01] [1.77418855e-02 3.23843473e-02] -domain=10001 type=absorption +domain=2 type=absorption [1.57499139e-03 5.40037826e-03] [3.22547919e-04 6.18139027e-04] -domain=10001 type=capture +domain=2 type=capture [1.57499139e-03 5.40037826e-03] [3.22547919e-04 6.18139027e-04] -domain=10001 type=fission +domain=2 type=fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=nu-fission +domain=2 type=nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=kappa-fission +domain=2 type=kappa-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=scatter +domain=2 type=scatter [3.12162675e-01 2.95421002e-01] [1.53219430e-02 2.74455213e-02] -domain=10001 type=nu-scatter +domain=2 type=nu-scatter [3.10120713e-01 2.96264249e-01] [3.37881037e-02 4.37922226e-02] -domain=10001 type=scatter matrix +domain=2 type=scatter matrix [[[3.10120713e-01 3.82295876e-02 2.07449405e-02 7.96429620e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -232,7 +232,7 @@ domain=10001 type=scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [4.37922226e-02 1.61803653e-02 1.15039636e-02 7.32884528e-03]]] -domain=10001 type=nu-scatter matrix +domain=2 type=nu-scatter matrix [[[3.10120713e-01 3.82295876e-02 2.07449405e-02 7.96429620e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -243,22 +243,22 @@ domain=10001 type=nu-scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [4.37922226e-02 1.61803653e-02 1.15039636e-02 7.32884528e-03]]] -domain=10001 type=multiplicity matrix +domain=2 type=multiplicity matrix [[1.00000000e+00 0.00000000e+00] [0.00000000e+00 1.00000000e+00]] [[1.08778697e-01 0.00000000e+00] [0.00000000e+00 1.42427173e-01]] -domain=10001 type=nu-fission matrix +domain=2 type=nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=scatter probability matrix +domain=2 type=scatter probability matrix [[1.00000000e+00 0.00000000e+00] [0.00000000e+00 1.00000000e+00]] [[1.08778697e-01 0.00000000e+00] [0.00000000e+00 1.42427173e-01]] -domain=10001 type=consistent scatter matrix +domain=2 type=consistent scatter matrix [[[3.12162675e-01 3.84813069e-02 2.08815337e-02 8.01673640e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -269,7 +269,7 @@ domain=10001 type=consistent scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [5.02358893e-02 1.61616720e-02 1.14951123e-02 7.31312479e-03]]] -domain=10001 type=consistent nu-scatter matrix +domain=2 type=consistent nu-scatter matrix [[[3.12162675e-01 3.84813069e-02 2.08815337e-02 8.01673640e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -280,24 +280,24 @@ domain=10001 type=consistent nu-scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [6.55288678e-02 1.62399493e-02 1.15634161e-02 7.32785650e-03]]] -domain=10001 type=chi +domain=2 type=chi [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=chi-prompt +domain=2 type=chi-prompt [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=inverse-velocity +domain=2 type=inverse-velocity [5.99597929e-08 2.98549016e-06] [4.55308445e-09 3.41701982e-07] -domain=10001 type=prompt-nu-fission +domain=2 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=prompt-nu-fission matrix +domain=2 type=prompt-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=delayed-nu-fission +domain=2 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -310,7 +310,7 @@ domain=10001 type=delayed-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=chi-delayed +domain=2 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -323,7 +323,7 @@ domain=10001 type=chi-delayed [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=beta +domain=2 type=beta [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -336,7 +336,7 @@ domain=10001 type=beta [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=decay-rate +domain=2 type=decay-rate [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -349,7 +349,7 @@ domain=10001 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=delayed-nu-fission matrix +domain=2 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] @@ -384,37 +384,37 @@ domain=10001 type=delayed-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]]] -domain=10002 type=total +domain=3 type=total [6.64572195e-01 2.05238389e+00] [3.12147473e-02 2.24342891e-01] -domain=10002 type=transport +domain=3 type=transport [2.83322749e-01 1.49973953e+00] [3.52061127e-02 2.30902118e-01] -domain=10002 type=nu-transport +domain=3 type=nu-transport [2.83322749e-01 1.49973953e+00] [3.52061127e-02 2.30902118e-01] -domain=10002 type=absorption +domain=3 type=absorption [6.90399495e-04 3.16872549e-02] [4.41475663e-05 3.74655831e-03] -domain=10002 type=capture +domain=3 type=capture [6.90399495e-04 3.16872549e-02] [4.41475663e-05 3.74655831e-03] -domain=10002 type=fission +domain=3 type=fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=nu-fission +domain=3 type=nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=kappa-fission +domain=3 type=kappa-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=scatter +domain=3 type=scatter [6.63881795e-01 2.02069663e+00] [3.11726794e-02 2.20604438e-01] -domain=10002 type=nu-scatter +domain=3 type=nu-scatter [6.71269157e-01 2.03538818e+00] [2.61863693e-02 2.58060310e-01] -domain=10002 type=scatter matrix +domain=3 type=scatter matrix [[[6.39901439e-01 3.81167422e-01 1.52391887e-01 9.14802163e-03] [3.13677176e-02 8.75772258e-03 -2.56790088e-03 -3.78480261e-03]] @@ -425,7 +425,7 @@ domain=10002 type=scatter matrix [[4.44850361e-04 4.01320154e-04 3.20649120e-04 2.14573982e-04] [2.57799870e-01 5.12359026e-02 1.30198161e-02 8.31235197e-03]]] -domain=10002 type=nu-scatter matrix +domain=3 type=nu-scatter matrix [[[6.39901439e-01 3.81167422e-01 1.52391887e-01 9.14802163e-03] [3.13677176e-02 8.75772258e-03 -2.56790088e-03 -3.78480261e-03]] @@ -436,22 +436,22 @@ domain=10002 type=nu-scatter matrix [[4.44850361e-04 4.01320154e-04 3.20649120e-04 2.14573982e-04] [2.57799870e-01 5.12359026e-02 1.30198161e-02 8.31235197e-03]]] -domain=10002 type=multiplicity matrix +domain=3 type=multiplicity matrix [[1.00000000e+00 1.00000000e+00] [1.00000000e+00 1.00000000e+00]] [[3.86091908e-02 6.76673480e-02] [1.41421356e+00 1.35929207e-01]] -domain=10002 type=nu-fission matrix +domain=3 type=nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=scatter probability matrix +domain=3 type=scatter probability matrix [[9.53271028e-01 4.67289720e-02] [2.17817469e-04 9.99782183e-01]] [[3.60184962e-02 2.54736726e-03] [2.18820864e-04 1.35884974e-01]] -domain=10002 type=consistent scatter matrix +domain=3 type=consistent scatter matrix [[[6.32859281e-01 3.76972649e-01 1.50714804e-01 9.04734705e-03] [3.10225138e-02 8.66134326e-03 -2.53964096e-03 -3.74315061e-03]] @@ -462,7 +462,7 @@ domain=10002 type=consistent scatter matrix [[4.44773843e-04 4.01251123e-04 3.20593966e-04 2.14537073e-04] [3.52193929e-01 7.91402819e-02 1.84875925e-02 8.77085752e-03]]] -domain=10002 type=consistent nu-scatter matrix +domain=3 type=consistent nu-scatter matrix [[[6.32859281e-01 3.76972649e-01 1.50714804e-01 9.04734705e-03] [3.10225138e-02 8.66134326e-03 -2.53964096e-03 -3.74315061e-03]] @@ -473,24 +473,24 @@ domain=10002 type=consistent nu-scatter matrix [[7.65033031e-04 6.90171798e-04 5.51437493e-04 3.69014387e-04] [4.46600759e-01 1.04874946e-01 2.38091367e-02 9.39676938e-03]]] -domain=10002 type=chi +domain=3 type=chi [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=chi-prompt +domain=3 type=chi-prompt [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=inverse-velocity +domain=3 type=inverse-velocity [6.02207835e-08 3.04495548e-06] [3.78043705e-09 3.60007679e-07] -domain=10002 type=prompt-nu-fission +domain=3 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=prompt-nu-fission matrix +domain=3 type=prompt-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=delayed-nu-fission +domain=3 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -503,7 +503,7 @@ domain=10002 type=delayed-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=chi-delayed +domain=3 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -516,7 +516,7 @@ domain=10002 type=chi-delayed [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=beta +domain=3 type=beta [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -529,7 +529,7 @@ domain=10002 type=beta [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=decay-rate +domain=3 type=decay-rate [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -542,7 +542,7 @@ domain=10002 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=delayed-nu-fission matrix +domain=3 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 365c4a2af..4756b27bf 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,575 +127,575 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 2 2 - -100.0 -100.0 - 100.0 100.0 - - - 1 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - total - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-fission - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter-0 - analog - - - 10000 10001 10004 - total - scatter-0 - analog - - - 10000 10001 - total - nu-fission - analog - - - 10000 10004 - total - nu-fission - analog - - - 10000 10001 - total - prompt-nu-fission - analog - - - 10000 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - analog - - - 10000 10058 10004 - total - delayed-nu-fission - analog - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - decay-rate - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10058 10001 10004 - total - delayed-nu-fission - analog - + + 2 2 + -100.0 -100.0 + 100.0 100.0 + + + 1 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 2 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 2 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_mesh/results_true.dat b/tests/test_mgxs_library_mesh/results_true.dat index 527c91d66..c167628bc 100644 --- a/tests/test_mgxs_library_mesh/results_true.dat +++ b/tests/test_mgxs_library_mesh/results_true.dat @@ -1,216 +1,216 @@ mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.654966 0.098415 -1 1 2 1 1 total 0.639357 0.282107 -2 2 1 1 1 total 0.713534 0.079788 -3 2 2 1 1 total 0.641095 0.091519 +0 1 1 1 1 total 0.762544 0.085298 +1 1 2 1 1 total 0.653375 0.153317 +2 2 1 1 1 total 0.644837 0.088457 +3 2 2 1 1 total 0.676480 0.094215 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.407867 0.104648 -1 1 2 1 1 total 0.417805 0.300173 -2 2 1 1 1 total 0.451699 0.087229 -3 2 2 1 1 total 0.396449 0.095884 +0 1 1 1 1 total 0.473988 0.088732 +1 1 2 1 1 total 0.379821 0.167092 +2 2 1 1 1 total 0.399254 0.091318 +3 2 2 1 1 total 0.424265 0.099551 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.407867 0.104648 -1 1 2 1 1 total 0.417805 0.300173 -2 2 1 1 1 total 0.451699 0.087229 -3 2 2 1 1 total 0.396449 0.095884 +0 1 1 1 1 total 0.473988 0.088732 +1 1 2 1 1 total 0.379821 0.167092 +2 2 1 1 1 total 0.399254 0.091318 +3 2 2 1 1 total 0.424265 0.099551 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.021476 0.004248 -1 1 2 1 1 total 0.020653 0.008355 -2 2 1 1 1 total 0.027384 0.003568 -3 2 2 1 1 total 0.021826 0.004584 +0 1 1 1 1 total 0.027288 0.005813 +1 1 2 1 1 total 0.019449 0.004420 +2 2 1 1 1 total 0.020262 0.003701 +3 2 2 1 1 total 0.021266 0.002869 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.013234 0.004146 -1 1 2 1 1 total 0.012342 0.006800 -2 2 1 1 1 total 0.016807 0.003428 -3 2 2 1 1 total 0.013253 0.004795 +0 1 1 1 1 total 0.016037 0.006339 +1 1 2 1 1 total 0.012153 0.003804 +2 2 1 1 1 total 0.013018 0.003521 +3 2 2 1 1 total 0.012965 0.002454 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.008241 0.001798 -1 1 2 1 1 total 0.008311 0.003296 -2 2 1 1 1 total 0.010577 0.001333 -3 2 2 1 1 total 0.008573 0.002017 +0 1 1 1 1 total 0.011251 0.003050 +1 1 2 1 1 total 0.007296 0.001795 +2 2 1 1 1 total 0.007243 0.001219 +3 2 2 1 1 total 0.008301 0.001066 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.020322 0.004415 -1 1 2 1 1 total 0.020546 0.008145 -2 2 1 1 1 total 0.026008 0.003213 -3 2 2 1 1 total 0.021015 0.004911 +0 1 1 1 1 total 0.027498 0.007445 +1 1 2 1 1 total 0.017912 0.004426 +2 2 1 1 1 total 0.017954 0.003077 +3 2 2 1 1 total 0.020469 0.002617 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 1.596881e+06 348355.002874 -1 1 2 1 1 total 1.610266e+06 638514.779022 -2 2 1 1 1 total 2.048208e+06 257681.650350 -3 2 2 1 1 total 1.660283e+06 390011.381149 +0 1 1 1 1 total 2.177345e+06 589804.299388 +1 1 2 1 1 total 1.413154e+06 347806.623417 +2 2 1 1 1 total 1.404096e+06 236476.851953 +3 2 2 1 1 total 1.608259e+06 206502.707865 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.633490 0.094536 -1 1 2 1 1 total 0.618705 0.273934 -2 2 1 1 1 total 0.686150 0.076703 -3 2 2 1 1 total 0.619269 0.087616 +0 1 1 1 1 total 0.735256 0.080216 +1 1 2 1 1 total 0.633925 0.149098 +2 2 1 1 1 total 0.624575 0.084974 +3 2 2 1 1 total 0.655214 0.091422 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.638348 0.097266 -1 1 2 1 1 total 0.588378 0.266032 -2 2 1 1 1 total 0.698373 0.092394 -3 2 2 1 1 total 0.625643 0.075089 +0 1 1 1 1 total 0.763779 0.070696 +1 1 2 1 1 total 0.640809 0.158369 +2 2 1 1 1 total 0.628158 0.064356 +3 2 2 1 1 total 0.645171 0.080467 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.638348 0.097266 -1 1 1 1 1 1 total P1 0.247099 0.035574 -2 1 1 1 1 1 total P2 0.092195 0.010891 -3 1 1 1 1 1 total P3 0.013224 0.004528 -4 1 2 1 1 1 total P0 0.588378 0.266032 -5 1 2 1 1 1 total P1 0.221552 0.102564 -6 1 2 1 1 1 total P2 0.069798 0.034699 -7 1 2 1 1 1 total P3 -0.003039 0.009633 -8 2 1 1 1 1 total P0 0.698373 0.092394 -9 2 1 1 1 1 total P1 0.261835 0.035253 -10 2 1 1 1 1 total P2 0.096206 0.013947 -11 2 1 1 1 1 total P3 0.016973 0.004808 -12 2 2 1 1 1 total P0 0.625643 0.075089 -13 2 2 1 1 1 total P1 0.244646 0.028604 -14 2 2 1 1 1 total P2 0.088580 0.012369 -15 2 2 1 1 1 total P3 0.019989 0.013950 +0 1 1 1 1 1 total P0 0.763779 0.070696 +1 1 1 1 1 1 total P1 0.288556 0.024446 +2 1 1 1 1 1 total P2 0.082441 0.011443 +3 1 1 1 1 1 total P3 -0.005627 0.012638 +4 1 2 1 1 1 total P0 0.640809 0.158369 +5 1 2 1 1 1 total P1 0.273553 0.066437 +6 1 2 1 1 1 total P2 0.108446 0.024435 +7 1 2 1 1 1 total P3 0.012229 0.003785 +8 2 1 1 1 1 total P0 0.628158 0.064356 +9 2 1 1 1 1 total P1 0.245583 0.022676 +10 2 1 1 1 1 total P2 0.086370 0.007833 +11 2 1 1 1 1 total P3 0.019590 0.005345 +12 2 2 1 1 1 total P0 0.645171 0.080467 +13 2 2 1 1 1 total P1 0.252215 0.032154 +14 2 2 1 1 1 total P2 0.089251 0.009734 +15 2 2 1 1 1 total P3 0.004748 0.002987 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.638348 0.097266 -1 1 1 1 1 1 total P1 0.247099 0.035574 -2 1 1 1 1 1 total P2 0.092195 0.010891 -3 1 1 1 1 1 total P3 0.013224 0.004528 -4 1 2 1 1 1 total P0 0.588378 0.266032 -5 1 2 1 1 1 total P1 0.221552 0.102564 -6 1 2 1 1 1 total P2 0.069798 0.034699 -7 1 2 1 1 1 total P3 -0.003039 0.009633 -8 2 1 1 1 1 total P0 0.698373 0.092394 -9 2 1 1 1 1 total P1 0.261835 0.035253 -10 2 1 1 1 1 total P2 0.096206 0.013947 -11 2 1 1 1 1 total P3 0.016973 0.004808 -12 2 2 1 1 1 total P0 0.625643 0.075089 -13 2 2 1 1 1 total P1 0.244646 0.028604 -14 2 2 1 1 1 total P2 0.088580 0.012369 -15 2 2 1 1 1 total P3 0.019989 0.013950 +0 1 1 1 1 1 total P0 0.763779 0.070696 +1 1 1 1 1 1 total P1 0.288556 0.024446 +2 1 1 1 1 1 total P2 0.082441 0.011443 +3 1 1 1 1 1 total P3 -0.005627 0.012638 +4 1 2 1 1 1 total P0 0.640809 0.158369 +5 1 2 1 1 1 total P1 0.273553 0.066437 +6 1 2 1 1 1 total P2 0.108446 0.024435 +7 1 2 1 1 1 total P3 0.012229 0.003785 +8 2 1 1 1 1 total P0 0.628158 0.064356 +9 2 1 1 1 1 total P1 0.245583 0.022676 +10 2 1 1 1 1 total P2 0.086370 0.007833 +11 2 1 1 1 1 total P3 0.019590 0.005345 +12 2 2 1 1 1 total P0 0.645171 0.080467 +13 2 2 1 1 1 total P1 0.252215 0.032154 +14 2 2 1 1 1 total P2 0.089251 0.009734 +15 2 2 1 1 1 total P3 0.004748 0.002987 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 1.0 0.153265 -1 1 2 1 1 1 total 1.0 0.454973 -2 2 1 1 1 1 total 1.0 0.146747 -3 2 2 1 1 1 total 1.0 0.141824 +0 1 1 1 1 1 total 1.0 0.108337 +1 1 2 1 1 1 total 1.0 0.238517 +2 2 1 1 1 1 total 1.0 0.113128 +3 2 2 1 1 1 total 1.0 0.132597 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.021059 0.003031 -1 1 2 1 1 1 total 0.017348 0.008786 -2 2 1 1 1 1 total 0.020409 0.003354 -3 2 2 1 1 1 total 0.011105 0.003806 +0 1 1 1 1 1 total 0.015584 0.003404 +1 1 2 1 1 1 total 0.014200 0.003676 +2 2 1 1 1 1 total 0.017684 0.002499 +3 2 2 1 1 1 total 0.022409 0.002481 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 1.0 0.153265 -1 1 2 1 1 1 total 1.0 0.454973 -2 2 1 1 1 1 total 1.0 0.146747 -3 2 2 1 1 1 total 1.0 0.141824 +0 1 1 1 1 1 total 1.0 0.108337 +1 1 2 1 1 1 total 1.0 0.238517 +2 2 1 1 1 1 total 1.0 0.113128 +3 2 2 1 1 1 total 1.0 0.132597 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.633490 0.135514 -1 1 1 1 1 1 total P1 0.245219 0.051009 -2 1 1 1 1 1 total P2 0.091493 0.017479 -3 1 1 1 1 1 total P3 0.013124 0.004906 -4 1 2 1 1 1 total P0 0.618705 0.392783 -5 1 2 1 1 1 total P1 0.232972 0.149703 -6 1 2 1 1 1 total P2 0.073396 0.049002 -7 1 2 1 1 1 total P3 -0.003195 0.010229 -8 2 1 1 1 1 total P0 0.686150 0.126578 -9 2 1 1 1 1 total P1 0.257252 0.047890 -10 2 1 1 1 1 total P2 0.094522 0.018315 -11 2 1 1 1 1 total P3 0.016676 0.005187 -12 2 2 1 1 1 total P0 0.619269 0.124057 -13 2 2 1 1 1 total P1 0.242153 0.048064 -14 2 2 1 1 1 total P2 0.087677 0.018646 -15 2 2 1 1 1 total P3 0.019785 0.014168 +0 1 1 1 1 1 total P0 0.735256 0.113047 +1 1 1 1 1 1 total P1 0.277780 0.041434 +2 1 1 1 1 1 total P2 0.079362 0.014706 +3 1 1 1 1 1 total P3 -0.005417 0.012184 +4 1 2 1 1 1 total P0 0.633925 0.212349 +5 1 2 1 1 1 total P1 0.270615 0.089799 +6 1 2 1 1 1 total P2 0.107281 0.034246 +7 1 2 1 1 1 total P3 0.012098 0.004637 +8 2 1 1 1 1 total P0 0.624575 0.110512 +9 2 1 1 1 1 total P1 0.244182 0.041824 +10 2 1 1 1 1 total P2 0.085877 0.014634 +11 2 1 1 1 1 total P3 0.019478 0.006012 +12 2 2 1 1 1 total P0 0.655214 0.126119 +13 2 2 1 1 1 total P1 0.256141 0.049765 +14 2 2 1 1 1 total P2 0.090641 0.016563 +15 2 2 1 1 1 total P3 0.004822 0.003115 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.633490 0.166706 -1 1 1 1 1 1 total P1 0.245219 0.063359 -2 1 1 1 1 1 total P2 0.091493 0.022409 -3 1 1 1 1 1 total P3 0.013124 0.005303 -4 1 2 1 1 1 total P0 0.618705 0.483237 -5 1 2 1 1 1 total P1 0.232972 0.183428 -6 1 2 1 1 1 total P2 0.073396 0.059298 -7 1 2 1 1 1 total P3 -0.003195 0.010332 -8 2 1 1 1 1 total P0 0.686150 0.161742 -9 2 1 1 1 1 total P1 0.257252 0.060980 -10 2 1 1 1 1 total P2 0.094522 0.022975 -11 2 1 1 1 1 total P3 0.016676 0.005736 -12 2 2 1 1 1 total P0 0.619269 0.152000 -13 2 2 1 1 1 total P1 0.242153 0.059073 -14 2 2 1 1 1 total P2 0.087677 0.022412 -15 2 2 1 1 1 total P3 0.019785 0.014443 +0 1 1 1 1 1 total P0 0.735256 0.138292 +1 1 1 1 1 1 total P1 0.277780 0.051210 +2 1 1 1 1 1 total P2 0.079362 0.017035 +3 1 1 1 1 1 total P3 -0.005417 0.012198 +4 1 2 1 1 1 total P0 0.633925 0.260681 +5 1 2 1 1 1 total P1 0.270615 0.110590 +6 1 2 1 1 1 total P2 0.107281 0.042750 +7 1 2 1 1 1 total P3 0.012098 0.005462 +8 2 1 1 1 1 total P0 0.624575 0.131169 +9 2 1 1 1 1 total P1 0.244182 0.050123 +10 2 1 1 1 1 total P2 0.085877 0.017565 +11 2 1 1 1 1 total P3 0.019478 0.006403 +12 2 2 1 1 1 total P0 0.655214 0.153147 +13 2 2 1 1 1 total P1 0.256141 0.060250 +14 2 2 1 1 1 total P2 0.090641 0.020464 +15 2 2 1 1 1 total P3 0.004822 0.003180 mesh 1 group out nuclide mean std. dev. x y z -0 1 1 1 1 total 1.0 0.135958 -1 1 2 1 1 total 1.0 0.557756 -2 2 1 1 1 total 1.0 0.201340 -3 2 2 1 1 total 1.0 0.475608 +0 1 1 1 1 total 1.0 0.300047 +1 1 2 1 1 total 1.0 0.262180 +2 2 1 1 1 total 1.0 0.178169 +3 2 2 1 1 total 1.0 0.104797 mesh 1 group out nuclide mean std. dev. x y z -0 1 1 1 1 total 1.0 0.133151 -1 1 2 1 1 total 1.0 0.557756 -2 2 1 1 1 total 1.0 0.201340 -3 2 2 1 1 total 1.0 0.475608 +0 1 1 1 1 total 1.0 0.300047 +1 1 2 1 1 total 1.0 0.262180 +2 2 1 1 1 total 1.0 0.178169 +3 2 2 1 1 total 1.0 0.108931 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 4.697404e-07 8.304376e-08 -1 1 2 1 1 total 4.173069e-07 1.694647e-07 -2 2 1 1 1 total 6.581421e-07 1.337227e-07 -3 2 2 1 1 total 4.714011e-07 1.140489e-07 +0 1 1 1 1 total 7.097008e-07 1.458546e-07 +1 1 2 1 1 total 3.984535e-07 1.157576e-07 +2 2 1 1 1 total 4.407745e-07 7.903907e-08 +3 2 2 1 1 total 4.750476e-07 6.207437e-08 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.020173 0.004383 -1 1 2 1 1 total 0.020397 0.008086 -2 2 1 1 1 total 0.025824 0.003192 -3 2 2 1 1 total 0.020865 0.004879 +0 1 1 1 1 total 0.027311 0.007397 +1 1 2 1 1 total 0.017783 0.004394 +2 2 1 1 1 total 0.017820 0.003054 +3 2 2 1 1 total 0.020320 0.002598 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.020874 0.002977 -1 1 2 1 1 1 total 0.017348 0.008786 -2 2 1 1 1 1 total 0.020409 0.003354 -3 2 2 1 1 1 total 0.011105 0.003806 +0 1 1 1 1 1 total 0.015584 0.003404 +1 1 2 1 1 1 total 0.014200 0.003676 +2 2 1 1 1 1 total 0.017684 0.002499 +3 2 2 1 1 1 total 0.022259 0.002508 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.000005 1.004638e-06 -1 1 1 1 2 1 total 0.000025 5.397978e-06 -2 1 1 1 3 1 total 0.000025 5.275050e-06 -3 1 1 1 4 1 total 0.000058 1.230443e-05 -4 1 1 1 5 1 total 0.000026 5.548743e-06 -5 1 1 1 6 1 total 0.000011 2.307020e-06 -6 1 2 1 1 1 total 0.000005 1.838266e-06 -7 1 2 1 2 1 total 0.000025 9.941991e-06 -8 1 2 1 3 1 total 0.000025 9.753804e-06 -9 1 2 1 4 1 total 0.000058 2.290678e-05 -10 1 2 1 5 1 total 0.000026 1.050498e-05 -11 1 2 1 6 1 total 0.000011 4.361882e-06 -12 2 1 1 1 1 total 0.000006 7.462654e-07 -13 2 1 1 2 1 total 0.000031 3.842479e-06 -14 2 1 1 3 1 total 0.000031 3.666594e-06 -15 2 1 1 4 1 total 0.000071 8.228616e-06 -16 2 1 1 5 1 total 0.000031 3.416659e-06 -17 2 1 1 6 1 total 0.000013 1.428970e-06 -18 2 2 1 1 1 total 0.000005 1.117984e-06 -19 2 2 1 2 1 total 0.000026 5.744801e-06 -20 2 2 1 3 1 total 0.000025 5.480526e-06 -21 2 2 1 4 1 total 0.000058 1.231604e-05 -22 2 2 1 5 1 total 0.000026 5.181495e-06 -23 2 2 1 6 1 total 0.000011 2.163732e-06 +0 1 1 1 1 1 total 0.000006 1.689606e-06 +1 1 1 1 2 1 total 0.000033 8.718916e-06 +2 1 1 1 3 1 total 0.000032 8.323051e-06 +3 1 1 1 4 1 total 0.000072 1.866015e-05 +4 1 1 1 5 1 total 0.000031 7.654909e-06 +5 1 1 1 6 1 total 0.000013 3.206343e-06 +6 1 2 1 1 1 total 0.000004 1.003100e-06 +7 1 2 1 2 1 total 0.000022 5.425275e-06 +8 1 2 1 3 1 total 0.000021 5.324236e-06 +9 1 2 1 4 1 total 0.000050 1.251572e-05 +10 1 2 1 5 1 total 0.000022 5.762184e-06 +11 1 2 1 6 1 total 0.000009 2.391676e-06 +12 2 1 1 1 1 total 0.000004 6.723192e-07 +13 2 1 1 2 1 total 0.000022 3.706235e-06 +14 2 1 1 3 1 total 0.000022 3.674263e-06 +15 2 1 1 4 1 total 0.000052 8.774048e-06 +16 2 1 1 5 1 total 0.000024 4.168024e-06 +17 2 1 1 6 1 total 0.000010 1.726268e-06 +18 2 2 1 1 1 total 0.000005 5.962367e-07 +19 2 2 1 2 1 total 0.000025 3.200900e-06 +20 2 2 1 3 1 total 0.000025 3.127442e-06 +21 2 2 1 4 1 total 0.000058 7.296157e-06 +22 2 2 1 5 1 total 0.000026 3.298196e-06 +23 2 2 1 6 1 total 0.000011 1.370918e-06 mesh 1 delayedgroup group out nuclide mean std. dev. x y z 0 1 1 1 1 1 total 0.0 0.000000 1 1 1 1 2 1 total 0.0 0.000000 2 1 1 1 3 1 total 0.0 0.000000 3 1 1 1 4 1 total 0.0 0.000000 -4 1 1 1 5 1 total 1.0 1.414214 +4 1 1 1 5 1 total 0.0 0.000000 5 1 1 1 6 1 total 0.0 0.000000 6 1 2 1 1 1 total 0.0 0.000000 7 1 2 1 2 1 total 0.0 0.000000 @@ -226,85 +226,85 @@ 17 2 1 1 6 1 total 0.0 0.000000 18 2 2 1 1 1 total 0.0 0.000000 19 2 2 1 2 1 total 0.0 0.000000 -20 2 2 1 3 1 total 0.0 0.000000 +20 2 2 1 3 1 total 1.0 1.414214 21 2 2 1 4 1 total 0.0 0.000000 22 2 2 1 5 1 total 0.0 0.000000 23 2 2 1 6 1 total 0.0 0.000000 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.000227 0.000061 -1 1 1 1 2 1 total 0.001228 0.000327 -2 1 1 1 3 1 total 0.001206 0.000320 -3 1 1 1 4 1 total 0.002835 0.000748 -4 1 1 1 5 1 total 0.001300 0.000340 -5 1 1 1 6 1 total 0.000540 0.000141 -6 1 2 1 1 1 total 0.000226 0.000076 -7 1 2 1 2 1 total 0.001220 0.000412 -8 1 2 1 3 1 total 0.001197 0.000404 -9 1 2 1 4 1 total 0.002809 0.000949 -10 1 2 1 5 1 total 0.001284 0.000436 -11 1 2 1 6 1 total 0.000533 0.000181 -12 2 1 1 1 1 total 0.000226 0.000033 -13 2 1 1 2 1 total 0.001207 0.000174 -14 2 1 1 3 1 total 0.001175 0.000167 -15 2 1 1 4 1 total 0.002721 0.000378 -16 2 1 1 5 1 total 0.001207 0.000160 -17 2 1 1 6 1 total 0.000502 0.000067 -18 2 2 1 1 1 total 0.000228 0.000071 -19 2 2 1 2 1 total 0.001221 0.000373 -20 2 2 1 3 1 total 0.001190 0.000360 -21 2 2 1 4 1 total 0.002767 0.000822 -22 2 2 1 5 1 total 0.001238 0.000357 -23 2 2 1 6 1 total 0.000515 0.000149 +0 1 1 1 1 1 total 0.000228 0.000084 +1 1 1 1 2 1 total 0.001195 0.000438 +2 1 1 1 3 1 total 0.001153 0.000420 +3 1 1 1 4 1 total 0.002629 0.000950 +4 1 1 1 5 1 total 0.001125 0.000398 +5 1 1 1 6 1 total 0.000470 0.000166 +6 1 2 1 1 1 total 0.000228 0.000057 +7 1 2 1 2 1 total 0.001222 0.000309 +8 1 2 1 3 1 total 0.001193 0.000304 +9 1 2 1 4 1 total 0.002780 0.000713 +10 1 2 1 5 1 total 0.001250 0.000328 +11 1 2 1 6 1 total 0.000520 0.000136 +12 2 1 1 1 1 total 0.000225 0.000044 +13 2 1 1 2 1 total 0.001232 0.000242 +14 2 1 1 3 1 total 0.001216 0.000239 +15 2 1 1 4 1 total 0.002882 0.000570 +16 2 1 1 5 1 total 0.001345 0.000270 +17 2 1 1 6 1 total 0.000558 0.000112 +18 2 2 1 1 1 total 0.000227 0.000027 +19 2 2 1 2 1 total 0.001225 0.000143 +20 2 2 1 3 1 total 0.001201 0.000140 +21 2 2 1 4 1 total 0.002815 0.000326 +22 2 2 1 5 1 total 0.001284 0.000147 +23 2 2 1 6 1 total 0.000533 0.000061 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.013362 0.003586 -1 1 1 1 2 1 total 0.032554 0.008645 -2 1 1 1 3 1 total 0.121179 0.031941 -3 1 1 1 4 1 total 0.306858 0.079971 -4 1 1 1 5 1 total 0.865303 0.220418 -5 1 1 1 6 1 total 2.906554 0.741592 -6 1 2 1 1 1 total 0.013361 0.004515 -7 1 2 1 2 1 total 0.032560 0.010992 -8 1 2 1 3 1 total 0.121165 0.040913 -9 1 2 1 4 1 total 0.306728 0.103786 -10 1 2 1 5 1 total 0.864851 0.295633 -11 1 2 1 6 1 total 2.905009 0.992039 -12 2 1 1 1 1 total 0.013353 0.002006 -13 2 1 1 2 1 total 0.032614 0.004676 -14 2 1 1 3 1 total 0.121052 0.016784 -15 2 1 1 4 1 total 0.305600 0.040195 -16 2 1 1 5 1 total 0.860792 0.101702 -17 2 1 1 6 1 total 2.891182 0.344181 -18 2 2 1 1 1 total 0.013355 0.004172 -19 2 2 1 2 1 total 0.032599 0.009758 -20 2 2 1 3 1 total 0.121084 0.035213 -21 2 2 1 4 1 total 0.305920 0.085294 -22 2 2 1 5 1 total 0.861968 0.224059 -23 2 2 1 6 1 total 2.895182 0.755656 - mesh 1 delayedgroup group in group out nuclide mean std. dev. - x y z -0 1 1 1 1 1 1 total 0.000000 0.000000 -1 1 1 1 2 1 1 total 0.000000 0.000000 -2 1 1 1 3 1 1 total 0.000000 0.000000 -3 1 1 1 4 1 1 total 0.000000 0.000000 -4 1 1 1 5 1 1 total 0.000185 0.000186 -5 1 1 1 6 1 1 total 0.000000 0.000000 -6 1 2 1 1 1 1 total 0.000000 0.000000 -7 1 2 1 2 1 1 total 0.000000 0.000000 -8 1 2 1 3 1 1 total 0.000000 0.000000 -9 1 2 1 4 1 1 total 0.000000 0.000000 -10 1 2 1 5 1 1 total 0.000000 0.000000 -11 1 2 1 6 1 1 total 0.000000 0.000000 -12 2 1 1 1 1 1 total 0.000000 0.000000 -13 2 1 1 2 1 1 total 0.000000 0.000000 -14 2 1 1 3 1 1 total 0.000000 0.000000 -15 2 1 1 4 1 1 total 0.000000 0.000000 -16 2 1 1 5 1 1 total 0.000000 0.000000 -17 2 1 1 6 1 1 total 0.000000 0.000000 -18 2 2 1 1 1 1 total 0.000000 0.000000 -19 2 2 1 2 1 1 total 0.000000 0.000000 -20 2 2 1 3 1 1 total 0.000000 0.000000 -21 2 2 1 4 1 1 total 0.000000 0.000000 -22 2 2 1 5 1 1 total 0.000000 0.000000 -23 2 2 1 6 1 1 total 0.000000 0.000000 +0 1 1 1 1 1 total 0.013345 0.004923 +1 1 1 1 2 1 total 0.032674 0.011850 +2 1 1 1 3 1 total 0.120923 0.043307 +3 1 1 1 4 1 total 0.304289 0.106753 +4 1 1 1 5 1 total 0.855760 0.286466 +5 1 1 1 6 1 total 2.874120 0.965609 +6 1 2 1 1 1 total 0.013357 0.003345 +7 1 2 1 2 1 total 0.032590 0.008273 +8 1 2 1 3 1 total 0.121103 0.031074 +9 1 2 1 4 1 total 0.306111 0.080011 +10 1 2 1 5 1 total 0.862660 0.235694 +11 1 2 1 6 1 total 2.897534 0.788926 +12 2 1 1 1 1 total 0.013367 0.002548 +13 2 1 1 2 1 total 0.032520 0.006266 +14 2 1 1 3 1 total 0.121250 0.023544 +15 2 1 1 4 1 total 0.307552 0.060464 +16 2 1 1 5 1 total 0.867665 0.175131 +17 2 1 1 6 1 total 2.914635 0.587161 +18 2 2 1 1 1 total 0.013360 0.001587 +19 2 2 1 2 1 total 0.032564 0.003810 +20 2 2 1 3 1 total 0.121158 0.014038 +21 2 2 1 4 1 total 0.306653 0.035052 +22 2 2 1 5 1 total 0.864587 0.096680 +23 2 2 1 6 1 total 2.904111 0.325170 + mesh 1 delayedgroup group in group out nuclide mean std. dev. + x y z +0 1 1 1 1 1 1 total 0.00000 0.000000 +1 1 1 1 2 1 1 total 0.00000 0.000000 +2 1 1 1 3 1 1 total 0.00000 0.000000 +3 1 1 1 4 1 1 total 0.00000 0.000000 +4 1 1 1 5 1 1 total 0.00000 0.000000 +5 1 1 1 6 1 1 total 0.00000 0.000000 +6 1 2 1 1 1 1 total 0.00000 0.000000 +7 1 2 1 2 1 1 total 0.00000 0.000000 +8 1 2 1 3 1 1 total 0.00000 0.000000 +9 1 2 1 4 1 1 total 0.00000 0.000000 +10 1 2 1 5 1 1 total 0.00000 0.000000 +11 1 2 1 6 1 1 total 0.00000 0.000000 +12 2 1 1 1 1 1 total 0.00000 0.000000 +13 2 1 1 2 1 1 total 0.00000 0.000000 +14 2 1 1 3 1 1 total 0.00000 0.000000 +15 2 1 1 4 1 1 total 0.00000 0.000000 +16 2 1 1 5 1 1 total 0.00000 0.000000 +17 2 1 1 6 1 1 total 0.00000 0.000000 +18 2 2 1 1 1 1 total 0.00000 0.000000 +19 2 2 1 2 1 1 total 0.00000 0.000000 +20 2 2 1 3 1 1 total 0.00015 0.000151 +21 2 2 1 4 1 1 total 0.00000 0.000000 +22 2 2 1 5 1 1 total 0.00000 0.000000 +23 2 2 1 6 1 1 total 0.00000 0.000000 diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index f33efe863..d2f28d0fe 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 10000 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 10001 - - - 10002 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - total - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - absorption - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - total - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - nu-fission - analog - - - 10000 10001 10004 - total - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - scatter - tracklength - - - 10000 10001 10004 - total - scatter-P3 - analog - - - 10000 10001 10004 - total - nu-scatter-0 - analog - - - 10000 10001 10004 - total - scatter-0 - analog - - - 10000 10045 - total - nu-fission - analog - - - 10000 10004 - total - nu-fission - analog - - - 10000 10045 - total - prompt-nu-fission - analog - - - 10000 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - total - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - total - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10045 - total - delayed-nu-fission - analog - - - 10000 10058 10004 - total - delayed-nu-fission - analog - - - 10000 10001 - total - nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - delayed-nu-fission - tracklength - - - 10000 10058 10001 - total - decay-rate - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - total - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10004 - total - nu-scatter-1 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - absorption - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - kappa-fission - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 - total - nu-scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - nu-fission - analog - - - 10073 10001 10004 - total - scatter - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - scatter - tracklength - - - 10073 10001 10004 - total - scatter-P3 - analog - - - 10073 10001 10004 - total - nu-scatter-0 - analog - - - 10073 10001 10004 - total - scatter-0 - analog - - - 10073 10045 - total - nu-fission - analog - - - 10073 10004 - total - nu-fission - analog - - - 10073 10045 - total - prompt-nu-fission - analog - - - 10073 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - inverse-velocity - tracklength - - - 10073 10001 - total - flux - tracklength - - - 10073 10001 - total - prompt-nu-fission - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10001 10004 - total - prompt-nu-fission - analog - - - 10073 10001 - total - flux - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10045 - total - delayed-nu-fission - analog - - - 10073 10058 10004 - total - delayed-nu-fission - analog - - - 10073 10001 - total - nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - delayed-nu-fission - tracklength - - - 10073 10058 10001 - total - decay-rate - tracklength - - - 10073 10001 - total - flux - analog - - - 10073 10058 10001 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - total - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10004 - total - nu-scatter-1 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - absorption - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - kappa-fission - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 - total - nu-scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - nu-fission - analog - - - 10146 10001 10004 - total - scatter - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - scatter - tracklength - - - 10146 10001 10004 - total - scatter-P3 - analog - - - 10146 10001 10004 - total - nu-scatter-0 - analog - - - 10146 10001 10004 - total - scatter-0 - analog - - - 10146 10045 - total - nu-fission - analog - - - 10146 10004 - total - nu-fission - analog - - - 10146 10045 - total - prompt-nu-fission - analog - - - 10146 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - inverse-velocity - tracklength - - - 10146 10001 - total - flux - tracklength - - - 10146 10001 - total - prompt-nu-fission - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10001 10004 - total - prompt-nu-fission - analog - - - 10146 10001 - total - flux - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10045 - total - delayed-nu-fission - analog - - - 10146 10058 10004 - total - delayed-nu-fission - analog - - - 10146 10001 - total - nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - delayed-nu-fission - tracklength - - - 10146 10058 10001 - total - decay-rate - tracklength - - - 10146 10001 - total - flux - analog - - - 10146 10058 10001 10004 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index a6a0c374e..291c87dde 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,621 +1,621 @@ material group in nuclide mean std. dev. -1 10000 1 total 0.414825 0.022793 -0 10000 2 total 0.660170 0.047519 +1 1 1 total 0.414825 0.022793 +0 1 2 total 0.660170 0.047519 material group in nuclide mean std. dev. -1 10000 1 total 0.363092 0.023838 -0 10000 2 total 0.644851 0.047675 +1 1 1 total 0.363092 0.023838 +0 1 2 total 0.644851 0.047675 material group in nuclide mean std. dev. -1 10000 1 total 0.363092 0.023838 -0 10000 2 total 0.644851 0.047675 +1 1 1 total 0.363092 0.023838 +0 1 2 total 0.644851 0.047675 material group in nuclide mean std. dev. -1 10000 1 total 0.027408 0.002692 -0 10000 2 total 0.264511 0.023367 +1 1 1 total 0.027408 0.002692 +0 1 2 total 0.264511 0.023367 material group in nuclide mean std. dev. -1 10000 1 total 0.019845 0.002643 -0 10000 2 total 0.071719 0.025208 +1 1 1 total 0.019845 0.002643 +0 1 2 total 0.071719 0.025208 material group in nuclide mean std. dev. -1 10000 1 total 0.007563 0.000508 -0 10000 2 total 0.192791 0.017106 +1 1 1 total 0.007563 0.000508 +0 1 2 total 0.192791 0.017106 material group in nuclide mean std. dev. -1 10000 1 total 0.019432 0.001323 -0 10000 2 total 0.469775 0.041682 +1 1 1 total 0.019432 0.001323 +0 1 2 total 0.469775 0.041682 material group in nuclide mean std. dev. -1 10000 1 total 1.474570e+06 9.923536e+04 -0 10000 2 total 3.728689e+07 3.308375e+06 +1 1 1 total 1.474570e+06 9.923536e+04 +0 1 2 total 3.728689e+07 3.308375e+06 material group in nuclide mean std. dev. -1 10000 1 total 0.387418 0.020626 -0 10000 2 total 0.395659 0.025125 +1 1 1 total 0.387418 0.020626 +0 1 2 total 0.395659 0.025125 material group in nuclide mean std. dev. -1 10000 1 total 0.385188 0.026946 -0 10000 2 total 0.412389 0.015425 +1 1 1 total 0.385188 0.026946 +0 1 2 total 0.412389 0.015425 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.384199 0.027001 -13 10000 1 1 total P1 0.051870 0.006983 -14 10000 1 1 total P2 0.020069 0.002846 -15 10000 1 1 total P3 0.009478 0.002234 -8 10000 1 2 total P0 0.000989 0.000482 -9 10000 1 2 total P1 -0.000207 0.000149 -10 10000 1 2 total P2 -0.000103 0.000184 -11 10000 1 2 total P3 0.000234 0.000128 -4 10000 2 1 total P0 0.000925 0.000925 -5 10000 2 1 total P1 -0.000768 0.000768 -6 10000 2 1 total P2 0.000494 0.000494 -7 10000 2 1 total P3 -0.000171 0.000172 -0 10000 2 2 total P0 0.411465 0.015245 -1 10000 2 2 total P1 0.016482 0.004502 -2 10000 2 2 total P2 0.006371 0.010551 -3 10000 2 2 total P3 -0.010499 0.010438 +12 1 1 1 total P0 0.384199 0.027001 +13 1 1 1 total P1 0.051870 0.006983 +14 1 1 1 total P2 0.020069 0.002846 +15 1 1 1 total P3 0.009478 0.002234 +8 1 1 2 total P0 0.000989 0.000482 +9 1 1 2 total P1 -0.000207 0.000149 +10 1 1 2 total P2 -0.000103 0.000184 +11 1 1 2 total P3 0.000234 0.000128 +4 1 2 1 total P0 0.000925 0.000925 +5 1 2 1 total P1 -0.000768 0.000768 +6 1 2 1 total P2 0.000494 0.000494 +7 1 2 1 total P3 -0.000171 0.000172 +0 1 2 2 total P0 0.411465 0.015245 +1 1 2 2 total P1 0.016482 0.004502 +2 1 2 2 total P2 0.006371 0.010551 +3 1 2 2 total P3 -0.010499 0.010438 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.384199 0.027001 -13 10000 1 1 total P1 0.051870 0.006983 -14 10000 1 1 total P2 0.020069 0.002846 -15 10000 1 1 total P3 0.009478 0.002234 -8 10000 1 2 total P0 0.000989 0.000482 -9 10000 1 2 total P1 -0.000207 0.000149 -10 10000 1 2 total P2 -0.000103 0.000184 -11 10000 1 2 total P3 0.000234 0.000128 -4 10000 2 1 total P0 0.000925 0.000925 -5 10000 2 1 total P1 -0.000768 0.000768 -6 10000 2 1 total P2 0.000494 0.000494 -7 10000 2 1 total P3 -0.000171 0.000172 -0 10000 2 2 total P0 0.411465 0.015245 -1 10000 2 2 total P1 0.016482 0.004502 -2 10000 2 2 total P2 0.006371 0.010551 -3 10000 2 2 total P3 -0.010499 0.010438 +12 1 1 1 total P0 0.384199 0.027001 +13 1 1 1 total P1 0.051870 0.006983 +14 1 1 1 total P2 0.020069 0.002846 +15 1 1 1 total P3 0.009478 0.002234 +8 1 1 2 total P0 0.000989 0.000482 +9 1 1 2 total P1 -0.000207 0.000149 +10 1 1 2 total P2 -0.000103 0.000184 +11 1 1 2 total P3 0.000234 0.000128 +4 1 2 1 total P0 0.000925 0.000925 +5 1 2 1 total P1 -0.000768 0.000768 +6 1 2 1 total P2 0.000494 0.000494 +7 1 2 1 total P3 -0.000171 0.000172 +0 1 2 2 total P0 0.411465 0.015245 +1 1 2 2 total P1 0.016482 0.004502 +2 1 2 2 total P2 0.006371 0.010551 +3 1 2 2 total P3 -0.010499 0.010438 material group in group out nuclide mean std. dev. -3 10000 1 1 total 1.0 0.078516 -2 10000 1 2 total 1.0 0.687184 -1 10000 2 1 total 1.0 1.414214 -0 10000 2 2 total 1.0 0.041130 +3 1 1 1 total 1.0 0.078516 +2 1 1 2 total 1.0 0.687184 +1 1 2 1 total 1.0 1.414214 +0 1 2 2 total 1.0 0.041130 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.020142 0.003149 -2 10000 1 2 total 0.000000 0.000000 -1 10000 2 1 total 0.454366 0.027426 -0 10000 2 2 total 0.000000 0.000000 +3 1 1 1 total 0.020142 0.003149 +2 1 1 2 total 0.000000 0.000000 +1 1 2 1 total 0.454366 0.027426 +0 1 2 2 total 0.000000 0.000000 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.997433 0.078224 -2 10000 1 2 total 0.002567 0.001256 -1 10000 2 1 total 0.002242 0.002243 -0 10000 2 2 total 0.997758 0.041053 +3 1 1 1 total 0.997433 0.078224 +2 1 1 2 total 0.002567 0.001256 +1 1 2 1 total 0.002242 0.002243 +0 1 2 2 total 0.997758 0.041053 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.386423 0.036629 -13 10000 1 1 total P1 0.052170 0.007767 -14 10000 1 1 total P2 0.020185 0.003138 -15 10000 1 1 total P3 0.009533 0.002327 -8 10000 1 2 total P0 0.000995 0.000489 -9 10000 1 2 total P1 -0.000208 0.000150 -10 10000 1 2 total P2 -0.000104 0.000186 -11 10000 1 2 total P3 0.000236 0.000130 -4 10000 2 1 total P0 0.000887 0.000889 -5 10000 2 1 total P1 -0.000737 0.000738 -6 10000 2 1 total P2 0.000474 0.000475 -7 10000 2 1 total P3 -0.000165 0.000165 -0 10000 2 2 total P0 0.394772 0.029871 -1 10000 2 2 total P1 0.015813 0.004443 -2 10000 2 2 total P2 0.006113 0.010131 -3 10000 2 2 total P3 -0.010073 0.010037 +12 1 1 1 total P0 0.386423 0.036629 +13 1 1 1 total P1 0.052170 0.007767 +14 1 1 1 total P2 0.020185 0.003138 +15 1 1 1 total P3 0.009533 0.002327 +8 1 1 2 total P0 0.000995 0.000489 +9 1 1 2 total P1 -0.000208 0.000150 +10 1 1 2 total P2 -0.000104 0.000186 +11 1 1 2 total P3 0.000236 0.000130 +4 1 2 1 total P0 0.000887 0.000889 +5 1 2 1 total P1 -0.000737 0.000738 +6 1 2 1 total P2 0.000474 0.000475 +7 1 2 1 total P3 -0.000165 0.000165 +0 1 2 2 total P0 0.394772 0.029871 +1 1 2 2 total P1 0.015813 0.004443 +2 1 2 2 total P2 0.006113 0.010131 +3 1 2 2 total P3 -0.010073 0.010037 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.386423 0.047563 -13 10000 1 1 total P1 0.052170 0.008781 -14 10000 1 1 total P2 0.020185 0.003515 -15 10000 1 1 total P3 0.009533 0.002444 -8 10000 1 2 total P0 0.000995 0.000841 -9 10000 1 2 total P1 -0.000208 0.000208 -10 10000 1 2 total P2 -0.000104 0.000199 -11 10000 1 2 total P3 0.000236 0.000208 -4 10000 2 1 total P0 0.000887 0.001538 -5 10000 2 1 total P1 -0.000737 0.001277 -6 10000 2 1 total P2 0.000474 0.000821 -7 10000 2 1 total P3 -0.000165 0.000285 -0 10000 2 2 total P0 0.394772 0.033999 -1 10000 2 2 total P1 0.015813 0.004491 -2 10000 2 2 total P2 0.006113 0.010134 -3 10000 2 2 total P3 -0.010073 0.010045 +12 1 1 1 total P0 0.386423 0.047563 +13 1 1 1 total P1 0.052170 0.008781 +14 1 1 1 total P2 0.020185 0.003515 +15 1 1 1 total P3 0.009533 0.002444 +8 1 1 2 total P0 0.000995 0.000841 +9 1 1 2 total P1 -0.000208 0.000208 +10 1 1 2 total P2 -0.000104 0.000199 +11 1 1 2 total P3 0.000236 0.000208 +4 1 2 1 total P0 0.000887 0.001538 +5 1 2 1 total P1 -0.000737 0.001277 +6 1 2 1 total P2 0.000474 0.000821 +7 1 2 1 total P3 -0.000165 0.000285 +0 1 2 2 total P0 0.394772 0.033999 +1 1 2 2 total P1 0.015813 0.004491 +2 1 2 2 total P2 0.006113 0.010134 +3 1 2 2 total P3 -0.010073 0.010045 material group out nuclide mean std. dev. -1 10000 1 total 1.0 0.046071 -0 10000 2 total 0.0 0.000000 +1 1 1 total 1.0 0.046071 +0 1 2 total 0.0 0.000000 material group out nuclide mean std. dev. -1 10000 1 total 1.0 0.051471 -0 10000 2 total 0.0 0.000000 +1 1 1 total 1.0 0.051471 +0 1 2 total 0.0 0.000000 material group in nuclide mean std. dev. -1 10000 1 total 5.709324e-08 4.687938e-09 -0 10000 2 total 2.855739e-06 2.442164e-07 +1 1 1 total 5.709324e-08 4.687938e-09 +0 1 2 total 2.855739e-06 2.442164e-07 material group in nuclide mean std. dev. -1 10000 1 total 0.019239 0.001310 -0 10000 2 total 0.466719 0.041411 +1 1 1 total 0.019239 0.001310 +0 1 2 total 0.466719 0.041411 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.020142 0.003149 -2 10000 1 2 total 0.000000 0.000000 -1 10000 2 1 total 0.445819 0.028675 -0 10000 2 2 total 0.000000 0.000000 +3 1 1 1 total 0.020142 0.003149 +2 1 1 2 total 0.000000 0.000000 +1 1 2 1 total 0.445819 0.028675 +0 1 2 2 total 0.000000 0.000000 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000004 2.897486e-07 -3 10000 2 1 total 0.000027 1.850038e-06 -5 10000 3 1 total 0.000028 1.970979e-06 -7 10000 4 1 total 0.000074 5.226103e-06 -9 10000 5 1 total 0.000041 2.998308e-06 -11 10000 6 1 total 0.000017 1.226547e-06 -0 10000 1 2 total 0.000107 9.491556e-06 -2 10000 2 2 total 0.000552 4.899251e-05 -4 10000 3 2 total 0.000527 4.677253e-05 -6 10000 4 2 total 0.001182 1.048679e-04 -8 10000 5 2 total 0.000485 4.299445e-05 -10 10000 6 2 total 0.000203 1.801022e-05 +1 1 1 1 total 0.000004 2.897486e-07 +3 1 2 1 total 0.000027 1.850038e-06 +5 1 3 1 total 0.000028 1.970979e-06 +7 1 4 1 total 0.000074 5.226103e-06 +9 1 5 1 total 0.000041 2.998308e-06 +11 1 6 1 total 0.000017 1.226547e-06 +0 1 1 2 total 0.000107 9.491556e-06 +2 1 2 2 total 0.000552 4.899251e-05 +4 1 3 2 total 0.000527 4.677253e-05 +6 1 4 2 total 0.001182 1.048679e-04 +8 1 5 2 total 0.000485 4.299445e-05 +10 1 6 2 total 0.000203 1.801022e-05 material delayedgroup group out nuclide mean std. dev. -1 10000 1 1 total 0.0 0.000000 -3 10000 2 1 total 1.0 0.869128 -5 10000 3 1 total 1.0 1.414214 -7 10000 4 1 total 1.0 0.360359 -9 10000 5 1 total 0.0 0.000000 -11 10000 6 1 total 0.0 0.000000 -0 10000 1 2 total 0.0 0.000000 -2 10000 2 2 total 0.0 0.000000 -4 10000 3 2 total 0.0 0.000000 -6 10000 4 2 total 0.0 0.000000 -8 10000 5 2 total 0.0 0.000000 -10 10000 6 2 total 0.0 0.000000 +1 1 1 1 total 0.0 0.000000 +3 1 2 1 total 1.0 0.869128 +5 1 3 1 total 1.0 1.414214 +7 1 4 1 total 1.0 0.360359 +9 1 5 1 total 0.0 0.000000 +11 1 6 1 total 0.0 0.000000 +0 1 1 2 total 0.0 0.000000 +2 1 2 2 total 0.0 0.000000 +4 1 3 2 total 0.0 0.000000 +6 1 4 2 total 0.0 0.000000 +8 1 5 2 total 0.0 0.000000 +10 1 6 2 total 0.0 0.000000 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000222 0.000018 -3 10000 2 1 total 0.001388 0.000115 -5 10000 3 1 total 0.001463 0.000122 -7 10000 4 1 total 0.003822 0.000321 -9 10000 5 1 total 0.002135 0.000183 -11 10000 6 1 total 0.000875 0.000075 -0 10000 1 2 total 0.000228 0.000025 -2 10000 2 2 total 0.001175 0.000127 -4 10000 3 2 total 0.001122 0.000122 -6 10000 4 2 total 0.002516 0.000273 -8 10000 5 2 total 0.001031 0.000112 -10 10000 6 2 total 0.000432 0.000047 +1 1 1 1 total 0.000222 0.000018 +3 1 2 1 total 0.001388 0.000115 +5 1 3 1 total 0.001463 0.000122 +7 1 4 1 total 0.003822 0.000321 +9 1 5 1 total 0.002135 0.000183 +11 1 6 1 total 0.000875 0.000075 +0 1 1 2 total 0.000228 0.000025 +2 1 2 2 total 0.001175 0.000127 +4 1 3 2 total 0.001122 0.000122 +6 1 4 2 total 0.002516 0.000273 +8 1 5 2 total 0.001031 0.000112 +10 1 6 2 total 0.000432 0.000047 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.013445 0.001084 -3 10000 2 1 total 0.032064 0.002658 -5 10000 3 1 total 0.122136 0.010296 -7 10000 4 1 total 0.315269 0.027175 -9 10000 5 1 total 0.889233 0.079368 -11 10000 6 1 total 2.989404 0.266253 -0 10000 1 2 total 0.013336 0.001446 -2 10000 2 2 total 0.032739 0.003550 -4 10000 3 2 total 0.120780 0.013098 -6 10000 4 2 total 0.302780 0.032835 -8 10000 5 2 total 0.849490 0.092124 -10 10000 6 2 total 2.853001 0.309397 +1 1 1 1 total 0.013445 0.001084 +3 1 2 1 total 0.032064 0.002658 +5 1 3 1 total 0.122136 0.010296 +7 1 4 1 total 0.315269 0.027175 +9 1 5 1 total 0.889233 0.079368 +11 1 6 1 total 2.989404 0.266253 +0 1 1 2 total 0.013336 0.001446 +2 1 2 2 total 0.032739 0.003550 +4 1 3 2 total 0.120780 0.013098 +6 1 4 2 total 0.302780 0.032835 +8 1 5 2 total 0.849490 0.092124 +10 1 6 2 total 2.853001 0.309397 material delayedgroup group in group out nuclide mean std. dev. -3 10000 1 1 1 total 0.000000 0.000000 -7 10000 2 1 1 total 0.000000 0.000000 -11 10000 3 1 1 total 0.000000 0.000000 -15 10000 4 1 1 total 0.000000 0.000000 -19 10000 5 1 1 total 0.000000 0.000000 -23 10000 6 1 1 total 0.000000 0.000000 -2 10000 1 1 2 total 0.000000 0.000000 -6 10000 2 1 2 total 0.000000 0.000000 -10 10000 3 1 2 total 0.000000 0.000000 -14 10000 4 1 2 total 0.000000 0.000000 -18 10000 5 1 2 total 0.000000 0.000000 -22 10000 6 1 2 total 0.000000 0.000000 -1 10000 1 2 1 total 0.000000 0.000000 -5 10000 2 2 1 total 0.002538 0.001561 -9 10000 3 2 1 total 0.001186 0.001186 -13 10000 4 2 1 total 0.004823 0.001234 -17 10000 5 2 1 total 0.000000 0.000000 -21 10000 6 2 1 total 0.000000 0.000000 -0 10000 1 2 2 total 0.000000 0.000000 -4 10000 2 2 2 total 0.000000 0.000000 -8 10000 3 2 2 total 0.000000 0.000000 -12 10000 4 2 2 total 0.000000 0.000000 -16 10000 5 2 2 total 0.000000 0.000000 -20 10000 6 2 2 total 0.000000 0.000000 +3 1 1 1 1 total 0.000000 0.000000 +7 1 2 1 1 total 0.000000 0.000000 +11 1 3 1 1 total 0.000000 0.000000 +15 1 4 1 1 total 0.000000 0.000000 +19 1 5 1 1 total 0.000000 0.000000 +23 1 6 1 1 total 0.000000 0.000000 +2 1 1 1 2 total 0.000000 0.000000 +6 1 2 1 2 total 0.000000 0.000000 +10 1 3 1 2 total 0.000000 0.000000 +14 1 4 1 2 total 0.000000 0.000000 +18 1 5 1 2 total 0.000000 0.000000 +22 1 6 1 2 total 0.000000 0.000000 +1 1 1 2 1 total 0.000000 0.000000 +5 1 2 2 1 total 0.002538 0.001561 +9 1 3 2 1 total 0.001186 0.001186 +13 1 4 2 1 total 0.004823 0.001234 +17 1 5 2 1 total 0.000000 0.000000 +21 1 6 2 1 total 0.000000 0.000000 +0 1 1 2 2 total 0.000000 0.000000 +4 1 2 2 2 total 0.000000 0.000000 +8 1 3 2 2 total 0.000000 0.000000 +12 1 4 2 2 total 0.000000 0.000000 +16 1 5 2 2 total 0.000000 0.000000 +20 1 6 2 2 total 0.000000 0.000000 material group in nuclide mean std. dev. -1 10001 1 total 0.313738 0.015582 -0 10001 2 total 0.300821 0.028052 +1 2 1 total 0.313738 0.015582 +0 2 2 total 0.300821 0.028052 material group in nuclide mean std. dev. -1 10001 1 total 0.275508 0.017742 -0 10001 2 total 0.312035 0.032384 +1 2 1 total 0.275508 0.017742 +0 2 2 total 0.312035 0.032384 material group in nuclide mean std. dev. -1 10001 1 total 0.275508 0.017742 -0 10001 2 total 0.312035 0.032384 +1 2 1 total 0.275508 0.017742 +0 2 2 total 0.312035 0.032384 material group in nuclide mean std. dev. -1 10001 1 total 0.001575 0.000323 -0 10001 2 total 0.005400 0.000618 +1 2 1 total 0.001575 0.000323 +0 2 2 total 0.005400 0.000618 material group in nuclide mean std. dev. -1 10001 1 total 0.001575 0.000323 -0 10001 2 total 0.005400 0.000618 +1 2 1 total 0.001575 0.000323 +0 2 2 total 0.005400 0.000618 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.312163 0.015322 -0 10001 2 total 0.295421 0.027446 +1 2 1 total 0.312163 0.015322 +0 2 2 total 0.295421 0.027446 material group in nuclide mean std. dev. -1 10001 1 total 0.310121 0.033788 -0 10001 2 total 0.296264 0.043792 +1 2 1 total 0.310121 0.033788 +0 2 2 total 0.296264 0.043792 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.310121 0.033788 -13 10001 1 1 total P1 0.038230 0.008484 -14 10001 1 1 total P2 0.020745 0.004696 -15 10001 1 1 total P3 0.007964 0.003732 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.296264 0.043792 -1 10001 2 2 total P1 -0.011214 0.016180 -2 10001 2 2 total P2 0.008837 0.011504 -3 10001 2 2 total P3 -0.003270 0.007329 +12 2 1 1 total P0 0.310121 0.033788 +13 2 1 1 total P1 0.038230 0.008484 +14 2 1 1 total P2 0.020745 0.004696 +15 2 1 1 total P3 0.007964 0.003732 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.296264 0.043792 +1 2 2 2 total P1 -0.011214 0.016180 +2 2 2 2 total P2 0.008837 0.011504 +3 2 2 2 total P3 -0.003270 0.007329 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.310121 0.033788 -13 10001 1 1 total P1 0.038230 0.008484 -14 10001 1 1 total P2 0.020745 0.004696 -15 10001 1 1 total P3 0.007964 0.003732 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.296264 0.043792 -1 10001 2 2 total P1 -0.011214 0.016180 -2 10001 2 2 total P2 0.008837 0.011504 -3 10001 2 2 total P3 -0.003270 0.007329 +12 2 1 1 total P0 0.310121 0.033788 +13 2 1 1 total P1 0.038230 0.008484 +14 2 1 1 total P2 0.020745 0.004696 +15 2 1 1 total P3 0.007964 0.003732 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.296264 0.043792 +1 2 2 2 total P1 -0.011214 0.016180 +2 2 2 2 total P2 0.008837 0.011504 +3 2 2 2 total P3 -0.003270 0.007329 material group in group out nuclide mean std. dev. -3 10001 1 1 total 1.0 0.108779 -2 10001 1 2 total 0.0 0.000000 -1 10001 2 1 total 0.0 0.000000 -0 10001 2 2 total 1.0 0.142427 +3 2 1 1 total 1.0 0.108779 +2 2 1 2 total 0.0 0.000000 +1 2 2 1 total 0.0 0.000000 +0 2 2 2 total 1.0 0.142427 material group in group out nuclide mean std. dev. -3 10001 1 1 total 0.0 0.0 -2 10001 1 2 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -0 10001 2 2 total 0.0 0.0 +3 2 1 1 total 0.0 0.0 +2 2 1 2 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +0 2 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10001 1 1 total 1.0 0.108779 -2 10001 1 2 total 0.0 0.000000 -1 10001 2 1 total 0.0 0.000000 -0 10001 2 2 total 1.0 0.142427 +3 2 1 1 total 1.0 0.108779 +2 2 1 2 total 0.0 0.000000 +1 2 2 1 total 0.0 0.000000 +0 2 2 2 total 1.0 0.142427 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.312163 0.037253 -13 10001 1 1 total P1 0.038481 0.008743 -14 10001 1 1 total P2 0.020882 0.004835 -15 10001 1 1 total P3 0.008017 0.003776 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.295421 0.050236 -1 10001 2 2 total P1 -0.011182 0.016162 -2 10001 2 2 total P2 0.008811 0.011495 -3 10001 2 2 total P3 -0.003261 0.007313 +12 2 1 1 total P0 0.312163 0.037253 +13 2 1 1 total P1 0.038481 0.008743 +14 2 1 1 total P2 0.020882 0.004835 +15 2 1 1 total P3 0.008017 0.003776 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.295421 0.050236 +1 2 2 2 total P1 -0.011182 0.016162 +2 2 2 2 total P2 0.008811 0.011495 +3 2 2 2 total P3 -0.003261 0.007313 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.312163 0.050407 -13 10001 1 1 total P1 0.038481 0.009693 -14 10001 1 1 total P2 0.020882 0.005342 -15 10001 1 1 total P3 0.008017 0.003876 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.295421 0.065529 -1 10001 2 2 total P1 -0.011182 0.016240 -2 10001 2 2 total P2 0.008811 0.011563 -3 10001 2 2 total P3 -0.003261 0.007328 +12 2 1 1 total P0 0.312163 0.050407 +13 2 1 1 total P1 0.038481 0.009693 +14 2 1 1 total P2 0.020882 0.005342 +15 2 1 1 total P3 0.008017 0.003876 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.295421 0.065529 +1 2 2 2 total P1 -0.011182 0.016240 +2 2 2 2 total P2 0.008811 0.011563 +3 2 2 2 total P3 -0.003261 0.007328 material group out nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group out nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 5.995979e-08 4.553084e-09 -0 10001 2 total 2.985490e-06 3.417020e-07 +1 2 1 total 5.995979e-08 4.553084e-09 +0 2 2 total 2.985490e-06 3.417020e-07 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10001 1 1 total 0.0 0.0 -2 10001 1 2 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -0 10001 2 2 total 0.0 0.0 +3 2 1 1 total 0.0 0.0 +2 2 1 2 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +0 2 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -3 10001 1 1 1 total 0.0 0.0 -7 10001 2 1 1 total 0.0 0.0 -11 10001 3 1 1 total 0.0 0.0 -15 10001 4 1 1 total 0.0 0.0 -19 10001 5 1 1 total 0.0 0.0 -23 10001 6 1 1 total 0.0 0.0 -2 10001 1 1 2 total 0.0 0.0 -6 10001 2 1 2 total 0.0 0.0 -10 10001 3 1 2 total 0.0 0.0 -14 10001 4 1 2 total 0.0 0.0 -18 10001 5 1 2 total 0.0 0.0 -22 10001 6 1 2 total 0.0 0.0 -1 10001 1 2 1 total 0.0 0.0 -5 10001 2 2 1 total 0.0 0.0 -9 10001 3 2 1 total 0.0 0.0 -13 10001 4 2 1 total 0.0 0.0 -17 10001 5 2 1 total 0.0 0.0 -21 10001 6 2 1 total 0.0 0.0 -0 10001 1 2 2 total 0.0 0.0 -4 10001 2 2 2 total 0.0 0.0 -8 10001 3 2 2 total 0.0 0.0 -12 10001 4 2 2 total 0.0 0.0 -16 10001 5 2 2 total 0.0 0.0 -20 10001 6 2 2 total 0.0 0.0 +3 2 1 1 1 total 0.0 0.0 +7 2 2 1 1 total 0.0 0.0 +11 2 3 1 1 total 0.0 0.0 +15 2 4 1 1 total 0.0 0.0 +19 2 5 1 1 total 0.0 0.0 +23 2 6 1 1 total 0.0 0.0 +2 2 1 1 2 total 0.0 0.0 +6 2 2 1 2 total 0.0 0.0 +10 2 3 1 2 total 0.0 0.0 +14 2 4 1 2 total 0.0 0.0 +18 2 5 1 2 total 0.0 0.0 +22 2 6 1 2 total 0.0 0.0 +1 2 1 2 1 total 0.0 0.0 +5 2 2 2 1 total 0.0 0.0 +9 2 3 2 1 total 0.0 0.0 +13 2 4 2 1 total 0.0 0.0 +17 2 5 2 1 total 0.0 0.0 +21 2 6 2 1 total 0.0 0.0 +0 2 1 2 2 total 0.0 0.0 +4 2 2 2 2 total 0.0 0.0 +8 2 3 2 2 total 0.0 0.0 +12 2 4 2 2 total 0.0 0.0 +16 2 5 2 2 total 0.0 0.0 +20 2 6 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.664572 0.031215 -0 10002 2 total 2.052384 0.224343 +1 3 1 total 0.664572 0.031215 +0 3 2 total 2.052384 0.224343 material group in nuclide mean std. dev. -1 10002 1 total 0.283323 0.035206 -0 10002 2 total 1.499740 0.230902 +1 3 1 total 0.283323 0.035206 +0 3 2 total 1.499740 0.230902 material group in nuclide mean std. dev. -1 10002 1 total 0.283323 0.035206 -0 10002 2 total 1.499740 0.230902 +1 3 1 total 0.283323 0.035206 +0 3 2 total 1.499740 0.230902 material group in nuclide mean std. dev. -1 10002 1 total 0.000690 0.000044 -0 10002 2 total 0.031687 0.003747 +1 3 1 total 0.000690 0.000044 +0 3 2 total 0.031687 0.003747 material group in nuclide mean std. dev. -1 10002 1 total 0.000690 0.000044 -0 10002 2 total 0.031687 0.003747 +1 3 1 total 0.000690 0.000044 +0 3 2 total 0.031687 0.003747 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.663882 0.031173 -0 10002 2 total 2.020697 0.220604 +1 3 1 total 0.663882 0.031173 +0 3 2 total 2.020697 0.220604 material group in nuclide mean std. dev. -1 10002 1 total 0.671269 0.026186 -0 10002 2 total 2.035388 0.258060 +1 3 1 total 0.671269 0.026186 +0 3 2 total 2.035388 0.258060 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.639901 0.024709 -13 10002 1 1 total P1 0.381167 0.016243 -14 10002 1 1 total P2 0.152392 0.008156 -15 10002 1 1 total P3 0.009148 0.003889 -8 10002 1 2 total P0 0.031368 0.001728 -9 10002 1 2 total P1 0.008758 0.000926 -10 10002 1 2 total P2 -0.002568 0.001014 -11 10002 1 2 total P3 -0.003785 0.000817 -4 10002 2 1 total P0 0.000443 0.000445 -5 10002 2 1 total P1 0.000400 0.000401 -6 10002 2 1 total P2 0.000320 0.000321 -7 10002 2 1 total P3 0.000214 0.000215 -0 10002 2 2 total P0 2.034945 0.257800 -1 10002 2 2 total P1 0.509940 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +12 3 1 1 total P0 0.639901 0.024709 +13 3 1 1 total P1 0.381167 0.016243 +14 3 1 1 total P2 0.152392 0.008156 +15 3 1 1 total P3 0.009148 0.003889 +8 3 1 2 total P0 0.031368 0.001728 +9 3 1 2 total P1 0.008758 0.000926 +10 3 1 2 total P2 -0.002568 0.001014 +11 3 1 2 total P3 -0.003785 0.000817 +4 3 2 1 total P0 0.000443 0.000445 +5 3 2 1 total P1 0.000400 0.000401 +6 3 2 1 total P2 0.000320 0.000321 +7 3 2 1 total P3 0.000214 0.000215 +0 3 2 2 total P0 2.034945 0.257800 +1 3 2 2 total P1 0.509940 0.051236 +2 3 2 2 total P2 0.111175 0.013020 +3 3 2 2 total P3 0.024988 0.008312 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.639901 0.024709 -13 10002 1 1 total P1 0.381167 0.016243 -14 10002 1 1 total P2 0.152392 0.008156 -15 10002 1 1 total P3 0.009148 0.003889 -8 10002 1 2 total P0 0.031368 0.001728 -9 10002 1 2 total P1 0.008758 0.000926 -10 10002 1 2 total P2 -0.002568 0.001014 -11 10002 1 2 total P3 -0.003785 0.000817 -4 10002 2 1 total P0 0.000443 0.000445 -5 10002 2 1 total P1 0.000400 0.000401 -6 10002 2 1 total P2 0.000320 0.000321 -7 10002 2 1 total P3 0.000214 0.000215 -0 10002 2 2 total P0 2.034945 0.257800 -1 10002 2 2 total P1 0.509940 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +12 3 1 1 total P0 0.639901 0.024709 +13 3 1 1 total P1 0.381167 0.016243 +14 3 1 1 total P2 0.152392 0.008156 +15 3 1 1 total P3 0.009148 0.003889 +8 3 1 2 total P0 0.031368 0.001728 +9 3 1 2 total P1 0.008758 0.000926 +10 3 1 2 total P2 -0.002568 0.001014 +11 3 1 2 total P3 -0.003785 0.000817 +4 3 2 1 total P0 0.000443 0.000445 +5 3 2 1 total P1 0.000400 0.000401 +6 3 2 1 total P2 0.000320 0.000321 +7 3 2 1 total P3 0.000214 0.000215 +0 3 2 2 total P0 2.034945 0.257800 +1 3 2 2 total P1 0.509940 0.051236 +2 3 2 2 total P2 0.111175 0.013020 +3 3 2 2 total P3 0.024988 0.008312 material group in group out nuclide mean std. dev. -3 10002 1 1 total 1.0 0.038609 -2 10002 1 2 total 1.0 0.067667 -1 10002 2 1 total 1.0 1.414214 -0 10002 2 2 total 1.0 0.135929 +3 3 1 1 total 1.0 0.038609 +2 3 1 2 total 1.0 0.067667 +1 3 2 1 total 1.0 1.414214 +0 3 2 2 total 1.0 0.135929 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.0 0.0 -2 10002 1 2 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -0 10002 2 2 total 0.0 0.0 +3 3 1 1 total 0.0 0.0 +2 3 1 2 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +0 3 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.953271 0.036018 -2 10002 1 2 total 0.046729 0.002547 -1 10002 2 1 total 0.000218 0.000219 -0 10002 2 2 total 0.999782 0.135885 +3 3 1 1 total 0.953271 0.036018 +2 3 1 2 total 0.046729 0.002547 +1 3 2 1 total 0.000218 0.000219 +0 3 2 2 total 0.999782 0.135885 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.632859 0.038142 -13 10002 1 1 total P1 0.376973 0.023715 -14 10002 1 1 total P2 0.150715 0.010664 -15 10002 1 1 total P3 0.009047 0.003868 -8 10002 1 2 total P0 0.031023 0.002232 -9 10002 1 2 total P1 0.008661 0.000999 -10 10002 1 2 total P2 -0.002540 0.001010 -11 10002 1 2 total P3 -0.003743 0.000826 -4 10002 2 1 total P0 0.000440 0.000445 -5 10002 2 1 total P1 0.000397 0.000401 -6 10002 2 1 total P2 0.000317 0.000321 -7 10002 2 1 total P3 0.000212 0.000215 -0 10002 2 2 total P0 2.020256 0.352194 -1 10002 2 2 total P1 0.506260 0.079140 -2 10002 2 2 total P2 0.110372 0.018488 -3 10002 2 2 total P3 0.024808 0.008771 +12 3 1 1 total P0 0.632859 0.038142 +13 3 1 1 total P1 0.376973 0.023715 +14 3 1 1 total P2 0.150715 0.010664 +15 3 1 1 total P3 0.009047 0.003868 +8 3 1 2 total P0 0.031023 0.002232 +9 3 1 2 total P1 0.008661 0.000999 +10 3 1 2 total P2 -0.002540 0.001010 +11 3 1 2 total P3 -0.003743 0.000826 +4 3 2 1 total P0 0.000440 0.000445 +5 3 2 1 total P1 0.000397 0.000401 +6 3 2 1 total P2 0.000317 0.000321 +7 3 2 1 total P3 0.000212 0.000215 +0 3 2 2 total P0 2.020256 0.352194 +1 3 2 2 total P1 0.506260 0.079140 +2 3 2 2 total P2 0.110372 0.018488 +3 3 2 2 total P3 0.024808 0.008771 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.632859 0.045297 -13 10002 1 1 total P1 0.376973 0.027825 -14 10002 1 1 total P2 0.150715 0.012148 -15 10002 1 1 total P3 0.009047 0.003884 -8 10002 1 2 total P0 0.031023 0.003064 -9 10002 1 2 total P1 0.008661 0.001159 -10 10002 1 2 total P2 -0.002540 0.001024 -11 10002 1 2 total P3 -0.003743 0.000864 -4 10002 2 1 total P0 0.000440 0.000765 -5 10002 2 1 total P1 0.000397 0.000690 -6 10002 2 1 total P2 0.000317 0.000551 -7 10002 2 1 total P3 0.000212 0.000369 -0 10002 2 2 total P0 2.020256 0.446601 -1 10002 2 2 total P1 0.506260 0.104875 -2 10002 2 2 total P2 0.110372 0.023809 -3 10002 2 2 total P3 0.024808 0.009397 +12 3 1 1 total P0 0.632859 0.045297 +13 3 1 1 total P1 0.376973 0.027825 +14 3 1 1 total P2 0.150715 0.012148 +15 3 1 1 total P3 0.009047 0.003884 +8 3 1 2 total P0 0.031023 0.003064 +9 3 1 2 total P1 0.008661 0.001159 +10 3 1 2 total P2 -0.002540 0.001024 +11 3 1 2 total P3 -0.003743 0.000864 +4 3 2 1 total P0 0.000440 0.000765 +5 3 2 1 total P1 0.000397 0.000690 +6 3 2 1 total P2 0.000317 0.000551 +7 3 2 1 total P3 0.000212 0.000369 +0 3 2 2 total P0 2.020256 0.446601 +1 3 2 2 total P1 0.506260 0.104875 +2 3 2 2 total P2 0.110372 0.023809 +3 3 2 2 total P3 0.024808 0.009397 material group out nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group out nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 6.022078e-08 3.780437e-09 -0 10002 2 total 3.044955e-06 3.600077e-07 +1 3 1 total 6.022078e-08 3.780437e-09 +0 3 2 total 3.044955e-06 3.600077e-07 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.0 0.0 -2 10002 1 2 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -0 10002 2 2 total 0.0 0.0 +3 3 1 1 total 0.0 0.0 +2 3 1 2 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +0 3 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -3 10002 1 1 1 total 0.0 0.0 -7 10002 2 1 1 total 0.0 0.0 -11 10002 3 1 1 total 0.0 0.0 -15 10002 4 1 1 total 0.0 0.0 -19 10002 5 1 1 total 0.0 0.0 -23 10002 6 1 1 total 0.0 0.0 -2 10002 1 1 2 total 0.0 0.0 -6 10002 2 1 2 total 0.0 0.0 -10 10002 3 1 2 total 0.0 0.0 -14 10002 4 1 2 total 0.0 0.0 -18 10002 5 1 2 total 0.0 0.0 -22 10002 6 1 2 total 0.0 0.0 -1 10002 1 2 1 total 0.0 0.0 -5 10002 2 2 1 total 0.0 0.0 -9 10002 3 2 1 total 0.0 0.0 -13 10002 4 2 1 total 0.0 0.0 -17 10002 5 2 1 total 0.0 0.0 -21 10002 6 2 1 total 0.0 0.0 -0 10002 1 2 2 total 0.0 0.0 -4 10002 2 2 2 total 0.0 0.0 -8 10002 3 2 2 total 0.0 0.0 -12 10002 4 2 2 total 0.0 0.0 -16 10002 5 2 2 total 0.0 0.0 -20 10002 6 2 2 total 0.0 0.0 +3 3 1 1 1 total 0.0 0.0 +7 3 2 1 1 total 0.0 0.0 +11 3 3 1 1 total 0.0 0.0 +15 3 4 1 1 total 0.0 0.0 +19 3 5 1 1 total 0.0 0.0 +23 3 6 1 1 total 0.0 0.0 +2 3 1 1 2 total 0.0 0.0 +6 3 2 1 2 total 0.0 0.0 +10 3 3 1 2 total 0.0 0.0 +14 3 4 1 2 total 0.0 0.0 +18 3 5 1 2 total 0.0 0.0 +22 3 6 1 2 total 0.0 0.0 +1 3 1 2 1 total 0.0 0.0 +5 3 2 2 1 total 0.0 0.0 +9 3 3 2 1 total 0.0 0.0 +13 3 4 2 1 total 0.0 0.0 +17 3 5 2 1 total 0.0 0.0 +21 3 6 2 1 total 0.0 0.0 +0 3 1 2 2 total 0.0 0.0 +4 3 2 2 2 total 0.0 0.0 +8 3 3 2 2 total 0.0 0.0 +12 3 4 2 2 total 0.0 0.0 +16 3 5 2 2 total 0.0 0.0 +20 3 6 2 2 total 0.0 0.0 diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 72195e90b..826eb5b62 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1,1007 +1,1007 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 10000 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 10001 - - - 10002 - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - total - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - U234 U235 U238 O16 - scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - total - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10004 - U234 U235 U238 O16 - nu-scatter-1 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - absorption - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - absorption - tracklength - - - 10000 10001 - U234 U235 U238 O16 - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - nu-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - kappa-fission - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - scatter - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 - U234 U235 U238 O16 - nu-scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter-P3 - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - nu-scatter-P3 - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - nu-scatter - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter - analog - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - nu-fission - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - scatter - tracklength - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter-P3 - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - scatter - tracklength - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter-P3 - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - nu-scatter-0 - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - scatter-0 - analog - - - 10000 10045 - U234 U235 U238 O16 - nu-fission - analog - - - 10000 10004 - U234 U235 U238 O16 - nu-fission - analog - - - 10000 10045 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 10000 10004 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - inverse-velocity - tracklength - - - 10000 10001 - total - flux - tracklength - - - 10000 10001 - U234 U235 U238 O16 - prompt-nu-fission - tracklength - - - 10000 10001 - total - flux - analog - - - 10000 10001 10004 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 10056 10001 - total - flux - analog - - - 10056 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-1 - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 10056 10001 - total - flux - analog - - - 10056 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-1 - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - absorption - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - absorption - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - fission - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - fission - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - kappa-fission - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 10056 10001 - total - flux - analog - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter - analog - - - 10056 10001 - total - flux - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 10056 10001 - total - flux - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-P3 - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - analog - - - 10056 10001 - total - flux - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-0 - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-0 - analog - - - 10056 10045 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 10056 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 10056 10045 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 10056 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - inverse-velocity - tracklength - - - 10056 10001 - total - flux - tracklength - - - 10056 10001 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - tracklength - - - 10056 10001 - total - flux - analog - - - 10056 10001 10004 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - total - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - total - tracklength - - - 10112 10001 - total - flux - analog - - - 10112 10004 - H1 O16 B10 B11 - scatter-1 - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - total - tracklength - - - 10112 10001 - total - flux - analog - - - 10112 10004 - H1 O16 B10 B11 - nu-scatter-1 - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - absorption - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - absorption - tracklength - - - 10112 10001 - H1 O16 B10 B11 - fission - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - fission - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - nu-fission - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - kappa-fission - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - scatter - tracklength - - - 10112 10001 - total - flux - analog - - - 10112 10001 - H1 O16 B10 B11 - nu-scatter - analog - - - 10112 10001 - total - flux - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter-P3 - analog - - - 10112 10001 - total - flux - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - nu-scatter-P3 - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - nu-scatter - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter - analog - - - 10112 10001 - total - flux - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - nu-fission - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - scatter - tracklength - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter-P3 - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - scatter - tracklength - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter-P3 - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - nu-scatter-0 - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - scatter-0 - analog - - - 10112 10045 - H1 O16 B10 B11 - nu-fission - analog - - - 10112 10004 - H1 O16 B10 B11 - nu-fission - analog - - - 10112 10045 - H1 O16 B10 B11 - prompt-nu-fission - analog - - - 10112 10004 - H1 O16 B10 B11 - prompt-nu-fission - analog - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - inverse-velocity - tracklength - - - 10112 10001 - total - flux - tracklength - - - 10112 10001 - H1 O16 B10 B11 - prompt-nu-fission - tracklength - - - 10112 10001 - total - flux - analog - - - 10112 10001 10004 - H1 O16 B10 B11 - prompt-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + U234 U235 U238 O16 + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + U234 U235 U238 O16 + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + absorption + tracklength + + + 1 2 + U234 U235 U238 O16 + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + U234 U235 U238 O16 + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter-P3 + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-fission + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter-0 + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter-0 + analog + + + 1 46 + U234 U235 U238 O16 + nu-fission + analog + + + 1 5 + U234 U235 U238 O16 + nu-fission + analog + + + 1 46 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 1 5 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-1 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-1 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + absorption + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + absorption + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + kappa-fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 + total + flux + analog + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-P3 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-0 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-0 + analog + + + 57 46 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 46 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + inverse-velocity + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + tracklength + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + analog + + + 113 5 + H1 O16 B10 B11 + scatter-1 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + analog + + + 113 5 + H1 O16 B10 B11 + nu-scatter-1 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + absorption + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + absorption + tracklength + + + 113 2 + H1 O16 B10 B11 + fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + nu-fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + kappa-fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 + total + flux + analog + + + 113 2 + H1 O16 B10 B11 + nu-scatter + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter-P3 + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-fission + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter-0 + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter-0 + analog + + + 113 46 + H1 O16 B10 B11 + nu-fission + analog + + + 113 5 + H1 O16 B10 B11 + nu-fission + analog + + + 113 46 + H1 O16 B10 B11 + prompt-nu-fission + analog + + + 113 5 + H1 O16 B10 B11 + prompt-nu-fission + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + inverse-velocity + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + prompt-nu-fission + tracklength + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + prompt-nu-fission + analog + diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 1b47f7126..a0315ebbc 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -ea1c7567cb5399ab26297b5df0c1c21b52863303746d04f1698760d88b1aafb625d5743969ad30b194c353d106ed4287a8bc755ea6404c2f5dafb2ea930444a7 \ No newline at end of file +174d1593a15de41e2aba88cc4c48fc3a400314b400571a0328dfdf7482df111b3ac9701dbd196d06668b49d3acaa67d766702db0942c03140e9e004942f7bdfd \ No newline at end of file diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index fdedc5425..0d1fe99bd 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1,55 +1,55 @@ - - - - - - 2.0 2.0 - 1 - 2 2 - -2.0 -2.0 - + + + + + + 2.0 2.0 + 1 + 2 2 + -2.0 -2.0 + 11 11 11 11 - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - eigenvalue - 1000 - 5 - 0 - - - -1 -1 -1 1 1 1 - - - true - 1000 + eigenvalue + 1000 + 5 + 0 + + + -1 -1 -1 1 1 1 + + + true + 1000 - - U235 O16 total - total fission (n,gamma) elastic (n,p) - + + U235 O16 total + total fission (n,gamma) elastic (n,p) + diff --git a/tests/test_multipole/results_true.dat b/tests/test_multipole/results_true.dat index c2111bff4..0ab4191d8 100644 --- a/tests/test_multipole/results_true.dat +++ b/tests/test_multipole/results_true.dat @@ -35,7 +35,7 @@ Cell ID = 11 Name = Fill = Material 2 - Region = -10000 + Region = -1 Rotation = None Temperature = [ 500. 0. 700. 800.] Translation = None diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 5f7da5c47..61958701b 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -1,37 +1,37 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - eigenvalue - 1000 - 4 - 0 - - - -5.0 -5.0 -5.0 5.0 5.0 5.0 - - + eigenvalue + 1000 + 4 + 0 + + + -5.0 -5.0 -5.0 5.0 5.0 5.0 + + diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index 745fd30c3..70fe165fd 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1,34 +1,34 @@ - - + + - - - - - - - + + + + + + + - eigenvalue - 1000 - 10 - 5 - - - -4 -4 -4 4 4 4 - - - - true - ares - 1.0 - 210.0 - U238 U235 Pu239 - + eigenvalue + 1000 + 10 + 5 + + + -4 -4 -4 4 4 4 + + + + true + ares + 1.0 + 210.0 + U238 U235 Pu239 + diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml deleted file mode 100644 index 2b978b914..000000000 --- a/tests/test_salphabeta/geometry.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/inputs_true.dat b/tests/test_salphabeta/inputs_true.dat new file mode 100644 index 000000000..02e6813f0 --- /dev/null +++ b/tests/test_salphabeta/inputs_true.dat @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eigenvalue + 1000 + 5 + 0 + + + -4 -4 -4 4 4 4 + + + diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml deleted file mode 100644 index bfe0a6224..000000000 --- a/tests/test_salphabeta/materials.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/results_true.dat b/tests/test_salphabeta/results_true.dat index bdfb98990..2a99303f6 100644 --- a/tests/test_salphabeta/results_true.dat +++ b/tests/test_salphabeta/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.544160E-01 1.274133E-02 +8.447580E-01 1.806149E-02 diff --git a/tests/test_salphabeta/settings.xml b/tests/test_salphabeta/settings.xml deleted file mode 100644 index 70b4e802f..000000000 --- a/tests/test_salphabeta/settings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - eigenvalue - 10 - 5 - 1000 - - - - -4 -4 -4 4 4 4 - - - - diff --git a/tests/test_salphabeta/test_salphabeta.py b/tests/test_salphabeta/test_salphabeta.py index b04fcc6eb..600c70332 100644 --- a/tests/test_salphabeta/test_salphabeta.py +++ b/tests/test_salphabeta/test_salphabeta.py @@ -3,9 +3,82 @@ import os import sys sys.path.insert(0, os.pardir) -from testing_harness import TestHarness + +from testing_harness import PyAPITestHarness +import openmc +import openmc.model + + +def make_model(): + model = openmc.model.Model() + + # Materials + m1 = openmc.Material() + m1.set_density('g/cc', 4.5) + m1.add_nuclide('U235', 1.0) + m1.add_nuclide('H1', 1.0) + m1.add_s_alpha_beta('c_H_in_H2O', fraction=0.5) + + m2 = openmc.Material() + m2.set_density('g/cc', 4.5) + m2.add_nuclide('U235', 1.0) + m2.add_nuclide('C0', 1.0) + m2.add_s_alpha_beta('c_Graphite') + + m3 = openmc.Material() + m3.set_density('g/cc', 4.5) + m3.add_nuclide('U235', 1.0) + m3.add_nuclide('Be9', 1.0) + m3.add_nuclide('O16', 1.0) + m3.add_s_alpha_beta('c_Be_in_BeO') + m3.add_s_alpha_beta('c_O_in_BeO') + + m4 = openmc.Material() + m4.set_density('g/cm3', 5.90168) + m4.add_nuclide('H1', 0.3) + m4.add_nuclide('Zr90', 0.15) + m4.add_nuclide('Zr91', 0.1) + m4.add_nuclide('Zr92', 0.1) + m4.add_nuclide('Zr94', 0.05) + m4.add_nuclide('Zr96', 0.05) + m4.add_nuclide('U235', 0.1) + m4.add_nuclide('U238', 0.15) + m4.add_s_alpha_beta('c_Zr_in_ZrH') + m4.add_s_alpha_beta('c_H_in_ZrH') + + model.materials += [m1, m2, m3, m4] + + # Geometry + x0 = openmc.XPlane(x0=-10, boundary_type='vacuum') + x1 = openmc.XPlane(x0=-5) + x2 = openmc.XPlane(x0=0) + x3 = openmc.XPlane(x0=5) + x4 = openmc.XPlane(x0=10, boundary_type='vacuum') + + root_univ = openmc.Universe() + + surfs = (x0, x1, x2, x3, x4) + mats = (m1, m2, m3, m4) + cells = [] + for i in range(4): + cell = openmc.Cell() + cell.region = +surfs[i] & -surfs[i+1] + cell.fill = mats[i] + root_univ.add_cell(cell) + + model.geometry.root_universe = root_univ + + # Settings + model.settings.batches = 5 + model.settings.inactive = 0 + model.settings.particles = 1000 + model.settings.source = openmc.Source(space=openmc.stats.Box( + [-4, -4, -4], [4, 4, 4])) + + return model if __name__ == '__main__': - harness = TestHarness('statepoint.10.h5') + model = make_model() + harness = PyAPITestHarness('statepoint.5.h5', model) harness.main() diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index bb80609af..da230e0e5 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -1,54 +1,54 @@ - - + + - - 294 - - - + + 294 + + + - eigenvalue - 1000 - 10 - 5 - - - - - -4.0 -1.0 3.0 0.2 0.3 0.5 - - - -2.0 0.0 2.0 0.2 0.3 0.2 - - - - - -1.0 0.0 1.0 0.5 0.25 0.25 - - - - - - - - -4.0 -4.0 -4.0 4.0 4.0 4.0 - - - - - - - 1.2 -2.3 0.781 - - - - 1.0 1.38949549437 1.93069772888 2.68269579528 3.72759372031 5.17947467923 7.19685673001 10.0 13.8949549437 19.3069772888 26.8269579528 37.2759372031 51.7947467923 71.9685673001 100.0 138.949549437 193.069772888 268.269579528 372.759372031 517.947467923 719.685673001 1000.0 1389.49549437 1930.69772888 2682.69579528 3727.59372031 5179.47467923 7196.85673001 10000.0 13894.9549437 19306.9772888 26826.9579528 37275.9372031 51794.7467923 71968.5673001 100000.0 138949.549437 193069.772888 268269.579528 372759.372031 517947.467923 719685.673001 1000000.0 1389495.49437 1930697.72888 2682695.79528 3727593.72031 5179474.67923 7196856.73001 10000000.0 0.0 2.90864392994e-08 5.80533561806e-08 8.67817193689e-08 1.15153477858e-07 1.43052046006e-07 1.70362782612e-07 1.96973462002e-07 2.22774735186e-07 2.47660579198e-07 2.71528732767e-07 2.9428111653e-07 3.15824236062e-07 3.36069566065e-07 3.54933914133e-07 3.72339762616e-07 3.88215587147e-07 4.02496150558e-07 4.15122770952e-07 4.26043562837e-07 4.35213650335e-07 4.42595351592e-07 4.48158333612e-07 4.5187973691e-07 4.53744269441e-07 4.53744269441e-07 4.5187973691e-07 4.48158333612e-07 4.42595351592e-07 4.35213650335e-07 4.26043562837e-07 4.15122770952e-07 4.02496150558e-07 3.88215587147e-07 3.72339762616e-07 3.54933914133e-07 3.36069566065e-07 3.15824236062e-07 2.9428111653e-07 2.71528732767e-07 2.47660579198e-07 2.22774735186e-07 1.96973462002e-07 1.70362782612e-07 1.43052046006e-07 1.15153477858e-07 8.67817193689e-08 5.80533561806e-08 2.90864392994e-08 5.55962111528e-23 - - + eigenvalue + 1000 + 10 + 5 + + + + + -4.0 -1.0 3.0 0.2 0.3 0.5 + + + -2.0 0.0 2.0 0.2 0.3 0.2 + + + + + -1.0 0.0 1.0 0.5 0.25 0.25 + + + + + + + + -4.0 -4.0 -4.0 4.0 4.0 4.0 + + + + + + + 1.2 -2.3 0.781 + + + + 1.0 1.38949549437 1.93069772888 2.68269579528 3.72759372031 5.17947467923 7.19685673001 10.0 13.8949549437 19.3069772888 26.8269579528 37.2759372031 51.7947467923 71.9685673001 100.0 138.949549437 193.069772888 268.269579528 372.759372031 517.947467923 719.685673001 1000.0 1389.49549437 1930.69772888 2682.69579528 3727.59372031 5179.47467923 7196.85673001 10000.0 13894.9549437 19306.9772888 26826.9579528 37275.9372031 51794.7467923 71968.5673001 100000.0 138949.549437 193069.772888 268269.579528 372759.372031 517947.467923 719685.673001 1000000.0 1389495.49437 1930697.72888 2682695.79528 3727593.72031 5179474.67923 7196856.73001 10000000.0 0.0 2.90864392994e-08 5.80533561806e-08 8.67817193689e-08 1.15153477858e-07 1.43052046006e-07 1.70362782612e-07 1.96973462002e-07 2.22774735186e-07 2.47660579198e-07 2.71528732767e-07 2.9428111653e-07 3.15824236062e-07 3.36069566065e-07 3.54933914133e-07 3.72339762616e-07 3.88215587147e-07 4.02496150558e-07 4.15122770952e-07 4.26043562837e-07 4.35213650335e-07 4.42595351592e-07 4.48158333612e-07 4.5187973691e-07 4.53744269441e-07 4.53744269441e-07 4.5187973691e-07 4.48158333612e-07 4.42595351592e-07 4.35213650335e-07 4.26043562837e-07 4.15122770952e-07 4.02496150558e-07 3.88215587147e-07 3.72339762616e-07 3.54933914133e-07 3.36069566065e-07 3.15824236062e-07 2.9428111653e-07 2.71528732767e-07 2.47660579198e-07 2.22774735186e-07 1.96973462002e-07 1.70362782612e-07 1.43052046006e-07 1.15153477858e-07 8.67817193689e-08 5.80533561806e-08 2.90864392994e-08 5.55962111528e-23 + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index ed24f4652..a85491e94 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,381 +127,381 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 400 - 5 - 0 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 400 + 5 + 0 + + + -160 -160 -183 160 160 183 + + - - 2 2 - -182.07 -182.07 - 182.07 182.07 - - - -3.14159 -1.885 -0.6283 0.6283 1.885 3.14159 - - - 1 - - - 10 21 22 23 - - - 1 2 3 4 5 6 - - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 1 2 3 4 - - - -1.0 -0.5 0.0 0.5 1.0 - - - 0.0 0.6283 1.2566 1.885 2.5132 3.14159 - - - 1 2 3 4 6 8 - - - 10 21 22 23 60 - - - 21 22 23 27 28 29 60 - - - 10000 - flux - tracklength - - - 10000 - flux - analog - - - 10000 10001 - flux - tracklength - - - 10002 - total - - - 10003 - delayed-nu-fission - - - 10004 - total - - - 10005 - scatter - - - 10004 10005 - scatter nu-fission - - - 10006 - total - - - 10007 - scatter nu-scatter - - - 10007 10001 - scatter nu-scatter - - - 10008 - flux - tracklength - - - 10008 - flux - analog - - - 10008 10001 - flux - tracklength - - - 10009 - total - - - 10010 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - tracklength - - - 10010 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - analog - - - 10010 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - collision - - - 10011 - flux - - - 10011 - flux-y5 - tracklength - - - 10011 - flux-y5 - analog - - - 10011 - flux-y5 - collision - - - 10010 - scatter scatter-1 scatter-2 scatter-3 scatter-4 nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - 10010 - scatter-p4 scatter-y4 nu-scatter-p4 nu-scatter-y3 - - - 10010 - total - - - 10010 - U235 total - total-y4 - tracklength - - - 10010 - U235 total - total-y4 - analog - - - 10010 - U235 total - total-y4 - collision - - - 10010 - all - total - tracklength - - - 10010 - all - total - collision - - - 10001 - all - total - tracklength - - - 10001 - U235 - total - tracklength - + + 2 2 + -182.07 -182.07 + 182.07 182.07 + + + -3.14159 -1.885 -0.6283 0.6283 1.885 3.14159 + + + 1 + + + 10 21 22 23 + + + 1 2 3 4 5 6 + + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 1 2 3 4 + + + -1.0 -0.5 0.0 0.5 1.0 + + + 0.0 0.6283 1.2566 1.885 2.5132 3.14159 + + + 1 2 3 4 6 8 + + + 10 21 22 23 60 + + + 21 22 23 27 28 29 60 + + + 1 + flux + tracklength + + + 1 + flux + analog + + + 1 2 + flux + tracklength + + + 3 + total + + + 4 + delayed-nu-fission + + + 5 + total + + + 6 + scatter + + + 5 6 + scatter nu-fission + + + 7 + total + + + 8 + scatter nu-scatter + + + 8 2 + scatter nu-scatter + + + 9 + flux + tracklength + + + 9 + flux + analog + + + 9 2 + flux + tracklength + + + 10 + total + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + tracklength + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + analog + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + collision + + + 12 + flux + + + 12 + flux-y5 + tracklength + + + 12 + flux-y5 + analog + + + 12 + flux-y5 + collision + + + 11 + scatter scatter-1 scatter-2 scatter-3 scatter-4 nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 + + + 11 + scatter-p4 scatter-y4 nu-scatter-p4 nu-scatter-y3 + + + 11 + total + + + 11 + U235 total + total-y4 + tracklength + + + 11 + U235 total + total-y4 + analog + + + 11 + U235 total + total-y4 + collision + + + 11 + all + total + tracklength + + + 11 + all + total + collision + + + 2 + all + total + tracklength + + + 2 + U235 + total + tracklength + diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index a70e0c916..e9c0865fd 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -709fa0289db8284c3a9e43bee6b1fff6df635778287819baf1841657bd68ee7fa8790d64e86c123bad96828c25ffbb30fc7261460baf53819bec090b4ae38bc1 \ No newline at end of file +13014f42dea87bf6c1fc0d41361cdba8a7e32a8f809d348567dfce638c849f58a0c0f17065c199946db81a264ef72db850aea93b0e11adf4f70ec969e30529cd \ No newline at end of file diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 15071c5e4..7a8bf4613 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,197 +127,197 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 60 - - - 10000 10001 - U234 U235 U238 - nu-fission total - + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 60 + + + 1 2 + U234 U235 U238 + nu-fission total + diff --git a/tests/test_tally_aggregation/results_true.dat b/tests/test_tally_aggregation/results_true.dat index 31d2faa7f..ee763b3ba 100644 --- a/tests/test_tally_aggregation/results_true.dat +++ b/tests/test_tally_aggregation/results_true.dat @@ -1 +1 @@ -a5a6f035b6106bd6d0312f0f339193f8745f9e3260c704d60d230fc1675a8e779b58a73a2c1f84e8f312d8a0e335d2d84341fe7df25e24024cc09a31058ebfe7 \ No newline at end of file +eb2002dd2f3016154e7014501629227eb2e5b2a9655b5c0cb3b9d4d681f918fae4197bf4756fe9865c8d34f392b981b287a15e9b2fab5a46b2a5b8a33a8ae770 \ No newline at end of file diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 197bc1c92..743ca3c58 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,213 +127,213 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 2 2 2 - -160.0 -160.0 -183.0 - 160.0 160.0 183.0 - - - 1 3 - - - 0.0 2.53e-07 0.001 1.0 20.0 - - - 60 - - - 1 - - - 10001 10000 10002 - U234 U235 - nu-fission total - - - 10000 10003 - U238 U235 - total fission - + + 2 2 2 + -160.0 -160.0 -183.0 + 160.0 160.0 183.0 + + + 1 3 + + + 0.0 2.53e-07 0.001 1.0 20.0 + + + 60 + + + 1 + + + 2 1 3 + U234 U235 + nu-fission total + + + 1 4 + U238 U235 + total fission + diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 3ae7d29dc..b1c089c96 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,222 +127,222 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - - 2 2 - -50.0 -50.0 - 50.0 50.0 - - - 21 27 - - - 0.0 0.625 20000000.0 - - - 21 - - - 10000 - - - 10015 10007 - U235 U238 - fission nu-fission - tracklength - - - 10005 10007 - U235 U238 - fission nu-fission - tracklength - - - 10006 10007 - U235 U238 - fission nu-fission - tracklength - + + + 2 2 + -50.0 -50.0 + 50.0 50.0 + + + 21 27 + + + 0.0 0.625 20000000.0 + + + 21 + + + 1 + + + 16 8 + U235 U238 + fission nu-fission + tracklength + + + 6 8 + U235 U238 + fission nu-fission + tracklength + + + 7 8 + U235 U238 + fission nu-fission + tracklength + diff --git a/tests/test_tally_slice_merge/results_true.dat b/tests/test_tally_slice_merge/results_true.dat index 2bb1c2ad9..4f1d6c6e2 100644 --- a/tests/test_tally_slice_merge/results_true.dat +++ b/tests/test_tally_slice_merge/results_true.dat @@ -1,36 +1,36 @@ cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 fission 2.36e-01 2.26e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 nu-fission 5.74e-01 5.51e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U238 fission 3.19e-07 3.06e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U238 nu-fission 7.96e-07 7.63e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U235 fission 2.82e-02 1.82e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U235 nu-fission 6.92e-02 4.42e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U238 fission 1.98e-02 1.74e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U238 nu-fission 5.54e-02 4.65e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U235 fission 1.11e-01 1.16e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U235 nu-fission 2.71e-01 2.83e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U238 fission 1.53e-07 1.67e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U238 nu-fission 3.81e-07 4.15e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U235 fission 2.00e-02 2.72e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U235 nu-fission 4.89e-02 6.62e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U238 fission 1.06e-02 6.18e-04 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U238 nu-fission 2.91e-02 1.85e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 fission 2.36e-01 2.26e-02 -1 21 0.00e+00 6.25e-01 U235 nu-fission 5.74e-01 5.51e-02 -2 21 0.00e+00 6.25e-01 U238 fission 3.19e-07 3.06e-08 -3 21 0.00e+00 6.25e-01 U238 nu-fission 7.96e-07 7.63e-08 -4 21 6.25e-01 2.00e+07 U235 fission 2.82e-02 1.82e-03 -5 21 6.25e-01 2.00e+07 U235 nu-fission 6.92e-02 4.42e-03 -6 21 6.25e-01 2.00e+07 U238 fission 1.98e-02 1.74e-03 -7 21 6.25e-01 2.00e+07 U238 nu-fission 5.54e-02 4.65e-03 -8 27 0.00e+00 6.25e-01 U235 fission 1.11e-01 1.16e-02 -9 27 0.00e+00 6.25e-01 U235 nu-fission 2.71e-01 2.83e-02 -10 27 0.00e+00 6.25e-01 U238 fission 1.53e-07 1.67e-08 -11 27 0.00e+00 6.25e-01 U238 nu-fission 3.81e-07 4.15e-08 -12 27 6.25e-01 2.00e+07 U235 fission 2.00e-02 2.72e-03 -13 27 6.25e-01 2.00e+07 U235 nu-fission 4.89e-02 6.62e-03 -14 27 6.25e-01 2.00e+07 U238 fission 1.06e-02 6.18e-04 -15 27 6.25e-01 2.00e+07 U238 nu-fission 2.91e-02 1.85e-03 +0 21 0.00e+00 6.25e-01 U235 fission 2.21e-01 9.47e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U235 nu-fission 5.38e-01 2.31e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U238 fission 3.05e-07 1.36e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U238 nu-fission 7.60e-07 3.39e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U235 fission 3.97e-02 4.54e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U235 nu-fission 9.72e-02 1.10e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U238 fission 1.89e-02 1.11e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U238 nu-fission 5.31e-02 3.32e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U235 fission 6.24e-02 1.10e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U235 nu-fission 1.52e-01 2.67e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U238 fission 8.80e-08 1.49e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U238 nu-fission 2.19e-07 3.72e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U235 fission 1.08e-02 1.46e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U235 nu-fission 2.65e-02 3.55e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U238 fission 5.88e-03 9.74e-04 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U238 nu-fission 1.61e-02 2.59e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U235 fission 2.21e-01 9.47e-03 +1 21 0.00e+00 6.25e-01 U235 nu-fission 5.38e-01 2.31e-02 +2 21 0.00e+00 6.25e-01 U238 fission 3.05e-07 1.36e-08 +3 21 0.00e+00 6.25e-01 U238 nu-fission 7.60e-07 3.39e-08 +4 21 6.25e-01 2.00e+07 U235 fission 3.97e-02 4.54e-03 +5 21 6.25e-01 2.00e+07 U235 nu-fission 9.72e-02 1.10e-02 +6 21 6.25e-01 2.00e+07 U238 fission 1.89e-02 1.11e-03 +7 21 6.25e-01 2.00e+07 U238 nu-fission 5.31e-02 3.32e-03 +8 27 0.00e+00 6.25e-01 U235 fission 6.24e-02 1.10e-02 +9 27 0.00e+00 6.25e-01 U235 nu-fission 1.52e-01 2.67e-02 +10 27 0.00e+00 6.25e-01 U238 fission 8.80e-08 1.49e-08 +11 27 0.00e+00 6.25e-01 U238 nu-fission 2.19e-07 3.72e-08 +12 27 6.25e-01 2.00e+07 U235 fission 1.08e-02 1.46e-03 +13 27 6.25e-01 2.00e+07 U235 nu-fission 2.65e-02 3.55e-03 +14 27 6.25e-01 2.00e+07 U238 fission 5.88e-03 9.74e-04 +15 27 6.25e-01 2.00e+07 U238 nu-fission 1.61e-02 2.59e-03 sum(distribcell) energy low [eV] energy high [eV] nuclide score mean std. dev. 0 (0, 100, 2000, 30000) 0.00e+00 6.25e-01 U235 fission 0.00e+00 0.00e+00 1 (0, 100, 2000, 30000) 0.00e+00 6.25e-01 U235 nu-fission 0.00e+00 0.00e+00 @@ -49,19 +49,19 @@ 14 (500, 5000, 50000) 6.25e-01 2.00e+07 U238 fission 0.00e+00 0.00e+00 15 (500, 5000, 50000) 6.25e-01 2.00e+07 U238 nu-fission 0.00e+00 0.00e+00 sum(mesh) energy low [eV] energy high [eV] nuclide score mean std. dev. -0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.12e-02 2.45e-03 -1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 2.74e-02 5.96e-03 -2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 fission 1.56e-08 3.04e-09 -3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 3.89e-08 7.57e-09 -4 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 fission 1.15e-03 4.71e-04 -5 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 2.81e-03 1.15e-03 -6 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 fission 3.25e-04 9.99e-05 -7 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 8.81e-04 2.68e-04 -8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.44e-02 5.57e-03 -9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 3.51e-02 1.36e-02 -10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 fission 1.95e-08 7.37e-09 -11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 4.86e-08 1.84e-08 -12 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 fission 2.55e-03 1.30e-03 -13 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 6.23e-03 3.16e-03 -14 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 fission 8.62e-04 4.53e-04 -15 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 2.30e-03 1.21e-03 +0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.48e-02 3.65e-03 +1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 3.60e-02 8.90e-03 +2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 fission 2.06e-08 4.98e-09 +3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 5.14e-08 1.24e-08 +4 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 fission 2.23e-03 3.92e-04 +5 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 5.45e-03 9.56e-04 +6 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 fission 5.58e-04 2.08e-04 +7 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 1.50e-03 5.43e-04 +8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 fission 2.56e-02 5.50e-03 +9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 6.24e-02 1.34e-02 +10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 fission 3.55e-08 7.70e-09 +11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 8.85e-08 1.92e-08 +12 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 fission 5.01e-03 1.38e-03 +13 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 1.22e-02 3.37e-03 +14 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 fission 2.40e-03 2.69e-04 +15 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 6.60e-03 7.63e-04 diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 35d2675cc..fdbc1cb5f 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1,442 +1,442 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.333333333333 0.333333333333 0.333333333333 - 10029 - 3 3 3 - -0.5 -0.5 -0.5 - -10008 10009 10010 -10005 10006 10007 -10002 10003 10004 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.333333333333 0.333333333333 0.333333333333 + 38 + 3 3 3 + -0.5 -0.5 -0.5 + +17 18 19 +14 15 16 +11 12 13 -10017 10018 10019 -10014 10015 10016 -10011 10012 10013 +26 27 28 +23 24 25 +20 21 22 -10026 10027 10028 -10023 10024 10025 -10020 10021 10022 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +35 36 37 +32 33 34 +29 30 31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 5 - 0 - - - 0.0 0.0 0.0 - - + eigenvalue + 100 + 5 + 0 + + + 0.0 0.0 0.0 + + diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 627d30a40..28f1cbd9f 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1,51 +1,51 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - volume - - cell - 1 2 3 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - - - material - 1 2 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - - - universe - 0 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - + volume + + cell + 1 2 3 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + + + material + 1 2 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + + + universe + 0 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + diff --git a/tests/travis.sh b/tests/travis.sh deleted file mode 100755 index 443e951cc..000000000 --- a/tests/travis.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -set -ev - -# Run all debug tests -./check_source.py -if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./run_tests.py -C "^hdf5-debug$|^omp-hdf5-debug|^mpi-hdf5-debug|^phdf5-debug$|^phdf5-omp-debug$" -j 2 -s -else - ./run_tests.py -C "^hdf5-debug$" -j 2 -fi diff --git a/tests/travis_install.sh b/tests/travis_install.sh deleted file mode 100755 index 2e35c4f65..000000000 --- a/tests/travis_install.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -set -ev - -# Build MPICH -if [[ ! -e $HOME/mpich_install/bin/mpiexec ]]; then - wget -q http://www.mpich.org/static/downloads/3.1.3/mpich-3.1.3.tar.gz - tar -xzvf mpich-3.1.3.tar.gz >/dev/null 2>&1 - cd mpich-3.1.3 - ./configure --prefix=$HOME/mpich_install -q - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 - cd .. -fi - -# Build PHDF5 -if [[ ! -e $HOME/phdf5_install/bin/h5pfc ]]; then - wget -q http://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.15/src/hdf5-1.8.15.tar.gz - tar -xzvf hdf5-1.8.15.tar.gz >/dev/null 2>&1 - mv hdf5-1.8.15 phdf5-1.8.15; cd phdf5-1.8.15 - CC=$HOME/mpich_install/bin/mpicc FC=$HOME/mpich_install/bin/mpif90 \ - ./configure \ - --prefix=$HOME/phdf5_install -q --enable-fortran \ - --enable-fortran2003 --enable-parallel - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 - cd .. -fi - -# Build HDF5 -if [[ ! -e $HOME/hdf5_install/bin/h5fc ]]; then - tar -xzvf hdf5-1.8.15.tar.gz >/dev/null 2>&1 - cd hdf5-1.8.15 - CC=gcc FC=gfortran ./configure --prefix=$HOME/hdf5_install -q \ - --enable-fortran --enable-fortran2003 - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 - cd .. -fi