SetupMGXSAction

commentnote

SetupMGXSAction can only set up multi-group cross section generation in problems which contain a OpenMCCellAverageProblem in the [Problem] block. Otherwise, attempting to add multi-group cross sections will result in an error.

Overview

The SetupMGXSAction action is responsible for automating the generation of Multi-Group Cross Sections (MGXS) on Cardinal's mesh mirror for coupled deterministic codes. The type of spatial discretization used for MGXS homogenization is selected by setting tally_type to cell (to select a distributed cell tally) or to mesh (to select an unstructured mesh tally). The energy groups boundaries used can either be specified in energy_boundaries, or a common group structure can be selected by setting group_structure. The type of particle to filter for can be selected in particle - at present valid options include neutron and photon cross sections. The tally estimator used to generate the MGXS can be selected by setting estimator. Please note that if you request the generation of MGXS derived from nu-scatter / nu-fission scores the choice of estimator will be overriden to analog (a limitation of the current implementation), and setting tally_type = mesh requires a non-tracklength estimator. A description of the group properties available through this action can be found below.

Supported Group Properties

SetupMGXSAction implements MGXS generation in a manner similar to that of OpenMC's MGXS Python API. We provide a brief overview of this approach below; for additional details we refer users to OpenMC's MGXS documentation.

Total Cross Sections

At a minimum, this action always computes total MGXS, which is computed with the following formula:

Σt,i,g=Σtψi,gψi,g \Sigma_{t,i,g} = \frac{\langle\Sigma_{t}\psi\rangle_{i,g}}{\langle\psi\rangle_{i,g}}(1)

where

Σtψi,g=Vidr34πdΩEgEg1dEΣt(r,E)ψ(r,E,Ω^) \langle\Sigma_{t}\psi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\Sigma_{t}(\vec{r}, E)\psi(\vec{r}, E, \hat{\Omega})(2)

and

ϕi,g=Vidr34πdΩEgEg1dEψ(r,E,Ω^) \langle\phi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\psi(\vec{r}, E, \hat{\Omega})(3)

Σt,i,g\Sigma_{t,i,g} is the homogenized total MGXS, ViV_{i} is the homogenization volume (determined by tally_type), Σt(r,E)\Sigma_{t}(\vec{r}, E) is the continuous-energy total macroscopic cross section, and ψ(r,E,Ω^)\psi(\vec{r}, E, \hat{\Omega}) is the continuous energy angular flux.

Absorption Cross Sections

Absorption cross sections can be added by setting add_absorption = true, and are calculated with the following:

Σa,i,g=Σaψi,gψi,g \Sigma_{a,i,g} = \frac{\langle\Sigma_{a}\psi\rangle_{i,g}}{\langle\psi\rangle_{i,g}}(4)

where

Σaψi,g=Vidr34πdΩEgEg1dEΣa(r,E)ψ(r,E,Ω^) \langle\Sigma_{a}\psi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\Sigma_{a}(\vec{r}, E)\psi(\vec{r}, E, \hat{\Omega})(5)

Σa,i,g\Sigma_{a,i,g} is the homogenized absorption MGXS and Σa(r,E)\Sigma_{a}(\vec{r}, E) is the equivalent continuous-energy macroscopic cross section.

Nu-Scattering Matrices

By default this action adds MGXS scattering matrices with particle multiplication, though this behaviour can be disabled by setting add_scattering = false. Scattering cross sections are expanded in Legendre moments of μ=Ω^Ω^\mu = \hat{\Omega}'\cdot\hat{\Omega}, where Ω^\hat{\Omega}' is the direction entering a scattering reaction and Ω^\hat{\Omega} is the direction exiting a scattering reaction. The maximum order of the Legendre expansion can be specified by setting legendre_order (where the default of 0 indicates isotropic scattering). At present, SetupMGXSAction implements a 'simple' formulation of the scattering matrix where the elements are computed with analog estimators:

