# Axial Relocation User Object

Tracks mass movement due to axial relocation of fuel during a Loss of Coolant Accident

## Description

AxialRelocationUserObject calculates movement of mass throughout a fuel rod during Loss of Coolant Accident (LOCA) conditions. First the effective packing fraction of a crumbled mixture of two sizes of particles (larger fragments and smaller pulvers) is calculated, which determines how effective the packing of the crumbled fuel is in the distented regions of the cladding. Once the effective packing fraction is determined the movement of the mass throughout the axial layers is computed. The model was original developed by Jernkvist and Massih (2015) for coupling to FRAPTRAN-1.5. FRAPTRAN-1.5 simulates fuel rods as numerous 1D radial slices with generalized plain strain characteristics in the axial direction. Therefore, in the implementation of the axial relocation model in Bison the 1.5D capabilities have been utilized.

## Fuel Fragmentation and Packing Fraction

Prior to axially relocating fuel fragments, the amount and size of such fragments need to be quantified. In the model two fuel particle sizes are assumed and defined as fragments and pulvers. Fragments are larger fuel particles that exist throughout the irradiation history of the rod and begin forming due to fracture during the first rise to power. Pulvers are the smaller fuel particles that only form at high local burnups due to the disintegration of the high burnup fuel structure at the pellet periphery. For extremely high burnup rods there is the potential for the entire pellet to pulverize. The number of radial fragments formed in fresh fuel is obtained by Coindreau et al. (2013): (1) where is the number of radial fragments formed in fresh fuel subjected to a power at beginning of life, is the maximum linear heat generation rate experienced by the fuel in kW/m. Using the initial number of radial fragments calculated above, the number of radial fragments in irradiated fuel is determined by: (2) where is the fuel pellet average burnup in MWd/kgHM. Notice that the above equations limit the maximum number of radial fragments to 16. Once the number of radial fragments in irradiated fuel is known the characteristic side length of the fragments is calculated by: (3) where is the characteristic side length of the fragments and is the as-fabricated diameter of the fuel pellet. Before the packing fraction can be calculated the amount of pulverized fuel needs to be determined. This is calculated by UO2Pulverization. Since the characteristics of pulverized fuel are not well known, Jernkvist and Massih (2015) argue that the characteristic side length of the pulvers () can be treated as a model parameter having a default value of 100 m. The mass fraction of pulvers () can be determined from the calculated volume of pulverized fuel to the known total volume of fuel. The mass fraction of fragments is then simply given by .

Once the mass fractions of both fragments and pulvers are known, an effective packing fraction can be determined using the methodology proposed by Westman (2015). The effective packing fraction () is determined by using an internal Newton iteration loop to solve the following: (4) where (5)

(6) and is a parameter that depends upon the difference in shape between the fragments and pulvers. In the preceding equations and represent the packing fraction if the crumbled bed of fuel particles was entirely made up of fragments or pulvers respectively. Jernkvist and Massih suggest values of and . The parameter is calculated by: (7) where and are the equivalent packing diameters of the pulvers and fragments. The equivalent packing diameter is determined via: (8) where is the sphericity of the particle and is the volume of the particle. In this model Jernkvist and Massih (2015) propose that fragments are prismatic (triangular) in shape and pulvers are octahedral in shape. For a prismatic particle (fragments) whose height is equal to its characteristic side length, and . For octahedral particles (pulvers), and .

## Axial Relocation Algorithm

Since this axial relocation model was originally developed to be coupled to FRAPTRAN-1.5 a layered approach was taken. Assuming the layers are indexed by and there are layers the condition on collapse of the fuel in a given layer is: (9) where is the initial as-fabricated fuel mass in the layer and represents the mass in the layer if it is completely filled with crumbled fuel: (10) where is the equivalent packing fraction in the layer, is the density of the fuel, is the height of the layer, and is the cladding inner radius for the layer. Two constraints are applied to prevent unrealistic phenomena from occurring. First, relocation can only occur in the downward direction, and second, the amount of fuel that can relocate into a layer is limited by the available mass of fuel existing in all layers above it. These lower () and upper () constraints can be cast into the following equations: (11)

(12) where the superscript represents the mass in the j:th layer at the beginning of the timestep () and represents the available mass to be relocated into the k:th layer. Two additional constraints are placed on the movement of mass in Jernkvist and Massih's model: (1) a residual amount of the initial fuel mass will remain in the layer throughout the simulation (denoted by ) and (2) the fuel-to-cladding gap must be large enough to accommodate fuel movement (denoted by ). The algorithm is divided into two loops, Figure 1, with the first beginning at the top layer and moving downwards to determine the amount of available mass to be relocated in each layer followed by a loop from the bottom layer to the top that enforces the upper and lower constraints while relocating the mass to the appropriate layers. In the second loop the and terms represent a nested conditional statement in the code.

Figure 1: The two loops representing the axial relocation algorithm.

The algorithm for the two branches of the code is shown in Figure 1 for clarity. The left loop is executed first which determines the amount of relocatable mass that can accommodated in each layer. The right loop enforces the constraints and moves the mass to the appropriate layers. Reproduced from Jernkvist and Massih (2015).

## Example Input Syntax


[./axial_relocation]
type = AxialRelocationUserObject
direction = y
variable = temperature #Any variable could be provided here as an input variable is not required by the model but is required by the LayeredAverage base class.
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'nonlinear timestep_end'
output_option = PACKING_FRACTION
[../]
(test/tests/axial_relocation/packing_fraction.i)

## Input Parameters

• directionThe direction of the layers.

C++ Type:MooseEnum

Description:The direction of the layers.

