3.10. User-Defined Subroutines for Contact Interfacial Behaviors

These user subroutines are available for modifying or monitoring contact element behavior (CONTA172, CONTA174, CONTA175, CONTA177, and CONTA178):

The user subroutines are called for each contact detection point of active contact pairs in each iteration during the solution. The input to these user subroutines includes the current and previous contact status, contact stresses, normal penetration/gap, tangential slip increments, and temperatures at the contact detection point and the corresponding interacting point on the target surface.

You can specify the number of extra state variables (NSTV) to be saved for the user subroutines via the NSVR command. The maximum number of extra state variables should not exceed 840. The total number of integration points of an element (nintp) is a supplied input argument for the subroutines. Therefore, the number of additional state variables per integration point is NSTV/nintp.

Use the USEROU subroutine to store user-supplied element outputs in the non-summable miscellaneous (NMISC) record. You must enter the USRCAL command in order to activate the USEROU subroutine. The maximum number of user-defined output items cannot exceed 120 and should be less than or equal to NSTV on the NSVR command. The number of NMISC records can be obtained by this function call: etyiqr(ITYPE,-110).

Keep the following points in mind when using any of these subroutines to define contact interfacial behaviors:

  • The user subroutines USERCNPROP, USERFRIC, and USERINTER all modify the contact behavior, so only a single subroutine should be used for a given contact pair. However, you can use all three subroutines in a single model as long as each subroutine acts on a unique contact pair.

  • In order to implement the USERFRIC, USERINTER, or USERWEAR subroutine in your model, you must define related properties via the TB family of commands and assign the associated material ID to the contact elements. See Writing Your Own Friction Law (USERFRIC), Defining Your Own Contact Interaction (USERINTER), and Defining Your Own Contact Surface Wear Behavior (USERWEAR) for more information.

  • The use of USERFRIC or USERINTER overrides the behavior of program-supplied interfacial features (for example, debonding defined via the TB,CZM command, impact constraints defined by KEYOPT(7) = 4, surface interaction models defined by KEYOPT(12)). Therefore, you must take care if behaviors implemented by such features are desired. In this case, you must program the desired behavior into the USERFRIC or USERINTER subroutine instead of relying on program input.

  • The user subroutines USERFRIC and USERINTER should not be used if the fast thermal transient solver option (THOPT,QUASI) is being used.

  • You can use the /UPF command in batch mode to link user subroutines into Mechanical APDL. The command method cannot be used when the program is run in interactive mode.

For more information about the /UPF command and other methods of implementing user subroutines, see Compiling and Linking UPFs on Linux Systems and Compiling and Linking UPFs on Windows Systems in the Programmer's Reference.

3.10.1. Defining Your Own Real Constant (USERCNPROP)

The USERCNPROP subroutine enables you to define your own contact properties via real constants. For example, you can define a nonlinear contact pressure-penetration relationship instead of utilizing a linear one (that is, using a constant contact stiffness). The contact stiffness can be varied due to pressure, penetration, temperature, and your own state variables.

The real constants that can be defined via this user subroutine are noted in the real constant table found in each contact element description (CONTA172, CONTA174, CONTA175, CONTA177, and CONTA178).

Some of the most commonly used input and output arguments for USERCNPROP are discussed below. For a complete list of input and output arguments, see the description of Subroutine usercnprop (Programming Your Own Contact Properties) in the Programmer's Reference.

When defining user-defined real constants with the R, RMORE, or RMODIF command, you must use the Mechanical APDL reserved table name _CNPROP and enclose it in % signs (%_CNPROP%). When a value field in one of these commands is set to %_CNPROP%, the program internally calls the USERCNPROP subroutine. For example, to specify your own normal contact stiffness, FKN, you would issue a command similar to the following:

RMODIF,NSET,3,%_CNPROP%      ! NSET is the real constant set ID associated with the contact pair

You can define the real constant as a function of certain input arguments as described in the following table:

USERCNPROP Input Argument Description
kstatContact status
stress(1)Tangential stress in direction 1
stress(2)Tangential stress in direction 2
stress(3)Contact normal pressure (positive value for compression, negative value for tension)
stress(4)Heat flux flowing into contact surface (positive value is heat flowing out of the surface, negative value is heat flowing into the surface)
stress(5)Heat flux flowing into target surface (positive value is heat flowing out of the surface, negative value is heat flowing into the surface)
stress(6)Electric current density (or pore fluid flux density) flowing into contact surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)
stress(7)Electric current density (or pore fluid flux density) flowing into target surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)
stress(8)Diffusion density flowing into contact surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)
stress(9)Diffusion density flowing into target surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)

