GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dqagpe.f
Go to the documentation of this file.
1 SUBROUTINE dqagpe(F,A,B,NPTS2,POINTS,EPSABS,EPSREL,LIMIT,RESULT,
2 * ABSERR,NEVAL,IER,ALIST,BLIST,RLIST,ELIST,PTS,IORD,LEVEL,NDIN,
3 * LAST)
4C***BEGIN PROLOGUE DQAGPE
5C***DATE WRITTEN 800101 (YYMMDD)
6C***REVISION DATE 830518 (YYMMDD)
7C***CATEGORY NO. H2A2A1
8C***KEYWORDS AUTOMATIC INTEGRATOR, GENERAL-PURPOSE,
9C SINGULARITIES AT USER SPECIFIED POINTS,
10C EXTRAPOLATION, GLOBALLY ADAPTIVE.
11C***AUTHOR PIESSENS,ROBERT ,APPL. MATH. & PROGR. DIV. - K.U.LEUVEN
12C DE DONCKER,ELISE,APPL. MATH. & PROGR. DIV. - K.U.LEUVEN
13C***PURPOSE THE ROUTINE CALCULATES AN APPROXIMATION RESULT TO A GIVEN
14C DEFINITE INTEGRAL I = INTEGRAL OF F OVER (A,B), HOPEFULLY
15C SATISFYING FOLLOWING CLAIM FOR ACCURACY ABS(I-RESULT).LE.
16C MAX(EPSABS,EPSREL*ABS(I)). BREAK POINTS OF THE INTEGRATION
17C INTERVAL, WHERE LOCAL DIFFICULTIES OF THE INTEGRAND MAY
18C OCCUR(E.G. SINGULARITIES,DISCONTINUITIES),PROVIDED BY USER.
19C***DESCRIPTION
20C
21C COMPUTATION OF A DEFINITE INTEGRAL
22C STANDARD FORTRAN SUBROUTINE
23C DOUBLE PRECISION VERSION
24C
25C PARAMETERS
26C ON ENTRY
27C F - SUBROUTINE F(X,IERR,RESULT) DEFINING THE INTEGRAND
28C FUNCTION F(X). THE ACTUAL NAME FOR F NEEDS TO BE
29C DECLARED E X T E R N A L IN THE DRIVER PROGRAM.
30C
31C A - DOUBLE PRECISION
32C LOWER LIMIT OF INTEGRATION
33C
34C B - DOUBLE PRECISION
35C UPPER LIMIT OF INTEGRATION
36C
37C NPTS2 - INTEGER
38C NUMBER EQUAL TO TWO MORE THAN THE NUMBER OF
39C USER-SUPPLIED BREAK POINTS WITHIN THE INTEGRATION
40C RANGE, NPTS2.GE.2.
41C IF NPTS2.LT.2, THE ROUTINE WILL END WITH IER = 6.
42C
43C POINTS - DOUBLE PRECISION
44C VECTOR OF DIMENSION NPTS2, THE FIRST (NPTS2-2)
45C ELEMENTS OF WHICH ARE THE USER PROVIDED BREAK
46C POINTS. IF THESE POINTS DO NOT CONSTITUTE AN
47C ASCENDING SEQUENCE THERE WILL BE AN AUTOMATIC
48C SORTING.
49C
50C EPSABS - DOUBLE PRECISION
51C ABSOLUTE ACCURACY REQUESTED
52C EPSREL - DOUBLE PRECISION
53C RELATIVE ACCURACY REQUESTED
54C IF EPSABS.LE.0
55C AND EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28),
56C THE ROUTINE WILL END WITH IER = 6.
57C
58C LIMIT - INTEGER
59C GIVES AN UPPER BOUND ON THE NUMBER OF SUBINTERVALS
60C IN THE PARTITION OF (A,B), LIMIT.GE.NPTS2
61C IF LIMIT.LT.NPTS2, THE ROUTINE WILL END WITH
62C IER = 6.
63C
64C ON RETURN
65C RESULT - DOUBLE PRECISION
66C APPROXIMATION TO THE INTEGRAL
67C
68C ABSERR - DOUBLE PRECISION
69C ESTIMATE OF THE MODULUS OF THE ABSOLUTE ERROR,
70C WHICH SHOULD EQUAL OR EXCEED ABS(I-RESULT)
71C
72C NEVAL - INTEGER
73C NUMBER OF INTEGRAND EVALUATIONS
74C
75C IER - INTEGER
76C IER = 0 NORMAL AND RELIABLE TERMINATION OF THE
77C ROUTINE. IT IS ASSUMED THAT THE REQUESTED
78C ACCURACY HAS BEEN ACHIEVED.
79C IER.GT.0 ABNORMAL TERMINATION OF THE ROUTINE.
80C THE ESTIMATES FOR INTEGRAL AND ERROR ARE
81C LESS RELIABLE. IT IS ASSUMED THAT THE
82C REQUESTED ACCURACY HAS NOT BEEN ACHIEVED.
83C IER.LT.0 EXIT REQUESTED FROM USER-SUPPLIED
84C FUNCTION.
85C
86C ERROR MESSAGES
87C IER = 1 MAXIMUM NUMBER OF SUBDIVISIONS ALLOWED
88C HAS BEEN ACHIEVED. ONE CAN ALLOW MORE
89C SUBDIVISIONS BY INCREASING THE VALUE OF
90C LIMIT (AND TAKING THE ACCORDING DIMENSION
91C ADJUSTMENTS INTO ACCOUNT). HOWEVER, IF
92C THIS YIELDS NO IMPROVEMENT IT IS ADVISED
93C TO ANALYZE THE INTEGRAND IN ORDER TO
94C DETERMINE THE INTEGRATION DIFFICULTIES. IF
95C THE POSITION OF A LOCAL DIFFICULTY CAN BE
96C DETERMINED (I.E. SINGULARITY,
97C DISCONTINUITY WITHIN THE INTERVAL), IT
98C SHOULD BE SUPPLIED TO THE ROUTINE AS AN
99C ELEMENT OF THE VECTOR POINTS. IF NECESSARY
100C AN APPROPRIATE SPECIAL-PURPOSE INTEGRATOR
101C MUST BE USED, WHICH IS DESIGNED FOR
102C HANDLING THE TYPE OF DIFFICULTY INVOLVED.
103C = 2 THE OCCURRENCE OF ROUNDOFF ERROR IS
104C DETECTED, WHICH PREVENTS THE REQUESTED
105C TOLERANCE FROM BEING ACHIEVED.
106C THE ERROR MAY BE UNDER-ESTIMATED.
107C = 3 EXTREMELY BAD INTEGRAND BEHAVIOUR OCCURS
108C AT SOME POINTS OF THE INTEGRATION
109C INTERVAL.
110C = 4 THE ALGORITHM DOES NOT CONVERGE.
111C ROUNDOFF ERROR IS DETECTED IN THE
112C EXTRAPOLATION TABLE. IT IS PRESUMED THAT
113C THE REQUESTED TOLERANCE CANNOT BE
114C ACHIEVED, AND THAT THE RETURNED RESULT IS
115C THE BEST WHICH CAN BE OBTAINED.
116C = 5 THE INTEGRAL IS PROBABLY DIVERGENT, OR
117C SLOWLY CONVERGENT. IT MUST BE NOTED THAT
118C DIVERGENCE CAN OCCUR WITH ANY OTHER VALUE
119C OF IER.GT.0.
120C = 6 THE INPUT IS INVALID BECAUSE
121C NPTS2.LT.2 OR
122C BREAK POINTS ARE SPECIFIED OUTSIDE
123C THE INTEGRATION RANGE OR
124C (EPSABS.LE.0 AND
125C EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28))
126C OR LIMIT.LT.NPTS2.
127C RESULT, ABSERR, NEVAL, LAST, RLIST(1),
128C AND ELIST(1) ARE SET TO ZERO. ALIST(1) AND
129C BLIST(1) ARE SET TO A AND B RESPECTIVELY.
130C
131C ALIST - DOUBLE PRECISION
132C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
133C LAST ELEMENTS OF WHICH ARE THE LEFT END POINTS
134C OF THE SUBINTERVALS IN THE PARTITION OF THE GIVEN
135C INTEGRATION RANGE (A,B)
136C
137C BLIST - DOUBLE PRECISION
138C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
139C LAST ELEMENTS OF WHICH ARE THE RIGHT END POINTS
140C OF THE SUBINTERVALS IN THE PARTITION OF THE GIVEN
141C INTEGRATION RANGE (A,B)
142C
143C RLIST - DOUBLE PRECISION
144C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
145C LAST ELEMENTS OF WHICH ARE THE INTEGRAL
146C APPROXIMATIONS ON THE SUBINTERVALS
147C
148C ELIST - DOUBLE PRECISION
149C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
150C LAST ELEMENTS OF WHICH ARE THE MODULI OF THE
151C ABSOLUTE ERROR ESTIMATES ON THE SUBINTERVALS
152C
153C PTS - DOUBLE PRECISION
154C VECTOR OF DIMENSION AT LEAST NPTS2, CONTAINING THE
155C INTEGRATION LIMITS AND THE BREAK POINTS OF THE
156C INTERVAL IN ASCENDING SEQUENCE.
157C
158C LEVEL - INTEGER
159C VECTOR OF DIMENSION AT LEAST LIMIT, CONTAINING THE
160C SUBDIVISION LEVELS OF THE SUBINTERVAL, I.E. IF
161C (AA,BB) IS A SUBINTERVAL OF (P1,P2) WHERE P1 AS
162C WELL AS P2 IS A USER-PROVIDED BREAK POINT OR
163C INTEGRATION LIMIT, THEN (AA,BB) HAS LEVEL L IF
164C ABS(BB-AA) = ABS(P2-P1)*2**(-L).
165C
166C NDIN - INTEGER
167C VECTOR OF DIMENSION AT LEAST NPTS2, AFTER FIRST
168C INTEGRATION OVER THE INTERVALS (PTS(I)),PTS(I+1),
169C I = 0,1, ..., NPTS2-2, THE ERROR ESTIMATES OVER
170C SOME OF THE INTERVALS MAY HAVE BEEN INCREASED
171C ARTIFICIALLY, IN ORDER TO PUT THEIR SUBDIVISION
172C FORWARD. IF THIS HAPPENS FOR THE SUBINTERVAL
173C NUMBERED K, NDIN(K) IS PUT TO 1, OTHERWISE
174C NDIN(K) = 0.
175C
176C IORD - INTEGER
177C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST K
178C ELEMENTS OF WHICH ARE POINTERS TO THE
179C ERROR ESTIMATES OVER THE SUBINTERVALS,
180C SUCH THAT ELIST(IORD(1)), ..., ELIST(IORD(K))
181C FORM A DECREASING SEQUENCE, WITH K = LAST
182C IF LAST.LE.(LIMIT/2+2), AND K = LIMIT+1-LAST
183C OTHERWISE
184C
185C LAST - INTEGER
186C NUMBER OF SUBINTERVALS ACTUALLY PRODUCED IN THE
187C SUBDIVISIONS PROCESS
188C
189C***REFERENCES (NONE)
190C***ROUTINES CALLED D1MACH,DQELG,DQK21,DQPSRT
191C***END PROLOGUE DQAGPE
192 DOUBLE PRECISION A,ABSEPS,ABSERR,ALIST,AREA,AREA1,AREA12,AREA2,A1,
193 * A2,B,BLIST,B1,B2,CORREC,DABS,DEFABS,DEFAB1,DEFAB2,DMAX1,DMIN1,
194 * dres,d1mach,elist,epmach,epsabs,epsrel,erlarg,erlast,errbnd,
195 * errmax,error1,erro12,error2,errsum,ertest,oflow,points,pts,
196 * resa,resabs,reseps,result,res3la,rlist,rlist2,sign,temp,uflow
197 INTEGER I,ID,IER,IERRO,IND1,IND2,IORD,IP1,IROFF1,IROFF2,IROFF3,J,
198 * JLOW,JUPBND,K,KSGN,KTMIN,LAST,LEVCUR,LEVEL,LEVMAX,LIMIT,MAXERR,
199 * ndin,neval,nint,nintp1,npts,npts2,nres,nrmax,numrl2
200 LOGICAL EXTRAP,NOEXT
201C
202C
203 dimension alist(limit),blist(limit),elist(limit),iord(limit),
204 * level(limit),ndin(npts2),points(npts2),pts(npts2),res3la(3),
205 * rlist(limit),rlist2(52)
206C
207 EXTERNAL f
208C
209C THE DIMENSION OF RLIST2 IS DETERMINED BY THE VALUE OF
210C LIMEXP IN SUBROUTINE EPSALG (RLIST2 SHOULD BE OF DIMENSION
211C (LIMEXP+2) AT LEAST).
212C
213C
214C LIST OF MAJOR VARIABLES
215C -----------------------
216C
217C ALIST - LIST OF LEFT END POINTS OF ALL SUBINTERVALS
218C CONSIDERED UP TO NOW
219C BLIST - LIST OF RIGHT END POINTS OF ALL SUBINTERVALS
220C CONSIDERED UP TO NOW
221C RLIST(I) - APPROXIMATION TO THE INTEGRAL OVER
222C (ALIST(I),BLIST(I))
223C RLIST2 - ARRAY OF DIMENSION AT LEAST LIMEXP+2
224C CONTAINING THE PART OF THE EPSILON TABLE WHICH
225C IS STILL NEEDED FOR FURTHER COMPUTATIONS
226C ELIST(I) - ERROR ESTIMATE APPLYING TO RLIST(I)
227C MAXERR - POINTER TO THE INTERVAL WITH LARGEST ERROR
228C ESTIMATE
229C ERRMAX - ELIST(MAXERR)
230C ERLAST - ERROR ON THE INTERVAL CURRENTLY SUBDIVIDED
231C (BEFORE THAT SUBDIVISION HAS TAKEN PLACE)
232C AREA - SUM OF THE INTEGRALS OVER THE SUBINTERVALS
233C ERRSUM - SUM OF THE ERRORS OVER THE SUBINTERVALS
234C ERRBND - REQUESTED ACCURACY MAX(EPSABS,EPSREL*
235C ABS(RESULT))
236C *****1 - VARIABLE FOR THE LEFT SUBINTERVAL
237C *****2 - VARIABLE FOR THE RIGHT SUBINTERVAL
238C LAST - INDEX FOR SUBDIVISION
239C NRES - NUMBER OF CALLS TO THE EXTRAPOLATION ROUTINE
240C NUMRL2 - NUMBER OF ELEMENTS IN RLIST2. IF AN APPROPRIATE
241C APPROXIMATION TO THE COMPOUNDED INTEGRAL HAS
242C BEEN OBTAINED, IT IS PUT IN RLIST2(NUMRL2) AFTER
243C NUMRL2 HAS BEEN INCREASED BY ONE.
244C ERLARG - SUM OF THE ERRORS OVER THE INTERVALS LARGER
245C THAN THE SMALLEST INTERVAL CONSIDERED UP TO NOW
246C EXTRAP - LOGICAL VARIABLE DENOTING THAT THE ROUTINE
247C IS ATTEMPTING TO PERFORM EXTRAPOLATION. I.E.
248C BEFORE SUBDIVIDING THE SMALLEST INTERVAL WE
249C TRY TO DECREASE THE VALUE OF ERLARG.
250C NOEXT - LOGICAL VARIABLE DENOTING THAT EXTRAPOLATION IS
251C NO LONGER ALLOWED (TRUE-VALUE)
252C
253C MACHINE DEPENDENT CONSTANTS
254C ---------------------------
255C
256C EPMACH IS THE LARGEST RELATIVE SPACING.
257C UFLOW IS THE SMALLEST POSITIVE MAGNITUDE.
258C OFLOW IS THE LARGEST POSITIVE MAGNITUDE.
259C
260C***FIRST EXECUTABLE STATEMENT DQAGPE
261 epmach = d1mach(4)
262C
263C TEST ON VALIDITY OF PARAMETERS
264C -----------------------------
265C
266 ier = 0
267 neval = 0
268 last = 0
269 result = 0.0d+00
270 abserr = 0.0d+00
271 alist(1) = a
272 blist(1) = b
273 rlist(1) = 0.0d+00
274 elist(1) = 0.0d+00
275 iord(1) = 0
276 level(1) = 0
277 npts = npts2-2
278 IF(npts2.LT.2.OR.limit.LE.npts.OR.(epsabs.LE.0.0d+00.AND.
279 * epsrel.LT.dmax1(0.5d+02*epmach,0.5d-28))) ier = 6
280 IF(ier.EQ.6) GO TO 999
281C
282C IF ANY BREAK POINTS ARE PROVIDED, SORT THEM INTO AN
283C ASCENDING SEQUENCE.
284C
285 sign = 1.0d+00
286 IF(a.GT.b) sign = -1.0d+00
287 pts(1) = dmin1(a,b)
288 IF(npts.EQ.0) GO TO 15
289 DO 10 i = 1,npts
290 pts(i+1) = points(i)
291 10 CONTINUE
292 15 pts(npts+2) = dmax1(a,b)
293 nint = npts+1
294 a1 = pts(1)
295 IF(npts.EQ.0) GO TO 40
296 nintp1 = nint+1
297 DO 20 i = 1,nint
298 ip1 = i+1
299 DO 20 j = ip1,nintp1
300 IF(pts(i).LE.pts(j)) GO TO 20
301 temp = pts(i)
302 pts(i) = pts(j)
303 pts(j) = temp
304 20 CONTINUE
305 IF(pts(1).NE.dmin1(a,b).OR.pts(nintp1).NE.dmax1(a,b)) ier = 6
306 IF(ier.EQ.6) GO TO 999
307C
308C COMPUTE FIRST INTEGRAL AND ERROR APPROXIMATIONS.
309C ------------------------------------------------
310C
311 40 resabs = 0.0d+00
312 DO 50 i = 1,nint
313 b1 = pts(i+1)
314 CALL dqk21(f,a1,b1,area1,error1,defabs,resa,ier)
315 IF (ier .LT. 0) RETURN
316 abserr = abserr+error1
317 result = result+area1
318 ndin(i) = 0
319 IF(error1.EQ.resa.AND.error1.NE.0.0d+00) ndin(i) = 1
320 resabs = resabs+defabs
321 level(i) = 0
322 elist(i) = error1
323 alist(i) = a1
324 blist(i) = b1
325 rlist(i) = area1
326 iord(i) = i
327 a1 = b1
328 50 CONTINUE
329 errsum = 0.0d+00
330 DO 55 i = 1,nint
331 IF(ndin(i).EQ.1) elist(i) = abserr
332 errsum = errsum+elist(i)
333 55 CONTINUE
334C
335C TEST ON ACCURACY.
336C
337 last = nint
338 neval = 21*nint
339 dres = dabs(result)
340 errbnd = dmax1(epsabs,epsrel*dres)
341 IF(abserr.LE.0.1d+03*epmach*resabs.AND.abserr.GT.errbnd) ier = 2
342 IF(nint.EQ.1) GO TO 80
343 DO 70 i = 1,npts
344 jlow = i+1
345 ind1 = iord(i)
346 DO 60 j = jlow,nint
347 ind2 = iord(j)
348 IF(elist(ind1).GT.elist(ind2)) GO TO 60
349 ind1 = ind2
350 k = j
351 60 CONTINUE
352 IF(ind1.EQ.iord(i)) GO TO 70
353 iord(k) = iord(i)
354 iord(i) = ind1
355 70 CONTINUE
356 IF(limit.LT.npts2) ier = 1
357 80 IF(ier.NE.0.OR.abserr.LE.errbnd) GO TO 210
358C
359C INITIALIZATION
360C --------------
361C
362 rlist2(1) = result
363 maxerr = iord(1)
364 errmax = elist(maxerr)
365 area = result
366 nrmax = 1
367 nres = 0
368 numrl2 = 1
369 ktmin = 0
370 extrap = .false.
371 noext = .false.
372 erlarg = errsum
373 ertest = errbnd
374 levmax = 1
375 iroff1 = 0
376 iroff2 = 0
377 iroff3 = 0
378 ierro = 0
379 uflow = d1mach(1)
380 oflow = d1mach(2)
381 abserr = oflow
382 ksgn = -1
383 IF(dres.GE.(0.1d+01-0.5d+02*epmach)*resabs) ksgn = 1
384C
385C MAIN DO-LOOP
386C ------------
387C
388 DO 160 last = npts2,limit
389C
390C BISECT THE SUBINTERVAL WITH THE NRMAX-TH LARGEST ERROR
391C ESTIMATE.
392C
393 levcur = level(maxerr)+1
394 a1 = alist(maxerr)
395 b1 = 0.5d+00*(alist(maxerr)+blist(maxerr))
396 a2 = b1
397 b2 = blist(maxerr)
398 erlast = errmax
399 CALL dqk21(f,a1,b1,area1,error1,resa,defab1,ier)
400 IF (ier .LT. 0) RETURN
401 CALL dqk21(f,a2,b2,area2,error2,resa,defab2,ier)
402 IF (ier .LT. 0) RETURN
403C
404C IMPROVE PREVIOUS APPROXIMATIONS TO INTEGRAL
405C AND ERROR AND TEST FOR ACCURACY.
406C
407 neval = neval+42
408 area12 = area1+area2
409 erro12 = error1+error2
410 errsum = errsum+erro12-errmax
411 area = area+area12-rlist(maxerr)
412 IF(defab1.EQ.error1.OR.defab2.EQ.error2) GO TO 95
413 IF(dabs(rlist(maxerr)-area12).GT.0.1d-04*dabs(area12)
414 * .OR.erro12.LT.0.99d+00*errmax) GO TO 90
415 IF(extrap) iroff2 = iroff2+1
416 IF(.NOT.extrap) iroff1 = iroff1+1
417 90 IF(last.GT.10.AND.erro12.GT.errmax) iroff3 = iroff3+1
418 95 level(maxerr) = levcur
419 level(last) = levcur
420 rlist(maxerr) = area1
421 rlist(last) = area2
422 errbnd = dmax1(epsabs,epsrel*dabs(area))
423C
424C TEST FOR ROUNDOFF ERROR AND EVENTUALLY SET ERROR FLAG.
425C
426 IF(iroff1+iroff2.GE.10.OR.iroff3.GE.20) ier = 2
427 IF(iroff2.GE.5) ierro = 3
428C
429C SET ERROR FLAG IN THE CASE THAT THE NUMBER OF
430C SUBINTERVALS EQUALS LIMIT.
431C
432 IF(last.EQ.limit) ier = 1
433C
434C SET ERROR FLAG IN THE CASE OF BAD INTEGRAND BEHAVIOUR
435C AT A POINT OF THE INTEGRATION RANGE
436C
437 IF(dmax1(dabs(a1),dabs(b2)).LE.(0.1d+01+0.1d+03*epmach)*
438 * (dabs(a2)+0.1d+04*uflow)) ier = 4
439C
440C APPEND THE NEWLY-CREATED INTERVALS TO THE LIST.
441C
442 IF(error2.GT.error1) GO TO 100
443 alist(last) = a2
444 blist(maxerr) = b1
445 blist(last) = b2
446 elist(maxerr) = error1
447 elist(last) = error2
448 GO TO 110
449 100 alist(maxerr) = a2
450 alist(last) = a1
451 blist(last) = b1
452 rlist(maxerr) = area2
453 rlist(last) = area1
454 elist(maxerr) = error2
455 elist(last) = error1
456C
457C CALL SUBROUTINE DQPSRT TO MAINTAIN THE DESCENDING ORDERING
458C IN THE LIST OF ERROR ESTIMATES AND SELECT THE SUBINTERVAL
459C WITH NRMAX-TH LARGEST ERROR ESTIMATE (TO BE BISECTED NEXT).
460C
461 110 CALL dqpsrt(limit,last,maxerr,errmax,elist,iord,nrmax)
462C ***JUMP OUT OF DO-LOOP
463 IF(errsum.LE.errbnd) GO TO 190
464C ***JUMP OUT OF DO-LOOP
465 IF(ier.NE.0) GO TO 170
466 IF(noext) GO TO 160
467 erlarg = erlarg-erlast
468 IF(levcur+1.LE.levmax) erlarg = erlarg+erro12
469 IF(extrap) GO TO 120
470C
471C TEST WHETHER THE INTERVAL TO BE BISECTED NEXT IS THE
472C SMALLEST INTERVAL.
473C
474 IF(level(maxerr)+1.LE.levmax) GO TO 160
475 extrap = .true.
476 nrmax = 2
477 120 IF(ierro.EQ.3.OR.erlarg.LE.ertest) GO TO 140
478C
479C THE SMALLEST INTERVAL HAS THE LARGEST ERROR.
480C BEFORE BISECTING DECREASE THE SUM OF THE ERRORS OVER
481C THE LARGER INTERVALS (ERLARG) AND PERFORM EXTRAPOLATION.
482C
483 id = nrmax
484 jupbnd = last
485 IF(last.GT.(2+limit/2)) jupbnd = limit+3-last
486 DO 130 k = id,jupbnd
487 maxerr = iord(nrmax)
488 errmax = elist(maxerr)
489C ***JUMP OUT OF DO-LOOP
490 IF(level(maxerr)+1.LE.levmax) GO TO 160
491 nrmax = nrmax+1
492 130 CONTINUE
493C
494C PERFORM EXTRAPOLATION.
495C
496 140 numrl2 = numrl2+1
497 rlist2(numrl2) = area
498 IF(numrl2.LE.2) GO TO 155
499 CALL dqelg(numrl2,rlist2,reseps,abseps,res3la,nres)
500 ktmin = ktmin+1
501 IF(ktmin.GT.5.AND.abserr.LT.0.1d-02*errsum) ier = 5
502 IF(abseps.GE.abserr) GO TO 150
503 ktmin = 0
504 abserr = abseps
505 result = reseps
506 correc = erlarg
507 ertest = dmax1(epsabs,epsrel*dabs(reseps))
508C ***JUMP OUT OF DO-LOOP
509 IF(abserr.LT.ertest) GO TO 170
510C
511C PREPARE BISECTION OF THE SMALLEST INTERVAL.
512C
513 150 IF(numrl2.EQ.1) noext = .true.
514 IF(ier.GE.5) GO TO 170
515 155 maxerr = iord(1)
516 errmax = elist(maxerr)
517 nrmax = 1
518 extrap = .false.
519 levmax = levmax+1
520 erlarg = errsum
521 160 CONTINUE
522C
523C SET THE FINAL RESULT.
524C ---------------------
525C
526C
527 170 IF(abserr.EQ.oflow) GO TO 190
528 IF((ier+ierro).EQ.0) GO TO 180
529 IF(ierro.EQ.3) abserr = abserr+correc
530 IF(ier.EQ.0) ier = 3
531 IF(result.NE.0.0d+00.AND.area.NE.0.0d+00)GO TO 175
532 IF(abserr.GT.errsum)GO TO 190
533 IF(area.EQ.0.0d+00) GO TO 210
534 GO TO 180
535 175 IF(abserr/dabs(result).GT.errsum/dabs(area))GO TO 190
536C
537C TEST ON DIVERGENCE.
538C
539 180 IF(ksgn.EQ.(-1).AND.dmax1(dabs(result),dabs(area)).LE.
540 * resabs*0.1d-01) GO TO 210
541 IF(0.1d-01.GT.(result/area).OR.(result/area).GT.0.1d+03.OR.
542 * errsum.GT.dabs(area)) ier = 6
543 GO TO 210
544C
545C COMPUTE GLOBAL INTEGRAL SUM.
546C
547 190 result = 0.0d+00
548 DO 200 k = 1,last
549 result = result+rlist(k)
550 200 CONTINUE
551 abserr = errsum
552 210 IF(ier.GT.2) ier = ier-1
553 result = result*sign
554 999 RETURN
555 END
double precision function d1mach(i)
Definition d1mach.f:23
subroutine dqagpe(f, a, b, npts2, points, epsabs, epsrel, limit, result, abserr, neval, ier, alist, blist, rlist, elist, pts, iord, level, ndin, last)
Definition dqagpe.f:4
subroutine dqelg(n, epstab, result, abserr, res3la, nres)
Definition dqelg.f:2
subroutine dqk21(f, a, b, result, abserr, resabs, resasc, ierr)
Definition dqk21.f:2
subroutine dqpsrt(limit, last, maxerr, ermax, elist, iord, nrmax)
Definition dqpsrt.f:2
int nint(double x)