What’s New in 0.15.0

Summary

This release of OpenMC includes many bug fixes, performance improvements, and several notable new features. The major highlight of this release is the introduction of a new transport solver based on the random ray method, which is fully described in the user’s guide. Other notable additions include a mesh-based source class (openmc.MeshSource), a generalization of source domain rejection through the notion of “constraints”, and new methods on mesh-based classes for computing material volume fractions and homogenized materials.

Compatibility Notes and Deprecations

Previously, specifying domain rejection for a source was only possible on the IndependentSoure class and worked by specifying a domains argument. This capability has been generalized to all source classes and expanded as well; specifying a domain to reject on should now be done with the constraints argument as follows:

source = openmc.IndependentSource(..., constraints={'domains': [cell]})

The domains argument is deprecated and will be removed in a future version of OpenMC. Similarly, the only_fissionable argument to openmc.stats.Box has been replaced by a ‘fissionable’ constraint. That is, instead of specifying:

space = openmc.stats.Box(lower_left, upper_right, only_fissionable=True)
source = openmc.IndependentSource(space=space)

You should now provide the constraint as:

space = openmc.stats.Box(lower_left, upper_right)
source = openmc.IndependentSource(space=space, constraints={'fissionable': True})

The openmc.Settings.max_splits attribute was renamed to max_history_splits and its default value has been changed to 1e7 (#2954).

New Features

  • When running OpenMC in volume calculation mode, only atomic weight ratio data is loaded from data files which reduces initialization time. (#2741)

  • Introduced a GeometryState class in C++ to better separate particle and geometry data. (#2744))

  • A new openmc.MaterialFromFilter class allows filtering tallies by which material a particle came from. (#2750)

  • Implemented a openmc.deplete.MicroXS.from_multigroup_flux() method that generates microscopic cross sections for depletion from a predetermined multigroup flux. (#2755)

  • A new openmc.MeshSource class enables the specification of a source distribution over a mesh, where each mesh element has a different energy/angle/time distribution. (#2759)

  • Improve performance of depletion solver by utilizing CSR sparse matrix representation. (#2764, #2771)

  • Added a openmc.CylindricalMesh.get_indices_at_coords() method that provides the mesh element index corresponding to a given point in space. (#2782)

  • Added a path argument to the openmc.deplete.Integrator.integrate() method. (#2784)

  • Added a openmc.Geometry.get_all_nuclides() method. (#2796)

  • A new capability to compute material volume fractions over mesh elements was added in the openmc.lib.Mesh.material_volumes() method. (#2802)

  • A new transport solver was added based on the random ray method. (#2823, #2988)

  • Added a openmc.lib.Material.depletable attribute. (#2843)

  • Added a openmc.lib.Mesh.get_plot_bins() method and corresponding openmc_mesh_get_plot_bins C API function that can be utilized to generate mesh tally visualizations in the plotter application. (#2854)

  • Introduced a openmc.read_source_file() function that enables reading a source file from the Python API. (#2858)

  • Added a bounding_box property on the openmc.RectilinearMesh and openmc.UnstructuredMesh classes. (#2861)

  • Added a openmc_mesh_get_volumes C API function. (#2869)

  • The openmc.Settings.surf_source_write dictionary now accepts cell, cellfrom, or cellto keys that limit surface source sites to those entering or leaving specific cells. (#2888)

  • Added a openmc.Region.plot() method that allows regions to be plotted directly. (#2895)

  • Implemented “contains” operator for the openmc.BoundingBox class. (#2906)

  • Generalized source rejection via a new constraints argument to all source classes. (#2916)

  • Added a new openmc.MeshBornFilter class that filters tally events based on which mesh element a particle was born in. (#2925)

  • The openmc.Trigger class now has a ignore_zeros argument that results in any bins with zero score to be ignored when checking the trigger. (#2928)

  • Introduced a openmc.Settings.max_events attribute that controls the maximum number of events a particle can undergo. (#2945)

  • Added support for openmc.UnstructuredMesh in the openmc.MeshSource class. (#2949)

  • Added a openmc.MeshBase.get_homogenized_materials() method that computes homogenized materials over mesh elements. (#2971)

  • Add an options argument to openmc.UnstructuredMesh that allows configuring underlying data structures in MOAB. (#2976)

  • Type hints were added to several classes in the openmc.deplete module. (#2866)

Bug Fixes

  • Fix unit conversion in openmc.deplete.Results.get_mass (#2761)

  • Fix Lagrangian interpolation (#2775)

  • Depletion restart with MPI (#2778)

  • Modify depletion transfer rates test to be more robust (#2779)

  • Call simulation_finalize if needed when finalizing OpenMC (#2790)

  • F90_NONE Removal (MGMC tallying optimization) (#2785)

  • Correctly apply volumes to materials when using DAGMC geometries (#2787)

  • Add inline to openmc::interpolate (#2789)

  • Use huge_tree=True in lxml parsing (#2791)

  • OpenMPMutex “Copying” (#2794)

  • Do not link against several transitive dependencies of HDF5 (#2797)

  • Added check to length of input arguments for IndependantOperator (#2799)

  • Pytest Update Documentation (#2801)

  • Move ‘import lxml’ to third-party block of imports (#2803)

  • Fix creation of meshes when from loading settings from XML (#2805)

  • Avoid high memory use when writing unstructured mesh VTK files (#2806)

  • Consolidating thread information into the openmp interface header (#2809)

  • Prevent underflow in calculation of speed (#2811)

  • Provide error message if a cell path can’t be determined (#2812)

  • Fix distribcell labels for lattices used as fill in multiple cells (#2813)

  • Make creation of spatial trees based on usage for unstructured mesh. (#2815)

  • Ensure particle direction is normalized for plotting / volume calculations (#2816)

  • Added missing meshes to documentation (#2820)

  • Reset timers at correct place in deplete (#2821)

  • Fix config change not propagating through to decay energies (#2825)

  • Ensure that implicit complement cells appear last in DAGMC universes (#2838)

  • Export model.tallies to XML in CoupledOperator (#2840)

  • Fix locating h5m files references in DAGMC universes (#2842)

  • Prepare for NumPy 2.0 (#2845)

  • Added missing functions and classes to openmc.lib docs (#2847)

  • Fix compilation on CentOS 7 (missing link to libdl) (#2849)

  • Adding resulting nuclide to cross section plot legend (#2851)

  • Updating file extension for Excel files when exporting MGXS data (#2852)

  • Removed error raising when calling warn (#2853)

  • Setting surf_source_ attribute for DAGMC surfaces. (#2857)

  • Changing y axis label for heating plots (#2859)

  • Removed unused step_index arg from restart (#2867)

  • Fix issue with Cell::get_contained_cells() utility function (#2873)

  • Adding energy axis units to plot xs (#2876)

  • Set OpenMCOperator materials when diff_burnable_mats = True (#2877)

  • Fix expansion filter merging (#2882)

  • Added checks that tolerance value is between 0 and 1 (#2884)

  • Statepoint file loading refactor and CAPI function (#2886)

  • Added check for length of value passed into EnergyFilter (#2887)

  • Ensure that Model.run() works when specifying a custom XML path (#2889)

  • Updating docker file base to bookworm (#2890)

  • Clarifying documentation for cones (#2892)

  • Abort on cmake config if openmp requested but not found (#2893)

  • Tiny updates from experience building on Mac (#2894)

  • Added damage-energy as optional reaction for micro (#2903)

  • docs: add missing max_splits in settings specification (#2910)

  • Changed CI to use latest actions to get away from the Node 16 deprecation. (#2912)

  • Mkdir to always allow parents and exist ok (#2914)

  • Fixed small sphinx typo (#2915)

  • Hexagonal lattice iterators (#2921)

  • Fix Chain.form_matrix to work with scipy 1.12 (#2922)

  • Allow get_microxs_and_flux to use OPENMC_CHAIN_FILE environment variable (#2934)

  • Polygon fix to better handle colinear points (#2935)

  • Fix CMFD to work with scipy 1.13 (#2936)

  • Print warning if no natural isotopes when using add_element (#2938)

  • Update xtl and xtensor submodules (#2941)

  • Ensure two surfaces with different boundary type are not considered redundant (#2942)

  • Updated package versions in Dockerfile (#2946)

  • Add MPI calls to DAGMC external test (#2948)

  • Eliminate deprecation warnings from scipy and pandas (#2951)

  • Update math function unit test with catch2 (#2955)

  • Support track file writing for particle restart runs. (#2957)

  • Make UWUW optional (#2965)

  • Allow pure decay IndependentOperator (#2966)

  • Added fix to cfloat_endf for length 11 endf floats (#2967)

  • Moved apt get to optional CI parts (#2970)

  • Update bounding_box docstrings (#2972)

  • Added extra error checking on spherical mesh creation (#2973)

  • Update CODEOWNERS file (#2974)

  • Added error checking on cylindrical mesh (#2977)

  • Correction for histogram interpolation of Tabular distributions (#2981)

  • Enforce lower_left in lattice geometry (#2982)

  • Update random_dist.h comment to be less specific (#2991)

  • Apply memoization in get_all_universes (#2995)

  • Make sure skewed dataset is cast to bool properly (#3001)

  • Hexagonal lattice roundtrip (#3003)

  • Fix CylinderSector and IsogonalOctagon translations (#3018)

  • Sets used instead of lists when membership testing (#3021)

  • Fixing plot xs for when plotting element string reaction (#3029)

  • Fix shannon entropy broken link (#3034)

  • Only add png or h5 extension if not present in plots.py (#3036)

  • Fix non-existent path causing segmentation fault when saving plot (#3038)

  • Resolve warnings related to numpy 2.0 (#3044)

  • Update IsogonalOctagon to use xz basis (#3045)

  • Determine whether nuclides are fissionable in volume calc mode (#3047)

  • Avoiding more numpy 2.0 deprecation warnings (#3049)

  • Set DAGMC cell instances on surface crossing (#3052)

Contributors