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
| | | 2
| | | 3
| | | 4
| |
|
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
|