annotate libcruft/dasrt/droots.f @ 10282:c9780d8e228c

fix invalid checks in amd functions
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 09 Feb 2010 09:44:19 +0100
parents 1760b2ce8ef6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4000
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
1 SUBROUTINE DROOTS (NG, HMIN, JFLAG, X0, X1, G0, G1, GX, X, JROOT,
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
2 * IMAX, LAST, ALPHA, X2)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
3 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
4 C***BEGIN PROLOGUE DROOTS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
5 C***REFER TO DDASRT
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
6 C***ROUTINES CALLED DCOPY
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
7 C***DATE WRITTEN 821001 (YYMMDD)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
8 C***REVISION DATE 900926 (YYMMDD)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
9 C***END PROLOGUE DROOTS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
10 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
11 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
12 INTEGER NG, JFLAG, JROOT, IMAX, LAST
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
13 DOUBLE PRECISION HMIN, X0, X1, G0, G1, GX, X, ALPHA, X2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
14 DIMENSION G0(NG), G1(NG), GX(NG), JROOT(NG)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
15 C-----------------------------------------------------------------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
16 C THIS SUBROUTINE FINDS THE LEFTMOST ROOT OF A SET OF ARBITRARY
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
17 C FUNCTIONS GI(X) (I = 1,...,NG) IN AN INTERVAL (X0,X1). ONLY ROOTS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
18 C OF ODD MULTIPLICITY (I.E. CHANGES OF SIGN OF THE GI) ARE FOUND.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
19 C HERE THE SIGN OF X1 - X0 IS ARBITRARY, BUT IS CONSTANT FOR A GIVEN
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
20 C PROBLEM, AND -LEFTMOST- MEANS NEAREST TO X0.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
21 C THE VALUES OF THE VECTOR-VALUED FUNCTION G(X) = (GI, I=1...NG)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
22 C ARE COMMUNICATED THROUGH THE CALL SEQUENCE OF DROOTS.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
23 C THE METHOD USED IS THE ILLINOIS ALGORITHM.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
24 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
25 C REFERENCE..
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
26 C KATHIE L. HIEBERT AND LAWRENCE F. SHAMPINE, IMPLICITLY DEFINED
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
27 C OUTPUT POINTS FOR SOLUTIONS OF ODE-S, SANDIA REPORT SAND80-0180,
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
28 C FEBRUARY, 1980.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
29 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
30 C DESCRIPTION OF PARAMETERS.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
31 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
32 C NG = NUMBER OF FUNCTIONS GI, OR THE NUMBER OF COMPONENTS OF
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
33 C THE VECTOR VALUED FUNCTION G(X). INPUT ONLY.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
34 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
35 C HMIN = RESOLUTION PARAMETER IN X. INPUT ONLY. WHEN A ROOT IS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
36 C FOUND, IT IS LOCATED ONLY TO WITHIN AN ERROR OF HMIN IN X.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
37 C TYPICALLY, HMIN SHOULD BE SET TO SOMETHING ON THE ORDER OF
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
38 C 100 * UROUND * MAX(ABS(X0),ABS(X1)),
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
39 C WHERE UROUND IS THE UNIT ROUNDOFF OF THE MACHINE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
40 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
41 C JFLAG = INTEGER FLAG FOR INPUT AND OUTPUT COMMUNICATION.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
42 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
43 C ON INPUT, SET JFLAG = 0 ON THE FIRST CALL FOR THE PROBLEM,
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
44 C AND LEAVE IT UNCHANGED UNTIL THE PROBLEM IS COMPLETED.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
45 C (THE PROBLEM IS COMPLETED WHEN JFLAG .GE. 2 ON RETURN.)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
46 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
47 C ON OUTPUT, JFLAG HAS THE FOLLOWING VALUES AND MEANINGS..
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
48 C JFLAG = 1 MEANS DROOTS NEEDS A VALUE OF G(X). SET GX = G(X)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
49 C AND CALL DROOTS AGAIN.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
50 C JFLAG = 2 MEANS A ROOT HAS BEEN FOUND. THE ROOT IS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
51 C AT X, AND GX CONTAINS G(X). (ACTUALLY, X IS THE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
52 C RIGHTMOST APPROXIMATION TO THE ROOT ON AN INTERVAL
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
53 C (X0,X1) OF SIZE HMIN OR LESS.)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
54 C JFLAG = 3 MEANS X = X1 IS A ROOT, WITH ONE OR MORE OF THE GI
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
55 C BEING ZERO AT X1 AND NO SIGN CHANGES IN (X0,X1).
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
56 C GX CONTAINS G(X) ON OUTPUT.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
57 C JFLAG = 4 MEANS NO ROOTS (OF ODD MULTIPLICITY) WERE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
58 C FOUND IN (X0,X1) (NO SIGN CHANGES).
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
59 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
60 C X0,X1 = ENDPOINTS OF THE INTERVAL WHERE ROOTS ARE SOUGHT.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
61 C X1 AND X0 ARE INPUT WHEN JFLAG = 0 (FIRST CALL), AND
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
62 C MUST BE LEFT UNCHANGED BETWEEN CALLS UNTIL THE PROBLEM IS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
63 C COMPLETED. X0 AND X1 MUST BE DISTINCT, BUT X1 - X0 MAY BE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
64 C OF EITHER SIGN. HOWEVER, THE NOTION OF -LEFT- AND -RIGHT-
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
65 C WILL BE USED TO MEAN NEARER TO X0 OR X1, RESPECTIVELY.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
66 C WHEN JFLAG .GE. 2 ON RETURN, X0 AND X1 ARE OUTPUT, AND
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
67 C ARE THE ENDPOINTS OF THE RELEVANT INTERVAL.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
68 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
69 C G0,G1 = ARRAYS OF LENGTH NG CONTAINING THE VECTORS G(X0) AND G(X1),
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
70 C RESPECTIVELY. WHEN JFLAG = 0, G0 AND G1 ARE INPUT AND
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
71 C NONE OF THE G0(I) SHOULD BE BE ZERO.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
72 C WHEN JFLAG .GE. 2 ON RETURN, G0 AND G1 ARE OUTPUT.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
73 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
74 C GX = ARRAY OF LENGTH NG CONTAINING G(X). GX IS INPUT
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
75 C WHEN JFLAG = 1, AND OUTPUT WHEN JFLAG .GE. 2.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
76 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
77 C X = INDEPENDENT VARIABLE VALUE. OUTPUT ONLY.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
78 C WHEN JFLAG = 1 ON OUTPUT, X IS THE POINT AT WHICH G(X)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
79 C IS TO BE EVALUATED AND LOADED INTO GX.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
80 C WHEN JFLAG = 2 OR 3, X IS THE ROOT.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
81 C WHEN JFLAG = 4, X IS THE RIGHT ENDPOINT OF THE INTERVAL, X1.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
82 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
83 C JROOT = INTEGER ARRAY OF LENGTH NG. OUTPUT ONLY.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
84 C WHEN JFLAG = 2 OR 3, JROOT INDICATES WHICH COMPONENTS
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
85 C OF G(X) HAVE A ROOT AT X. JROOT(I) IS 1 IF THE I-TH
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
86 C COMPONENT HAS A ROOT, AND JROOT(I) = 0 OTHERWISE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
87 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
88 C IMAX, LAST, ALPHA, X2 =
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
89 C BOOKKEEPING VARIABLES WHICH MUST BE SAVED FROM CALL
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
90 C TO CALL. THEY ARE SAVED INSIDE THE CALLING ROUTINE,
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
91 C BUT THEY ARE USED ONLY WITHIN THIS ROUTINE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
92 C-----------------------------------------------------------------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
93 INTEGER I, IMXOLD, NXLAST
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
94 DOUBLE PRECISION T2, TMAX, ZERO
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
95 LOGICAL ZROOT, SGNCHG, XROOT
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
96 DATA ZERO/0.0D0/
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
97 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
98 IF (JFLAG .EQ. 1) GO TO 200
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
99 C JFLAG .NE. 1. CHECK FOR CHANGE IN SIGN OF G OR ZERO AT X1. ----------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
100 IMAX = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
101 TMAX = ZERO
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
102 ZROOT = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
103 DO 120 I = 1,NG
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
104 IF (DABS(G1(I)) .GT. ZERO) GO TO 110
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
105 ZROOT = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
106 GO TO 120
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
107 C AT THIS POINT, G0(I) HAS BEEN CHECKED AND CANNOT BE ZERO. ------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
108 110 IF (DSIGN(1.0D0,G0(I)) .EQ. DSIGN(1.0D0,G1(I))) GO TO 120
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
109 T2 = DABS(G1(I)/(G1(I)-G0(I)))
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
110 IF (T2 .LE. TMAX) GO TO 120
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
111 TMAX = T2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
112 IMAX = I
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
113 120 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
114 IF (IMAX .GT. 0) GO TO 130
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
115 SGNCHG = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
116 GO TO 140
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
117 130 SGNCHG = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
118 140 IF (.NOT. SGNCHG) GO TO 400
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
119 C THERE IS A SIGN CHANGE. FIND THE FIRST ROOT IN THE INTERVAL. --------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
120 XROOT = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
121 NXLAST = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
122 LAST = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
123 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
124 C REPEAT UNTIL THE FIRST ROOT IN THE INTERVAL IS FOUND. LOOP POINT. ---
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
125 150 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
126 IF (XROOT) GO TO 300
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
127 IF (NXLAST .EQ. LAST) GO TO 160
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
128 ALPHA = 1.0D0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
129 GO TO 180
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
130 160 IF (LAST .EQ. 0) GO TO 170
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
131 ALPHA = 0.5D0*ALPHA
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
132 GO TO 180
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
133 170 ALPHA = 2.0D0*ALPHA
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
134 180 X2 = X1 - (X1-X0)*G1(IMAX)/(G1(IMAX) - ALPHA*G0(IMAX))
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
135 IF ((DABS(X2-X0) .LT. HMIN) .AND.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
136 1 (DABS(X1-X0) .GT. 10.0D0*HMIN)) X2 = X0 + 0.1D0*(X1-X0)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
137 JFLAG = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
138 X = X2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
139 C RETURN TO THE CALLING ROUTINE TO GET A VALUE OF GX = G(X). -----------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
140 RETURN
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
141 C CHECK TO SEE IN WHICH INTERVAL G CHANGES SIGN. -----------------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
142 200 IMXOLD = IMAX
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
143 IMAX = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
144 TMAX = ZERO
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
145 ZROOT = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
146 DO 220 I = 1,NG
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
147 IF (DABS(GX(I)) .GT. ZERO) GO TO 210
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
148 ZROOT = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
149 GO TO 220
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
150 C NEITHER G0(I) NOR GX(I) CAN BE ZERO AT THIS POINT. -------------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
151 210 IF (DSIGN(1.0D0,G0(I)) .EQ. DSIGN(1.0D0,GX(I))) GO TO 220
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
152 T2 = DABS(GX(I)/(GX(I) - G0(I)))
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
153 IF (T2 .LE. TMAX) GO TO 220
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
154 TMAX = T2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
155 IMAX = I
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
156 220 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
157 IF (IMAX .GT. 0) GO TO 230
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
158 SGNCHG = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
159 IMAX = IMXOLD
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
160 GO TO 240
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
161 230 SGNCHG = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
162 240 NXLAST = LAST
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
163 IF (.NOT. SGNCHG) GO TO 250
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
164 C SIGN CHANGE BETWEEN X0 AND X2, SO REPLACE X1 WITH X2. ----------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
165 X1 = X2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
166 CALL DCOPY (NG, GX, 1, G1, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
167 LAST = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
168 XROOT = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
169 GO TO 270
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
170 250 IF (.NOT. ZROOT) GO TO 260
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
171 C ZERO VALUE AT X2 AND NO SIGN CHANGE IN (X0,X2), SO X2 IS A ROOT. -----
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
172 X1 = X2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
173 CALL DCOPY (NG, GX, 1, G1, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
174 XROOT = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
175 GO TO 270
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
176 C NO SIGN CHANGE BETWEEN X0 AND X2. REPLACE X0 WITH X2. ---------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
177 260 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
178 CALL DCOPY (NG, GX, 1, G0, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
179 X0 = X2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
180 LAST = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
181 XROOT = .FALSE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
182 270 IF (DABS(X1-X0) .LE. HMIN) XROOT = .TRUE.
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
183 GO TO 150
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
184 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
185 C RETURN WITH X1 AS THE ROOT. SET JROOT. SET X = X1 AND GX = G1. -----
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
186 300 JFLAG = 2
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
187 X = X1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
188 CALL DCOPY (NG, G1, 1, GX, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
189 DO 320 I = 1,NG
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
190 JROOT(I) = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
191 IF (DABS(G1(I)) .GT. ZERO) GO TO 310
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
192 JROOT(I) = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
193 GO TO 320
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
194 310 IF (DSIGN(1.0D0,G0(I)) .NE. DSIGN(1.0D0,G1(I))) JROOT(I) = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
195 320 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
196 RETURN
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
197 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
198 C NO SIGN CHANGE IN THE INTERVAL. CHECK FOR ZERO AT RIGHT ENDPOINT. ---
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
199 400 IF (.NOT. ZROOT) GO TO 420
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
200 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
201 C ZERO VALUE AT X1 AND NO SIGN CHANGE IN (X0,X1). RETURN JFLAG = 3. ---
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
202 X = X1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
203 CALL DCOPY (NG, G1, 1, GX, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
204 DO 410 I = 1,NG
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
205 JROOT(I) = 0
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
206 IF (DABS(G1(I)) .LE. ZERO) JROOT (I) = 1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
207 410 CONTINUE
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
208 JFLAG = 3
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
209 RETURN
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
210 C
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
211 C NO SIGN CHANGES IN THIS INTERVAL. SET X = X1, RETURN JFLAG = 4. -----
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
212 420 CALL DCOPY (NG, G1, 1, GX, 1)
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
213 X = X1
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
214 JFLAG = 4
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
215 RETURN
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
216 C---------------------- END OF SUBROUTINE DROOTS -----------------------
1760b2ce8ef6 [project @ 2002-07-24 18:26:59 by jwe]
jwe
parents:
diff changeset
217 END