1. Software Requirements Specification Document (SRSD)
1.1. Purpose
This Software Requirements Specification Document (SRSD) is prepared for the Advanced Reactor Modeling Interface (ARMI) framework. The purpose of thisdocument is to define the functional requirements, I/O requirements, relevant attributes, and applicable design constraints for ARMI.
This SRSD will be accompanied by a Software Design and Implementation Document (SDID), that describes how the requirements are implemented within the software and a Software Test Report (STR), that documents the test plan and reporting of test results.
1.2. Introduction
The Advanced Reactor Modeling Interface (ARMI®) is an open-source framework for nuclear reactor design and analysis. Based on Python, ARMI provides a richly-featured toolset for connecting disparate nuclear reactor modeling tools. ARMI is not meant to directly implement the science or engineering aspects of nuclear reactor modeling, but to help the wealth of existing models work together. It does this by providing easy-to-use tools for coordinating reactor simulation and analysis workflows. A large part of the power of ARMI is that it provides a flexible in-memory data model of a reactor, which is used to pass information between different external tools.
ARMI:
Provides a hub-and-spoke mechanism to standardize communication and coupling between physics kernels and the specialist analysts who use them,
Facilitates the creation and execution of detailed models and complex analysis methodologies,
Provides an ecosystem within which to rapidly and collaboratively build new analysis and physics simulation capabilities, and
Provides useful utilities to assist in reactor development.
Because the ARMI software is just a framework for other, much larger nuclear models, ARMI does not contain any proprietary or classified information. This allows ARMI to be open-source software. It also greatly simplifies the software design and maintenance. For instance, ARMI does not have any performance requirements. ARMI has been used to model nuclear reactors for over a decade, and in that time the practical reality is that ARMI is quite light weight and >99% of the run time of a simulation occurs in running other nuclear models.
Here are some quick metrics for ARMI’s requirements:
140 Requirements in ARMI
0 Preliminary Requirements
140 Accepted Requirements
138 Requirements with implementations
133 Requirements with tests
254 tests linked to Requirements
190 implementations linked to Requirements
1.4. Bookkeeping Package
This section provides requirements for the armi.bookkeeping
package within the framework, which
handles data persistence, including storage and recovery, report generation, data visualization,
and debugging.
1.4.1. Functional Requirements
Requirement: The database package shall save a copy of the user settings associated with the run. R_ARMI_DB_CS
|
Requirement: The database package shall save a copy of the reactor blueprints associated with the run. R_ARMI_DB_BP
|
Requirement: The database shall store reactor state data at specified points in time. R_ARMI_DB_TIME
|
Requirement: ARMI shall allow runs at a particular time node to be re-instantiated from a snapshot. R_ARMI_SNAPSHOT_RESTART
|
Requirement: ARMI shall allow for previously calculated reactor state data to be retrieved within a run. R_ARMI_HIST_TRACK
|
1.4.2. Software Attributes
1.4.3. I/O Requirements
Requirement: ARMI shall allow extra data to be saved from a run, at specified time nodes. R_ARMI_SNAPSHOT
|
1.5. Cases Package
This section provides requirements for the armi.cases
package within the framework, which
is responsible for running and analyzing ARMI-based cases and case suites for an application. This
includes functionalities to serialize and deserialize case inputs for input modification, tracking
the status of a case, and running simulations.
1.5.1. Functional Requirements
Requirement: The case package shall provide a generic mechanism that will allow a user to run a simulation. R_ARMI_CASE
|
Requirement: The case package shall provide a tool to run multiple cases at the same time or with dependence on other cases. R_ARMI_CASE_SUITE
|
Requirement: The case package shall provide a generic mechanism to allow users to modify user inputs in a collection of cases. R_ARMI_CASE_MOD
|
1.5.2. I/O Requirements
Requirement: The case package shall have the ability to load user inputs and perform input validation checks. R_ARMI_CASE_CHECK
|
1.6. Command Line Interface Package
This section provides requirements for the armi.cli
package. This package is
responsible for providing user entry points to an ARMI-based application as a Command Line Interface (CLI). This package allows for developers to create their own automated work flows including: case submission, user setting validation, data migrations, and more.
1.6.1. Functional Requirements
Requirement: The cli package shall provide a generic CLI for developers to build their own CLI. R_ARMI_CLI_GEN
|
1.6.2. I/O Requirements
Requirement: The cli package shall provide a basic CLI which allows users to start an ARMI simulation. R_ARMI_CLI_CS
|
1.7. Materials Package
This section provides requirements for the armi.materials
package within the framework, which contains ARMI’s system for defining materials. The materials system in ARMI allows for an extreme amount of flexibility in defining materials with temperature-dependent properties like density, linear expansion factor, and the like.
ARMI also comes packaged with a small set of basic materials, though these are meant only as example materials and (because ARMI is open source) these materials can not include proprietary or classified information. As such, we explicitly forbid the use of the example ARMI materials in safety-related modeling and will not be writing requirements on those materials.
1.7.1. Functional Requirements
Requirement: The materials package shall allow for material classes to be searched across packages in a defined namespace. R_ARMI_MAT_NAMESPACE
|
Requirement: The materials package shall allow for multiple material collections to be defined with an order of precedence in the case of duplicates. R_ARMI_MAT_ORDER
|
Requirement: The materials package shall provide the capability to retrieve material properties at different temperatures. R_ARMI_MAT_PROPERTIES
|
Requirement: The materials package shall allow for user-input to impact the materials in a component. R_ARMI_MAT_USER_INPUT
|
Requirement: The materials package shall provide a class for fluids that defines the thermal expansion coefficient as identically zero. R_ARMI_MAT_FLUID
|
1.8. Nuclide Directory Package
This section provides requirements for the armi.nucDirectory
package within the framework, which
is responsible for defining elemental and isotopic information that is used for reactor physics evaluations.
1.8.1. Functional Requirements
Requirement: The nucDirectory package shall provide an interface for querying basic data for elements of the periodic table. R_ARMI_ND_ELEMENTS
|
Requirement: The nucDirectory package shall provide an interface for querying basic data for important isotopes and isomers. R_ARMI_ND_ISOTOPES
|
1.9. Nuclear Data I/O Package
This section provides requirements for the armi.nuclearDataIO
package within the framework, which
handles reading and writing of standard interface files for reactor physics software (e.g., cross section data).
1.9.1. Functional Requirements
Requirement: The nuclearDataIO package shall be capable of reading and writing ISOTXS files into and out of mutable data structures. R_ARMI_NUCDATA_ISOTXS
|
Requirement: The nuclearDataIO package shall be capable of reading and writing GAMISO files into and out of mutable data structures. R_ARMI_NUCDATA_GAMISO
|
Requirement: The nuclearDataIO package shall be capable of reading and writing GEODST files into and out of mutable data structures. R_ARMI_NUCDATA_GEODST
|
Requirement: The nuclearDataIO package shall be capable of reading and writing DIF3D files into and out of mutable data structures. R_ARMI_NUCDATA_DIF3D
|
Requirement: The nuclearDataIO package shall be capable of reading and writing PMATRX files into and out of mutable data structures. R_ARMI_NUCDATA_PMATRX
|
Requirement: The nuclearDataIO package shall be capable of reading and writing DLAYXS files into and out of mutable data structures. R_ARMI_NUCDATA_DLAYXS
|
Requirement: The nuclearDataIO package shall be able to compute macroscopic cross sections from microscopic cross sections and number densities. R_ARMI_NUCDATA_MACRO
|
1.10. Physics Package
This section provides requirements for the armi.physics
package within the framework, which contains interfaces for important physics modeling and analysis in nuclear reactors. It is important to note that ARMI is a framework, and as such does not generally include the actual science or engineering calculations for these topics. For instance, ARMI has an interface for “safety analysis”, but this interface is just a place for developers to implement their own safety analysis code. It would be inappropriate to include the actual science or engineering calculations for a detailed safety analysis of a particular reactor in ARMI because ARMI is meant only to house the code to let nuclear modeling and analysis work, not the analysis itself.
1.10.1. Functional Requirements
Requirement: ARMI shall ensure that the computed block-wise power is consistent with the power specified in the reactor data model. R_ARMI_FLUX_CHECK_POWER
|
Requirement: ARMI shall provide an interface for querying options relevant to neutronics solvers. R_ARMI_FLUX_OPTIONS
|
Requirement: ARMI shall allow modification of the reactor geometry when needed for neutronics solver execution. R_ARMI_FLUX_GEOM_TRANSFORM
|
Requirement: ARMI shall be able to calculate DPA and DPA rates from a multigroup neutron flux and DPA cross sections. R_ARMI_FLUX_DPA
|
Requirement: The isotopicDepletion package shall have the ability to generate cross-section tables from a CCCC-based library in a user-specified format. R_ARMI_DEPL_TABLES
|
Requirement: The isotopicDepletion package shall provide a base class to track depletable composites. R_ARMI_DEPL_ABC
|
Requirement: The neutronics package shall provide the neutron energy group bounds for a given group structure. R_ARMI_EG_NE
|
Requirement: The neutronics package shall return the energy group index which contains the fast energy threshold. R_ARMI_EG_FE
|
Requirement: The neutronics package shall be able to build macroscopic cross sections for all blocks. R_ARMI_MACRO_XS
|
Requirement: The executers module shall provide the ability to run external calculations on an ARMI reactor with configurable options. R_ARMI_EX
|
Requirement: The fuel cycle package shall allow for user-defined assembly shuffling logic to update the reactor model based on reactor state. R_ARMI_SHUFFLE
|
Requirement: The fuel cycle package shall be capable of leaving user-specified blocks in place during shuffling operations. R_ARMI_SHUFFLE_STATIONARY
|
Requirement: A hexagonal assembly shall support rotating around the z-axis in 60 degree increments. R_ARMI_ROTATE_HEX
|
Requirement: The framework shall provide an algorithm for rotating hexagonal assemblies to equalize burnup. R_ARMI_ROTATE_HEX_BURNUP
|
Requirement: The cross-section group manager package shall run before cross sections are calculated. R_ARMI_XSGM_FREQ
|
Requirement: The cross-section group manager package shall create separate collections of blocks for each combination of user-specified XS type and burnup group. R_ARMI_XSGM_CREATE_XS_GROUPS
|
Requirement: The cross-section group manager package shall provide routines to create representative blocks for each collection based on user-specified XS type and burnup group. R_ARMI_XSGM_CREATE_REPR_BLOCKS
|
1.11. Reactors Package
This section provides requirements for the armi.reactors
package within the framework, unsurprisingly this is the largest package in ARMI. In this package are sub-packages for fully defining a nuclear reactor, starting from blueprints and all the way through defining the full reactor data model. It is this reactor data object that is critical to the framwork; this is how different reactor modeling tools share information.
1.11.1. Functional Requirements
Requirement: The reactor data model shall contain one core and a collection of ex-core objects, all composites. R_ARMI_R
|
Requirement: Assemblies shall be retrievable from the core object by name and location. R_ARMI_R_GET_ASSEM
|
Requirement: The core shall be able to provide assemblies that are neighbors of a given assembly. R_ARMI_R_FIND_NEIGHBORS
|
Requirement: The parameters package shall provide the capability to define parameters that store values of interest on any Composite. R_ARMI_PARAM
|
Requirement: The parameters package shall allow for some parameters to be defined such that they are not written to the database. R_ARMI_PARAM_DB
|
Requirement: The parameters package shall provide a way to signal if a parameter needs updating across multiple processes. R_ARMI_PARAM_PARALLEL
|
Requirement: The parameters package shall allow for a parameter to be serialized for reading and writing to database files. R_ARMI_PARAM_SERIALIZE
|
Requirement: The zones module shall allow for a collection of reactor core locations (a Zone). R_ARMI_ZONE
|
Requirement: The blocks module shall be able to homogenize the components of a hexagonal block. R_ARMI_BLOCK_HOMOG
|
Requirement: The blocks module shall return the number of pins in a block, when applicable. R_ARMI_BLOCK_NPINS
|
Requirement: The assemblies module shall define an assembly as a composite type that contains a collection of blocks. R_ARMI_ASSEM_BLOCKS
|
Requirement: The flags module shall provide unique identifiers (flags) to enable disambiguating composites. R_ARMI_FLAG_DEFINE
|
Requirement: The set of unique flags in a run shall be extensible without user knowledge of existing flags' values. R_ARMI_FLAG_EXTEND
|
Requirement: ARMI shall be able to convert a hexagonal one-third-core geometry to a full-core geometry, and back again. R_ARMI_THIRD_TO_FULL_CORE
|
Requirement: ARMI shall be able to add and remove assemblies along the 120 degree line in a 1/3 core reactor. R_ARMI_ADD_EDGE_ASSEMS
|
Requirement: ARMI shall be able to convert a hex core to a representative RZ core. R_ARMI_CONV_3DHEX_TO_2DRZ
|
Requirement: The axial expansion changer shall perform axial thermal expansion and contraction on solid components within a compatible ARMI assembly according to a given axial temperature distribution. R_ARMI_AXIAL_EXP_THERM
|
Requirement: The axial expansion changer shall perform axial expansion/contraction given a list of components and corresponding expansion coefficients. R_ARMI_AXIAL_EXP_PRESC
|
Requirement: The axial expansion changer shall perform expansion during core construction based on block heights at a user-specified temperature. R_ARMI_INP_COLD_HEIGHT
|
Requirement: The axial expansion changer shall allow user-specified target axial expansion components on a given block. R_ARMI_MANUAL_TARG_COMP
|
Requirement: The axial expansion changer shall preserve the total height of a compatible ARMI assembly. R_ARMI_ASSEM_HEIGHT_PRES
|
Requirement: The uniform mesh converter shall make a copy of the reactor where the new reactor core has a uniform axial mesh. R_ARMI_UMC
|
Requirement: The uniform mesh converter shall map select parameters from composites on the original mesh to composites on the new mesh. R_ARMI_UMC_PARAM_FORWARD
|
Requirement: The uniform mesh converter shall map select parameters from composites on the new mesh to composites on the original mesh. R_ARMI_UMC_PARAM_BACKWARD
|
Requirement: The uniform mesh converter shall try to preserve the boundaries of fuel and control material. R_ARMI_UMC_NON_UNIFORM
|
Requirement: The uniform mesh converter shall produce a uniform axial mesh with a size no smaller than a user-specified value. R_ARMI_UMC_MIN_MESH
|
Requirement: The block converter module shall be able to convert one or more given hexagonal blocks into a single user-configurable representative cylindrical block. R_ARMI_BLOCKCONV_HEX_TO_CYL
|
Requirement: The block converter module shall be able to homogenize one component into another on a block. R_ARMI_BLOCKCONV
|
Requirement: The components package shall define a composite corresponding to a physical piece of a reactor. R_ARMI_COMP_DEF
|
Requirement: Components shall be able to compute dimensions, areas, and volumes that reflect its current state. R_ARMI_COMP_VOL
|
Requirement: Components shall allow for constituent nuclide fractions to be modified. R_ARMI_COMP_NUCLIDE_FRACS
|
Requirement: Components shall be made of one-and-only-one material or homogenized material. R_ARMI_COMP_1MAT
|
Requirement: Components shall enable an ordering based on their outermost component dimensions. R_ARMI_COMP_ORDER
|
Requirement: The components package shall define components with several basic interrogable shapes. R_ARMI_COMP_SHAPES
|
Requirement: The components package shall handle radial thermal expansion of individual components. R_ARMI_COMP_EXPANSION
|
Requirement: The components package shall allow the dimensions of fluid components to change based on the solid components adjacent to them. R_ARMI_COMP_FLUID
|
Requirement: The composites module shall define an arbitrary physical piece of a reactor with retrievable children in a hierarchical data model. R_ARMI_CMP
|
Requirement: The total mass of specified nuclides in a composite shall be retrievable. R_ARMI_CMP_GET_MASS
|
Requirement: The homogenized number densities of specified nuclides in a composite shall be retrievable. R_ARMI_CMP_GET_NDENS
|
Requirement: Composites shall be able to return number densities for all their nuclides. R_ARMI_CMP_NUC
|
Requirement: The grids package shall allow for pieces of the reactor to be organized into regular-pitch hexagonal lattices (grids). R_ARMI_GRID_HEX
|
Requirement: The grids package shall be able to represent 1/3-symmetry or full hexagonal grids. R_ARMI_GRID_SYMMETRY
|
Requirement: A hexagonal grid with 1/3 symmetry shall be able to determine if a constituent object is in the first third. R_ARMI_GRID_SYMMETRY_LOC
|
Requirement: A hexagonal grid with 1/3 symmetry shall be capable of retrieving equivalent contents based on 1/3 symmetry. R_ARMI_GRID_EQUIVALENTS
|
Requirement: The grids package shall be able to store components with multiplicity greater than 1. R_ARMI_GRID_MULT
|
Requirement: The grids package shall be able to return the coordinate location of any grid element in a global coordinate system. R_ARMI_GRID_GLOBAL_POS
|
Requirement: The grids package shall be able to return the location of all instances of grid components with multiplicity greater than 1. R_ARMI_GRID_ELEM_LOC
|
1.11.2. I/O Requirements
Requirement: The blueprints package shall allow the user to define a component using a custom text file. R_ARMI_BP_COMP
|
Requirement: The blueprints package shall allow the user to define a block using a custom text file. R_ARMI_BP_BLOCK
|
Requirement: The blueprints package shall allow the user to define an assembly using a custom text file. R_ARMI_BP_ASSEM
|
Requirement: The blueprints package shall allow the user to define a core using a custom text file. R_ARMI_BP_CORE
|
Requirement: The blueprints package shall allow the user to define a lattice map in a reactor core using a custom text file. R_ARMI_BP_GRID
|
Requirement: The blueprints package shall allow the user to define a reactor, including both a core and a spent fuel pool using a custom text file. R_ARMI_BP_SYSTEMS
|
Requirement: The blueprints package shall allow the user to define isotopes which should be depleted. R_ARMI_BP_NUC_FLAGS
|
Requirement: The blueprints package shall allow the user to produce a valid blueprints file from an in-memory blueprint object. R_ARMI_BP_TO_DB
|
1.12. RunLog Module
This section provides requirements for the simulation logging module, armi.runLog
, which manages
the reporting of messages to the user.
1.12.1. Functional Requirements
Requirement: The runLog module shall allow for a simulation-wide log with user-specified verbosity. R_ARMI_LOG
|
1.12.2. I/O Requirements
Requirement: The runLog module shall allow log files to be combined from different processes. R_ARMI_LOG_MPI
|
1.13. Settings Package
This section provides requirements for the armi.settings
package, which is responsible for providing a centralized means for users to configure an application. This package can serialize and deserialize user settings from a human-readable text file. When a simulation is being initialized, settings validation is performed to enforce things like type consistency, and to find incompatible settings. To make settings easier to understand and use, once a simulation has been initialized, settings become immutable.
1.13.1. Functional Requirements
Requirement: The settings package shall allow the configuration of a simulation through user settings. R_ARMI_SETTING
|
Requirement: Settings shall support rules to validate and customize each setting's behavior. R_ARMI_SETTINGS_RULES
|
Requirement: The settings package shall supply the total reactor power at each time step of a simulation. R_ARMI_SETTINGS_POWER
|
Requirement: The settings package shall allow users to define basic metadata for the run. R_ARMI_SETTINGS_META
|
1.13.2. I/O Requirements
Requirement: The settings package shall use human-readable, plain-text files as input and output. R_ARMI_SETTINGS_IO_TXT
|
1.14. Utilities Package
This section provides requirements for the armi.utils
package within the framework, which is one of the smaller high-level packages in ARMI. This package contains a small set of basic utilities which are meant to be generally useful in ARMI and in the wider ARMI ecosystem. While most of the code in this section does not rise to the level of a “requirement”, some does.
1.14.1. Functional Requirements
Requirement: ARMI shall provide a utility to convert mass densities and fractions to number densities. R_ARMI_UTIL_MASS2N_DENS
|
Requirement: ARMI shall provide a utility to expand elemental mass fractions to natural nuclides. R_ARMI_UTIL_EXP_MASS_FRACS
|
Requirement: ARMI shall provide a utility to format nuclides and densities into an MCNP material card. R_ARMI_UTIL_MCNP_MAT_CARD
|
1.15. Software Attributes
ARMI is a Python-based framework, designed to help tie together various nuclear models, written in a variety of languages. ARMI officially supports Python versions 3.9 and up.
ARMI is heavily tested and used in both Windows and Linux. More specifically, ARMI is always designed to work in the most modern Windows operating system (Windows 10 and Windows 11 currently). Similarly, ARMI is designed to work with fairly modern versions of Ubuntu (22.04 and 24.04 at the time of writing) and Red Hat (RHEL 7 and 8 currently).
Version control for ARMI is achieved using Git and is publicly hosted as open-source software on GitHub. To ensure ARMI remains portable and open-source, it only uses third-party libraries that are similarly fully open-source and that make no onerous demands on ARMI’s distribution or legal status.
ARMI makes use of a huge suite of unit tests to cover the codebase. The tests are run via Continuous Integration (CI) both internally and publicly. Every unit test must pass on every commit to the ARMI main branch. Also, as part of our rigorous quality system, ARMI enforces tight controls on code style using Black as our code formatter and Ruff as our linter.