GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dnedd.f
Go to the documentation of this file.
1C Work performed under the auspices of the U.S. Department of Energy
2C by Lawrence Livermore National Laboratory under contract number
3C W-7405-Eng-48.
4C
5 SUBROUTINE dnedd(X,Y,YPRIME,NEQ,RES,JACD,PDUM,H,WT,
6 * JSTART,IDID,RPAR,IPAR,PHI,GAMMA,DUMSVR,DELTA,E,
7 * WM,IWM,CJ,CJOLD,CJLAST,S,UROUND,DUME,DUMS,DUMR,
8 * EPCON,JCALC,JFDUM,KP1,NONNEG,NTYPE,IERNLS)
9C
10C***BEGIN PROLOGUE DNEDD
11C***REFER TO DDASPK
12C***DATE WRITTEN 891219 (YYMMDD)
13C***REVISION DATE 900926 (YYMMDD)
14C
15C
16C-----------------------------------------------------------------------
17C***DESCRIPTION
18C
19C DNEDD solves a nonlinear system of
20C algebraic equations of the form
21C G(X,Y,YPRIME) = 0 for the unknown Y.
22C
23C The method used is a modified Newton scheme.
24C
25C The parameters represent
26C
27C X -- Independent variable.
28C Y -- Solution vector.
29C YPRIME -- Derivative of solution vector.
30C NEQ -- Number of unknowns.
31C RES -- External user-supplied subroutine
32C to evaluate the residual. See RES description
33C in DDASPK prologue.
34C JACD -- External user-supplied routine to evaluate the
35C Jacobian. See JAC description for the case
36C INFO(12) = 0 in the DDASPK prologue.
37C PDUM -- Dummy argument.
38C H -- Appropriate step size for next step.
39C WT -- Vector of weights for error criterion.
40C JSTART -- Indicates first call to this routine.
41C If JSTART = 0, then this is the first call,
42C otherwise it is not.
43C IDID -- Completion flag, output by DNEDD.
44C See IDID description in DDASPK prologue.
45C RPAR,IPAR -- Real and integer arrays used for communication
46C between the calling program and external user
47C routines. They are not altered within DASPK.
48C PHI -- Array of divided differences used by
49C DNEDD. The length is NEQ*(K+1),where
50C K is the maximum order.
51C GAMMA -- Array used to predict Y and YPRIME. The length
52C is MAXORD+1 where MAXORD is the maximum order.
53C DUMSVR -- Dummy argument.
54C DELTA -- Work vector for NLS of length NEQ.
55C E -- Error accumulation vector for NLS of length NEQ.
56C WM,IWM -- Real and integer arrays storing
57C matrix information such as the matrix
58C of partial derivatives, permutation
59C vector, and various other information.
60C CJ -- Parameter always proportional to 1/H.
61C CJOLD -- Saves the value of CJ as of the last call to DMATD.
62C Accounts for changes in CJ needed to
63C decide whether to call DMATD.
64C CJLAST -- Previous value of CJ.
65C S -- A scalar determined by the approximate rate
66C of convergence of the Newton iteration and used
67C in the convergence test for the Newton iteration.
68C
69C If RATE is defined to be an estimate of the
70C rate of convergence of the Newton iteration,
71C then S = RATE/(1.D0-RATE).
72C
73C The closer RATE is to 0., the faster the Newton
74C iteration is converging; the closer RATE is to 1.,
75C the slower the Newton iteration is converging.
76C
77C On the first Newton iteration with an up-dated
78C preconditioner S = 100.D0, Thus the initial
79C RATE of convergence is approximately 1.
80C
81C S is preserved from call to call so that the rate
82C estimate from a previous step can be applied to
83C the current step.
84C UROUND -- Unit roundoff.
85C DUME -- Dummy argument.
86C DUMS -- Dummy argument.
87C DUMR -- Dummy argument.
88C EPCON -- Tolerance to test for convergence of the Newton
89C iteration.
90C JCALC -- Flag used to determine when to update
91C the Jacobian matrix. In general:
92C
93C JCALC = -1 ==> Call the DMATD routine to update
94C the Jacobian matrix.
95C JCALC = 0 ==> Jacobian matrix is up-to-date.
96C JCALC = 1 ==> Jacobian matrix is out-dated,
97C but DMATD will not be called unless
98C JCALC is set to -1.
99C JFDUM -- Dummy argument.
100C KP1 -- The current order(K) + 1; updated across calls.
101C NONNEG -- Flag to determine nonnegativity constraints.
102C NTYPE -- Identification code for the NLS routine.
103C 0 ==> modified Newton; direct solver.
104C IERNLS -- Error flag for nonlinear solver.
105C 0 ==> nonlinear solver converged.
106C 1 ==> recoverable error inside nonlinear solver.
107C -1 ==> unrecoverable error inside nonlinear solver.
108C
109C All variables with "DUM" in their names are dummy variables
110C which are not used in this routine.
111C
112C Following is a list and description of local variables which
113C may not have an obvious usage. They are listed in roughly the
114C order they occur in this subroutine.
115C
116C The following group of variables are passed as arguments to
117C the Newton iteration solver. They are explained in greater detail
118C in DNSD:
119C TOLNEW, MULDEL, MAXIT, IERNEW
120C
121C IERTYP -- Flag which tells whether this subroutine is correct.
122C 0 ==> correct subroutine.
123C 1 ==> incorrect subroutine.
124C
125C-----------------------------------------------------------------------
126C***ROUTINES CALLED
127C DDWNRM, RES, DMATD, DNSD
128C
129C***END PROLOGUE DNEDD
130C
131C
132 IMPLICIT DOUBLE PRECISION(a-h,o-z)
133 dimension y(*),yprime(*),wt(*)
134 dimension delta(*),e(*)
135 dimension wm(*),iwm(*), rpar(*),ipar(*)
136 dimension phi(neq,*),gamma(*)
137 EXTERNAL res, jacd
138C
139 parameter(lnre=12, lnje=13)
140C
141 SAVE muldel, maxit, xrate
142 DATA muldel/1/, maxit/4/, xrate/0.25d0/
143C
144C Verify that this is the correct subroutine.
145C
146 iertyp = 0
147 IF (ntype .NE. 0) THEN
148 iertyp = 1
149 GO TO 380
150 ENDIF
151C
152C If this is the first step, perform initializations.
153C
154 IF (jstart .EQ. 0) THEN
155 cjold = cj
156 jcalc = -1
157 ENDIF
158C
159C Perform all other initializations.
160C
161 iernls = 0
162C
163C Decide whether new Jacobian is needed.
164C
165 temp1 = (1.0d0 - xrate)/(1.0d0 + xrate)
166 temp2 = 1.0d0/temp1
167 IF (cj/cjold .LT. temp1 .OR. cj/cjold .GT. temp2) jcalc = -1
168 IF (cj .NE. cjlast) s = 100.d0
169C
170C-----------------------------------------------------------------------
171C Entry point for updating the Jacobian with current
172C stepsize.
173C-----------------------------------------------------------------------
174300 CONTINUE
175C
176C Initialize all error flags to zero.
177C
178 ierj = 0
179 ires = 0
180 iernew = 0
181C
182C Predict the solution and derivative and compute the tolerance
183C for the Newton iteration.
184C
185 DO 310 i=1,neq
186 y(i)=phi(i,1)
187310 yprime(i)=0.0d0
188 DO 330 j=2,kp1
189 DO 320 i=1,neq
190 y(i)=y(i)+phi(i,j)
191320 yprime(i)=yprime(i)+gamma(j)*phi(i,j)
192330 CONTINUE
193 pnorm = ddwnrm(neq,y,wt,rpar,ipar)
194 tolnew = 100.d0*uround*pnorm
195C
196C Call RES to initialize DELTA.
197C
198 iwm(lnre)=iwm(lnre)+1
199 CALL res(x,y,yprime,cj,delta,ires,rpar,ipar)
200 IF (ires .LT. 0) GO TO 380
201C
202C If indicated, reevaluate the iteration matrix
203C J = dG/dY + CJ*dG/dYPRIME (where G(X,Y,YPRIME)=0).
204C Set JCALC to 0 as an indicator that this has been done.
205C
206 IF(jcalc .EQ. -1) THEN
207 iwm(lnje)=iwm(lnje)+1
208 jcalc=0
209 CALL dmatd(neq,x,y,yprime,delta,cj,h,ierj,wt,e,wm,iwm,
210 * res,ires,uround,jacd,rpar,ipar)
211 cjold=cj
212 s = 100.d0
213 IF (ires .LT. 0) GO TO 380
214 IF(ierj .NE. 0)GO TO 380
215 ENDIF
216C
217C Call the nonlinear Newton solver.
218C
219 temp1 = 2.0d0/(1.0d0 + cj/cjold)
220 CALL dnsd(x,y,yprime,neq,res,pdum,wt,rpar,ipar,dumsvr,
221 * delta,e,wm,iwm,cj,dums,dumr,dume,epcon,s,temp1,
222 * tolnew,muldel,maxit,ires,idum,iernew)
223C
224 IF (iernew .GT. 0 .AND. jcalc .NE. 0) THEN
225C
226C The Newton iteration had a recoverable failure with an old
227C iteration matrix. Retry the step with a new iteration matrix.
228C
229 jcalc = -1
230 GO TO 300
231 ENDIF
232C
233 IF (iernew .NE. 0) GO TO 380
234C
235C The Newton iteration has converged. If nonnegativity of
236C solution is required, set the solution nonnegative, if the
237C perturbation to do it is small enough. If the change is too
238C large, then consider the corrector iteration to have failed.
239C
240375 IF(nonneg .EQ. 0) GO TO 390
241 DO 377 i = 1,neq
242377 delta(i) = min(y(i),0.0d0)
243 delnrm = ddwnrm(neq,delta,wt,rpar,ipar)
244 IF(delnrm .GT. epcon) GO TO 380
245 DO 378 i = 1,neq
246378 e(i) = e(i) - delta(i)
247 GO TO 390
248C
249C
250C Exits from nonlinear solver.
251C No convergence with current iteration
252C matrix, or singular iteration matrix.
253C Compute IERNLS and IDID accordingly.
254C
255380 CONTINUE
256 IF (ires .LE. -2 .OR. iertyp .NE. 0) THEN
257 iernls = -1
258 IF (ires .LE. -2) idid = -11
259 IF (iertyp .NE. 0) idid = -15
260 ELSE
261 iernls = 1
262 IF (ires .LT. 0) idid = -10
263 IF (ierj .NE. 0) idid = -8
264 ENDIF
265C
266390 jcalc = 1
267 RETURN
268C
269C------END OF SUBROUTINE DNEDD------------------------------------------
270 END
charNDArray min(char d, const charNDArray &m)
Definition chNDArray.cc:207
double precision function ddwnrm(neq, v, rwt, rpar, ipar)
Definition ddwnrm.f:6
subroutine dmatd(neq, x, y, yprime, delta, cj, h, ier, ewt, e, wm, iwm, res, ires, uround, jacd, rpar, ipar)
Definition dmatd.f:7
subroutine dnedd(x, y, yprime, neq, res, jacd, pdum, h, wt, jstart, idid, rpar, ipar, phi, gamma, dumsvr, delta, e, wm, iwm, cj, cjold, cjlast, s, uround, dume, dums, dumr, epcon, jcalc, jfdum, kp1, nonneg, ntype, iernls)
Definition dnedd.f:9
subroutine dnsd(x, y, yprime, neq, res, pdum, wt, rpar, ipar, dumsvr, delta, e, wm, iwm, cj, dums, dumr, dume, epcon, s, confac, tolnew, muldel, maxit, ires, idum, iernew)
Definition dnsd.f:8
function gamma(x)
Definition gamma.f:3