123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- *DECK QAWF
- SUBROUTINE QAWF (F, A, OMEGA, INTEGR, EPSABS, RESULT, ABSERR,
- + NEVAL, IER, LIMLST, LST, LENIW, MAXP1, LENW, IWORK, WORK)
- C***BEGIN PROLOGUE QAWF
- C***PURPOSE The routine calculates an approximation result to a given
- C Fourier integral
- C I = Integral of F(X)*W(X) over (A,INFINITY)
- C where W(X) = COS(OMEGA*X) or W(X) = SIN(OMEGA*X).
- C Hopefully satisfying following claim for accuracy
- C ABS(I-RESULT).LE.EPSABS.
- C***LIBRARY SLATEC (QUADPACK)
- C***CATEGORY H2A3A1
- C***TYPE SINGLE PRECISION (QAWF-S, DQAWF-D)
- C***KEYWORDS AUTOMATIC INTEGRATOR, CONVERGENCE ACCELERATION,
- C FOURIER INTEGRALS, INTEGRATION BETWEEN ZEROS, QUADPACK,
- C QUADRATURE, SPECIAL-PURPOSE INTEGRAL
- C***AUTHOR Piessens, Robert
- C Applied Mathematics and Programming Division
- C K. U. Leuven
- C de Doncker, Elise
- C Applied Mathematics and Programming Division
- C K. U. Leuven
- C***DESCRIPTION
- C
- C Computation of Fourier integrals
- C Standard fortran subroutine
- C Real version
- C
- C
- C PARAMETERS
- C ON ENTRY
- C F - Real
- C Function subprogram defining the integrand
- C function F(X). The actual name for F needs to be
- C declared E X T E R N A L in the driver program.
- C
- C A - Real
- C Lower limit of integration
- C
- C OMEGA - Real
- C Parameter in the integrand WEIGHT function
- C
- C INTEGR - Integer
- C Indicates which of the WEIGHT functions is used
- C INTEGR = 1 W(X) = COS(OMEGA*X)
- C INTEGR = 2 W(X) = SIN(OMEGA*X)
- C IF INTEGR.NE.1.AND.INTEGR.NE.2, the routine
- C will end with IER = 6.
- C
- C EPSABS - Real
- C Absolute accuracy requested, EPSABS.GT.0.
- C If EPSABS.LE.0, the routine will end with IER = 6.
- C
- C ON RETURN
- C RESULT - Real
- C Approximation to the integral
- C
- C ABSERR - Real
- C Estimate of the modulus of the absolute error,
- C Which should equal or exceed ABS(I-RESULT)
- C
- C NEVAL - Integer
- C Number of integrand evaluations
- C
- C IER - Integer
- C IER = 0 Normal and reliable termination of the
- C routine. It is assumed that the requested
- C accuracy has been achieved.
- C IER.GT.0 Abnormal termination of the routine.
- C The estimates for integral and error are
- C less reliable. It is assumed that the
- C requested accuracy has not been achieved.
- C ERROR MESSAGES
- C If OMEGA.NE.0
- C IER = 1 Maximum number of cycles allowed
- C has been achieved, i.e. of subintervals
- C (A+(K-1)C,A+KC) where
- C C = (2*INT(ABS(OMEGA))+1)*PI/ABS(OMEGA),
- C FOR K = 1, 2, ..., LST.
- C One can allow more cycles by increasing
- C the value of LIMLST (and taking the
- C according dimension adjustments into
- C account). Examine the array IWORK which
- C contains the error flags on the cycles, in
- C order to look for eventual local
- C integration difficulties.
- C If the position of a local difficulty
- C can be determined (e.g. singularity,
- C discontinuity within the interval) one
- C will probably gain from splitting up the
- C interval at this point and calling
- C appropriate integrators on the subranges.
- C = 4 The extrapolation table constructed for
- C convergence acceleration of the series
- C formed by the integral contributions over
- C the cycles, does not converge to within
- C the requested accuracy.
- C As in the case of IER = 1, it is advised
- C to examine the array IWORK which contains
- C the error flags on the cycles.
- C = 6 The input is invalid because
- C (INTEGR.NE.1 AND INTEGR.NE.2) or
- C EPSABS.LE.0 or LIMLST.LT.1 or
- C LENIW.LT.(LIMLST+2) or MAXP1.LT.1 or
- C LENW.LT.(LENIW*2+MAXP1*25).
- C RESULT, ABSERR, NEVAL, LST are set to
- C zero.
- C = 7 Bad integrand behaviour occurs within
- C one or more of the cycles. Location and
- C type of the difficulty involved can be
- C determined from the first LST elements of
- C vector IWORK. Here LST is the number of
- C cycles actually needed (see below).
- C IWORK(K) = 1 The maximum number of
- C subdivisions (=(LENIW-LIMLST)
- C /2) has been achieved on the
- C K th cycle.
- C = 2 Occurrence of roundoff error
- C is detected and prevents the
- C tolerance imposed on the K th
- C cycle, from being achieved
- C on this cycle.
- C = 3 Extremely bad integrand
- C behaviour occurs at some
- C points of the K th cycle.
- C = 4 The integration procedure
- C over the K th cycle does
- C not converge (to within the
- C required accuracy) due to
- C roundoff in the extrapolation
- C procedure invoked on this
- C cycle. It is assumed that the
- C result on this interval is
- C the best which can be
- C obtained.
- C = 5 The integral over the K th
- C cycle is probably divergent
- C or slowly convergent. It must
- C be noted that divergence can
- C occur with any other value of
- C IWORK(K).
- C If OMEGA = 0 and INTEGR = 1,
- C The integral is calculated by means of DQAGIE,
- C and IER = IWORK(1) (with meaning as described
- C for IWORK(K),K = 1).
- C
- C DIMENSIONING PARAMETERS
- C LIMLST - Integer
- C LIMLST gives an upper bound on the number of
- C cycles, LIMLST.GE.3.
- C If LIMLST.LT.3, the routine will end with IER = 6.
- C
- C LST - Integer
- C On return, LST indicates the number of cycles
- C actually needed for the integration.
- C If OMEGA = 0, then LST is set to 1.
- C
- C LENIW - Integer
- C Dimensioning parameter for IWORK. On entry,
- C (LENIW-LIMLST)/2 equals the maximum number of
- C subintervals allowed in the partition of each
- C cycle, LENIW.GE.(LIMLST+2).
- C If LENIW.LT.(LIMLST+2), the routine will end with
- C IER = 6.
- C
- C MAXP1 - Integer
- C MAXP1 gives an upper bound on the number of
- C Chebyshev moments which can be stored, i.e. for
- C the intervals of lengths ABS(B-A)*2**(-L),
- C L = 0,1, ..., MAXP1-2, MAXP1.GE.1.
- C If MAXP1.LT.1, the routine will end with IER = 6.
- C LENW - Integer
- C Dimensioning parameter for WORK
- C LENW must be at least LENIW*2+MAXP1*25.
- C If LENW.LT.(LENIW*2+MAXP1*25), the routine will
- C end with IER = 6.
- C
- C WORK ARRAYS
- C IWORK - Integer
- C Vector of dimension at least LENIW
- C On return, IWORK(K) FOR K = 1, 2, ..., LST
- C contain the error flags on the cycles.
- C
- C WORK - Real
- C Vector of dimension at least
- C On return,
- C WORK(1), ..., WORK(LST) contain the integral
- C approximations over the cycles,
- C WORK(LIMLST+1), ..., WORK(LIMLST+LST) contain
- C the error estimates over the cycles.
- C further elements of WORK have no specific
- C meaning for the user.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED QAWFE, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 891009 Removed unreferenced variable. (WRB)
- C 891009 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C***END PROLOGUE QAWF
- C
- REAL A,ABSERR,EPSABS,F,OMEGA,RESULT,WORK
- INTEGER IER,INTEGR,LENIW,LIMIT,LIMLST,LVL,LST,L1,L2,L3,L4,L5,L6,
- 1 MAXP1,NEVAL
- C
- DIMENSION IWORK(*),WORK(*)
- C
- EXTERNAL F
- C
- C CHECK VALIDITY OF LIMLST, LENIW, MAXP1 AND LENW.
- C
- C***FIRST EXECUTABLE STATEMENT QAWF
- IER = 6
- NEVAL = 0
- RESULT = 0.0E+00
- ABSERR = 0.0E+00
- IF(LIMLST.LT.3.OR.LENIW.LT.(LIMLST+2).OR.MAXP1.LT.1.OR.LENW.LT.
- 1 (LENIW*2+MAXP1*25)) GO TO 10
- C
- C PREPARE CALL FOR QAWFE
- C
- LIMIT = (LENIW-LIMLST)/2
- L1 = LIMLST+1
- L2 = LIMLST+L1
- L3 = LIMIT+L2
- L4 = LIMIT+L3
- L5 = LIMIT+L4
- L6 = LIMIT+L5
- LL2 = LIMIT+L1
- CALL QAWFE(F,A,OMEGA,INTEGR,EPSABS,LIMLST,LIMIT,MAXP1,RESULT,
- 1 ABSERR,NEVAL,IER,WORK(1),WORK(L1),IWORK(1),LST,WORK(L2),
- 2 WORK(L3),WORK(L4),WORK(L5),IWORK(L1),IWORK(LL2),WORK(L6))
- C
- C CALL ERROR HANDLER IF NECESSARY
- C
- LVL = 0
- 10 IF(IER.EQ.6) LVL = 1
- IF (IER .NE. 0) CALL XERMSG ('SLATEC', 'QAWF',
- + 'ABNORMAL RETURN', IER, LVL)
- RETURN
- END
|