-
Notifications
You must be signed in to change notification settings - Fork 8
/
umat_viscoelastic.for
86 lines (80 loc) · 2.71 KB
/
umat_viscoelastic.for
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
c ======================================================================
c User Subroutine UMAT for Abaqus viscoelastic material
c By Irfan Habeeb CN (PhD, Technion - IIT)
c using the formulation https://imechanica.org/files/Kelvin-Voigt-Code-Development_0.pdf
c ======================================================================
subroutine umat(stress,statev,ddsdde,sse,spd,scd,
1 rpl,ddsddt,drplde,drpldt,
2 stran,dstran,time,dtime,temp,dtemp,predef,dpred,cmname,
3 ndi,nshr,ntens,nstatv,props,nprops,coords,drot,pnewdt,
4 celent,dfgrd0,dfgrd1,noel,npt,layer,kspt,kstep,kinc)
C
include 'aba_param.inc'
C
character*80 cmname
dimension stress(ntens),statev(nstatv),
1 ddsdde(ntens,ntens),
2 ddsddt(ntens),drplde(ntens),
3 stran(ntens),dstran(ntens),time(2),predef(1),dpred(1),
4 props(nprops),coords(3),drot(3,3),dfgrd0(3,3),dfgrd1(3,3)
C
integer k1, k2
real E, nu, lambda, mu, S(6), D1(6,6), D2(6,6), D3(6,6)
C material properties
E = props(1) ! Young's modulus
nu = props(2) ! Poisson's ratio
eta = props(3) ! viscoelastic coef.
C Lame's parameters
lambda = E*nu/((1.0d0+nu)*(1.0d0-2.0d0*nu))
mu = E/(2.0d0*(1.0d0+nu))
c stiffness matrix with viscous effects
D1 = 0.d0
D2 = 0.d0
D3 = 0.d0
if (dtime .gt. 0.d0) then
do k1 = 1, ndi
do k2 = 1, ndi
D1(k1, k2) = lambda*(1.0d0 + 3.0d0*eta/(E*dtime))
D2(k1, k2) = lambda
end do
D1(k1, k1) = lambda*(1.0d0 + 3.0d0*eta/(E*dtime)) +
1 2.0d0*mu*(1.0d0 + eta/(mu*dtime))
D2(k1, k1) = lambda + 2.0d0*mu
D3(k1, k1) = -1.0d0
end do
c shear stress
do k1 = ndi+1, ndi+nshr
D1(k1, k1) = mu*(1.0d0 + eta/(mu*dtime))
D2(k1, k1) = mu
D3(k1, k1) = -1.0d0
end do
else
do k1 = 1, ndi
do k2 = 1, ndi
D1(k1, k2) = lambda
D2(k1, k2) = lambda
end do
D1(k1, k1) = lambda + 2.0d0*mu
D2(k1, k1) = lambda + 2.0d0*mu
D3(k1, k1) = -1.0d0
end do
do k1 = ndi+1, ndi+nshr
D1(k1, k1) = mu
D2(k1, k1) = mu
D3(k1, k1) = -1.0d0
end do
end if
c Stiffness matrix
ddsdde(1:ntens, 1:ntens) = D1(1:ntens, 1:ntens)
c stress in the previous step
S(1:ntens) = stress(1:ntens)
c Stress increment
do k1 = 1, ntens
do k2 = 1, ntens
stress(k1) = stress(k1) + D1(k1, k2) * dstran(k2) +
1 D2(k1, k2) * stran(k2) + D3(k1, k2) * S(k2)
end do
end do
c
return
end