* 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