<!-- source-page: 561 -->

# jElem

Array of element numbers.

# kIntPt

Integration point number.

# kLayer

Layer number (for composite shells).

# kSecPt

Section point number within the current layer.

# stepTime

Value of time since the step began.

# totalTime

Value of total time. The time at the beginning of the step is given by totalTime-stepTime.

# dt

Time increment size.

# cmname

User-specified material name, left justified. It is passed in as an uppercase character string. Some internal material models are given names starting with the “ABQ\_” character string. To avoid conflict, you should not use “ABQ\_” as the leading string for cmname.

# coordMp(nblock,\*)

Material point coordinates. It is the midplane material point for shell elements and the centroid for beam elements.

# direct(nblock,3,3)

An array containing the direction cosines of the material directions in terms of the global basis directions. For material point k, direct(k,1,1), direct(k,2,1), direct(k,3,1) give the (1, 2, 3) components of the first material direction; direct(k,1,2), direct(k,2,2), direct(k,3,2) give the second material direction, etc. For shell and membrane elements, the first two directions are in the plane of the element and the third direction is the normal. This information is not available for beam elements.

# T(nblock,3,3)

An array containing the direction cosines of the material orientation components relative to the element basis directions. For material point k, this is the orientation that defines the material directions (direct) in terms of the element basis directions. For continuum elements T and direct are identical. For shell and membrane elements T(k,1,1) , T(k,1,2) , T(k,2,1) , T(k,2,2) , T(k,3,3) and all other components are zero, where is the

<!-- source-page: 562 -->

counterclockwise rotation around the normal vector that defines the orientation. If no orientation is used, T is an identity matrix. Orientation is not available for beam elements.

charLength(nblock)

Characteristic element length, which is either the default value based on the geometric mean or the user-defined characteristic element length defined in user subroutine VUCHARLENGTH. The default value is a typical length of a line across an element for a first-order element; it is half of the same typical length for a second-order element. For beams and trusses the default value is a characteristic length along the element axis. For membranes and shells it is a characteristic length in the reference surface. For axisymmetric elements it is a characteristic length in the r–z plane only. For cohesive elements it is equal to the constitutive thickness.

props(nprops)

User-supplied material properties.

stateOld (nblock, nstatev)

State variables at each material point at the beginning of the increment.

Example: Damaged elasticity model

Included below is an example of user subroutine VUSDFLD. In this example a truss element is loaded in tension. A damaged elasticity model is introduced: the modulus decreases as a function of the maximum tensile strain that occurred during the loading history. The maximum tensile strain is stored as a solution-dependent state variable (see “Defining solution-dependent field variables” in “Predefined fields,” Section 34.6.1 of the Abaqus Analysis User’s Guide).

Input file   
```csv
*HEADING
Damaged elasticity model with user subroutine vusdfld
*ELEMENT, TYPE=T2D2, ELSET=ONE
1, 1, 2
*NODE, NSET=NALL
1, 0., 0.
2, 10., 0.
*SOLID SECTION, ELSET=ONE, MATERIAL=ELASTIC
1.
*MATERIAL, NAME=ELASTIC
*ELASTIC, DEPENDENCIES=1
** Table of modulus values decreasing as a function
** of field variable 1.
2000., 0.3, 0., 0.00
1500., 0.3, 0., 0.01
1200., 0.3, 0., 0.02
1000., 0.3, 0., 0.04 
```

<!-- source-page: 563 -->

```csv
* DENSITY
1.0e-6
* USER DEFINED FIELD
* DEPVAR
1
1, EPSMAX, "Maximum strain value"
* BOUNDARY
1, 1, 2
2, 2
* AMPLITUDE, NAME=LOAD1
0.0, 0.0, 1.0, 1.0
* AMPLITUDE, NAME=LOAD2
0.0, 0.0, 2.0, 1.0
* AMPLITUDE, NAME=UNLOAD
0.0, 1.0, 1.0, 0.0
* STEP, NLGEOM=NO
* DYNAMIC, EXPLICIT
, 1.0
* CLOAD, AMPLITUDE=LOAD1
2, 1, 20.
* OUTPUT, FIELD, VARIABLE=PRESELECT
* OUTPUT, HISTORY, VARIABLE=PRESELECT
* ELEMENT OUTPUT, ELSET=ONE
S, E, SDV
* NODE OUTPUT, NSET=NALL
RF, CF, U
* END STEP
* STEP, NLGEOM=NO
* DYNAMIC, EXPLICIT
, 1.0
* CLOAD, AMPLITUDE=UNLOAD
2, 1, 20.
* END STEP
* STEP, NLGEOM=NO
* DYNAMIC, EXPLICIT
, 2.0
* CLOAD, AMPLITUDE=LOAD2
2, 1, 40.
* END STEP 
```

<!-- source-page: 564 -->

User subroutine   
```fortran
subroutine vusdfld(
c Read only -
* nblock, nstatev, nfieldv, nprops, ndir, nshr,
* jElem, kIntPt, kLayer, kSecPt,
* steTime, totalTime, dt, cmname,
* coordMp, direct, T, charLength, props,
* stateOld,
c Write only -
* stateNew, field )
c
    include 'vaba_param.inc'
c
    dimension jElem(nblock), coordMp(nblock,*),
*    direct(nblock,3,3), T(nblock,3,3),
*    charLength(nblock), props(nprops),
*    stateOld(nblock,nstatev),
*    stateNew(nblock,nstatev),
*    field(nblock,nfieldv)
    character*80 cmname
c
c Local arrays from vgetvrm are dimensioned to
c maximum block size (maxblk)
c
    parameter( nrData=6 )
    character*3 cData(maxblk*nrData)
    dimension rData(maxblk*nrData), jData(maxblk*nrData)
c
    jStatus = 1
    call vgetvrm('LE', rData, jData, cData, jStatus )
c
    if( jStatus .ne. 0 ) then
    call xplb_abqerr(-2,'Utility routine VGETVRM '//
*    'failed to get variable.',0,zero,' ') 
    call xplb_exit
    end if
c
    call setField( nblock, nstatev, nfieldv, nrData,
*    rData, stateOld, stateNew, field)
c
    return 
```

