can be used to define the frictional behavior between contacting
surfaces;
can be used when the classical Coulomb friction model is too
restrictive and a more complex definition of shear transmission between
contacting surfaces is required;
must provide the entire definition of shear interaction between the
contacting surfaces;
can use and update solution-dependent state variables for node-to-face
and node-to-analytical rigid surface contact;
cannot be used in conjunction with softened tangential surface
behavior; and
can be used only with the general contact algorithm.
The points considered in user subroutine VFRICTION are called contact points.
Each contact point is primarily associated with a secondary node or a point along a
secondary edge; the contact point also references the corresponding main surface that it
contacts. A contact point exists for each pairing of secondary node and main surface.
Therefore, more than one contact point may reference the same secondary node but different
main surfaces, such as with contact at a corner.
The number of contact points currently being passed into user subroutine VFRICTION is
nBlock. The array
jConSecUid(nNodSec,nBlock) gives the secondary surface node
numbers associated with the contact points. The variable
nNodSec indicates whether a single secondary node (for
node-to-face contact) or two secondary nodes of an edge (for edge-to-edge contact) are
associated with each contact point. Similarly, the array
jConMainUid(nNodMain,nBlockAnal) gives the main surface
node numbers associated with each contact point; the nodes can belong to a facet, an edge,
or an analytical surface. The variable nNodMain indicates the
number of main nodes associated with each contact point.
An
Abaqus/Explicit
model can be defined in terms of an assembly of part instances (see
Assembly Definition).
In such models a node number is an internally generated node number. If the
original node number and part instance name are required, call the utility
routine VGETPARTINFO (see
Obtaining Part Information).
Local Coordinate System
A local coordinate system is defined for each contact point to facilitate specification of
frictional forces and incremental slip. The local 1-direction for both two-dimensional and
three-dimensional contact is tangential to the main surface; it is defined by , where is the incremental slip vector. The incremental slip vector used to define corresponds to the incremental slip in the current time increment. The
main surface normal direction, , is the local 2-direction for two-dimensional contact and the local
3-direction for three-dimensional contact. The local 2-direction for three-dimensional
contact is given by , which is also tangent to the main surface. The vectors are shown in Figure 1 and Figure 2. The direction cosines for and with respect to the global coordinate system are available in
dirCosS1 and dirCosN,
respectively. In the case of zero incremental slip () we choose an arbitrary direction for that is orthogonal to the normal direction, .
Frictional Forces
You specify the frictional force, fTangential, at each contact
point in local coordinates in this subroutine. The array
fTangential is dimensioned such that only the tangential
components can be specified. Any components of the frictional force that are not specified
will remain equal to zero. For isotropic friction, only the first component of the
frictional force need be specified since the second component should be zero. A “stick
force” at each contact point is provided in the array
fStickForce to assist you in setting appropriate frictional
force values. The stick force is the force required to prevent additional “plastic”
slipping. The stick force at each contact point is provided as a scalar value as it would
act in the direction opposite to . The stick force is computed prior to calling user subroutine VFRICTION. The first component of
the frictional force should be in the range between zero and the negative of the stick force
value. Typically, the stick force will be positive and the first component of the applied
frictional force will be negative, opposing the incremental slip. Penalty contact includes
an elastic slip regime due to finite penalty stiffness; so occasionally the stick force will
be negative during recovery of elastic slip, indicating that it is appropriate for the first
component of the frictional force to be positive (that is, acting in the same direction as
the incremental slip). A noisy or unstable solution is likely to result if the first
component of fTangential is set outside the range between
zero and the negative of the stick force value.
After user subroutine VFRICTION is called, frictional
forces that oppose the forces specified at the contact points are distributed to the main
nodes.
User Subroutine Interface
subroutine vfriction (
C Write only -
* fTangential,
C Read/Write -
* state,
C Read only -
* nBlock, nBlockAnal, nBlockEdge,
* nNodState, nNodSec, nNodMain,
* nFricDir, nDir,
* nStates, nProps, nTemp, nFields,
* jFlags, rData,
* surfInt, surfSec, surfMain,
* jConSecUid, jConMainUid, props,
* dSlipFric, fStickForce, fTangPrev, fNormal,
* areaCont, dircosN, dircosS1,
* shapeSec, shapeMain,
* coordSec, coordMain,
* velSec, velMain,
* tempSec, tempMain,
* fieldSec, fieldMain )
C
include `vaba_param.inc'
C
dimension fTangential(nFricDir,nBlock),
* state(nStates,nNodState,nBlock),
* jConSecUid(nNodSec,nBlock),
* jConMainUid(nNodMain,nBlockAnal),
* props(nProps),
* dSlipFric(nDir,nBlock),
* fStickForce(nBlock),
* fTangPrev(nDir,nBlock),
* fNormal(nBlock),
* areaCont(nBlock),
* dircosN(nDir,nBlock),
* dircosS1(nDir,nBlock),
* shapeSec(nNodSec,nBlockEdge),
* shapeMain(nNodMain,nBlockAnal),
* coordSec(nDir,nNodSec,nBlock),
* coordMain(nDir,nNodMain,nBlockAnal),
* velSec(nDir,nNodSec,nBlock),
* velMain(nDir,nNodMain,nBlockAnal),
* tempSec(nBlock),
* tempMain(nBlockAnal),
* fieldSec(nFields,nBlock),
* fieldMain(nFields,nBlockAnal)
C
parameter( iKStep = 1,
* iKInc = 2,
* iLConType = 3,
* nFlags = 3 )
C
parameter( iTimStep = 1,
* iTimGlb = 2,
* iDTimCur = 3,
* iFrictionWork = 4,
* nData = 4 )
C
dimension jFlags(nFlags), rData(nData)
C
character*80 surfInt, surfSec, surfMain
C
user coding to define fTangential
and, optionally, state
C
return
end
Variables to Be Defined
fTangential(nFricDir,nBlock)
This array must be updated to the current values of the frictional force
components for all contact points in the local tangent directions. See
Figure 2
for a definition of the local coordinate system. This array will be zero (no
friction force) until it is set.
Variables That Can Be Updated
state(nStates,nNodState,nBlock)
This array contains the user-defined, solution-dependent state variables for all the nodes on the
secondary surface. The use of state variables is applicable for node-to-face and
node-to-analytical rigid surface contact. See Frictional Behavior for more
information on the size of this array. This array will be passed in containing the
values of these variables prior to the call to user subroutine VFRICTION.
If any of the solution-dependent state variables are being used in conjunction with the friction
behavior, they must be updated in this subroutine. These state variables need to be
updated with care: outside the user subroutine these state variables are single-valued
per secondary node, but multiple contact points may refer to the same secondary node
(if it contacts a main surface at more than one point). Each contact point may be
passed into the user subroutine independently in a given increment, possibly on
separate calls to the user subroutine; therefore, you may end up advancing the state
variables for the associated node multiple times for a single increment. To keep track
of whether or not a node state is advanced, you may want to use one of the state
variables exclusively for this purpose. You could set that selected state variable to
the current increment number and update the state only if it is not already set to the
current increment number.
Variables Passed in for Information
nBlock
Number of contact points to be processed in this call to
VFRICTION.
nBlockAnal
1 for analytical rigid main surface; nBlock otherwise.
nBlockEdge
nBlock for edge-type secondary surface; 1 otherwise.
nNodState
1 for node-to-face contact and node-to-analytical rigid surface contact.
nNodSec
1 for node-to-face and node-to-analytical rigid surface contact; 2 for
edge-to-edge contact.
nNodMain
1 for analytical rigid main surface; 2 for edge-type main surface; 2 for two-dimensional
facet-type main surface; 4 for three-dimensional facet-type main surface.
nFricDir
Number of tangent directions at the contact points (nFricDir
= nDir - 1).
nDir
Number of coordinate directions at the contact points (2 for two-dimensional
models; 3 for three-dimensional models).
nStates
Number of user-defined state variables.
nProps
User-specified number of property values associated with this friction
model.
nTemp
1 if the temperature is defined and 0 if the temperature is not defined.
nFields
Number of predefined field variables.
jFlag(1)
Step number.
jFlag(2)
Increment number.
jFlag(3)
1 for node-to-face contact, 2 for edge-to-edge contact, and 3 for
node-to-analytical rigid surface contact.
rData(1)
Value of step time.
rData(2)
Value of total time.
rData(3)
Current increment in time from
to .
rData(4)
This variable contains the value of the total frictional dissipation in the
entire model from the beginning of the analysis. The units are energy per unit
area.
surfInt
User-specified surface interaction name, left justified.
surfSec
Secondary surface name, currently set to a blank.
surfMain
Main surface name, currently set to a blank.
jConSecUid(nNodSec,nBlock)
This array lists the surface node numbers of the secondary surface nodes associated with each
contact point.
jConMainUid(nNodMain,nBlockAnal)
This array lists the surface node numbers of the main surface nodes that make up the facet, edge,
or analytical rigid surface associated with each contact point.
props(nProps)
User-specified vector of property values to define the frictional behavior
between the contacting surfaces.
dSlipFric(nDir,nBlock)
This array contains the incremental frictional slip during the current time
increment for each contact point in the current local coordinate system. These
incremental slips correspond to tangential motion in the time increment from
to .
This incremental slip is used to define the local coordinate system at each
contact point (see
Figure 2)
so that only the first component of dSlipFric
can be nonzero in the local system.
fStickForce(nBlock)
This array contains the magnitude of frictional force required to enforce
stick conditions at each contact point. This force depends on the previous
frictional force, the value of the penalty stiffness, and the previous
incremental slip. The penalty stiffness is assigned automatically.
Occasionally, during recovery of elastic slip associated with the penalty
method, the stick force will be assigned a negative value.
fTangPrev(nDir,nBlock)
This array contains the values of the frictional force components calculated
in the previous increment but provided in the current local coordinate system
(zero for nodes that were not in contact).
fNormal(nBlock)
This array contains the magnitude of the normal force for the contact points applied at the end
of current time increment; that is,, at time .
areaCont(nBlock)
Area associated with the contact points. The sum of the contact areas among all contact points
associated with a single secondary node equals the surface area associated with that
secondary node (equal to 1 for node-based surface nodes). Therefore, the contact area
at a contact point depends on the number of contact points currently associated with
the same secondary node. A contact point contributes a frictional stress to the
associated secondary node that is equal to
fTangential(1,k) divided by
areaCont(k).
dircosN(nDir,nBlock)
Direction cosines of the normals to the main surface at the contact points.
dirCosS1(nDir,nBlock)
Direction cosines of the incremental slip at the contact points. The
direction cosines are undefined (all components zero) if the incremental
frictional slip is zero.
shapeSec(nNodSec,nBlockEdge)
For edge-to-edge contact this array contains the shape functions of the nodes of its secondary
edge, evaluated at the location of the contact point. If the contact is not
edge-to-edge, this array is passed in as a dummy array.
shapeMain(nNodMain,nBlockAnal)
For node-to-face and edge-to-edge contact this array contains the shape functions of the nodes of
its main surface, evaluated at the location of the contact point. If the main surface
is an analytical rigid surface, this array is passed in as a dummy array.
coordSec(nDir,nNodSec,nBlock)
Array containing the nDir components of the
current coordinates of the contact points.
coordMain(nDir,nNodMain,nBlockAnal)
Array containing the nDir components of the current coordinates of
the main nodes associated with the contact points. If the main surface is an
analytical rigid surface, this array is passed in as a dummy array.
velSec(nDir,nNodSec,nBlock)
Array containing the nDir components of the
current velocity of the contact points.
velMain(nDir,nNodMain,nBlockAnal)
Array containing the nDir components of the current velocity of
the main nodes associated with the contact points. If the main surface is an
analytical rigid surface, this array is passed in as a dummy array.
tempSec(nBlock)
Current temperature of the secondary surface at the contact points.
tempMain(nBlockAnal)
Current temperature at the points on the main surface associated with the contact points.
fieldSec(nFields,nBlock)
Current user-specified predefined field variables on the secondary surface at the contact points
(initial values at the beginning of the analysis and current values during the
analysis).
fieldMain(nFields,nBlockAnal)
Current user-specified predefined field variables at the points on the main surface associated
with the contact points (initial values at the beginning of the analysis and current
values during the analysis).