GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dqpsrt.f
Go to the documentation of this file.
1 SUBROUTINE dqpsrt(LIMIT,LAST,MAXERR,ERMAX,ELIST,IORD,NRMAX)
2C***BEGIN PROLOGUE DQPSRT
3C***REFER TO DQAGE,DQAGIE,DQAGPE,DQAWSE
4C***ROUTINES CALLED (NONE)
5C***REVISION DATE 810101 (YYMMDD)
6C***KEYWORDS SEQUENTIAL SORTING
7C***AUTHOR PIESSENS,ROBERT,APPL. MATH. & PROGR. DIV. - K.U.LEUVEN
8C DE DONCKER,ELISE,APPL. MATH. & PROGR. DIV. - K.U.LEUVEN
9C***PURPOSE THIS ROUTINE MAINTAINS THE DESCENDING ORDERING IN THE
10C LIST OF THE LOCAL ERROR ESTIMATED RESULTING FROM THE
11C INTERVAL SUBDIVISION PROCESS. AT EACH CALL TWO ERROR
12C ESTIMATES ARE INSERTED USING THE SEQUENTIAL SEARCH
13C METHOD, TOP-DOWN FOR THE LARGEST ERROR ESTIMATE AND
14C BOTTOM-UP FOR THE SMALLEST ERROR ESTIMATE.
15C***DESCRIPTION
16C
17C ORDERING ROUTINE
18C STANDARD FORTRAN SUBROUTINE
19C DOUBLE PRECISION VERSION
20C
21C PARAMETERS (MEANING AT OUTPUT)
22C LIMIT - INTEGER
23C MAXIMUM NUMBER OF ERROR ESTIMATES THE LIST
24C CAN CONTAIN
25C
26C LAST - INTEGER
27C NUMBER OF ERROR ESTIMATES CURRENTLY IN THE LIST
28C
29C MAXERR - INTEGER
30C MAXERR POINTS TO THE NRMAX-TH LARGEST ERROR
31C ESTIMATE CURRENTLY IN THE LIST
32C
33C ERMAX - DOUBLE PRECISION
34C NRMAX-TH LARGEST ERROR ESTIMATE
35C ERMAX = ELIST(MAXERR)
36C
37C ELIST - DOUBLE PRECISION
38C VECTOR OF DIMENSION LAST CONTAINING
39C THE ERROR ESTIMATES
40C
41C IORD - INTEGER
42C VECTOR OF DIMENSION LAST, THE FIRST K ELEMENTS
43C OF WHICH CONTAIN POINTERS TO THE ERROR
44C ESTIMATES, SUCH THAT
45C ELIST(IORD(1)),..., ELIST(IORD(K))
46C FORM A DECREASING SEQUENCE, WITH
47C K = LAST IF LAST.LE.(LIMIT/2+2), AND
48C K = LIMIT+1-LAST OTHERWISE
49C
50C NRMAX - INTEGER
51C MAXERR = IORD(NRMAX)
52C
53C***END PROLOGUE DQPSRT
54C
55 DOUBLE PRECISION ELIST,ERMAX,ERRMAX,ERRMIN
56 INTEGER I,IBEG,IDO,IORD,ISUCC,J,JBND,JUPBN,K,LAST,LIMIT,MAXERR,
57 * NRMAX
58 dimension elist(last),iord(last)
59C
60C CHECK WHETHER THE LIST CONTAINS MORE THAN
61C TWO ERROR ESTIMATES.
62C
63C***FIRST EXECUTABLE STATEMENT DQPSRT
64 IF(last.GT.2) GO TO 10
65 iord(1) = 1
66 iord(2) = 2
67 GO TO 90
68C
69C THIS PART OF THE ROUTINE IS ONLY EXECUTED IF, DUE TO A
70C DIFFICULT INTEGRAND, SUBDIVISION INCREASED THE ERROR
71C ESTIMATE. IN THE NORMAL CASE THE INSERT PROCEDURE SHOULD
72C START AFTER THE NRMAX-TH LARGEST ERROR ESTIMATE.
73C
74 10 errmax = elist(maxerr)
75 IF(nrmax.EQ.1) GO TO 30
76 ido = nrmax-1
77 DO 20 i = 1,ido
78 isucc = iord(nrmax-1)
79C ***JUMP OUT OF DO-LOOP
80 IF(errmax.LE.elist(isucc)) GO TO 30
81 iord(nrmax) = isucc
82 nrmax = nrmax-1
83 20 CONTINUE
84C
85C COMPUTE THE NUMBER OF ELEMENTS IN THE LIST TO BE MAINTAINED
86C IN DESCENDING ORDER. THIS NUMBER DEPENDS ON THE NUMBER OF
87C SUBDIVISIONS STILL ALLOWED.
88C
89 30 jupbn = last
90 IF(last.GT.(limit/2+2)) jupbn = limit+3-last
91 errmin = elist(last)
92C
93C INSERT ERRMAX BY TRAVERSING THE LIST TOP-DOWN,
94C STARTING COMPARISON FROM THE ELEMENT ELIST(IORD(NRMAX+1)).
95C
96 jbnd = jupbn-1
97 ibeg = nrmax+1
98 IF(ibeg.GT.jbnd) GO TO 50
99 DO 40 i=ibeg,jbnd
100 isucc = iord(i)
101C ***JUMP OUT OF DO-LOOP
102 IF(errmax.GE.elist(isucc)) GO TO 60
103 iord(i-1) = isucc
104 40 CONTINUE
105 50 iord(jbnd) = maxerr
106 iord(jupbn) = last
107 GO TO 90
108C
109C INSERT ERRMIN BY TRAVERSING THE LIST BOTTOM-UP.
110C
111 60 iord(i-1) = maxerr
112 k = jbnd
113 DO 70 j=i,jbnd
114 isucc = iord(k)
115C ***JUMP OUT OF DO-LOOP
116 IF(errmin.LT.elist(isucc)) GO TO 80
117 iord(k+1) = isucc
118 k = k-1
119 70 CONTINUE
120 iord(i) = last
121 GO TO 90
122 80 iord(k+1) = last
123C
124C SET MAXERR AND ERMAX.
125C
126 90 maxerr = iord(nrmax)
127 ermax = elist(maxerr)
128 RETURN
129 END
subroutine dqpsrt(limit, last, maxerr, ermax, elist, iord, nrmax)
Definition dqpsrt.f:2