I use the simple isotropic elastic material in uniaxial tension as an example. First the isotropic elastic behavior is directly coded inside the UMAT subroutine and it works fine below (OK.for).
Now I coded the isotropic elastic behavior in a separate subroutine (see “mymodel” in NOTOK.for below) and then let UMAT call mymodel subroutine. However it doesn’t work and after printing out the parameter (C) when calling/after-calling mymodel subroutine, it shows that the parameter (C) is not updated in UMAT after calling mymodel subroutine. This is strange because FORTRAN passes parameters by adresses so the parameter should be automatically updated in UMAT.
Could anyone help to check the problem? All files (includinng Abaqus .inp) are given below. Thanks very much!
OK.for
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,jstep,kinc)
include 'aba_param.inc'
character*80 cmname
dimension C(6,6)
dimension stress(ntens),statev(nstatv),
1 ddsdde(ntens,ntens),ddsddt(ntens),drplde(ntens),
2 stran(ntens),dstran(ntens),time(2),predef(1),dpred(1),
3 props(nprops),coords(3),drot(3,3),dfgrd0(3,3),dfgrd1(3,3),
4 jstep(4)
E=3.5e9
XNU=0.346
XK=E/3.0/(1.0-2.0*XNU)
G=E/2.0/(1+XNU)
C=0.0
C(1,1) = XK+4.0/3.0*G
C(2,2) = C(1,1)
C(3,3) = C(1,1)
C(4,4) = G
C(5,5) = G
C(6,6) = G
C(1,2) = XK-2.0/3.0*G
C(1,3) = C(1,2)
C(2,3) = C(1,2)
C(2,1) = C(1,2)
C(3,1) = C(1,2)
C(3,2) = C(1,2)
print '("C=")'
print *,C
ddsdde=C
DO i=1, NTENS
DO j=1, NTENS
STRESS(j)=STRESS(j)+DDSDDE(j, i)*DSTRAN(i)
END DO
END DO
print '("ddsdde=")'
print *,ddsdde
end
NOTOK.for
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,jstep,kinc)
include 'aba_param.inc'
character*80 cmname
dimension C(6,6)
dimension stress(ntens),statev(nstatv),
1 ddsdde(ntens,ntens),ddsddt(ntens),drplde(ntens),
2 stran(ntens),dstran(ntens),time(2),predef(1),dpred(1),
3 props(nprops),coords(3),drot(3,3),dfgrd0(3,3),dfgrd1(3,3),
4 jstep(4)
call mymodel(C)
print '("C=")' ! here output extremely large and random numbers, different from C above
print *,C
ddsdde=C
DO i=1, NTENS
DO j=1, NTENS
STRESS(j)=STRESS(j)+DDSDDE(j, i)*DSTRAN(i)
END DO
END DO
print '("ddsdde=")'
print *,ddsdde
end
subroutine mymodel(C)
dimension C(6,6)
E=3.5e9
XNU=0.346
XK=E/3.0/(1.0-2.0*XNU)
G=E/2.0/(1.0+XNU)
C=0.0
C(1,1) = XK+4.0/3.0*G
C(2,2) = C(1,1)
C(3,3) = C(1,1)
C(4,4) = G
C(5,5) = G
C(6,6) = G
C(1,2) = XK-2.0/3.0*G
C(1,3) = C(1,2)
C(2,3) = C(1,2)
C(2,1) = C(1,2)
C(3,1) = C(1,2)
C(3,2) = C(1,2)
print '("C=")' ! output C correctly here
print *,C
end
test.inp
*Heading
** Job name: matrix Model name: Model-1
** Generated by: Abaqus/CAE 6.14-1
*Preprint, echo=NO, model=NO, history=NO, contact=NO
**
** PARTS
**
*Part, name=Part-1
*End Part
**
**
** ASSEMBLY
**
*Assembly, name=Assembly
**
*Instance, name=Part-1-1, part=Part-1
*Node
1, 1., 1., 1.
2, 1., 0., 1.
3, 1., 1., 0.
4, 1., 0., 0.
5, 0., 1., 1.
6, 0., 0., 1.
7, 0., 1., 0.
8, 0., 0., 0.
*Element, type=C3D8
1, 5, 6, 8, 7, 1, 2, 4, 3
*Nset, nset=_PickedSet2, internal, generate
1, 8, 1
*Elset, elset=_PickedSet2, internal
1,
** Section: Section-1
*Solid Section, elset=_PickedSet2, material=MAT0
,
*End Instance
**
*Nset, nset=_PickedSet4, internal, instance=Part-1-1, generate
5, 8, 1
*Elset, elset=_PickedSet4, internal, instance=Part-1-1
1,
*Nset, nset=_PickedSet5, internal, instance=Part-1-1, generate
1, 4, 1
*Elset, elset=_PickedSet5, internal, instance=Part-1-1
1,
*End Assembly
**
** MATERIALS
**
*Material, name=MAT0
*Depvar
12,
*User Material, constants=1
0.,
** ----------------------------------------------------------------
**
** STEP: Step-1
**
*Step, name=Step-1, nlgeom=NO, inc=2
*Static, direct
0.5, 1.,
**
** BOUNDARY CONDITIONS
**
** Name: BC-1 Type: Displacement/Rotation
*Boundary
_PickedSet4, 1, 1
_PickedSet4, 2, 2
_PickedSet4, 3, 3
_PickedSet4, 4, 4
_PickedSet4, 5, 5
_PickedSet4, 6, 6
** Name: BC-2 Type: Displacement/Rotation
*Boundary
_PickedSet5, 1, 1, 0.01
**
** OUTPUT REQUESTS
**
*Restart, write, frequency=0
**
** FIELD OUTPUT: F-Output-1
**
*Output, field, variable=PRESELECT
**
** HISTORY OUTPUT: H-Output-1
**
*Output, history, variable=PRESELECT
*End Step