C
C User subroutine vuhard
      subroutine vuhard (
C Read only -
     *     nblock, 
     *     nElement, nIntPt, nLayer, nSecPt, 
     *     lAnneal, stepTime, totalTime, dt, cmname,
     *     nstatev, nfieldv, nprops, 
     *     props, tempOld, tempNew, fieldOld, fieldNew,
     *     stateOld,
     *     eqps, eqpsRate,
C Write only -
     *     yield, dyieldDtemp, dyieldDeqps,
     *     stateNew )
c
      include 'vaba_param.inc'
c
      dimension nElement(nblock),
     *     props(nprops), 
     *     tempOld(nblock),
     *     fieldOld(nblock,nfieldv), 
     *     stateOld(nblock,nstatev), 
     *     tempNew(nblock),
     *     fieldNew(nblock,nfieldv),
     *     eqps(nblock),
     *     eqpsRate(nblock),
     *     yield(nblock),
     *     dyieldDtemp(nblock), 
     *     dyieldDeqps(nblock,2),
     *     stateNew(nblock,nstatev)
c
      parameter ( zero = 0.d0, eqpsFail = 0.25d0 ) 
      parameter ( one = 1.0d0, small=1.0d-9)
c
      character*80 cmname
      data ldiagnostic /1/
c
      if ( ldiagnostic .eq. 1 ) then 
         ldiagnostic = 0
         if (nprops .eq. 5) then 
            Yield0 = props(1)
            if (Yield0 .lt. small) then
               write(*,*)'VUHARD: Small/Negative Yield0'
               call xplb_exit
            endif
            eqpsRate0 = props(2)
            if (eqpsRate0 .le. zero) then
               write(*,*) 'VUHARD: Zero/Negative eqpsRate0'
               call xplb_exit
            endif
            power = props(3)
            if (power .lt. zero) then
               write(*,*)'VUHARD: Negative power'
               call xplb_exit
            endif
            TangentMod = props(4)
            YoungsMod = props(5)
            if (YoungsMod .le. TangentMod) then
               write(*,*)'VUHARD: YoungsMod less than TangentMod'
               call xplb_exit
            endif
         else
            write(*,*) 'VUHARD: Wrong number of properties'
            call xplb_exit
         endif
      end if
c     
      Yield0 = props(1)
      eqpsRate0Inv = one / props(2)
      power = props(3)
      TangentMod = props(4)
      YoungsMod = props(5)
      Hardness = YoungsMod * TangentMod
      Hardness = Hardness / (YoungsMod - TangentMod)
      do k = 1, nblock
         dyieldDeqps(k,1) = Hardness
         strainrate = eqpsRate(k) * eqpsRate0Inv
         strain = eqps(k)
         if (strainrate .gt. small) then
            Yield(k) = (Yield0 * (one + (strainrate ** power)))
     *           + (Hardness * strain)
            dyieldDeqps(k,2) = (strainrate ** (power-one))
     *           * Yield0 * power * eqpsRate0Inv
         else
            Yield(k) = (Yield0 * (one + (small ** power)))
     *           + (Hardness * strain)
            dyieldDeqps(k,2) = (small ** (power-one))
     *           * Yield0 * power * eqpsRate0Inv
         endif
      end do
c
      return
      end