• layered_average_burnupName of the UserObject that contains the layered average burnup.

C++ Type:UserObjectName

Description:Name of the UserObject that contains the layered average burnup.

• max_linear_heat_generation_rateName of the Postprocessor that holds the max linear heat generation rate over time in W/m

C++ Type:PostprocessorName

Description:Name of the Postprocessor that holds the max linear heat generation rate over time in W/m

• layered_pulverized_fuel_volumeName of the UserObject that contains the layered average pulverized fuel volume.

C++ Type:UserObjectName

Description:Name of the UserObject that contains the layered average pulverized fuel volume.

• fuel_pin_geometryName of the UserObject that reads the pin geometry from the mesh.

C++ Type:UserObjectName

Description:Name of the UserObject that reads the pin geometry from the mesh.

• layered_average_pellet_radiusName of the UserObject that contains the layered average pellet outer radius.

C++ Type:UserObjectName

Description:Name of the UserObject that contains the layered average pellet outer radius.

• variableThe name of the variable that this object operates on

C++ Type:std::vector

Description:The name of the variable that this object operates on

C++ Type:UserObjectName

Description:Name of the UserObject that contains the layered average cladding inner radius.

### Required Parameters

• fragment_packing_fraction0.69The packing fraction of large fragements of fuel.

Default:0.69

C++ Type:double

Description:The packing fraction of large fragements of fuel.

• residual_gap_size2e-06The residual gap remaining in layers that have crumbled.

Default:2e-06

C++ Type:double

Description:The residual gap remaining in layers that have crumbled.

• maximum_iterations10Maximum number of sub-newton iterations

Default:10

C++ Type:unsigned int

Description:Maximum number of sub-newton iterations

• output_optionMASS_FRACTIONThe layered average quantity that is to be output.

Default:MASS_FRACTION

C++ Type:MooseEnum

Description:The layered average quantity that is to be output.

• density10431As-fabricated fuel pellet density

Default:10431

C++ Type:double

Description:As-fabricated fuel pellet density

• pulver_characteristic_length0.0001The characteristic length of the pulvers.

Default:0.0001

C++ Type:double

Description:The characteristic length of the pulvers.

• cumulativeFalseWhen true the value in each layer is the sum of the values up to and including that layer

Default:False

C++ Type:bool

Description:When true the value in each layer is the sum of the values up to and including that layer

• pulver_packing_fraction0.72The packing fraction of the smaller pulvers of fuel.

Default:0.72

C++ Type:double

Description:The packing fraction of the smaller pulvers of fuel.

• boundsThe 'bounding' positions of the layers i.e.: '0, 1.2, 3.7, 4.2' will mean 3 layers between those positions.

C++ Type:std::vector

Description:The 'bounding' positions of the layers i.e.: '0, 1.2, 3.7, 4.2' will mean 3 layers between those positions.

• sample_typedirectHow to sample the layers. 'direct' means get the value of the layer the point falls in directly (or average if that layer has no value). 'interpolate' does a linear interpolation between the two closest layers. 'average' averages the two closest layers.

Default:direct

C++ Type:MooseEnum

Description:How to sample the layers. 'direct' means get the value of the layer the point falls in directly (or average if that layer has no value). 'interpolate' does a linear interpolation between the two closest layers. 'average' averages the two closest layers.

• nonrelocatable_fuel_fraction0.01The fraction of the initial fuel in a layer that cannot relocate.

Default:0.01

C++ Type:double

Description:The fraction of the initial fuel in a layer that cannot relocate.

• gap_thickness_threshold0.0002The threshold gap thickness required for axial relocation.

Default:0.0002

C++ Type:double

Description:The threshold gap thickness required for axial relocation.

• average_radius1When using 'average' sampling this is how the number of values both above and below the layer that will be averaged.

Default:1

C++ Type:unsigned int

Description:When using 'average' sampling this is how the number of values both above and below the layer that will be averaged.

• num_layersThe number of layers.

C++ Type:unsigned int

Description:The number of layers.

• execute_onTIMESTEP_ENDThe list of flag(s) indicating when this object should be executed, the available options include NONE, INITIAL, LINEAR, NONLINEAR, TIMESTEP_END, TIMESTEP_BEGIN, FINAL, CUSTOM.

Default:TIMESTEP_END

C++ Type:ExecFlagEnum

Description:The list of flag(s) indicating when this object should be executed, the available options include NONE, INITIAL, LINEAR, NONLINEAR, TIMESTEP_END, TIMESTEP_BEGIN, FINAL, CUSTOM.

• output_iteration_infoFalseSet true to output sub-newton iteration information

Default:False

C++ Type:bool

Description:Set true to output sub-newton iteration information

• tolerance1e-15Absolute convergence tolerance for sub-newton iteration

Default:1e-15

C++ Type:double

Description:Absolute convergence tolerance for sub-newton iteration

• blockThe list of block ids (SubdomainID) that this object will be applied

C++ Type:std::vector

Description:The list of block ids (SubdomainID) that this object will be applied

### Optional Parameters

• enableTrueSet the enabled status of the MooseObject.

Default:True

C++ Type:bool

Description:Set the enabled status of the MooseObject.

• use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Default:False

C++ Type:bool

Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

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

C++ Type:std::vector

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

• allow_duplicate_execution_on_initialFalseIn the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).

Default:False

C++ Type:bool

Description:In the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).

• seed0The seed for the master random number generator

Default:0

C++ Type:unsigned int

Description:The seed for the master random number generator

• implicitTrueDetermines whether this object is calculated using an implicit or explicit form

Default:True

C++ Type:bool

Description:Determines whether this object is calculated using an implicit or explicit form