SAM System Model for the Molten Salt Separate Effects Loop (SEL)

Contact: Thanh Hua, thua.at.anl.gov; Jun Fang, fangj.at.anl.gov

Model link: SEL SAM System Model

Model Overview

The SEL SAM model is a system-level representation of the Molten Salt Separate Effects Loop (SEL). The working fluid is a molten salt mixture of MgCl2-NaCl. The model simulates the primary loop with forced convection (salt mass flow rate of 1 kg/s) in an electrically heated 1-pin test section configuration (11 kW heating power).

In addition to the primary loop, the model includes a secondary loop where pressurized air cools the primary heat exchanger (PHX) and is subsequently cooled by a water-based secondary heat exchanger (SHX) before being safely vented. This is in accordance with building safety requirements which mandate the air to be reduced in temperature (< 60°C) before venting to the environment.

The SAM model is designed to simulate both steady-state forced flow conditions and transient natural circulation scenarios, such as a loss of flow transient induced by a pump coast-down. The model is currently focused on a single-pin configuration but is structured to easily expand to 7-pin and conjugate heat transfer configurations in the future.

Input File Description

The model has two main input files:

  • OnepinSS.i: Simulates the steady-state operating conditions with forced flow.

  • OnepinNC.i: Simulates a loss-of-flow transient (pump trip) and the resulting natural circulation.

The SAM input file adopts a block-structured syntax, and each block contains the detailed settings of specific SAM components. In this section, we will go through the important blocks in the input file and explain the key model specifications.

GlobalParams

