GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
drchek.f
Go to the documentation of this file.
1 SUBROUTINE drchek (JOB, G, NG, NEQ, TN, TOUT, Y, YP, PHI, PSI,
2 * KOLD, G0, G1, GX, JROOT, IRT, UROUND, INFO3, RWORK, IWORK,
3 * RPAR, IPAR)
4C
5C***BEGIN PROLOGUE DRCHEK
6C***REFER TO DDASRT
7C***ROUTINES CALLED DDATRP, DROOTS, DCOPY
8C***DATE WRITTEN 821001 (YYMMDD)
9C***REVISION DATE 900926 (YYMMDD)
10C***END PROLOGUE DRCHEK
11C
12 IMPLICIT DOUBLE PRECISION(a-h,o-z)
13 parameter(lnge=16, lirfnd=18, llast=19, limax=20,
14 * lt0=41, ltlast=42, lalphr=43, lx2=44)
15 EXTERNAL g
16 INTEGER JOB, NG, NEQ, KOLD, JROOT, IRT, INFO3, IWORK, IPAR
17 DOUBLE PRECISION TN, TOUT, Y, YP, PHI, PSI, G0, G1, GX, UROUND,
18 * rwork, rpar
19 dimension y(*), yp(*), phi(neq,*), psi(*),
20 1 g0(*), g1(*), gx(*), jroot(*), rwork(*), iwork(*)
21 INTEGER I, JFLAG
22 DOUBLE PRECISION H
23 DOUBLE PRECISION HMING, T1, TEMP1, TEMP2, X
24 LOGICAL ZROOT
25C-----------------------------------------------------------------------
26C THIS ROUTINE CHECKS FOR THE PRESENCE OF A ROOT IN THE
27C VICINITY OF THE CURRENT T, IN A MANNER DEPENDING ON THE
28C INPUT FLAG JOB. IT CALLS SUBROUTINE DROOTS TO LOCATE THE ROOT
29C AS PRECISELY AS POSSIBLE.
30C
31C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, DRCHEK
32C USES THE FOLLOWING FOR COMMUNICATION..
33C JOB = INTEGER FLAG INDICATING TYPE OF CALL..
34C JOB = 1 MEANS THE PROBLEM IS BEING INITIALIZED, AND DRCHEK
35C IS TO LOOK FOR A ROOT AT OR VERY NEAR THE INITIAL T.
36C JOB = 2 MEANS A CONTINUATION CALL TO THE SOLVER WAS JUST
37C MADE, AND DRCHEK IS TO CHECK FOR A ROOT IN THE
38C RELEVANT PART OF THE STEP LAST TAKEN.
39C JOB = 3 MEANS A SUCCESSFUL STEP WAS JUST TAKEN, AND DRCHEK
40C IS TO LOOK FOR A ROOT IN THE INTERVAL OF THE STEP.
41C G0 = ARRAY OF LENGTH NG, CONTAINING THE VALUE OF G AT T = T0.
42C G0 IS INPUT FOR JOB .GE. 2 AND ON OUTPUT IN ALL CASES.
43C G1,GX = ARRAYS OF LENGTH NG FOR WORK SPACE.
44C IRT = COMPLETION FLAG..
45C IRT = 0 MEANS NO ROOT WAS FOUND.
46C IRT = -1 MEANS JOB = 1 AND A ROOT WAS FOUND TOO NEAR TO T.
47C IRT = 1 MEANS A LEGITIMATE ROOT WAS FOUND (JOB = 2 OR 3).
48C ON RETURN, T0 IS THE ROOT LOCATION, AND Y IS THE
49C CORRESPONDING SOLUTION VECTOR.
50C T0 = VALUE OF T AT ONE ENDPOINT OF INTERVAL OF INTEREST. ONLY
51C ROOTS BEYOND T0 IN THE DIRECTION OF INTEGRATION ARE SOUGHT.
52C T0 IS INPUT IF JOB .GE. 2, AND OUTPUT IN ALL CASES.
53C T0 IS UPDATED BY DRCHEK, WHETHER A ROOT IS FOUND OR NOT.
54C STORED IN THE GLOBAL ARRAY RWORK.
55C TLAST = LAST VALUE OF T RETURNED BY THE SOLVER (INPUT ONLY).
56C STORED IN THE GLOBAL ARRAY RWORK.
57C TOUT = FINAL OUTPUT TIME FOR THE SOLVER.
58C IRFND = INPUT FLAG SHOWING WHETHER THE LAST STEP TAKEN HAD A ROOT.
59C IRFND = 1 IF IT DID, = 0 IF NOT.
60C STORED IN THE GLOBAL ARRAY IWORK.
61C INFO3 = COPY OF INFO(3) (INPUT ONLY).
62C-----------------------------------------------------------------------
63C
64 h = psi(1)
65 irt = 0
66 DO 10 i = 1,ng
67 10 jroot(i) = 0
68 hming = (dabs(tn) + dabs(h))*uround*100.0d0
69C
70 GO TO (100, 200, 300), job
71C
72C EVALUATE G AT INITIAL T (STORED IN RWORK(LT0)), AND CHECK FOR
73C ZERO VALUES.----------------------------------------------------------
74 100 CONTINUE
75 CALL ddatrp(tn,rwork(lt0),y,yp,neq,kold,phi,psi)
76 CALL g (neq, rwork(lt0), y, ng, g0, rpar, ipar)
77 iwork(lnge) = 1
78 zroot = .false.
79 DO 110 i = 1,ng
80 110 IF (dabs(g0(i)) .LE. 0.0d0) zroot = .true.
81 IF (.NOT. zroot) GO TO 190
82C G HAS A ZERO AT T. LOOK AT G AT T + (SMALL INCREMENT). --------------
83 temp1 = dsign(hming,h)
84 rwork(lt0) = rwork(lt0) + temp1
85 temp2 = temp1/h
86 DO 120 i = 1,neq
87 120 y(i) = y(i) + temp2*phi(i,2)
88 CALL g (neq, rwork(lt0), y, ng, g0, rpar, ipar)
89 iwork(lnge) = iwork(lnge) + 1
90 zroot = .false.
91 DO 130 i = 1,ng
92 130 IF (dabs(g0(i)) .LE. 0.0d0) zroot = .true.
93 IF (.NOT. zroot) GO TO 190
94C G HAS A ZERO AT T AND ALSO CLOSE TO T. TAKE ERROR RETURN. -----------
95 irt = -1
96 RETURN
97C
98 190 CONTINUE
99 RETURN
100C
101C
102 200 CONTINUE
103 IF (iwork(lirfnd) .EQ. 0) GO TO 260
104C IF A ROOT WAS FOUND ON THE PREVIOUS STEP, EVALUATE G0 = G(T0). -------
105 CALL ddatrp (tn, rwork(lt0), y, yp, neq, kold, phi, psi)
106 CALL g (neq, rwork(lt0), y, ng, g0, rpar, ipar)
107 iwork(lnge) = iwork(lnge) + 1
108 zroot = .false.
109 DO 210 i = 1,ng
110 210 IF (dabs(g0(i)) .LE. 0.0d0) zroot = .true.
111 IF (.NOT. zroot) GO TO 260
112C G HAS A ZERO AT T0. LOOK AT G AT T + (SMALL INCREMENT). -------------
113 temp1 = dsign(hming,h)
114 rwork(lt0) = rwork(lt0) + temp1
115 IF ((rwork(lt0) - tn)*h .LT. 0.0d0) GO TO 230
116 temp2 = temp1/h
117 DO 220 i = 1,neq
118 220 y(i) = y(i) + temp2*phi(i,2)
119 GO TO 240
120 230 CALL ddatrp (tn, rwork(lt0), y, yp, neq, kold, phi, psi)
121 240 CALL g (neq, rwork(lt0), y, ng, g0, rpar, ipar)
122 iwork(lnge) = iwork(lnge) + 1
123 zroot = .false.
124 DO 250 i = 1,ng
125 IF (dabs(g0(i)) .GT. 0.0d0) GO TO 250
126 jroot(i) = 1
127 zroot = .true.
128 250 CONTINUE
129 IF (.NOT. zroot) GO TO 260
130C G HAS A ZERO AT T0 AND ALSO CLOSE TO T0. RETURN ROOT. ---------------
131 irt = 1
132 RETURN
133C HERE, G0 DOES NOT HAVE A ROOT
134C G0 HAS NO ZERO COMPONENTS. PROCEED TO CHECK RELEVANT INTERVAL. ------
135 260 IF (tn .EQ. rwork(ltlast)) GO TO 390
136C
137 300 CONTINUE
138C SET T1 TO TN OR TOUT, WHICHEVER COMES FIRST, AND GET G AT T1. --------
139 IF (info3 .EQ. 1) GO TO 310
140 IF ((tout - tn)*h .GE. 0.0d0) GO TO 310
141 t1 = tout
142 IF ((t1 - rwork(lt0))*h .LE. 0.0d0) GO TO 390
143 CALL ddatrp (tn, t1, y, yp, neq, kold, phi, psi)
144 GO TO 330
145 310 t1 = tn
146 DO 320 i = 1,neq
147 320 y(i) = phi(i,1)
148 330 CALL g (neq, t1, y, ng, g1, rpar, ipar)
149 iwork(lnge) = iwork(lnge) + 1
150C CALL DROOTS TO SEARCH FOR ROOT IN INTERVAL FROM T0 TO T1. ------------
151 jflag = 0
152 350 CONTINUE
153 CALL droots (ng, hming, jflag, rwork(lt0), t1, g0, g1, gx, x,
154 * jroot, iwork(limax), iwork(llast), rwork(lalphr),
155 * rwork(lx2))
156 IF (jflag .GT. 1) GO TO 360
157 CALL ddatrp (tn, x, y, yp, neq, kold, phi, psi)
158 CALL g (neq, x, y, ng, gx, rpar, ipar)
159 iwork(lnge) = iwork(lnge) + 1
160 GO TO 350
161 360 rwork(lt0) = x
162 CALL dcopy (ng, gx, 1, g0, 1)
163 IF (jflag .EQ. 4) GO TO 390
164C FOUND A ROOT. INTERPOLATE TO X AND RETURN. --------------------------
165 CALL ddatrp (tn, x, y, yp, neq, kold, phi, psi)
166 irt = 1
167 RETURN
168C
169 390 CONTINUE
170 RETURN
171C---------------------- END OF SUBROUTINE DRCHEK -----------------------
172 END
subroutine ddatrp(x, xout, yout, ypout, neq, kold, phi, psi)
Definition ddatrp.f:2
subroutine drchek(job, g, ng, neq, tn, tout, y, yp, phi, psi, kold, g0, g1, gx, jroot, irt, uround, info3, rwork, iwork, rpar, ipar)
Definition drchek.f:4
subroutine droots(ng, hmin, jflag, x0, x1, g0, g1, gx, x, jroot, imax, last, alpha, x2)
Definition droots.f:3