c
c User subroutine VFRICTION to define friction forces
c
      subroutine vfriction (
c Write only - 
     *   fTangential, 
c Read/Write - 
     *   state,
c Read only - 
     *   nBlock, nBlockAnal, nBlockEdge, 
     *   nNodState, nNodSlv, nNodMst, 
     *   nFricDir, nDir, 
     *   nStates, nProps, nTemp, nFields, 
     *   jFlags, rData, 
     *   surfInt, surfSlv, surfMst, 
     *   jConSlvUid, jConMstUid, props, 
     *   dSlipFric, fStickForce, fTangPrev, fNormal, 
     *   areaSlv, dircosN, dircosSl, 
     *   shapeSlv, shapeMst, 
     *   coordSlv, coordMst, 
     *   velSlv, velMst, 
     *   tempSlv, tempMst, 
     *   fieldSlv, fieldMst )
c
c Array dimensioning variables:
c
c      nBlockAnal = nBlock    (non-analytical-rigid master surface)
c      nBlockAnal = 1         (analytical rigid master surface)
c      nBlockEdge = 1         (non-edge-type slave surface)
c      nBlockEdge = nBlock    (edge-type slave surface)
c      nNodState  = 1         (node-type slave surface)
c      nNodState  = 4         (edge-type slave surface)
c      nNodSlv    = 1         (node-type slave surface)
c      nNodSlv    = 2         (edge-type slave surface)
c      nNodMst    = 4         (facet-type master surface)
c      nNodMst    = 2         (edge-type master surface)
c      nNodMst    = 1         (analytical rigid master surface)
c
c Surface names surfSlv and surfMst are not available for
c general contact (set to blank).
c
      include 'vaba_param.inc'
      dimension fTangential(nFricDir,nBlock),
     *   state(nStates,nNodState,nBlock),
     *   jConSlvUid(nNodSlv,nBlock), 
     *   jConMstUid(nNodMst,nBlockAnal), 
     *   props(nProps),
     *   dSlipFric(nDir,nBlock),
     *   fStickForce(nBlock), 
     *   fTangPrev(nDir,nBlock),
     *   fNormal(nBlock), 
     *   areaSlv(nBlock),
     *   dircosN(nDir,nBlock),
     *   dircosSl(nDir,nBlock), 
     *   shapeSlv(nNodSlv,nBlockEdge), 
     *   shapeMst(nNodMst,nBlockAnal), 
     *   coordSlv(nDir,nNodSlv,nBlock), 
     *   coordMst(nDir,nNodMst,nBlockAnal), 
     *   velSlv(nDir,nNodSlv,nBlock), 
     *   velMst(nDir,nNodMst,nBlockAnal), 
     *   tempSlv(nBlock), 
     *   tempMst(nBlockAnal),
     *   fieldSlv(nFields,nBlock),
     *   fieldMst(nFields,nBlockAnal)
c
      parameter( iKStep    = 1,
     *           iKInc     = 2,
     *           iLConType = 3,
     *           nFlags    = 3 )
      parameter( iTimStep      = 1,
     *           iTimGlb       = 2,
     *           iDTimCur      = 3,
     *           iFrictionWork = 4, 
     *           nData         = 4 )
c
      dimension jFlags(nFlags), rData(nData)
      character*80 surfInt, surfSlv, surfMst 
      parameter( zero=0.d0, one=1.d0 )
c
      us = props(1)
      uk = props(2)
      dc = props(3)
      du = us - uk
      dTimCurInv = one / rData(iDTimCur)
c
      do k = 1, nBlock
         fn = fNormal(k)
         fs = fStickForce(k)
         slipRateNorm = sqrt( dSlipFric(1,k)*dSlipFric(1,k) +
     *                        dSlipFric(2,k)*dSlipFric(2,k) +
     *                        dSlipFric(3,k)*dSlipFric(3,k) )*dTimCurInv
         u = uk + du*exp( -dc*slipRateNorm )
         ft = min ( u*fn, fs )
         fTangential(1,k) = -ft
         fTangential(2,k) = zero
       end do
c
      return
      end