<!-- source-page: 565 -->

```prolog
end
subroutine setField( nblock, nstatev, nfieldv, nrData,
*    strain, stateOld, stateNew, field )
include 'vaba_param.inc'

dimension stateOld(nblock, nstatev),
*    stateNew(nblock, nstatev),
*    field(nblock, nfieldv), strain(nblock, nrData)

do k = 1, nblock

Absolute value of current strain:
    eps = abs( strain(k, 1) )

Maximum value of strain up to this point in time:
    epsmax = stateOld(k, 1)

Use the maximum strain as a field variable
    field(k, 1) = max( eps, epsmax )

Store the maximum strain as a solution dependent state
    stateNew(k, 1) = field(k, 1)

end do

return
end 
```

<!-- source-page: 566 -->

<!-- source-page: 567 -->

# 1.2.25 VUTRS: User subroutine to define a reduced time shift function for a viscoelastic material.

# Product: Abaqus/Explicit

# References

• “Time domain viscoelasticity,” Section 22.7.1 of the Abaqus Analysis User’s Guide   
• \*TRS   
• \*VISCOELASTIC   
• “Transient thermal loading of a viscoelastic slab,” Section 3.1.2 of the Abaqus Benchmarks Guide

# Overview

User subroutine VUTRS:

• can be used to define a temperature-time shift for a time domain viscoelastic analysis;   
• will be called for all material points of elements for which a user-defined shift function is specified to define the time-temperature correspondence as part of the viscoelastic material definition;   
• can use and update solution-dependent state variables; and   
• can have incoming field variables redefined by user subroutine VUSDFLD.

# User subroutine interface

```txt
subroutine vuts(
c Read only variables -
    1 nblock, nstatev, nfieldv, nprops,
    2 timeTime, totalTime, dt,
    3 cmname, props, density, coordMp,
    4 tempOld, fieldOld, stateOld,
    5 tempNew, fieldNew,
c Write only variables -
    6 shift, stateNew )
c
    include 'vaba_param.inc'
c
    dimension props(nprops), density(nblock), coordMp(nblock,*),
    1 tempOld(nblock), tempNew(nblock),
    2 fieldOld(nblock, nfieldv), fieldNew(nblock, nfieldv),
    3 stateOld(nblock, nstatev), stateNew(nblock, nstatev),
    4 shift(nblock, 2) 
```

<!-- source-page: 568 -->

```lua
c
character*80 cmname
c
do 100 k=1, nblock
user coding to define shift(k,1) and shift(k,2)
100 continue
c
return
end 
```

# Variable to be defined

shift(nblock,2)

Array that defines the shift function, A ( ), at the material points. For material point k, shift(k,1) defines the shift function at the beginning of the increment, and shift(k,2) defines the shift function at the end of the increment. Abaqus/Explicit will apply an averaging scheme to these values that assumes that the natural logarithm of the shift function can be approximated by a linear function over the increment.

If either shift(k,1) or shift(k,2) is less than or equal to zero, no time shift will be applied.

# Variable that can be updated

stateNew(nblock,nstatev)

Array containing the solution-dependent state variables at the material points. This array will be passed in containing the values of these variables at the start of the increment unless they are updated in user subroutine VUSDFLD, in which case the updated values are passed in. If any of the solution-dependent state variables are being used in conjunction with the viscoelastic behavior, they must be updated in this subroutine to their values at the end of the increment.

# Variables passed in for information

nblock

Number of material points to be processed in this call to VUTRS.

nstatev

Number of user-defined state variables that are associated with this material type (see “Allocating space” in “User subroutines: overview,” Section 18.1.1 of the Abaqus Analysis User’s Guide).

nfieldv

Number of user-defined external field variables.

nprops

User-specified number of user-defined material properties.

<!-- source-page: 569 -->

# stepTime

Value of time since the step began.

# totalTime

Value of total time. The time at the beginning of the step is given by totalTime-stepTime.

# dt

Time increment size.

# cmname

Material name, left justified. It is passed in as an uppercase character string. Some internal material models are given names starting with the “ABQ\_” character string. To avoid conflict, “ABQ\_” should not be used as the leading string for cmname.

# props(nprops)

User-supplied material properties.

# density(nblock)

Current density at the material points in the midstep configuration. This value may be inaccurate in problems where the volumetric strain increment is very small. If an accurate value of the density is required in such cases, the analysis should be run in double precision. This value of the density is not affected by mass scaling.

# coordMp(nblock,\*)

Material point coordinates. It is the midplane material point for shell elements and the centroid for beam elements.

# tempOld(nblock)

Temperatures at each material point at the beginning of the increment.

# fieldOld(nblock,nfieldv)

Values of the user-defined field variables at each material point at the beginning of the increment.

# stateOld(nblock,nstatev)

State variables at each material point at the beginning of the increment.

# tempNew(nblock)

Temperatures at each material point at the end of the increment.

# fieldNew(nblock,nfieldv)

Values of the user-defined field variables at each material point at the end of the increment.

<!-- source-page: 570 -->
