MK1-FHR Plant Model

Contact: Guillaume Giudicelli, guillaume.giudicelli.at.inl.gov

Model link: FHR Plant Model

The multiphysics core model, which uses Griffin for neutronics and Pronghorn for coarse mesh porous media CFD, is coupled with the balance of plant model, which uses SAM for 1D thermal hydraulics of the primary and secondary loops.

Coupling scheme for the Mk1-FHR plant model

Modifications to the core 2D-RZ model

The connection between the core model and the balance of plant simulation is made through the inlet and outlet of the core in the primary loop. Instead of a fixed inlet mass flow rate and a fixed outlet pressure like in the previous model, those quantities will be provided by the simulation of the rest of the primary loop.

The boundary information, collected in SAM, is passed between the applications using Transfers. In particular, the MultiAppPostprocessorsTransfer from SAM enables the transfer of multiple postprocessors by a single object.

[Transfers]
  [receive_flow_BCs]
    type = MultiAppPostprocessorVectorTransfer
    from_multi_app = primary
    from_postprocessors = 'Core_outlet_p Core_inlet_mdot Core_inlet_T'
    to_postprocessors = 'outlet_pressure inlet_mdot inlet_temp_fluid'
    # Initial execution is important to avoid using a default BC
    execute_on = 'INITIAL TIMESTEP_END'
  []
[]
(pbfhr/mark1/plant/ss1_combined.i)

The outlet pressure is passed from SAM to Pronghorn and stored in a Receiver, as are the core inlet mass flow rate and temperature.

[Postprocessors]
  [inlet_mdot]
    type = Receiver
    default = 9.784508e+02 #${mfr}
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []

  [inlet_temp_fluid]
    type = Receiver
    default = 8.741515e+02 #${inlet_T_fluid}
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []

  [outlet_pressure]
    type = Receiver
    default = 1.865956e+05 #${outlet_pressure_val}
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []
[]
(pbfhr/mark1/plant/ss1_combined.i)

The boundary conditions are modified appropriately to use the boundary information newly stored in those Postprocessors. Flux boundary conditions are utilized as they are naturally conservative in a finite volume method. The fluxes for the mass, momentum and energy equations are all provided, computed by the boundary conditions based on the mass flow rates, local density and inlet surface area.

    inlet_boundaries = 'bed_horizontal_bottom OR_horizontal_bottom'
    momentum_inlet_types = 'fixed-velocity fixed-velocity'
    momentum_inlet_function = '0 inlet_vel_y_fun; 0 0'
    energy_inlet_types = 'fixed-temperature heatflux'
    energy_inlet_function = 'T_inlet_fun 0'
    # so the flux BCs have to be used consistently across all equations

    # Outlet boundary conditions
    outlet_boundaries = 'bed_horizontal_top plenum_top OR_horizontal_top'
    momentum_outlet_types = 'fixed-pressure fixed-pressure fixed-pressure'
    pressure_function = 'pressure_out_fun pressure_out_fun pressure_out_fun'
(pbfhr/mark1/plant/ss1_combined.i)

In the other direction of the coupling, the boundary conditions that will be passed to SAM are collected using side integrals and flow rate postprocessors. These are executed at the end of each time step and collect the outlet flow conditions as well as the inlet pressure. The inlet temperature is also computed in case of a flow reversal.

[Postprocessors]
  [pressure_in]
    type = SideAverageValue
    boundary = 'bed_horizontal_bottom'
    variable = pressure
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []

  [mass_flow_out]
    type = VolumetricFlowRate
    boundary = 'bed_horizontal_top plenum_top OR_horizontal_top'
    advected_quantity = ${rho_fluid}
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []

  [T_flow_out]
    type = ParsedPostprocessor
    function = 'e_flow_out / mass_flow_out / cp_fluid'
    pp_names = 'e_flow_out mass_flow_out'
    constant_names = 'cp_fluid'
    constant_expressions = '2416'
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []

  [T_flow_in]
    type = ParsedPostprocessor
    function = '-e_flow_in_m / inlet_mdot / cp_fluid'
    pp_names = 'e_flow_in_m inlet_mdot'
    constant_names = 'cp_fluid'
    constant_expressions = '2416'
    execute_on = 'INITIAL TIMESTEP_END TRANSFER'
  []
[]
(pbfhr/mark1/plant/ss1_combined.i)

The Transfer system is once again leveraged, this time to send data to SAM. The modifications to the SAM input are detailed in the next section.

[Transfers]
  [send_flow_BCs]
    type = MultiAppPostprocessorVectorTransfer
    to_multi_app = primary
    from_postprocessors = 'pressure_in mass_flow_out T_flow_out T_flow_in'
    to_postprocessors = 'Core_inlet_pressure Core_outlet_mdot Core_outlet_T Core_inlet_T_reversal'
  []
[]
(pbfhr/mark1/plant/ss1_combined.i)

Modifications to the balance of plant 1D model

