1!-------------------------------------------------------------
2! Gives the x(or y) component of tangential reaction force
3! multiplied by a friction coefficient.
4!
5! The subroutine is needed because when we use the model for
6! friction force where the nodal loads in normal direction is
7! multiplied by a friction coefficient we end in problems for
8! normal-tangential coordinate system. There we need to eliminate
9! the tangential reaction force from the loads.
10!-------------------------------------------------------------
11  FUNCTION TangentForce( Model, n, t ) RESULT(f)
12    USE DefUtils
13    IMPLICIT NONE
14
15    TYPE(Model_t) :: Model
16    INTEGER :: n
17    REAL(KIND=dp) :: t,f
18!-------------------------------------------------------------
19    INTEGER :: i,j,LoadDofs
20    REAL(KIND=dp) :: Normal(3), Force(3),NormalForce,Mu
21    TYPE(Element_t), POINTER :: Element
22    TYPE(Nodes_t) :: ElementNodes
23    TYPE(Variable_t), POINTER :: LoadVar
24    INTEGER, POINTER :: LoadPerm(:)
25    REAL(KIND=dp), POINTER :: LoadValues(:)
26    LOGICAL :: Visited = .FALSE.
27
28    SAVE Visited, ElementNodes, LoadPerm, LoadDofs, LoadValues
29
30
31    IF( .NOT. Visited ) THEN
32      LoadVar => VariableGet( Model % Variables,'Displacement Loads')
33      IF( .NOT. ASSOCIATED( LoadVar ) ) THEN
34        CALL Fatal('TangentForce','No > Displacement Loads < given!')
35      END IF
36      LoadDofs = LoadVar % Dofs
37      IF( LoadDofs /= 2 ) THEN
38        CALL Fatal('TangentForce','Implemented only for 2D!')
39      END IF
40
41      LoadValues => LoadVar % Values
42      LoadPerm => LoadVar % Perm
43    END IF
44
45    Mu = 0.5_dp
46
47    Element => Model % CurrentElement
48    CALL GetElementNodes( ElementNodes, Element )
49    Normal = NormalVector( Element, ElementNodes, 0.0d0, 0.0d0 )
50
51    Force = 0.0_dp
52    DO i=1,LoadDofs
53      j = LoadPerm(n)
54      IF( j == 0 ) CYCLE
55      Force(i) = LoadValues( LoadDofs * (j-1) + i )
56    END DO
57
58    ! This sign convention seems to be consistent for outer normals
59    NormalForce = -SUM( Force * Normal )
60
61    f = Mu * NormalForce
62
63  END FUNCTION TangentForce
64!-------------------------------------------------------------
65
66