module MO_GRID
!---------------------------------------------------------------------
! 	... Basic grid point resolution parameters
!---------------------------------------------------------------------
      implicit none

      save

      integer, parameter :: &
                nodes    = NODES, &       ! number of nodes
                cpupnode = CPUPNODE, & ! CPUs per node
                pcnst    =    63+1, &     ! number of advected constituents including cloud water
                pcnstm1  =    63, &     ! number of advected constituents excluding cloud water
                plev     =  34, &         ! number of vertical levels
                plevp    = plev+1, &      ! plev plus 1
                plevm    = plev-1, &      ! plev minus 1
                plon     = 128, &         ! number of longitudes
                plat     =  64, &         ! number of latitudes

                plonl    = plon/cpupnode, & ! local number of longitudes
                pplon    = plon/plonl, &  ! number of longitude omp groups

                plnplv   = plonl*plev, & ! number of longitude omp groups
                platl    = plat/nodes

      integer, parameter :: &
                pnats    =     3    ! number of non-advected trace species



      end module MO_GRID

      module CHEM_MODS
!--------------------------------------------------------------
!     	... Basic chemistry array parameters
!--------------------------------------------------------------

      use MO_GRID, only : pcnstm1

      implicit none

      save

      integer, parameter :: hetcnt     =    26, &    ! number of heterogeneous processes
                            phtcnt     =    33, &    ! number of photo processes
                            rxntot     =   168, &    ! number of total reactions
                            gascnt     =   135, &    ! number of gas phase reactions
                            nfs        =     4, &       ! number of "fixed" species
                            relcnt     =     0, &    ! number of relationship species
                            grpcnt     =     3, &    ! number of group members
                            imp_nzcnt  =   587, &     ! number of non-zero implicit matrix entries
                            rod_nzcnt  =     0, &     ! number of non-zero rodas matrix entries
                            extcnt     =     3, &    ! number of species with external forcing
                            clscnt1    =     8, &  ! number of species in explicit class
                            clscnt2    =     0, &  ! number of species in hov class
                            clscnt3    =     0, &  ! number of species in ebi class
                            clscnt4    =    55, &  ! number of species in implicit class
                            clscnt5    =     0, &  ! number of species in rodas class
                            indexm     =     1, &    ! index of total atm density in invariant array
                            ncol_abs   =     2, &    ! number of column densities
                            indexh2o   =     4, &    ! index of water vapor density
                            clsze      =   4       ! loop length for implicit chemistry


      real      :: adv_mass(pcnstm1)
      real      :: nadv_mass(grpcnt)

      type SOLVER_CLASS
	 integer :: clscnt
	 integer :: lin_rxt_cnt
	 integer :: nln_rxt_cnt
	 integer :: indprd_cnt
	 integer :: iter_max
         integer :: cls_rxt_cnt(4)
         integer, pointer :: permute(:)
         integer, pointer :: diag_map(:)
         integer, pointer :: clsmap(:)
      end type SOLVER_CLASS

      type(SOLVER_CLASS) :: explicit, implicit, rodas

      CONTAINS

      subroutine CHEM_MODS_INTI