Certain passed-in arguments such as contact status (kstat), contact pressure (stress(3)), and tangential stresses (stress(1) and stress(2)) are not current (that is, from the current iteration) for real constants FKN, TAUMAX, CNOF, FKOP, FKT, PPCN. FDMN, FDMT. In this case, the values from the previous iteration are used instead. However, the contact status, contact pressure, and tangential stresses are current for all non-structural related real constants (such as TCC, ECC, MCC, PCC, RDVF, ABPP, FPFT, DCC, DCON, ABDC).

Other input arguments include those listed in the following table. These arguments are all current.

USERCNPROP Input Argument Description
strain(1)Tangential slip increment in direction 1
strain(2)Tangential slip increment in direction 2
strain(3)Normal penetration/gap (positive value represents penetration, negative value represents gap)
strain(4)Temperature at the contact detection point
strain(5)Temperature at the target point
strain(6)Voltage (or pore pressure) at the contact point
strain(7)Voltage (or pore pressure) at the target point
strain(8)Concentration at the contact point
strain(9)Concentration at the target point
strain0(i) Array variable containing the above values at the end of the previous substep
intIn(1) to intIn(21)Integer values such as element number, analysis type, and so on
realIn(1) to realIn(12)Real values such as contact element length, pinball radius, and so on

Real constants can be defined in the time or frequency domain, depending on the analysis type. For static and transient analyses, the input argument realIn(7) represents the current time value. For harmonic analysis, realIn(7) represents the current frequency value.

You can also define your real constants as a function of extra solution-dependent state variables. The extra state variables can be updated and used within the user subroutine. Use the NSVR command to specify the number of extra state variables that need to be saved for the USERCNPROP subroutine, as described in the table of input/output arguments shown below.

USERCNPROP Input/Output Argument Description Notes
usvrUser-defined state variablesUse the NSVR command to size the usvr array and to set nuval to the same value as the number of variables on NSVR. This array is passed in as the values at the beginning of the substep. If any of the solution-dependent state variables are being used for the user-defined interaction behavior, they must be updated to the values at the end of the substep (when kupdhis = 1).
keyerrElement level error key

Key to indicate if there are any element formulation errors such as abrupt changes in contact status or too much penetration. The error could be caused by an incremental step that is too large or an illegal model.

= 0, no error (preset value before calling)
= 1, error(s) occurred

The program decides to stop the analysis or cutback the substep (bi-section) based on other user input and information at a higher level.

The user subroutine passes in the position of the real constant in the real constant table (kcnprop), and you need to return the value of the relevant real constant, cnprop(1). If the real constant is a function of contact gap/penetration, contact pressure, or temperature, you can also return the associated derivatives as described in the following table:

USERCNPROP Output Argument Description Notes
cnprop(1)Updated value of the real constant 
cnprop(2)Derivative of the real constant with respect to the gap functionFor example, the thermal conductance TCC can be defined as a function of geometric penetration/gap (positive value for penetration, negative value for gap). If the real constant is not a function of gap, you simply return cnprop(2) = 0.0.
cnprop(3)Derivative of the real constant with respect to contact pressureFor example, the thermal conductance TCC can be defined as a function of contact pressure (positive value for compression, negative value for tension). If the real constant is not a function of pressure, you simply return cnprop(3) = 0.0.
cnprop(4)Derivative of the real constant with respect to temperature at the contact detection point If the real constant is not a function of temperature at the contact point, you simply return cnprop(4) = 0.0.
cnprop(5)Derivative of the real constant with respect to temperature at the targetIf the real constant is not a function of temperature at the target, you simply return cnprop(5) = 0.0.

The subroutine can be called multiple times for a contact detection point during each iteration, based on how many real constants are defined through the label %_CNPROP%. Be careful to define the correct position of the user-defined variables (usvr) during each call. Otherwise, the previously defined variables could be overwritten during subsequent access to the subroutine within an iteration.

You can preassign the contact pair ID (RID in the example below) to a parameter (‘PAIRID’ in the example below) and then call subroutine PAREVL inside of USERCNPROP to get the contact pair ID. Follow the example below as a template for using this function inside of USERCNPROP:

