VUANISOHYPER_STRAIN

User subroutine to define anisotropic hyperelastic material behavior based on Green strain.

User subroutine VUANISOHYPER_STRAIN:

  • can be used to define the strain energy potential of anisotropic hyperelastic materials as a function of the components of the Green strain tensor;

  • will be called for blocks of material calculation points for which the material definition contains user-defined anisotropic hyperelastic behavior with Green strain-based formulation (Anisotropic Hyperelastic Behavior);

  • can use and update solution-dependent state variables;

  • can use any field variables that are passed in; and

  • requires that the values of the derivatives of the strain energy density function be defined with respect to the components of the modified Green strain tensor and the volume ratio.

This page discusses:

Component Ordering in Tensors

The component ordering depends upon whether the tensor is second or fourth order.

Symmetric Second-Order Tensors

For symmetric second-order tensors, such as the modified Green strain tensor, there are ndir+nshr components; the component order is given as a natural permutation of the indices of the tensor. The direct components are first and then the indirect components, beginning with the 12-component. For example, a stress tensor contains ndir direct stress components and nshr shear stress components, which are passed in as

Component 2D Case 3D Case
1 ε¯11G ε¯11G
2 ε¯22G ε¯22G
3 ε¯33G ε¯33G
4 ε¯12G ε¯12G
5    ε¯23G
6    ε¯31G

The shear strain components are stored as tensor components and not as engineering components.

Symmetric Fourth-Order Tensors

For symmetric fourth-order tensors, such as the deviatoric elasticity tensor 2U/ε¯ijGε¯klG, there are (ndir+nshr)*(ndir+nshr+1)/2 independent components. These components are ordered using the following triangular storage scheme:

Component 2D Case 3D Case
1 2U/ε¯11Gε¯11G 2U/ε¯11Gε¯11G
2 2U/ε¯11Gε¯22G 2U/ε¯11Gε¯22G
3 2U/ε¯22Gε¯22G 2U/ε¯22Gε¯22G
4 2U/ε¯11Gε¯33G 2U/ε¯11Gε¯33G
5 2U/ε¯22Gε¯33G 2U/ε¯22Gε¯33G
6 2U/ε¯33Gε¯33G  2U/ε¯33Gε¯33G
7  2U/ε¯11Gε¯12G 2U/ε¯11Gε¯12G
8 2U/ε¯22Gε¯12G  2U/ε¯22Gε¯12G
9  2U/ε¯33Gε¯12G 2U/ε¯33Gε¯12G
10 2U/ε¯12Gε¯12G 2U/ε¯12Gε¯12G
11   2U/ε¯11Gε¯23G
12   2U/ε¯22Gε¯23G
13   2U/ε¯33Gε¯23G
14   2U/ε¯12Gε¯23G
15   2U/ε¯23Gε¯23G
16   2U/ε¯11Gε¯31G
17   2U/ε¯22Gε¯31G
18   2U/ε¯33Gε¯31G
19   2U/ε¯12Gε¯31G
20   2U/ε¯23Gε¯31G
21   2U/ε¯31Gε¯31G

If Q denotes the component number of term 2U/ε¯ijGε¯klG in the above table and M and N (with MN) denote the component numbers of ε¯ijG and ε¯klG, respectively, in the table for second-order tensors, Q is given by the relationship Q=M+N×(N-1)/2. For example, consider the term 2U/ε¯11Gε¯23G. The component numbers for ε¯11G and ε¯23G are M=1 and N=5, respectively, giving Q=1+(5×4)/2=11.

Material Point Deletion

Material points that satisfy a user-defined failure criterion can be deleted from the model (see User-Defined Mechanical Material Behavior). You must specify the state variable number controlling the element deletion flag when you allocate space for the solution-dependent state variables, as explained in User-Defined Mechanical Material Behavior. The deletion state variable should be set to a value of one or zero in VUANISOHYPER_STRAIN. A value of one indicates that the material point is active, and a value of zero indicates that Abaqus/Explicit should delete the material point from the model by setting the stresses to zero. The structure of the block of material points passed to user subroutine VUANISOHYPER_STRAIN remains unchanged during the analysis; deleted material points are not removed from the block. Abaqus/Explicit will “freeze” the values of the strains passed to VUANISOHYPER_STRAIN for all deleted material points; that is, the strain values remain constant after deletion is triggered. Once a material point has been flagged as deleted, it cannot be reactivated.

