GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
ddaini.f
Go to the documentation of this file.
1 SUBROUTINE ddaini (X, Y, YPRIME, NEQ, RES, JAC, H, WT, IDID, RPAR,
2 + IPAR, PHI, DELTA, E, WM, IWM, HMIN, UROUND, NONNEG, NTEMP)
3C***BEGIN PROLOGUE DDAINI
4C***SUBSIDIARY
5C***PURPOSE Initialization routine for DDASSL.
6C***LIBRARY SLATEC (DASSL)
7C***TYPE DOUBLE PRECISION (SDAINI-S, DDAINI-D)
8C***AUTHOR PETZOLD, LINDA R., (LLNL)
9C***DESCRIPTION
10C-----------------------------------------------------------------
11C DDAINI TAKES ONE STEP OF SIZE H OR SMALLER
12C WITH THE BACKWARD EULER METHOD, TO
13C FIND YPRIME. X AND Y ARE UPDATED TO BE CONSISTENT WITH THE
14C NEW STEP. A MODIFIED DAMPED NEWTON ITERATION IS USED TO
15C SOLVE THE CORRECTOR ITERATION.
16C
17C THE INITIAL GUESS FOR YPRIME IS USED IN THE
18C PREDICTION, AND IN FORMING THE ITERATION
19C MATRIX, BUT IS NOT INVOLVED IN THE
20C ERROR TEST. THIS MAY HAVE TROUBLE
21C CONVERGING IF THE INITIAL GUESS IS NO
22C GOOD, OR IF G(X,Y,YPRIME) DEPENDS
23C NONLINEARLY ON YPRIME.
24C
25C THE PARAMETERS REPRESENT:
26C X -- INDEPENDENT VARIABLE
27C Y -- SOLUTION VECTOR AT X
28C YPRIME -- DERIVATIVE OF SOLUTION VECTOR
29C NEQ -- NUMBER OF EQUATIONS
30C H -- STEPSIZE. IMDER MAY USE A STEPSIZE
31C SMALLER THAN H.
32C WT -- VECTOR OF WEIGHTS FOR ERROR
33C CRITERION
34C IDID -- COMPLETION CODE WITH THE FOLLOWING MEANINGS
35C IDID= 1 -- YPRIME WAS FOUND SUCCESSFULLY
36C IDID=-12 -- DDAINI FAILED TO FIND YPRIME
37C RPAR,IPAR -- REAL AND INTEGER PARAMETER ARRAYS
38C THAT ARE NOT ALTERED BY DDAINI
39C PHI -- WORK SPACE FOR DDAINI
40C DELTA,E -- WORK SPACE FOR DDAINI
41C WM,IWM -- REAL AND INTEGER ARRAYS STORING
42C MATRIX INFORMATION
43C
44C-----------------------------------------------------------------
45C***ROUTINES CALLED DDAJAC, DDANRM, DDASLV
46C***REVISION HISTORY (YYMMDD)
47C 830315 DATE WRITTEN
48C 901009 Finished conversion to SLATEC 4.0 format (F.N.Fritsch)
49C 901019 Merged changes made by C. Ulrich with SLATEC 4.0 format.
50C 901026 Added explicit declarations for all variables and minor
51C cosmetic changes to prologue. (FNF)
52C 901030 Minor corrections to declarations. (FNF)
53C***END PROLOGUE DDAINI
54C
55 INTEGER NEQ, IDID, IPAR(*), IWM(*), NONNEG, NTEMP
56 double precision
57 * x, y(*), yprime(*), h, wt(*), rpar(*), phi(neq,*), delta(*),
58 * e(*), wm(*), hmin, uround
59 EXTERNAL res, jac
60C
61 EXTERNAL ddajac, ddanrm, ddaslv
62 DOUBLE PRECISION DDANRM
63C
64 INTEGER I, IER, IRES, JCALC, LNJE, LNRE, M, MAXIT, MJAC, NCF,
65 * nef, nsf
66 double precision
67 * cj, damp, delnrm, err, oldnrm, r, rate, s, xold, ynorm
68 LOGICAL CONVGD
69C
70 parameter(lnre=12)
71 parameter(lnje=13)
72C
73 DATA maxit/10/,mjac/5/
74 DATA damp/0.75d0/
75C
76C
77C---------------------------------------------------
78C BLOCK 1.
79C INITIALIZATIONS.
80C---------------------------------------------------
81C
82C***FIRST EXECUTABLE STATEMENT DDAINI
83 idid=1
84 nef=0
85 ncf=0
86 nsf=0
87 xold=x
88 ynorm=ddanrm(neq,y,wt,rpar,ipar)
89C
90C SAVE Y AND YPRIME IN PHI
91 DO 100 i=1,neq
92 phi(i,1)=y(i)
93100 phi(i,2)=yprime(i)
94C
95C
96C----------------------------------------------------
97C BLOCK 2.
98C DO ONE BACKWARD EULER STEP.
99C----------------------------------------------------
100C
101C SET UP FOR START OF CORRECTOR ITERATION
102200 cj=1.0d0/h
103 x=x+h
104C
105C PREDICT SOLUTION AND DERIVATIVE
106 DO 250 i=1,neq
107250 y(i)=y(i)+h*yprime(i)
108C
109 jcalc=-1
110 m=0
111 convgd=.true.
112C
113C
114C CORRECTOR LOOP.
115300 iwm(lnre)=iwm(lnre)+1
116 ires=0
117C
118 CALL res(x,y,yprime,delta,ires,rpar,ipar)
119 IF (ires.LT.0) GO TO 430
120C
121C
122C EVALUATE THE ITERATION MATRIX
123 IF (jcalc.NE.-1) GO TO 310
124 iwm(lnje)=iwm(lnje)+1
125 jcalc=0
126 CALL ddajac(neq,x,y,yprime,delta,cj,h,
127 * ier,wt,e,wm,iwm,res,ires,
128 * uround,jac,rpar,ipar,ntemp)
129C
130 s=1000000.d0
131 IF (ires.LT.0) GO TO 430
132 IF (ier.NE.0) GO TO 430
133 nsf=0
134C
135C
136C
137C MULTIPLY RESIDUAL BY DAMPING FACTOR
138310 CONTINUE
139 DO 320 i=1,neq
140320 delta(i)=delta(i)*damp
141C
142C COMPUTE A NEW ITERATE (BACK SUBSTITUTION)
143C STORE THE CORRECTION IN DELTA
144C
145 CALL ddaslv(neq,delta,wm,iwm)
146C
147C UPDATE Y AND YPRIME
148 DO 330 i=1,neq
149 y(i)=y(i)-delta(i)
150330 yprime(i)=yprime(i)-cj*delta(i)
151C
152C TEST FOR CONVERGENCE OF THE ITERATION.
153C
154 delnrm=ddanrm(neq,delta,wt,rpar,ipar)
155 IF (delnrm.LE.100.d0*uround*ynorm)
156 * GO TO 400
157C
158 IF (m.GT.0) GO TO 340
159 oldnrm=delnrm
160 GO TO 350
161C
162340 rate=(delnrm/oldnrm)**(1.0d0/m)
163 IF (rate.GT.0.90d0) GO TO 430
164 s=rate/(1.0d0-rate)
165C
166350 IF (s*delnrm .LE. 0.33d0) GO TO 400
167C
168C
169C THE CORRECTOR HAS NOT YET CONVERGED. UPDATE
170C M AND AND TEST WHETHER THE MAXIMUM
171C NUMBER OF ITERATIONS HAVE BEEN TRIED.
172C EVERY MJAC ITERATIONS, GET A NEW
173C ITERATION MATRIX.
174C
175 m=m+1
176 IF (m.GE.maxit) GO TO 430
177C
178 IF ((m/mjac)*mjac.EQ.m) jcalc=-1
179 GO TO 300
180C
181C
182C THE ITERATION HAS CONVERGED.
183C CHECK NONNEGATIVITY CONSTRAINTS
184400 IF (nonneg.EQ.0) GO TO 450
185 DO 410 i=1,neq
186410 delta(i)=min(y(i),0.0d0)
187C
188 delnrm=ddanrm(neq,delta,wt,rpar,ipar)
189 IF (delnrm.GT.0.33d0) GO TO 430
190C
191 DO 420 i=1,neq
192 y(i)=y(i)-delta(i)
193420 yprime(i)=yprime(i)-cj*delta(i)
194 GO TO 450
195C
196C
197C EXITS FROM CORRECTOR LOOP.
198430 convgd=.false.
199450 IF (.NOT.convgd) GO TO 600
200C
201C
202C
203C-----------------------------------------------------
204C BLOCK 3.
205C THE CORRECTOR ITERATION CONVERGED.
206C DO ERROR TEST.
207C-----------------------------------------------------
208C
209 DO 510 i=1,neq
210510 e(i)=y(i)-phi(i,1)
211 err=ddanrm(neq,e,wt,rpar,ipar)
212C
213 IF (err.LE.1.0d0) RETURN
214C
215C
216C
217C--------------------------------------------------------
218C BLOCK 4.
219C THE BACKWARD EULER STEP FAILED. RESTORE X, Y
220C AND YPRIME TO THEIR ORIGINAL VALUES.
221C REDUCE STEPSIZE AND TRY AGAIN, IF
222C POSSIBLE.
223C---------------------------------------------------------
224C
225600 CONTINUE
226 x = xold
227 DO 610 i=1,neq
228 y(i)=phi(i,1)
229610 yprime(i)=phi(i,2)
230C
231 IF (convgd) GO TO 640
232 IF (ier.EQ.0) GO TO 620
233 nsf=nsf+1
234 h=h*0.25d0
235 IF (nsf.LT.3.AND.abs(h).GE.hmin) GO TO 690
236 idid=-12
237 RETURN
238620 IF (ires.GT.-2) GO TO 630
239 idid=-12
240 RETURN
241630 ncf=ncf+1
242 h=h*0.25d0
243 IF (ncf.LT.10.AND.abs(h).GE.hmin) GO TO 690
244 idid=-12
245 RETURN
246C
247640 nef=nef+1
248 r=0.90d0/(2.0d0*err+0.0001d0)
249 r=max(0.1d0,min(0.5d0,r))
250 h=h*r
251 IF (abs(h).GE.hmin.AND.nef.LT.10) GO TO 690
252 idid=-12
253 RETURN
254690 GO TO 200
255C
256C-------------END OF SUBROUTINE DDAINI----------------------
257 END
charNDArray max(char d, const charNDArray &m)
Definition chNDArray.cc:230
charNDArray min(char d, const charNDArray &m)
Definition chNDArray.cc:207
subroutine ddaini(x, y, yprime, neq, res, jac, h, wt, idid, rpar, ipar, phi, delta, e, wm, iwm, hmin, uround, nonneg, ntemp)
Definition ddaini.f:3
subroutine ddajac(neq, x, y, yprime, delta, cj, h, ier, wt, e, wm, iwm, res, ires, uround, jac, rpar, ipar, ntemp)
Definition ddajac.f:4
double precision function ddanrm(neq, v, wt, rpar, ipar)
Definition ddanrm.f:2
subroutine ddaslv(neq, delta, wm, iwm)
Definition ddaslv.f:2