**USF Fortran File:**`USF_GetFrictionHeating.f90`

**USF Name:**`getFrictionLoads`

**Required Input Variable(s):**None

The function `getFrictionLoads`

replaces the old function `getFrictionHeat`

, which still remains in the svn because of compability issues (from revision 6834 on). It is recommended to switch to this newer version. The two user functions are however different since `getFrictionLoads`

gives a result in W whereas `getFrictionHeat`

gives a result in W/m2. Therefore, they have to be used in a different way (see the sif example).

This approach is based on the coupling of surface heat production to the residual of the Stokes solver - the first three components of the residual represent the nodal forces acting on the surface. This is the natural way of coupling in FEM.

Note, in the case of a restart-run, the (Navier-)Stokes Solver needs to exist in the sif-file (option `Exec Solver = Never`

is sufficient), otherwise the Loads are not found.

Note, the function has not yet been tested in the case of basal melting, but should be working.

Sometimes negative values for the friction loads are calculated and set to zero in the source code. This has not yet been fully understood and could lead to some instabilities, what has, however, not yet been observed.

Output can be produced by using the ForceToStress Solver (see below).

Consistent units for capacity and conductivity are needed.

Attention, the keyword “friction heat” in the body section does not make reference to this heat source - but to “strain heat” or “deformational heat”.

!Normals are needed Solver x Equation = "NormalVector" Exec Solver = Before Simulation Procedure = "ElmerIceSolvers" "ComputeNormalSolver" Variable = String "Normal Vector" Variable DOFs = 2 Optimize Bandwidth = Logical False ComputeAll = Logical False End !add in NS Solver Section Exported Variable 1 = Flow Solution Loads[Fx:1 Fy:1 Fz:1 CEQ Residual:1 ] Calculate Loads = Logical True !add to Boundary Conditions BED Mass Consistent Normals = Logical True ComputeNormal = Logical True !needed for ComputeNormal Temp Load = Variable Velocity 1 Real Procedure "ElmerIceUSF" "getFrictionLoads" !geothermal heat flux (as usual - not modified as it was the case with the earlier version) Temp Flux BC = Logical True (needed when geothermal flux is used) Temp Heat Flux = Variable Coordinate 1 Real MATC "0.040*(31556926.0)*1.0E-06" !40mW/m2

Output can be produced with the `ForceToStress`

Solver. Sometimes negative values are calculated, which should be set to zero since they are only numerical artefacts. Bear in mind that the variable names here are just for output and can be changed, but should not interfere with with naming of the Temperature load variable.

!variable created for output purpose, to be executed at the beginning ONLY on the BED Solver x Equation = "Dummy" Procedure = File "DummySolver" "DummySolver" Variable = String "Friction Load" !variable created for output purpose Variable DOFs = 1 End !after NS, to be executed ONLY on the BED Solver x Equation = "ForceToStress" Procedure = File "ElmerIceSolvers" "ForceToStress" Variable = String "Friction Heating" Variable DOFs = 1 Force Variable Name = String "Friction Load" Linear System Solver = "Iterative" Linear System Iterative Method = "BiCGStab" Linear System Max Iterations = 500 Linear System Convergence Tolerance = 1.0E-05 Linear System Abort Not Converged = False Linear System Preconditioning = "ILU0" Linear System Residual Output = 1 End !add to Boundary Conditions BED Friction Load = Variable Velocity 1 Real Procedure "ElmerIceUSF" "getFrictionLoads"

An example can be found in [ELMER_TRUNK]/elmerice/Tests/FrictionHeat.