Σs,i,,gg=Σsψi,,ggψi,g \Sigma_{s,i,\ell,g'\rightarrow g} = \frac{\langle\Sigma_{s}\psi\rangle_{i,\ell,g\rightarrow g'}}{\langle\psi\rangle_{i,g}}(6)

where

νΣsψi,,gg=Vidr34πdΩEgEg1dE4πdΩEgEg1dEνΣs(r,μ,EE)P(μ)ψ(r,E,Ω^) \langle\nu\Sigma_{s}\psi\rangle_{i,\ell,g'\rightarrow g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega'\int_{E'_{g}}^{E'_{g-1}}\,dE'\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\nu\Sigma_{s}(\vec{r}, \mu, E'\rightarrow E)P_{\ell}(\mu)\psi(\vec{r}, E, \hat{\Omega}')(7)

νΣs,i,,gg\nu\Sigma_{s,i,\ell,g'\rightarrow g} is the homogenized nu-scatter MGXS, νΣs(r,μ,EE)\nu\Sigma_{s}(\vec{r}, \mu, E'\rightarrow E) is the equivalent continuous-energy macroscopic cross section, P(μ)P_{\ell}(\mu) are the Legendre polynomials, and EE' indicates the energy entering a scattering reaction. SetupMGXSAction supports transport corrected P0 (=0\ell = 0) scattering cross sections, which are computed with the following:

Σs,i,0,gg=Σsψi,0,ggδgggΣsψi,1,ggψi,g \Sigma_{s,i,0,g'\rightarrow g} = \frac{\langle\Sigma_{s}\psi\rangle_{i,0,g\rightarrow g'} - \delta_{gg'}\sum_{g''}\langle\Sigma_{s}\psi\rangle_{i,1,g''\rightarrow g}}{\langle\psi\rangle_{i,g}}(8)

where δgg\delta_{gg'} is the Khronecker delta function. The transport correction can be applied by setting transport_correction = true.

Nu-Fission Cross Sections

Nu-fission (neutron production) cross sections can be added by setting add_fission = true, and are calculated with the following:

νΣf,i,g=νΣfψi,gψi,g \nu\Sigma_{f,i,g} = \frac{\langle\nu\Sigma_{f}\psi\rangle_{i,g}}{\langle\psi\rangle_{i,g}}(9)

where

Σaψi,g=Vidr34πdΩEgEg1dEνΣf(r,E)ψ(r,E,Ω^) \langle\Sigma_{a}\psi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\nu\Sigma_{f}(\vec{r}, E)\psi(\vec{r}, E, \hat{\Omega})(10)

νΣf,i,g\nu\Sigma_{f,i,g} is the homogenized neutron production MGXS and νΣf(r,E)\nu\Sigma_{f}(\vec{r}, E) is the equivalent continuous-energy macroscopic cross section. The tallies used to compute νΣf,i,g\nu\Sigma_{f,i,g} are also used to compute χi,g\chi_{i,g}, necessitating the use of an analog estimator for νΣf,i,g\nu\Sigma_{f,i,g}. This cross section is not available for photons.

Discrete Chi Spectra

Discrete chi spectra can also be added by setting add_fission = true, and are computed with the following:

χi,g=χνΣfψi,gνΣfψi \chi_{i,g} = \frac{\langle\chi\nu\Sigma_{f}\psi\rangle_{i,g}}{\langle\nu\Sigma_{f}\psi\rangle_{i}}(11)

where

χνΣfψi,g=Vidr34πdΩ0dEEgEg1dEχ(r,E)νΣf(r,E)ψ(r,E,Ω^) \langle\chi\nu\Sigma_{f}\psi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega'\int_{0}^{\infty}\,dE'\int_{E_{g}}^{E_{g-1}}\,dE\,\chi(\vec{r}, E)\nu\Sigma_{f}(\vec{r}, E')\psi(\vec{r}, E', \hat{\Omega}')(12)

and

νΣfψi=Vidr34πdΩ0dE0dEχ(r,E)νΣf(r,E)ψ(r,E,Ω^) \langle\nu\Sigma_{f}\psi\rangle_{i} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega'\int_{0}^{\infty}\,dE'\int_{0}^{\infty}\,dE\,\chi(\vec{r}, E)\nu\Sigma_{f}(\vec{r}, E')\psi(\vec{r}, E', \hat{\Omega}')(13)

χi,g\chi_{i,g} is the homogenized MG chi spectra and χ(r,E)\chi(\vec{r}, E) is the equivalent continuous-energy spectra. The need to know the entering and exiting energies for the nu-fission reaction rate necessitates the use of an analog estimator for χi,g\chi_{i,g}. This property is not available for photons.

Fission Heating Values

Fission heating values can be added by setting add_fission_heating = true, and are computed with the following:

κΣf,i,g=κΣfψi,gψi,g \kappa\Sigma_{f,i,g} = \frac{\langle\kappa\Sigma_{f}\psi\rangle_{i,g}}{\langle\psi\rangle_{i,g}}(14)

where

κΣfψi,g=Vidr34πdΩEgEg1dEκΣf(r,E)ψ(r,E,Ω^) \langle\kappa\Sigma_{f}\psi\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\kappa\Sigma_{f}(\vec{r}, E)\psi(\vec{r}, E, \hat{\Omega})(15)

κΣf,i,g\kappa\Sigma_{f,i,g} is the homogenized MG fission heating cross section and κΣf(r,E)\kappa\Sigma_{f}(\vec{r}, E) is the equivalent continuous-energy cross section. This property is not available for photons.

Inverse Velocity Values

Inverse velocity values can be added by setting add_inverse_velocity = true, and are computed with the following:

(1v)i,g=ψvi,gψi,g \Big(\frac{1}{v}\Big)_{i,g} = \frac{\langle\frac{\psi}{v}\rangle_{i,g}}{\langle\psi\rangle_{i,g}}(16)

where

ψvi,g=Vidr34πdΩEgEg1dEψ(r,E,Ω^)v(E) \Big\langle\frac{\psi}{v}\Big\rangle_{i,g} = \int_{V_i}\,dr^3\int_{4\pi}\,d\Omega\int_{E_{g}}^{E_{g-1}}\,dE\,\frac{\psi(\vec{r}, E, \hat{\Omega})}{v(E)}(17)

(1v)i,g(\frac{1}{v})_{i,g} is the homogenized MG inverse velocity and v(E)v(E) is the associated continuous energy velocity.

Particle Diffusion Coefficients

Particle diffusion coefficients can be added by setting add_diffusion_coefficient = true, and are computed with the following:

Di,g=13Σtr,i,g D_{i,g} = \frac{1}{3\Sigma_{tr,i,g}}(18)

Σtr,i,g=Σtψi,ggνΣsψi,1,ggψi,g \Sigma_{tr,i,g} = \frac{\langle\Sigma_{t}\psi\rangle_{i,g} - \sum_{g'}\langle\nu\Sigma_{s}\psi\rangle_{i,1,g'\rightarrow g}}{\langle\psi\rangle_{i,g}}(19)

Di,gD_{i,g} is the homogenized MG diffusion coefficient and Σtr,i,g\Sigma_{tr,i,g} is the homogenized transport MGXS.

Example Input Syntax

The example below computes every available group property using a distributed cell tally for spatial homogenization and the CASMO-2 energy group structure.

[Problem]
  type = OpenMCCellAverageProblem
  verbose = true
  cell_level = 0

  power = 1.0
  source_rate_normalization = 'kappa_fission'
  # Some tally results will be missed as photon transport is enabled, but we filter MGXS tallies by a single particle type.
  # This forces us to disable global normalization.
  normalize_by_global_tally = false

  [MGXS]
    tally_type = cell
    particle = neutron
    group_structure = CASMO_2
    estimator = 'analog'
    hide_tally_vars = true

    add_scattering = true
    legendre_order = 0
    transport_correction = true

    add_fission = true

    add_fission_heating = true

    add_inverse_velocity = true

    add_diffusion_coefficient = true

    add_absorption = true
  []
[]
(test/tests/neutronics/gen_mgxs/all_mgxs_cell.i)

Input Parameters

  • particleThe particle to filter for. At present cross sections can only be generated for neutrons or photons, if 'electron' or 'positron' are selected an error will be thrown.

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:neutron, photon, electron, positron

    Controllable:No

    Description:The particle to filter for. At present cross sections can only be generated for neutrons or photons, if 'electron' or 'positron' are selected an error will be thrown.

  • tally_typeThe type of spatial tally to use. Options are a distributed cell tally (cell) or an unstructured mesh tally (mesh).

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:cell, mesh

    Controllable:No

    Description:The type of spatial tally to use. Options are a distributed cell tally (cell) or an unstructured mesh tally (mesh).

Required Parameters

  • active__all__ If specified only the blocks named will be visited and made active

    Default:__all__

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:If specified only the blocks named will be visited and made active

  • add_absorptionFalseWhether or not absorption multi-group cross sections should be generated.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not absorption multi-group cross sections should be generated.

  • add_diffusion_coefficientFalseWhether or not per-group particle diffusion coefficients should be generated.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not per-group particle diffusion coefficients should be generated.

  • add_fissionFalseWhether or not fission multi-group cross sections (neutron production and the discrete chi spectrum) should be generated.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not fission multi-group cross sections (neutron production and the discrete chi spectrum) should be generated.

  • add_fission_heatingFalseWhether or not per-group fission heating (kappa-fission) values should be generated.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not per-group fission heating (kappa-fission) values should be generated.

  • add_inverse_velocityFalseWhether or not per-group inverse velocities should be generated.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not per-group inverse velocities should be generated.

  • add_scatteringTrueWhether or not the scattering multi-group cross section matrix should be generated.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not the scattering multi-group cross section matrix should be generated.

  • blockThe list of block ids (SubdomainID) to which this action will be applied

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The list of block ids (SubdomainID) to which this action will be applied

  • energy_boundariesThe energy boundaries to use to form energy bins. The boundaries must be provided in ascending order in terms of energy.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:The energy boundaries to use to form energy bins. The boundaries must be provided in ascending order in terms of energy.

  • estimatortracklengthThe type of estimator to use with the tallies added for MGXS generation. This is not applied to scattering / fission scores as the filters applied to those scores only support analog estimators.

    Default:tracklength

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:collision, tracklength, analog

    Controllable:No

    Description:The type of estimator to use with the tallies added for MGXS generation. This is not applied to scattering / fission scores as the filters applied to those scores only support analog estimators.

  • group_structureThe energy group structure to use from a list of popular group structures.

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:CASMO_2, CASMO_4, CASMO_8, CASMO_16, CASMO_25, CASMO_40, VITAMIN_J_42, SCALE_44, MPACT_51, MPACT_60, MPACT_69, CASMO_70, XMAS_172, VITAMIN_J_175, SCALE_252, TRIPOLI_315, SHEM_361, CCFE_709, UKAEA_1102, ECCO_1968

    Controllable:No

    Description:The energy group structure to use from a list of popular group structures.

  • hide_tally_varsTrueWhether or not tally variables used to compute multi-group cross sections are hidden in exodus output.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not tally variables used to compute multi-group cross sections are hidden in exodus output.

  • inactiveIf specified blocks matching these identifiers will be skipped.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:If specified blocks matching these identifiers will be skipped.

  • legendre_order0The order of the Legendre expansion in scattering angle to use for generating scattering cross sections. Defaults to 0.

    Default:0

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:The order of the Legendre expansion in scattering angle to use for generating scattering cross sections. Defaults to 0.

  • transport_correctionTrueWhether the in-group scattering cross section should include a P0 transport correction or not.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether the in-group scattering cross section should include a P0 transport correction or not.

Optional Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

Advanced Parameters