User Subroutine Interface

      subroutine vuanisohyper_strain(
C Read only (unmodifiable) variables –
     1 nblock,jElem,kIntPt,kLayer,kSecPt,cmname,
     2 ndir,nshr,nstatev,nfieldv,nprops,
     3 props,tempOld,tempNew,fieldOld,fieldNew,
     4 stateOld,ebar,detu,
C Write only (modifiable) variables –
     4 udev,duDe,duDj,
     5 d2uDeDe,d2uDjDj,d2uDeDj,
     6 stateNew)
C
      include 'vaba_param.inc'
C
      dimension jElem(nblock),
     1 	props(nprops), 
     2  tempOld(nblock),
     3  fieldOld(nblock,nfieldv), 
     4  stateOld(nblock,nstatev), 
     5  tempNew(nblock),
     6  fieldNew(nblock,nfieldv),
     7  ebar(nblock,ndir+nshr), detu(nblock),
     8  uDev(nblock), 
     9  duDe(nblock,ndir+nshr), duDj(nblock),
     *  d2uDeDe(nblock,(ndir+nshr)*(ndir+nshr+1)/2), 
     1  d2uDjDj(nblock), 
     2  d2uDeDj(nblock,ndir+nshr),
     3  stateNew(nblock,nstatev)
C
      character*80 cmname
C

      do 100 km = 1,nblock
        user coding
  100 continue

      return
      end

Variables to Be Defined

udev(nblock)

U~dev, the deviatoric part of the strain energy density of the primary material response. This quantity is needed only if the current material definition also includes Mullins effect (see Mullins Effect).

duDe(nblock,ndir+nshr)

Derivatives of strain energy potential with respect to the components of the modified Green strain tensor, U/ε¯ijG.

duDj(nblock,ndir+nshr)

Derivatives of strain energy potential with respect to volume ratio, U/J.

d2uDeDe(nblock,(ndir+nshr)*(ndir+nshr+1)/2)

Second derivatives of strain energy potential with respect to the components of the modified Green strain tensor (using triangular storage), 2U/ε¯ijGε¯klG.

d2uDjDj(nblock)

Second derivatives of strain energy potential with respect to volume ratio, 2U/J2.

d2uDeDj(nblock,ndir+nshr)

Cross derivatives of strain energy potential with respect to components of the modified Green strain tensor and volume ratio, 2U/ε¯ijGJ2.

stateNew(nblock,nstatev)

State variables at each material point at the end of the increment. You define the size of this array by allocating space for it (see About User Subroutines and Utilities for more information).

Variables Passed in for Information

nblock

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

jElem(nblock)

Array of element numbers.

kIntPt

Integration point number.

kLayer

Layer number (for composite shells).

kSecPt

Section point number within the current layer.

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.

ndir

Number of direct components in a symmetric tensor.

nshr

Number of indirect components in a symmetric tensor.

nstatev

Number of user-defined state variables that are associated with this material type (you define this as described in Allocating Space for Solution-Dependent State Variables).

nfieldv

Number of user-defined external field variables.

nprops

User-specified number of user-defined material properties.

props(nprops)

User-supplied material properties.

tempOld(nblock)

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

tempNew(nblock)

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

fieldOld(nblock,nfieldv)

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

fieldNew(nblock,nfieldv)

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

stateOld(nblock,nstatev)

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

ebar(nblock,ndir+nshr)

Modified Green strain tensor, ε¯G, at each material point at the end of the increment.

detu(nblock)

J, determinant of deformation gradient (volume ratio) at the end of the increment.

Example: Using More than One User-Defined Anisotropic Hyperelastic Material Model

To use more than one user-defined anisotropic hyperelastic material model, the variable cmname can be tested for different material names inside user subroutine VUANISOHYPER_STRAIN, as illustrated below:

if (cmname(1:4) .eq. 'MAT1') then
   call VUANISOHYPER_STRAIN1(argument_list)
else if (cmname(1:4) .eq. 'MAT2') then
   call VUANISOHYPER_STRAIN2(argument_list)
end if

VUANISOHYPER_STRAIN1 and VUANISOHYPER_STRAIN2 are the actual subroutines containing the anisotropic hyperelastic models for each material MAT1 and MAT2, respectively. Subroutine VUANISOHYPER_STRAIN merely acts as a directory here. The argument list can be the same as that used in subroutine VUANISOHYPER_STRAIN. The material names must be in uppercase characters since cmname is passed in as an uppercase character string.

Example: Orthotropic Saint-Venant Kirchhoff Model

As a simple example of the coding of subroutine VUANISOHYPER_STRAIN, consider the generalization to anisotropic hyperelasticity of the Saint-Venant Kirchhoff model. The strain energy function of the Saint-Venant Kirchhoff model can be expressed as a quadratic function of the Green strain tensor, εG, as

U(εG)=12εG:D:εG,

