Cardinal System Design Description
This template follows INL template TEM-140, "IT System Design Description."
This document serves as an addendum to Framework System Design Description and captures information for Software Design Description (SDD) specific to the Cardinal application.
- Framework System Design Description
- Fluid Properties System Design Description
- Heat Transfer System Design Description
- Navier Stokes System Design Description
- Reactor System Design Description
- Ray Tracing System Design Description
- Solid Mechanics System Design Description
- Solid Properties System Design Description
- Stochastic Tools System Design Description
- Thermal Hydraulics System Design Description
Introduction
Many of the phenomena related to nuclear energy systems depend on the solutions to multiple physics models, which can be described by partial differential equations that provide spatially- and temporally-varying values of solution variables. When these models for individual physics depend on one another, we call this "multiphysics." Cardinal relies on the OpenMC Monte Carlo radiation transport code and the NekRS spectral element Navier-Stokes code to perform high-fidelity multiphysics and multiscale simulation. Cardinal handles the couplings that may occur between these two codes, in addition to the numerous physics models provided by the MOOSE framework (such as solid mechanics, material science, and radiative heat transfer). This document describes the system design of Cardinal.
System Purpose
The Software Design Description provided here is description of each object in the system. The pluggable architecture of the underlying framework of Cardinal makes MOOSE and MOOSE-based applications straightforward to develop as each piece of end-user (developer) code that goes into the system follows a well-defined interface for the underlying systems that those object plug into. These descriptions are provided through developer-supplied "markdown" files that are required for all new objects that are developed as part of Cardinal. More information about the design documentation for MOOSE-based applications like Cardinal can be found in Documenting MOOSE.
System Scope
Cardinal is an application for performing high-fidelity simulation of nuclear systems incorporating Monte Carlo neutron-photon transport and/or spectral element Computational Fluid Dynamics (CFD). These physics can be combined with one another and with the MOOSE modules to accomplish "multiphysics" simulation. High-fidelity simulations can also be performed independently, for the purpose of data postprocessing, to generate constitutive models suitable for lower-fidelity tools, a process referred to as "multiscale" simulation.
Interfaces to other MOOSE-based codes, including systems-level thermal-hydraulics (SAM), heat pipe flows (Sockeye), and fuel performance (Bison) are also optionally included to support Cardinal simulations. Cardinal enables high-fidelity modeling of heat transfer, fluid flow, passive scalar transport, fluid-structure interaction, nuclear heating, tritium breeding, shielding effectiveness, material activation, material damage, and sensor response. The MultiApp System is leveraged to allow for the multiscale, multiphysics coupling. Further, other MOOSE capabilities in the modules, such as the Stochastic Tools Module enable engineering studies with uncertainty quantification and sensitivity analysis. Cardinal therefore supports design, safety, engineering, and research projects.
Dependencies and Limitations
Cardinal inherits the software dependencies of: - MOOSE framework - OpenMC - NekRS - DAGMC
No additional dependencies are present.
Definitions and Acronyms
This section defines, or provides the definition of, all terms and acronyms required to properly understand this specification.
Definitions
Pull (Merge) Request: A proposed change to the software (e.g. usually a code change, but may also include documentation, requirements, design, and/or testing).
Baseline: A specification or product (e.g., project plan, maintenance and operations (M&O) plan, requirements, or design) that has been formally reviewed and agreed upon, that thereafter serves as the basis for use and further development, and that can be changed only by using an approved change control process (NQA-1, 2009).
Validation: Confirmation, through the provision of objective evidence (e.g., acceptance test), that the requirements for a specific intended use or application have been fulfilled (24765:2010(E), 2010).
Verification: (1) The process of: evaluating a system or component to determine whether the products of a given development phase satisfy the conditions imposed at the start of that phase. (2) Formal proof of program correctness (e.g., requirements, design, implementation reviews, system tests) (24765:2010(E), 2010).
Acronyms
Acronym | Description |
---|---|
ANL | Argonne National Laboratory |
API | Application Programming Interface |
CAD | Computer Aided Design |
CFD | Computational Fluid Dynamics |
DOE | Department of Energy |
FE | finite element |
HIT | Hierarchical Input Text |
HPC | High Performance Computing |
I/O | Input/Output |
INL | Idaho National Laboratory |
MOOSE | Multiphysics Object Oriented Simulation Environment |
MPI | Message Passing Interface |
SDD | Software Design Description |
Design Stakeholders and Concerns
Design Stakeholders
Stakeholders for Cardinal include several of the funding sources including Department of Energy (DOE), INL, and ANL. However, since Cardinal is an open-source project, several universities, companies, and foreign governments have an interest in the development and maintenance of the Cardinal project.
Stakeholder Design Concerns
Concerns from many of the stakeholders are similar. These concerns include correctness, stability, and performance. The mitigation plan for each of these can be addressed. For correctness, Cardinal development requires either regression or unit testing for all new code added to the repository. The project contains several comparisons against analytical solutions where possible and also other verification methods such as MMS. For stability, Cardinal maintains multiple branches to incorporate several layers of testing both internally and for dependent applications. Finally, performance tests are also performed as part of the the normal testing suite to monitor code change impacts to performance.
System Design
Cardinal relies on OpenMC to solve for neutron-photon transport (optionally on Computer Aided Design (CAD) geometries by relying on DAGMC). Cardinal also relies on NekRS to solve for fluid flow, heat transfer, and species transport. Cardinal integrates these external libraries within the structure of a MOOSE application, allowing these external libraries to be coupled to existing capabilities and interfaces in the MOOSE framework, such as for physics modeling (e.g., with the MOOSE modules or with other MOOSE applications) or data processing. Because Cardinal is based upon MOOSE, it employs the same concept of modular code objects that define all aspects of the solutions for physics. Cardinal provides specialized
- AuxKernels classes that extract internal solution fields in NekRS and OpenMC - Controls classes that modify NekRS and OpenMC simulations on-the-fly - Mesh classes to build the NekRS and OpenMC geometries in a MOOSE-compatible format, and modify existing meshes useful for postprocessing NekRS and OpenMC simulations - Postprocessors classes that query the NekRS and OpenMC simulations at points, through spatial integrals, etc. - Problem classes to execute NekRS and OpenMC as MOOSE applications and facilitate data transfer - TimeStepper classes to control time stepping based on NekRS's adaptive time stepping routines - UserObjects classes that spatially process the NekRS and OpenMC simulations
Cardinal also provides custom syntax for creating OpenMC tallies needed for multiphysics.
System Structure
Cardinal relies on the MOOSE framework to provide the core functionality of solving multiphysics problems. Cardinal replaces the actual physics solves with external API calls to OpenMC and NekRS, but relies on MOOSE for timestepping, synchronization, data transfers, and overall parallelization. Additional physics needed beyond OpenMC and NekRS are obtained from the MOOSE modules.
A summary listing of the current modules required for complete Cardinal operation are shown below:
Cardinal's Makefile also includes other modules which are by default enabled, due to their common usage with Cardinal (though they are not strictly required).
The structure of Cardinal is based on defining C++ classes that derive from classes in the MOOSE framework or modules that provide functionality that is specifically tailored to nuclear modeling and simulation. By using the interfaces defined in MOOSE base classes for these classes, Cardinal is able to rely on MOOSE to execute these models at the appropriate times during the simulation and use their results in the desired ways.
Data Design and Control
At a high level, the system is designed to process Hierarchical Input Text (HIT) input files to construct several objects that will constitute an finite element (FE) simulation. Some of the objects in the simulation may in turn load other file-based resources to complete the simulation. Examples include meshes or data files. The system will then assemble systems of equations and solve them using the libraries of the Code Platform. The system can then output the solution in one or more supported output formats commonly used for visualization.
Human-Machine Interface Design
The Cardinal application is a command-line driven program. All interaction with Cardinal is ultimately done through the command line. This is typical for HPC applications that use the MPI interface for running on super computing clusters. Optional GUIs may be used to assist in creating input files and launching executables on the command line.
System Design Interface
All external system interaction is performed either through file Input/Output (I/O) or through local API calls. Neither Cardinal, nor the MOOSE framework, nor the MOOSE modules are designed to interact with any external system directly through remote procedure calls. Any code to code coupling performed using the framework are done directly through API calls either in a static binary or after loading shared libraries.
Security Structure
The Cardinal application does not require any elevated privileges to operate and does not run any stateful services, daemons or other network programs. Distributed runs rely on the MPI library.
Requirements Cross-Reference
- cardinal: HeatTransferCoefficientAux
- 1.1.2The system shall compute a convective heat transfer coefficient using userobjects for the wall heat flux, wall temperature, and bulk temperature.
Specification(s): h
Design: HeatTransferCoefficientAux
Issue(s): #1081
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: NekRSProblem
- 1.3.7A coupled MOOSE-nekRS pincell-fluid flow problem shall predict correct conservation of energy and realistic thermal solutions. Exact conservation of energy (based on the power imposed in the solid) will not be observed because some heat flux GLL points are also on Dirichlet boundaries, which win in boundary condition ties.
Specification(s): sfr_pincell
Design: NekRSProblem
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.3.8Individually conserving heat flux sideset by sideset shall give equivalent results to the all-combined option when there is just one coupling sideset. The gold file for this test is identical to that for the sfr_pincell case.
Specification(s): sfr_pincell_vpp
Design: NekRSProblem
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.3.9The system shall allow imposing heat flux through a dummy main application, instead of coupling NekRS via conjugate heat transfer. This is verified by computing the heat flux on the NekRS mesh, which adequately matches an initial value set in a postprocessor. This gold file is also identical to that obtained by running a dummy main app (solid_dummy) that passes in the desired flux_integral initial condition.
Specification(s): impose_heat_flux
Design: NekRSProblem
Issue(s): #797
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: BooleanComboMarker
- 1.10.1The system shall be able to prioritize refinement while ANDing markers together.
Specification(s): prioritize_refine_and
Design: BooleanComboMarker
Issue(s): #1025
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.10.2The system shall be able to prioritize coarsening while ANDing markers together.
Specification(s): prioritize_coarsen_and
Design: BooleanComboMarker
Issue(s): #1025
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.10.3The system shall be able to prioritize refinement while ORing markers together.
Specification(s): prioritize_refine_or
Design: BooleanComboMarker
Issue(s): #1025
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.10.4The system shall be able to prioritize coarsening while ORing markers together.
Specification(s): prioritize_coarsen_or
Design: BooleanComboMarker
Issue(s): #1025
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: MeshTally
- 1.23.1The system shall allow problems which contain adaptivity on the mesh mirror for cell tallies.
Specification(s): adaptive_cell
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.2The system shall allow problems which contain adaptivity on the mesh mirror for mesh tallies.
Specification(s): adaptive_mesh
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.3The system shall error if adaptivity is active and tallying on a mesh template instead of the mesh block.
Specification(s): adaptive_mesh_template
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.4The system shall error if adaptivity is active and a relaxation scheme is requested.
Specification(s): adaptive_relaxation
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.5The system shall skip running OpenMC when the mesh is unchanged by adaptivity.
Specification(s): skip_openmc_unchanged
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.6The system shall run OpenMC on the first Picard iteration regardless of the mesh being previouslyunchanged by adaptivity. This test relies on noise in the solution; if OpenMC runs more than onceper Picard iteration the PRNG seed changes and so the tally results will be different.
Specification(s): skip_openmc_unchanged_picard
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- cardinal: OpenMCCellAverageProblem
- 1.23.1The system shall allow problems which contain adaptivity on the mesh mirror for cell tallies.
Specification(s): adaptive_cell
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.2The system shall allow problems which contain adaptivity on the mesh mirror for mesh tallies.
Specification(s): adaptive_mesh
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.3The system shall error if adaptivity is active and tallying on a mesh template instead of the mesh block.
Specification(s): adaptive_mesh_template
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.4The system shall error if adaptivity is active and a relaxation scheme is requested.
Specification(s): adaptive_relaxation
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.5The system shall skip running OpenMC when the mesh is unchanged by adaptivity.
Specification(s): skip_openmc_unchanged
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.6The system shall run OpenMC on the first Picard iteration regardless of the mesh being previouslyunchanged by adaptivity. This test relies on noise in the solution; if OpenMC runs more than onceper Picard iteration the PRNG seed changes and so the tally results will be different.
Specification(s): skip_openmc_unchanged_picard
Design: MeshTally OpenMCCellAverageProblem
Issue(s): #1054
Collection(s): FUNCTIONAL
Type(s): Exodiff
- cardinal: ElementOpticalDepthIndicator
- 1.23.149The system shall allow for the calculation of the optical depth using the min/max vertex separation or the cube root of the element volume.
Specification(s): all_h
Design: ElementOpticalDepthIndicator
Issue(s): #1028
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.150The system shall error if a non-reaction rate score is provided to ElementOpticalDepthIndicator.
Specification(s): not_rxn_rate
Design: ElementOpticalDepthIndicator
Issue(s): #1028
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.151The system shall error if a a reaction rate score is requested, but not available in a tally.
Specification(s): missing_score
Design: ElementOpticalDepthIndicator
Issue(s): #1028
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.152The system shall error if the flux is not available in a tally.
Specification(s): missing_flux
Design: ElementOpticalDepthIndicator
Issue(s): #1028
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- cardinal: FDTallyGradAux
- 1.23.208The system shall allow for the approximation of tally gradients using finite differences.
Specification(s): gradients
Design: FDTallyGradAux
Issue(s): #1031
Collection(s): FUNCTIONAL
Type(s): Exodiff
- 1.23.209The system shall error if the variable provided to FDTallyGradAux is not of type CONSTANT MONOMIAL_VEC.
Specification(s): not_const_mon
Design: FDTallyGradAux
Issue(s): #1031
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.210The system shall error if a score is requested, but not available in a tally.
Specification(s): missing_score
Design: FDTallyGradAux
Issue(s): #1031
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.23.211The system shall error if the external filter bin provided by the user is out of bounds for the filters applied to the given score.
Specification(s): invalid_bin_index
Design: FDTallyGradAux
Issue(s): #1031
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- cardinal: NekPointValue
- 1.25.12The system shall interpolate the NekRS solution onto a given point. This is tested by analytically comparing known initial conditions from NekRS against function evaluations for
- dimensional form
- non-dimensional form
- non-dimensional scaling of usrwrk slots for which the units are known
Specification(s): pp/points, pp/nondimensional, pp/usrwrk_units
Design: NekPointValue
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.25.13The system shall warn the user if dimensionalization is requested and cannot be performed, for
- usrwrk slot 0
- usrwrk slot 1
- usrwrk slot 2
Specification(s): warn/u00, warn/u01, warn/u02
Design: NekPointValue
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- cardinal: NekSideAverage
- 1.25.17NekSideAverage shall correctly compute area-averaged temperatures on the nekRS mesh. The gold file was created by running the moose.i input, which computes the same averages using existing MOOSE postprocessors on the same mesh on auxvariables that match the functional form of the solution fields initialized in the pyramid.udf. Perfect agreement is not to be expected, since the underlying basis functions and quadrature rules are different between nekRS and MOOSE's linear Lagrange variables - we just require that they are reasonably close.
Specification(s): nek_side_average
Design: NekSideAverage
Issue(s): #1015
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: NekVolumeAverage
- 1.25.24dimensional form
Specification(s): nek
Design: NekVolumeAverage
Issue(s): #1065
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.25.25nondimensional form
Specification(s): nondimensional
Design: NekVolumeAverage
Issue(s): #1065
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: NekVolumeIntegral
- 1.25.28dimensional form
Specification(s): nek
Design: NekVolumeIntegral
Issue(s): #1065
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- 1.25.29nondimensional form
Specification(s): nondimensional
Design: NekVolumeIntegral
Issue(s): #1065
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: Reactivity
- 1.25.34The k-eigenvalue and its standard deviation shall be correctly retrieved from the OpenMC solution.
Specification(s): k_eigenvalue
Design: Reactivity
Issue(s): #1051
Collection(s): FUNCTIONAL
Type(s): CSVDiff
- cardinal: OpenMCTallyEditor
- 1.30.68The system shall error if
- trying to edit a non-existant tally
- trying to add a nuclide not accessible in the cross section library
- trying to add an invalid score to a tally
- the filter referenced by an OpenMCFilterEditor via ID does not exist and is not flagged for creation
- an OpenMCDomainFilter editor exists with the same filter ID but a different filter type
- more than one OpenMCDomainFilterEditor eixsts with the same filter ID
- more than one OpenMCTallyEditor eixsts with the same tally ID
- an OpenMCTallyEditor eixsts for a mapped tally created by Cardinal
Specification(s): errors/nonexistent_tally, errors/nonexistent_nuclide, errors/invalid_score, errors/nonexistent_filter, errors/clashing_filter_types, errors/clashing_filter_ids, errors/clashing_tally_ids, errors/clashing_mapped_tally
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.30.69Ensure that nuclides specified by a tally editor UO are present in the tally output
Specification(s): nuclides
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.70Ensure that the scattering score specified by a tally editor UO are present in the tally output
Specification(s): scatter_tally
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.71Ensure that the absorption score for a specific nuclide specified by a tally editor UO are present in the tally output
Specification(s): absorption_u238
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.72Ensure that a cell filter specified by a tally editor UO are present in the tally output
Specification(s): add_cell_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.73Ensure that a material filter specified by a tally editor UO are present in the tally output
Specification(s): add_material_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.74Ensure that a universe filters specified by a tally editor UO are present in the tally output
Specification(s): add_universe_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- cardinal: OpenMCDomainFilterEditor
- 1.30.68The system shall error if
- trying to edit a non-existant tally
- trying to add a nuclide not accessible in the cross section library
- trying to add an invalid score to a tally
- the filter referenced by an OpenMCFilterEditor via ID does not exist and is not flagged for creation
- an OpenMCDomainFilter editor exists with the same filter ID but a different filter type
- more than one OpenMCDomainFilterEditor eixsts with the same filter ID
- more than one OpenMCTallyEditor eixsts with the same tally ID
- an OpenMCTallyEditor eixsts for a mapped tally created by Cardinal
Specification(s): errors/nonexistent_tally, errors/nonexistent_nuclide, errors/invalid_score, errors/nonexistent_filter, errors/clashing_filter_types, errors/clashing_filter_ids, errors/clashing_tally_ids, errors/clashing_mapped_tally
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONALFAILURE_ANALYSIS
Type(s): RunException
- 1.30.69Ensure that nuclides specified by a tally editor UO are present in the tally output
Specification(s): nuclides
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.70Ensure that the scattering score specified by a tally editor UO are present in the tally output
Specification(s): scatter_tally
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.71Ensure that the absorption score for a specific nuclide specified by a tally editor UO are present in the tally output
Specification(s): absorption_u238
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.72Ensure that a cell filter specified by a tally editor UO are present in the tally output
Specification(s): add_cell_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.73Ensure that a material filter specified by a tally editor UO are present in the tally output
Specification(s): add_material_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles
- 1.30.74Ensure that a universe filters specified by a tally editor UO are present in the tally output
Specification(s): add_universe_filter
Design: OpenMCTallyEditorOpenMCDomainFilterEditor
Issue(s): #837
Collection(s): FUNCTIONAL
Type(s): CheckFiles