The initial SAM model of the Mk1-FHR models the entire primary and secondary loop as well as a selection of passive systems. A 1D model of the core is present in the primary loop, providing a heat source as well as estimating the coolant travel time in the core and the pressure drop from friction in the pebble bed. This 1D core component is removed in the coupled model, as it is replaced with a 2D RZ Pronghorn model of the core. The Transfer previously shown populates the following Receiver postprocessors:

[Postprocessors]
  [Core_outlet_mdot]
    type = Receiver
    default = 976
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []

  [Core_outlet_T]
    type = Receiver
    default = 950
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []

  [Core_inlet_pressure]
    type = Receiver
    default = 2e5
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []

  [Core_inlet_T_reversal]
    type = Receiver
    default = 850
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []
[]
(pbfhr/mark1/plant/ss2_primary.i)

SAM uses velocity rather than mass flow rates, so the core outlet velocity is computed from the mass flow rate obtained from Pronghorn.

[Postprocessors]
  [Core_outlet_rho]
    type = ComponentBoundaryVariableValue
    input = 'defueling(in)'
    variable = 'rho'
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []

  [Core_outlet_v]
    type = ParsedPostprocessor
    function = 'Core_outlet_mdot / Core_outlet_rho'
    pp_names = 'Core_outlet_mdot Core_outlet_rho'
    execute_on = 'INITIAL TIMESTEP_BEGIN TIMESTEP_END TRANSFER'
  []
[]
(pbfhr/mark1/plant/ss2_primary.i)

These Receivers are then fed into dedicated coupling components, placed at the inlet and outlet of the core.

[Components]
  [core_inlet]
    # we pass V and T, we get p and back T
    type = CoupledPPSTDV
    input = 'fueling(out)'
    eos = eos
    postprocessor_pbc = Core_inlet_pressure
    postprocessor_Tbc = Core_inlet_T_reversal
  []

  [core_outlet]
    #we pass p and get v and T
    type = CoupledPPSTDJ
    input = 'defueling(in)'
    eos = eos
    v_bc = 1.86240832931
    T_bc = 9.229715e+02
    postprocessor_vbc = Core_outlet_v
    postprocessor_Tbc = Core_outlet_T
  []
[]
(pbfhr/mark1/plant/ss2_primary.i)

These components are connected to the reset of the primary using pipes, which were chosen arbitrarily for this model.

[Components]
  [fueling]
    type = PBOneDFluidComponent
    eos = eos
    position = '0 4.94445 -5.265'
    orientation = '0 0 1'
    A = ${area_inlet}
    Dh = 0.1
    length = 0.3
    n_elems = 2
    initial_T = 885.838
    initial_P = 202912
    initial_V = 2.92686
    WF_user_option = User
    User_defined_WF_parameters = '0.0 0.0 0.1'
  []

  [defueling]
    #Upper Hot salt extraction pipe
    type = PBOneDFluidComponent
    position = '0 4.94445 -0.86'
    orientation = '0 0 -1'
    length = 0.3
    eos = eos
    A = 1
    Dh = 0.1
    n_elems = 11
    initial_V = 0.500611
    initial_T = 950
    initial_P = 188485
  []
[]
(pbfhr/mark1/plant/ss2_primary.i)

The core bypass flow is modeled by SAM, with both its inlet and outlet in the primary outside of the core model.

How to run the inputs

The simulation could be run directly in one step as a coupled eigenvalue (neutronics) - relaxation to steady-state transient (fluids) calculation. However this is not efficient as it would require the coupled multiphysics problem to both perform a long transient to heat up the components of the core and to converge the SAM-Pronghorn coupling on every neutronics - thermal fluids coupling iteration.

Instead we suggest to first converge the SAM-Pronghorn primary loop model separately, then converge the full Griffin-Pronghorn-SAM restarting the thermal fluids calculation. We may also initialize the SAM primary loop simulation before coupling it to Pronghorn. To do this, we run:


mpirun -n 8 ~/projects/blue_crab/blue_crab-opt -i ss2_primary.i
mpirun -n 8 ~/projects/blue_crab/blue_crab-opt -i ss1_combined_initial.i
mpirun -n 8 ~/projects/blue_crab/blue_crab-opt -i ss0_neutrons.i

To remove either of the two first steps from the workflow, the restart_file_base [Problem] parameter in the SAM input and the restart_from_file_var [Variables] parameters in the Pronghorn should be commented out.

Relaxation to steady state transient

We present in this section sample results for the coupling of the coupled SAM-Pronghorn plant simulation in a relaxation to steady state transient. Both simulations start reasonably initialized, and come to an equilibrium as the mass flow rates and the pressure drops in the core and in the various 1D components adjust for the head output by the pumps in the SAM model.

The core distributions are overlaid on the 1D results in Paraview. The 1D component widths are artificially inflated in Paraview, for legibility. Both the pressure and salt temperature show continuity at the interface between SAM and Pronghorn, ensured by the boundary conditions.

Salt temperature through the Mk1-FHR plant model

Pressure through the Mk1-FHR plant model

Acknowledgements

The model was created with support from Daniel Nunez at ANL and Cole Mueller at INL.

References

No citations exist within this document.