MSR Depletion Model

Contact: Olin Calvin [email protected]

Model link: MSR Depletion Model

The MSR depletion model is an implementation and verification of Griffin's isotope removal capability for two multi-region MSR depletion cases. This model consists of two regions. The first is the primary loop, which includes the reactor core, primary heat exchanger, and pump all homogenized into a single region, and the second is the off-gas system. The model approximates an MSR core as a fast spectrum, cube-geometry, infinite, homogenous medium, molten chloride salt reactor using High-Assay Low-Enriched Uranium (HALEU) UCl fuel. The important parameters for this model are given in Table 1. This model is used for isotope depletion cases with and without removal to the off-gas system, and is also the starting point for analyzing what type of insoluble material may be removed into the off gas during burnup (Walker et al., 2022).

Table 1: Simple MSR Test Case Design Specifications

ParameterValue
Salt Composition UCl- NaCl
Salt Density g/cm
Enrichment%
Volume cm
Temperature C
Power Density - Power W/g - MW
1G Flux neutrons/(cm s)
Fission Rate fissions/(cm s)
K
SpectrumFast

Griffin Model

Griffin is used to model the depletion of the MSR which solves the Bateman equations with removal discussed in the Method and results section. This section will discuss how to run the model and describe the input files for the depletion with no iodine removal and depletion with isotopic removal models.

Obtaining and Running the Griffin Model

Depletion with no iodine removal Model

The complete input file for the Depletion with no iodine removal model is shown below.

# Generic Molten Salt Reactor Depletion
# Griffin input
# Depletion with isotopic removal
# POC: Olin Calvin (olin.calvin at inl.gov)
# If using or referring to this model, please cite as explained in
# https://mooseframework.inl.gov/virtual_test_bed/citing.html

[Mesh]
  [gmg]
    type = GeneratedIDMeshGenerator
    dim = 2
    depletion_ids = 0
    material_ids = 1
  []
[]

[Problem]
  type = FEProblem
  solve = false
  kernel_coverage_check = false
[]

[AuxVariables]
  [Burnup]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 0.0
  []
  [flux]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 8.3989E15
  []
[]

[AuxKernels]
  [constant]
    variable = flux
    type = ConstantAux
    value = 8.3989E15
  []

  [SetBurnup]
     type = FunctionAux
     function = SetBurnup
     variable = Burnup
     execute_on = timestep_begin
  []
[]

[Functions]
  [SetBurnup]
     type = PiecewiseLinear
     x = '0 1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
     y = '0 0 0 0 0 0 0 0 0 0 0 0 0'
  []
[]

[Compositions]
  [fuel_salt]
    type = IsotopeComposition
    isotope_densities = 'CL35 1.55753e-02
                         CL37 4.98332e-03
                         NA23 8.23094e-03
                         U232 7.49749e-10
                         U234 4.05961e-05
                         U235 8.12118e-04
                         U236 1.11782e-05
                         U238 3.20723e-03'
    density_type = atomic
    composition_ids = '1'
  []
[]

[Materials]
  [Mat_1]
    type = MSRDepletionNeutronicsMaterial
    block = 0
    library_file = '../data/MSR_XS.xml'
    library_name = 'MSR_XS'

    # multiphysics variables
    grid_names = 'Burnup'
    grid_variables = 'Burnup'
    scalar_fluxes = 'flux'

    # decay & transmutation data
    dataset = 'ISOXML'
    isoxml_data_file = '../data/MSR_DT.xml'
    isoxml_lib_name = 'MSR_DT'

    # Bateman solve settings
    bateman_solver = 'CRAMIPF'
    bateman_solver_tolerance = 1e-100
    cram_ipf_order = 48
    cram_matrix_inversion_scheme = sparse_gaussian_elimination

    track_secondary_particle_production = true
    print_number_densities = 'ALL'

    number_of_external_regions = 1
    multi_region_isotope_list = 'I127 I129'
    multi_region_isotope_densities = '0 0'
    multi_region_volumes = 1.0
    multi_region_names = 'Out_Of_Core'
    multi_region_transfer_paths = '0 1'
    multi_region_transfer_isotopes = 'I127 I129'
    multi_region_transfer_isotope_rates = '0 0'
  []
