!_______________________________________________________________________
! DVODE_F90 Conversion Change Record
! Last change: ST 01/01/08
! ST 06/15/04:
!   Convert test program dtest.f to dtest.f90
!   Use unix2dos on vode.f
!   Use Metcalf converter to produce dvode_1.f90 from vode.f
!   Change some of the Metcalf formatting
!   Trim trailing blanks to produce dvode_2.f90
! ST 06/16/04:
!   Dimension RPAR, IPAR, ATOL, ITOL as(*) or (1) in the documentation
!     prologue and in dtest.f to produce dvode_3.f90
!   Convert DVNORM to a subroutine DVNORMST to produce dvode_4.f90
!   Convert IXSAV to a subroutine IXSAVST to produce dvode_5.f90
!   Replace DUMACH and DUMSET by F90 intrinsic calculation to
!     produce dvode_6.f90
!   Convert IUMACH to subroutine IUMACHST to produce dvode_.7f90
!   Convert function DDOT to subroutine DDOTST
!   Convert function IDAMAX to subroutine IDAMAXST to produce
!     dvode_.9f90
!   Note: DVNORM, IXSAV, IUMACH, DDOT, IDAMAX later changed
!     back to original forms (see 06/23/04 below)
!   Convert dvode_9.f90 to a module DVODE_M.F90=dvode_10.f90
!   Convert dvode_10.f90 to dvode_11.f90 with dynamic storage
!     allocation for the nonuser portions of the RWORK and IWORK
!     arrays.
!   Deallocate work arrays at the start of new problems (ISTATE=1)
!     to produce dvode_12.f90
! ST 06/17/04:
!   Remove LRWUSER and LIWUSER from call list. Set internally to
!     22 and 30, respectively.
!   Set lengths LRW and LIW of the allocatable works arrays
!     according to value of MF and MAXORD and verify that the
!     lengths of the arrays allocated are identical to
!     original minimum sizes in dvode.f. Inserted IMPLICIT NONE
!     and necessary declarations in all routines to produce
!     dvode13.f90
!   Get rid of warning messages for conditional arithmetic
!     tests on equality to produce dvode14.f90
!   Replace LE, GE, LT, GT, NE, EQ with <=, >=, <, >, /=, ==
!     to produce dvode15.f90
!   Miscellaneous cleanup to produce dvode16.f90
! ST 06/18/04:
!   Move DATA constants to PRIVATE section and eliminated the
!     corresponding SAVE statements to produce dvode17.f90
!   Move the DVOD02 common block to PRIVATE section to
!     produce dvode18.f90
!   Move the DVOD01 common block to PRIVATE section to
!     produce dvode19.f90
!   Modify DVSRCO to reflect above changes to produce dvode20.f90
!   Add interface DVINDY_USER to allow the user to interpolate
!     the derivative to produce dvode21.f90
! ST 06/19/04:
!   Add SET_OPTS function and GET_STATS subroutine.
!   Add PUBLIC data type VODE_OPTS
!   Remove MF, ITOL, ATOL, RTOL, IOPT, RUSER, IUSER from dvode
!     argument list (passed via fields in OPTS)
!   Add OPTS to dvode call list to produce dvode22.f90
! ST 06/20/04:
!   Add INTERFACE VODE_F90 to allow OPTIONS and JAC to be
!     OPTIONAL, to produce dvode_f90_m23.f90
! ST 06/21/04
!   Add short summary of usage for DVODE_F90
!   Eliminate RPAR and IPAR
!   Modify prologue example programs to reflect changes
! ST 06/22/04
!   Make necessary changes to accommodate ISTATE=3 calls
!     to produce dvode_f90_m24.f90 ** not yet tested **
! ST 06/23/04
!   Reactivate DVNLSD in its original form (passed as argument)
!     to produce (v25)
!   Reactivate DVNORM in its original form (as a function) (v26)
!   Reactivate DDOT in its original form (as a function) (v27)
!   Reactivate IDAMAX in its original form (as a function) (v28)
!   Reactivate IXSAV and IUMACH in their original form (as
!   functions) to produce dvode_f90_m29.f90 
!   Convert new PRINT statements to (terminal) XERRDV error
!     messages
!   Debug INDEX = 3 changes to produce dvode_f90_m29.f90 
!     (test program = check3.f90)
! ST 06/23/04
!   Change name of DYINDY to DVINDY_CORE and DYINDY_USER to
!     DVINDY to produce dvode_f90_m31.f90
! ST 06/29/04
!   Add routine SET_IAJA to calculate sparse pointer arrays
!     to produce dvode_f90_m32.f90 
! ST 07/02/04
!   Rewrite SET_OPTS to produce dvode_f90_m34.f90 
!   Test various input options in demo34.f90
! GB 07/05/04
!   Change AE/RE options to ABSERR/RELERR
! ST 07/18/04
!   Finish first stab at implementing MA28
! ST 07/26/04
!   Finish second stab at implementing MA28 and MOSS
! ST 07/27/04
!   Finish third stab at implementing MA28 and MOSS
! ST 07/28/04
!   Test sparse option with the column humidification problem
! ST 07/29/04
!   Adapt LCHECK and LROOTS subroutines from LSODAR and add
!     to DVODE_F90
! ST 07/31/04
!   Make JAC and GFUN optional; the VODE_F90 interface calls
!     DVODE in one of four ways depending on presence of
!     JAC and/or GFUN
!   Error if SET_OPTS not called before DVODE_F90 called
!     for the first time
! ST 07/31/04
!   First stab at root finding
! ST 08/02/04
!   Finish implementation of LSODAR root finding and adapt
!   LSODAR demo problems for vode_f90 solution
! ST 08/05/04
!   Implement temporary changes for optional enforcement of
!     nonnegativity constraints on the solution
! ST 08/06/04
!   Replace some labelled DO's and some loops
!   Modify calls to DVODE_F90 in the test programs and
!     and verify they work correctly
!   First cut at printing warning message when |y| < abserr
! ST 08/07/04
!   Implement nonnegativity option in SET_OPTS and remove
!     temporary coding from DVODE_F90
! ST 08/08/04
!   Remove temporary subroutine DVSTEPS (copy of DVSTEP for
!     sparse solutions)
!   Remove dummy PSOL from calls lists for DVSTEP, DVNLSD,
!     and DVNLSS
! ST 08/08/04
!   Add short summary of typical OPTIONS settings
!   Run source thru a spell checker
!   Take another whack at the documentation prologue for DVODE_F90
! ST 08/11/04
!   Solve Robertson problem with nonnegativity, dense and sparse tests
!   Change how sparse pointers arrays determined via derivative
!     calls in DVPREPS to be the same as elsewhere
!   Add easy to use version of SET_OPTS named mortal_opts
!   Take another whack at the documentation prologue for DVODE_F90
! ST 08/12/04
!   Add argument Called_From_Where to CHECK_STAT to indicate where
!     a storage allocation/deallocation occurred
!   Add subroutine RELEASE_ARRAYS which may be called to deallocate
!     the arrays allocated by DVODE_F90 and to determine how much
!     storage was used
! ST 08/13/04
!   With the nonnegativity option, project both y and y'
!   Whack on documentation prologues
!   Temporary subroutine CHECK_MESSAGES to write all error messages
!   Renumber error messages
! ST 08/16/04
!   Cleaner stab at nonnegativity
!   Temporarily change DVINDY/DVINDY_CORE not to enforce negativity
! ST 08/17/04
!   Add DVINDY_BNDS for use by the user callable DVINDY to enforce
!     nonnegativity
!   Add INTENT attribute to all subroutine and function arguments
! ST 08/18/04
!   Reorganize type declarations
!   Make cosmetic header changes
!   Eliminate NMES from XERRDV and change name to XERRDV
! ST 09/05/04
!   Stopped being stupid and got nonnegativity to work
! ST 09/07/04
!   Arbitrary bounds enforcement
! ST 10/26/04
!   Get rid of some compiler warning messages about tests of equality
! ST 11/03/04
!   Fix an problem in DVROOTS involving JROOT
! ST 11/11/04
!   Remove mortal_opts function
! ST 12/25/04-12/28/04
!   Implement HSL MA48
! ST 01/05/05
!   Separate MA28 and MA48 versions
! ST 01/09/05
!   MA28 Hollerith formats to strings
!   MA28 lower case
!   0 default for lp/mp in MA28
! ST 01/11/05
!   Single precision version of MA28
!   Save TSAVE in blocks G,H in DVODE
!   Change DOUBLE PRECISION to REAL(KIND=WP)
!   Single precision version SVODE_F90 of DVODE_F90
!   D* to E* in SVODE_F90, *=0,...,9,-,+
!   Some D's replaced by d's to make global replacements possible
!   D to S in BLAS routines and rest of SVODE_F90
! ST 01/11/05
!   Change definition of UMAX in single precision version
! ST 02/09/05
!   Reorganize documentation prologue
! ST 03/30/05
!   Implement Alan's fix for root too close to X2 in root finder
! ST 05/11/05
!   Implement Alan's fix for testing for equality of T in
!   DVINDY_CORE and DVINDY_BNDS
!   Implement Alan's fix for nearby zeros in DVCHECK
! ST 05/14/05
!   Change distribution file to constitute only one F90 module
!   Miscellaneous cosmetic changes
!   Replace several decimal values for numbers by named variables
!   Delete unused LINPACK function DNRM2
! ST 05/15/05
!   Determine the working precision and define UMAX for MA28
!   accordingly in SET_OPTS
!   Miscellaneous cosmetic changes
!   Convert case in MA28
!   Modify single precision demo programs to call DVODE
!   than SVODE
! ST 05/16/05
!   Define arithmetic constants using _WP extension
! ST 06/03/05
!   Change name of NULL to MYNULL in MA28 routines
!   Delete unnecessary commented out statements
! ST 06/04/05
!   Remove ACOR, SAVF, EWT from the RWORK array
!   Eliminate LACOR, LSAVF, LEWT pointers
! ST 06/05/05
!   Remove WM from the RWORK array
!   Use WM1, WM2 instead of WM(1), WM(2)
! ST 06/06/05
!   Make changes necessary to allow the maximum order to be
!     reduced at output points (save YH, WM and restore)
! ST 06/07/05
!   Make cosmetic changes
! ST 06/08/05
!   Make cosmetic changes
!   Add directions for building LAPACK-based and MA48-based
!     versions
! ST 06/11/05
!   Standardize declaration and polish with nag
!   Cosmetic changes
! ST 06/12/05
!   Cosmetic changes
! ST 06/13/05
!   Replace USE_LINPACK flag by USE_LAPACK flag
!   Remove check on sizes of ISTAT and RSTAT arrays in GET_STATS
!   Add explicit declarations of public and private subroutines
!     and functions
!   Add the user callable subroutines to the generic interfaces
!     block
! ST 06/14/05
!   Cosmetic changes
! ST 07/21/05
!   Implement option to increase the elbow room in the MA28
!     work arrays
!   Implement option to invoke MC19 sparse scaling of numerical
!     Jacobians
!   Clean up the 2d diurnal kinetics program
! ST 07/25/05
!   Implement MA28_EPS threshold option for numerical singularity
! ST 07/26/05
!   Implement MA28_MESSAGES option to control MA28 printing
! ST 07/30/05
!   Implement sparsity recalculation if a structurally singular
!     matrix is encountered
! ST 07/31/05
!   Implement MA28_RPS option to force calculation of a new pivot
!     sequence if MA28BD encounters a singular matrix
! ST 08/02/05
!   Add SET_NORMAL_OPTS for normal usage
!   Add SET_OPTS_2 for changing HMAX, HMIN, and MXSTEP
! ST 08/03/05
!   Change how swag storage increment for sparse Jacobians determined
!   Change length of ISTATS to 31
!   Change sparse statistics available in GET_STATS
! ST 08/10/05
!   Add SUB_DIAGONALS and SUP_DIAGONALS option for banded systems
!   Add BGROUP to compute sparse column grouping for banded
!      systems with known diagonals and verify it's results
!      match those of DGROUP
! ST 08/11/05
!   Add subroutine BANDED_IAJA to compute the sparse matrix
!      descriptor arrays for a banded matrix with known
!      diagonals
!   Make miscellaneous cosmetic changes
! ST 08/12/05
!   One at a time column version of BANDED_IAJA
!   Modify DVJAC to handle banded systems using diagonal information
! ST 08/16/05
!   Work on documentation for SET_OPTS
! ST 08/17/05
!   Use DTEMP rather than SAVF in DVPREPS
! ST 08/18/05
!   Add CONSTANT_JACOBIAN option
! ST 08/23/05
!   Add SET_INTERMEDIATE_OPTS and work on the documentation for each
!   of SET_NORMAL_OPTS, SET_INTERMEDIATE_OPTS, and SET_OPTS
! ST 08/24/05
!   Add warning if default error tolerances used
!   Work on OPTs documentation
! ST 08/25/05
!   Make miscellaneous cosmetic changes
! ST 08/28/05
!   Work on the MA48 based sparse solution option
! ST 08/29/05
!   Fixes in the MA48 version
! ST 09/05/05
!   Put back the IMPLICIT NONE statements that nag tools deleted
! ST 09/06/05
!   Do not allow default error tolerances to be used
! ST 09/08/05
!   Add the USE_FAST_FACTOR flag in MA48 version
! ST 09/11/05
!   Add debug prints
! ST 09/14/05
!   Delete the first two slots in the WM Jacobian array
! ST 09/18/05
!   Incorporate option to use JACSP for sparse Jacobians
! ST 09-19-05
!   Change name of DSM to DVDSM
!   Do not allow NEQ to be reduced
!   Add flags for consecutive error test failures and for consecutive
!   corrector failures.
! ST 09-20-05
!   Modify JACSP to produce JACSPDV
!   Incorporate option to use JACSPDV for dense Jacobians
!   Incorporate option to use JACSPDV for banded Jacobians
!   Incorporate option to use JACSPDV for sparse Jacobians
! ST 09-21-05
!   Supply YSCALE to JACSPDV
! ST 10-04-05
!   Make a few changes to introductory comments
! ST 12-05
!   Add subroutine interfaces
!   Change some MA28 work arrays to two-dimensional and reference
!     differently to satisfy the Salford ftn95 compiler
!   Modify demo programs to make Salford happy
! ST 01-01-08
!   Fixed bug found by Richard Cox (restore NZ when sparse
!   analytic Jacobian used) 
! End DVODE_F90 Conversion Change Record
!_______________________________________________________________________
! f77 REVISION HISTORY(YYYYMMDD)
!  19890615  Date Written. Initial release.
!  19890922  Added interrupt/restart ability, minor changes throughout.
!  19910228  Minor revisions in line format, prologue, etc.
!  19920227  Modifications by D. Pang:
!            (1) Applied subgennam to get generic intrinsic names.
!            (2) Changed intrinsic names to generic in comments.
!            (3) Added *DECK lines before each routine.
!  19920721  Names of routines and labelled common blocks changed, so as
!            to be unique in combined single/real(wp) code (ACH)
!  19920722  Minor revisions to prologue (ACH).
!  19920831  Conversion to real(wp) done (ACH).
!  19921106  Fixed minor bug: ETAQ,ETAQM1 in DVSTEP SAVE statement (ACH)
!  19921118  Changed LUNSAV/MFLGSV to IXSAV(ACH).
!  19941222  Removed MF overwrite; attached sign to H in est. second
!            deriv. in DVHIN; misc. comment changes throughout (ACH).
!  19970515  Minor corrections to comments in prologue, DVJAC(ACH).
!  19981111  Corrected Block B by adding final line, GOTO 200 (ACH).
!  20020430  Various upgrades (ACH): Use ODEPACK error handler package.
!            Replaced D1MACH by DUMACH. Various changes to main
!            prologue and other routine prologues.
