Product: Abaqus/Explicit
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,” Section 21.1.2 of the Abaqus Analysis User's Guide);
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.
The component ordering depends upon whether the tensor is a “strain” variable or a “stress” variable.
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:
The shear strain components in user subroutine VFABRIC are stored as tensor components and not as engineering components.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.
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 points that satisfy a user-defined failure criterion can be deleted from the model (see “User-defined mechanical material behavior,” Section 26.7.1 of the Abaqus Analysis User's Guide). 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,” Section 23.4.1 of the Abaqus Analysis User's Guide. 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.
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
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 “User subroutines: overview,” Section 18.1.1 of the Abaqus Analysis User's Guide, 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.
fabricStrainInc(*,ndirStrain)
Thickness direction strain increment. The thickness can be requested as output variable STH.
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” 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.
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.
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 ifVFABRIC_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.
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