[]

[Executioner]
  type = Transient   # Here we use the Transient Executioner
  [TimeStepper]
   type = TimeSequenceStepper
   time_sequence  = '1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
  []
  start_time = 0.0
  end_time = 6051600
[]

[Outputs]
  csv = false
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

In the following sections, we will discuss each of the input blocks.

Mesh and Problem

In this section, we will cover the mesh and problem inputs. The full input blocks can be found below.

[Mesh]
  [gmg]
    type = GeneratedIDMeshGenerator
    dim = 2
    depletion_ids = 0
    material_ids = 1
  []
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)
[Problem]
  type = FEProblem
  solve = false
  kernel_coverage_check = false
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

Here a very simple mesh is generated using the GeneratedIDMeshGenerator which is not currently used explicitly for this problem. Additionally, a simple problem statement is also specified. The reason for this, is because the majority of this model is actually a VectorPostprocessor which will be discussed shortly.

AuxVariables, AuxKernels, and Functions

AuxVariables are variables that can be derived from the solution variables (i.e., scalar flux). An AuxKernel is a procedure that uses the solution variable to compute the AuxVariable (i.e., reaction rate).

There are two AuxVariables that are defined in this model: the burnup measured in time and the neutron flux.

[AuxVariables]
  [Burnup]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 0.0
  []
  [flux]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 8.3989E15
  []
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

The AuxKernels are locally defined with the names [constant] and [SetBurnup], and are of the ConstantAux and FunctionAux type respectively. The AuxVariable that the kernel acts on is defined with AuxVariable defined previously. Lastly, we tell it to execute_on the end of a time step.

[AuxKernels]
  [constant]
    variable = flux
    type = ConstantAux
    value = 8.3989E15
  []

  [SetBurnup]
    type = FunctionAux
    function = SetBurnup
    variable = Burnup
    execute_on = timestep_begin
  []
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

Since we are using a FunctionAux we will still need to define this function in another block.

[Functions]
  [SetBurnup]
    type = PiecewiseLinear
    x = '0 1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
    y = '0 0 0 0 0 0 0 0 0 0 0 0 0'
  []
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

Here we set the depletion time steps (given in seconds) that we would like to use via a PiecewiseLinear type of function.

Materials

Material cross sections are specified with the multi-group cross section library defined by library_file In this example, we define one generic material [Mat_1]. For this material we specify the type as a CoupledFeedbackNeutronicsMaterial.

In this example, we have a generic pseudo mixture with a density that is defined here in this block. Since we are performing isotopic depletion, the primary purpose of this block is to set up the grid_variables = 'Burnup' and scalar_fluxes = 'flux' and not to operate on the macroscopic cross sections defined here.

[Materials]
  [Mat_1]
    type = MSRDepletionNeutronicsMaterial
    block = 0
    library_file = '../data/MSR_XS.xml'
    library_name = 'MSR_XS'

    # multiphysics variables
    grid_names = 'Burnup'
    grid_variables = 'Burnup'
    scalar_fluxes = 'flux'

    # decay & transmutation data
    dataset = 'ISOXML'
    isoxml_data_file = '../data/MSR_DT.xml'
    isoxml_lib_name = 'MSR_DT'

    # Bateman solve settings
    bateman_solver = 'CRAMIPF'
    bateman_solver_tolerance = 1e-100
    cram_ipf_order = 48
    cram_matrix_inversion_scheme = sparse_gaussian_elimination

    track_secondary_particle_production = true
    print_number_densities = 'ALL'

    number_of_external_regions = 1
    multi_region_isotope_list = 'I127 I129'
    multi_region_isotope_densities = '0 0'
    multi_region_volumes = 1.0
    multi_region_names = 'Out_Of_Core'
    multi_region_transfer_paths = '0 1'
    multi_region_transfer_isotopes = 'I127 I129'
    multi_region_transfer_isotope_rates = '0 0'
  []
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

Executioner and Outputs

The [Executioner] block tells the solver what type of problem it needs to solve. Here, we select Transient as the executioner type which will solve the depletion problem for the isotopic evolution of the system given the time steps laid out in the [TimeStepper].

