Example 6a: Displacement-controlled contact problem with elastic soil
Model Description
This example demonstrates frictional contact between a solid block and elastic soil in MASTODON. A 6 inch cubic block is centered on top of a 4 foot cubic block of soil. The top surface of the soil is free and the remaining surfaces are fixed in all directions. A uniform normal pressure of 5 psi is applied to the top of the smaller solid block and it is given a prescribed displacement in a direction parallel to the contact surface. The resulting normal and frictional forces at the interface of the two materials are then obtained and compared with analytical results.
Modeling in MASTODON
[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
type = FileMesh
file = contact_modified.e
patch_update_strategy = iteration #For contact
patch_size = 40
partitioner = centroid
centroid_partitioner_direction = y
[]
[GlobalParams<<<{"href": "../syntax/GlobalParams/index.html"}>>>]
displacements = 'disp_x disp_y disp_z'
[]
[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
[disp_x]
[]
[disp_y]
[]
[disp_z]
[]
[]
[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
[vel_x]
[]
[accel_x]
[]
[accel_y]
[]
[vel_y]
[]
[vel_z]
[]
[accel_z]
[]
[nor_forc]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
[]
[tang_forc_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
[]
[]
[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
[TensorMechanics<<<{"href": "../syntax/Kernels/TensorMechanics/index.html"}>>>]
use_displaced_mesh<<<{"description": "Whether to use displaced mesh in the kernels"}>>> = true
displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
[]
[gravity]
type = Gravity<<<{"description": "Apply gravity. Value is in units of acceleration.", "href": "../source/kernels/Gravity.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
value<<<{"description": "Value multiplied against the residual, e.g. gravitational acceleration"}>>> = -386.09
[]
[inertia_x]
type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
velocity<<<{"description": "velocity variable"}>>> = vel_x
acceleration<<<{"description": "acceleration variable"}>>> = accel_x
beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 0.0
[]
[inertia_y]
type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
velocity<<<{"description": "velocity variable"}>>> = vel_y
acceleration<<<{"description": "acceleration variable"}>>> = accel_y
beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 0.0
[]
[inertia_z]
type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
velocity<<<{"description": "velocity variable"}>>> = vel_z
acceleration<<<{"description": "acceleration variable"}>>> = accel_z
beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 0.0
[]
[]
[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
[nor_forc]
type = PenetrationAux<<<{"description": "Auxiliary Kernel for computing several geometry related quantities between two contacting bodies.", "href": "../source/auxkernels/PenetrationAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = nor_forc
quantity<<<{"description": "The quantity to recover from the available penetration information"}>>> = normal_force_magnitude
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 102
paired_boundary<<<{"description": "The boundary to be penetrated"}>>> = 103
[]
[tang_forc_x]
type = PenetrationAux<<<{"description": "Auxiliary Kernel for computing several geometry related quantities between two contacting bodies.", "href": "../source/auxkernels/PenetrationAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = tang_forc_x
quantity<<<{"description": "The quantity to recover from the available penetration information"}>>> = tangential_force_x
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 102
paired_boundary<<<{"description": "The boundary to be penetrated"}>>> = 103
[]
[accel_x]
type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
displacement<<<{"description": "displacement variable"}>>> = disp_x
velocity<<<{"description": "velocity variable"}>>> = vel_x
beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[vel_x]
type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
acceleration<<<{"description": "acceleration variable"}>>> = accel_x
gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[accel_y]
type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
displacement<<<{"description": "displacement variable"}>>> = disp_y
velocity<<<{"description": "velocity variable"}>>> = vel_y
beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[vel_y]
type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
acceleration<<<{"description": "acceleration variable"}>>> = accel_y
gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[accel_z]
type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_z
displacement<<<{"description": "displacement variable"}>>> = disp_z
velocity<<<{"description": "velocity variable"}>>> = vel_z
beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[vel_z]
type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_z
acceleration<<<{"description": "acceleration variable"}>>> = accel_z
gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
[]
[]
[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
[fix_x_soil]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 100
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
[fix_y_soil]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 100
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
[fix_z_soil]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 100
value<<<{"description": "Value of the BC"}>>> = 0.0
[]
[concrete_pressure]
type = Pressure<<<{"description": "Applies a pressure on a given boundary in a given direction", "href": "../source/bcs/Pressure.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 101
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
component<<<{"description": "The component for the pressure"}>>> = 2
factor<<<{"description": "The magnitude to use in computing the pressure"}>>> = 5 #psi
[]
[top_x]
type = PresetDisplacement<<<{"description": "Prescribe the displacement on a given boundary in a given direction.", "href": "../source/bcs/PresetDisplacement.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 1000
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
velocity<<<{"description": "The velocity variable."}>>> = vel_x
acceleration<<<{"description": "The acceleration variable."}>>> = accel_x
function<<<{"description": "Function describing the displacement."}>>> = loading_bc
[]
[]
[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
[loading_bc]
type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
data_file<<<{"description": "File holding CSV data"}>>> = 'input_motion.csv'
format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = columns
[]
[]
[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
[elasticity_tensor_block]
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 4e6 #psi
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.25
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[strain_block]
type = ComputeFiniteStrain<<<{"description": "Compute a strain increment and rotation increment for finite strains.", "href": "../source/materials/ComputeFiniteStrain.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[stress_block]
type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
[]
[den_block]
type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
prop_names<<<{"description": "The names of the properties this material will have"}>>> = density
prop_values<<<{"description": "The values associated with the named properties"}>>> = 0.0002248 #slug/in^3
[]
[elasticity_tensor_soil]
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1.3983e+05 #psi
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.3
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
[]
[strain_soil]
type = ComputeFiniteStrain<<<{"description": "Compute a strain increment and rotation increment for finite strains.", "href": "../source/materials/ComputeFiniteStrain.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[stress_soil]
type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
[]
[den_soil]
type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
prop_names<<<{"description": "The names of the properties this material will have"}>>> = density
prop_values<<<{"description": "The values associated with the named properties"}>>> = 0.0001356 #slug/in^3 commented before I got it
[]
[]
[Contact<<<{"href": "../syntax/Contact/index.html"}>>>]
[leftright]
secondary<<<{"description": "The list of boundary IDs referring to secondary sidesets"}>>> = 102
primary<<<{"description": "The list of boundary IDs referring to primary sidesets"}>>> = 103
model<<<{"description": "The contact model to use"}>>> = coulomb
formulation<<<{"description": "The contact formulation"}>>> = penalty
normalize_penalty<<<{"description": "Whether to normalize the penalty parameter with the nodal area."}>>> = true
friction_coefficient<<<{"description": "The friction coefficient"}>>> = 0.7
penalty<<<{"description": "The penalty to apply. This can vary depending on the stiffness of your materials"}>>> = 1e5
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[]
[Preconditioning<<<{"href": "../syntax/Preconditioning/index.html"}>>>]
[andy]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
[]
[]
[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
[nor_forc]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../source/postprocessors/NodalSum.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = nor_forc
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 102
[]
[tang_forc_x]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../source/postprocessors/NodalSum.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = tang_forc_x
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 102
[]
[dispx]
type = NodalExtremeValue<<<{"description": "Finds either the min or max elemental value of a variable over the domain.", "href": "../source/postprocessors/NodalExtremeValue.html"}>>>
value_type<<<{"description": "Type of extreme value to return. 'max' returns the maximum value. 'min' returns the minimum value. 'max_abs' returns the maximum of the absolute value."}>>> = max
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '2'
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = disp_x
[]
[]
[Controls<<<{"href": "../syntax/Controls/index.html"}>>>]
[inertia_switch]
type = TimePeriod<<<{"description": "Control the enabled/disabled state of objects with time.", "href": "../source/controls/TimePeriod.html"}>>>
start_time<<<{"description": "The time at which the objects are to be enabled/disabled."}>>> = 0.9
end_time<<<{"description": "The time at which the objects are to be enable/disabled."}>>> = 1
disable_objects<<<{"description": "A list of object tags to disable."}>>> = '*/inertia_x */inertia_y */inertia_z */vel_x */vel_y */vel_z */accel_x */accel_y */accel_z'
set_sync_times<<<{"description": "Set the start and end time as execute sync times."}>>> = true
[]
[]
[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package'
petsc_options_value = 'lu superlu_dist'
line_search = 'none'
start_time = 0.9
end_time = 2.5
dt = 0.005
dtmin = 0.001
nl_abs_tol = 1e-1
nl_rel_tol = 1e-4
l_tol = 1e-2
l_max_its = 20
timestep_tolerance = 1e-3
[]
[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
print_linear_residuals<<<{"description": "Enable printing of linear residuals to the screen (Console)"}>>> = false
[screen]
type = Console<<<{"description": "Object for screen output.", "href": "../source/outputs/Console.html"}>>>
max_rows<<<{"description": "The maximum number of postprocessor/scalar values displayed on screen during a timestep (set to 0 for unlimited)"}>>> = 1
[]
[]
(examples/ex06a/psf_grav.i)The mesh used in this model was generated externally using the mesh generation software, Cubit. MASTODON imports the mesh shown in Figure 1 using the FileMesh
type specified in the Mesh
block. Details regarding supported mesh file types can be found at GettingStarted.

Figure 1: Input model in MASTODON.
The displacement variables are defined in the Variables
block. The accelerations, velocities, normal and tangential (frictional) forces are defined as auxiliary variables in the AuxVariables
block.
TensorMechanics and InertialForce kernels are used to model the dynamics of the 3D solid elements. The Gravity
block is specified in Kernels
in order to apply gravitational force to the entire model. The Newmark time integration parameters used in this problem correspond to the Newmark's average acceleration method, i.e. beta = 0.25
and gamma = 0.5
and damping is ignored.
The ComputeIsotropicElasticityTensorBeam block is used to create the elasticity tensor of the solid block and the elastic soil, using Young's Modulus and Poisson's ratio. The stresses and strain are calculated using ComputeFiniteStrainElasticStress and ComputeFiniteStrain. The densities are assigned to the solid block and the soil using GenericConstantMaterial.
In the soil block, the top surface is free and all other surfaces are fixed in every direction. A uniform vertical pressure of 5 psi is applied to the top surface of the solid block and it is given the prescribed displacement history shown in Figure 2.
Figure 2: Input displacement of the block
Contact is defined in MASTODON using the Contact
block. This model is simulating Coulomb friction, with a coefficient of friction value equal to 0.7. The formulation implemented and demonstrated in this example uses a master/slave concept in which the nodes of the slave boundary are restricted by the nodes of the master surface boundary. Penetration is enforced using a penalty factor which is inversely related to the amount of penetration allowed (large penalty factor results in small amount of penetration and vice versa). The factor used in this example is 1e5.
[Contact<<<{"href": "../syntax/Contact/index.html"}>>>]
[leftright]
secondary<<<{"description": "The list of boundary IDs referring to secondary sidesets"}>>> = 102
primary<<<{"description": "The list of boundary IDs referring to primary sidesets"}>>> = 103
model<<<{"description": "The contact model to use"}>>> = coulomb
formulation<<<{"description": "The contact formulation"}>>> = penalty
normalize_penalty<<<{"description": "Whether to normalize the penalty parameter with the nodal area."}>>> = true
friction_coefficient<<<{"description": "The friction coefficient"}>>> = 0.7
penalty<<<{"description": "The penalty to apply. This can vary depending on the stiffness of your materials"}>>> = 1e5
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[]
(examples/ex06a/psf_grav.i)Static analysis is performed by turning off inertial terms for a certain time period in the Controls
block. It stabilizes the system under the gravitational loading and pressure to perform dynamic analysis. The Executioner
and the Postprocessors
blocks are provided to solve the nonlinear system and extract the required data.
Results
The graph for the frictional force as a function of displacement obtained from MASTODON is shown in Figure 3.
Figure 3: Graph showing the frictional force as a function of displacement for Columb Friction Model
The graph for the normal force as a function of time obtained from MASTODON is shown in Figure 4.
Figure 4: Graph showing the normal force as a function of time for Columb Friction Model
Theoretical Solution
Normal Force = density x volume x gravity + pressure x area = 198.7473 lbf
Frictional Force = coefficient of friction x Normal Force = 139.123 lbf
The results from MASTODON are in agreement with the theoretical calculations.