cName = 'PAIRID'
subc(1) = 0.0d0
call parevl(cName,0,subc(1),2,RID,string,kerr)

In this way, one unified USERCNPROP routine can handle contact properties not only for different real constants, but also for different contact pairs.

3.10.2. Writing Your Own Friction Law (USERFRIC)

The USERFRIC subroutine enables you to program your own friction model for 2D and 3D contact elements (CONTA172, CONTA174, CONTA175, CONTA177, and CONTA178) when the existing program-supplied friction models are not adequate. The frictional stresses can be defined as a function of variables such as slip increments, sliding rate, temperature, and other input arguments. You can specify a number of properties or constants associated with your friction model, and you can introduce extra solution-dependent state variables that can be updated and used within the subroutine.

Some of the most commonly used input and output arguments for USERFRIC are discussed below. For a complete list of input and output arguments, see the description of Subroutine userfric (Writing Your Own Friction Laws) in the Programmer's Reference.

After writing a USERFRIC subroutine to program your friction model, you incorporate the model in your analysis by using the TB,FRIC command with TBOPT = USER and specifying the friction properties on the TBDATA command, as shown below. The number of friction properties is defined through NPTS on the TB,FRIC command.

TB,FRIC,1,,2,USER     ! Activate user defined friction model; NPTS = 2
TBDATA,1,PROP1,PROP2  ! Define friction properties

Field variables specified with the TBFIELD command are not available for TB,FRIC,,,,USER.

Use the NSVR command to specify the number of extra state variables that need to be saved for the USERFRIC subroutine.

Use the USEROU subroutine to store user-supplied element outputs in non-summable miscellaneous (NMISC) records. You must enter the USRCAL command in order to activate the USEROU subroutine. The maximum number of user-defined output items should not exceed the number of user-defined state variables.

The USERFRIC subroutine is called at the contact detection point when the contact is closed.

Some of the input arguments are described in the following table:

USERFRIC Input Argument Description Notes
dslip(ncomp)Slip increment for the current subset 
presCurrent normal contact pressure (positive value for compression, negative value for tension) 
tau(ncomp)Frictional stress component at the beginning of the substep. The passed-in values include the contribution from Lagrange multipliers if the Lagrange multiplier method (KEYOPT(2) = 4) is specified.
knCurrent normal contact stiffness  
ktTangential contact stiffnessYou can use the passed-in values for computing the frictional stresses. However, you can also pick a suitable value that allows minimal tangential elastic slip during sticking without adversely affecting the convergence. A possible choice could be kt = mu*kn. For the Lagrange multiplier method (KEYOPT(2) = 4), you should use a small kt (several orders of magnitude smaller than mu*pres).
tcontCurrent temperature at the contact point 
ttargCurrent temperature at the target point 
uprop(npropu)User-defined frictional properties defined through the TB,FRIC command 
kupdhisKey to indicate if history-dependent variables (user-defined) need to be updated after the substep has converged
kupdhis = 1: update (converged)
kupdhis = 0: do not update (not converged)

Some of the input/output arguments are described in the following table:

USERFRIC Input/Output Argument Description Notes
kstatContact status:
far-field (kstat = 0)
near-field (kstat = 1)
sliding (kstat = 2)
sticking (kstat = 3)
You can make decisions about the sticking/sliding condition based on the slip increments and the updated frictional stresses.
tau(ncomp)Updated frictional stressThis is passed in as the values of the frictional stress component at the beginning of the substep and must be updated to the values at the end of the substep. The passed-in values include the contribution from Lagrange multipliers, if the Lagrange multiplier method (KEYOPT(2) = 4) is defined. In the user subroutine, you can define the friction stresses as a function of slip increment (dslip), normal contact pressure (pres), and other input arguments or user-defined state variables.
slip(ncomp)Total accumulated slipThis is the accumulated value of dslip from the previous substeps.
muFriction coefficientThis is passed in as the value at the beginning of the current substep. It is updated to be the value at the end of the current substep.

You must define the following output arguments:

