VFABRIC

User subroutine to define fabric material behavior.

Warning: The use of this user subroutine generally requires considerable expertise. You are cautioned that the implementation of any realistic constitutive model requires extensive development and testing. Initial testing on a single-element model with prescribed traction loading is strongly recommended.

User subroutine VFABRIC:

  • is used to define the mechanical constitutive behavior of a fabric material in the plane of the fabric;

  • is valid for materials that exhibit two “structural” directions that may not be orthogonal to each other with deformation;

  • is used to update the nominal fabric stresses for a given nominal fabric strain where the direct strains are defined as the nominal strain measured along the two yarn directions of the fabric and the engineering shear strain is defined as the drop in the angle between the two yarn directions going from the reference configuration to the current configuration;

  • can be used with elements under plane stress conditions;

  • will be called for blocks of material calculation points for which the material is defined in a user subroutine (Material Data Definition);

  • can use and update solution-dependent state variables;

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

  • cannot be used in an adiabatic analysis.

This page discusses:

Component Ordering in Tensors

The component ordering depends upon whether the tensor is a “strain” variable or a “stress” variable.

Symmetric Tensors

Tensors such as the strain and strain increment have four components, and tensors such as stress have three components, with the difference between the two sets of variables arising from the assumed plane stress condition. The component order with the arrays for these variables is listed in the table below:

Component Strain Stress
1 ε11σ11
2 ε22σ22
3 ε33σ12
4 ε12 

The shear strain components in user subroutine VFABRIC are stored as tensor components and not as engineering components.

Initial Calculations and Checks

In the datacheck phase of the analysis Abaqus/Explicit calls user subroutine VFABRIC with a set of fictitious strains and a totalTime and stepTime that are both equal to 0.0. This step serves as a check on your constitutive relation and calculates the equivalent initial material properties, upon which the initial elastic wave speeds are computed.

Orientation of the Fabric Yarn

In general, the yarn directions may not be orthogonal to each other in the reference configuration. You can specify these local directions with respect to the in-plane axes of an orthogonal orientation system at a material point. Both the local directions and the orthogonal system are defined together as a single orientation definition. If the local directions are not specified, these directions are assumed to match the in-plane axes of the orthogonal system. The local direction may not remain orthogonal with deformation. Abaqus updates the local directions with deformation and computes the nominal strains along these directions and the drop in angle between them (the fabric engineering shear strain). The constitutive behavior for the fabric defines the fabric nominal stresses as a function of the fabric strains. Abaqus converts these fabric stresses into the Cauchy stress and the resulting internal forces.

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 Fabric Material Behavior. The deletion state variable should be set to a value of one or zero in user subroutine VFABRIC. A value of one indicates that the material point is active, while 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 VFABRIC remains unchanged during the analysis; deleted material points are not removed from the block. Abaqus/Explicit will pass zero stresses and strain increments for all deleted material points. Once a material point has been flagged as deleted, it cannot be reactivated.

User Subroutine Interface

      subroutine vfabric(
C Read only (unmodifiable)variables -
     1     nblock, ndim, npt, layer, kspt, kstep, kinc, 
     2     nstatev, nfieldv, nprops, 
     3     lOp, jElem, stepTime, totalTime, dt, cmname, coordMp, 
     4     charLength, props, density, braidAngle, fabricStrain, 
     5     fabricStrainInc, 
     6     tempOld, fieldOld, fabricStressOld, stateOld, 
     7     tempNew, fieldNew, enerIntern,     
C Write only (modifiable) variables -
     8     fabricStressNew, stateNew, enerInelas )
C
C NOTE: In addition to the above "Write only" variables,
C the thickness direction component of fabricStrainInc
C i.e, fabricStrainInc(*,ndirStrain) may also be set by 
C the user for changing thickness as a function 
C of material in-plane state.      
C
      include 'vaba_param.inc'
C
      parameter ( ndirStrain = 3, nshr = 1, ndirStress = 2)
C
C NOTE: The constants defined above are used for array
C dimensions below.
C      
      dimension 
     *     jElem(nblock), 
     *     coordMp(nblock,ndim), 
     *     charLength(nblock), 
     *     props(nprops),
     *     density(nblock), 
     *     braidAngle(nblock), 
     *     fabricStrain(nblock,ndirStrain+nshr), 
     *     strainFabricInc(nblock,ndirStrain+nshr),
     *     tempOld(nblock), 
     *     fieldOld(nblock,nfieldv), 
     *     fabricStressOld(nblock,ndirStress+nshr), 
     *     stateOld(nblock,nstatev),
     *     tempNew(nblock), 
     *     fieldNew(nblock,nfieldv), 
     *     fabricStressNew(nblock,ndirStress+nshr), 
     *     stateNew(nblock,nstatev), 
     *     enerIntern(nblock),
     *     enerInelas(nblock)
*
      character*80 cmname
C
      do 100 km = 1,nblock
        user coding
  100 continue

      return
      end

Variables to Be Defined

fabricStressNew(nblock,ndirStress+nshr)

Nominal fabric stress at each material point at the end of the increment. This nominal fabric stress can be requested as output variable SFABRIC.

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). This variable can be requested as output variable SDV.

enerInelas(nblock)

Total inelastic energy density at material points at the end of the increment. This variable can be requested as output variable ENER.

Variables That Can Be Updated

fabricStrainInc(*,ndirStrain)

Thickness direction strain increment. The thickness can be requested as output variable STH.

Variables Passed in for Information

nblock

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

ndim

Two for a two-dimensional model and three for a three-dimensional model.

npt

Current integration point number.

layer

Current layer number in the case of a composite section.

kspt

Current material point number within the section.

kStep

Current Abaqus step number.