[Executioner]
  type = Transient # Here we use the Transient Executioner
  [TimeStepper]
    type = TimeSequenceStepper
    time_sequence = '1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
  []
  start_time = 0.0
  end_time = 6051600
[]
(msr/generic_msr/depletion/0D_No_Iodine_Removal_1G.i)

The output of the nuclide concentrations is handled by the MSRDepletionNeutronicsMaterial. It is directly output to a comma-separated value (CSV) file.

Depletion with Isotopic Removal Model

The complete input file for the Depletion with Isotopic Removal model is shown below.

# Generic Molten Salt Reactor Depletion
# Griffin input
# Depletion with isotopic removal
# POC: Olin Calvin (olin.calvin at inl.gov)
# If using or referring to this model, please cite as explained in
# https://mooseframework.inl.gov/virtual_test_bed/citing.html

[Mesh]
  [gmg]
    type = GeneratedIDMeshGenerator
    dim = 2
    depletion_ids = 0
    material_ids = 1
  []
[]

[Problem]
  type = FEProblem
  solve = false
  kernel_coverage_check = false
[]

[AuxVariables]
  [Burnup]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 0.0
  []
  [flux]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 8.3989E15
  []
[]

[AuxKernels]
  [constant]
    variable = flux
    type = ConstantAux
    value = 8.3989E15
  []

  [SetBurnup]
     type = FunctionAux
     function = SetBurnup
     variable = Burnup
     execute_on = timestep_begin
  []
[]

[Functions]
  [SetBurnup]
     type = PiecewiseLinear
     x = '0 1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
     y = '0 0 0 0 0 0 0 0 0 0 0 0 0'
  []
[]

[Compositions]
  [fuel_salt]
    type = IsotopeComposition
    isotope_densities = 'CL35 1.55753e-02
                         CL37 4.98332e-03
                         NA23 8.23094e-03
                         U232 7.49749e-10
                         U234 4.05961e-05
                         U235 8.12118e-04
                         U236 1.11782e-05
                         U238 3.20723e-03'
    density_type = atomic
    composition_ids = '1'
  []
[]

[Materials]
  [Mat_1]
    type = MSRDepletionNeutronicsMaterial
    block = 0
    library_file = '../data/MSR_XS.xml'
    library_name = 'MSR_XS'

    # multiphysics variables
    grid_names = 'Burnup'
    grid_variables = 'Burnup'
    scalar_fluxes = 'flux'

    # decay & transmutation data
    dataset = 'ISOXML'
    isoxml_data_file = '../data/MSR_DT.xml'
    isoxml_lib_name = 'MSR_DT'

    # Bateman solve settings
    bateman_solver = 'CRAMIPF'
    bateman_solver_tolerance = 1e-100
    cram_ipf_order = 48
    cram_matrix_inversion_scheme = sparse_gaussian_elimination

    track_secondary_particle_production = true
    print_number_densities = 'ALL'

    number_of_external_regions = 1
    multi_region_isotope_list = 'I127 I129'
    multi_region_isotope_densities = '0 0'
    multi_region_volumes = 1.0
    multi_region_names = 'Out_Of_Core'
    multi_region_transfer_paths = '0 1'
    multi_region_transfer_isotopes = 'I127 I129'
    multi_region_transfer_isotope_rates = '3.85E-5 3.85E-5'
  []
[]

[Executioner]
  type = Transient   # Here we use the Transient Executioner
  [TimeStepper]
   type = TimeSequenceStepper
   time_sequence  = '1800 3600 608400 1213200 1818000 2422800 3027600 3632400 4237200 4842000 5446800 6051600'
  []
  start_time = 0.0
  end_time = 6051600
[]

[Outputs]
  csv = false
[]
(msr/generic_msr/depletion/0D_Iodine_Removal_1G.i)

The input file for the Depletion with Isotopic Removal model is exactly the same as the Depletion with no iodine removal model with one key exception. Here the multi_region_transfer_isotope_rates in the BatemanVPP are specified and non-zero for the isotopes in question.

References

  1. Samuel Walker, Olin Calvin, Mauricio E. Tano, and Abdalla Abou Jaoude. Implementation of isotopic removal capability in griffin for multi-region msr depletion analysis. ANS conference paper, 2022.[BibTeX]