1 C -- QSSA WITH STEADY STATE APPROXIMATION --
2 C For plain QSSA (to remove the steady state assumption)
3 C modify slow -> 0, fast -> 1e20
6 SUBROUTINE INTEGRATE
( TIN
, TOUT
)
8 INCLUDE
'KPP_ROOT_params.h'
9 INCLUDE
'KPP_ROOT_global.h'
17 KPP_REAL P_VAR
(NVAR
), D_VAR
(NVAR
), V1
(NVAR
), V2
(NVAR
)
19 KPP_REAL T
, Tnext
, STEP
, STEPold
, Told
, SUP
20 KPP_REAL ERR
, ERRold
, ratio
, factor
, facmax
, tmp
26 STEP
= DMAX1
(STEPMIN
,1.d
-10)
37 if ( Tplus
.gt
. Tnext
) then
48 CALL FSPLIT_VAR
( VAR
, P_VAR
, D_VAR
)
51 IF ( D_VAR
(i
)*step
.lt
. slow
) THEN ! SLOW SPECIES
52 XXX
= STEP
* (P_VAR
(I
) - D_VAR
(I
)*VAR
(I
))
54 V2
(I
) = VAR
(I
) + 0.5*XXX
55 ELSE IF ( D_VAR
(i
)*step
.GT
. fast
) THEN ! FAST SPECIES
56 V1
(I
) = P_VAR
(I
)/D_VAR
(I
)
59 if ( abs
(D_VAR
(i
)).gt
.SUP
) then
60 ratio
= P_VAR
(i
)/D_VAR
(i
)
61 tmp
= exp
(-D_VAR
(i
)*STEP*0
.5
)
62 V1
(i
) = tmp
* tmp
* (VAR
(i
) - ratio
) + ratio
63 V2
(i
) = tmp
* (VAR
(i
) - ratio
) + ratio
65 tmp
= D_VAR
(i
) * STEP
* 0.5
66 V1
(i
) = VAR
(i
) + P_VAR
(i
) * STEP
* ( 1 - tmp
*
67 * ( 1 - 2.0 / 3.0 * tmp
) )
68 V2
(i
) = VAR
(i
) + P_VAR
(i
) * 0.5 * STEP*
( 1-0.5*tmp*
69 * ( 1 - 1.0 / 3.0 * tmp
) )
79 CALL FSPLIT_VAR
( V2
, P_VAR
, D_VAR
)
82 IF ( D_VAR
(i
)*step
.lt
. slow
) THEN ! SLOW SPECIES
83 XXX
= STEP
* (P_VAR
(I
) - D_VAR
(I
)*VAR
(I
))
84 V2
(I
) = V2
(I
) + 0.5*XXX
85 ELSE IF ( D_VAR
(i
)*step
.GT
. fast
) THEN ! FAST SPECIES
86 V2
(I
) = P_VAR
(I
)/D_VAR
(I
)
88 if ( abs
(D_VAR
(i
)).gt
.SUP
) then
89 ratio
= P_VAR
(i
)/D_VAR
(i
)
90 tmp
= exp
(-D_VAR
(i
)*STEP*0
.5
)
91 V2
(i
) = tmp
* (V2
(i
) - ratio
) + ratio
93 tmp
= D_VAR
(i
) * STEP
* 0.5
94 V2
(i
) = V2
(i
) + P_VAR
(i
) * 0.5 * STEP
* ( 1 - 0.5 * tmp
*
95 * ( 1 - 1.0 / 3.0 * tmp
) )
100 C ===== Extrapolation and error estimation ========
105 ERR
= ERR
+ ((V2
(i
)-V1
(i
))/(ATOL
(i
) + RTOL
(i
)*V2
(i
)))**2
107 ERR
= DSQRT
( ERR
/NVAR
)
110 C ===== choosing the stepsize =====================
112 factor
= 0.9*ERR**
(-0.35)*ERRold**0
.2
118 factor
= DMAX1
( 1.25D
-1, DMIN1
(factor
,facmax
) )
119 STEP
= DMIN1
( STEPMAX
, DMAX1
(STEPMIN
,factor*STEP
) )
121 C===================================================
123 if ( (ERR
.gt
.1).and
.(STEPold
.gt
.STEPMIN
) ) then
128 VAR
(i
) = DMAX1
(V2
(i
), 0.d0
)
132 if ( T
.lt
. Tnext
) go to 10