| 1 |
subroutine lsode (f, neq, y, t, tout, itol, rtol, atol, itask, |
| 2 |
1 istate, iopt, rwork, lrw, iwork, liw, jac, mf) |
| 3 |
external f, jac, xascwv |
| 4 |
integer neq, itol, itask, istate, iopt, lrw, iwork, liw, mf |
| 5 |
double precision y, t, tout, rtol, atol, rwork |
| 6 |
dimension neq(1), y(1), rtol(1), atol(1), rwork(lrw), iwork(liw) |
| 7 |
c----------------------------------------------------------------------- |
| 8 |
c this is the march 30, 1987 version of |
| 9 |
c lsode.. livermore solver for ordinary differential equations. |
| 10 |
c this version is in double precision. |
| 11 |
c |
| 12 |
c lsode solves the initial value problem for stiff or nonstiff |
| 13 |
c systems of first order ode-s, |
| 14 |
c dy/dt = f(t,y) , or, in component form, |
| 15 |
c dy(i)/dt = f(i) = f(i,t,y(1),y(2),...,y(neq)) (i = 1,...,neq). |
| 16 |
c lsode is a package based on the gear and gearb packages, and on the |
| 17 |
c october 23, 1978 version of the tentative odepack user interface |
| 18 |
c standard, with minor modifications. |
| 19 |
c----------------------------------------------------------------------- |
| 20 |
c reference.. |
| 21 |
c alan c. hindmarsh, odepack, a systematized collection of ode |
| 22 |
c solvers, in scientific computing, r. s. stepleman et al. (eds.), |
| 23 |
c north-holland, amsterdam, 1983, pp. 55-64. |
| 24 |
c----------------------------------------------------------------------- |
| 25 |
c author and contact.. alan c. hindmarsh, |
| 26 |
c computing and mathematics research div., l-316 |
| 27 |
c lawrence livermore national laboratory |
| 28 |
c livermore, ca 94550. |
| 29 |
c----------------------------------------------------------------------- |
| 30 |
c summary of usage. |
| 31 |
c |
| 32 |
c communication between the user and the lsode package, for normal |
| 33 |
c situations, is summarized here. this summary describes only a subset |
| 34 |
c of the full set of options available. see the full description for |
| 35 |
c details, including optional communication, nonstandard options, |
| 36 |
c and instructions for special situations. see also the example |
| 37 |
c problem (with program and output) following this summary. |
| 38 |
c |
| 39 |
c a. first provide a subroutine of the form.. |
| 40 |
c subroutine f (neq, t, y, ydot) |
| 41 |
c dimension y(neq), ydot(neq) |
| 42 |
c which supplies the vector function f by loading ydot(i) with f(i). |
| 43 |
c |
| 44 |
c b. next determine (or guess) whether or not the problem is stiff. |
| 45 |
c stiffness occurs when the jacobian matrix df/dy has an eigenvalue |
| 46 |
c whose real part is negative and large in magnitude, compared to the |
| 47 |
c reciprocal of the t span of interest. if the problem is nonstiff, |
| 48 |
c use a method flag mf = 10. if it is stiff, there are four standard |
| 49 |
c choices for mf, and lsode requires the jacobian matrix in some form. |
| 50 |
c this matrix is regarded either as full (mf = 21 or 22), |
| 51 |
c or banded (mf = 24 or 25). in the banded case, lsode requires two |
| 52 |
c half-bandwidth parameters ml and mu. these are, respectively, the |
| 53 |
c widths of the lower and upper parts of the band, excluding the main |
| 54 |
c diagonal. thus the band consists of the locations (i,j) with |
| 55 |
c i-ml .le. j .le. i+mu, and the full bandwidth is ml+mu+1. |
| 56 |
c |
| 57 |
c c. if the problem is stiff, you are encouraged to supply the jacobian |
| 58 |
c directly (mf = 21 or 24), but if this is not feasible, lsode will |
| 59 |
c compute it internally by difference quotients (mf = 22 or 25). |
| 60 |
c if you are supplying the jacobian, provide a subroutine of the form.. |
| 61 |
c subroutine jac (neq, t, y, ml, mu, pd, nrowpd) |
| 62 |
c dimension y(neq), pd(nrowpd,neq) |
| 63 |
c which supplies df/dy by loading pd as follows.. |
| 64 |
c for a full jacobian (mf = 21), load pd(i,j) with df(i)/dy(j), |
| 65 |
c the partial derivative of f(i) with respect to y(j). (ignore the |
| 66 |
c ml and mu arguments in this case.) |
| 67 |
c for a banded jacobian (mf = 24), load pd(i-j+mu+1,j) with |
| 68 |
c df(i)/dy(j), i.e. load the diagonal lines of df/dy into the rows of |
| 69 |
c pd from the top down. |
| 70 |
c in either case, only nonzero elements need be loaded. |
| 71 |
c |
| 72 |
c d. write a main program which calls subroutine lsode once for |
| 73 |
c each point at which answers are desired. this should also provide |
| 74 |
c for possible use of logical unit 6 for output of error messages |
| 75 |
c by lsode. on the first call to lsode, supply arguments as follows.. |
| 76 |
c f = name of subroutine for right-hand side vector f. |
| 77 |
c this name must be declared external in calling program. |
| 78 |
c neq = number of first order ode-s. |
| 79 |
c y = array of initial values, of length neq. |
| 80 |
c t = the initial value of the independent variable. |
| 81 |
c tout = first point where output is desired (.ne. t). |
| 82 |
c itol = 1 or 2 according as atol (below) is a scalar or array. |
| 83 |
c rtol = relative tolerance parameter (scalar). |
| 84 |
c atol = absolute tolerance parameter (scalar or array). |
| 85 |
c the estimated local error in y(i) will be controlled so as |
| 86 |
c to be roughly less (in magnitude) than |
| 87 |
c ewt(i) = rtol*abs(y(i)) + atol if itol = 1, or |
| 88 |
c ewt(i) = rtol*abs(y(i)) + atol(i) if itol = 2. |
| 89 |
c thus the local error test passes if, in each component, |
| 90 |
c either the absolute error is less than atol (or atol(i)), |
| 91 |
c or the relative error is less than rtol. |
| 92 |
c use rtol = 0.0 for pure absolute error control, and |
| 93 |
c use atol = 0.0 (or atol(i) = 0.0) for pure relative error |
| 94 |
c control. caution.. actual (global) errors may exceed these |
| 95 |
c local tolerances, so choose them conservatively. |
| 96 |
c itask = 1 for normal computation of output values of y at t = tout. |
| 97 |
c istate = integer flag (input and output). set istate = 1. |
| 98 |
c iopt = 0 to indicate no optional inputs used. |
| 99 |
c rwork = real work array of length at least.. |
| 100 |
c 20 + 16*neq for mf = 10, |
| 101 |
c 22 + 9*neq + neq**2 for mf = 21 or 22, |
| 102 |
c 22 + 10*neq + (2*ml + mu)*neq for mf = 24 or 25. |
| 103 |
c lrw = declared length of rwork (in user-s dimension). |
| 104 |
c iwork = integer work array of length at least.. |
| 105 |
c 20 for mf = 10, |
| 106 |
c 20 + neq for mf = 21, 22, 24, or 25. |
| 107 |
c if mf = 24 or 25, input in iwork(1),iwork(2) the lower |
| 108 |
c and upper half-bandwidths ml,mu. |
| 109 |
c liw = declared length of iwork (in user-s dimension). |
| 110 |
c jac = name of subroutine for jacobian matrix (mf = 21 or 24). |
| 111 |
c if used, this name must be declared external in calling |
| 112 |
c program. if not used, pass a dummy name. |
| 113 |
c mf = method flag. standard values are.. |
| 114 |
c 10 for nonstiff (adams) method, no jacobian used. |
| 115 |
c 21 for stiff (bdf) method, user-supplied full jacobian. |
| 116 |
c 22 for stiff method, internally generated full jacobian. |
| 117 |
c 24 for stiff method, user-supplied banded jacobian. |
| 118 |
c 25 for stiff method, internally generated banded jacobian. |
| 119 |
c note that the main program must declare arrays y, rwork, iwork, |
| 120 |
c and possibly atol. |
| 121 |
c |
| 122 |
c e. the output from the first call (or any call) is.. |
| 123 |
c y = array of computed values of y(t) vector. |
| 124 |
c t = corresponding value of independent variable (normally tout). |
| 125 |
c istate = 2 if lsode was successful, negative otherwise. |
| 126 |
c -1 means excess work done on this call (perhaps wrong mf). |
| 127 |
c -2 means excess accuracy requested (tolerances too small). |
| 128 |
c -3 means illegal input detected (see printed message). |
| 129 |
c -4 means repeated error test failures (check all inputs). |
| 130 |
c -5 means repeated convergence failures (perhaps bad jacobian |
| 131 |
c supplied or wrong choice of mf or tolerances). |
| 132 |
c -6 means error weight became zero during problem. (solution |
| 133 |
c component i vanished, and atol or atol(i) = 0.) |
| 134 |
c |
| 135 |
c f. to continue the integration after a successful return, simply |
| 136 |
c reset tout and call lsode again. no other parameters need be reset. |
| 137 |
c |
| 138 |
c----------------------------------------------------------------------- |
| 139 |
c example problem. |
| 140 |
c |
| 141 |
c the following is a simple example problem, with the coding |
| 142 |
c needed for its solution by lsode. the problem is from chemical |
| 143 |
c kinetics, and consists of the following three rate equations.. |
| 144 |
c dy1/dt = -.04*y1 + 1.e4*y2*y3 |
| 145 |
c dy2/dt = .04*y1 - 1.e4*y2*y3 - 3.e7*y2**2 |
| 146 |
c dy3/dt = 3.e7*y2**2 |
| 147 |
c on the interval from t = 0.0 to t = 4.e10, with initial conditions |
| 148 |
c y1 = 1.0, y2 = y3 = 0. the problem is stiff. |
| 149 |
c |
| 150 |
c the following coding solves this problem with lsode, using mf = 21 |
| 151 |
c and printing results at t = .4, 4., ..., 4.e10. it uses |
| 152 |
c itol = 2 and atol much smaller for y2 than y1 or y3 because |
| 153 |
c y2 has much smaller values. |
| 154 |
c at the end of the run, statistical quantities of interest are |
| 155 |
c printed (see optional outputs in the full description below). |
| 156 |
c |
| 157 |
c external fex, jex |
| 158 |
c double precision atol, rtol, rwork, t, tout, y |
| 159 |
c dimension y(3), atol(3), rwork(58), iwork(23) |
| 160 |
c neq = 3 |
| 161 |
c y(1) = 1.d0 |
| 162 |
c y(2) = 0.d0 |
| 163 |
c y(3) = 0.d0 |
| 164 |
c t = 0.d0 |
| 165 |
c tout = .4d0 |
| 166 |
c itol = 2 |
| 167 |
c rtol = 1.d-4 |
| 168 |
c atol(1) = 1.d-6 |
| 169 |
c atol(2) = 1.d-10 |
| 170 |
c atol(3) = 1.d-6 |
| 171 |
c itask = 1 |
| 172 |
c istate = 1 |
| 173 |
c iopt = 0 |
| 174 |
c lrw = 58 |
| 175 |
c liw = 23 |
| 176 |
c mf = 21 |
| 177 |
c do 40 iout = 1,12 |
| 178 |
c call lsode(fex,neq,y,t,tout,itol,rtol,atol,itask,istate, |
| 179 |
c 1 iopt,rwork,lrw,iwork,liw,jex,mf) |
| 180 |
c write(6,20)t,y(1),y(2),y(3) |
| 181 |
c 20 format(7h at t =,e12.4,6h y =,3e14.6) |
| 182 |
c if (istate .lt. 0) go to 80 |
| 183 |
c 40 tout = tout*10.d0 |
| 184 |
c write(6,60)iwork(11),iwork(12),iwork(13) |
| 185 |
c 60 format(/12h no. steps =,i4,11h no. f-s =,i4,11h no. j-s =,i4) |
| 186 |
c stop |
| 187 |
c 80 write(6,90)istate |
| 188 |
c 90 format(///22h error halt.. istate =,i3) |
| 189 |
c stop |
| 190 |
c end |
| 191 |
c |
| 192 |
c subroutine fex (neq, t, y, ydot) |
| 193 |
c double precision t, y, ydot |
| 194 |
c dimension y(3), ydot(3) |
| 195 |
c ydot(1) = -.04d0*y(1) + 1.d4*y(2)*y(3) |
| 196 |
c ydot(3) = 3.d7*y(2)*y(2) |
| 197 |
c ydot(2) = -ydot(1) - ydot(3) |
| 198 |
c return |
| 199 |
c end |
| 200 |
c |
| 201 |
c subroutine jex (neq, t, y, ml, mu, pd, nrpd) |
| 202 |
c double precision pd, t, y |
| 203 |
c dimension y(3), pd(nrpd,3) |
| 204 |
c pd(1,1) = -.04d0 |
| 205 |
c pd(1,2) = 1.d4*y(3) |
| 206 |
c pd(1,3) = 1.d4*y(2) |
| 207 |
c pd(2,1) = .04d0 |
| 208 |
c pd(2,3) = -pd(1,3) |
| 209 |
c pd(3,2) = 6.d7*y(2) |
| 210 |
c pd(2,2) = -pd(1,2) - pd(3,2) |
| 211 |
c return |
| 212 |
c end |
| 213 |
c |
| 214 |
c the output of this program (on a cdc-7600 in single precision) |
| 215 |
c is as follows.. |
| 216 |
c |
| 217 |
c at t = 4.0000e-01 y = 9.851726e-01 3.386406e-05 1.479357e-02 |
| 218 |
c at t = 4.0000e+00 y = 9.055142e-01 2.240418e-05 9.446344e-02 |
| 219 |
c at t = 4.0000e+01 y = 7.158050e-01 9.184616e-06 2.841858e-01 |
| 220 |
c at t = 4.0000e+02 y = 4.504846e-01 3.222434e-06 5.495122e-01 |
| 221 |
c at t = 4.0000e+03 y = 1.831701e-01 8.940379e-07 8.168290e-01 |
| 222 |
c at t = 4.0000e+04 y = 3.897016e-02 1.621193e-07 9.610297e-01 |
| 223 |
c at t = 4.0000e+05 y = 4.935213e-03 1.983756e-08 9.950648e-01 |
| 224 |
c at t = 4.0000e+06 y = 5.159269e-04 2.064759e-09 9.994841e-01 |
| 225 |
c at t = 4.0000e+07 y = 5.306413e-05 2.122677e-10 9.999469e-01 |
| 226 |
c at t = 4.0000e+08 y = 5.494529e-06 2.197824e-11 9.999945e-01 |
| 227 |
c at t = 4.0000e+09 y = 5.129458e-07 2.051784e-12 9.999995e-01 |
| 228 |
c at t = 4.0000e+10 y = -7.170586e-08 -2.868234e-13 1.000000e+00 |
| 229 |
c |
| 230 |
c no. steps = 330 no. f-s = 405 no. j-s = 69 |
| 231 |
c----------------------------------------------------------------------- |
| 232 |
c full description of user interface to lsode. |
| 233 |
c |
| 234 |
c the user interface to lsode consists of the following parts. |
| 235 |
c |
| 236 |
c i. the call sequence to subroutine lsode, which is a driver |
| 237 |
c routine for the solver. this includes descriptions of both |
| 238 |
c the call sequence arguments and of user-supplied routines. |
| 239 |
c following these descriptions is a description of |
| 240 |
c optional inputs available through the call sequence, and then |
| 241 |
c a description of optional outputs (in the work arrays). |
| 242 |
c |
| 243 |
c ii. descriptions of other routines in the lsode package that may be |
| 244 |
c (optionally) called by the user. these provide the ability to |
| 245 |
c alter error message handling, save and restore the internal |
| 246 |
c common, and obtain specified derivatives of the solution y(t). |
| 247 |
c |
| 248 |
c iii. descriptions of common blocks to be declared in overlay |
| 249 |
c or similar environments, or to be saved when doing an interrupt |
| 250 |
c of the problem and continued solution later. |
| 251 |
c |
| 252 |
c iv. description of two routines in the lsode package, either of |
| 253 |
c which the user may replace with his own version, if desired. |
| 254 |
c these relate to the measurement of errors. |
| 255 |
c |
| 256 |
c----------------------------------------------------------------------- |
| 257 |
c part i. call sequence. |
| 258 |
c |
| 259 |
c the call sequence parameters used for input only are |
| 260 |
c f, neq, tout, itol, rtol, atol, itask, iopt, lrw, liw, jac, mf, |
| 261 |
c and those used for both input and output are |
| 262 |
c y, t, istate. |
| 263 |
c the work arrays rwork and iwork are also used for conditional and |
| 264 |
c optional inputs and optional outputs. (the term output here refers |
| 265 |
c to the return from subroutine lsode to the user-s calling program.) |
| 266 |
c |
| 267 |
c the legality of input parameters will be thoroughly checked on the |
| 268 |
c initial call for the problem, but not checked thereafter unless a |
| 269 |
c change in input parameters is flagged by istate = 3 on input. |
| 270 |
c |
| 271 |
c the descriptions of the call arguments are as follows. |
| 272 |
c |
| 273 |
c f = the name of the user-supplied subroutine defining the |
| 274 |
c ode system. the system must be put in the first-order |
| 275 |
c form dy/dt = f(t,y), where f is a vector-valued function |
| 276 |
c of the scalar t and the vector y. subroutine f is to |
| 277 |
c compute the function f. it is to have the form |
| 278 |
c subroutine f (neq, t, y, ydot) |
| 279 |
c dimension y(1), ydot(1) |
| 280 |
c where neq, t, and y are input, and the array ydot = f(t,y) |
| 281 |
c is output. y and ydot are arrays of length neq. |
| 282 |
c (in the dimension statement above, 1 is a dummy |
| 283 |
c dimension.. it can be replaced by any value.) |
| 284 |
c subroutine f should not alter y(1),...,y(neq). |
| 285 |
c f must be declared external in the calling program. |
| 286 |
c |
| 287 |
c subroutine f may access user-defined quantities in |
| 288 |
c neq(2),... and/or in y(neq(1)+1),... if neq is an array |
| 289 |
c (dimensioned in f) and/or y has length exceeding neq(1). |
| 290 |
c see the descriptions of neq and y below. |
| 291 |
c |
| 292 |
c if quantities computed in the f routine are needed |
| 293 |
c externally to lsode, an extra call to f should be made |
| 294 |
c for this purpose, for consistent and accurate results. |
| 295 |
c if only the derivative dy/dt is needed, use intdy instead. |
| 296 |
c |
| 297 |
c neq = the size of the ode system (number of first order |
| 298 |
c ordinary differential equations). used only for input. |
| 299 |
c neq may be decreased, but not increased, during the problem. |
| 300 |
c if neq is decreased (with istate = 3 on input), the |
| 301 |
c remaining components of y should be left undisturbed, if |
| 302 |
c these are to be accessed in f and/or jac. |
| 303 |
c |
| 304 |
c normally, neq is a scalar, and it is generally referred to |
| 305 |
c as a scalar in this user interface description. however, |
| 306 |
c neq may be an array, with neq(1) set to the system size. |
| 307 |
c (the lsode package accesses only neq(1).) in either case, |
| 308 |
c this parameter is passed as the neq argument in all calls |
| 309 |
c to f and jac. hence, if it is an array, locations |
| 310 |
c neq(2),... may be used to store other integer data and pass |
| 311 |
c it to f and/or jac. subroutines f and/or jac must include |
| 312 |
c neq in a dimension statement in that case. |
| 313 |
c |
| 314 |
c y = a real array for the vector of dependent variables, of |
| 315 |
c length neq or more. used for both input and output on the |
| 316 |
c first call (istate = 1), and only for output on other calls. |
| 317 |
c on the first call, y must contain the vector of initial |
| 318 |
c values. on output, y contains the computed solution vector, |
| 319 |
c evaluated at t. if desired, the y array may be used |
| 320 |
c for other purposes between calls to the solver. |
| 321 |
c |
| 322 |
c this array is passed as the y argument in all calls to |
| 323 |
c f and jac. hence its length may exceed neq, and locations |
| 324 |
c y(neq+1),... may be used to store other real data and |
| 325 |
c pass it to f and/or jac. (the lsode package accesses only |
| 326 |
c y(1),...,y(neq).) |
| 327 |
c |
| 328 |
c t = the independent variable. on input, t is used only on the |
| 329 |
c first call, as the initial point of the integration. |
| 330 |
c on output, after each call, t is the value at which a |
| 331 |
c computed solution y is evaluated (usually the same as tout). |
| 332 |
c on an error return, t is the farthest point reached. |
| 333 |
c |
| 334 |
c tout = the next value of t at which a computed solution is desired. |
| 335 |
c used only for input. |
| 336 |
c |
| 337 |
c when starting the problem (istate = 1), tout may be equal |
| 338 |
c to t for one call, then should .ne. t for the next call. |
| 339 |
c for the initial t, an input value of tout .ne. t is used |
| 340 |
c in order to determine the direction of the integration |
| 341 |
c (i.e. the algebraic sign of the step sizes) and the rough |
| 342 |
c scale of the problem. integration in either direction |
| 343 |
c (forward or backward in t) is permitted. |
| 344 |
c |
| 345 |
c if itask = 2 or 5 (one-step modes), tout is ignored after |
| 346 |
c the first call (i.e. the first call with tout .ne. t). |
| 347 |
c otherwise, tout is required on every call. |
| 348 |
c |
| 349 |
c if itask = 1, 3, or 4, the values of tout need not be |
| 350 |
c monotone, but a value of tout which backs up is limited |
| 351 |
c to the current internal t interval, whose endpoints are |
| 352 |
c tcur - hu and tcur (see optional outputs, below, for |
| 353 |
c tcur and hu). |
| 354 |
c |
| 355 |
c itol = an indicator for the type of error control. see |
| 356 |
c description below under atol. used only for input. |
| 357 |
c |
| 358 |
c rtol = a relative error tolerance parameter, either a scalar or |
| 359 |
c an array of length neq. see description below under atol. |
| 360 |
c input only. |
| 361 |
c |
| 362 |
c atol = an absolute error tolerance parameter, either a scalar or |
| 363 |
c an array of length neq. input only. |
| 364 |
c |
| 365 |
c the input parameters itol, rtol, and atol determine |
| 366 |
c the error control performed by the solver. the solver will |
| 367 |
c control the vector e = (e(i)) of estimated local errors |
| 368 |
c in y, according to an inequality of the form |
| 369 |
c rms-norm of ( e(i)/ewt(i) ) .le. 1, |
| 370 |
c where ewt(i) = rtol(i)*abs(y(i)) + atol(i), |
| 371 |
c and the rms-norm (root-mean-square norm) here is |
| 372 |
c rms-norm(v) = sqrt(sum v(i)**2 / neq). here ewt = (ewt(i)) |
| 373 |
c is a vector of weights which must always be positive, and |
| 374 |
c the values of rtol and atol should all be non-negative. |
| 375 |
c the following table gives the types (scalar/array) of |
| 376 |
c rtol and atol, and the corresponding form of ewt(i). |
| 377 |
c |
| 378 |
c itol rtol atol ewt(i) |
| 379 |
c 1 scalar scalar rtol*abs(y(i)) + atol |
| 380 |
c 2 scalar array rtol*abs(y(i)) + atol(i) |
| 381 |
c 3 array scalar rtol(i)*abs(y(i)) + atol |
| 382 |
c 4 array array rtol(i)*abs(y(i)) + atol(i) |
| 383 |
c |
| 384 |
c when either of these parameters is a scalar, it need not |
| 385 |
c be dimensioned in the user-s calling program. |
| 386 |
c |
| 387 |
c if none of the above choices (with itol, rtol, and atol |
| 388 |
c fixed throughout the problem) is suitable, more general |
| 389 |
c error controls can be obtained by substituting |
| 390 |
c user-supplied routines for the setting of ewt and/or for |
| 391 |
c the norm calculation. see part iv below. |
| 392 |
c |
| 393 |
c if global errors are to be estimated by making a repeated |
| 394 |
c run on the same problem with smaller tolerances, then all |
| 395 |
c components of rtol and atol (i.e. of ewt) should be scaled |
| 396 |
c down uniformly. |
| 397 |
c |
| 398 |
c itask = an index specifying the task to be performed. |
| 399 |
c input only. itask has the following values and meanings. |
| 400 |
c 1 means normal computation of output values of y(t) at |
| 401 |
c t = tout (by overshooting and interpolating). |
| 402 |
c 2 means take one step only and return. |
| 403 |
c 3 means stop at the first internal mesh point at or |
| 404 |
c beyond t = tout and return. |
| 405 |
c 4 means normal computation of output values of y(t) at |
| 406 |
c t = tout but without overshooting t = tcrit. |
| 407 |
c tcrit must be input as rwork(1). tcrit may be equal to |
| 408 |
c or beyond tout, but not behind it in the direction of |
| 409 |
c integration. this option is useful if the problem |
| 410 |
c has a singularity at or beyond t = tcrit. |
| 411 |
c 5 means take one step, without passing tcrit, and return. |
| 412 |
c tcrit must be input as rwork(1). |
| 413 |
c |
| 414 |
c note.. if itask = 4 or 5 and the solver reaches tcrit |
| 415 |
c (within roundoff), it will return t = tcrit (exactly) to |
| 416 |
c indicate this (unless itask = 4 and tout comes before tcrit, |
| 417 |
c in which case answers at t = tout are returned first). |
| 418 |
c |
| 419 |
c istate = an index used for input and output to specify the |
| 420 |
c the state of the calculation. |
| 421 |
c |
| 422 |
c on input, the values of istate are as follows. |
| 423 |
c 1 means this is the first call for the problem |
| 424 |
c (initializations will be done). see note below. |
| 425 |
c 2 means this is not the first call, and the calculation |
| 426 |
c is to continue normally, with no change in any input |
| 427 |
c parameters except possibly tout and itask. |
| 428 |
c (if itol, rtol, and/or atol are changed between calls |
| 429 |
c with istate = 2, the new values will be used but not |
| 430 |
c tested for legality.) |
| 431 |
c 3 means this is not the first call, and the |
| 432 |
c calculation is to continue normally, but with |
| 433 |
c a change in input parameters other than |
| 434 |
c tout and itask. changes are allowed in |
| 435 |
c neq, itol, rtol, atol, iopt, lrw, liw, mf, ml, mu, |
| 436 |
c and any of the optional inputs except h0. |
| 437 |
c (see iwork description for ml and mu.) |
| 438 |
c note.. a preliminary call with tout = t is not counted |
| 439 |
c as a first call here, as no initialization or checking of |
| 440 |
c input is done. (such a call is sometimes useful for the |
| 441 |
c purpose of outputting the initial conditions.) |
| 442 |
c thus the first call for which tout .ne. t requires |
| 443 |
c istate = 1 on input. |
| 444 |
c |
| 445 |
c on output, istate has the following values and meanings. |
| 446 |
c 1 means nothing was done, as tout was equal to t with |
| 447 |
c istate = 1 on input. (however, an internal counter was |
| 448 |
c set to detect and prevent repeated calls of this type.) |
| 449 |
c 2 means the integration was performed successfully. |
| 450 |
c -1 means an excessive amount of work (more than mxstep |
| 451 |
c steps) was done on this call, before completing the |
| 452 |
c requested task, but the integration was otherwise |
| 453 |
c successful as far as t. (mxstep is an optional input |
| 454 |
c and is normally 500.) to continue, the user may |
| 455 |
c simply reset istate to a value .gt. 1 and call again |
| 456 |
c (the excess work step counter will be reset to 0). |
| 457 |
c in addition, the user may increase mxstep to avoid |
| 458 |
c this error return (see below on optional inputs). |
| 459 |
c -2 means too much accuracy was requested for the precision |
| 460 |
c of the machine being used. this was detected before |
| 461 |
c completing the requested task, but the integration |
| 462 |
c was successful as far as t. to continue, the tolerance |
| 463 |
c parameters must be reset, and istate must be set |
| 464 |
c to 3. the optional output tolsf may be used for this |
| 465 |
c purpose. (note.. if this condition is detected before |
| 466 |
c taking any steps, then an illegal input return |
| 467 |
c (istate = -3) occurs instead.) |
| 468 |
c -3 means illegal input was detected, before taking any |
| 469 |
c integration steps. see written message for details. |
| 470 |
c note.. if the solver detects an infinite loop of calls |
| 471 |
c to the solver with illegal input, it will cause |
| 472 |
c the run to stop. |
| 473 |
c -4 means there were repeated error test failures on |
| 474 |
c one attempted step, before completing the requested |
| 475 |
c task, but the integration was successful as far as t. |
| 476 |
c the problem may have a singularity, or the input |
| 477 |
c may be inappropriate. |
| 478 |
c -5 means there were repeated convergence test failures on |
| 479 |
c one attempted step, before completing the requested |
| 480 |
c task, but the integration was successful as far as t. |
| 481 |
c this may be caused by an inaccurate jacobian matrix, |
| 482 |
c if one is being used. |
| 483 |
c -6 means ewt(i) became zero for some i during the |
| 484 |
c integration. pure relative error control (atol(i)=0.0) |
| 485 |
c was requested on a variable which has now vanished. |
| 486 |
c the integration was successful as far as t. |
| 487 |
c |
| 488 |
c note.. since the normal output value of istate is 2, |
| 489 |
c it does not need to be reset for normal continuation. |
| 490 |
c also, since a negative input value of istate will be |
| 491 |
c regarded as illegal, a negative output value requires the |
| 492 |
c user to change it, and possibly other inputs, before |
| 493 |
c calling the solver again. |
| 494 |
c |
| 495 |
c iopt = an integer flag to specify whether or not any optional |
| 496 |
c inputs are being used on this call. input only. |
| 497 |
c the optional inputs are listed separately below. |
| 498 |
c iopt = 0 means no optional inputs are being used. |
| 499 |
c default values will be used in all cases. |
| 500 |
c iopt = 1 means one or more optional inputs are being used. |
| 501 |
c |
| 502 |
c rwork = a real working array (double precision). |
| 503 |
c the length of rwork must be at least |
| 504 |
c 20 + nyh*(maxord + 1) + 3*neq + lwm where |
| 505 |
c nyh = the initial value of neq, |
| 506 |
c maxord = 12 (if meth = 1) or 5 (if meth = 2) (unless a |
| 507 |
c smaller value is given as an optional input), |
| 508 |
c lwm = 0 if miter = 0, |
| 509 |
c lwm = neq**2 + 2 if miter is 1 or 2, |
| 510 |
c lwm = neq + 2 if miter = 3, and |
| 511 |
c lwm = (2*ml+mu+1)*neq + 2 if miter is 4 or 5. |
| 512 |
c (see the mf description for meth and miter.) |
| 513 |
c thus if maxord has its default value and neq is constant, |
| 514 |
c this length is.. |
| 515 |
c 20 + 16*neq for mf = 10, |
| 516 |
c 22 + 16*neq + neq**2 for mf = 11 or 12, |
| 517 |
c 22 + 17*neq for mf = 13, |
| 518 |
c 22 + 17*neq + (2*ml+mu)*neq for mf = 14 or 15, |
| 519 |
c 20 + 9*neq for mf = 20, |
| 520 |
c 22 + 9*neq + neq**2 for mf = 21 or 22, |
| 521 |
c 22 + 10*neq for mf = 23, |
| 522 |
c 22 + 10*neq + (2*ml+mu)*neq for mf = 24 or 25. |
| 523 |
c the first 20 words of rwork are reserved for conditional |
| 524 |
c and optional inputs and optional outputs. |
| 525 |
c |
| 526 |
c the following word in rwork is a conditional input.. |
| 527 |
c rwork(1) = tcrit = critical value of t which the solver |
| 528 |
c is not to overshoot. required if itask is |
| 529 |
c 4 or 5, and ignored otherwise. (see itask.) |
| 530 |
c |
| 531 |
c lrw = the length of the array rwork, as declared by the user. |
| 532 |
c (this will be checked by the solver.) |
| 533 |
c |
| 534 |
c iwork = an integer work array. the length of iwork must be at least |
| 535 |
c 20 if miter = 0 or 3 (mf = 10, 13, 20, 23), or |
| 536 |
c 20 + neq otherwise (mf = 11, 12, 14, 15, 21, 22, 24, 25). |
| 537 |
c the first few words of iwork are used for conditional and |
| 538 |
c optional inputs and optional outputs. |
| 539 |
c |
| 540 |
c the following 2 words in iwork are conditional inputs.. |
| 541 |
c iwork(1) = ml these are the lower and upper |
| 542 |
c iwork(2) = mu half-bandwidths, respectively, of the |
| 543 |
c banded jacobian, excluding the main diagonal. |
| 544 |
c the band is defined by the matrix locations |
| 545 |
c (i,j) with i-ml .le. j .le. i+mu. ml and mu |
| 546 |
c must satisfy 0 .le. ml,mu .le. neq-1. |
| 547 |
c these are required if miter is 4 or 5, and |
| 548 |
c ignored otherwise. ml and mu may in fact be |
| 549 |
c the band parameters for a matrix to which |
| 550 |
c df/dy is only approximately equal. |
| 551 |
c |
| 552 |
c liw = the length of the array iwork, as declared by the user. |
| 553 |
c (this will be checked by the solver.) |
| 554 |
c |
| 555 |
c note.. the work arrays must not be altered between calls to lsode |
| 556 |
c for the same problem, except possibly for the conditional and |
| 557 |
c optional inputs, and except for the last 3*neq words of rwork. |
| 558 |
c the latter space is used for internal scratch space, and so is |
| 559 |
c available for use by the user outside lsode between calls, if |
| 560 |
c desired (but not for use by f or jac). |
| 561 |
c |
| 562 |
c jac = the name of the user-supplied routine (miter = 1 or 4) to |
| 563 |
c compute the jacobian matrix, df/dy, as a function of |
| 564 |
c the scalar t and the vector y. it is to have the form |
| 565 |
c subroutine jac (neq, t, y, ml, mu, pd, nrowpd) |
| 566 |
c dimension y(1), pd(nrowpd,1) |
| 567 |
c where neq, t, y, ml, mu, and nrowpd are input and the array |
| 568 |
c pd is to be loaded with partial derivatives (elements of |
| 569 |
c the jacobian matrix) on output. pd must be given a first |
| 570 |
c dimension of nrowpd. t and y have the same meaning as in |
| 571 |
c subroutine f. (in the dimension statement above, 1 is a |
| 572 |
c dummy dimension.. it can be replaced by any value.) |
| 573 |
c in the full matrix case (miter = 1), ml and mu are |
| 574 |
c ignored, and the jacobian is to be loaded into pd in |
| 575 |
c columnwise manner, with df(i)/dy(j) loaded into pd(i,j). |
| 576 |
c in the band matrix case (miter = 4), the elements |
| 577 |
c within the band are to be loaded into pd in columnwise |
| 578 |
c manner, with diagonal lines of df/dy loaded into the rows |
| 579 |
c of pd. thus df(i)/dy(j) is to be loaded into pd(i-j+mu+1,j). |
| 580 |
c ml and mu are the half-bandwidth parameters (see iwork). |
| 581 |
c the locations in pd in the two triangular areas which |
| 582 |
c correspond to nonexistent matrix elements can be ignored |
| 583 |
c or loaded arbitrarily, as they are overwritten by lsode. |
| 584 |
c jac need not provide df/dy exactly. a crude |
| 585 |
c approximation (possibly with a smaller bandwidth) will do. |
| 586 |
c in either case, pd is preset to zero by the solver, |
| 587 |
c so that only the nonzero elements need be loaded by jac. |
| 588 |
c each call to jac is preceded by a call to f with the same |
| 589 |
c arguments neq, t, and y. thus to gain some efficiency, |
| 590 |
c intermediate quantities shared by both calculations may be |
| 591 |
c saved in a user common block by f and not recomputed by jac, |
| 592 |
c if desired. also, jac may alter the y array, if desired. |
| 593 |
c jac must be declared external in the calling program. |
| 594 |
c subroutine jac may access user-defined quantities in |
| 595 |
c neq(2),... and/or in y(neq(1)+1),... if neq is an array |
| 596 |
c (dimensioned in jac) and/or y has length exceeding neq(1). |
| 597 |
c see the descriptions of neq and y above. |
| 598 |
c |
| 599 |
c mf = the method flag. used only for input. the legal values of |
| 600 |
c mf are 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, and 25. |
| 601 |
c mf has decimal digits meth and miter.. mf = 10*meth + miter. |
| 602 |
c meth indicates the basic linear multistep method.. |
| 603 |
c meth = 1 means the implicit adams method. |
| 604 |
c meth = 2 means the method based on backward |
| 605 |
c differentiation formulas (bdf-s). |
| 606 |
c miter indicates the corrector iteration method.. |
| 607 |
c miter = 0 means functional iteration (no jacobian matrix |
| 608 |
c is involved). |
| 609 |
c miter = 1 means chord iteration with a user-supplied |
| 610 |
c full (neq by neq) jacobian. |
| 611 |
c miter = 2 means chord iteration with an internally |
| 612 |
c generated (difference quotient) full jacobian |
| 613 |
c (using neq extra calls to f per df/dy value). |
| 614 |
c miter = 3 means chord iteration with an internally |
| 615 |
c generated diagonal jacobian approximation. |
| 616 |
c (using 1 extra call to f per df/dy evaluation). |
| 617 |
c miter = 4 means chord iteration with a user-supplied |
| 618 |
c banded jacobian. |
| 619 |
c miter = 5 means chord iteration with an internally |
| 620 |
c generated banded jacobian (using ml+mu+1 extra |
| 621 |
c calls to f per df/dy evaluation). |
| 622 |
c if miter = 1 or 4, the user must supply a subroutine jac |
| 623 |
c (the name is arbitrary) as described above under jac. |
| 624 |
c for other values of miter, a dummy argument can be used. |
| 625 |
c----------------------------------------------------------------------- |
| 626 |
c optional inputs. |
| 627 |
c |
| 628 |
c the following is a list of the optional inputs provided for in the |
| 629 |
c call sequence. (see also part ii.) for each such input variable, |
| 630 |
c this table lists its name as used in this documentation, its |
| 631 |
c location in the call sequence, its meaning, and the default value. |
| 632 |
c the use of any of these inputs requires iopt = 1, and in that |
| 633 |
c case all of these inputs are examined. a value of zero for any |
| 634 |
c of these optional inputs will cause the default value to be used. |
| 635 |
c thus to use a subset of the optional inputs, simply preload |
| 636 |
c locations 5 to 10 in rwork and iwork to 0.0 and 0 respectively, and |
| 637 |
c then set those of interest to nonzero values. |
| 638 |
c |
| 639 |
c name location meaning and default value |
| 640 |
c |
| 641 |
c h0 rwork(5) the step size to be attempted on the first step. |
| 642 |
c the default value is determined by the solver. |
| 643 |
c |
| 644 |
c hmax rwork(6) the maximum absolute step size allowed. |
| 645 |
c the default value is infinite. |
| 646 |
c |
| 647 |
c hmin rwork(7) the minimum absolute step size allowed. |
| 648 |
c the default value is 0. (this lower bound is not |
| 649 |
c enforced on the final step before reaching tcrit |
| 650 |
c when itask = 4 or 5.) |
| 651 |
c |
| 652 |
c maxord iwork(5) the maximum order to be allowed. the default |
| 653 |
c value is 12 if meth = 1, and 5 if meth = 2. |
| 654 |
c if maxord exceeds the default value, it will |
| 655 |
c be reduced to the default value. |
| 656 |
c if maxord is changed during the problem, it may |
| 657 |
c cause the current order to be reduced. |
| 658 |
c |
| 659 |
c mxstep iwork(6) maximum number of (internally defined) steps |
| 660 |
c allowed during one call to the solver. |
| 661 |
c the default value is 500. |
| 662 |
c |
| 663 |
c mxhnil iwork(7) maximum number of messages printed (per problem) |
| 664 |
c warning that t + h = t on a step (h = step size). |
| 665 |
c this must be positive to result in a non-default |
| 666 |
c value. the default value is 10. |
| 667 |
c----------------------------------------------------------------------- |
| 668 |
c optional outputs. |
| 669 |
c |
| 670 |
c as optional additional output from lsode, the variables listed |
| 671 |
c below are quantities related to the performance of lsode |
| 672 |
c which are available to the user. these are communicated by way of |
| 673 |
c the work arrays, but also have internal mnemonic names as shown. |
| 674 |
c except where stated otherwise, all of these outputs are defined |
| 675 |
c on any successful return from lsode, and on any return with |
| 676 |
c istate = -1, -2, -4, -5, or -6. on an illegal input return |
| 677 |
c (istate = -3), they will be unchanged from their existing values |
| 678 |
c (if any), except possibly for tolsf, lenrw, and leniw. |
| 679 |
c on any error return, outputs relevant to the error will be defined, |
| 680 |
c as noted below. |
| 681 |
c |
| 682 |
c name location meaning |
| 683 |
c |
| 684 |
c hu rwork(11) the step size in t last used (successfully). |
| 685 |
c |
| 686 |
c hcur rwork(12) the step size to be attempted on the next step. |
| 687 |
c |
| 688 |
c tcur rwork(13) the current value of the independent variable |
| 689 |
c which the solver has actually reached, i.e. the |
| 690 |
c current internal mesh point in t. on output, tcur |
| 691 |
c will always be at least as far as the argument |
| 692 |
c t, but may be farther (if interpolation was done). |
| 693 |
c |
| 694 |
c tolsf rwork(14) a tolerance scale factor, greater than 1.0, |
| 695 |
c computed when a request for too much accuracy was |
| 696 |
c detected (istate = -3 if detected at the start of |
| 697 |
c the problem, istate = -2 otherwise). if itol is |
| 698 |
c left unaltered but rtol and atol are uniformly |
| 699 |
c scaled up by a factor of tolsf for the next call, |
| 700 |
c then the solver is deemed likely to succeed. |
| 701 |
c (the user may also ignore tolsf and alter the |
| 702 |
c tolerance parameters in any other way appropriate.) |
| 703 |
c |
| 704 |
c nst iwork(11) the number of steps taken for the problem so far. |
| 705 |
c |
| 706 |
c nfe iwork(12) the number of f evaluations for the problem so far. |
| 707 |
c |
| 708 |
c nje iwork(13) the number of jacobian evaluations (and of matrix |
| 709 |
c lu decompositions) for the problem so far. |
| 710 |
c |
| 711 |
c nqu iwork(14) the method order last used (successfully). |
| 712 |
c |
| 713 |
c nqcur iwork(15) the order to be attempted on the next step. |
| 714 |
c |
| 715 |
c imxer iwork(16) the index of the component of largest magnitude in |
| 716 |
c the weighted local error vector ( e(i)/ewt(i) ), |
| 717 |
c on an error return with istate = -4 or -5. |
| 718 |
c |
| 719 |
c lenrw iwork(17) the length of rwork actually required. |
| 720 |
c this is defined on normal returns and on an illegal |
| 721 |
c input return for insufficient storage. |
| 722 |
c |
| 723 |
c leniw iwork(18) the length of iwork actually required. |
| 724 |
c this is defined on normal returns and on an illegal |
| 725 |
c input return for insufficient storage. |
| 726 |
c |
| 727 |
c the following two arrays are segments of the rwork array which |
| 728 |
c may also be of interest to the user as optional outputs. |
| 729 |
c for each array, the table below gives its internal name, |
| 730 |
c its base address in rwork, and its description. |
| 731 |
c |
| 732 |
c name base address description |
| 733 |
c |
| 734 |
c yh 21 the nordsieck history array, of size nyh by |
| 735 |
c (nqcur + 1), where nyh is the initial value |
| 736 |
c of neq. for j = 0,1,...,nqcur, column j+1 |
| 737 |
c of yh contains hcur**j/factorial(j) times |
| 738 |
c the j-th derivative of the interpolating |
| 739 |
c polynomial currently representing the solution, |
| 740 |
c evaluated at t = tcur. |
| 741 |
c |
| 742 |
c acor lenrw-neq+1 array of size neq used for the accumulated |
| 743 |
c corrections on each step, scaled on output |
| 744 |
c to represent the estimated local error in y |
| 745 |
c on the last step. this is the vector e in |
| 746 |
c the description of the error control. it is |
| 747 |
c defined only on a successful return from lsode. |
| 748 |
c |
| 749 |
c----------------------------------------------------------------------- |
| 750 |
c part ii. other routines callable. |
| 751 |
c |
| 752 |
c the following are optional calls which the user may make to |
| 753 |
c gain additional capabilities in conjunction with lsode. |
| 754 |
c (the routines xsetun and xsetf are designed to conform to the |
| 755 |
c slatec error handling package.) |
| 756 |
c |
| 757 |
c form of call function |
| 758 |
c call xsetun(lun) set the logical unit number, lun, for |
| 759 |
c output of messages from lsode, if |
| 760 |
c the default is not desired. |
| 761 |
c the default value of lun is 6. |
| 762 |
c |
| 763 |
c call xsetf(mflag) set a flag to control the printing of |
| 764 |
c messages by lsode. |
| 765 |
c mflag = 0 means do not print. (danger.. |
| 766 |
c this risks losing valuable information.) |
| 767 |
c mflag = 1 means print (the default). |
| 768 |
c |
| 769 |
c either of the above calls may be made at |
| 770 |
c any time and will take effect immediately. |
| 771 |
c |
| 772 |
c call srcom(rsav,isav,job) saves and restores the contents of |
| 773 |
c the internal common blocks used by |
| 774 |
c lsode (see part iii below). |
| 775 |
c rsav must be a real array of length 218 |
| 776 |
c or more, and isav must be an integer |
| 777 |
c array of length 41 or more. |
| 778 |
c job=1 means save common into rsav/isav. |
| 779 |
c job=2 means restore common from rsav/isav. |
| 780 |
c srcom is useful if one is |
| 781 |
c interrupting a run and restarting |
| 782 |
c later, or alternating between two or |
| 783 |
c more problems solved with lsode. |
| 784 |
c |
| 785 |
c call intdy(,,,,,) provide derivatives of y, of various |
| 786 |
c (see below) orders, at a specified point t, if |
| 787 |
c desired. it may be called only after |
| 788 |
c a successful return from lsode. |
| 789 |
c |
| 790 |
c the detailed instructions for using intdy are as follows. |
| 791 |
c the form of the call is.. |
| 792 |
c |
| 793 |
c call intdy (t, k, rwork(21), nyh, dky, iflag) |
| 794 |
c |
| 795 |
c the input parameters are.. |
| 796 |
c |
| 797 |
c t = value of independent variable where answers are desired |
| 798 |
c (normally the same as the t last returned by lsode). |
| 799 |
c for valid results, t must lie between tcur - hu and tcur. |
| 800 |
c (see optional outputs for tcur and hu.) |
| 801 |
c k = integer order of the derivative desired. k must satisfy |
| 802 |
c 0 .le. k .le. nqcur, where nqcur is the current order |
| 803 |
c (see optional outputs). the capability corresponding |
| 804 |
c to k = 0, i.e. computing y(t), is already provided |
| 805 |
c by lsode directly. since nqcur .ge. 1, the first |
| 806 |
c derivative dy/dt is always available with intdy. |
| 807 |
c rwork(21) = the base address of the history array yh. |
| 808 |
c nyh = column length of yh, equal to the initial value of neq. |
| 809 |
c |
| 810 |
c the output parameters are.. |
| 811 |
c |
| 812 |
c dky = a real array of length neq containing the computed value |
| 813 |
c of the k-th derivative of y(t). |
| 814 |
c iflag = integer flag, returned as 0 if k and t were legal, |
| 815 |
c -1 if k was illegal, and -2 if t was illegal. |
| 816 |
c on an error return, a message is also written. |
| 817 |
c----------------------------------------------------------------------- |
| 818 |
c part iii. common blocks. |
| 819 |
c |
| 820 |
c if lsode is to be used in an overlay situation, the user |
| 821 |
c must declare, in the primary overlay, the variables in.. |
| 822 |
c (1) the call sequence to lsode, |
| 823 |
c (2) the two internal common blocks |
| 824 |
c /ls0001/ of length 257 (218 double precision words |
| 825 |
c followed by 39 integer words), |
| 826 |
c /eh0001/ of length 2 (integer words). |
| 827 |
c |
| 828 |
c if lsode is used on a system in which the contents of internal |
| 829 |
c common blocks are not preserved between calls, the user should |
| 830 |
c declare the above two common blocks in his main program to insure |
| 831 |
c that their contents are preserved. |
| 832 |
c |
| 833 |
c if the solution of a given problem by lsode is to be interrupted |
| 834 |
c and then later continued, such as when restarting an interrupted run |
| 835 |
c or alternating between two or more problems, the user should save, |
| 836 |
c following the return from the last lsode call prior to the |
| 837 |
c interruption, the contents of the call sequence variables and the |
| 838 |
c internal common blocks, and later restore these values before the |
| 839 |
c next lsode call for that problem. to save and restore the common |
| 840 |
c blocks, use subroutine srcom (see part ii above). |
| 841 |
c |
| 842 |
c----------------------------------------------------------------------- |
| 843 |
c part iv. optionally replaceable solver routines. |
| 844 |
c |
| 845 |
c below are descriptions of two routines in the lsode package which |
| 846 |
c relate to the measurement of errors. either routine can be |
| 847 |
c replaced by a user-supplied version, if desired. however, since such |
| 848 |
c a replacement may have a major impact on performance, it should be |
| 849 |
c done only when absolutely necessary, and only with great caution. |
| 850 |
c (note.. the means by which the package version of a routine is |
| 851 |
c superseded by the user-s version may be system-dependent.) |
| 852 |
c |
| 853 |
c (a) ewset. |
| 854 |
c the following subroutine is called just before each internal |
| 855 |
c integration step, and sets the array of error weights, ewt, as |
| 856 |
c described under itol/rtol/atol above.. |
| 857 |
c subroutine ewset (neq, itol, rtol, atol, ycur, ewt) |
| 858 |
c where neq, itol, rtol, and atol are as in the lsode call sequence, |
| 859 |
c ycur contains the current dependent variable vector, and |
| 860 |
c ewt is the array of weights set by ewset. |
| 861 |
c |
| 862 |
c if the user supplies this subroutine, it must return in ewt(i) |
| 863 |
c (i = 1,...,neq) a positive quantity suitable for comparing errors |
| 864 |
c in y(i) to. the ewt array returned by ewset is passed to the |
| 865 |
c vnorm routine (see below), and also used by lsode in the computation |
| 866 |
c of the optional output imxer, the diagonal jacobian approximation, |
| 867 |
c and the increments for difference quotient jacobians. |
| 868 |
c |
| 869 |
c in the user-supplied version of ewset, it may be desirable to use |
| 870 |
c the current values of derivatives of y. derivatives up to order nq |
| 871 |
c are available from the history array yh, described above under |
| 872 |
c optional outputs. in ewset, yh is identical to the ycur array, |
| 873 |
c extended to nq + 1 columns with a column length of nyh and scale |
| 874 |
c factors of h**j/factorial(j). on the first call for the problem, |
| 875 |
c given by nst = 0, nq is 1 and h is temporarily set to 1.0. |
| 876 |
c the quantities nq, nyh, h, and nst can be obtained by including |
| 877 |
c in ewset the statements.. |
| 878 |
c double precision h, rls |
| 879 |
c common /ls0001/ rls(218),ils(39) |
| 880 |
c nq = ils(35) |
| 881 |
c nyh = ils(14) |
| 882 |
c nst = ils(36) |
| 883 |
c h = rls(212) |
| 884 |
c thus, for example, the current value of dy/dt can be obtained as |
| 885 |
c ycur(nyh+i)/h (i=1,...,neq) (and the division by h is |
| 886 |
c unnecessary when nst = 0). |
| 887 |
c |
| 888 |
c (b) vnorm. |
| 889 |
c the following is a real function routine which computes the weighted |
| 890 |
c root-mean-square norm of a vector v.. |
| 891 |
c d = vnorm (n, v, w) |
| 892 |
c where.. |
| 893 |
c n = the length of the vector, |
| 894 |
c v = real array of length n containing the vector, |
| 895 |
c w = real array of length n containing weights, |
| 896 |
c d = sqrt( (1/n) * sum(v(i)*w(i))**2 ). |
| 897 |
c vnorm is called with n = neq and with w(i) = 1.0/ewt(i), where |
| 898 |
c ewt is as set by subroutine ewset. |
| 899 |
c |
| 900 |
c if the user supplies this function, it should return a non-negative |
| 901 |
c value of vnorm suitable for use in the error control in lsode. |
| 902 |
c none of the arguments should be altered by vnorm. |
| 903 |
c for example, a user-supplied vnorm routine might.. |
| 904 |
c -substitute a max-norm of (v(i)*w(i)) for the rms-norm, or |
| 905 |
c -ignore some components of v in the norm, with the effect of |
| 906 |
c suppressing the error control on those components of y. |
| 907 |
c----------------------------------------------------------------------- |
| 908 |
c----------------------------------------------------------------------- |
| 909 |
c other routines in the lsode package. |
| 910 |
c |
| 911 |
c in addition to subroutine lsode, the lsode package includes the |
| 912 |
c following subroutines and function routines.. |
| 913 |
c intdy computes an interpolated value of the y vector at t = tout. |
| 914 |
c stode is the core integrator, which does one step of the |
| 915 |
c integration and the associated error control. |
| 916 |
c cfode sets all method coefficients and test constants. |
| 917 |
c prepj computes and preprocesses the jacobian matrix j = df/dy |
| 918 |
c and the newton iteration matrix p = i - h*l0*j. |
| 919 |
c solsy manages solution of linear system in chord iteration. |
| 920 |
c ewset sets the error weight vector ewt before each step. |
| 921 |
c vnorm computes the weighted r.m.s. norm of a vector. |
| 922 |
c srcom is a user-callable routine to save and restore |
| 923 |
c the contents of the internal common blocks. |
| 924 |
c dgefa and dgesl are routines from linpack for solving full |
| 925 |
c systems of linear algebraic equations. |
| 926 |
c dgbfa and dgbsl are routines from linpack for solving banded |
| 927 |
c linear systems. |
| 928 |
c daxpy, dscal, idamax, and ddot are basic linear algebra modules |
| 929 |
c (blas) used by the above linpack routines. |
| 930 |
c d1mach computes the unit roundoff in a machine-independent manner. |
| 931 |
c XERRWV, xsetun, and xsetf handle the printing of all error |
| 932 |
c messages and warnings. XERRWV is machine-dependent. |
| 933 |
C ASCEND C XERRWV has been replaced by XASCWV from interface/Lsode.c. |
| 934 |
c note.. vnorm, idamax, ddot, and d1mach are function routines. |
| 935 |
c all the others are subroutines. |
| 936 |
c |
| 937 |
c the intrinsic and external routines used by lsode are.. |
| 938 |
c dabs, dmax1, dmin1, dfloat, max0, min0, mod, dsign, dsqrt, and write. |
| 939 |
c |
| 940 |
c a block data subprogram is also included with the package, |
| 941 |
c for loading some of the variables in internal common. |
| 942 |
c |
| 943 |
c----------------------------------------------------------------------- |
| 944 |
c the following card is for optimized compilation on llnl compilers. |
| 945 |
clll. optimize |
| 946 |
c----------------------------------------------------------------------- |
| 947 |
cascend changes |
| 948 |
Ckaa external aftime |
| 949 |
external prepj, solsy |
| 950 |
integer illin, init, lyh, lewt, lacor, lsavf, lwm, liwm, |
| 951 |
1 mxstep, mxhnil, nhnil, ntrep, nslast, nyh, iowns |
| 952 |
integer icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 953 |
1 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 954 |
integer i, i1, i2, iflag, imxer, kgo, lf0, |
| 955 |
1 leniw, lenrw, lenwm, ml, mord, mu, mxhnl0, mxstp0 |
| 956 |
double precision rowns, |
| 957 |
1 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround |
| 958 |
double precision atoli, ayi, big, ewti, h0, hmax, hmx, rh, rtoli, |
| 959 |
1 tcrit, tdist, tnext, tol, tolsf, tp, size, sum, w0, |
| 960 |
2 d1mach, vnorm |
| 961 |
dimension mord(2) |
| 962 |
logical ihit |
| 963 |
c----------------------------------------------------------------------- |
| 964 |
c the following internal common block contains |
| 965 |
c (a) variables which are local to any subroutine but whose values must |
| 966 |
c be preserved between calls to the routine (own variables), and |
| 967 |
c (b) variables which are communicated between subroutines. |
| 968 |
c the structure of the block is as follows.. all real variables are |
| 969 |
c listed first, followed by all integers. within each type, the |
| 970 |
c variables are grouped with those local to subroutine lsode first, |
| 971 |
c then those local to subroutine stode, and finally those used |
| 972 |
c for communication. the block is declared in subroutines |
| 973 |
c lsode, intdy, stode, prepj, and solsy. groups of variables are |
| 974 |
c replaced by dummy arrays in the common declarations in routines |
| 975 |
c where those variables are not used. |
| 976 |
c----------------------------------------------------------------------- |
| 977 |
common /ls0001/ rowns(209), |
| 978 |
1 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround, |
| 979 |
2 illin, init, lyh, lewt, lacor, lsavf, lwm, liwm, |
| 980 |
3 mxstep, mxhnil, nhnil, ntrep, nslast, nyh, iowns(6), |
| 981 |
4 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 982 |
5 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 983 |
c |
| 984 |
data mord(1),mord(2)/12,5/, mxstp0/500/, mxhnl0/10/ |
| 985 |
|
| 986 |
C ascend debugging options |
| 987 |
C type *, 'iopt',iopt |
| 988 |
C type *, 'h0',rwork(5) |
| 989 |
C type *, 'hmax',rwork(6) |
| 990 |
C type *, 'hmin',rwork(7) |
| 991 |
C type *, 'maxs',iwork(6) |
| 992 |
c----------------------------------------------------------------------- |
| 993 |
c block a. |
| 994 |
c this code block is executed on every call. |
| 995 |
c it tests istate and itask for legality and branches appropriately. |
| 996 |
c if istate .gt. 1 but the flag init shows that initialization has |
| 997 |
c not yet been done, an error return occurs. |
| 998 |
c if istate = 1 and tout = t, jump to block g and return immediately. |
| 999 |
c----------------------------------------------------------------------- |
| 1000 |
if (istate .lt. 1 .or. istate .gt. 3) go to 601 |
| 1001 |
if (itask .lt. 1 .or. itask .gt. 5) go to 602 |
| 1002 |
if (istate .eq. 1) go to 10 |
| 1003 |
if (init .eq. 0) go to 603 |
| 1004 |
if (istate .eq. 2) go to 200 |
| 1005 |
go to 20 |
| 1006 |
10 init = 0 |
| 1007 |
if (tout .eq. t) go to 430 |
| 1008 |
20 ntrep = 0 |
| 1009 |
c----------------------------------------------------------------------- |
| 1010 |
c block b. |
| 1011 |
c the next code block is executed for the initial call (istate = 1), |
| 1012 |
c or for a continuation call with parameter changes (istate = 3). |
| 1013 |
c it contains checking of all inputs and various initializations. |
| 1014 |
c |
| 1015 |
c first check legality of the non-optional inputs neq, itol, iopt, |
| 1016 |
c mf, ml, and mu. |
| 1017 |
c----------------------------------------------------------------------- |
| 1018 |
if (neq(1) .le. 0) go to 604 |
| 1019 |
if (istate .eq. 1) go to 25 |
| 1020 |
if (neq(1) .gt. n) go to 605 |
| 1021 |
25 n = neq(1) |
| 1022 |
if (itol .lt. 1 .or. itol .gt. 4) go to 606 |
| 1023 |
if (iopt .lt. 0 .or. iopt .gt. 1) go to 607 |
| 1024 |
meth = mf/10 |
| 1025 |
miter = mf - 10*meth |
| 1026 |
if (meth .lt. 1 .or. meth .gt. 2) go to 608 |
| 1027 |
if (miter .lt. 0 .or. miter .gt. 5) go to 608 |
| 1028 |
if (miter .le. 3) go to 30 |
| 1029 |
ml = iwork(1) |
| 1030 |
mu = iwork(2) |
| 1031 |
if (ml .lt. 0 .or. ml .ge. n) go to 609 |
| 1032 |
if (mu .lt. 0 .or. mu .ge. n) go to 610 |
| 1033 |
30 continue |
| 1034 |
c next process and check the optional inputs. -------------------------- |
| 1035 |
if (iopt .eq. 1) go to 40 |
| 1036 |
maxord = mord(meth) |
| 1037 |
mxstep = mxstp0 |
| 1038 |
mxhnil = mxhnl0 |
| 1039 |
if (istate .eq. 1) h0 = 0.0d0 |
| 1040 |
hmxi = 0.0d0 |
| 1041 |
hmin = 0.0d0 |
| 1042 |
go to 60 |
| 1043 |
40 maxord = iwork(5) |
| 1044 |
if (maxord .lt. 0) go to 611 |
| 1045 |
if (maxord .eq. 0) maxord = 100 |
| 1046 |
maxord = min0(maxord,mord(meth)) |
| 1047 |
mxstep = iwork(6) |
| 1048 |
if (mxstep .lt. 0) go to 612 |
| 1049 |
if (mxstep .eq. 0) mxstep = mxstp0 |
| 1050 |
mxhnil = iwork(7) |
| 1051 |
if (mxhnil .lt. 0) go to 613 |
| 1052 |
if (mxhnil .eq. 0) mxhnil = mxhnl0 |
| 1053 |
if (istate .ne. 1) go to 50 |
| 1054 |
h0 = rwork(5) |
| 1055 |
if ((tout - t)*h0 .lt. 0.0d0) go to 614 |
| 1056 |
50 hmax = rwork(6) |
| 1057 |
if (hmax .lt. 0.0d0) go to 615 |
| 1058 |
hmxi = 0.0d0 |
| 1059 |
if (hmax .gt. 0.0d0) hmxi = 1.0d0/hmax |
| 1060 |
hmin = rwork(7) |
| 1061 |
if (hmin .lt. 0.0d0) go to 616 |
| 1062 |
c----------------------------------------------------------------------- |
| 1063 |
c set work array pointers and check lengths lrw and liw. |
| 1064 |
c pointers to segments of rwork and iwork are named by prefixing l to |
| 1065 |
c the name of the segment. e.g., the segment yh starts at rwork(lyh). |
| 1066 |
c segments of rwork (in order) are denoted yh, wm, ewt, savf, acor. |
| 1067 |
c----------------------------------------------------------------------- |
| 1068 |
60 lyh = 21 |
| 1069 |
if (istate .eq. 1) nyh = n |
| 1070 |
lwm = lyh + (maxord + 1)*nyh |
| 1071 |
if (miter .eq. 0) lenwm = 0 |
| 1072 |
if (miter .eq. 1 .or. miter .eq. 2) lenwm = n*n + 2 |
| 1073 |
if (miter .eq. 3) lenwm = n + 2 |
| 1074 |
if (miter .ge. 4) lenwm = (2*ml + mu + 1)*n + 2 |
| 1075 |
lewt = lwm + lenwm |
| 1076 |
lsavf = lewt + n |
| 1077 |
lacor = lsavf + n |
| 1078 |
lenrw = lacor + n - 1 |
| 1079 |
iwork(17) = lenrw |
| 1080 |
liwm = 1 |
| 1081 |
leniw = 20 + n |
| 1082 |
if (miter .eq. 0 .or. miter .eq. 3) leniw = 20 |
| 1083 |
iwork(18) = leniw |
| 1084 |
if (lenrw .gt. lrw) go to 617 |
| 1085 |
if (leniw .gt. liw) go to 618 |
| 1086 |
c check rtol and atol for legality. ------------------------------------ |
| 1087 |
rtoli = rtol(1) |
| 1088 |
atoli = atol(1) |
| 1089 |
do 70 i = 1,n |
| 1090 |
if (itol .ge. 3) rtoli = rtol(i) |
| 1091 |
if (itol .eq. 2 .or. itol .eq. 4) atoli = atol(i) |
| 1092 |
if (rtoli .lt. 0.0d0) go to 619 |
| 1093 |
if (atoli .lt. 0.0d0) go to 620 |
| 1094 |
70 continue |
| 1095 |
if (istate .eq. 1) go to 100 |
| 1096 |
c if istate = 3, set flag to signal parameter changes to stode. -------- |
| 1097 |
jstart = -1 |
| 1098 |
if (nq .le. maxord) go to 90 |
| 1099 |
c maxord was reduced below nq. copy yh(*,maxord+2) into savf. --------- |
| 1100 |
do 80 i = 1,n |
| 1101 |
80 rwork(i+lsavf-1) = rwork(i+lwm-1) |
| 1102 |
c reload wm(1) = rwork(lwm), since lwm may have changed. --------------- |
| 1103 |
90 if (miter .gt. 0) rwork(lwm) = dsqrt(uround) |
| 1104 |
if (n .eq. nyh) go to 200 |
| 1105 |
c neq was reduced. zero part of yh to avoid undefined references. ----- |
| 1106 |
i1 = lyh + l*nyh |
| 1107 |
i2 = lyh + (maxord + 1)*nyh - 1 |
| 1108 |
if (i1 .gt. i2) go to 200 |
| 1109 |
do 95 i = i1,i2 |
| 1110 |
95 rwork(i) = 0.0d0 |
| 1111 |
go to 200 |
| 1112 |
c----------------------------------------------------------------------- |
| 1113 |
c block c. |
| 1114 |
c the next block is for the initial call only (istate = 1). |
| 1115 |
c it contains all remaining initializations, the initial call to f, |
| 1116 |
c and the calculation of the initial step size. |
| 1117 |
c the error weights in ewt are inverted after being loaded. |
| 1118 |
c----------------------------------------------------------------------- |
| 1119 |
100 uround = d1mach(4) |
| 1120 |
tn = t |
| 1121 |
if (itask .ne. 4 .and. itask .ne. 5) go to 110 |
| 1122 |
tcrit = rwork(1) |
| 1123 |
if ((tcrit - tout)*(tout - t) .lt. 0.0d0) go to 625 |
| 1124 |
if (h0 .ne. 0.0d0 .and. (t + h0 - tcrit)*h0 .gt. 0.0d0) |
| 1125 |
1 h0 = tcrit - t |
| 1126 |
110 jstart = 0 |
| 1127 |
if (miter .gt. 0) rwork(lwm) = dsqrt(uround) |
| 1128 |
nhnil = 0 |
| 1129 |
nst = 0 |
| 1130 |
nje = 0 |
| 1131 |
nslast = 0 |
| 1132 |
hu = 0.0d0 |
| 1133 |
nqu = 0 |
| 1134 |
ccmax = 0.3d0 |
| 1135 |
maxcor = 3 |
| 1136 |
msbp = 20 |
| 1137 |
mxncf = 10 |
| 1138 |
c initial call to f. (lf0 points to yh(*,2).) ------------------------- |
| 1139 |
lf0 = lyh + nyh |
| 1140 |
call f (neq, t, y, rwork(lf0)) |
| 1141 |
nfe = 1 |
| 1142 |
c load the initial value vector in yh. --------------------------------- |
| 1143 |
do 115 i = 1,n |
| 1144 |
115 rwork(i+lyh-1) = y(i) |
| 1145 |
c load and invert the ewt array. (h is temporarily set to 1.0.) ------- |
| 1146 |
nq = 1 |
| 1147 |
h = 1.0d0 |
| 1148 |
call ewset (n, itol, rtol, atol, rwork(lyh), rwork(lewt)) |
| 1149 |
do 120 i = 1,n |
| 1150 |
if (rwork(i+lewt-1) .le. 0.0d0) go to 621 |
| 1151 |
120 rwork(i+lewt-1) = 1.0d0/rwork(i+lewt-1) |
| 1152 |
c----------------------------------------------------------------------- |
| 1153 |
c the coding below computes the step size, h0, to be attempted on the |
| 1154 |
c first step, unless the user has supplied a value for this. |
| 1155 |
c first check that tout - t differs significantly from zero. |
| 1156 |
c a scalar tolerance quantity tol is computed, as max(rtol(i)) |
| 1157 |
c if this is positive, or max(atol(i)/abs(y(i))) otherwise, adjusted |
| 1158 |
c so as to be between 100*uround and 1.0e-3. |
| 1159 |
c then the computed value h0 is given by.. |
| 1160 |
c neq |
| 1161 |
c h0**2 = tol / ( w0**-2 + (1/neq) * sum ( f(i)/ywt(i) )**2 ) |
| 1162 |
c 1 |
| 1163 |
c where w0 = max ( abs(t), abs(tout) ), |
| 1164 |
c f(i) = i-th component of initial value of f, |
| 1165 |
c ywt(i) = ewt(i)/tol (a weight for y(i)). |
| 1166 |
c the sign of h0 is inferred from the initial values of tout and t. |
| 1167 |
c----------------------------------------------------------------------- |
| 1168 |
if (h0 .ne. 0.0d0) go to 180 |
| 1169 |
tdist = dabs(tout - t) |
| 1170 |
w0 = dmax1(dabs(t),dabs(tout)) |
| 1171 |
if (tdist .lt. 2.0d0*uround*w0) go to 622 |
| 1172 |
tol = rtol(1) |
| 1173 |
if (itol .le. 2) go to 140 |
| 1174 |
do 130 i = 1,n |
| 1175 |
130 tol = dmax1(tol,rtol(i)) |
| 1176 |
140 if (tol .gt. 0.0d0) go to 160 |
| 1177 |
atoli = atol(1) |
| 1178 |
do 150 i = 1,n |
| 1179 |
if (itol .eq. 2 .or. itol .eq. 4) atoli = atol(i) |
| 1180 |
ayi = dabs(y(i)) |
| 1181 |
if (ayi .ne. 0.0d0) tol = dmax1(tol,atoli/ayi) |
| 1182 |
150 continue |
| 1183 |
160 tol = dmax1(tol,100.0d0*uround) |
| 1184 |
tol = dmin1(tol,0.001d0) |
| 1185 |
sum = vnorm (n, rwork(lf0), rwork(lewt)) |
| 1186 |
sum = 1.0d0/(tol*w0*w0) + tol*sum**2 |
| 1187 |
h0 = 1.0d0/dsqrt(sum) |
| 1188 |
h0 = dmin1(h0,tdist) |
| 1189 |
h0 = dsign(h0,tout-t) |
| 1190 |
c adjust h0 if necessary to meet hmax bound. --------------------------- |
| 1191 |
180 rh = dabs(h0)*hmxi |
| 1192 |
if (rh .gt. 1.0d0) h0 = h0/rh |
| 1193 |
c load h with h0 and scale yh(*,2) by h0. ------------------------------ |
| 1194 |
h = h0 |
| 1195 |
do 190 i = 1,n |
| 1196 |
190 rwork(i+lf0-1) = h0*rwork(i+lf0-1) |
| 1197 |
go to 270 |
| 1198 |
c----------------------------------------------------------------------- |
| 1199 |
c block d. |
| 1200 |
c the next code block is for continuation calls only (istate = 2 or 3) |
| 1201 |
c and is to check stop conditions before taking a step. |
| 1202 |
c----------------------------------------------------------------------- |
| 1203 |
200 nslast = nst |
| 1204 |
go to (210, 250, 220, 230, 240), itask |
| 1205 |
210 if ((tn - tout)*h .lt. 0.0d0) go to 250 |
| 1206 |
call intdy (tout, 0, rwork(lyh), nyh, y, iflag) |
| 1207 |
if (iflag .ne. 0) go to 627 |
| 1208 |
t = tout |
| 1209 |
go to 420 |
| 1210 |
220 tp = tn - hu*(1.0d0 + 100.0d0*uround) |
| 1211 |
if ((tp - tout)*h .gt. 0.0d0) go to 623 |
| 1212 |
if ((tn - tout)*h .lt. 0.0d0) go to 250 |
| 1213 |
go to 400 |
| 1214 |
230 tcrit = rwork(1) |
| 1215 |
if ((tn - tcrit)*h .gt. 0.0d0) go to 624 |
| 1216 |
if ((tcrit - tout)*h .lt. 0.0d0) go to 625 |
| 1217 |
if ((tn - tout)*h .lt. 0.0d0) go to 245 |
| 1218 |
call intdy (tout, 0, rwork(lyh), nyh, y, iflag) |
| 1219 |
if (iflag .ne. 0) go to 627 |
| 1220 |
t = tout |
| 1221 |
go to 420 |
| 1222 |
240 tcrit = rwork(1) |
| 1223 |
if ((tn - tcrit)*h .gt. 0.0d0) go to 624 |
| 1224 |
245 hmx = dabs(tn) + dabs(h) |
| 1225 |
ihit = dabs(tn - tcrit) .le. 100.0d0*uround*hmx |
| 1226 |
if (ihit) go to 400 |
| 1227 |
tnext = tn + h*(1.0d0 + 4.0d0*uround) |
| 1228 |
if ((tnext - tcrit)*h .le. 0.0d0) go to 250 |
| 1229 |
h = (tcrit - tn)*(1.0d0 - 4.0d0*uround) |
| 1230 |
if (istate .eq. 2) jstart = -2 |
| 1231 |
c----------------------------------------------------------------------- |
| 1232 |
c block e. |
| 1233 |
c the next block is normally executed for all calls and contains |
| 1234 |
c the call to the one-step core integrator stode. |
| 1235 |
c |
| 1236 |
c this is a looping point for the integration steps. |
| 1237 |
c |
| 1238 |
c first check for too many steps being taken, update ewt (if not at |
| 1239 |
c start of problem), check for too much accuracy being requested, and |
| 1240 |
c check for h below the roundoff level in t. |
| 1241 |
c----------------------------------------------------------------------- |
| 1242 |
250 continue |
| 1243 |
if ((nst-nslast) .ge. mxstep) go to 500 |
| 1244 |
call ewset (n, itol, rtol, atol, rwork(lyh), rwork(lewt)) |
| 1245 |
do 260 i = 1,n |
| 1246 |
if (rwork(i+lewt-1) .le. 0.0d0) go to 510 |
| 1247 |
260 rwork(i+lewt-1) = 1.0d0/rwork(i+lewt-1) |
| 1248 |
270 tolsf = uround*vnorm (n, rwork(lyh), rwork(lewt)) |
| 1249 |
if (tolsf .le. 1.0d0) go to 280 |
| 1250 |
tolsf = tolsf*2.0d0 |
| 1251 |
if (nst .eq. 0) go to 626 |
| 1252 |
go to 520 |
| 1253 |
280 if ((tn + h) .ne. tn) go to 290 |
| 1254 |
nhnil = nhnil + 1 |
| 1255 |
if (nhnil .gt. mxhnil) go to 290 |
| 1256 |
call xascwv(50hlsode-- warning..internal t (=r1) and h (=r2) are, |
| 1257 |
1 50, 101, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1258 |
call xascwv( |
| 1259 |
1 60h such that in the machine, t + h = t on the next step , |
| 1260 |
1 60, 101, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1261 |
call xascwv(50h (h = step size). solver will continue anyway, |
| 1262 |
1 50, 101, 0, 0, 0, 0, 2, tn, h) |
| 1263 |
if (nhnil .lt. mxhnil) go to 290 |
| 1264 |
call xascwv(50hlsode-- above warning has been issued i1 times. , |
| 1265 |
1 50, 102, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1266 |
call xascwv(50h it will not be issued again for this problem, |
| 1267 |
1 50, 102, 0, 1, mxhnil, 0, 0, 0.0d0, 0.0d0) |
| 1268 |
290 continue |
| 1269 |
c----------------------------------------------------------------------- |
| 1270 |
c call stode(neq,y,yh,nyh,yh,ewt,savf,acor,wm,iwm,f,jac,prepj,solsy) |
| 1271 |
c----------------------------------------------------------------------- |
| 1272 |
c boyd |
| 1273 |
call stode (neq, y, rwork(lyh), nyh, rwork(lyh), rwork(lewt), |
| 1274 |
1 rwork(lsavf), rwork(lacor), rwork(lwm), iwork(liwm), |
| 1275 |
2 f, jac, prepj, solsy) |
| 1276 |
kgo = 1 - kflag |
| 1277 |
go to (300, 530, 540), kgo |
| 1278 |
c----------------------------------------------------------------------- |
| 1279 |
c block f. |
| 1280 |
c the following block handles the case of a successful return from the |
| 1281 |
c core integrator (kflag = 0). test for stop conditions. |
| 1282 |
c----------------------------------------------------------------------- |
| 1283 |
300 init = 1 |
| 1284 |
go to (310, 400, 330, 340, 350), itask |
| 1285 |
c itask = 1. if tout has been reached, interpolate. ------------------- |
| 1286 |
310 if ((tn - tout)*h .lt. 0.0d0) go to 250 |
| 1287 |
call intdy (tout, 0, rwork(lyh), nyh, y, iflag) |
| 1288 |
t = tout |
| 1289 |
go to 420 |
| 1290 |
c itask = 3. jump to exit if tout was reached. ------------------------ |
| 1291 |
330 if ((tn - tout)*h .ge. 0.0d0) go to 400 |
| 1292 |
go to 250 |
| 1293 |
c itask = 4. see if tout or tcrit was reached. adjust h if necessary. |
| 1294 |
340 if ((tn - tout)*h .lt. 0.0d0) go to 345 |
| 1295 |
call intdy (tout, 0, rwork(lyh), nyh, y, iflag) |
| 1296 |
t = tout |
| 1297 |
go to 420 |
| 1298 |
345 hmx = dabs(tn) + dabs(h) |
| 1299 |
ihit = dabs(tn - tcrit) .le. 100.0d0*uround*hmx |
| 1300 |
if (ihit) go to 400 |
| 1301 |
tnext = tn + h*(1.0d0 + 4.0d0*uround) |
| 1302 |
if ((tnext - tcrit)*h .le. 0.0d0) go to 250 |
| 1303 |
h = (tcrit - tn)*(1.0d0 - 4.0d0*uround) |
| 1304 |
jstart = -2 |
| 1305 |
go to 250 |
| 1306 |
c itask = 5. see if tcrit was reached and jump to exit. --------------- |
| 1307 |
350 hmx = dabs(tn) + dabs(h) |
| 1308 |
ihit = dabs(tn - tcrit) .le. 100.0d0*uround*hmx |
| 1309 |
c----------------------------------------------------------------------- |
| 1310 |
c block g. |
| 1311 |
c the following block handles all successful returns from lsode. |
| 1312 |
c if itask .ne. 1, y is loaded from yh and t is set accordingly. |
| 1313 |
c istate is set to 2, the illegal input counter is zeroed, and the |
| 1314 |
c optional outputs are loaded into the work arrays before returning. |
| 1315 |
c if istate = 1 and tout = t, there is a return with no action taken, |
| 1316 |
c except that if this has happened repeatedly, the run is terminated. |
| 1317 |
c----------------------------------------------------------------------- |
| 1318 |
400 do 410 i = 1,n |
| 1319 |
410 y(i) = rwork(i+lyh-1) |
| 1320 |
t = tn |
| 1321 |
if (itask .ne. 4 .and. itask .ne. 5) go to 420 |
| 1322 |
if (ihit) t = tcrit |
| 1323 |
420 istate = 2 |
| 1324 |
illin = 0 |
| 1325 |
rwork(11) = hu |
| 1326 |
rwork(12) = h |
| 1327 |
rwork(13) = tn |
| 1328 |
iwork(11) = nst |
| 1329 |
iwork(12) = nfe |
| 1330 |
iwork(13) = nje |
| 1331 |
iwork(14) = nqu |
| 1332 |
iwork(15) = nq |
| 1333 |
return |
| 1334 |
c |
| 1335 |
430 ntrep = ntrep + 1 |
| 1336 |
if (ntrep .lt. 5) return |
| 1337 |
call xascwv( |
| 1338 |
1 60hlsode-- repeated calls with istate = 1 and tout = t (=r1) , |
| 1339 |
1 60, 301, 0, 0, 0, 0, 1, t, 0.0d0) |
| 1340 |
go to 800 |
| 1341 |
c----------------------------------------------------------------------- |
| 1342 |
c block h. |
| 1343 |
c the following block handles all unsuccessful returns other than |
| 1344 |
c those for illegal input. first the error message routine is called. |
| 1345 |
c if there was an error test or convergence test failure, imxer is set. |
| 1346 |
c then y is loaded from yh, t is set to tn, and the illegal input |
| 1347 |
c counter illin is set to 0. the optional outputs are loaded into |
| 1348 |
c the work arrays before returning. |
| 1349 |
c----------------------------------------------------------------------- |
| 1350 |
c the maximum number of steps was taken before reaching tout. ---------- |
| 1351 |
500 call xascwv(50hlsode-- at current t (=r1), mxstep (=i1) steps , |
| 1352 |
1 50, 201, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1353 |
call xascwv(50h taken on this call before reaching tout , |
| 1354 |
1 50, 201, 0, 1, mxstep, 0, 1, tn, 0.0d0) |
| 1355 |
istate = -1 |
| 1356 |
go to 580 |
| 1357 |
c ewt(i) .le. 0.0 for some i (not at start of problem). ---------------- |
| 1358 |
510 ewti = rwork(lewt+i-1) |
| 1359 |
call xascwv(50hlsode-- at t (=r1), ewt(i1) has become r2 .le. 0., |
| 1360 |
1 50, 202, 0, 1, i, 0, 2, tn, ewti) |
| 1361 |
istate = -6 |
| 1362 |
go to 580 |
| 1363 |
c too much accuracy requested for machine precision. ------------------- |
| 1364 |
520 call xascwv(50hlsode-- at t (=r1), too much accuracy requested , |
| 1365 |
1 50, 203, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1366 |
call xascwv(50h for precision of machine.. see tolsf (=r2) , |
| 1367 |
1 50, 203, 0, 0, 0, 0, 2, tn, tolsf) |
| 1368 |
rwork(14) = tolsf |
| 1369 |
istate = -2 |
| 1370 |
go to 580 |
| 1371 |
c kflag = -1. error test failed repeatedly or with abs(h) = hmin. ----- |
| 1372 |
530 call xascwv(50hlsode-- at t(=r1) and step size h(=r2), the error, |
| 1373 |
1 50, 204, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1374 |
call xascwv(50h test failed repeatedly or with abs(h) = hmin, |
| 1375 |
1 50, 204, 0, 0, 0, 0, 2, tn, h) |
| 1376 |
istate = -4 |
| 1377 |
go to 560 |
| 1378 |
c kflag = -2. convergence failed repeatedly or with abs(h) = hmin. ---- |
| 1379 |
540 call xascwv(50hlsode-- at t (=r1) and step size h (=r2), the , |
| 1380 |
1 50, 205, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1381 |
call xascwv(50h corrector convergence failed repeatedly , |
| 1382 |
1 50, 205, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1383 |
call xascwv(30h or with abs(h) = hmin , |
| 1384 |
1 30, 205, 0, 0, 0, 0, 2, tn, h) |
| 1385 |
istate = -5 |
| 1386 |
c compute imxer if relevant. ------------------------------------------- |
| 1387 |
560 big = 0.0d0 |
| 1388 |
imxer = 1 |
| 1389 |
do 570 i = 1,n |
| 1390 |
size = dabs(rwork(i+lacor-1)*rwork(i+lewt-1)) |
| 1391 |
if (big .ge. size) go to 570 |
| 1392 |
big = size |
| 1393 |
imxer = i |
| 1394 |
570 continue |
| 1395 |
iwork(16) = imxer |
| 1396 |
c set y vector, t, illin, and optional outputs. ------------------------ |
| 1397 |
580 do 590 i = 1,n |
| 1398 |
590 y(i) = rwork(i+lyh-1) |
| 1399 |
t = tn |
| 1400 |
illin = 0 |
| 1401 |
rwork(11) = hu |
| 1402 |
rwork(12) = h |
| 1403 |
rwork(13) = tn |
| 1404 |
iwork(11) = nst |
| 1405 |
iwork(12) = nfe |
| 1406 |
iwork(13) = nje |
| 1407 |
iwork(14) = nqu |
| 1408 |
iwork(15) = nq |
| 1409 |
return |
| 1410 |
c----------------------------------------------------------------------- |
| 1411 |
c block i. |
| 1412 |
c the following block handles all error returns due to illegal input |
| 1413 |
c (istate = -3), as detected before calling the core integrator. |
| 1414 |
c first the error message routine is called. then if there have been |
| 1415 |
c 5 consecutive such returns just before this call to the solver, |
| 1416 |
c the run is halted. |
| 1417 |
c----------------------------------------------------------------------- |
| 1418 |
601 call xascwv(30hlsode-- istate (=i1) illegal , |
| 1419 |
1 30, 1, 0, 1, istate, 0, 0, 0.0d0, 0.0d0) |
| 1420 |
go to 700 |
| 1421 |
602 call xascwv(30hlsode-- itask (=i1) illegal , |
| 1422 |
1 30, 2, 0, 1, itask, 0, 0, 0.0d0, 0.0d0) |
| 1423 |
go to 700 |
| 1424 |
603 call xascwv(50hlsode-- istate .gt. 1 but lsode not initialized , |
| 1425 |
1 50, 3, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1426 |
go to 700 |
| 1427 |
604 call xascwv(30hlsode-- neq (=i1) .lt. 1 , |
| 1428 |
1 30, 4, 0, 1, neq(1), 0, 0, 0.0d0, 0.0d0) |
| 1429 |
go to 700 |
| 1430 |
605 call xascwv(50hlsode-- istate = 3 and neq increased (i1 to i2) , |
| 1431 |
1 50, 5, 0, 2, n, neq(1), 0, 0.0d0, 0.0d0) |
| 1432 |
go to 700 |
| 1433 |
606 call xascwv(30hlsode-- itol (=i1) illegal , |
| 1434 |
1 30, 6, 0, 1, itol, 0, 0, 0.0d0, 0.0d0) |
| 1435 |
go to 700 |
| 1436 |
607 call xascwv(30hlsode-- iopt (=i1) illegal , |
| 1437 |
1 30, 7, 0, 1, iopt, 0, 0, 0.0d0, 0.0d0) |
| 1438 |
go to 700 |
| 1439 |
608 call xascwv(30hlsode-- mf (=i1) illegal , |
| 1440 |
1 30, 8, 0, 1, mf, 0, 0, 0.0d0, 0.0d0) |
| 1441 |
go to 700 |
| 1442 |
609 call xascwv(50hlsode-- ml (=i1) illegal.. .lt.0 or .ge.neq (=i2), |
| 1443 |
1 50, 9, 0, 2, ml, neq(1), 0, 0.0d0, 0.0d0) |
| 1444 |
go to 700 |
| 1445 |
610 call xascwv(50hlsode-- mu (=i1) illegal.. .lt.0 or .ge.neq (=i2), |
| 1446 |
1 50, 10, 0, 2, mu, neq(1), 0, 0.0d0, 0.0d0) |
| 1447 |
go to 700 |
| 1448 |
611 call xascwv(30hlsode-- maxord (=i1) .lt. 0 , |
| 1449 |
1 30, 11, 0, 1, maxord, 0, 0, 0.0d0, 0.0d0) |
| 1450 |
go to 700 |
| 1451 |
612 call xascwv(30hlsode-- mxstep (=i1) .lt. 0 , |
| 1452 |
1 30, 12, 0, 1, mxstep, 0, 0, 0.0d0, 0.0d0) |
| 1453 |
go to 700 |
| 1454 |
613 call xascwv(30hlsode-- mxhnil (=i1) .lt. 0 , |
| 1455 |
1 30, 13, 0, 1, mxhnil, 0, 0, 0.0d0, 0.0d0) |
| 1456 |
go to 700 |
| 1457 |
614 call xascwv(40hlsode-- tout (=r1) behind t (=r2) , |
| 1458 |
1 40, 14, 0, 0, 0, 0, 2, tout, t) |
| 1459 |
call xascwv(50h integration direction is given by h0 (=r1) , |
| 1460 |
1 50, 14, 0, 0, 0, 0, 1, h0, 0.0d0) |
| 1461 |
go to 700 |
| 1462 |
615 call xascwv(30hlsode-- hmax (=r1) .lt. 0.0 , |
| 1463 |
1 30, 15, 0, 0, 0, 0, 1, hmax, 0.0d0) |
| 1464 |
go to 700 |
| 1465 |
616 call xascwv(30hlsode-- hmin (=r1) .lt. 0.0 , |
| 1466 |
1 30, 16, 0, 0, 0, 0, 1, hmin, 0.0d0) |
| 1467 |
go to 700 |
| 1468 |
617 call xascwv( |
| 1469 |
1 60hlsode-- rwork length needed, lenrw (=i1), exceeds lrw (=i2), |
| 1470 |
1 60, 17, 0, 2, lenrw, lrw, 0, 0.0d0, 0.0d0) |
| 1471 |
go to 700 |
| 1472 |
618 call xascwv( |
| 1473 |
1 60hlsode-- iwork length needed, leniw (=i1), exceeds liw (=i2), |
| 1474 |
1 60, 18, 0, 2, leniw, liw, 0, 0.0d0, 0.0d0) |
| 1475 |
go to 700 |
| 1476 |
619 call xascwv(40hlsode-- rtol(i1) is r1 .lt. 0.0 , |
| 1477 |
1 40, 19, 0, 1, i, 0, 1, rtoli, 0.0d0) |
| 1478 |
go to 700 |
| 1479 |
620 call xascwv(40hlsode-- atol(i1) is r1 .lt. 0.0 , |
| 1480 |
1 40, 20, 0, 1, i, 0, 1, atoli, 0.0d0) |
| 1481 |
go to 700 |
| 1482 |
621 ewti = rwork(lewt+i-1) |
| 1483 |
call xascwv(40hlsode-- ewt(i1) is r1 .le. 0.0 , |
| 1484 |
1 40, 21, 0, 1, i, 0, 1, ewti, 0.0d0) |
| 1485 |
go to 700 |
| 1486 |
622 call xascwv( |
| 1487 |
1 60hlsode-- tout (=r1) too close to t(=r2) to start integration, |
| 1488 |
1 60, 22, 0, 0, 0, 0, 2, tout, t) |
| 1489 |
go to 700 |
| 1490 |
623 call xascwv( |
| 1491 |
1 60hlsode-- itask = i1 and tout (=r1) behind tcur - hu (= r2) , |
| 1492 |
1 60, 23, 0, 1, itask, 0, 2, tout, tp) |
| 1493 |
go to 700 |
| 1494 |
624 call xascwv( |
| 1495 |
1 60hlsode-- itask = 4 or 5 and tcrit (=r1) behind tcur (=r2) , |
| 1496 |
1 60, 24, 0, 0, 0, 0, 2, tcrit, tn) |
| 1497 |
go to 700 |
| 1498 |
625 call xascwv( |
| 1499 |
1 60hlsode-- itask = 4 or 5 and tcrit (=r1) behind tout (=r2) , |
| 1500 |
1 60, 25, 0, 0, 0, 0, 2, tcrit, tout) |
| 1501 |
go to 700 |
| 1502 |
626 call xascwv(50hlsode-- at start of problem, too much accuracy , |
| 1503 |
1 50, 26, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1504 |
call xascwv( |
| 1505 |
1 60h requested for precision of machine.. see tolsf (=r1) , |
| 1506 |
1 60, 26, 0, 0, 0, 0, 1, tolsf, 0.0d0) |
| 1507 |
rwork(14) = tolsf |
| 1508 |
go to 700 |
| 1509 |
627 call xascwv(50hlsode-- trouble from intdy. itask = i1, tout = r1, |
| 1510 |
1 50, 27, 0, 1, itask, 0, 1, tout, 0.0d0) |
| 1511 |
c |
| 1512 |
700 if (illin .eq. 5) go to 710 |
| 1513 |
illin = illin + 1 |
| 1514 |
istate = -3 |
| 1515 |
return |
| 1516 |
710 call xascwv(50hlsode-- repeated occurrences of illegal input , |
| 1517 |
1 50, 302, 0, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1518 |
c |
| 1519 |
800 call xascwv(50hlsode-- run aborted.. apparent infinite loop , |
| 1520 |
1 50, 303, 2, 0, 0, 0, 0, 0.0d0, 0.0d0) |
| 1521 |
return |
| 1522 |
c----------------------- end of subroutine lsode ----------------------- |
| 1523 |
end |
| 1524 |
subroutine solsy (wm, iwm, x, tem) |
| 1525 |
clll. optimize |
| 1526 |
integer iwm |
| 1527 |
integer iownd, iowns, |
| 1528 |
1 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1529 |
2 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1530 |
integer i, meband, ml, mu |
| 1531 |
double precision wm, x, tem |
| 1532 |
double precision rowns, |
| 1533 |
1 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround |
| 1534 |
double precision di, hl0, phl0, r |
| 1535 |
dimension wm(1), iwm(1), x(1), tem(1) |
| 1536 |
common /ls0001/ rowns(209), |
| 1537 |
2 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround, |
| 1538 |
3 iownd(14), iowns(6), |
| 1539 |
4 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1540 |
5 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1541 |
c----------------------------------------------------------------------- |
| 1542 |
c this routine manages the solution of the linear system arising from |
| 1543 |
c a chord iteration. it is called if miter .ne. 0. |
| 1544 |
c if miter is 1 or 2, it calls dgesl to accomplish this. |
| 1545 |
c if miter = 3 it updates the coefficient h*el0 in the diagonal |
| 1546 |
c matrix, and then computes the solution. |
| 1547 |
c if miter is 4 or 5, it calls dgbsl. |
| 1548 |
c communication with solsy uses the following variables.. |
| 1549 |
c wm = real work space containing the inverse diagonal matrix if |
| 1550 |
c miter = 3 and the lu decomposition of the matrix otherwise. |
| 1551 |
c storage of matrix elements starts at wm(3). |
| 1552 |
c wm also contains the following matrix-related data.. |
| 1553 |
c wm(1) = sqrt(uround) (not used here), |
| 1554 |
c wm(2) = hl0, the previous value of h*el0, used if miter = 3. |
| 1555 |
c iwm = integer work space containing pivot information, starting at |
| 1556 |
c iwm(21), if miter is 1, 2, 4, or 5. iwm also contains band |
| 1557 |
c parameters ml = iwm(1) and mu = iwm(2) if miter is 4 or 5. |
| 1558 |
c x = the right-hand side vector on input, and the solution vector |
| 1559 |
c on output, of length n. |
| 1560 |
c tem = vector of work space of length n, not used in this version. |
| 1561 |
c iersl = output flag (in common). iersl = 0 if no trouble occurred. |
| 1562 |
c iersl = 1 if a singular matrix arose with miter = 3. |
| 1563 |
c this routine also uses the common variables el0, h, miter, and n. |
| 1564 |
c----------------------------------------------------------------------- |
| 1565 |
iersl = 0 |
| 1566 |
go to (100, 100, 300, 400, 400), miter |
| 1567 |
100 call dgesl (wm(3), n, n, iwm(21), x, 0) |
| 1568 |
return |
| 1569 |
c |
| 1570 |
300 phl0 = wm(2) |
| 1571 |
hl0 = h*el0 |
| 1572 |
wm(2) = hl0 |
| 1573 |
if (hl0 .eq. phl0) go to 330 |
| 1574 |
r = hl0/phl0 |
| 1575 |
do 320 i = 1,n |
| 1576 |
di = 1.0d0 - r*(1.0d0 - 1.0d0/wm(i+2)) |
| 1577 |
if (dabs(di) .eq. 0.0d0) go to 390 |
| 1578 |
320 wm(i+2) = 1.0d0/di |
| 1579 |
330 do 340 i = 1,n |
| 1580 |
340 x(i) = wm(i+2)*x(i) |
| 1581 |
return |
| 1582 |
390 iersl = 1 |
| 1583 |
return |
| 1584 |
c |
| 1585 |
400 ml = iwm(1) |
| 1586 |
mu = iwm(2) |
| 1587 |
meband = 2*ml + mu + 1 |
| 1588 |
call dgbsl (wm(3), meband, n, ml, mu, iwm(21), x, 0) |
| 1589 |
return |
| 1590 |
c----------------------- end of subroutine solsy ----------------------- |
| 1591 |
end |
| 1592 |
subroutine prepj (neq, y, yh, nyh, ewt, ftem, savf, wm, iwm, |
| 1593 |
1 f, jac) |
| 1594 |
clll. optimize |
| 1595 |
cascend changes |
| 1596 |
external f, jac |
| 1597 |
integer neq, nyh, iwm |
| 1598 |
integer iownd, iowns, |
| 1599 |
1 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1600 |
2 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1601 |
integer i, i1, i2, ier, ii, j, j1, jj, lenp, |
| 1602 |
1 mba, mband, meb1, meband, ml, ml3, mu, np1 |
| 1603 |
double precision y, yh, ewt, ftem, savf, wm |
| 1604 |
double precision rowns, |
| 1605 |
1 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround |
| 1606 |
double precision con, di, fac, hl0, r, r0, srur, yi, yj, yjj, |
| 1607 |
1 vnorm |
| 1608 |
Ckaa double precision time1, time2 |
| 1609 |
dimension neq(1), y(1), yh(nyh,1), ewt(1), ftem(1), savf(1), |
| 1610 |
1 wm(1), iwm(1) |
| 1611 |
common /ls0001/ rowns(209), |
| 1612 |
2 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround, |
| 1613 |
3 iownd(14), iowns(6), |
| 1614 |
4 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1615 |
5 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1616 |
c----------------------------------------------------------------------- |
| 1617 |
c prepj is called by stode to compute and process the matrix |
| 1618 |
c p = i - h*el(1)*j , where j is an approximation to the jacobian. |
| 1619 |
c here j is computed by the user-supplied routine jac if |
| 1620 |
c miter = 1 or 4, or by finite differencing if miter = 2, 3, or 5. |
| 1621 |
c if miter = 3, a diagonal approximation to j is used. |
| 1622 |
c j is stored in wm and replaced by p. if miter .ne. 3, p is then |
| 1623 |
c subjected to lu decomposition in preparation for later solution |
| 1624 |
c of linear systems with p as coefficient matrix. this is done |
| 1625 |
c by dgefa if miter = 1 or 2, and by dgbfa if miter = 4 or 5. |
| 1626 |
c |
| 1627 |
c in addition to variables described previously, communication |
| 1628 |
c with prepj uses the following.. |
| 1629 |
c y = array containing predicted values on entry. |
| 1630 |
c ftem = work array of length n (acor in stode). |
| 1631 |
c savf = array containing f evaluated at predicted y. |
| 1632 |
c wm = real work space for matrices. on output it contains the |
| 1633 |
c inverse diagonal matrix if miter = 3 and the lu decomposition |
| 1634 |
c of p if miter is 1, 2 , 4, or 5. |
| 1635 |
c storage of matrix elements starts at wm(3). |
| 1636 |
c wm also contains the following matrix-related data.. |
| 1637 |
c wm(1) = sqrt(uround), used in numerical jacobian increments. |
| 1638 |
c wm(2) = h*el0, saved for later use if miter = 3. |
| 1639 |
c iwm = integer work space containing pivot information, starting at |
| 1640 |
c iwm(21), if miter is 1, 2, 4, or 5. iwm also contains band |
| 1641 |
c parameters ml = iwm(1) and mu = iwm(2) if miter is 4 or 5. |
| 1642 |
c el0 = el(1) (input). |
| 1643 |
c ierpj = output error flag, = 0 if no trouble, .gt. 0 if |
| 1644 |
c p matrix found to be singular. |
| 1645 |
c jcur = output flag = 1 to indicate that the jacobian matrix |
| 1646 |
c (or approximation) is now current. |
| 1647 |
c this routine also uses the common variables el0, h, tn, uround, |
| 1648 |
c miter, n, nfe, and nje. |
| 1649 |
c----------------------------------------------------------------------- |
| 1650 |
nje = nje + 1 |
| 1651 |
ierpj = 0 |
| 1652 |
jcur = 1 |
| 1653 |
hl0 = h*el0 |
| 1654 |
go to (100, 200, 300, 400, 500), miter |
| 1655 |
c if miter = 1, call jac and multiply by scalar. ----------------------- |
| 1656 |
100 lenp = n*n |
| 1657 |
do 110 i = 1,lenp |
| 1658 |
110 wm(i+2) = 0.0d0 |
| 1659 |
call jac (neq, tn, y, 0, 0, wm(3), n) |
| 1660 |
con = -hl0 |
| 1661 |
do 120 i = 1,lenp |
| 1662 |
120 wm(i+2) = wm(i+2)*con |
| 1663 |
go to 240 |
| 1664 |
c if miter = 2, make n calls to f to approximate j. -------------------- |
| 1665 |
200 fac = vnorm (n, savf, ewt) |
| 1666 |
r0 = 1000.0d0*dabs(h)*uround*dfloat(n)*fac |
| 1667 |
if (r0 .eq. 0.0d0) r0 = 1.0d0 |
| 1668 |
srur = wm(1) |
| 1669 |
j1 = 2 |
| 1670 |
do 230 j = 1,n |
| 1671 |
yj = y(j) |
| 1672 |
r = dmax1(srur*dabs(yj),r0/ewt(j)) |
| 1673 |
y(j) = y(j) + r |
| 1674 |
fac = -hl0/r |
| 1675 |
call f (neq, tn, y, ftem) |
| 1676 |
do 220 i = 1,n |
| 1677 |
220 wm(i+j1) = (ftem(i) - savf(i))*fac |
| 1678 |
y(j) = yj |
| 1679 |
j1 = j1 + n |
| 1680 |
230 continue |
| 1681 |
nfe = nfe + n |
| 1682 |
c add identity matrix. ------------------------------------------------- |
| 1683 |
240 j = 3 |
| 1684 |
np1 = n + 1 |
| 1685 |
do 250 i = 1,n |
| 1686 |
wm(j) = wm(j) + 1.0d0 |
| 1687 |
250 j = j + np1 |
| 1688 |
c do lu decomposition on p. -------------------------------------------- |
| 1689 |
Ckaa call aftime(time1) |
| 1690 |
call dgefa (wm(3), n, n, iwm(21), ier) |
| 1691 |
Ckaa call aftime(time2) |
| 1692 |
Ckaa time2 = time2 - time1 |
| 1693 |
Ckaa write (6,*) "Time for decomposition" |
| 1694 |
Ckaa write (6,700) time2 |
| 1695 |
if (ier .ne. 0) ierpj = 1 |
| 1696 |
return |
| 1697 |
c if miter = 3, construct a diagonal approximation to j and p. --------- |
| 1698 |
300 wm(2) = hl0 |
| 1699 |
r = el0*0.1d0 |
| 1700 |
do 310 i = 1,n |
| 1701 |
310 y(i) = y(i) + r*(h*savf(i) - yh(i,2)) |
| 1702 |
call f (neq, tn, y, wm(3)) |
| 1703 |
nfe = nfe + 1 |
| 1704 |
do 320 i = 1,n |
| 1705 |
r0 = h*savf(i) - yh(i,2) |
| 1706 |
di = 0.1d0*r0 - h*(wm(i+2) - savf(i)) |
| 1707 |
wm(i+2) = 1.0d0 |
| 1708 |
if (dabs(r0) .lt. uround/ewt(i)) go to 320 |
| 1709 |
if (dabs(di) .eq. 0.0d0) go to 330 |
| 1710 |
wm(i+2) = 0.1d0*r0/di |
| 1711 |
320 continue |
| 1712 |
return |
| 1713 |
330 ierpj = 1 |
| 1714 |
return |
| 1715 |
c if miter = 4, call jac and multiply by scalar. ----------------------- |
| 1716 |
400 ml = iwm(1) |
| 1717 |
mu = iwm(2) |
| 1718 |
ml3 = ml + 3 |
| 1719 |
mband = ml + mu + 1 |
| 1720 |
meband = mband + ml |
| 1721 |
lenp = meband*n |
| 1722 |
do 410 i = 1,lenp |
| 1723 |
410 wm(i+2) = 0.0d0 |
| 1724 |
call jac (neq, tn, y, ml, mu, wm(ml3), meband) |
| 1725 |
con = -hl0 |
| 1726 |
do 420 i = 1,lenp |
| 1727 |
420 wm(i+2) = wm(i+2)*con |
| 1728 |
go to 570 |
| 1729 |
c if miter = 5, make mband calls to f to approximate j. ---------------- |
| 1730 |
500 ml = iwm(1) |
| 1731 |
mu = iwm(2) |
| 1732 |
mband = ml + mu + 1 |
| 1733 |
mba = min0(mband,n) |
| 1734 |
meband = mband + ml |
| 1735 |
meb1 = meband - 1 |
| 1736 |
srur = wm(1) |
| 1737 |
fac = vnorm (n, savf, ewt) |
| 1738 |
r0 = 1000.0d0*dabs(h)*uround*dfloat(n)*fac |
| 1739 |
if (r0 .eq. 0.0d0) r0 = 1.0d0 |
| 1740 |
do 560 j = 1,mba |
| 1741 |
do 530 i = j,n,mband |
| 1742 |
yi = y(i) |
| 1743 |
r = dmax1(srur*dabs(yi),r0/ewt(i)) |
| 1744 |
530 y(i) = y(i) + r |
| 1745 |
call f (neq, tn, y, ftem) |
| 1746 |
do 550 jj = j,n,mband |
| 1747 |
y(jj) = yh(jj,1) |
| 1748 |
yjj = y(jj) |
| 1749 |
r = dmax1(srur*dabs(yjj),r0/ewt(jj)) |
| 1750 |
fac = -hl0/r |
| 1751 |
i1 = max0(jj-mu,1) |
| 1752 |
i2 = min0(jj+ml,n) |
| 1753 |
ii = jj*meb1 - ml + 2 |
| 1754 |
do 540 i = i1,i2 |
| 1755 |
540 wm(ii+i) = (ftem(i) - savf(i))*fac |
| 1756 |
550 continue |
| 1757 |
560 continue |
| 1758 |
nfe = nfe + mba |
| 1759 |
c add identity matrix. ------------------------------------------------- |
| 1760 |
570 ii = mband + 2 |
| 1761 |
do 580 i = 1,n |
| 1762 |
wm(ii) = wm(ii) + 1.0d0 |
| 1763 |
580 ii = ii + meband |
| 1764 |
c do lu decomposition of p. -------------------------------------------- |
| 1765 |
call dgbfa (wm(3), meband, n, ml, mu, iwm(21), ier) |
| 1766 |
if (ier .ne. 0) ierpj = 1 |
| 1767 |
return |
| 1768 |
700 format(d21.13) |
| 1769 |
c----------------------- end of subroutine prepj ----------------------- |
| 1770 |
end |
| 1771 |
subroutine stode (neq, y, yh, nyh, yh1, ewt, savf, acor, |
| 1772 |
1 wm, iwm, f, jac, pjac, slvs) |
| 1773 |
clll. optimize |
| 1774 |
external f, jac, pjac, slvs |
| 1775 |
integer neq, nyh, iwm |
| 1776 |
integer iownd, ialth, ipup, lmax, meo, nqnyh, nslp, |
| 1777 |
1 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1778 |
2 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1779 |
integer i, i1, iredo, iret, j, jb, m, ncf, newq |
| 1780 |
double precision y, yh, yh1, ewt, savf, acor, wm |
| 1781 |
double precision conit, crate, el, elco, hold, rmax, tesco, |
| 1782 |
2 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround |
| 1783 |
double precision dcon, ddn, del, delp, dsm, dup, exdn, exsm, exup, |
| 1784 |
1 r, rh, rhdn, rhsm, rhup, told, vnorm |
| 1785 |
dimension neq(1), y(1), yh(nyh,1), yh1(1), ewt(1), savf(1), |
| 1786 |
1 acor(1), wm(1), iwm(1) |
| 1787 |
common /ls0001/ conit, crate, el(13), elco(13,12), |
| 1788 |
1 hold, rmax, tesco(3,12), |
| 1789 |
2 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround, iownd(14), |
| 1790 |
3 ialth, ipup, lmax, meo, nqnyh, nslp, |
| 1791 |
4 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 1792 |
5 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 1793 |
c----------------------------------------------------------------------- |
| 1794 |
c stode performs one step of the integration of an initial value |
| 1795 |
c problem for a system of ordinary differential equations. |
| 1796 |
c note.. stode is independent of the value of the iteration method |
| 1797 |
c indicator miter, when this is .ne. 0, and hence is independent |
| 1798 |
c of the type of chord method used, or the jacobian structure. |
| 1799 |
c communication with stode is done with the following variables.. |
| 1800 |
c |
| 1801 |
c neq = integer array containing problem size in neq(1), and |
| 1802 |
c passed as the neq argument in all calls to f and jac. |
| 1803 |
c y = an array of length .ge. n used as the y argument in |
| 1804 |
c all calls to f and jac. |
| 1805 |
c yh = an nyh by lmax array containing the dependent variables |
| 1806 |
c and their approximate scaled derivatives, where |
| 1807 |
c lmax = maxord + 1. yh(i,j+1) contains the approximate |
| 1808 |
c j-th derivative of y(i), scaled by h**j/factorial(j) |
| 1809 |
c (j = 0,1,...,nq). on entry for the first step, the first |
| 1810 |
c two columns of yh must be set from the initial values. |
| 1811 |
c nyh = a constant integer .ge. n, the first dimension of yh. |
| 1812 |
c yh1 = a one-dimensional array occupying the same space as yh. |
| 1813 |
c ewt = an array of length n containing multiplicative weights |
| 1814 |
c for local error measurements. local errors in y(i) are |
| 1815 |
c compared to 1.0/ewt(i) in various error tests. |
| 1816 |
c savf = an array of working storage, of length n. |
| 1817 |
c also used for input of yh(*,maxord+2) when jstart = -1 |
| 1818 |
c and maxord .lt. the current order nq. |
| 1819 |
c acor = a work array of length n, used for the accumulated |
| 1820 |
c corrections. on a successful return, acor(i) contains |
| 1821 |
c the estimated one-step local error in y(i). |
| 1822 |
c wm,iwm = real and integer work arrays associated with matrix |
| 1823 |
c operations in chord iteration (miter .ne. 0). |
| 1824 |
c pjac = name of routine to evaluate and preprocess jacobian matrix |
| 1825 |
c and p = i - h*el0*jac, if a chord method is being used. |
| 1826 |
c slvs = name of routine to solve linear system in chord iteration. |
| 1827 |
c ccmax = maximum relative change in h*el0 before pjac is called. |
| 1828 |
c h = the step size to be attempted on the next step. |
| 1829 |
c h is altered by the error control algorithm during the |
| 1830 |
c problem. h can be either positive or negative, but its |
| 1831 |
c sign must remain constant throughout the problem. |
| 1832 |
c hmin = the minimum absolute value of the step size h to be used. |
| 1833 |
c hmxi = inverse of the maximum absolute value of h to be used. |
| 1834 |
c hmxi = 0.0 is allowed and corresponds to an infinite hmax. |
| 1835 |
c hmin and hmxi may be changed at any time, but will not |
| 1836 |
c take effect until the next change of h is considered. |
| 1837 |
c tn = the independent variable. tn is updated on each step taken. |
| 1838 |
c jstart = an integer used for input only, with the following |
| 1839 |
c values and meanings.. |
| 1840 |
c 0 perform the first step. |
| 1841 |
c .gt.0 take a new step continuing from the last. |
| 1842 |
c -1 take the next step with a new value of h, maxord, |
| 1843 |
c n, meth, miter, and/or matrix parameters. |
| 1844 |
c -2 take the next step with a new value of h, |
| 1845 |
c but with other inputs unchanged. |
| 1846 |
c on return, jstart is set to 1 to facilitate continuation. |
| 1847 |
c kflag = a completion code with the following meanings.. |
| 1848 |
c 0 the step was succesful. |
| 1849 |
c -1 the requested error could not be achieved. |
| 1850 |
c -2 corrector convergence could not be achieved. |
| 1851 |
c -3 fatal error in pjac or slvs. |
| 1852 |
c a return with kflag = -1 or -2 means either |
| 1853 |
c abs(h) = hmin or 10 consecutive failures occurred. |
| 1854 |
c on a return with kflag negative, the values of tn and |
| 1855 |
c the yh array are as of the beginning of the last |
| 1856 |
c step, and h is the last step size attempted. |
| 1857 |
c maxord = the maximum order of integration method to be allowed. |
| 1858 |
c maxcor = the maximum number of corrector iterations allowed. |
| 1859 |
c msbp = maximum number of steps between pjac calls (miter .gt. 0). |
| 1860 |
c mxncf = maximum number of convergence failures allowed. |
| 1861 |
c meth/miter = the method flags. see description in driver. |
| 1862 |
c n = the number of first-order differential equations. |
| 1863 |
c----------------------------------------------------------------------- |
| 1864 |
kflag = 0 |
| 1865 |
told = tn |
| 1866 |
ncf = 0 |
| 1867 |
ierpj = 0 |
| 1868 |
iersl = 0 |
| 1869 |
jcur = 0 |
| 1870 |
icf = 0 |
| 1871 |
delp = 0.0d0 |
| 1872 |
if (jstart .gt. 0) go to 200 |
| 1873 |
if (jstart .eq. -1) go to 100 |
| 1874 |
if (jstart .eq. -2) go to 160 |
| 1875 |
c----------------------------------------------------------------------- |
| 1876 |
c on the first call, the order is set to 1, and other variables are |
| 1877 |
c initialized. rmax is the maximum ratio by which h can be increased |
| 1878 |
c in a single step. it is initially 1.e4 to compensate for the small |
| 1879 |
c initial h, but then is normally equal to 10. if a failure |
| 1880 |
c occurs (in corrector convergence or error test), rmax is set at 2 |
| 1881 |
c for the next increase. |
| 1882 |
c----------------------------------------------------------------------- |
| 1883 |
lmax = maxord + 1 |
| 1884 |
nq = 1 |
| 1885 |
l = 2 |
| 1886 |
ialth = 2 |
| 1887 |
rmax = 10000.0d0 |
| 1888 |
rc = 0.0d0 |
| 1889 |
el0 = 1.0d0 |
| 1890 |
crate = 0.7d0 |
| 1891 |
hold = h |
| 1892 |
meo = meth |
| 1893 |
nslp = 0 |
| 1894 |
ipup = miter |
| 1895 |
iret = 3 |
| 1896 |
go to 140 |
| 1897 |
c----------------------------------------------------------------------- |
| 1898 |
c the following block handles preliminaries needed when jstart = -1. |
| 1899 |
c ipup is set to miter to force a matrix update. |
| 1900 |
c if an order increase is about to be considered (ialth = 1), |
| 1901 |
c ialth is reset to 2 to postpone consideration one more step. |
| 1902 |
c if the caller has changed meth, cfode is called to reset |
| 1903 |
c the coefficients of the method. |
| 1904 |
c if the caller has changed maxord to a value less than the current |
| 1905 |
c order nq, nq is reduced to maxord, and a new h chosen accordingly. |
| 1906 |
c if h is to be changed, yh must be rescaled. |
| 1907 |
c if h or meth is being changed, ialth is reset to l = nq + 1 |
| 1908 |
c to prevent further changes in h for that many steps. |
| 1909 |
c----------------------------------------------------------------------- |
| 1910 |
100 ipup = miter |
| 1911 |
lmax = maxord + 1 |
| 1912 |
if (ialth .eq. 1) ialth = 2 |
| 1913 |
if (meth .eq. meo) go to 110 |
| 1914 |
call cfode (meth, elco, tesco) |
| 1915 |
meo = meth |
| 1916 |
if (nq .gt. maxord) go to 120 |
| 1917 |
ialth = l |
| 1918 |
iret = 1 |
| 1919 |
go to 150 |
| 1920 |
110 if (nq .le. maxord) go to 160 |
| 1921 |
120 nq = maxord |
| 1922 |
l = lmax |
| 1923 |
do 125 i = 1,l |
| 1924 |
125 el(i) = elco(i,nq) |
| 1925 |
nqnyh = nq*nyh |
| 1926 |
rc = rc*el(1)/el0 |
| 1927 |
el0 = el(1) |
| 1928 |
conit = 0.5d0/dfloat(nq+2) |
| 1929 |
ddn = vnorm (n, savf, ewt)/tesco(1,l) |
| 1930 |
exdn = 1.0d0/dfloat(l) |
| 1931 |
rhdn = 1.0d0/(1.3d0*ddn**exdn + 0.0000013d0) |
| 1932 |
rh = dmin1(rhdn,1.0d0) |
| 1933 |
iredo = 3 |
| 1934 |
if (h .eq. hold) go to 170 |
| 1935 |
rh = dmin1(rh,dabs(h/hold)) |
| 1936 |
h = hold |
| 1937 |
go to 175 |
| 1938 |
c----------------------------------------------------------------------- |
| 1939 |
c cfode is called to get all the integration coefficients for the |
| 1940 |
c current meth. then the el vector and related constants are reset |
| 1941 |
c whenever the order nq is changed, or at the start of the problem. |
| 1942 |
c----------------------------------------------------------------------- |
| 1943 |
140 call cfode (meth, elco, tesco) |
| 1944 |
150 do 155 i = 1,l |
| 1945 |
155 el(i) = elco(i,nq) |
| 1946 |
nqnyh = nq*nyh |
| 1947 |
rc = rc*el(1)/el0 |
| 1948 |
el0 = el(1) |
| 1949 |
conit = 0.5d0/dfloat(nq+2) |
| 1950 |
go to (160, 170, 200), iret |
| 1951 |
c----------------------------------------------------------------------- |
| 1952 |
c if h is being changed, the h ratio rh is checked against |
| 1953 |
c rmax, hmin, and hmxi, and the yh array rescaled. ialth is set to |
| 1954 |
c l = nq + 1 to prevent a change of h for that many steps, unless |
| 1955 |
c forced by a convergence or error test failure. |
| 1956 |
c----------------------------------------------------------------------- |
| 1957 |
160 if (h .eq. hold) go to 200 |
| 1958 |
rh = h/hold |
| 1959 |
h = hold |
| 1960 |
iredo = 3 |
| 1961 |
go to 175 |
| 1962 |
170 rh = dmax1(rh,hmin/dabs(h)) |
| 1963 |
175 rh = dmin1(rh,rmax) |
| 1964 |
rh = rh/dmax1(1.0d0,dabs(h)*hmxi*rh) |
| 1965 |
r = 1.0d0 |
| 1966 |
do 180 j = 2,l |
| 1967 |
r = r*rh |
| 1968 |
do 180 i = 1,n |
| 1969 |
180 yh(i,j) = yh(i,j)*r |
| 1970 |
h = h*rh |
| 1971 |
rc = rc*rh |
| 1972 |
ialth = l |
| 1973 |
if (iredo .eq. 0) go to 690 |
| 1974 |
c----------------------------------------------------------------------- |
| 1975 |
c this section computes the predicted values by effectively |
| 1976 |
c multiplying the yh array by the pascal triangle matrix. |
| 1977 |
c rc is the ratio of new to old values of the coefficient h*el(1). |
| 1978 |
c when rc differs from 1 by more than ccmax, ipup is set to miter |
| 1979 |
c to force pjac to be called, if a jacobian is involved. |
| 1980 |
c in any case, pjac is called at least every msbp steps. |
| 1981 |
c----------------------------------------------------------------------- |
| 1982 |
200 if (dabs(rc-1.0d0) .gt. ccmax) ipup = miter |
| 1983 |
if (nst .ge. nslp+msbp) ipup = miter |
| 1984 |
tn = tn + h |
| 1985 |
i1 = nqnyh + 1 |
| 1986 |
do 215 jb = 1,nq |
| 1987 |
i1 = i1 - nyh |
| 1988 |
cdir$ ivdep |
| 1989 |
do 210 i = i1,nqnyh |
| 1990 |
210 yh1(i) = yh1(i) + yh1(i+nyh) |
| 1991 |
215 continue |
| 1992 |
c----------------------------------------------------------------------- |
| 1993 |
c up to maxcor corrector iterations are taken. a convergence test is |
| 1994 |
c made on the r.m.s. norm of each correction, weighted by the error |
| 1995 |
c weight vector ewt. the sum of the corrections is accumulated in the |
| 1996 |
c vector acor(i). the yh array is not altered in the corrector loop. |
| 1997 |
c----------------------------------------------------------------------- |
| 1998 |
220 m = 0 |
| 1999 |
do 230 i = 1,n |
| 2000 |
230 y(i) = yh(i,1) |
| 2001 |
call f (neq, tn, y, savf) |
| 2002 |
nfe = nfe + 1 |
| 2003 |
if (ipup .le. 0) go to 250 |
| 2004 |
c----------------------------------------------------------------------- |
| 2005 |
c if indicated, the matrix p = i - h*el(1)*j is reevaluated and |
| 2006 |
c preprocessed before starting the corrector iteration. ipup is set |
| 2007 |
c to 0 as an indicator that this has been done. |
| 2008 |
c----------------------------------------------------------------------- |
| 2009 |
call pjac (neq, y, yh, nyh, ewt, acor, savf, wm, iwm, f, jac) |
| 2010 |
ipup = 0 |
| 2011 |
rc = 1.0d0 |
| 2012 |
nslp = nst |
| 2013 |
crate = 0.7d0 |
| 2014 |
if (ierpj .ne. 0) go to 430 |
| 2015 |
250 do 260 i = 1,n |
| 2016 |
260 acor(i) = 0.0d0 |
| 2017 |
270 if (miter .ne. 0) go to 350 |
| 2018 |
c----------------------------------------------------------------------- |
| 2019 |
c in the case of functional iteration, update y directly from |
| 2020 |
c the result of the last function evaluation. |
| 2021 |
c----------------------------------------------------------------------- |
| 2022 |
do 290 i = 1,n |
| 2023 |
savf(i) = h*savf(i) - yh(i,2) |
| 2024 |
290 y(i) = savf(i) - acor(i) |
| 2025 |
del = vnorm (n, y, ewt) |
| 2026 |
do 300 i = 1,n |
| 2027 |
y(i) = yh(i,1) + el(1)*savf(i) |
| 2028 |
300 acor(i) = savf(i) |
| 2029 |
go to 400 |
| 2030 |
c----------------------------------------------------------------------- |
| 2031 |
c in the case of the chord method, compute the corrector error, |
| 2032 |
c and solve the linear system with that as right-hand side and |
| 2033 |
c p as coefficient matrix. |
| 2034 |
c----------------------------------------------------------------------- |
| 2035 |
350 do 360 i = 1,n |
| 2036 |
360 y(i) = h*savf(i) - (yh(i,2) + acor(i)) |
| 2037 |
call slvs (wm, iwm, y, savf) |
| 2038 |
if (iersl .lt. 0) go to 430 |
| 2039 |
if (iersl .gt. 0) go to 410 |
| 2040 |
del = vnorm (n, y, ewt) |
| 2041 |
do 380 i = 1,n |
| 2042 |
acor(i) = acor(i) + y(i) |
| 2043 |
380 y(i) = yh(i,1) + el(1)*acor(i) |
| 2044 |
c----------------------------------------------------------------------- |
| 2045 |
c test for convergence. if m.gt.0, an estimate of the convergence |
| 2046 |
c rate constant is stored in crate, and this is used in the test. |
| 2047 |
c----------------------------------------------------------------------- |
| 2048 |
400 if (m .ne. 0) crate = dmax1(0.2d0*crate,del/delp) |
| 2049 |
dcon = del*dmin1(1.0d0,1.5d0*crate)/(tesco(2,nq)*conit) |
| 2050 |
if (dcon .le. 1.0d0) go to 450 |
| 2051 |
m = m + 1 |
| 2052 |
if (m .eq. maxcor) go to 410 |
| 2053 |
if (m .ge. 2 .and. del .gt. 2.0d0*delp) go to 410 |
| 2054 |
delp = del |
| 2055 |
call f (neq, tn, y, savf) |
| 2056 |
nfe = nfe + 1 |
| 2057 |
go to 270 |
| 2058 |
c----------------------------------------------------------------------- |
| 2059 |
c the corrector iteration failed to converge. |
| 2060 |
c if miter .ne. 0 and the jacobian is out of date, pjac is called for |
| 2061 |
c the next try. otherwise the yh array is retracted to its values |
| 2062 |
c before prediction, and h is reduced, if possible. if h cannot be |
| 2063 |
c reduced or mxncf failures have occurred, exit with kflag = -2. |
| 2064 |
c----------------------------------------------------------------------- |
| 2065 |
410 if (miter .eq. 0 .or. jcur .eq. 1) go to 430 |
| 2066 |
icf = 1 |
| 2067 |
ipup = miter |
| 2068 |
go to 220 |
| 2069 |
430 icf = 2 |
| 2070 |
ncf = ncf + 1 |
| 2071 |
rmax = 2.0d0 |
| 2072 |
tn = told |
| 2073 |
i1 = nqnyh + 1 |
| 2074 |
do 445 jb = 1,nq |
| 2075 |
i1 = i1 - nyh |
| 2076 |
cdir$ ivdep |
| 2077 |
do 440 i = i1,nqnyh |
| 2078 |
440 yh1(i) = yh1(i) - yh1(i+nyh) |
| 2079 |
445 continue |
| 2080 |
if (ierpj .lt. 0 .or. iersl .lt. 0) go to 680 |
| 2081 |
if (dabs(h) .le. hmin*1.00001d0) go to 670 |
| 2082 |
if (ncf .eq. mxncf) go to 670 |
| 2083 |
rh = 0.25d0 |
| 2084 |
ipup = miter |
| 2085 |
iredo = 1 |
| 2086 |
go to 170 |
| 2087 |
c----------------------------------------------------------------------- |
| 2088 |
c the corrector has converged. jcur is set to 0 |
| 2089 |
c to signal that the jacobian involved may need updating later. |
| 2090 |
c the local error test is made and control passes to statement 500 |
| 2091 |
c if it fails. |
| 2092 |
c----------------------------------------------------------------------- |
| 2093 |
450 jcur = 0 |
| 2094 |
if (m .eq. 0) dsm = del/tesco(2,nq) |
| 2095 |
if (m .gt. 0) dsm = vnorm (n, acor, ewt)/tesco(2,nq) |
| 2096 |
if (dsm .gt. 1.0d0) go to 500 |
| 2097 |
c----------------------------------------------------------------------- |
| 2098 |
c after a successful step, update the yh array. |
| 2099 |
c consider changing h if ialth = 1. otherwise decrease ialth by 1. |
| 2100 |
c if ialth is then 1 and nq .lt. maxord, then acor is saved for |
| 2101 |
c use in a possible order increase on the next step. |
| 2102 |
c if a change in h is considered, an increase or decrease in order |
| 2103 |
c by one is considered also. a change in h is made only if it is by a |
| 2104 |
c factor of at least 1.1. if not, ialth is set to 3 to prevent |
| 2105 |
c testing for that many steps. |
| 2106 |
c----------------------------------------------------------------------- |
| 2107 |
kflag = 0 |
| 2108 |
iredo = 0 |
| 2109 |
nst = nst + 1 |
| 2110 |
hu = h |
| 2111 |
nqu = nq |
| 2112 |
do 470 j = 1,l |
| 2113 |
do 470 i = 1,n |
| 2114 |
470 yh(i,j) = yh(i,j) + el(j)*acor(i) |
| 2115 |
ialth = ialth - 1 |
| 2116 |
if (ialth .eq. 0) go to 520 |
| 2117 |
if (ialth .gt. 1) go to 700 |
| 2118 |
if (l .eq. lmax) go to 700 |
| 2119 |
do 490 i = 1,n |
| 2120 |
490 yh(i,lmax) = acor(i) |
| 2121 |
go to 700 |
| 2122 |
c----------------------------------------------------------------------- |
| 2123 |
c the error test failed. kflag keeps track of multiple failures. |
| 2124 |
c restore tn and the yh array to their previous values, and prepare |
| 2125 |
c to try the step again. compute the optimum step size for this or |
| 2126 |
c one lower order. after 2 or more failures, h is forced to decrease |
| 2127 |
c by a factor of 0.2 or less. |
| 2128 |
c----------------------------------------------------------------------- |
| 2129 |
500 kflag = kflag - 1 |
| 2130 |
tn = told |
| 2131 |
i1 = nqnyh + 1 |
| 2132 |
do 515 jb = 1,nq |
| 2133 |
i1 = i1 - nyh |
| 2134 |
cdir$ ivdep |
| 2135 |
do 510 i = i1,nqnyh |
| 2136 |
510 yh1(i) = yh1(i) - yh1(i+nyh) |
| 2137 |
515 continue |
| 2138 |
rmax = 2.0d0 |
| 2139 |
if (dabs(h) .le. hmin*1.00001d0) go to 660 |
| 2140 |
if (kflag .le. -3) go to 640 |
| 2141 |
iredo = 2 |
| 2142 |
rhup = 0.0d0 |
| 2143 |
go to 540 |
| 2144 |
c----------------------------------------------------------------------- |
| 2145 |
c regardless of the success or failure of the step, factors |
| 2146 |
c rhdn, rhsm, and rhup are computed, by which h could be multiplied |
| 2147 |
c at order nq - 1, order nq, or order nq + 1, respectively. |
| 2148 |
c in the case of failure, rhup = 0.0 to avoid an order increase. |
| 2149 |
c the largest of these is determined and the new order chosen |
| 2150 |
c accordingly. if the order is to be increased, we compute one |
| 2151 |
c additional scaled derivative. |
| 2152 |
c----------------------------------------------------------------------- |
| 2153 |
520 rhup = 0.0d0 |
| 2154 |
if (l .eq. lmax) go to 540 |
| 2155 |
do 530 i = 1,n |
| 2156 |
530 savf(i) = acor(i) - yh(i,lmax) |
| 2157 |
dup = vnorm (n, savf, ewt)/tesco(3,nq) |
| 2158 |
exup = 1.0d0/dfloat(l+1) |
| 2159 |
rhup = 1.0d0/(1.4d0*dup**exup + 0.0000014d0) |
| 2160 |
540 exsm = 1.0d0/dfloat(l) |
| 2161 |
rhsm = 1.0d0/(1.2d0*dsm**exsm + 0.0000012d0) |
| 2162 |
rhdn = 0.0d0 |
| 2163 |
if (nq .eq. 1) go to 560 |
| 2164 |
ddn = vnorm (n, yh(1,l), ewt)/tesco(1,nq) |
| 2165 |
exdn = 1.0d0/dfloat(nq) |
| 2166 |
rhdn = 1.0d0/(1.3d0*ddn**exdn + 0.0000013d0) |
| 2167 |
560 if (rhsm .ge. rhup) go to 570 |
| 2168 |
if (rhup .gt. rhdn) go to 590 |
| 2169 |
go to 580 |
| 2170 |
570 if (rhsm .lt. rhdn) go to 580 |
| 2171 |
newq = nq |
| 2172 |
rh = rhsm |
| 2173 |
go to 620 |
| 2174 |
580 newq = nq - 1 |
| 2175 |
rh = rhdn |
| 2176 |
if (kflag .lt. 0 .and. rh .gt. 1.0d0) rh = 1.0d0 |
| 2177 |
go to 620 |
| 2178 |
590 newq = l |
| 2179 |
rh = rhup |
| 2180 |
if (rh .lt. 1.1d0) go to 610 |
| 2181 |
r = el(l)/dfloat(l) |
| 2182 |
do 600 i = 1,n |
| 2183 |
600 yh(i,newq+1) = acor(i)*r |
| 2184 |
go to 630 |
| 2185 |
610 ialth = 3 |
| 2186 |
go to 700 |
| 2187 |
620 if ((kflag .eq. 0) .and. (rh .lt. 1.1d0)) go to 610 |
| 2188 |
if (kflag .le. -2) rh = dmin1(rh,0.2d0) |
| 2189 |
c----------------------------------------------------------------------- |
| 2190 |
c if there is a change of order, reset nq, l, and the coefficients. |
| 2191 |
c in any case h is reset according to rh and the yh array is rescaled. |
| 2192 |
c then exit from 690 if the step was ok, or redo the step otherwise. |
| 2193 |
c----------------------------------------------------------------------- |
| 2194 |
if (newq .eq. nq) go to 170 |
| 2195 |
630 nq = newq |
| 2196 |
l = nq + 1 |
| 2197 |
iret = 2 |
| 2198 |
go to 150 |
| 2199 |
c----------------------------------------------------------------------- |
| 2200 |
c control reaches this section if 3 or more failures have occured. |
| 2201 |
c if 10 failures have occurred, exit with kflag = -1. |
| 2202 |
c it is assumed that the derivatives that have accumulated in the |
| 2203 |
c yh array have errors of the wrong order. hence the first |
| 2204 |
c derivative is recomputed, and the order is set to 1. then |
| 2205 |
c h is reduced by a factor of 10, and the step is retried, |
| 2206 |
c until it succeeds or h reaches hmin. |
| 2207 |
c----------------------------------------------------------------------- |
| 2208 |
640 if (kflag .eq. -10) go to 660 |
| 2209 |
rh = 0.1d0 |
| 2210 |
rh = dmax1(hmin/dabs(h),rh) |
| 2211 |
h = h*rh |
| 2212 |
do 645 i = 1,n |
| 2213 |
645 y(i) = yh(i,1) |
| 2214 |
call f (neq, tn, y, savf) |
| 2215 |
nfe = nfe + 1 |
| 2216 |
do 650 i = 1,n |
| 2217 |
650 yh(i,2) = h*savf(i) |
| 2218 |
ipup = miter |
| 2219 |
ialth = 5 |
| 2220 |
if (nq .eq. 1) go to 200 |
| 2221 |
nq = 1 |
| 2222 |
l = 2 |
| 2223 |
iret = 3 |
| 2224 |
go to 150 |
| 2225 |
c----------------------------------------------------------------------- |
| 2226 |
c all returns are made through this section. h is saved in hold |
| 2227 |
c to allow the caller to change h on the next step. |
| 2228 |
c----------------------------------------------------------------------- |
| 2229 |
660 kflag = -1 |
| 2230 |
go to 720 |
| 2231 |
670 kflag = -2 |
| 2232 |
go to 720 |
| 2233 |
680 kflag = -3 |
| 2234 |
go to 720 |
| 2235 |
690 rmax = 10.0d0 |
| 2236 |
700 r = 1.0d0/tesco(2,nqu) |
| 2237 |
do 710 i = 1,n |
| 2238 |
710 acor(i) = acor(i)*r |
| 2239 |
720 hold = h |
| 2240 |
jstart = 1 |
| 2241 |
return |
| 2242 |
c----------------------- end of subroutine stode ----------------------- |
| 2243 |
end |
| 2244 |
double precision function vnorm (n, v, w) |
| 2245 |
clll. optimize |
| 2246 |
c----------------------------------------------------------------------- |
| 2247 |
c this function routine computes the weighted root-mean-square norm |
| 2248 |
c of the vector of length n contained in the array v, with weights |
| 2249 |
c contained in the array w of length n.. |
| 2250 |
c vnorm = sqrt( (1/n) * sum( v(i)*w(i) )**2 ) |
| 2251 |
c----------------------------------------------------------------------- |
| 2252 |
integer n, i |
| 2253 |
double precision v, w, sum |
| 2254 |
dimension v(n), w(n) |
| 2255 |
sum = 0.0d0 |
| 2256 |
do 10 i = 1,n |
| 2257 |
10 sum = sum + (v(i)*w(i))**2 |
| 2258 |
vnorm = dsqrt(sum/dfloat(n)) |
| 2259 |
return |
| 2260 |
c----------------------- end of function vnorm ------------------------- |
| 2261 |
end |
| 2262 |
subroutine cfode (meth, elco, tesco) |
| 2263 |
clll. optimize |
| 2264 |
integer meth |
| 2265 |
integer i, ib, nq, nqm1, nqp1 |
| 2266 |
double precision elco, tesco |
| 2267 |
double precision agamq, fnq, fnqm1, pc, pint, ragq, |
| 2268 |
1 rqfac, rq1fac, tsign, xpin |
| 2269 |
dimension elco(13,12), tesco(3,12) |
| 2270 |
c----------------------------------------------------------------------- |
| 2271 |
c cfode is called by the integrator routine to set coefficients |
| 2272 |
c needed there. the coefficients for the current method, as |
| 2273 |
c given by the value of meth, are set for all orders and saved. |
| 2274 |
c the maximum order assumed here is 12 if meth = 1 and 5 if meth = 2. |
| 2275 |
c (a smaller value of the maximum order is also allowed.) |
| 2276 |
c cfode is called once at the beginning of the problem, |
| 2277 |
c and is not called again unless and until meth is changed. |
| 2278 |
c |
| 2279 |
c the elco array contains the basic method coefficients. |
| 2280 |
c the coefficients el(i), 1 .le. i .le. nq+1, for the method of |
| 2281 |
c order nq are stored in elco(i,nq). they are given by a genetrating |
| 2282 |
c polynomial, i.e., |
| 2283 |
c l(x) = el(1) + el(2)*x + ... + el(nq+1)*x**nq. |
| 2284 |
c for the implicit adams methods, l(x) is given by |
| 2285 |
c dl/dx = (x+1)*(x+2)*...*(x+nq-1)/factorial(nq-1), l(-1) = 0. |
| 2286 |
c for the bdf methods, l(x) is given by |
| 2287 |
c l(x) = (x+1)*(x+2)* ... *(x+nq)/k, |
| 2288 |
c where k = factorial(nq)*(1 + 1/2 + ... + 1/nq). |
| 2289 |
c |
| 2290 |
c the tesco array contains test constants used for the |
| 2291 |
c local error test and the selection of step size and/or order. |
| 2292 |
c at order nq, tesco(k,nq) is used for the selection of step |
| 2293 |
c size at order nq - 1 if k = 1, at order nq if k = 2, and at order |
| 2294 |
c nq + 1 if k = 3. |
| 2295 |
c----------------------------------------------------------------------- |
| 2296 |
dimension pc(12) |
| 2297 |
c |
| 2298 |
go to (100, 200), meth |
| 2299 |
c |
| 2300 |
100 elco(1,1) = 1.0d0 |
| 2301 |
elco(2,1) = 1.0d0 |
| 2302 |
tesco(1,1) = 0.0d0 |
| 2303 |
tesco(2,1) = 2.0d0 |
| 2304 |
tesco(1,2) = 1.0d0 |
| 2305 |
tesco(3,12) = 0.0d0 |
| 2306 |
pc(1) = 1.0d0 |
| 2307 |
rqfac = 1.0d0 |
| 2308 |
do 140 nq = 2,12 |
| 2309 |
c----------------------------------------------------------------------- |
| 2310 |
c the pc array will contain the coefficients of the polynomial |
| 2311 |
c p(x) = (x+1)*(x+2)*...*(x+nq-1). |
| 2312 |
c initially, p(x) = 1. |
| 2313 |
c----------------------------------------------------------------------- |
| 2314 |
rq1fac = rqfac |
| 2315 |
rqfac = rqfac/dfloat(nq) |
| 2316 |
nqm1 = nq - 1 |
| 2317 |
fnqm1 = dfloat(nqm1) |
| 2318 |
nqp1 = nq + 1 |
| 2319 |
c form coefficients of p(x)*(x+nq-1). ---------------------------------- |
| 2320 |
pc(nq) = 0.0d0 |
| 2321 |
do 110 ib = 1,nqm1 |
| 2322 |
i = nqp1 - ib |
| 2323 |
110 pc(i) = pc(i-1) + fnqm1*pc(i) |
| 2324 |
pc(1) = fnqm1*pc(1) |
| 2325 |
c compute integral, -1 to 0, of p(x) and x*p(x). ----------------------- |
| 2326 |
pint = pc(1) |
| 2327 |
xpin = pc(1)/2.0d0 |
| 2328 |
tsign = 1.0d0 |
| 2329 |
do 120 i = 2,nq |
| 2330 |
tsign = -tsign |
| 2331 |
pint = pint + tsign*pc(i)/dfloat(i) |
| 2332 |
120 xpin = xpin + tsign*pc(i)/dfloat(i+1) |
| 2333 |
c store coefficients in elco and tesco. -------------------------------- |
| 2334 |
elco(1,nq) = pint*rq1fac |
| 2335 |
elco(2,nq) = 1.0d0 |
| 2336 |
do 130 i = 2,nq |
| 2337 |
130 elco(i+1,nq) = rq1fac*pc(i)/dfloat(i) |
| 2338 |
agamq = rqfac*xpin |
| 2339 |
ragq = 1.0d0/agamq |
| 2340 |
tesco(2,nq) = ragq |
| 2341 |
if (nq .lt. 12) tesco(1,nqp1) = ragq*rqfac/dfloat(nqp1) |
| 2342 |
tesco(3,nqm1) = ragq |
| 2343 |
140 continue |
| 2344 |
return |
| 2345 |
c |
| 2346 |
200 pc(1) = 1.0d0 |
| 2347 |
rq1fac = 1.0d0 |
| 2348 |
do 230 nq = 1,5 |
| 2349 |
c----------------------------------------------------------------------- |
| 2350 |
c the pc array will contain the coefficients of the polynomial |
| 2351 |
c p(x) = (x+1)*(x+2)*...*(x+nq). |
| 2352 |
c initially, p(x) = 1. |
| 2353 |
c----------------------------------------------------------------------- |
| 2354 |
fnq = dfloat(nq) |
| 2355 |
nqp1 = nq + 1 |
| 2356 |
c form coefficients of p(x)*(x+nq). ------------------------------------ |
| 2357 |
pc(nqp1) = 0.0d0 |
| 2358 |
do 210 ib = 1,nq |
| 2359 |
i = nq + 2 - ib |
| 2360 |
210 pc(i) = pc(i-1) + fnq*pc(i) |
| 2361 |
pc(1) = fnq*pc(1) |
| 2362 |
c store coefficients in elco and tesco. -------------------------------- |
| 2363 |
do 220 i = 1,nqp1 |
| 2364 |
220 elco(i,nq) = pc(i)/pc(2) |
| 2365 |
elco(2,nq) = 1.0d0 |
| 2366 |
tesco(1,nq) = rq1fac |
| 2367 |
tesco(2,nq) = dfloat(nqp1)/elco(1,nq) |
| 2368 |
tesco(3,nq) = dfloat(nq+2)/elco(1,nq) |
| 2369 |
rq1fac = rq1fac/fnq |
| 2370 |
230 continue |
| 2371 |
return |
| 2372 |
c----------------------- end of subroutine cfode ----------------------- |
| 2373 |
end |
| 2374 |
subroutine intdy (t, k, yh, nyh, dky, iflag) |
| 2375 |
clll. optimize |
| 2376 |
integer k, nyh, iflag |
| 2377 |
integer iownd, iowns, |
| 2378 |
1 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 2379 |
2 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 2380 |
integer i, ic, j, jb, jb2, jj, jj1, jp1 |
| 2381 |
double precision t, yh, dky |
| 2382 |
double precision rowns, |
| 2383 |
1 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround |
| 2384 |
double precision c, r, s, tp |
| 2385 |
dimension yh(nyh,1), dky(1) |
| 2386 |
common /ls0001/ rowns(209), |
| 2387 |
2 ccmax, el0, h, hmin, hmxi, hu, rc, tn, uround, |
| 2388 |
3 iownd(14), iowns(6), |
| 2389 |
4 icf, ierpj, iersl, jcur, jstart, kflag, l, meth, miter, |
| 2390 |
5 maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu |
| 2391 |
c----------------------------------------------------------------------- |
| 2392 |
c intdy computes interpolated values of the k-th derivative of the |
| 2393 |
c dependent variable vector y, and stores it in dky. this routine |
| 2394 |
c is called within the package with k = 0 and t = tout, but may |
| 2395 |
c also be called by the user for any k up to the current order. |
| 2396 |
c (see detailed instructions in the usage documentation.) |
| 2397 |
c----------------------------------------------------------------------- |
| 2398 |
c the computed values in dky are gotten by interpolation using the |
| 2399 |
c nordsieck history array yh. this array corresponds uniquely to a |
| 2400 |
c vector-valued polynomial of degree nqcur or less, and dky is set |
| 2401 |
c to the k-th derivative of this polynomial at t. |
| 2402 |
c the formula for dky is.. |
| 2403 |
c q |
| 2404 |
c dky(i) = sum c(j,k) * (t - tn)**(j-k) * h**(-j) * yh(i,j+1) |
| 2405 |
c j=k |
| 2406 |
c where c(j,k) = j*(j-1)*...*(j-k+1), q = nqcur, tn = tcur, h = hcur. |
| 2407 |
c the quantities nq = nqcur, l = nq+1, n = neq, tn, and h are |
| 2408 |
c communicated by common. the above sum is done in reverse order. |
| 2409 |
c iflag is returned negative if either k or t is out of bounds. |
| 2410 |
c----------------------------------------------------------------------- |
| 2411 |
iflag = 0 |
| 2412 |
if (k .lt. 0 .or. k .gt. nq) go to 80 |
| 2413 |
tp = tn - hu - 100.0d0*uround*(tn + hu) |
| 2414 |
if ((t-tp)*(t-tn) .gt. 0.0d0) go to 90 |
| 2415 |
c |
| 2416 |
s = (t - tn)/h |
| 2417 |
ic = 1 |
| 2418 |
if (k .eq. 0) go to 15 |
| 2419 |
jj1 = l - k |
| 2420 |
do 10 jj = jj1,nq |
| 2421 |
10 ic = ic*jj |
| 2422 |
15 c = dfloat(ic) |
| 2423 |
do 20 i = 1,n |
| 2424 |
20 dky(i) = c*yh(i,l) |
| 2425 |
if (k .eq. nq) go to 55 |
| 2426 |
jb2 = nq - k |
| 2427 |
do 50 jb = 1,jb2 |
| 2428 |
j = nq - jb |
| 2429 |
jp1 = j + 1 |
| 2430 |
ic = 1 |
| 2431 |
if (k .eq. 0) go to 35 |
| 2432 |
jj1 = jp1 - k |
| 2433 |
do 30 jj = jj1,j |
| 2434 |
30 ic = ic*jj |
| 2435 |
35 c = dfloat(ic) |
| 2436 |
do 40 i = 1,n |
| 2437 |
40 dky(i) = c*yh(i,jp1) + s*dky(i) |
| 2438 |
50 continue |
| 2439 |
if (k .eq. 0) return |
| 2440 |
55 r = h**(-k) |
| 2441 |
do 60 i = 1,n |
| 2442 |
60 dky(i) = r*dky(i) |
| 2443 |
return |
| 2444 |
c |
| 2445 |
80 call xascwv(30hintdy-- k (=i1) illegal , |
| 2446 |
1 30, 51, 0, 1, k, 0, 0, 0.0d0, 0.0d0) |
| 2447 |
iflag = -1 |
| 2448 |
return |
| 2449 |
90 call xascwv(30hintdy-- t (=r1) illegal , |
| 2450 |
1 30, 52, 0, 0, 0, 0, 1, t, 0.0d0) |
| 2451 |
call xascwv( |
| 2452 |
1 60h t not in interval tcur - hu (= r1) to tcur (=r2) , |
| 2453 |
1 60, 52, 0, 0, 0, 0, 2, tp, tn) |
| 2454 |
iflag = -2 |
| 2455 |
return |
| 2456 |
c----------------------- end of subroutine intdy ----------------------- |
| 2457 |
end |
| 2458 |
C This routine not in use and commented out. |
| 2459 |
C subroutine XERRWV (msg, nmes, nerr, level, ni, i1, i2, nr, r1, r2) |
| 2460 |
C integer msg, nmes, nerr, level, ni, i1, i2, nr, |
| 2461 |
C 1 i, lun, lunit, mesflg, ncpw, nch, nwds |
| 2462 |
C double precision r1, r2 |
| 2463 |
C dimension msg(nmes) |
| 2464 |
Cc----------------------------------------------------------------------- |
| 2465 |
Cc subroutines XERRWV, xsetf, and xsetun, as given here, constitute |
| 2466 |
Cc a simplified version of the slatec error handling package. |
| 2467 |
Cc written by a. c. hindmarsh at llnl. version of march 30, 1987. |
| 2468 |
Cc this version is in double precision. |
| 2469 |
Cc |
| 2470 |
Cc all arguments are input arguments. |
| 2471 |
Cc |
| 2472 |
Cc msg = the message (hollerith literal or integer array). |
| 2473 |
Cc nmes = the length of msg (number of characters). |
| 2474 |
Cc nerr = the error number (not used). |
| 2475 |
Cc level = the error level.. |
| 2476 |
Cc 0 or 1 means recoverable (control returns to caller). |
| 2477 |
Cc 2 means fatal (run is aborted--see note below). |
| 2478 |
Cc ni = number of integers (0, 1, or 2) to be printed with message. |
| 2479 |
Cc i1,i2 = integers to be printed, depending on ni. |
| 2480 |
Cc nr = number of reals (0, 1, or 2) to be printed with message. |
| 2481 |
Cc r1,r2 = reals to be printed, depending on nr. |
| 2482 |
Cc |
| 2483 |
Cc note.. this routine is machine-dependent and specialized for use |
| 2484 |
Cc in limited context, in the following ways.. |
| 2485 |
Cc 1. the number of hollerith characters stored per word, denoted |
| 2486 |
Cc by ncpw below, is a data-loaded constant. |
| 2487 |
Cc 2. the value of nmes is assumed to be at most 60. |
| 2488 |
Cc (multi-line messages are generated by repeated calls.) |
| 2489 |
Cc 3. if level = 2, control passes to the statement stop |
| 2490 |
Cc to abort the run. this statement may be machine-dependent. |
| 2491 |
Cc 4. r1 and r2 are assumed to be in double precision and are printed |
| 2492 |
Cc in d21.13 format. |
| 2493 |
Cc 5. the common block /eh0001/ below is data-loaded (a machine- |
| 2494 |
Cc dependent feature) with default values. |
| 2495 |
Cc this block is needed for proper retention of parameters used by |
| 2496 |
Cc this routine which the user can reset by calling xsetf or xsetun. |
| 2497 |
Cc the variables in this block are as follows.. |
| 2498 |
Cc mesflg = print control flag.. |
| 2499 |
Cc 1 means print all messages (the default). |
| 2500 |
Cc 0 means no printing. |
| 2501 |
Cc lunit = logical unit number for messages. |
| 2502 |
Cc the default is 6 (machine-dependent). |
| 2503 |
Cc----------------------------------------------------------------------- |
| 2504 |
Cc the following are instructions for installing this routine |
| 2505 |
Cc in different machine environments. |
| 2506 |
Cc |
| 2507 |
Cc to change the default output unit, change the data statement |
| 2508 |
Cc in the block data subprogram below. |
| 2509 |
Cc |
| 2510 |
Cc for a different number of characters per word, change the |
| 2511 |
Cc data statement setting ncpw below, and format 10. alternatives for |
| 2512 |
Cc various computers are shown in comment cards. |
| 2513 |
Cc |
| 2514 |
Cc for a different run-abort command, change the statement following |
| 2515 |
Cc statement 100 at the end. |
| 2516 |
Cc----------------------------------------------------------------------- |
| 2517 |
C common /eh0001/ mesflg, lunit |
| 2518 |
Cc----------------------------------------------------------------------- |
| 2519 |
Cc the following data-loaded value of ncpw is valid for the cdc-6600 |
| 2520 |
Cc and cdc-7600 computers. |
| 2521 |
Cc data ncpw/10/ |
| 2522 |
Cc the following is valid for the cray-1 computer. |
| 2523 |
Cc data ncpw/8/ |
| 2524 |
Cc the following is valid for the burroughs 6700 and 7800 computers. |
| 2525 |
Cc data ncpw/6/ |
| 2526 |
Cc the following is valid for the pdp-10 computer. |
| 2527 |
Cc data ncpw/5/ |
| 2528 |
Cc the following is valid for the vax computer with 4 bytes per integer, |
| 2529 |
Cc and for the ibm-360, ibm-370, ibm-303x, and ibm-43xx computers. |
| 2530 |
C data ncpw/4/ |
| 2531 |
Cc the following is valid for the pdp-11, or vax with 2-byte integers. |
| 2532 |
Cc data ncpw/2/ |
| 2533 |
Cc----------------------------------------------------------------------- |
| 2534 |
C if (mesflg .eq. 0) go to 100 |
| 2535 |
Cc get logical unit number. --------------------------------------------- |
| 2536 |
C lun = lunit |
| 2537 |
Cc get number of words in message. -------------------------------------- |
| 2538 |
C nch = min0(nmes,60) |
| 2539 |
C nwds = nch/ncpw |
| 2540 |
C if (nch .ne. nwds*ncpw) nwds = nwds + 1 |
| 2541 |
Cc write the message. --------------------------------------------------- |
| 2542 |
C write (lun, 10) (msg(i),i=1,nwds) |
| 2543 |
Cc----------------------------------------------------------------------- |
| 2544 |
Cc the following format statement is to have the form |
| 2545 |
Cc 10 format(1x,mmann) |
| 2546 |
Cc where nn = ncpw and mm is the smallest integer .ge. 60/ncpw. |
| 2547 |
Cc the following is valid for ncpw = 10. |
| 2548 |
Cc 10 format(1x,6a10) |
| 2549 |
Cc the following is valid for ncpw = 8. |
| 2550 |
Cc 10 format(1x,8a8) |
| 2551 |
Cc the following is valid for ncpw = 6. |
| 2552 |
Cc 10 format(1x,10a6) |
| 2553 |
Cc the following is valid for ncpw = 5. |
| 2554 |
Cc 10 format(1x,12a5) |
| 2555 |
Cc the following is valid for ncpw = 4. |
| 2556 |
C 10 format(1x,15a4) |
| 2557 |
Cc the following is valid for ncpw = 2. |
| 2558 |
Cc 10 format(1x,30a2) |
| 2559 |
Cc----------------------------------------------------------------------- |
| 2560 |
C if (ni .eq. 1) write (lun, 20) i1 |
| 2561 |
C 20 format(6x,23hin above message, i1 =,i10) |
| 2562 |
C if (ni .eq. 2) write (lun, 30) i1,i2 |
| 2563 |
C 30 format(6x,23hin above message, i1 =,i10,3x,4hi2 =,i10) |
| 2564 |
C if (nr .eq. 1) write (lun, 40) r1 |
| 2565 |
C 40 format(6x,23hin above message, r1 =,d21.13) |
| 2566 |
C if (nr .eq. 2) write (lun, 50) r1,r2 |
| 2567 |
C 50 format(6x,15hin above, r1 =,d21.13,3x,4hr2 =,d21.13) |
| 2568 |
Cc abort the run if level = 2. ------------------------------------------ |
| 2569 |
C 100 if (level .ne. 2) return |
| 2570 |
C stop |
| 2571 |
Cc----------------------- end of subroutine XERRWV ---------------------- |
| 2572 |
C end |
| 2573 |
block data |
| 2574 |
c----------------------------------------------------------------------- |
| 2575 |
c this data subprogram loads variables into the internal common |
| 2576 |
c blocks used by the odepack solvers. the variables are |
| 2577 |
c defined as follows.. |
| 2578 |
c illin = counter for the number of consecutive times the package |
| 2579 |
c was called with illegal input. the run is stopped when |
| 2580 |
c illin reaches 5. |
| 2581 |
c ntrep = counter for the number of consecutive times the package |
| 2582 |
c was called with istate = 1 and tout = t. the run is |
| 2583 |
c stopped when ntrep reaches 5. |
| 2584 |
c mesflg = flag to control printing of error messages. 1 means print, |
| 2585 |
c 0 means no printing. |
| 2586 |
c lunit = default value of logical unit number for printing of error |
| 2587 |
c messages. |
| 2588 |
c----------------------------------------------------------------------- |
| 2589 |
integer illin, iduma, ntrep, idumb, iowns, icomm, mesflg, lunit |
| 2590 |
double precision rowns, rcomm |
| 2591 |
common /ls0001/ rowns(209), rcomm(9), |
| 2592 |
1 illin, iduma(10), ntrep, idumb(2), iowns(6), icomm(19) |
| 2593 |
common /eh0001/ mesflg, lunit |
| 2594 |
data illin/0/, ntrep/0/ |
| 2595 |
data mesflg/1/, lunit/6/ |
| 2596 |
c |
| 2597 |
c----------------------- end of block data ----------------------------- |
| 2598 |
end |
| 2599 |
subroutine ewset (n, itol, rtol, atol, ycur, ewt) |
| 2600 |
clll. optimize |
| 2601 |
c----------------------------------------------------------------------- |
| 2602 |
c this subroutine sets the error weight vector ewt according to |
| 2603 |
c ewt(i) = rtol(i)*abs(ycur(i)) + atol(i), i = 1,...,n, |
| 2604 |
c with the subscript on rtol and/or atol possibly replaced by 1 above, |
| 2605 |
c depending on the value of itol. |
| 2606 |
c----------------------------------------------------------------------- |
| 2607 |
integer n, itol |
| 2608 |
integer i |
| 2609 |
double precision rtol, atol, ycur, ewt |
| 2610 |
dimension rtol(1), atol(1), ycur(n), ewt(n) |
| 2611 |
c |
| 2612 |
go to (10, 20, 30, 40), itol |
| 2613 |
10 continue |
| 2614 |
do 15 i = 1,n |
| 2615 |
15 ewt(i) = rtol(1)*dabs(ycur(i)) + atol(1) |
| 2616 |
return |
| 2617 |
20 continue |
| 2618 |
do 25 i = 1,n |
| 2619 |
25 ewt(i) = rtol(1)*dabs(ycur(i)) + atol(i) |
| 2620 |
return |
| 2621 |
30 continue |
| 2622 |
do 35 i = 1,n |
| 2623 |
35 ewt(i) = rtol(i)*dabs(ycur(i)) + atol(1) |
| 2624 |
return |
| 2625 |
40 continue |
| 2626 |
do 45 i = 1,n |
| 2627 |
45 ewt(i) = rtol(i)*dabs(ycur(i)) + atol(i) |
| 2628 |
return |
| 2629 |
c----------------------- end of subroutine ewset ----------------------- |
| 2630 |
end |