This block contains the global parameters that are applied to all SAM components, such as the initial pressure (1.e5 Pa), initial velocity (2.0 m/s), and global initial temperature (773.15 K). This section also specifies variable scaling factors (scaling_factor_var = '1 1e-2 1e-5'), which is a crucial numerical setup in SAM (based on MOOSE's PJFNK solver). The simulation solves equations for mass, momentum and energy conservation that have drastically different magnitudes, scaling them improves matrix preconditioning and solver convergence.

[GlobalParams]
  global_init_P = 1.e5 # Global initial fluid pressure
  global_init_V = 2.0 # Global initial fluid velocity
  global_init_T = 773.15 # Global initial temperature for fluid and solid
  scaling_factor_var = '1 1e-2 1e-5'
[]
(msr/sel/OnepinSS.i)

EOS (Equations of State)

This block specifies the material equations of state for the three working fluids in the system. The primary loop uses PTFunctionsEOS to define the temperature-dependent thermophysical properties of the molten salt (MgCl2-NaCl) via piece-wise linear interpolations (PiecewiseLinear functions defined in the Functions block). The secondary and tertiary loops use AirEquationOfState for pressurized air and PTConstantEOS for the cooling water, respectively.

commentnote:Thermophysical Property Source

The thermophysical properties for the molten salt were obtained via private communication with an ARPA-E project industry partner, as the primary source contains proprietary information.

[EOS]
  [salt_eos]
    type = PTFunctionsEOS
    rho = rho_coolant
    cp = 971.3 # MgCl2_NaCl
    mu = mu_coolant
    k = k_coolant
    T_min = 500
    T_max = 1500
  []
  [air_eos]
    type = AirEquationOfState
    p_0 = 3.4e5
  []
  [water_eos]
    type = PTConstantEOS
    rho_0 = 996.5
    p_0 = 1.0e5
    T_0 = 300.
    beta = 2.57e-4
    cp = 4182
    h_0 = 1.2546e6
    mu = 8.55e-4
    k = 0.613
  []
[]
(msr/sel/OnepinSS.i)

Components

This is the main block in the input file. It provides the specifications for all physical components that make up the loop, converting the 3D facility geometry into an equivalent 1D system network using components such as the test section, heat exchangers, pumps, and connecting pipes.

The test section is modeled as a PBCoreChannel incorporating the electrically heated heater pin. Key parameters such as hydraulic diameter (Dh = 0.015494) and flow area are carefully specified to represent the annular flow path between the single heater pin and the surrounding pipe wall. Heat transfer correlations are tuned (SC_HTC = 1.3) to account for local flow phenomena:

[Components]
  [CH1]
    # Test section
    type = PBCoreChannel
    eos = salt_eos
    orientation = '0 0 1'
    position = '0 1.25 0.1'
    A = 0.000806
    Dh = 0.015494
    length = 0.5
    n_elems = 25

    HT_surface_area_density = 98.913
    HTC_geometry_type = Pipe
    dim_hs = 2
    name_of_hs = 'heater'
    Ts_init = 773.15
    n_heatstruct = 1
    fuel_type = cylinder
    width_of_hs = '0.0127' # radius of heater pin
    elem_number_of_hs = '5'
    material_hs = 'ss-mat'
    lam_factor = 1.4
    turb_factor = 1.1
    SC_HTC = 1.3 # enhance HTC by 30%
    power_fraction = 1.0 # Assign all power to the single heat structure
  []
[]
(msr/sel/OnepinSS.i)

The primary (IHX) and secondary (SHX) heat exchangers are modeled using the PBHeatExchanger component, which simulates 1D counter-current heat exchange across a shared wall. The IHX couples the primary salt loop to the pressurized air loop, while the SHX couples the air loop to the final water cooling sink, allowing the air to be safely discharged to the environment below 60°C:

[Components]
  [IHX]
    type = PBHeatExchanger
    eos = salt_eos
    eos_secondary = air_eos
    orientation = '0.996180782 -0.087314654 0'
    position = '0 0.9 0.8'
    length = 5.7264
    n_elems = 100

    A = 3.5244E-04
    Dh = 2.1184E-02
    HT_surface_area_density = 226.4093
    A_secondary = 1.2891E-04
    Dh_secondary = 3.0480E-03
    HT_surface_area_density_secondary = 619.0264

    heat_transfer_area_error_tolerance = 0.002
    f = 0.02
    initial_V_secondary = -80
    Hw = 350
    Hw_secondary = 1500
    wall_thickness = 2.1082E-03
    Twall_init = 773.15
    dim_wall = 2
    n_wall_elems = 1
    material_wall = ss-mat
  []
[]
(msr/sel/OnepinSS.i)

The molten salt pump (Pump_p) uses a PBPump component to drive forced convection. Its pressure head is defined via a time-dependent function (pump_head) that is central to both the steady-state and transient simulations. To reach the steady-state initial condition, the pump head is held at a constant value from a pseudo-transient start time of -20,000 s up to 0 s to establish a steady 1 kg/s salt mass flow rate. For transient loss of flow simulations, a pump trip is initiated at time > 0, where the pump head function coasts down towards zero.

[Components]
  [Pump_p]
    type = PBPump
    eos = salt_eos
    inputs = 'Pipe5(out)'
    outputs = 'Pipe6(in)'
    K = '0.15 0.1'
    Area = 0.001313436
    initial_P = 1.e5
    #    Head      = 1.25e4 #2.25e3
    Head = pump_head
  []
[]
(msr/sel/OnepinSS.i)

Postprocessors

The Postprocessors block is used to extract and monitor macroscopic quantities of interest during the simulation, such as mass flow rates, average temperatures, and total heat transfer. These values are printed to the console and saved to a CSV file to easily verify steady-state energy balances and track transient behaviors.

[Postprocessors]
  [CH1_flow]
    # Output mass flow rate at inlet of CH1
    type = ComponentBoundaryFlow
    input = CH1(in)
  []

  [air_flow]
    # Output mass flow rate at secondary inlet of IHX
    type = ComponentBoundaryFlow
    input = IHX(secondary_in)
  []

  [water_flow]
    # Output mass flow rate at secondary inlet of SHX
    type = ComponentBoundaryFlow
    input = SHX(secondary_in)
  []

  [CH1_velocity]
    # Output velocity at inlet of CH1
    type = ComponentBoundaryVariableValue
    variable = velocity
    input = CH1(in)
  []

  [CH1_Tin]
    # Temperature at inlet of CH1
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = CH1(in)
  []

  [CH1_Tout]
    # Temperature at outlet of CH1
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = CH1(out)
  []

  [IHX_Tin_p]
    # Temperature at IHX inlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = IHX(primary_in)
  []

  [IHX_Tout_p]
    # Temperature at IHX outlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = IHX(primary_out)
  []

  [IHX_Tin_s]
    # Temperature at IHX secondary inlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = IHX(secondary_in)
  []

  [IHX_Tout_s]
    # Temperature at IHX secondary outlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = IHX(secondary_out)
  []

  [SHX_Tin_p]
    # Temperature at SHX inlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = SHX(primary_in)
  []

  [SHX_Tout_p]
    # Temperature at SHX outlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = SHX(primary_out)
  []

  [SHX_Tin_s]
    # Temperature at SHX secondary inlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = SHX(secondary_in)
  []

  [SHX_Tout_s]
    # Temperature at SHX secondary outlet
    type = ComponentBoundaryVariableValue
    variable = temperature
    input = SHX(secondary_out)
  []

  [HX_E]
    type = ComponentBoundaryEnergyBalance
    eos = salt_eos
    input = 'IHX(primary_out) IHX(primary_in)'
  []

  [./HX_SE]
    type = ComponentBoundaryEnergyBalance
    eos = air_eos
    input = 'IHX(secondary_out) IHX(secondary_in)'
  [../]

  [SHX_E]
    type = ComponentBoundaryEnergyBalance
    eos = air_eos
    input = 'SHX(primary_out) SHX(primary_in)'
  []

  [./SHX_SE]
    type = ComponentBoundaryEnergyBalance
    eos = water_eos
    input = 'SHX(secondary_out) SHX(secondary_in)'
  [../]
[]
(msr/sel/OnepinSS.i)

Executioner

This block orchestrates the overall calculation process flow. It sets the solver type (e.g., Transient), start time, end time, and time-stepping scheme. It also configures the PETSc solver options (such as using the lu preconditioner with petsc_options_iname='-pc_type' and petsc_options_value = 'lu') to ensure that the solve for the non-linear fluid flow and conjugate heat transfer equations converge efficiently.

[Executioner]
  type = Transient
  start_time = -20000
  end_time = 0
  dt = 1.00
  dtmin = 1e-4
  dtmax = 200.0

  [TimeStepper]
    type = IterationAdaptiveDT
    dt = 0.1
    growth_factor = 1.5
    optimal_iterations = 10
  []

  petsc_options_iname = '-ksp_gmres_restart -pc_type'
  petsc_options_value = '300 lu'
  nl_rel_tol = 1e-4
  nl_abs_tol = 1e-4
  nl_max_its = 30

  l_tol = 1e-4 # Relative linear tolerance for each Krylov solve
  l_max_its = 100 # Number of linear iterations for each Krylov solve

  [Quadrature]
    type = TRAP
    order = FIRST
  []
[]
(msr/sel/OnepinSS.i)

Results

Steady State Operating Conditions

For a base case, salt flow rate 1 kg/s, and heater power of 11 kW:

  • 11.3 K coolant temperature rise

  • Peak pin centerline temperature 1135 K, pin surface temperature 1008 K

  • Air temperature rises to 780 K in PHX, cools down to 312.3 K in SHX for discharge to the environment.

Steady State Loop Temperature

Figure 1: Steady State Loop Temperature

Table 1: Steady State Operating Conditions

ComponentFluidInlet Temperature (K)Outlet Temperature (K)Mass flow rate (kg/s)
PHXSalt772.5783.81.0
PHXAir300.0781.30.022
SHXAir778.2312.30.022
SHXWater300.0319.80.13

Natural Circulation in Pump Trip Transient

To simulate a loss-of-flow scenario, a pump trip is initiated at . The pump head is programmed to coast down, eventually reaching zero at seconds.

  • Flow Transition: As the forced flow decays, the flow rate drops from the initial 1.0 kg/s but does not go to zero. Instead, a stable natural circulation flow of approximately 0.12 kg/s is successfully established in the loop, driven by the buoyancy difference between the hot salt in the heater test section and the cooler salt in the heat exchangers.

  • Test Section Temperatures: Due to the significantly reduced mass flow rate under constant 11 kW heating, the temperature rise across the test section () increases dramatically. The salt inlet temperature gradually drops to ~700 K as cooler salt returns from the PHX. Meanwhile, the outlet temperature experiences a transient peak near 825 K before settling around 795 K. This results in a steady-state natural circulation of approximately 95 K, up from the initial 11.3 K in forced flow.

  • Heat Exchanger Performance: Both the primary (PHX) and secondary (SHX) heat exchangers continue to operate effectively throughout the transient. In the PHX, the air outlet temperature smoothly tracks the transient peak of the incoming hot salt. Crucially, the SHX continues to successfully dump this heat into the water cooling sink, maintaining an extremely stable air discharge temperature of ~312–314 K (well below the 60°C / 333 K facility safety requirement).

Normalized Pump Head and Flow Rate During the Transient

Figure 2: Normalized Pump Head and Flow Rate During the Transient

Transient Salt Temperatures at Test Section Inlet and Outlet

Figure 3: Transient Salt Temperatures at Test Section Inlet and Outlet

Transient Fluid Temperatures on Both Sides of PHX

Figure 4: Transient Fluid Temperatures on Both Sides of PHX

Transient Fluid Temperatures on Both Sides of SHX

Figure 5: Transient Fluid Temperatures on Both Sides of SHX

Run Command

Both the steady-state and transient models are lightweight and can be run efficiently on a local workstation or laptop. Note that the transient input model relies on the final checkpoint file from the steady-state case to set its initial condition. Therefore, the steady-state model must be run first.

Below is a simple example of how to run the models sequentially:


# Run the steady-state case first to generate the checkpoint file
/path/to/sam-opt -i OnepinSS.i

# Run the transient case
/path/to/sam-opt -i OnepinNC.i