Original WRF subgrid support version from John Michalakes without fire
[wrffire.git] / wrfv2_fire / chem / KPP / kpp / kpp-2.1 / int / kpp_sdirk.f
blobe04fe7d9a8e6fdae42e56c89888abb8acb2b4806
1 SUBROUTINE INTEGRATE( TIN, TOUT )
3 IMPLICIT KPP_REAL (A-H,O-Z)
4 INCLUDE 'KPP_ROOT_Parameters.h'
5 INCLUDE 'KPP_ROOT_Global.h'
7 C TIN - Start Time
8 KPP_REAL TIN
9 C TOUT - End Time
10 KPP_REAL TOUT
11 INTEGER i
13 PARAMETER (LWORK=2*NVAR*NVAR+12*NVAR+7,LIWORK=2*NVAR+7)
14 PARAMETER (LRCONT=5*NVAR+2)
16 KPP_REAL WORK(LWORK)
17 INTEGER IWORK(LIWORK)
18 COMMON /CONT/ ICONT(4),RCONT(LRCONT)
19 EXTERNAL FUNC_CHEM,JAC_CHEM
21 ITOL=1 ! --- VECTOR TOLERANCES
22 IJAC=1 ! --- COMPUTE THE JACOBIAN ANALYTICALLY
23 IMAS=0 ! --- DIFFERENTIAL EQUATION IS IN EXPLICIT FORM
25 DO i=1,20
26 IWORK(i) = 0
27 WORK(i) = 0.D0
28 ENDDO
30 IWORK(3) = 8
32 CALL ATMSDIRK(NVAR,FUNC_CHEM,TIN,VAR,TOUT,STEPMIN,
33 & RTOL,ATOL,ITOL,
34 & JAC_CHEM ,IJAC, FUNC_CHEM ,IMAS,
35 & WORK,LWORK,IWORK,LIWORK,LRCONT,IDID)
37 IF (IDID.LT.0) THEN
38 print *,'ATMSDIRK: Unsucessfull exit at T=',
39 & TIN,' (IDID=',IDID,')'
40 ENDIF
42 RETURN
43 END
46 SUBROUTINE ATMSDIRK(N,FCN,X,Y,XEND,H,
47 & RelTol,AbsTol,ITOL,
48 & JAC ,IJAC, MAS ,IMAS,
49 & WORK,LWORK,IWORK,LIWORK,LRCONT,IDID)
50 C ----------------------------------------------------------
51 C *** *** *** *** *** *** *** *** *** *** *** *** ***
52 C DECLARATIONS
53 C *** *** *** *** *** *** *** *** *** *** *** *** ***
54 IMPLICIT KPP_REAL (A-H,O-Z)
55 DIMENSION Y(N),AbsTol(1),RelTol(1),WORK(LWORK),IWORK(LIWORK)
56 LOGICAL IMPLCT,JBAND,ARRET
57 EXTERNAL FCN,JAC,MAS
58 COMMON/STAT/NFCN,NJAC,NSTEP,NACCPT,NREJCT,NDEC,NSOL
60 C *** *** *** *** *** *** ***
61 C SETTING THE PARAMETERS
62 C *** *** *** *** *** *** ***
63 NFCN=0
64 NJAC=0
65 NSTEP=0
66 NACCPT=0
67 NREJCT=0
68 NDEC=0
69 NSOL=0
70 ARRET=.FALSE.
71 C -------- SWITCH FOR TRANSFORMATION OF JACOBIAN TO HESS_CHEM FORM ---
72 NHESS1 = 0 ! ADRIAN
73 C -------- NMAX , THE MAXIMAL NUMBER OF STEPS -----
74 IF(IWORK(2).EQ.0)THEN
75 NMAX=100000
76 ELSE
77 NMAX=IWORK(2)
78 IF(NMAX.LE.0)THEN
79 WRITE(6,*)' WRONG INPUT IWORK(2)=',IWORK(2)
80 ARRET=.TRUE.
81 END IF
82 END IF
83 C -------- NIT MAXIMAL NUMBER OF NEWTON ITERATIONS
84 IF(IWORK(3).EQ.0)THEN
85 NIT=8
86 ELSE
87 NIT=IWORK(3)
88 IF(NIT.LE.0)THEN
89 WRITE(6,*)' CURIOUS INPUT IWORK(3)=',IWORK(3)
90 ARRET=.TRUE.
91 END IF
92 END IF
93 C -------- METH SWITCH FOR THE COEFFICIENTS OF THE METHOD
94 METH = 2
95 C -------- UROUND SMALLEST NUMBER SATISFYING 1.D0+UROUND>1.D0
96 IF(WORK(1).EQ.0.D0)THEN
97 UROUND=1.D-16
98 ELSE
99 UROUND=WORK(1)
100 IF(UROUND.LE.1.D-19.OR.UROUND.GE.1.D0)THEN
101 WRITE(6,*)' COEFFICIENTS HAVE 20 DIGITS, UROUND=',WORK(1)
102 ARRET=.TRUE.
103 END IF
104 END IF
105 C --------- SAFE SAFETY FACTOR IN STEP SIZE PREDICTION
106 IF(WORK(2).EQ.0.D0)THEN
107 SAFE=0.9D0
108 ELSE
109 SAFE=WORK(2)
110 IF(SAFE.LE..001D0.OR.SAFE.GE.1.D0)THEN
111 WRITE(6,*)' CURIOUS INPUT FOR WORK(2)=',WORK(2)
112 ARRET=.TRUE.
113 END IF
114 END IF
115 C ------ THET DECIDES WHETHER THE JACOBIAN SHOULD BE RECOMPUTED;
116 IF(WORK(3).EQ.0.D0)THEN
117 THET=0.001D0
118 ELSE
119 THET=WORK(3)
120 END IF
121 C --- FNEWT STOPPING CRIERION FOR NEWTON'S METHOD, USUALLY CHOSEN <1.
122 IF(WORK(4).EQ.0.D0)THEN
123 FNEWT=0.03D0
124 ELSE
125 FNEWT=WORK(4)
126 END IF
127 C --- QUOT1 AND QUOT2: IF QUOT1 < HNEW/HOLD < QUOT2, STEP SIZE = CONST.
128 IF(WORK(5).EQ.0.D0)THEN
129 QUOT1=1.D0
130 ELSE
131 QUOT1=WORK(5)
132 END IF
133 IF(WORK(6).EQ.0.D0)THEN
134 QUOT2=1.2D0
135 ELSE
136 QUOT2=WORK(6)
137 END IF
138 C -------- MAXIMAL STEP SIZE
139 IF(WORK(7).EQ.0.D0)THEN
140 HMAX=XEND-X
141 ELSE
142 HMAX=WORK(7)
143 END IF
144 C --------- CHECK IF TOLERANCES ARE O.K.
145 IF (ITOL.EQ.0) THEN
146 IF (AbsTol(1).LE.0.D0.OR.RelTol(1).LE.10.D0*UROUND) THEN
147 WRITE (6,*) ' TOLERANCES ARE TOO SMALL'
148 ARRET=.TRUE.
149 END IF
150 ELSE
151 DO 15 I=1,N
152 IF (AbsTol(I).LE.0.D0.OR.RelTol(I).LE.10.D0*UROUND) THEN
153 WRITE (6,*) ' TOLERANCES(',I,') ARE TOO SMALL'
154 ARRET=.TRUE.
155 END IF
156 15 CONTINUE
157 END IF
159 C *** *** *** *** *** *** *** *** *** *** *** *** ***
160 C COMPUTATION OF ARRAY ENTRIES
161 C *** *** *** *** *** *** *** *** *** *** *** *** ***
162 C ---- IMPLICIT, BANDED OR NOT ?
163 IMPLCT=IMAS.NE.0
164 ARRET=.FALSE.
165 C -------- COMPUTATION OF THE ROW-DIMENSIONS OF THE 2-ARRAYS ---
166 C -- JACOBIAN
167 LDJAC=N
168 C -- MATRIX E FOR LINEAR ALGEBRA
169 LDE=N
170 C -- MASS MATRIX
171 IF (IMPLCT) THEN
172 print *,'IMPLCT 1'
173 ELSE
174 LDMAS=0
175 END IF
176 LDMAS2=MAX(1,LDMAS)
178 C ------- PREPARE THE ENTRY-POINTS FOR THE ARRAYS IN WORK -----
179 IEYHAT=8
180 IEZ=IEYHAT+N
181 IEY0=IEZ+N
182 IEZ1=IEY0+N
183 IEZ2=IEZ1+N
184 IEZ3=IEZ2+N
185 IEZ4=IEZ3+N
186 IEZ5=IEZ4+N
187 IESCAL=IEZ5+N
188 IEF1=IESCAL+N
189 IEG1=IEF1+N
190 IEH1=IEG1+N
191 IEJAC=IEH1+N
192 IEMAS=IEJAC+N*LDJAC
193 IEE=IEMAS+N*LDMAS
195 C ------ TOTAL STORAGE REQUIREMENT -----------
196 ISTORE=IEE+N*LDE-1
197 IF(ISTORE.GT.LWORK)THEN
198 WRITE(6,*)' INSUFFICIENT STORAGE FOR WORK, MIN. LWORK=',ISTORE
199 ARRET=.TRUE.
200 END IF
201 C ------- ENTRY POINTS FOR INTEGER WORKSPACE -----
202 IEIP=5
203 IEHES=IEIP+N
204 C --------- TOTAL REQUIREMENT ---------------
205 ISTORE=IEHES+N-1
206 IF(ISTORE.GT.LIWORK)THEN
207 WRITE(6,*)' INSUFF. STORAGE FOR IWORK, MIN. LIWORK=',ISTORE
208 ARRET=.TRUE.
209 END IF
210 C --------- CONTROL OF LENGTH OF COMMON BLOCK "CONT" -------
211 IF(LRCONT.LT.(5*N+2))THEN
212 WRITE(6,*)' INSUFF. STORAGE FOR RCONT, MIN. LRCONT=',5*N+2
213 ARRET=.TRUE.
214 END IF
215 C ------ WHEN A FAIL HAS OCCURED, WE RETURN WITH IDID=-1
216 IF (ARRET) THEN
217 IDID=-1
218 RETURN
219 END IF
220 C -------- CALL TO CORE INTEGRATOR ------------
221 CALL SDICOR(N,FCN,X,Y,XEND,HMAX,H,RelTol,AbsTol,ITOL,
222 & JAC,IJAC,MLJAC,MUJAC,MAS,MLMAS,MUMAS,IOUT,IDID,
223 & NMAX,UROUND,SAFE,THET,FNEWT,QUOT1,QUOT2,NIT,METH,NHESS1,
224 & IMPLCT,JBAND,LDJAC,LDE,LDMAS2,
225 & WORK(IEYHAT),WORK(IEZ),WORK(IEY0),WORK(IEZ1),WORK(IEZ2),
226 & WORK(IEZ3),WORK(IEZ4),WORK(IEZ5),WORK(IESCAL),WORK(IEF1),
227 & WORK(IEG1),WORK(IEH1),WORK(IEJAC),WORK(IEE),
228 & WORK(IEMAS),IWORK(IEIP),IWORK(IEHES))
229 C ----------- RETURN -----------
230 RETURN
235 C ----- ... AND HERE IS THE CORE INTEGRATOR ----------
237 SUBROUTINE SDICOR(N,FCN,X,Y,XEND,HMAX,H,RelTol,AbsTol,ITOL,
238 & JAC,IJAC,MLJAC,MUJAC,MAS,MLMAS,MUMAS,IOUT,IDID,
239 & NMAX,UROUND,SAFE,THET,FNEWT,QUOT1,QUOT2,NIT,METH,NHESS1,
240 & IMPLCT,BANDED,LDJAC,LE,LDMAS,
241 & YHAT,Z,Y0,Z1,Z2,Z3,Z4,Z5,SCAL,F1,G1,H1,FJAC,E,FMAS,IP,IPHES)
242 C ----------------------------------------------------------
243 C CORE INTEGRATOR FOR SDIRK4
244 C PARAMETERS SAME AS IN SDIRK4 WITH WORKSPACE ADDED
245 C ----------------------------------------------------------
246 C DECLARATIONS
247 C ----------------------------------------------------------
248 IMPLICIT KPP_REAL (A-H,O-Z)
249 INCLUDE 'KPP_ROOT_Parameters.h'
250 INCLUDE 'KPP_ROOT_Sparse.h'
251 KPP_REAL Y(N),YHAT(N),Z(N),Y0(N),Z1(N),Z2(N),Z3(N),Z4(N),Z5(N)
252 KPP_REAL SCAL(N),F1(N),G1(N),H1(N)
253 KPP_REAL FJAC(LU_NONZERO),E(LU_NONZERO),FMAS(LDMAS,N)
254 KPP_REAL AbsTol(1),RelTol(1)
255 INTEGER IP(N),IPHES(N)
256 LOGICAL REJECT,FIRST,IMPLCT,BANDED,CALJAC,NEWTRE
257 COMMON /CONT/NN,NN2,NN3,NN4,XOLD,HSOL,CONT(5*NVAR)
258 COMMON/STAT/NFCN,NJAC,NSTEP,NACCPT,NREJCT,NDEC,NSOL
259 EXTERNAL MAS, FCN, JAC
261 C *** *** *** *** *** *** ***
262 C INITIALISATIONS
263 C *** *** *** *** *** *** ***
265 C --------- DUPLIFY N FOR COMMON BLOCK CONT -----
266 NN=N
267 NN2=2*N
268 NN3=3*N
269 NN4=4*N
271 C ------- COMPUTE MASS MATRIX FOR IMPLICIT CASE ----------
272 IF(IMPLCT) CALL MAS(N,FMAS,LDMAS)
274 C ---------- CONSTANTS ---------
275 MBDIAG=MUMAS+1
276 IF (METH.EQ.2) THEN
277 C ---------- METHOD WITH GAMMA = 4/15 ---------------
278 GAMMA=4.0D0/15.0D0
279 C2=23.0D0/30.0D0
280 C3=17.0D0/30.0D0
281 C4=2881.0D0/28965.0D0+GAMMA
282 ALPH21=15.0D0/8.0D0
283 ALPH31=1577061.0D0/922880.0D0
284 ALPH32=-23427.0D0/115360.0D0
285 ALPH41=647163682356923881.0D0/2414496535205978880.0D0
286 ALPH42=-593512117011179.0D0/3245291041943520.0D0
287 ALPH43=559907973726451.0D0/1886325418129671.0D0
288 ALPH51=724545451.0D0/796538880.0D0
289 ALPH52=-830832077.0D0/267298560.0D0
290 ALPH53=30957577.0D0/2509272.0D0
291 ALPH54=-69863904375173.0D0/6212571137048.0D0
292 E1=7752107607.0D0/11393456128.0D0
293 E2=-17881415427.0D0/11470078208.0D0
294 E3=2433277665.0D0/179459416.0D0
295 E4=-96203066666797.0D0/6212571137048.0D0
296 D11= 24.74416644927758D0
297 D12= -4.325375951824688D0
298 D13= 41.39683763286316D0
299 D14= -61.04144619901784D0
300 D15= -3.391332232917013D0
301 D21= -51.98245719616925D0
302 D22= 10.52501981094525D0
303 D23= -154.2067922191855D0
304 D24= 214.3082125319825D0
305 D25= 14.71166018088679D0
306 D31= 33.14347947522142D0
307 D32= -19.72986789558523D0
308 D33= 230.4878502285804D0
309 D34= -287.6629744338197D0
310 D35= -18.99932366302254D0
311 D41= -5.905188728329743D0
312 D42= 13.53022403646467D0
313 D43= -117.6778956422581D0
314 D44= 134.3962081008550D0
315 D45= 8.678995715052762D0
316 ETA1=23.D0/8.D0
317 ANU1= 0.9838473040915402D0
318 ANU2= 0.3969226768377252D0
319 AMU1= 0.6563374010466914D0
320 AMU3= 0.3372498196189311D0
321 ELSE
322 PRINT *, 'WRONG CHOICE OF <METH>'
323 END IF
324 POSNEG=SIGN(1.D0,XEND-X)
325 HMAX1=MIN(ABS(HMAX),ABS(XEND-X))
326 IF (ABS(H).LE.10.D0*UROUND) H=1.0D-6
327 H=MIN(ABS(H),HMAX1)
328 H=SIGN(H,POSNEG)
329 HOLD=H
330 CFAC=SAFE*(1+2*NIT)
331 NEWTRE=.FALSE.
332 REJECT=.FALSE.
333 FIRST=.TRUE.
334 FACCO1=1.D0
335 FACCO2=1.D0
336 FACCO3=1.D0
337 FACCO4=1.D0
338 FACCO5=1.D0
339 NSING=0
340 XOLD=X
341 IF (ITOL.EQ.0) THEN
342 DO 8 I=1,N
343 8 SCAL(I)=1.D0 / ( AbsTol(1)+RelTol(1)*DABS(Y(I)) )
344 ELSE
345 DO 9 I=1,N
346 9 SCAL(I)=1.D0 / ( AbsTol(I)+RelTol(I)*DABS(Y(I)) )
347 END IF
349 C --- BASIC INTEGRATION STEP
350 10 CONTINUE
352 C *** *** *** *** *** *** ***
353 C COMPUTATION OF THE JACOBIAN
354 C *** *** *** *** *** *** ***
355 NJAC=NJAC+1
356 CALL JAC(N,X,Y,FJAC)
357 CALJAC=.TRUE.
358 20 CONTINUE
360 C *** *** *** *** *** *** ***
361 C COMPUTE THE MATRIX E AND ITS DECOMPOSITION
362 C *** *** *** *** *** *** ***
363 FAC1=1.D0/(H*GAMMA)
364 IF (IMPLCT) THEN
365 print *, 'IMPLCT 4'
366 ELSE ! EXPLICIT SYSTEM
367 C --- THE MATRIX E (MAS=IDENTITY, JACOBIAN A FULL MATRIX)
368 c DO 526 J=1,N
369 c DO 525 I=1,N
370 c 525 E(I,J)=-FJAC(I,J)
371 c 526 E(J,J)=E(J,J)+FAC1
372 c CALL DEC(N,LE,E,IP,IER)
373 DO K=1,LU_NONZERO
374 E(K) = -FJAC(K)
375 END DO
376 DO I=1,N
377 IDG = LU_DIAG(I)
378 E(IDG) = E(IDG) + FAC1
379 END DO
380 CALL KppDecomp ( E, IER)
382 IF (IER.NE.0) GOTO 79
383 END IF
384 NDEC=NDEC+1
385 30 CONTINUE
387 IF (NSTEP.GT.NMAX.OR.X+.1D0*H.EQ.X.OR.ABS(H).LE.UROUND) GOTO 79
388 XPH=X+H
389 C --- LOOP FOR THE 5 STAGES
390 FACCO1=DMAX1(FACCO1,UROUND)**0.8D0
391 FACCO2=DMAX1(FACCO2,UROUND)**0.8D0
392 FACCO3=DMAX1(FACCO3,UROUND)**0.8D0
393 FACCO4=DMAX1(FACCO4,UROUND)**0.8D0
394 FACCO5=DMAX1(FACCO5,UROUND)**0.8D0
396 C *** *** *** *** *** *** ***
397 C STARTING VALUES FOR NEWTON ITERATION
398 C *** *** *** *** *** *** ***
399 DO 59 ISTAGE=1,5
400 IF (ISTAGE.EQ.1) THEN
401 XCH=X+GAMMA*H
402 IF (FIRST.OR.NEWTRE) THEN
403 DO 132 I=1,N
404 132 Z(I)=0.D0
405 ELSE
406 S=1.D0+GAMMA*H/HOLD
407 DO 232 I=1,N
408 c 232 Z(I) = 0.D0
409 232 Z(I)=S*(CONT(I+NN)+S*(CONT(I+NN2)+S*(CONT(I+NN3)
410 & +S*CONT(I+NN4))))-YHAT(I)
412 END IF
413 DO 31 I=1,N
414 31 G1(I)=0.D0
415 FACCON=FACCO1
416 END IF
417 IF (ISTAGE.EQ.2) THEN
418 XCH=X+C2*H
419 DO 131 I=1,N
420 Z1I=Z1(I)
421 Z(I)=ETA1*Z1I
422 131 G1(I)=ALPH21*Z1I
423 FACCON=FACCO2
424 END IF
425 IF (ISTAGE.EQ.3) THEN
426 XCH=X+C3*H
427 DO 231 I=1,N
428 Z1I=Z1(I)
429 Z2I=Z2(I)
430 Z(I)=ANU1*Z1I+ANU2*Z2I
431 231 G1(I)=ALPH31*Z1I+ALPH32*Z2I
432 FACCON=FACCO3
433 END IF
434 IF (ISTAGE.EQ.4) THEN
435 XCH=X+C4*H
436 DO 331 I=1,N
437 Z1I=Z1(I)
438 Z3I=Z3(I)
439 Z(I)=AMU1*Z1I+AMU3*Z3I
440 331 G1(I)=ALPH41*Z1I+ALPH42*Z2(I)+ALPH43*Z3I
441 FACCON=FACCO4
442 END IF
443 IF (ISTAGE.EQ.5) THEN
444 XCH=XPH
445 DO 431 I=1,N
446 Z1I=Z1(I)
447 Z2I=Z2(I)
448 Z3I=Z3(I)
449 Z4I=Z4(I)
450 Z(I)=E1*Z1I+E2*Z2I+E3*Z3I+E4*Z4I
451 YHAT(I)=Z(I)
452 431 G1(I)=ALPH51*Z1I+ALPH52*Z2I+ALPH53*Z3I+ALPH54*Z4I
453 FACCON=FACCO5
454 END IF
458 C *** *** *** *** *** *** *** *** *** *** ***
459 C LOOP FOR THE SIMPLIFIED NEWTON ITERATION
460 C *** *** *** *** *** *** *** *** *** *** ***
461 NEWT=0
462 THETA=ABS(THET)
463 IF (REJECT) THETA=2*ABS(THET)
464 40 CONTINUE
465 IF (NEWT.GE.NIT) THEN
466 H=H/2.D0
467 REJECT=.TRUE.
468 NEWTRE=.TRUE.
469 IF (CALJAC) GOTO 20
470 GOTO 10
471 END IF
473 C --- COMPUTE THE RIGHT-HAND SIDE
474 DO 41 I=1,N
475 H1(I)=G1(I)-Z(I)
476 41 CONT(I)=Y(I)+Z(I)
477 CALL FCN(N,XCH,CONT,F1)
478 NFCN=NFCN+1
480 C --- KppSolve THE LINEAR SYSTEMS
481 IF (IMPLCT) THEN
482 print *, 'IMPLCT 2'
483 ELSE
484 DO 345 I=1,N
485 345 F1(I)=H1(I)*FAC1+F1(I)
486 C CALL SOL(N,LE,E,F1,IP)
487 CALL KppSolve(E, F1)
488 END IF
489 NEWT=NEWT+1
490 DYNO=0.D0
491 C --- NORM 2 ---
492 DO 57 I=1,N
493 57 DYNO=DYNO+(F1(I)*SCAL(I))**2
494 DYNO=DSQRT(DYNO/N)
495 C --- NORM INF ---
496 C DO 57 I=1,N
497 C 57 DYNO=DMAX1( DYNO, DABS(F1(I)*SCAL(I)) )
500 C --- BAD CONVERGENCE OR NUMBER OF ITERATIONS TO LARGE
501 IF (NEWT.GE.2.AND.NEWT.LT.NIT) THEN
502 THETA=DYNO/DYNOLD
503 IF (THETA.LT.0.99D0) THEN
504 FACCON=THETA/(1.0D0-THETA)
505 DYTH=FACCON*DYNO*THETA**(NIT-1-NEWT)
506 QNEWT=DMAX1(1.0D-4,DMIN1(16.0D0,DYTH/FNEWT))
507 IF (QNEWT.GE.1.0D0) THEN
508 H=.8D0*H*QNEWT**(-1.0D0/(NIT-NEWT))
509 REJECT=.TRUE.
510 NEWTRE=.TRUE.
511 IF (CALJAC) GOTO 20
512 GOTO 10
513 END IF
514 ELSE
515 NEWTRE=.TRUE.
516 GOTO 78
517 END IF
518 END IF
519 DYNOLD=DYNO
520 DO 58 I=1,N
521 58 Z(I)=Z(I)+F1(I)
522 NSOL=NSOL+1
523 IF (FACCON*DYNO.GT.FNEWT) GOTO 40
525 C --- END OF SIMPILFIED NEWTON
526 IF (ISTAGE.EQ.1) THEN
527 DO I=1,N
528 Z1(I) = Z(I)
529 END DO
530 FACCO1=FACCON
531 END IF
532 IF (ISTAGE.EQ.2) THEN
533 DO I=1,N
534 Z2(I) = Z(I)
535 END DO
536 FACCO2=FACCON
537 END IF
538 IF (ISTAGE.EQ.3) THEN
539 DO I=1,N
540 Z3(I) = Z(I)
541 END DO
542 FACCO3=FACCON
543 END IF
544 IF (ISTAGE.EQ.4) THEN
545 DO I=1,N
546 Z4(I) = Z(I)
547 END DO
548 FACCO4=FACCON
549 END IF
550 IF (ISTAGE.EQ.5) THEN
551 DO I=1,N
552 Z5(I) = Z(I)
553 END DO
554 FACCO5=FACCON
555 END IF
556 59 CONTINUE
559 C *** *** *** *** *** *** ***
560 C ERROR ESTIMATION
561 C *** *** *** *** *** *** ***
562 NSTEP=NSTEP+1
563 IF (IMPLCT) THEN
564 print *,'IMPLCT 3'
565 ELSE
566 DO 461 I=1,N
567 461 CONT(I)=FAC1*(Z5(I)-YHAT(I))
568 END IF
570 CALL KppSolve(E, CONT)
572 ERR=0.D0
573 C ---- NORM 2 ---
574 DO 64 I=1,N
575 64 ERR=ERR+(CONT(I)*SCAL(I))**2
576 ERR=DMAX1(DSQRT(ERR/N),1.D-10)
578 C ---- NORM INF ---
579 C DO 64 I=1,N
580 c 64 ERR=DMAX1( ERR, DABS( CONT(I)*SCAL(I) ) )
582 C --- COMPUTATION OF HNEW
583 C --- WE REQUIRE .25<=HNEW/H<=10.
584 FAC=DMIN1(SAFE,CFAC/(NEWT+2*NIT))
585 QUOT=DMAX1(.25D0,DMIN1(10.D0,(ERR)**.25D0/FAC))
586 HNEW= H/QUOT
588 C *** *** *** *** *** *** ***
589 C IS THE ERROR SMALL ENOUGH ?
590 C *** *** *** *** *** *** ***
591 IF (ERR.LT.1.D0) THEN
592 C --- STEP IS ACCEPTED
593 FIRST=.FALSE.
594 NACCPT=NACCPT+1
595 HOLD=H
596 XOLD=X
597 C --- COEFFICIENTS FOR CONTINUOUS SOLUTION
598 DO 74 I=1,N
599 Z1I=Z1(I)
600 Z2I=Z2(I)
601 Z3I=Z3(I)
602 Z4I=Z4(I)
603 Z5I=Z5(I)
604 CONT(I)=Y(I)
605 Y(I)=Y(I)+Z5I
606 CONT(I+NN) =D11*Z1I+D12*Z2I+D13*Z3I+D14*Z4I+D15*Z5I
607 CONT(I+NN2)=D21*Z1I+D22*Z2I+D23*Z3I+D24*Z4I+D25*Z5I
608 CONT(I+NN3)=D31*Z1I+D32*Z2I+D33*Z3I+D34*Z4I+D35*Z5I
609 CONT(I+NN4)=D41*Z1I+D42*Z2I+D43*Z3I+D44*Z4I+D45*Z5I
610 YHAT(I)=Z5I
611 IF (ITOL.EQ.0) THEN
612 SCAL(I)=1.D0/( AbsTol(1)+RelTol(1)*DABS(Y(I)) )
613 ELSE
614 SCAL(I)=1.D0/( AbsTol(I)+RelTol(I)*DABS(Y(I)) )
615 END IF
616 74 CONTINUE
617 X=XPH
618 CALJAC=.FALSE.
619 IF ((X-XEND)*POSNEG+UROUND.GT.0.D0) THEN
620 H=HOPT
621 IDID=1
622 RETURN
623 END IF
624 IF (IJAC.EQ.0) CALL FCN(N,X,Y,Y0)
625 NFCN=NFCN+1
626 HNEW=POSNEG*DMIN1(DABS(HNEW),HMAX1)
627 HOPT=HNEW
628 IF (REJECT) HNEW=POSNEG*DMIN1(DABS(HNEW),DABS(H))
629 REJECT=.FALSE.
630 NEWTRE=.FALSE.
631 IF ((X+HNEW/QUOT1-XEND)*POSNEG.GT.0.D0) THEN
632 H=XEND-X
633 ELSE
634 QT=HNEW/H
635 IF (THETA.LE.THET.AND.QT.GE.QUOT1.AND.QT.LE.QUOT2) GOTO 30
636 H = HNEW
637 END IF
638 IF (THETA.LE.THET) GOTO 20
639 GOTO 10
641 ELSE
642 C --- STEP IS REJECTED
643 REJECT=.TRUE.
644 IF (FIRST) THEN
645 H=H/10.D0
646 ELSE
647 H=HNEW
648 END IF
649 IF (NACCPT.GE.1) NREJCT=NREJCT+1
650 IF (CALJAC) GOTO 20
651 GOTO 10
652 END IF
654 C --- UNEXPECTED STEP-REJECTION
655 78 CONTINUE
656 IF (IER.NE.0) THEN
657 WRITE (6,*) ' MATRIX IS SINGULAR, IER=',IER,' X=',X,' H=',H
658 NSING=NSING+1
659 IF (NSING.GE.6) GOTO 79
660 END IF
661 H=H*0.5D0
662 REJECT=.TRUE.
663 IF (CALJAC) GOTO 20
664 GOTO 10
666 C --- FAIL EXIT
667 79 WRITE (6,979) X,H,IER
668 979 FORMAT(' EXIT OF SDIRK4 AT X=',D14.7,' H=',D14.7,' IER=',I4)
669 IDID=-1
670 RETURN
675 SUBROUTINE FUNC_CHEM(N, T, Y, P)
676 INCLUDE 'KPP_ROOT_Parameters.h'
677 INCLUDE 'KPP_ROOT_Global.h'
678 INTEGER N
679 KPP_REAL T, Told
680 KPP_REAL Y(NVAR), P(NVAR)
681 Told = TIME
682 TIME = T
683 CALL Update_SUN()
684 CALL Update_RCONST()
685 CALL Fun( Y, FIX, RCONST, P )
686 TIME = Told
687 RETURN
691 SUBROUTINE JAC_CHEM(N, T, Y, J)
692 INCLUDE 'KPP_ROOT_Parameters.h'
693 INCLUDE 'KPP_ROOT_Global.h'
694 INTEGER N
695 KPP_REAL Told, T
696 KPP_REAL Y(NVAR), J(LU_NONZERO)
697 Told = TIME
698 TIME = T
699 CALL Update_SUN()
700 CALL Update_RCONST()
701 CALL Jac_SP( Y, FIX, RCONST, J )
702 TIME = Told
703 RETURN