where D is the fourth-order elasticity tensor. The derivatives of the strain energy function with respect to the Green strain are given as

UεG=D:εG,
2UεGεG=D.

However, subroutine VUANISOHYPER_STRAIN must return the derivatives of the strain energy function with respect to the modified Green strain tensor, ε¯G, and the volume ratio, J, which can be accomplished easily using the following relationship between εG, ε¯G, and J:

εG=J23ε¯G+12(J23-1)I,

where I is the second-order identity tensor. Thus, using the chain rule we find

Uε¯G=J23UεG,
UJ=εGJ:UεG,
2Uε¯Gε¯G=J432UεGεG,
2UJ2=2εGJ2:UεG+εGJ:2UεGεG:εGJ,
2Uε¯GJ=23JJ23UεG+J232UεGεG:εGJ,

where

εGJ=23JJ23(ε¯G+12I)=23J(εG+12I)

and

2εGJ2=-13JεGJ.

In this example an auxiliary function is used to facilitate indexing into a fourth-order symmetric tensor. The subroutine would be coded as follows:

      subroutine vuanisohyper_strain (
C Read only -
     *     nblock, 
     *     jElem, kIntPt, kLayer, kSecPt, 
     *     cmname,
     *     ndir, nshr, nstatev, nfieldv, nprops,
     *     props, tempOld, tempNew, fieldOld, fieldNew,
     *     stateOld, ebar, detu,
C Write only -
     *     uDev, duDe, duDj,
     *     d2uDeDe, d2uDjDj, d2uDeDj,
     *     stateNew )
C
      include 'vaba_param.inc'
C
      dimension props(nprops), 
     *  tempOld(nblock),
     *  fieldOld(nblock,nfieldv), 
     *  stateOld(nblock,nstatev), 
     *  tempNew(nblock),
     *  fieldNew(nblock,nfieldv),
     *  ebar(nblock,ndir+nshr), detu(nblock),
     *  uDev(nblock), duDe(nblock,ndir+nshr), duDj(nblock),
     *  d2uDeDe(nblock,*), d2uDjDj(nblock), 
     *  d2uDeDj(nblock,ndir+nshr),
     *  stateNew(nblock,nstatev)
C
      character*80 cmname
C
      parameter( half = 0.5d0, one = 1.d0, two = 2.d0, 
     *     third = 1.d0/3.d0, twothds = 2.d0/3.d0, four = 4.d0,
     *     dinv = 0.d0 )
C
C    Orthotropic Saint-Venant Kirchhoff strain energy function 
C    (3D)
C
      D1111 = props(1)
      D1122 = props(2)
      D2222 = props(3)
      D1133 = props(4)
      D2233 = props(5)
      D3333 = props(6)
      D1212 = props(7)
      D1313 = props(8)
      D2323 = props(9)
C
      do k = 1, nblock
C
         d2UdE11dE11 = D1111
         d2UdE11dE22 = D1122
         d2UdE11dE33 = D1133
         d2UdE22dE11 = d2UdE11dE22
         d2UdE22dE22 = D2222
         d2UdE22dE33 = D2233
         d2UdE33dE11 = d2UdE11dE33
         d2UdE33dE22 = d2UdE22dE33
         d2UdE33dE33 = D3333
         d2UdE12dE12 = D1212
         d2UdE13dE13 = D1313
         d2UdE23dE23 = D2323
C
         xpow = exp ( log(detu(k)) * twothds )
         detuInv = one / detu(k)
C
         E11 = xpow * ebar(k,1) + half * ( xpow - one )
         E22 = xpow * ebar(k,2) + half * ( xpow - one )
         E33 = xpow * ebar(k,3) + half * ( xpow - one )
         E12 = xpow * ebar(k,4)
         E23 = xpow * ebar(k,5)
         E13 = xpow * ebar(k,6)
C
         term1 = twothds * detuInv
         dE11Dj = term1 * ( E11 + half )
         dE22Dj = term1 * ( E22 + half )
         dE33Dj = term1 * ( E33 + half )
         dE12Dj = term1 * E12
         dE23Dj = term1 * E23
         dE13Dj = term1 * E13
         term2 = - third * detuInv
         d2E11DjDj = term2 * dE11Dj
         d2E22DjDj = term2 * dE22Dj
         d2E33DjDj = term2 * dE33Dj
         d2E12DjDj = term2 * dE12Dj
         d2E23DjDj = term2 * dE23Dj
         d2E13DjDj = term2 * dE13Dj
