*     S30FAF Example Program Text
*     Mark 22 Release. NAG Copyright 2007.
*     .. Parameters ..
      INTEGER          NIN, NOUT
      PARAMETER        (NIN=5,NOUT=6)
      INTEGER          LDP, MMAX, NMAX
      PARAMETER        (LDP=8,MMAX=8,NMAX=8)
*     .. Local Scalars ..
      DOUBLE PRECISION H, K, Q, R, S, SIGMA
      INTEGER          I, IFAIL, J, M, N
      CHARACTER        PUT
      CHARACTER*2      TYPE
*     .. Local Arrays ..
      DOUBLE PRECISION P(LDP,NMAX), T(NMAX), X(MMAX)
*     .. External Subroutines ..
      EXTERNAL         S30FAF
*     .. Executable Statements ..
      WRITE (NOUT,*) 'S30FAF Example Program Results'
      WRITE (NOUT,*)
      WRITE (NOUT,*) 'Standard Barrier Option'
*     Skip heading in data file
      READ (NIN,*)
*     Read problem parameters., TYPE
      READ (NIN,*) PUT, TYPE
      READ (NIN,*) S, H, K, SIGMA, R, Q
      READ (NIN,*) M, N
*
      IF (M.LE.MMAX .AND. N.LE.NMAX) THEN
*        Read array of strike/exercise prices, X
         READ (NIN,*) (X(I),I=1,M)
*        Read array of times to expiry
         READ (NIN,*) (T(I),I=1,N)
*
         IFAIL = 1
*
         CALL S30FAF(PUT,TYPE,M,N,X,S,H,K,T,SIGMA,R,Q,P,LDP,IFAIL)
*
         IF (IFAIL.EQ.0) THEN
            IF (PUT.EQ.'C' .OR. PUT.EQ.'c') THEN
               WRITE (NOUT,*) 'Call :'
            ELSE IF (PUT.EQ.'P' .OR. PUT.EQ.'p') THEN
               WRITE (NOUT,*) 'Put :'
            END IF
            IF (TYPE.EQ.'DI' .OR. TYPE.EQ.'di' .OR. TYPE.EQ.'Di' .OR.
     +          TYPE.EQ.'dI') THEN
               WRITE (NOUT,*) 'Down-and-In'
            ELSE IF (TYPE.EQ.'DO' .OR. TYPE.EQ.'do' .OR. TYPE.EQ.
     +               'Do' .OR. TYPE.EQ.'dO') THEN
               WRITE (NOUT,*) 'Down-and-Out'
            ELSE IF (TYPE.EQ.'UI' .OR. TYPE.EQ.'ui' .OR. TYPE.EQ.
     +               'Ui' .OR. TYPE.EQ.'uI') THEN
               WRITE (NOUT,*) 'Up-and-In'
            ELSE IF (TYPE.EQ.'UO' .OR. TYPE.EQ.'uo' .OR. TYPE.EQ.
     +               'Uo' .OR. TYPE.EQ.'uO') THEN
               WRITE (NOUT,*) 'Up-and-Out'
            END IF
*
            WRITE (NOUT,'(A,1X,F8.4)') '  Spot       = ', S
            WRITE (NOUT,'(A,1X,F8.4)') '  Barrier    = ', H
            WRITE (NOUT,'(A,1X,F8.4)') '  Rebate     = ', K
            WRITE (NOUT,'(A,1X,F8.4)') '  Volatility = ', SIGMA
            WRITE (NOUT,'(A,1X,F8.4)') '  Rate       = ', R
            WRITE (NOUT,'(A,1X,F8.4)') '  Dividend   = ', Q
*
            WRITE (NOUT,*)
            WRITE (NOUT,*) '   Strike    Expiry    Option Price'
            DO 40 I = 1, M
               DO 20 J = 1, N
                  WRITE (NOUT,99999) X(I), T(J), P(I,J)
   20          CONTINUE
   40       CONTINUE
         ELSE
            WRITE (NOUT,*)
            WRITE (NOUT,99998) IFAIL
         END IF
      END IF
*
99999 FORMAT (1X,2(F9.4,1X),6X,F9.4)
99998 FORMAT (1X,' ** S30FAF returned with IFAIL = ',I5)
      END
