!   file module_data_ecpp1.F
!-----------------------------------------------------------------------

	module module_data_ecpp1

       use shr_kind_mod, only: r8=>shr_kind_r8

!	integer, parameter :: r4=4
!	integer, parameter :: r8=8


! following are used to dimension several arrays 
!    declared in module_ecpp_ppdriver.F with "save"
! in mmf framework, these arrays will be subr parameters
! in wrf-chem framework, doing this is just too much trouble
!    because of registry limitations
	integer, parameter :: its_ecpptmp=1
	integer, parameter :: ite_ecpptmp=1
	integer, parameter :: jts_ecpptmp=1
	integer, parameter :: jte_ecpptmp=1
	integer, parameter :: kts_ecpptmp=1
	integer, parameter :: kte_ecpptmp=51
	integer, parameter :: ktebnd_ecpptmp=kte_ecpptmp
	integer, parameter :: ktecen_ecpptmp=kte_ecpptmp-1
	integer, parameter :: num_chem_ecpptmp=101


! maximum number of ecpp transport classes, used for dimensioning various arrays
	integer, parameter :: maxcls_ecpp=3
	integer, parameter :: maxsub_ecpp=maxcls_ecpp

! maximum number of "precipitation types" for wetscav diagnostics
!    currently this is 1
!       the wetscav diagnostics are done for each subarea type, so
!       have info on where (up, down, quiescent) the scavenging happens.
!       however, they do no account for the fact that precip formed
!       in updraft can fall (or shift) into quiescent, etc.
!    eventually it might be 2, so would have diagnostics involving
!       where precip is formed -- quiescent versus (convective) up/downdrafts)
        integer, parameter :: max_wetdiagtype = 1

! set this to .false. for cam3-mmf
        logical, parameter :: hostcode_is_wrfchem = .false.


! these are possible values for mtype_updnenv_ecpp_3d & ..._clm3d & ..._clm3d & ..._clm
	integer, parameter :: mtype_updraft_ecpp=1
	integer, parameter :: mtype_dndraft_ecpp=2
	integer, parameter :: mtype_quiescn_ecpp=3
	integer, parameter :: mtype_upempty_ecpp=-1
	integer, parameter :: mtype_dnempty_ecpp=-2
	integer, parameter :: mtype_quempty_ecpp=-3

! these are possible values for mtype_clrcldy_ecpp_3d & ..._clm3d & ..._clm3d & ..._clm
	integer, parameter :: mtype_iscloud_ecpp=11
	integer, parameter :: mtype_nocloud_ecpp=0

! these are possible values for mtype_precip_ecpp_3d & ..._clm3d & ..._clm3d & ..._clm
	integer, parameter :: mtype_isprecip_ecpp=21
	integer, parameter :: mtype_noprecip_ecpp=0


! this flag determines whether updraft & dndraft profiles are calculated
! using the "primed" mass fluxes or "full" mass fluxes
	integer, save :: ppopt_updn_prof_aa
! these are possible values for the flag
	integer, parameter :: ppopt_updn_prof_aa_wfull=2001
	integer, parameter :: ppopt_updn_prof_aa_wprime=2002


! this flag determines whether quiescent subarea mass fluxes are
! provided by the host or calculated in the ppm
	integer, save :: ppopt_quiescn_mf
	integer, parameter :: ppopt_quiescn_mf_byhost=2101
! these are possible values for the flag
	integer, parameter :: ppopt_quiescn_mf_byppmx1=2101


! this flag determines how the quiescent subarea mixing ratios
! are obtained for source-sink calculations
	integer, save :: ppopt_quiescn_sosi
! these are possible values for the flag
! 2201 -- qe = qbar
	integer, parameter :: ppopt_quiescn_sosi_x1=2201
! 2202 -- ae*qe = max( 0.0, (qbar-au*qu-ad*qd) )
	integer, parameter :: ppopt_quiescn_sosi_x2=2202


! this flag determines how the subgrid vertical fluxes (and the
! finite differencing for flux divergence) is calculated
	integer, save :: ppopt_chemtend_wq
! these are possible values for the flag
! 2301 -- vertflux = mu*qu + md*qd - (mu+md)*qbar; 
!         upstream approach for qbar at layer boundaries
	integer, parameter :: ppopt_chemtend_wq_wfullx1=2301
! 2302 -- vertflux = mu'*qu + md'*qd - (mu'+md')*qbar; 
!         upstream approach for qbar at layer boundaries
	integer, parameter :: ppopt_chemtend_wq_wprimex1=2302


! this flag determines how the sub-time-step for integrating the
! d(qbar)/dt equation is determined
! (use sub-timesteps to keep courant number < 1 and 
!  avoid negative mixing ratios)
	integer, save :: ppopt_chemtend_dtsub
! these are possible values for the flag
	integer, parameter :: ppopt_chemtend_dtsub_x1=2401
! 2401 -- dumcournomax = max( dumcourentmax, dumcouroutbmax )
	integer, parameter :: ppopt_chemtend_dtsub_x2=2402
! 2402 -- dumcournomax = max( dumcourentmax, dumcouroutamax, 
!                                            dumcouroutbmax )
	integer, parameter :: ppopt_chemtend_dtsub_x3=2403
