1 SUBROUTINE ROOTNS
(N
,NFE
,IFLAG
,RELERR
,ABSERR
,Y
,YP
,YOLD
,YPOLD
,
2 $ A
,QR
,LENQR
,PIVOT
,WORK
,PAR
,IPAR
)
4 C ROOTNS FINDS THE POINT YBAR = (XBAR, 1) ON THE ZERO CURVE OF THE
5 C HOMOTOPY MAP. IT STARTS WITH TWO POINTS YOLD=(XOLD,LAMBDAOLD) AND
6 C Y=(X,LAMBDA) SUCH THAT LAMBDAOLD < 1 <= LAMBDA , AND ALTERNATES
7 C BETWEEN HERMITE CUBIC INTERPOLATION AND NEWTON ITERATION UNTIL
12 C N = DIMENSION OF X AND THE HOMOTOPY MAP.
14 C NFE = NUMBER OF JACOBIAN MATRIX EVALUATIONS.
16 C IFLAG = -2, -1, OR 0, INDICATING THE PROBLEM TYPE.
18 C RELERR, ABSERR = RELATIVE AND ABSOLUTE ERROR VALUES. THE ITERATION IS
19 C CONSIDERED TO HAVE CONVERGED WHEN A POINT Y=(X,LAMBDA) IS FOUND
22 C |Y(NP1) - 1| <= RELERR + ABSERR AND
24 C ||Z|| <= RELERR*||X|| + ABSERR , WHERE
26 C (Z,?) IS THE NEWTON STEP TO Y=(X,LAMBDA).
28 C Y(1:N+1) = POINT (X(S), LAMBDA(S)) ON ZERO CURVE OF HOMOTOPY MAP.
30 C YP(1:N+1) = UNIT TANGENT VECTOR TO THE ZERO CURVE OF THE HOMOTOPY MAP
33 C YOLD(1:N+1) = A POINT DIFFERENT FROM Y ON THE ZERO CURVE.
35 C YPOLD(1:N+1) = UNIT TANGENT VECTOR TO THE ZERO CURVE OF THE HOMOTOPY
38 C A(1:*) = PARAMETER VECTOR IN THE HOMOTOPY MAP.
40 C QR(1:LENQR) = THE N X N SYMMETRIC JACOBIAN MATRIX WITH RESPECT TO X
41 C STORED IN PACKED SKYLINE STORAGE FORMAT. LENQR AND PIVOT
42 C DESCRIBE THE DATA STRUCTURE IN QR .
44 C LENQR = LENGTH OF THE ONE-DIMENSIONAL ARRAY QR USED TO CONTAIN THE
45 C N X N SYMMETRIC JACOBIAN MATRIX WITH RESPECT TO X IN PACKED
46 C SKYLINE STORAGE FORMAT.
48 C PIVOT(1:N+2) = INDICES OF THE DIAGONAL ELEMENTS OF THE N X N SYMMETRIC
49 C JACOBIAN MATRIX (WITH RESPECT TO X) WITHIN QR .
51 C WORK(1:13*(N+1)+2*N+LENQR) = WORK ARRAY SPLIT UP AND USED FOR THE
52 C CALCULATION OF THE JACOBIAN MATRIX KERNEL, THE NEWTON STEP,
55 C PAR(1:*) AND IPAR(1:*) ARE ARRAYS FOR (OPTIONAL) USER PARAMETERS,
56 C WHICH ARE SIMPLY PASSED THROUGH TO THE USER WRITTEN SUBROUTINES
61 C N , RELERR , ABSERR , A ARE UNCHANGED.
63 C NFE HAS BEEN UPDATED.
66 C = -2, -1, OR 0 (UNCHANGED) ON A NORMAL RETURN.
68 C = 4 IF THE PRECONDITIONED CONJUGATE GRADIENT ITERATION FAILED TO
69 C CONVERGE (MOST LIKELY DUE TO A JACOBIAN MATRIX WITH RANK < N).
70 C THE ITERATION WAS NOT COMPLETED.
72 C = 6 IF THE INTERPOLATION/NEWTON ITERATION FAILED TO CONVERGE.
73 C Y AND YOLD CONTAIN THE LAST TWO POINTS FOUND ON THE
76 C Y IS THE POINT ON THE ZERO CURVE OF THE HOMOTOPY MAP AT LAMBDA = 1 .
79 C CALLS D1MACH , DAXPY , DCOPY , DNRM2 , ROOT , TANGNS .
81 DOUBLE PRECISION ABSERR
,AERR
,D1MACH
,DD001
,DD0011
,DD01
,DD011
,
82 $ DELS
,DNRM2
,F0
,F1
,FP0
,FP1
,QOFS
,QSOUT
,RELERR
,RERR
,S
,SA
,SB
,
84 INTEGER IFLAG
,IPP
,IRHO
,ITANGW
,ITZ
,IW
,IWP
,IZ0
,IZ1
,JUDY
,JW
,
85 $ LCODE
,LENQR
,LIMIT
,N
,NFE
,NP1
87 C ***** ARRAY DECLARATIONS. *****
89 DOUBLE PRECISION Y
(N
+1),YP
(N
+1),YOLD
(N
+1),YPOLD
(N
+1),A
(N
),
90 $ QR
(LENQR
),WORK
(13*(N
+1)+2*N
+LENQR
),PAR
(1)
91 INTEGER PIVOT
(N
+2),IPAR
(1)
93 C ***** END OF DIMENSIONAL INFORMATION. *****
95 C THE LIMIT ON THE NUMBER OF ITERATIONS ALLOWED MAY BE CHANGED BY
96 C CHANGING THE FOLLOWING PARAMETER STATEMENT:
99 C DEFINITION OF HERMITE CUBIC INTERPOLANT VIA DIVIDED DIFFERENCES.
101 DD01
(F0
,F1
,DELS
)=(F1
-F0
)/DELS
102 DD001
(F0
,FP0
,F1
,DELS
)=(DD01
(F0
,F1
,DELS
)-FP0
)/DELS
103 DD011
(F0
,F1
,FP1
,DELS
)=(FP1
-DD01
(F0
,F1
,DELS
))/DELS
104 DD0011
(F0
,FP0
,F1
,FP1
,DELS
)=(DD011
(F0
,F1
,FP1
,DELS
) -
105 $ DD001
(F0
,FP0
,F1
,DELS
))/DELS
106 QOFS
(F0
,FP0
,F1
,FP1
,DELS
,S
)=((DD0011
(F0
,FP0
,F1
,FP1
,DELS
)*(S
-DELS
) +
107 $ DD001
(F0
,FP0
,F1
,DELS
))*S
+ FP0
)*S
+ F0
112 AERR
=MAX
(ABSERR
,0.0D0
)
123 C ***** MAIN LOOP. *****
125 100 DO 300 JUDY
=1,LIMIT
127 WORK
(ITZ
+JW
-1)=Y
(JW
)-YOLD
(JW
)
129 DELS
=DNRM2
(NP1
,WORK
(ITZ
),1)
131 C USING TWO POINTS AND TANGENTS ON THE HOMOTOPY ZERO CURVE, CONSTRUCT
132 C THE HERMITE CUBIC INTERPOLANT Q(S). THEN USE ROOT TO FIND THE S
133 C CORRESPONDING TO LAMBDA = 1 . THE TWO POINTS ON THE ZERO CURVE ARE
134 C ALWAYS CHOSEN TO BRACKET LAMBDA=1, WITH THE BRACKETING INTERVAL
135 C ALWAYS BEING [0, DELS].
140 130 CALL ROOT
(SOUT
,QSOUT
,SA
,SB
,RERR
,AERR
,LCODE
)
141 IF (LCODE
.GT
. 0) GO TO 140
142 QSOUT
=QOFS
(YOLD
(NP1
),YPOLD
(NP1
),Y
(NP1
),YP
(NP1
),DELS
,SOUT
) - 1.0
144 C IF LAMBDA = 1 WERE BRACKETED, ROOT CANNOT FAIL.
145 140 IF (LCODE
.GT
. 2) THEN
150 C CALCULATE Q(SA) AS THE INITIAL POINT FOR A NEWTON ITERATION.
152 WORK
(IW
+JW
-1)=QOFS
(YOLD
(JW
),YPOLD
(JW
),Y
(JW
),YP
(JW
),DELS
,SA
)
154 C CALCULATE NEWTON STEP AT Q(SA).
155 CALL TANGNS
(SA
,WORK
(IW
),WORK
(IWP
),WORK
(ITZ
),YPOLD
,A
,QR
,LENQR
,
156 $ PIVOT
,WORK
(IPP
),WORK
(IRHO
),WORK
(ITANGW
),NFE
,N
,IFLAG
,
158 IF (IFLAG
.GT
. 0) RETURN
159 C NEXT POINT = CURRENT POINT + NEWTON STEP.
160 CALL DAXPY
(NP1
,1.0D0
,WORK
(ITZ
),1,WORK
(IW
),1)
161 C GET THE TANGENT WP AT W AND THE NEXT NEWTON STEP IN TZ .
162 CALL TANGNS
(SA
,WORK
(IW
),WORK
(IWP
),WORK
(ITZ
),YPOLD
,A
,QR
,LENQR
,
163 $ PIVOT
,WORK
(IPP
),WORK
(IRHO
),WORK
(ITANGW
),NFE
,N
,IFLAG
,
165 IF (IFLAG
.GT
. 0) RETURN
166 C TAKE NEWTON STEP AND CHECK CONVERGENCE.
167 CALL DAXPY
(NP1
,1.0D0
,WORK
(ITZ
),1,WORK
(IW
),1)
168 IF ((ABS
(WORK
(IW
+N
)-1.0) .LE
. RERR
+AERR
) .AND
.
169 $
(DNRM2
(N
,WORK
(ITZ
),1) .LE
. RERR*DNRM2
(N
,WORK
(IW
),1)+AERR
))
171 CALL DCOPY
(NP1
,WORK
(IW
),1,Y
,1)
174 C IF THE ITERATION HAS NOT CONVERGED, DISCARD ONE OF THE OLD POINTS
175 C SUCH THAT LAMBDA = 1 IS STILL BRACKETED.
176 IF ((YOLD
(NP1
)-1.0)*(WORK
(IW
+N
)-1.0) .GT
. 0.0) THEN
177 CALL DCOPY
(NP1
,WORK
(IW
),1,YOLD
,1)
178 CALL DCOPY
(NP1
,WORK
(IWP
),1,YPOLD
,1)
180 CALL DCOPY
(NP1
,WORK
(IW
),1,Y
,1)
181 CALL DCOPY
(NP1
,WORK
(IWP
),1,YP
,1)
185 C ***** END OF MAIN LOOP. *****
187 C THE ALTERNATING OSCULATORY CUBIC INTERPOLATION AND NEWTON ITERATION
188 C HAS NOT CONVERGED IN LIMIT STEPS. ERROR RETURN.