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 openmc.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 theopenmc.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 correspondingopenmc_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 theopenmc.RectilinearMesh
andopenmc.UnstructuredMesh
classes. (#2861) - Added a
openmc_mesh_get_volumes
C API function. (#2869) - The
openmc.Settings.surf_source_write
dictionary now acceptscell
,cellfrom
, orcellto
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 aignore_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 theopenmc.MeshSource
class. (#2949) - Added a
openmc.MeshBase.get_homogenized_materials
method that computes homogenized materials over mesh elements. (#2971) - Add an
options
argument toopenmc.UnstructuredMesh
that allows configuring underlying data structures in MOAB. (#2976) - Type hints were added to several classes in the :mod:
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
- @aidancrilly
- @aprilnovak
- @arekfu
- @bam241
- @chrwagne
- @church89
- @cxtherineyu
- @ebknudsen
- @eepeterson
- @gridley
- @hsameer481
- @HunterBelanger
- @icmeyer
- @jbae11
- @JoffreyDorville
- @jtramm
- @kingyue737
- @Kladdy
- @kmeag
- @lhchg
- @LukeLabrie
- @MicahGale
- @nplinden
- @pitkajuh
- @rlbarker
- @paulromano
- @pshriwise
- @shimwell
- @tjlaboss
- @vanessalulla
- @yardasol
- @yrrepy