C
         dUdE11 = d2UdE11dE11 * E11 
     *          + d2UdE11dE22 * E22 
     *          + d2UdE11dE33 * E33 
         dUdE22 = d2UdE22dE11 * E11 
     *          + d2UdE22dE22 * E22 
     *          + d2UdE22dE33 * E33 
         dUdE33 = d2UdE33dE11 * E11 
     *          + d2UdE33dE22 * E22 
     *          + d2UdE33dE33 * E33 
         dUdE12 = two * d2UdE12dE12 * E12 
         dUdE23 = two * d2UdE23dE23 * E23
         dUdE13 = two * d2UdE13dE13 * E13 
C
         U = half * ( E11*dUdE11 + E22*dUdE22 + E33*dUdE33 )
     *        + E12*dUdE12 + E13*dUdE13 + E23*dUdE23 
         uDev(k) = U
C
         duDe(k,1) = xpow * dUdE11 
         duDe(k,2) = xpow * dUdE22
         duDe(k,3) = xpow * dUdE33 
         duDe(k,4) = xpow * dUdE12 
         duDe(k,5) = xpow * dUdE23 
         duDe(k,6) = xpow * dUdE13 
C
         xpow2 = xpow * xpow
C	Only update nonzero components 
         d2uDeDe(k,indx(1,1)) = xpow2 * d2UdE11dE11
         d2uDeDe(k,indx(1,2)) = xpow2 * d2UdE11dE22
         d2uDeDe(k,indx(2,2)) = xpow2 * d2UdE22dE22
         d2uDeDe(k,indx(1,3)) = xpow2 * d2UdE11dE33
         d2uDeDe(k,indx(2,3)) = xpow2 * d2UdE22dE33
         d2uDeDe(k,indx(3,3)) = xpow2 * d2UdE33dE33
         d2uDeDe(k,indx(4,4)) = xpow2 * d2UdE12dE12
         d2uDeDe(k,indx(5,5)) = xpow2 * d2UdE23dE23
         d2uDeDe(k,indx(6,6)) = xpow2 * d2UdE13dE13
C
         duDj(k) = dUdE11*dE11Dj + dUdE22*dE22Dj + dUdE33*dE33Dj 
     *        + two * ( dUdE12*dE12Dj + dUdE13*dE13Dj 
     *                + dUdE23*dE23Dj )        
         d2uDjDj(k)= dUdE11*d2E11DjDj+dUdE22*d2E22DjDj
     *               +dUdE33*d2E33DjDj 
     *        + two*(dUdE12*d2E12DjDj+dUdE13*d2E13DjDj
     *               +dUdE23*d2E23DjDj)
     *        + d2UdE11dE11 * dE11Dj * dE11Dj
     *        + d2UdE22dE22 * dE22Dj * dE22Dj
     *        + d2UdE33dE33 * dE33Dj * dE33Dj
     *        + two  * ( d2UdE11dE22 * dE11Dj * dE22Dj
     *                 + d2UdE11dE33 * dE11Dj * dE33Dj
     *                 + d2UdE22dE33 * dE22Dj * dE33Dj )
     *        + four * ( d2UdE12dE12 * dE12Dj * dE12Dj
     *                   d2UdE13dE13 * dE13Dj * dE13Dj
     *                   d2UdE23dE23 * dE23Dj * dE23Dj )
C
         d2uDeDj(k,1) = xpow * ( term1 * dUdE11 
     *                + d2UdE11dE11 * dE11Dj
     *                + d2UdE11dE22 * dE22Dj
     *                + d2UdE11dE33 * dE33Dj ) 
         d2uDeDj(k,2) = xpow * ( term1 * dUdE22 
     *                + d2UdE22dE11 * dE11Dj
     *                + d2UdE22dE22 * dE22Dj
     *                + d2UdE22dE33 * dE33Dj )
         d2uDeDj(k,3) = xpow * ( term1 * dUdE33 
     *                + d2UdE33dE11 * dE11Dj
     *                + d2UdE33dE22 * dE22Dj
     *                + d2UdE33dE33 * dE33Dj )
         d2uDeDj(k,4) = xpow * ( term1 * dUdE12 
     *                + two * d2UdE12dE12 * dE12Dj )
         d2uDeDj(k,5) = xpow * ( term1 * dUdE23 
     *                + two * d2UdE23dE23 * dE23Dj )
         d2uDeDj(k,6) = xpow * ( term1 * dUdE13 
     *                + two * d2UdE13dE13 * dE13Dj )
      end do
C
      return
      end
C
      integer function indx( i, j )
C
      include 'vaba_param.inc'
C
C     Function to map index from Square to Triangular storage 
C 		  of symmetric matrix
C
      ii = min(i,j)
      jj = max(i,j)
C
      indx = ii + jj*(jj-1)/2
C
      return
      end