! 2403 -- dtstep_sub = largest value that does not produce
!         negative mixing ratios


! this flag determines how frequently xxx
! is called to calculate up & dndraft profiles and source/sinks
	integer, save :: ppopt_chemtend_updnfreq
! these are possible values for the flag
	integer, parameter :: ppopt_chemtend_updnfreq_x1=2501
! 2501 -- called just once, when istep_sub=1
	integer, parameter :: ppopt_chemtend_updnfreq_x2=2502
! 2502 -- called for each istep_sub


	integer, parameter :: lunout = 0


! index of quiescent transport class
	integer, parameter :: jcls_quiescn = 1
	integer, parameter :: jcls_qu = jcls_quiescn


! subarea-average vertical mass fluxes (kg/m2/s) smaller than this 
!    are treated as zero
! largest expected flux is ~1 (rho=1, w=10, afrac=0.1)
!    so could expect truncation errors between 1e-7 and 1e-6
	real(r8), parameter :: mf_smallaa = 1.0e-6_r8


! subarea-average vertical mass fluxes (kg/m2/s) smaller than
!    aw_draft_cut*rho are treated as zero
! note that with a*w = 1e-4 m/s, dz over 1 day = 8.6 m which
!    is small
!	real(r8), parameter :: aw_draft_cut = 1.0e-4_r8   ! m/s
!! maximum expected updraft
!	real(r8), parameter :: w_draft_max = 50.0_r8   ! m/s
!! fractional areas below afrac_cut are ignored
!	real(r8), parameter :: afrac_cut = aw_draft_cut/w_draft_max
!	real(r8), parameter :: afrac_cut_bb  = afrac_cut*0.5_r8
!	real(r8), parameter :: afrac_cut_0p5 = afrac_cut*0.5_r8
!	real(r8), parameter :: afrac_cut_0p2 = afrac_cut*0.2_r8
!	real(r8), parameter :: afrac_cut_0p1 = afrac_cut*0.1_r8

	real(r8), save :: aw_draft_cut = 1.0e-4_r8   ! m/s
! maximum expected updraft
	real(r8), save :: w_draft_max = 50.0_r8   ! m/s
! fractional areas below afrac_cut are ignored
	real(r8), save :: afrac_cut
	real(r8), save :: afrac_cut_bb, afrac_cut_0p5, afrac_cut_0p2, afrac_cut_0p1


! draft lifetime (s)
	real(r8), save :: draft_lifetime

! activat_onoff_ecpp - if positive, do aerosol activation in ecpp
! (set to +1 for normal runs)
	integer, save :: activat_onoff_ecpp

! cldchem_onoff_ecpp - if positive, do aerosol activation in ecpp
! (set to +1 for normal runs)
	integer, save :: cldchem_onoff_ecpp

! rename_onoff_ecpp - if positive, do aerosol activation in ecpp
! (set to +1 for normal runs)
        integer, save :: rename_onoff_ecpp

! wetscav_onoff_ecpp - if positive, do aerosol activation in ecpp
! (set to +1 for normal runs)
	integer, save :: wetscav_onoff_ecpp

!   iflag_ecpp_startup_acw_partition - when positive, do 
!	"special partitioning" of cloudborne and interstitial aerosol to
!	clear and cloudy subareas (cloudy gets less interstitial than clear)
!	in subr parampollu_tdx_startup
!   for normal runs, set this to +1
	integer, save :: iflag_ecpp_startup_acw_partition

!   iflag_ecpp_startup_host_chemtend - when positive, apply
!	host changes to chem mixing ratios (e.g., emissions, gas chem)
!	in subr parampollu_tdx_startup
!   for normal runs, set this to +1
	integer, save :: iflag_ecpp_startup_host_chemtend

!   iflag_ecpp_test_bypass_1 used for early testing -
!	when positive, bypass the parampollu_td--- routine
!   for normal runs, set this to 0
	integer, save :: iflag_ecpp_test_bypass_1

!   iflag_ecpp_test_fixed_fcloud used for (early) testing with various fixed cloud fracs
!   for normal runs, set this to zero
	integer, save :: iflag_ecpp_test_fixed_fcloud

! "method" flag for parameterized-pollutants module
! (set to +2223 for normal runs and in mmf)
	integer, save :: parampollu_opt

! minimum fractional area for total quiescent class   
        real(r8), save :: a_quiescn_minaa = 0.60_r8  ! min area for initial total quiescent
        real(r8), save :: a_quiescn_minbb = 0.30_r8  ! min area for final   total quiescent


	integer, save :: num_chem_ecpp, param_first_ecpp
        
        integer, save :: num_chem
        integer, save :: p_qc
        integer, save :: p_qv

        integer, save :: p_num_a01, p_num_cw01, p_oin_a01, p_oin_cw01, &
                p_num_a03, p_num_cw03, p_oin_a03, p_oin_cw03

! time step for the ECPP
! It is fixed to be 1800 s. The GCM time step can be less than 1800s. 
! For example, if GCM time step is 600s, ECPP will be called at every third GCM time step
        real(r8), parameter :: dtstep_pp_input =  1800.0_r8            

	end module module_data_ecpp1

