      SUBROUTINE ACT_OLV(T, P, XFO, XFA, FORSTERITE, FAYALITE, LSTOP)
C 
      IMPLICIT DOUBLE PRECISION(A-H,O-Z)
      IMPLICIT INTEGER(I-N) 
C 
      LOGICAL LSTOP, FIRST
      DATA FIRST / .TRUE. /
C
      IF(FIRST) THEN
         FIRST = .FALSE.
         EXPMIN = X02AEF(EXPMIN)/3.0
         EXPMAX = X02AFF(EXPMAX)/3.0
         EPSMCH = X02AAF(EPSMCH)
         SREPS = SQRT(EPSMCH)
      END IF

C
      IF((XFO.LT.0.0).OR.(XFA.LT.0.0)) THEN
           LSTOP = .TRUE.
           RETURN
      END IF
      LSTOP = .FALSE.
C
      XFEM1 = XFA
      XFEM2 = XFA
      XMGM1 = XFO
      XMGM2 = XFO
C
      W = 4860.0    ! Macroscopic 2W+dH for Olivine (cals)
      DWDP = 0.0072 ! cals/bar
      W = W + DWDP*(P-1.0)
C
      GAM1 = W*XFEM1*XFEM2/(1.98726*T)
      IF((GAM1.GE.EXPMIN).AND.(GAM1.LE.EXPMAX)) THEN
         GAM1 = EXP(GAM1)*XMGM1*XMGM2
      ELSE
         LSTOP = .TRUE.
         RETURN
      END IF
C
      GAM2 =  W*XMGM1*XMGM2/(1.98726*T)
      IF((GAM2.GE.EXPMIN).AND.(GAM2.LE.EXPMAX)) THEN
         GAM2 = EXP(GAM2)*XFEM1*XFEM2
      ELSE
         LSTOP = .TRUE.
         RETURN
      END IF
C
      FORSTERITE = GAM1 
      FAYALITE = GAM2 
C 
      RETURN
      END 
