c c c
      program interface
c
c    Example of the use of the INTERFACE structure to
c    create a generic function interface.  No function
c    named "saxpy" actually exists, but the INTERFACE
c    lets Fortran chose between "rsaxpy" and "isaxpy"
c    depending upon argument types.
c
c     John Mahaffy  4/3/96
c
      implicit none
      integer i
      real, dimension(10) :: z,y,x=(/(i,i=1,10)/)
c
      integer, dimension(10) :: m,l,k=(/(i,i=1,10)/)
c
      data y /5*1,5*2/
      data l /5*1,5*2/
c
c   interface block to permit a vector valued
c   function named saxpy
c
      interface saxpy
c
c       interface to the REAL version of the function
c
         function rsaxpy (a,x,y)
            real x(:),y(:),a
            real rsaxpy(size(x))
c
c    Declare x,y,a as input to saxpy, a good compiler
c    should warn you if they are undefined
c
            intent (in) x,y,a
         end function rsaxpy
c
c       interface to the INTEGER version of the function
c
         function isaxpy (a,x,y)
            integer, intent(in) :: x(:),y(:),a
            integer isaxpy(size(x))
         end function isaxpy
c
      end interface
c
c
c   Begin  Executable Statements
c
c   The next use of "saxpy" will actually  be using
c   "rsaxpy"
c
      z = saxpy(2.,x,l)
      write (*,2001)'a', 2.0
      write(*,2001) 'x', x
      write(*,2001) 'y', y
      write(*,*) ' For z = a x + y '
      write(*,2001) 'z',z
c
c   The next use of "saxpy" will actually  be using
c   "isaxpy"
c
      m = saxpy(2 ,k,l)
      write (*,2002)'a', 2
      write(*,2002) 'k', k
      write(*,2002) 'l', l
      write(*,*) ' For m = a k + l '
      write(*,2002) 'm',m
      stop
 2001 format (/, 1x,a,' = ', 5f8.1,/, (5x,5f8.1))
 2002 format (/, 1x,a,' = ', 5i5,/, (5x,5i5))
      end
c
      function rsaxpy(a,x,y)
c
c   Multply all contents of an array "x" by the scalar "a"
c   then add the result to the array "y"
c
c   John Mahaffy    4/3/96
c
c
      implicit none
      real, dimension (:) :: x,y
      real a, rsaxpy(size(x))
c
c   The next line combined with a good compiler should
c   prevent you from accidently redefining a, x, or y
c   within the subprogram.  Silly here, but not so far-
c   fetched if the subprogram drags on for a 1000 lines
c
      intent (in) a,x,y
c
      a=3.1
      rsaxpy =  a*x + y
      return
      end
c
      function isaxpy(a,x,y)
c
c   Multply all contents of an array "x" by the scalar "a"
c   then add the result to the array "y"
c
c   John Mahaffy    4/3/96
c
      implicit none
      integer, dimension (:), intent(in) :: x,y
      integer, intent(in) :: a
      integer isaxpy(size(x))
      isaxpy =  a*x + y
      return
      end
c
c c