forked from mrkearden/abaqus_umat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UMAT.F90
133 lines (103 loc) · 5.73 KB
/
UMAT.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
!------------------------------------------------------------------------------
! The template for including a material model definition written in the form of
! an Abaqus user subroutine (UMAT). The arguments which can be supposed to be
! supported by Elmer are capitalized:
!------------------------------------------------------------------------------
SUBROUTINE UMAT(STRESS, STATEV, DDSDDE, SSE, SPD, SCD, &
rpl, ddsddt, drplde, drpldt, STRAN, DSTRAN, TIME, DTIME, TEMP, dTemp, &
predef, dpred, CMNAME, NDI, NSHR, NTENS, NSTATEV, PROPS, NPROPS, &
coords, drot, pnewdt, celent, DFRGRD0, DFRGRD1, NOEL, NPT, layer, kspt, &
kstep, kinc)
!------------------------------------------------------------------------------
Use Types
IMPLICIT NONE
REAL(KIND=dp), INTENT(INOUT) :: STRESS(NTENS)
! Requirement for Elmer: At the time of calling the Cauchy stress T_n before
! the time/load increment is given
! Requirement for umat: The stress T_{n+1}^{(k)} corresponding to the
! current approximation of the strain increment (DSTRAN) must be returned.
! If the strain increment is defined to be zero in the beginning of the
! nonlinear iteration, Elmer will generate a candidate for the strain increment
! by assuming purely elastic increment characterized by DDSDDE.
REAL(KIND=dp), INTENT(INOUT) :: STATEV(NSTATEV)
! Requirement for Elmer: The state variables Q_n as specified at the
! previous time/load level for converged solution are given.
! Requirement for umat: The state variables Q_{n+1}^{(k)} corresponding to
! the current approximation of the strain increment must be returned. If
! convergence is attained, these values will be saved and associated with the
! converged solution (cf. the input values)
REAL(KIND=dp), INTENT(OUT) :: DDSDDE(NTENS,NTENS)
! The derivative of (Cauchy) stress response function with respect to the
! strain evaluated for the current approximation must be returned
REAL(KIND=dp), INTENT(INOUT) :: SSE, SPD, SCD
! Requirement for Elmer: Provide specific strain energy (sse), plastic
! dissipation (spd) and creep dissipation (scd) at the previous time/load
! level (these are supposed to be declared to be state variables)
! Requirement for umat: The values of the energy variables corresponding to
! the current approximation may be returned
REAL(KIND=dp), INTENT(OUT) :: rpl
! The mechanical heating power (volumetric)
REAL(KIND=dp), INTENT(OUT) :: ddsddt(NTENS), drplde(NTENS), drpldt
REAL(KIND=dp), INTENT(IN) :: STRAN(NTENS)
! This gives the strains before the time/load increment.
! The strain can be computed from the deformation gradient, so this
! argument can be considered to be redundant. Elmer provides
! this information anyway. Abaqus assumes that the logarithmic strain
! is used, but Elmer may also use other strain measures.
REAL(KIND=dp), INTENT(IN) :: DSTRAN(NTENS)
! The current candidate for the strain increment to obtain the current
! candidate for the stress. In principle this could be computed from the
! deformation gradient; cf. the variable stran.
REAL(KIND=dp), INTENT(IN) :: TIME(2)
! Both entries give time before the time/load increment (the time for the last
! converged solution
REAL(KIND=dp), INTENT(IN) :: DTIME
! The time increment
REAL(KIND=dp), INTENT(IN) :: TEMP
! Temperature before the time/load increment
REAL(KIND=dp), INTENT(IN) :: dtemp
! Temperature increment associated wíth the time/load increment. Currently
! Elmer assumes isothermal conditions during the load increment.
REAL(KIND=dp), INTENT(IN) :: predef(1), dpred(1)
! These are just dummy variables for Elmer
CHARACTER(len=80), INTENT(IN) :: CMNAME
! The material model name
INTEGER, INTENT(IN) :: NDI
! The number of direct stress components
INTEGER, INTENT(IN) :: NSHR
! The number of the engineering shear strain components
INTEGER, INTENT(IN) :: NTENS
! The size of the array containing the stress or strain components
INTEGER, INTENT(IN) :: NSTATEV
! The number of state variables associated with the material model
REAL(KIND=dp), INTENT(IN) :: PROPS(NPROPS)
! An array of material constants
INTEGER, INTENT(IN) :: NPROPS
! The number of the material constants
REAL(KIND=dp), INTENT(IN) :: coords(3)
! The coordinates of the current point could be specified
REAL(KIND=dp), INTENT(IN) :: drot(3,3)
! No support for keeping track of rigid body rotations
! (the variable is initialized to the identity)
REAL(KIND=dp), INTENT(INOUT) :: pnewdt
! Currently, suggesting a new size of time increment does not make any impact
REAL(KIND=dp), INTENT(IN) :: celent
! The element size is not yet provided by Elmer
REAL(KIND=dp), INTENT(IN) :: DFRGRD0(3,3)
! The deformation gradient before the time/load increment (at the previous
! time/load level for converged solution)
REAL(KIND=dp), INTENT(IN) :: DFRGRD1(3,3)
! The deformation gradient corresponding to the current approximation
! (cf. the return value of STRESS variable)
INTEGER, INTENT(IN) :: NOEL
! The element number
INTEGER, INTENT(IN) :: NPT
! The integration point number
INTEGER, INTENT(IN) :: layer, kspt, kstep, kinc
! kstep and kinc could be provided to give information on the incrementation
! procedure
!------------------------------------------------------------------------------
! ADD THE MATERIAL MODEL DEFINITION HERE TO MAKE THIS FUNCTIONAL
!------------------------------------------------------------------------------
END SUBROUTINE UMAT
!------------------------------------------------------------------------------