42#define GAUSSN2 INT(GAUSSN / 2.0)
50 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
51 gaussxk = (/ -0.577350269189626, 0.577350269189626 /)
52 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
53 gaussak = (/ 1.000000000000000, 1.000000000000000 /)
55 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
56 gaussxk = (/ -0.861136311594053, -0.339981043584856, &
57 0.339981043584856, 0.861136311594053 /)
58 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
59 gaussak = (/ 0.347854845137454, 0.652145154862546, &
60 0.652145154862546, 0.347854845137454 /)
62 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
63 gaussxk = (/ -0.960289856497536, -0.796666477413627, &
64 -0.525532409916329, -0.183434642495650, &
65 0.183434642495650, 0.525532409916329, &
66 0.796666477413627, 0.960289856497536 /)
67 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
68 gaussak = (/ 0.101228536290376, 0.222381034453374, &
69 0.313706645877887, 0.362683783378362, &
70 0.362683783378362, 0.313706645877887, &
71 0.222381034453374, 0.101228536290376 /)
73 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
74 gaussxk = (/ -0.9815606342467193, -0.9041172563704749, &
75 -0.7699026741943047, -0.5873179542866174, &
76 -0.3678314989981802, -0.1252334085114689, &
77 0.1252334085114689, 0.3678314989981802, &
78 0.5873179542866174, 0.7699026741943047, &
79 0.9041172563704749, 0.9815606342467193 /)
80 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
81 gaussak = (/ 0.047175336386512, 0.106939325995318, &
82 0.160078328543346, 0.203167426723066, &
83 0.233492536538355, 0.249147045813403, &
84 0.249147045813403, 0.233492536538355, &
85 0.203167426723066, 0.160078328543346, &
86 0.106939325995318, 0.04717533638651 /)
88 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
89 gaussxk = (/ -0.9879925180204854, -0.9372733924007059, &
90 -0.8482065834104272, -0.7244177313601700, &
91 -0.5709721726085388, -0.3941513470775634, &
92 -0.2011940939974345, &
95 0.3941513470775634, 0.5709721726085388, &
96 0.7244177313601700, 0.8482065834104272, &
97 0.9372733924007059, 0.9879925180204854 /)
98 REAL,
DIMENSION(GAUSSN),
PARAMETER :: &
99 gaussak = (/ 0.030753241996117, 0.070366047488108, &
100 0.107159220467172, 0.139570677926154, &
101 0.166269205816994, 0.186161000015562, &
105 0.186161000015562, 0.166269205816994, &
106 0.139570677926154, 0.107159220467172, &
107 0.070366047488108, 0.03075324199612 /)
109# error Wrong GAUSSN number in numtools/integration.f90
124 FUNCTION integrate(fkt,xl,xr,eps,plist,method)
RESULT(integral)
128 FUNCTION fkt(x,plist)
RESULT(fx)
130 REAL,
INTENT(IN) :: x
131 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
140 REAL,
DIMENSION(:),
OPTIONAL :: &
142 INTEGER,
OPTIONAL :: method
148 INTENT(IN) :: xl,xr,eps,method
149 INTENT(INOUT) :: plist
161 IF (
PRESENT(method).AND.((method.GT.0).AND.method.LE.3))
THEN
169 err = abs(xr-xl) * eps
175 IF (
PRESENT(plist))
THEN
176 tmps =
qgauss1d(fkt,min(xl,xr),max(xl,xr),plist)
178 min(xl,xr),max(xl,xr),err,plist)
180 tmps =
qgauss1d(fkt,min(xl,xr),max(xl,xr))
182 min(xl,xr),max(xl,xr),err)
188 IF (
PRESENT(plist))
THEN
189 tmps =
qgauss1d(fkt,min(xl,xr),max(xl,xr),plist)
191 min(xl,xr),max(xl,xr),err,plist)
193 tmps =
qgauss1d(fkt,min(xl,xr),max(xl,xr))
195 min(xl,xr),max(xl,xr),err)
200 IF (
PRESENT(plist))
THEN
201 integral = sign(1.0,xr-xl)*
qromberg(fkt,min(xl,xr),max(xl,xr),err,plist)
203 integral = sign(1.0,xr-xl)*
qromberg(fkt,min(xl,xr),max(xl,xr),err)
207 print *,
"ERROR in integrate: select one of 1,2 for method"
223 FUNCTION fkt(x,plist)
RESULT(fx)
225 REAL,
INTENT(IN) :: x
226 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
231 REAL :: olds, xl, xr, tol
232 REAL,
DIMENSION(:),
OPTIONAL :: plist
235 REAL :: m, res, resl, resr, qerr
237 INTENT(IN) :: olds, xl, xr, tol
238 INTENT(INOUT) :: plist
247 qerr = (olds - res) / (4**gaussn - 1.0)
249 IF (abs(qerr).GE.tol)
THEN
263 FUNCTION fkt(x,plist)
RESULT(fx)
265 REAL,
INTENT(IN) :: x
266 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
271 REAL :: olds, xl, xr, tol
272 REAL,
DIMENSION(:),
OPTIONAL :: plist
276 REAL :: resl, resr, reso, res, qerr
279 INTENT(IN) :: olds, tol, xl, xr
280 INTENT(INOUT) :: plist
299 qerr = (reso - res) / (4**gaussn - 1.0)
301 IF (abs(qerr) < err)
THEN
327 print *,
"ERROR in qadaptive1D_iterative: max recursion reached"
343 FUNCTION fkt(x,plist)
RESULT(fx)
345 REAL,
INTENT(IN) :: x
346 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
351 REAL,
INTENT(IN) :: xl, xr
352 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
364 sgauss = sgauss + gaussak(j) * (fkt(m-t,plist)+fkt(m+t,plist))
367 IF (mod(gaussn,2) /= 0)
THEN
368 sgauss = sgauss + gaussak(gaussn2+1) * fkt(m,plist)
379 FUNCTION qromberg(fkt, xl, xr, tol, plist)
RESULT (Srom)
383 FUNCTION fkt(x, plist)
RESULT(fx)
385 REAL,
INTENT(IN) :: x
386 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
391 REAL,
INTENT(IN) :: xl, xr
392 REAL,
INTENT(INOUT),
DIMENSION(:),
OPTIONAL :: plist
394 INTEGER,
PARAMETER :: jmax = 10
395 REAL,
DIMENSION(jmax,jmax) :: res
406 res(1,1) = 0.5 * (fkt(xl,plist) + fkt(xr,plist))
409 res(1,1) = res(1,1) + fkt(xl+i*h,plist)
411 res(1,1) = res(1,1) * h
420 res(j,1) = res(j,1) + fkt(xl+i*h,plist)
422 res(j,1) = 0.5 * res(j-1,1) + h*res(j,1)
425 res(j,i+1) = res(j,i) + (res(j,i) - res(j-1,i)) / (4**i - 1)
428 IF (abs(res(j,j)-res(j,j-1))<tol)
EXIT
real function qgauss1d(fkt, xl, xr, plist)
integer, parameter maxrec
maximal depth for recursion
real function, public integrate(fkt, xl, xr, eps, plist, method)
Numerical integration function.
real function qromberg(fkt, xl, xr, tol, plist)
real, dimension(3, maxrec) stack
stack for iterative algorithm
real function qadaptive1d_iterative(fkt, oldS, xl, xr, tol, plist)
recursive real function qadaptive1d_recursive(fkt, oldS, xl, xr, tol, plist)