!--------------------------------------------------------------
!     	... Intialize the class derived type
!--------------------------------------------------------------

      implicit none

      integer :: astat

      explicit%clscnt       =     8
      explicit%indprd_cnt   =    28

      implicit%clscnt       =    55
      implicit%lin_rxt_cnt  =    71
      implicit%nln_rxt_cnt  =   113
      implicit%indprd_cnt   =     3
      implicit%iter_max     =    11

      rodas%clscnt          =     0
      rodas%lin_rxt_cnt     =     0
      rodas%nln_rxt_cnt     =     0
      rodas%indprd_cnt      =     0

      if( explicit%clscnt > 0 ) then
	 ALLOCATE( explicit%clsmap(explicit%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate explicit%clsmap ; error = ',astat
	    call ENDRUN
	 end if
         explicit%clsmap(:)  = 0
      end if
      if( implicit%clscnt > 0 ) then
	 ALLOCATE( implicit%permute(implicit%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate implicit%permute ; error = ',astat
	    call ENDRUN
	 end if
         implicit%permute(:)  = 0
	 ALLOCATE( implicit%diag_map(implicit%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate implicit%diag_map ; error = ',astat
	    call ENDRUN
	 end if
         implicit%diag_map(:)  = 0
	 ALLOCATE( implicit%clsmap(implicit%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate implicit%clsmap ; error = ',astat
	    call ENDRUN
	 end if
         implicit%clsmap(:)  = 0
      end if
      if( rodas%clscnt > 0 ) then
	 ALLOCATE( rodas%permute(rodas%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate rodas%permute ; error = ',astat
	    call ENDRUN
	 end if
         rodas%permute(:)  = 0
	 ALLOCATE( rodas%diag_map(rodas%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate rodas%diag_map ; error = ',astat
	    call ENDRUN
	 end if
         rodas%diag_map(:)  = 0
	 ALLOCATE( rodas%clsmap(rodas%clscnt),stat=astat )
	 if( astat /= 0 ) then
	    write(*,*) 'CHEM_MODS_INTI: Failed to allocate rodas%clsmap ; error = ',astat
	    call ENDRUN
	 end if
         rodas%clsmap(:)  = 0
      end if

      end subroutine CHEM_MODS_INTI

      end module CHEM_MODS
  
      module M_SPC_ID                                                           
  
      integer, parameter :: id_OX =   1
      integer, parameter :: id_N2O =   2
      integer, parameter :: id_N =   3
      integer, parameter :: id_NO =   4
      integer, parameter :: id_NO2 =   5
      integer, parameter :: id_NO3 =   6
      integer, parameter :: id_HNO3 =   7
      integer, parameter :: id_HO2NO2 =   8
      integer, parameter :: id_N2O5 =   9
      integer, parameter :: id_CH4 =  10
      integer, parameter :: id_CH3O2 =  11
      integer, parameter :: id_CH3OOH =  12
      integer, parameter :: id_CH2O =  13
      integer, parameter :: id_CO =  14
      integer, parameter :: id_OH =  15
      integer, parameter :: id_HO2 =  16
      integer, parameter :: id_H2O2 =  17
      integer, parameter :: id_C3H6 =  18
      integer, parameter :: id_ISOP =  19
      integer, parameter :: id_PO2 =  20
      integer, parameter :: id_CH3CHO =  21
      integer, parameter :: id_POOH =  22
      integer, parameter :: id_CH3CO3 =  23
      integer, parameter :: id_CH3COOOH =  24
      integer, parameter :: id_PAN =  25
      integer, parameter :: id_ONIT =  26
      integer, parameter :: id_C2H6 =  27
      integer, parameter :: id_C2H4 =  28
      integer, parameter :: id_C4H10 =  29
      integer, parameter :: id_MPAN =  30
      integer, parameter :: id_ISOPO2 =  31
      integer, parameter :: id_MVK =  32
      integer, parameter :: id_MACR =  33
      integer, parameter :: id_MACRO2 =  34
      integer, parameter :: id_MACROOH =  35
      integer, parameter :: id_MCO3 =  36
      integer, parameter :: id_C2H5O2 =  37
      integer, parameter :: id_C2H5OOH =  38
      integer, parameter :: id_C10H16 =  39
      integer, parameter :: id_C3H8 =  40
      integer, parameter :: id_C3H7O2 =  41
      integer, parameter :: id_C3H7OOH =  42
      integer, parameter :: id_CH3COCH3 =  43
      integer, parameter :: id_ROOH =  44
      integer, parameter :: id_CH3OH =  45
      integer, parameter :: id_C2H5OH =  46
      integer, parameter :: id_GLYALD =  47
      integer, parameter :: id_HYAC =  48
      integer, parameter :: id_EO2 =  49
      integer, parameter :: id_EO =  50
      integer, parameter :: id_HYDRALD =  51
      integer, parameter :: id_RO2 =  52
      integer, parameter :: id_CH3COCHO =  53
      integer, parameter :: id_Rn =  54
      integer, parameter :: id_Pb =  55
      integer, parameter :: id_ISOPNO3 =  56
      integer, parameter :: id_ONITR =  57
      integer, parameter :: id_XO2 =  58
      integer, parameter :: id_XOOH =  59
      integer, parameter :: id_ISOPOOH =  60
      integer, parameter :: id_H2 =  61
      integer, parameter :: id_O3S =  62
      integer, parameter :: id_O3INERT =  63
  
      integer, parameter :: id_O3 =   1
      integer, parameter :: id_O1D =   2
      integer, parameter :: id_O =   3
  
      end module M_SPC_ID                                                       
                                                                                
      module M_RXT_ID                                                           
                                                                                
      integer, parameter :: rid_jo2 =    1                                      
      integer, parameter :: rid_jo1d =    2                                     
      integer, parameter :: rid_jo3p =    3                                     
      integer, parameter :: rid_jn2o =    4                                     
      integer, parameter :: rid_jno =    5                                      
      integer, parameter :: rid_jno2 =    6                                     
      integer, parameter :: rid_jn2o5 =    7                                    
      integer, parameter :: rid_jhno3 =    8                                    
      integer, parameter :: rid_jno3 =    9                                     
      integer, parameter :: rid_jho2no2 =   10                                  
      integer, parameter :: rid_jch3ooh =   11                                  
      integer, parameter :: rid_jch2o_a =   12                                  
      integer, parameter :: rid_jch2o_b =   13                                  
      integer, parameter :: rid_jh2o =   14                                     
      integer, parameter :: rid_jh2o2 =   15                                    
      integer, parameter :: rid_jch3cho =   16                                  
      integer, parameter :: rid_jpooh =   17                                    
      integer, parameter :: rid_jch3co3h =   18                                 
      integer, parameter :: rid_jpan =   19                                     
      integer, parameter :: rid_jmpan =   20                                    
      integer, parameter :: rid_jmacr_a =   21                                  
      integer, parameter :: rid_jmacr_b =   22                                  
      integer, parameter :: rid_jmvk =   23                                     
      integer, parameter :: rid_jc2h5ooh =   24                                 
      integer, parameter :: rid_jc3h7ooh =   25                                 
      integer, parameter :: rid_jrooh =   26                                    
      integer, parameter :: rid_jacet =   27                                    
      integer, parameter :: rid_jmgly =   28                                    
      integer, parameter :: rid_jxooh =   29                                    
      integer, parameter :: rid_jonitr =   30                                   
      integer, parameter :: rid_jisopooh =   31                                 
      integer, parameter :: rid_jhyac =   32                                    
      integer, parameter :: rid_jglyald =   33                                  
      integer, parameter :: rid_usr1 =   34                                     
      integer, parameter :: rid_o1d_n2 =   36                                   
      integer, parameter :: rid_o1d_o2 =   37                                   
      integer, parameter :: rid_ox_l1 =   38                                    
      integer, parameter :: rid_ox_p1 =   41                                    
      integer, parameter :: rid_usr2 =   46                                     
      integer, parameter :: rid_usr3 =   47                                     
      integer, parameter :: rid_usr4 =   49                                     
      integer, parameter :: rid_usr5 =   50                                     
      integer, parameter :: rid_usr6 =   52                                     
      integer, parameter :: rid_usr7 =   54                                     
      integer, parameter :: rid_ox_p2 =   57                                    
      integer, parameter :: rid_usr8 =   64                                     
      integer, parameter :: rid_ox_l2 =   68                                    
      integer, parameter :: rid_ox_l3 =   69                                    
      integer, parameter :: rid_usr9 =   70                                     
      integer, parameter :: rid_usr10 =   75                                    
      integer, parameter :: rid_ox_l4 =   76                                    
      integer, parameter :: rid_ox_p3 =   78                                    
      integer, parameter :: rid_ox_p4 =   83                                    
      integer, parameter :: rid_usr11 =   84                                    
      integer, parameter :: rid_usr12 =   88                                    
      integer, parameter :: rid_ox_l5 =   90                                    
      integer, parameter :: rid_ox_p5 =   92                                    
      integer, parameter :: rid_usr13 =   97                                    
      integer, parameter :: rid_ox_l6 =  101                                    
      integer, parameter :: rid_ox_p6 =  104                                    
      integer, parameter :: rid_ox_l7 =  110                                    
      integer, parameter :: rid_ox_l8 =  112                                    
      integer, parameter :: rid_ox_p7 =  113                                    
      integer, parameter :: rid_ox_p8 =  120                                    
      integer, parameter :: rid_usr14 =  126                                    
      integer, parameter :: rid_usr15 =  127                                    
      integer, parameter :: rid_ox_l9 =  129                                    
      integer, parameter :: rid_usr16 =  131                                    
      integer, parameter :: rid_usr17 =  132                                    
      integer, parameter :: rid_ox_p9 =  136                                    
      integer, parameter :: rid_usr22 =  140                                    
      integer, parameter :: rid_ox_p10 =  141                                   
      integer, parameter :: rid_ox_p11 =  154                                   
      integer, parameter :: rid_usr21 =  160                                    
                                                                                
      integer, parameter :: rid_r0035 =   35                                    
      integer, parameter :: rid_r0039 =   39                                    
      integer, parameter :: rid_r0040 =   40                                    
      integer, parameter :: rid_r0042 =   42                                    
      integer, parameter :: rid_r0043 =   43                                    
      integer, parameter :: rid_r0044 =   44                                    
      integer, parameter :: rid_r0045 =   45                                    
      integer, parameter :: rid_r0048 =   48                                    
      integer, parameter :: rid_r0051 =   51                                    
      integer, parameter :: rid_r0053 =   53                                    
      integer, parameter :: rid_r0055 =   55                                    
      integer, parameter :: rid_r0056 =   56                                    
      integer, parameter :: rid_r0058 =   58                                    
      integer, parameter :: rid_r0059 =   59                                    
      integer, parameter :: rid_r0060 =   60                                    
      integer, parameter :: rid_r0061 =   61                                    
      integer, parameter :: rid_r0062 =   62                                    
      integer, parameter :: rid_r0063 =   63                                    
      integer, parameter :: rid_r0065 =   65                                    
      integer, parameter :: rid_r0066 =   66                                    
      integer, parameter :: rid_r0067 =   67                                    
      integer, parameter :: rid_r0071 =   71                                    
      integer, parameter :: rid_r0072 =   72                                    
      integer, parameter :: rid_r0073 =   73                                    
      integer, parameter :: rid_r0074 =   74                                    
      integer, parameter :: rid_r0077 =   77                                    
      integer, parameter :: rid_r0079 =   79                                    
      integer, parameter :: rid_r0080 =   80                                    
      integer, parameter :: rid_r0081 =   81                                    
      integer, parameter :: rid_r0082 =   82                                    
      integer, parameter :: rid_r0085 =   85                                    
      integer, parameter :: rid_r0086 =   86                                    
      integer, parameter :: rid_r0087 =   87                                    
      integer, parameter :: rid_r0089 =   89                                    
      integer, parameter :: rid_r0091 =   91                                    
      integer, parameter :: rid_r0093 =   93                                    
      integer, parameter :: rid_r0094 =   94                                    
      integer, parameter :: rid_r0095 =   95                                    
      integer, parameter :: rid_r0096 =   96                                    
      integer, parameter :: rid_r0098 =   98                                    
      integer, parameter :: rid_r0099 =   99                                    
      integer, parameter :: rid_r0100 =  100                                    
      integer, parameter :: rid_r0102 =  102                                    
      integer, parameter :: rid_r0103 =  103                                    
      integer, parameter :: rid_r0105 =  105                                    
      integer, parameter :: rid_r0106 =  106                                    
      integer, parameter :: rid_r0107 =  107                                    
      integer, parameter :: rid_r0108 =  108                                    
      integer, parameter :: rid_r0109 =  109                                    
      integer, parameter :: rid_r0111 =  111                                    
      integer, parameter :: rid_r0114 =  114                                    
      integer, parameter :: rid_r0115 =  115                                    
      integer, parameter :: rid_r0116 =  116                                    
      integer, parameter :: rid_r0117 =  117                                    
      integer, parameter :: rid_r0118 =  118                                    
      integer, parameter :: rid_r0119 =  119                                    
      integer, parameter :: rid_r0121 =  121                                    
      integer, parameter :: rid_r0122 =  122                                    
      integer, parameter :: rid_r0123 =  123                                    
      integer, parameter :: rid_r0124 =  124                                    
      integer, parameter :: rid_r0125 =  125                                    
      integer, parameter :: rid_r0128 =  128                                    
      integer, parameter :: rid_r0130 =  130                                    
      integer, parameter :: rid_r0133 =  133                                    
      integer, parameter :: rid_r0134 =  134                                    
      integer, parameter :: rid_r0135 =  135                                    
      integer, parameter :: rid_r0137 =  137                                    
      integer, parameter :: rid_r0138 =  138                                    
      integer, parameter :: rid_r0139 =  139                                    
      integer, parameter :: rid_r0142 =  142                                    
      integer, parameter :: rid_r0143 =  143                                    
      integer, parameter :: rid_r0144 =  144                                    
      integer, parameter :: rid_r0145 =  145                                    
      integer, parameter :: rid_r0146 =  146                                    
      integer, parameter :: rid_r0147 =  147                                    
      integer, parameter :: rid_r0148 =  148                                    
      integer, parameter :: rid_r0149 =  149                                    
      integer, parameter :: rid_r0150 =  150                                    
      integer, parameter :: rid_r0151 =  151                                    
      integer, parameter :: rid_r0152 =  152                                    
      integer, parameter :: rid_r0153 =  153                                    
      integer, parameter :: rid_r0155 =  155                                    
      integer, parameter :: rid_r0156 =  156                                    
      integer, parameter :: rid_r0157 =  157                                    
      integer, parameter :: rid_r0158 =  158                                    
      integer, parameter :: rid_r0159 =  159                                    
      integer, parameter :: rid_r0161 =  161                                    
      integer, parameter :: rid_r0162 =  162                                    
      integer, parameter :: rid_r0163 =  163                                    
      integer, parameter :: rid_r0164 =  164                                    
      integer, parameter :: rid_r0165 =  165                                    
      integer, parameter :: rid_r0166 =  166                                    
      integer, parameter :: rid_r0167 =  167                                    
      integer, parameter :: rid_r0168 =  168                                    
                                                                                
      end module M_RXT_ID