c ctrapz2.f c c
      module commdata
         integer ntrys, nint1,npoints,np,dbl
         parameter (ntrys=8,nint1=10,npoints=nint1*2**(ntrys-1)+1 )
         parameter (dbl = selected_real_kind(13,200))
         real(dbl) x(npoints),y(npoints)
         real(dbl) ansreal,ansnum
c
      end module commdata
c
      program trapezoid
c
c    The use statements must be the first thing found after the PROGRAM
c    statement
c
      use commdata
c
c    Test Trapezoidal Rule of Integration
c
c   John Mahaffy 5/10/96
c
      implicit none
c   PARAMETERS
c    ntrys - Number of integrations, each with half the x step of the last
c    nint1 - Number of steps between lowest and highest x values
c    npoints - Largest number of points evaluated for use in the integration
c
c   Variables
c    x   -   x values at which the function is evaluated
c    y   -   values of the function for corresponding values of x
c    np  -   number of points currently used in x and y
c    ansreal - Actual Value of the integral
c    ansnum  - Value of the integral obtained from a Trapezoidal Rule
c
      integer i
      do 10 i=1,ntrys
         np=nint1*2**(i-1)+1
         call setcurve
         call integrate
         call compare
  10  continue
      stop
      end
      subroutine setcurve
c
c    Use statements must be the first thing found after the SUBROUTINE
c    statement
c
      use commdata
c
c    Set up a Curve and range for integration
c    Here we will integrate sin(x) from x=0 to x=3.0
c
c   John Mahaffy 5/10/96
c
      implicit none
c
      integer i
      real(dbl) dx,xlow,xhigh
      data xlow,xhigh/0.0,3.0/
c
      dx=(xhigh-xlow)/(np-1)
      x(1)=xlow
      y(1)=sin(x(1))
      do 10 i=2,np
         x(i)=x(i-1)+dx
         y(i)=sin(x(i))
  10     continue
      ansreal=cos(xlow)-cos(xhigh)
      return
      end
c
      subroutine integrate
c
      use commdata
c
c
c    Use Trapezoidal Rule to Integrate the area under the curve
c    specified by the data points in x and y
c
c   John Mahaffy 5/10/96
c
      implicit none
c
c   Local Variables
c
c    esterr   -   estimated error for Trapizoidal integration
c    sum2     -   Trapizoidal integration using every other available point
c
      integer i
      real(dbl) sum2, esterr
c
      ansnum=0.5*dot_product(y(1:np-1)+y(2:np),x(2:np)-x(1:np-1))
c
c
c   The following only works if np is an odd integer
c
      sum2 = 0.5*dot_product(y(1:np-1:2)+y(3:np:2),
     &                       x(3:np:2)-x(1:np-1:2))
      esterr=(sum2-ansnum)*.333333
      write(6,2000) np,ansnum,esterr
 2000 format (' For ',i4,' points the integral is ',1p,e12.5,
     & ', Estimated Error=',e10.2)
      return
      end
c
c c subroutine compare c c The following USE only picks up information about ANSNUM and c ANSREAL from the MODULE named COMMDATA, ignores other information c If I used the variable names "x" or "y" here they would be treated c as local variables, unrelated to the "x" and "y" defined in c COMMDATA c c John Mahaffy 5/10/96 c use commdata , only : ansnum, ansreal, dbl c c Compare results of the numerical integration with the actual result c implicit none real (dbl) error error=ansnum-ansreal write(6,2001) error 2001 format(' Actual Error = ',1p,e10.2) return end c c c