KPP revision history

Only the major new features are listed here. For a detailed description of the changes, read

KPP 3.0.0


When you are upgrading from an older KPP version to KPP 3.0.0 or later versions, a few minor changes in your code may be necessary:

  • The atoms file is now called atoms.kpp. Thus, you have to change #INCLUDE atoms to #INCLUDE atoms.kpp in your KPP input file.

  • The utility functions ARR, ARR2, k_3rd and k_arr have been replaced by the new set of the consistent functions ARR_abc, ARR_ab, ARR_ac, k3rd_jpl, k3rd_jpl_activation, and k3rd_iupac. We recommend to upgrade to the new functions, which all use the temperature from the temp variable in ROOT_Global.f90. Alternatively, it is possible to copy the old functions into a separate file and make them available via F90_RCONST.

  • If you have been using ICNTRL(5) for maximal order in the lsode integrator, you now have to use ICNTRL(10) instead. The index 5 in the ICNTRL array is now used consistently for the maximum number of Newton iterations in all integrators.

  • Updated the search for the flex library in src/Makefile.defs. The build process will look for the flex: library file (either or libfl.a file in several standard locations first. If not found, the build process will look in the path specfiied by environment variable KPP_FLEX_LIB_DIR.

  • Added content to ReadTheDocs pages and fixed several formatting issues.

  • Fixed various minor issues in generating C-language code.

  • Fixed various minor issues in generating Matlab-language code.

  • C-I tests folders have been renamed for clarity. Also refactored the scripts used to submit C-I tests. Updated the Dockerfile to always request Ubuntu 20.04 and an AMD64 platform, so that the same libraries will always be used when running C-I tests on Azure DevOps.

  • Fortran type DOUBLE_COMPLEX is now replaced by COMPLEX(kind=dp).

  • Fixed incorrect license metadata in .zenodo.json, which is used to auto-generate a DOI with each KPP release on Github.

  • Added extra free() statements in src/gen.c to avoid memory leaks.

  • Fun() no longer uses Vdotout since it can be retrieved from Vdot.

  • Fixed a bug in int/feuler.f90, where the wrong argument was being passed to routine Fun.

KPP 2.6.0

  • Added the rosenbrock_autoreduce integrator Lin et al. [2023].

KPP 2.5.0

  • Merged updates from the GEOS-Chem development stream (versions KPP 2.2.4_gc, KPP 2.2.5_gc, KPP 2.3.0_gc, KPP 2.3.1_gc, KPP 2.3.2_gc ) into the mainline KPP development stream. Previously hardwired code has been removed and replaced with code selectable via KPP commands.

  • Added a new forward-Euler method integrator (feuler.f90).

  • Added KPP commands #MINVERSION and #UPPERCASEF90 (along with corresponding continuous integration tests).

  • Added optional variables Aout and Vdotout to subroutine Fun().

  • Replaced Fortran EQUIVALENCE statements with thread-safe pointer assignments (Fortran90 only).

  • Converted the KPP user manual to Sphinx/ReadTheDocs format (this now replaces the prior ReadTheDocs documentaton).

  • Added updates to allow KPP to be built on MacOS X systems.

  • Added small_strato C-I test that uses the exact same options as is described in Running KPP with an example stratospheric mechanism.

KPP 2.4.0

  • Added new integrators: beuler.f90, rosenbrock_mz.f90, rosenbrock_posdef.f90, rosenbrock_posdef_h211b_qssa.f90.

  • Several memory sizes (MAX_EQN, …) have been increased to allow large chemical mechanisms.

  • Added new Makefile target: list.

  • Added LaTeX User Manual.

  • Now use ICNTRL(15) to decide whether or not to toggle calling the Update_SUN, Update_RCONST, and Update_PHOTO routines from within the integrator.

KPP 2.3.2_gc

NOTE: Contains KPP Modifications specific to GEOS-Chem.

  • Added workaround for F90 derived-type objects in inlined code (i.e. properly parse State_Het%xArea, etc).

  • Updated Github issue templates.

  • MAX_INLINE (max # of inlined code lines to read) has been increased to 200000.

  • Commented out the Update_Sun() functions in update_sun.F90, update_sun.F. (NOTE: These have been restored in KPP 2.5.0).

  • Default rate law functions are no longer written to gckpp_Rates.F90. (NOTE: These have been restored in KPP 2.5.0).

KPP 2.3.1_gc

NOTE: KPP modifications specific to GEOS-Chem.

ALSO NOTE: ReadTheDocs documentation has been updated in KPP 2.5.0 to remove GEOS-Chem specific information.

  • Added documentation for ReadTheDocs.

  • Added Github issue templates.

  • now contains the ReadTheDocs badge.

  • now points to for documentation.

KPP 2.3.0_gc

NOTE: Contains KPP modifications specific to GEOS-Chem.

  • Added for the GC_updates branch.

  • Added MIT license for the GC_updates branch.

  • Add Aout argument to return reaction rates from SUBROUTINE Fun.

  • Rename KPP/kpp_2.2.3_01 directory to KPP/kpp-code.

  • Now write gckpp_Model.F90 and gckpp_Precision.F90 from gen.c.

  • Do not write file creation & time to KPP-generated files (as this will cause Git to interpret each file as a new file to be added).

  • Now create Fortran-90 source code files with *.F90 instead of *.f90. (NOTE: In KPP 2.5.0, this can specified with the #UPPERCASEF90 command.)

  • Remove calls to UPDATE_SUN and UPDATE_RCONST from all *.f90 integrators. (NOTE: This has been restored in KPP 2.5.0.)

KPP 2.2.5_gc

NOTE: Contains KPP modifications specific to GEOS-Chem.

  • Increase MAX_INLINE from 20000 to 50000

KPP 2.2.4_gc

NOTE: Contains KPP modifications specific to GEOS-Chem.

  • Add MIT license files for GC_updates branch and update accordingly

  • Create for main branch

  • Set FLEX_LIB_DIR using FLEX_HOME env variable if it is defined.

  • Added an exponential integrator.

  • Added array to *_Monitor for family names (FAM_NAMES) string vector.

  • Added functionality for Prod/Loss families using #FAMILIES token.

  • Add scripts necessary to build a new mechanism for GEOS-Chem

  • Completed the prod/loss option (token: #FLUX [on/off])

  • Added OMP THREADPRIVATE to LinearAlgebra.F90

  • Added rosenbrock_split.def integrator definition

  • Added OMPThreadPrivate function for F77.

  • Added declaration of A in ROOT_Function

  • Added OMP THREADPRIVATE Functionality to F90 output.

  • Completed the split-form Function for F90.

  • Increase maximum number of equations.

  • Increase MAX_FAMILIES parameter from 50 to 300

  • Extend equation length limit to 200 characters.

  • Also changed the species name for a family to the family name itself.

  • Modified Families to minimize the number of additional species created

  • Renamed and change indexing convention

  • Removed unnecessary files

KPP 2.2.3

  • A new function called k_3rd_iupac is available, calculating third-order rate coefficients using the formula used by IUPAC [Atkinson et al., 2004].

  • While previous versions of KPP were using yacc (yet another compiler compiler), the current version has been modified to be compatible with the parser generator bison, which is the successor of yacc.

  • New Runge-Kutta integrators were added: kpp_dvode.f90, runge_kutta.f90, runge_kutta_tlm.f90, sdirk_adj.f90, sdirk_tlm.f90.

  • New Rosebrock method Rang3 was added.

  • The new KPP command #DECLARE was added (see: #DECLARE).

  • Several vector and array functions from BLAS (WCOPY, WAXPY, etc.) were replaced by Fortran90 expressions.

KPP 2.1

  • Described by Sandu and Sander [2006].

  • Matlab is a new target language (see: The Matlab code).

  • The set of integrators has been extended with a general Rosenbrock integrator, and the corresponding tangent linear and adjoint methods.

  • The KPP-generated Fortran90 code has a different file structure than the C or Fortran77 output (see: The Fortran90 code).

  • An automatically generated Makefile facilitates the compilation of the KPP-generated code (see: The Makefile).

  • Equation tags provide a convenient way to refer to specific chemical reactions (see: #LOOKAT and #MONITOR.

  • The dummy index allows to test if a certain species occurs in the current chemistry mechanism. (see: #DUMMYINDEX)

  • Lines starting with // are comment lines.

KPP 1.1-f90-alpha12