kInc

Increment number of the current Abaqus step.

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.

lOp

Integer flag indicating the computation that is expected. lOp = −2 indicates that the routine is being called to initialize the stresses corresponding to the initial strains, which can be large. lOp = −1 indicates that the routine is being called to update the stresses based on the instantaneous elastic response for a small artificial strain increment given. lOp = 0 indicates that this is an annealing process and you should reinitialize the internal state variables, stateNew, if necessary. The stresses will be set to zero by Abaqus. lOp = 1 indicates that the routine is being called to update the stresses and the state for a given strain increment.

jElem(nblock)

Array of element numbers.

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 character string ABQ_. 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.

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 membranes and shells the default value is a characteristic length in the reference surface.

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.

braidAngle(nblock)

Angle in radians between the two yarn directions at the end of the increment.

fabricStrain(nblock,ndirStrain+nshr)

Total nominal strain in the fabric at the end of increment. This variable can be requested as output variable EFABRIC.

fabricStrainInc(nblock,ndirStrain+nshr)

Incremental nominal strain in the fabric.

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.

fabricStressOld(nblock,ndirStress+nshr)

Nominal fabric stress 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.

enerIntern(nblock)

Internal energy per unit mass at each material point at the beginning of the increment.

Example: Using More than One User-Defined Material Model

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

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

VFABRIC_MAT1 and VFABRIC_MAT2 are the actual fabric material user subroutines containing the constitutive material models for each material MAT1 and MAT2, respectively. User subroutine VFABRIC merely acts as a directory here. The argument list can be the same as that used in subroutine VFABRIC. The material names must be in uppercase characters since cmname is passed in as an uppercase character string.

Example: Influence of Nonorthogonal Material Directions in Highly Anisotropic Elastic Material

As an example of the coding of user subroutine VFABRIC, consider a simple elastic lamina material with highly anisotropic properties. For a fabric the material definitions need not remain orthogonal with deformation, whereas the directions do remain orthogonal for a built-in elastic material. The simple VFABRIC routine given below defines an elastic fabric and can be used to compare the fabric and the built-in elastic materials under different loading conditions.

The user subroutine would be coded as follows:

      subroutine vfabric(
C Read only (unmodifiable)variables -
     1     nblock, ndim, npt, layer, kspt, kstep, kinc, 
     2     nstatev, nfieldv, nprops, 
     3     lOp, jElem, stepTime, totalTime, dt, cmname, coordMp, 
     4     charLength, props, density, braidAngle, fabricStrain, 
     5     fabricStrainInc, 
     6     tempOld, fieldOld, fabricStressOld, stateOld, 
     7     tempNew, fieldNew, enerIntern,     
C Write only (modifiable) variables -
     8     fabricStressNew, stateNew, enerInelas )
C
C NOTE: In addition to the above "Write only" variables,
C the thickness direction component of fabricStrainInc
C i.e, fabricStrainInc(*,ndirStrain) may also be set by the user 
C for changing thickness as a function of material in-plane
C state.      
C
       include 'vaba_param.inc'
C
       parameter( ndirStrain = 3, nshr = 1, ndirStress = 2,
          one = 1.d0, two = 2.d0 )
C
C NOTE: The constants defined above are used for array 
C dimensions and computation below.

C     
      dimension 
     *     jElem(nblock), 
     *     coordMp(nblock,ndim), 
     *     charLength(nblock), 
     *     props(nprops),
     *     density(nblock), 
     *     braidAngle(nblock), 
     *     fabricStrain(nblock,ndirStrain+nshr), 
     *     fabricStrainInc(nblock,ndirStrain+nshr),
     *     tempOld(nblock), 
     *     fieldOld(nblock,nfieldv), 
     *     fabricStressOld(nblock,ndirStress+nshr), 
     *     stateOld(nblock,nstatev),
     *     tempNew(nblock), 
     *     fieldNew(nblock,nfieldv), 
     *     fabricStressNew(nblock,ndirStress+nshr), 
     *     stateNew(nblock,nstatev), 
     *     enerIntern(nblock),
     *     enerInelas(nblock)
C
      character*80 cmname
C

C     
C  Read properties
      E1      = props(1)
      E2      = props(2)
      xnu12   = props(3)
      twiceG12     = two * props(4)
C               
      xnu21 = E2 * xnu12 / E1
C
C Let us assume:
      xnu13 = xnu12
      xnu23 = xnu21
C
      xnu13OverE1 = xnu13/E1
      xnu23OverE2 = xnu23/E2 
C
      fr = one / ( one - xnu12 * xnu21 )
      D11 = E1 * fr
      D22 = E2 * fr
      D12 = E2 * xnu12 * fr
C
      do k = 1 , nblock
C
C   Update the stress
         stressInc11 = D11 * fabricStrainInc(k,1) 
     *               + D12 * fabricStrainInc(k,2)
         stressInc22 = D22 * fabricStrainInc(k,2)  
     *               + D12 * fabricStrainInc(k,1)
         stressInc12 = twiceG12 * 
     *                 fabricStrainInc(k,ndirStrain + 1)
C               
         fabricStressNew(k,1) = fabricStressOld(k,1) 
     *                        + stressInc11
         fabricStressNew(k,2) = fabricStressOld(k,2) 
     *                        + stressInc22
C               
C               shear stress
         fabricStressNew(k,ndirStress+1) = 
     *        fabricStressOld(k,ndirStress+1) + stressInc12
C               
C               Thickness direction strain 
C        fabricStrainInc(k,ndirStrain) = 
C    *        - ( xnu13OverE1 * stressInc11
C    *        + xnu23OverE2 * stressInc22
C    *        )
C               
      end do

      return
      end