# Thread: Umat simple viscoelastic model

1. Junior Member
Join Date
2007-07
Posts
1

## Umat simple viscoelastic model

At present I'm trying to create an UMAT for simple viscoelastic behavior.
I would like to implement the differential equation model ( as described in the finite element method Zienkiewicz chapter 3)

s = 2G(mu0*E + sum(mu_m*qm) (eq.1)

where

qdot + 1/lambdam*q = Edot

So for every new increment I have to calculate q_(n+1) and fill it in eq.1 and finally I calculate the jacobian.

So far I succeeded to implement all this, and it turned out that the subroutine works on 1 element.

Now I notice that in case ABAQUS needs more iterations I do not reach convergence.
So I'm wondering what might go wrong during these iterations. What about updates of the statev vector during the iterations?

Below I copy the UMAT file that I made:

SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,
2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CM NAME,
3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNE WDT,
4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KIN C)
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),DFGR D1(3,3)
DIMENSION DSTRES(6),D(3,3)

DOUBLE PRECISION ONE, TWO, THREE
DOUBLE PRECISION KQN(6), KQ(6)
DOUBLE PRECISION K, G, LAMBDA1, MU0, MU1, ID(3,3)
DOUBLE PRECISION TERM1, KE(6), KDE(6), KEM, KDEM

INTEGER K1, K2

C VARIABLES
ONE = 1.0
TWO = 2.0
THREE = 3.0

ID(1,1) = 2d0/3d0
ID(1,2) = -1d0/3d0
ID(1,3) = -1d0/3d0
C
C
ID(2,1) = -1d0/3d0
ID(2,2) = 2d0/3d0
ID(2,3) = -1d0/3d0
C
C
ID(3,1) = -1d0/3d0
ID(3,2) = -1d0/3d0
ID(3,3) = 2d0/3d0

C ELASTIC PROPERTIES

G = 2.0E9
K = 1.8E9

MU0 = 0.5
MU1 = 0.4
LAMBDA1 = 1000.0

C DEVIATORIC STRAIN DEFINITION

C CALL DEVIATORIC(ID)

DO K1 = 1,3
KEM = 0.0
KDEM = 0.0
DO K2 = 1,3
KEM = ID(K1,K2)*STRAN(K2) + KEM
KDEM = ID(K1,K2)*DSTRAN(K2) + KDEM
END DO
KE(K1) = KEM
KDE(K1) = KDEM
END DO

DO K1 = 4,6
KE(K1) = 0.5*STRAN(K1)
KDE(K1) = 0.5*DSTRAN(K1)
END DO

EV = 0.0
DEV = 0.0
DO K1 = 1,3
EV = EV + STRAN(K1)
DEV = DEV + DSTRAN(K1)
END DO

IF (KINC.LE.1) THEN
DO K1 = 1,6
KQN(K1) = KE(K1)
STATEV(K1) = KQN(K1)

END DO

GOTO 10
ELSE
DO K1 = 1,6
KQ(K1) = STATEV(K1)
KQN(K1) = ((1.0 - (0.5*DTIME)/LAMBDA1)*KQ(K1)
1 + KDE(K1))/(1.0 + 0.5*DTIME/LAMBDA1)

END DO
END IF

DO K1 = 1,6
STATEV(K1) = KQN(K1)
END DO

10 DO K1 = 1,3
STRESS(K1) = 2.0*G*(MU0*KE(K1) + MU1*KQN(K1))
END DO

DO K1 = 4,6
STRESS(K1) = 2.0*G*(MU0*KE(K1) + MU1*KQN(K1))
END DO

DO K1 = 1,3
STRESS(K1) = STRESS(K1) + K*EV
END DO

C DEFINE THE JACOBIAN OR TANGENTIAL MATRIX.

TERM1 = 2.0*G*(MU0 + MU1/(1.0+0.5*DTIME/LAMBDA1))

DO K1 = 1,6
DO K2 = 1,6
DDSDDE(K2,K1) = 0.0
END DO

END DO
DO K1 = 1,3
DO K2 = 1,3
DDSDDE(K1,K2) = TERM1*ID(K1,K2) + K
END DO
END DO

DO K1 = 4,6
DDSDDE(K1,K1) = 0.5*TERM1
END DO

STATEV(7) = KINC
write(6,*) 'state', statev
RETURN
END

Jan

2. Hello Jan,

I don't have Zienkiewicz's book, so I cannot comment on the equations. But in general, if your UMAT works on one element but not multiple elements then that typically means that the Jacobian is not accurate enough. You can attempt to convert your UMAT to a VUMAT. That way you don't need the Jacobian and you should be able to figure out if the rest of the implementation is correct. You might also want to re-derive the Jacobian, perhaps you can find a more accurate expression.

- Jorgen

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•