USERFRIC Output Argument Description Notes
dt(i,j)Partial derivative of frictional stresses and normal pressure with respect to the slip increments, normal gap distance, and temperaturesThe partial derivative of frictional stresses with respect to the temperatures dt(1,4), dt(1,5), dt(2,4), and dt(2,5) can be used only for coupled thermal-structural and coupled thermal-electrical-structural analyses in which the frictional stresses are defined as a function of the surface temperatures.
dtdp(ncomp)Partial derivative of frictional stresses with respect to the normal pressureThis contributes to the element stiffness matrix when a Lagrange multiplier method (KEYOPT(2)= 3 or 4) is used.
usvr(nuval)User-defined state variablesUse the NSVR command to size the usvr array and to set nuval to the same value as the number of variables on NSVR. This array is passed in as the values at the beginning of the substep. If any of the solution-dependent state variables are being used for the user-defined friction behavior, they must be updated to the values at the end of the substep (when kupdhis = 1).
fdissIncremental frictional dissipationThe units are energy per unit area. For purely structural analysis, this argument is used for output only and has no effect on the solution. In coupled thermal-structural and coupled thermal-electrical-structural analyses, the dissipation is converted into heat.
elenerIncremental elastic stored energy densityThis argument is used for output only and has no effect on the solution.

3.10.3. Defining Your Own Contact Interaction (USERINTER)

As an alternative to the USERFRIC subroutine that allows for user-defined frictional behavior, subroutine USERINTER is available for defining complex interactions between contacting surfaces, including interactions in the normal and tangential directions, and coupled-field interactions.

You can write a USERINTER subroutine to program your own contact interactions for 2D and 3D contact elements (CONTA172, CONTA174, CONTA175, CONTA177, and CONTA178) when the existing interaction models are not adequate. The contact normal stress, tangential stress, and heat flux can be defined as a function of variables such as slip increment, sliding rate, temperature, and other input arguments. You can specify a number of properties or constants associated with your interaction model, and you can introduce extra solution-dependent state variables that can be updated and used within the subroutine.

Some of the most commonly used input and output arguments for USERINTER are discussed below. For a complete list of input and output arguments, see the description of Subroutine userinter (Writing Your Own Contact Interactions) in the Programmer's Reference.

After writing a USERINTER subroutine to program your interaction model, you incorporate the model in your analysis by using the command TB,INTER with TBOPT = USER and specifying the interaction properties on the TBDATA command as shown below. The number of interaction properties is defined through NPTS on the TB,INTER command.

TB,INTER,1,,2,USER     ! Activate user defined contact interaction; NPTS = 2
TBDATA,1,PROP1,PROP2   ! Define interaction properties

Field variables specified with the TBFIELD command are not available for TB,INTER,,,,USER.

Use the NSVR command to specify the number of extra state variables that need to be saved for the USERINTER subroutine.

Use the USEROU subroutine to store user-supplied element outputs in non-summable miscellaneous (NMISC) records. You must enter the USRCAL command in order to activate the USEROU subroutine. The maximum number of user-defined output items should not exceed the number of user-defined state variables.

The USERINTER subroutine is called at each contact detection point in each iteration.

In a structural analysis, you must define the current stresses. In a coupled thermal-structural analysis or a coupled thermal-electrical-structural analysis, you must also define the heat flux and electric current density, respectively, across the interface for the current time. The interaction calculation is based on (a) the relative motion between the contact detection point and the associated intersecting target point, (b) temperatures, and (c) user-defined state variables. The state variables can be used and updated within this subroutine. You must also define the material tangent modulus (interface stiffness matrix) to ensure proper convergence behavior.

If effects of contact damping are taken into account, you need to define the interface damping matrix. The interface damping matrix can be used in a complex modal analysis, a full transient structural analysis, or a harmonic analysis at a given frequency.

Some of the input arguments are described in the following table:

USERINTER Input Argument Description Notes
dslip(ncomp)Current strain component 
strain(1)Slip increment in direction 1Mechanical component.
strain(2)Slip increment in direction 2 (3-d only)Mechanical component.
strain(3)Contact normal penetration/gap (positive value represents penetration, negative value represents gap) Mechanical component.
strain(4)Temperature at the contact detection point This argument is generally used for coupled thermal-structural or thermal-electric-structural analysis. The temperature components strain(4) and strain(5) can also be used for a structural analysis as long as it is defined through temperature loadings.
strain(5)Temperature at the target intersecting pointThis argument is generally used for coupled thermal-structural or thermal-electric-structural analysis. The temperature components strain(4) and strain(5) can also be used for a structural analysis as long as they are defined through temperature loadings.
strain(6)Voltage (or pore pressure) at the contact pointThis argument is used for coupled thermal-electric-structural analysis, or for coupled pore fluid-structural analysis
strain(7)Voltage (or pore pressure) at the target pointThis argument is used for coupled thermal-electric-structural analysis, or for coupled pore fluid-structural analysis
strain(8)Concentration at the contact pointThis argument is used for coupled structural-thermal-electric-diffusion analysis
strain(9)Concentration at the target pointThis argument is used for coupled structural-thermal-electric-diffusion analysis
uprop(npropu)User-defined interfacial properties (defined through the TB,INTER command) 
kupdhisKey to indicate if history-dependent variables (user-defined) need to be updated after the substep has converged
kupdhis = 1: update (converged)
kupdhis = 0: do not update (not converged)
intIn(1) to intIn(20)Integer values such as element number, analysis type, and so on 
realIn(1) to realIn(14)Real values such as contact element length, pinball radius, and so on 

The USERINTER subroutine can be used in the time or frequency domain, depending on the analysis type. For static and transient analyses, the input argument realIn(7) represents the current time value. For harmonic analysis, the input argument realIn(7) represents the current frequency value.

Some of the input/output arguments are described in the following table:

USERINTER Input/Output Argument Description Notes
kstatContact status:
far-field (kstat = 0)
near-field (kstat = 1)
sliding (kstat = 2)
sticking (kstat = 3)
You can make decisions about the contact status based on the relative position of the contact detection point with respect to the target surface, the slip increments, and other state variables.
stress(1)Tangential stress in direction 1The passed-in values include the contribution from Lagrange multipliers if the pure Lagrange multiplier method (KEYOPT(2) = 4) is specified.
stress(2)Tangential stress in direction 2 (3D only)The passed-in values include the contribution from Lagrange multipliers if the pure Lagrange multiplier method (KEYOPT(2) = 4) is specified.
stress(3)Contact normal pressure (positive value for compression, negative value for tension)The passed-in values include the contribution from Lagrange multipliers if a Lagrange multiplier method (KEYOPT(2) = 3 or 4) is specified.
stress(4)Heat flux (per area) flowing into the contact surface (positive value is heat flowing out of the surface, negative value is heat flowing into the surface)Defined for a coupled thermal-structural or a thermal-electric-structural analysis.
stress(5)Heat flux (per area) flowing into the target surface (positive value is heat flowing out of the surface, negative value is heat flowing into the surface)Defined for a coupled thermal-structural or a thermal-electric-structural analysis.
stress(6)Electric current density (or pore fluid flux density) flowing into contact surface (positive value is flux flowing out of surface, negative value is flux flowing into surface)Defined for a coupled thermal-electric-structural analysis or a coupled pore-fluid-structural analysis
stress(7)Electric current density (or pore fluid flux density) flowing into target surface (positive value is flux flowing out of surface, negative value is flux flowing into surface)Defined for a coupled thermal-electric-structural analysis or a coupled pore-fluid-structural analysis
stress(8)Diffusion density flowing into contact surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)Defined for coupled structural-thermal-electric-diffusion analysis
stress(9)Diffusion density flowing into target surface (positive value is flux flowing out of the surface, negative value is flux flowing into the surface)Defined for coupled structural-thermal-electric-diffusion analysis
usvr(nuval)User-defined state variablesUse the NSVR command to size the usvr array and to set nuval to the same value as the number of variables on NSVR. This array is passed in as the values at the beginning of the substep. If any of the solution-dependent state variables are being used for the user-defined interaction behavior, they must be updated to the values at the end of the substep (when kupdhis = 1).
mu Friction coefficientThis is passed in as the value at the beginning of the current substep. It is updated to be the value at the end of the current substep.
elenerTotal elastic stored energy densityThe previous substep converged total elastic stored energy density is passed in, and the current substep total elastic stored energy density is output.
keycnvElement level convergence

Key to flag if this element satisfies the user defined element convergence criterion.

= 1, yes, the criterion is satisfied or there is no criterionl (preset value before calling)
= 0, no, the element does not satisfy the element convergence criterion. If this is the case, the iteration will not converge but will continue, even when both force and displacement converge.

You must define the following output arguments:

