You could define the modulus as an appropriate function of a field variable, using subroutine USDFLD to calculate the field variable according to the exponential function of strain.
mrgoldthorpe... I am trying to understand how it works using USDFLD. But the problem is how to define the subroutine, and I did't understand the meaning of:
*ELASTIC, DEPENDENCIES=1
2000., 0.3, 0., 0.04
...
the last values (ex. 0.04 in the first row) in the "table of modulus values decreasing as a function of field variable 1", reported in section 1.1.43 of Abaqus User Subroutines Reference Manual V 6.8.
It is the section linked to USDFLD.
I really don't have any idea of how to implement the subroutine. Could you suggest to me examples?
** First define E to varying linearly with the field
** variable. Make sure you use a large enough number to cover all possible values of E you might encounter:
*ELASTIC, DEPENDENCIES=1
0.0, 0.3, 0., 0.0
10000000.0, 0.3, 0., 10000000.0
**
*USER DEFINED FIELD
*DEPVAR
1
Define USDFLD as follows:
SUBROUTINE USDFLD(FIELD,STATEV,PNEWDT,DIRECT,T,CELENT,
1 TIME,DTIME,CMNAME,ORNAME,NFIELD,NSTATV,NOEL,NPT,LAYER,
2 KSPT,KSTEP,KINC,NDI,NSHR,COORD,JMAC,JMATYP,MATLAYO,LACCFLA)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME,ORNAME
CHARACTER*3 FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),COORD(*)
SUBROUTINE USDFLD(FIELD,STATEV,PNEWDT,DIRECT,T,CELENT,
1 TIME,DTIME,CMNAME,ORNAME,NFIELD,NSTATV,NOEL,NPT,LAYER,
2 KSPT,KSTEP,KINC,NDI,NSHR,COORD,JMAC,JMATYP,MATLAYO,LACCFLA)
C
INCLUDE 'ABA_PARAM.INC'
CHARACTER*80 CMNAME,ORNAME
CHARACTER*3 FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),COORD(*)
C
C Define parameters C1 and C2, change values used here:
PARAMETER (C1=3.6, C2=4.8)
C
C Get the strain array:
CALL GETVRM('E',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
MATLAYO,LACCFLA)
C
C choose whatever component or scalar is required for your exponential
C function. Let's use the first component here:
EPS = ABS( ARRAY(1) )
C
C Now apply your expression for E to determine the field variable:
FIELD(1) = C1 * EXP(C2*EPS)
C
C Store as a solution dependent state variable (not really required):
STATEV(1) = FIELD(1)
C
C If error, write comment to .DAT file:
IF(JRCD.NE.0)THEN
WRITE(6,*) 'REQUEST ERROR IN USDFLD FOR ELEMENT NUMBER ',
1 NOEL,'INTEGRATION POINT NUMBER ',NPT
ENDIF
C
RETURN
END
I will let you know just as soon as I will be able to try it.
Leo
Ps: butwhat exactly does it mean?:
** First define E to varying linearly with the field
** variable. Make sure you use a large enough number to cover all possible values of E you might encounter:
In defining E in *ELASTIC, you specify that it varies linearly with the field variable. In other words, E is equal to the value of the field variable.
In defining the field variable in USDFLD you are of course actually working out E.
Does that make sense? I'll leave you to sort it out now.
By the way, you might find it useful to examine SDV1 and the particular value of strain you are using to work out E - say by *EL PRINT - to make sure that the values are consistent with what you expect.
SUBROUTINE USDFLD(FIELD,STATEV,PNEWDT,DIRECT,T,CELENT,
1 TIME,DTIME,CMNAME,ORNAME,NFIELD,NSTATV,NOEL,NPT,LAYER,
2 KSPT,KSTEP,KINC,NDI,NSHR,COORD,JMAC,JMATYP,MATLAYO,
3 LACCFLA)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME,ORNAME
CHARACTER*3 FLGRAY(15)
DIMENSION FIELD(NFIELD),STATEV(NSTATV),DIRECT(3,3),
1 T(3,3),TIME(2)
DIMENSION ARRAY(15),JARRAY(15),JMAC(*),JMATYP(*),
1 COORD(*)
C
C Absolute value of current strain:
CALL GETVRM('E',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
MATLAYO,LACCFLA)
EPS = ABS( ARRAY(1) )
C
C Use the current strain as a field variable
FIELD(1) = EPS
C Store the current strain as a solution dependent state
C variable
STATEV(1) = FIELD(1)
C If error, write comment to .DAT file:
IF(JRCD.NE.0)THEN
WRITE(6,*) 'REQUEST ERROR IN USDFLD FOR ELEMENT NUMBER ',
1 NOEL,'INTEGRATION POINT NUMBER ',NPT
ENDIF
C
RETURN
END