USERINTER Output Argument Description Notes
dt(ncomp,ncomp)Partial derivative of the ith stress component with respect to the jth component of the relative strain increment array to ensure proper convergence behaviorsTerms dt(i,,j) (i > 3 or j > 3) are only used for a coupled thermal-structural analysis, a coupled thermal-electrical-structural analysis, a coupled pore pressure-structural analysis, or a coupled structural-thermal-electric-diffusion analysis in which the stress component is a function of the surface temperatures/voltage or the flux is a function of mechanical strain increments (gap/slip).
dtdp(ncomp)Partial derivative of the frictional stresses with respect to the normal pressureThis argument contributes to the element stiffness matrix when a Lagrange multiplier method (KEYOPT(2)= 3 or 4) is used.
damp(3,3)Interface damping matrix (structure only)This argument contributes to the element damping matrix.
fdissIncremental frictional dissipationThe units are energy per unit area. For purely structural analysis, this argument is used for output only and has no effect on the solution. In coupled thermal-structural and coupled thermal-electrical-structural analyses, the dissipation is converted into heat.
keyerrElement level error key

Key to indicate if there are any element formulation errors such as abrupt changes in contact status or too much penetration. The error could be caused by an incremental step that is too large or an illegal model.

= 0, no error (preset value before calling)
= 1, error(s) occurred

The program decides to stop the analysis or cutback the substep (bi-section) based on other user input and information at a higher level.

When using a Lagrange multiplier method for normal constraint (KEYOPT(2) = 3 or 4), you should pick a very small normal contact stiffness, kn (several orders of magnitude smaller than the contact pressure). The passed-in normal pressure (stress(3)) includes the contribution from the normal Lagrange multiplier.

When using the Lagrange multiplier method for tangential constraint (KEYOPT(2) = 4), you should pick a very small tangential contact stiffness, kt (several orders of magnitude smaller than mu*pressure). The passed-in tangential stresses (stress(1), stress(2)) include the contributions from the tangential Lagrange multipliers.

Use the following example as a template to activate the user subroutines.

You can preassign the contact pair ID (RID in the example below) to a parameter (‘PAIRID’ in the example below) and then call subroutine PAREVL inside of USERINTER to get the contact pair ID. Follow the example below as a template for using this function inside of USERINTER:

cName = 'PAIRID'
subc(1) = 0.0d0
call parevl(cName,0,subc(1),2,RID,string,kerr)

In this way, one unified USERINTER routine can handle different interactions based on contact pair ID.

Example 3.4: Using the /UPF Command to Link USERINTER

! The /UPF command offers the simplest method for linking 
! user-programmable features into Mechanical APDL.
! It cannot be used when Mechanical APDL is run in interactive mode
! 

/UPF,userinter.F
/UPF,userou.F
/prep7
…
!
! define contact type
!
ITYPE = 4

et,ITYPE,172

!
!Define user interactions
!
TB,INTER,1, ,1,USER 
tbdata,1,0.42 ! define friction coefficient.

!Additional saved variables
! The size of this array is: 
! no of variables(nuval)* no of integration points(nintp). 
!
nsvr,ITYPE,5*2
…
/solu
…
!
! Activate user subroutine userou 
! 
usrcal,userou

solve

/post1

…
! output additional state variables
!
! You can find the maximum number of NMISC for contact elements by 
! issuing the following function call
!
   maxnmisc=etyiqr(ITYPE,-110)

   etab,MU1,NMISC,maxnmisc+1
   etab,AASR1,NMISC,maxnmisc+2
   etab,AASS1,NMISC,maxnmisc+3
   etab,RASR1,NMISC,maxnmisc+4
   etab,RASS1,NMISC,maxnmisc+5

   etab,MU2,NMISC,maxnmisc+6
   etab,AASR2,NMISC,maxnmisc+7
   etab,AASS2,NMISC,maxnmisc+8
   etab,RASR2,NMISC,maxnmisc+9
   etab,RASS2,NMISC,maxnmisc+10

!
! Output the user defined variables
!
   pretab,MU1,AASR1,AASS1,RASR1,RASS1
   pretab,MU2,AASR2,AASS2,RASR2,RASS2

3.10.4. Defining Your Own Contact Surface Wear Behavior (USERWEAR)

The USERWEAR subroutine enables you to define your own contact surface wear behavior. Specifically, you can define the wear increment as a function of contact pressure and sliding velocities. For details, see User-Defined Wear Model (USERWEAR).