diff --git a/README.md b/README.md index 7ea83453..5144e059 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,13 @@ Current Canopy-App components: ## Outputs +Namelist Option : `file_out` Prefix string (e.g., `'test'`) used to name output file (Output is 1D txt when using input 1D data (i.e., `infmt_opt=1`), or is 2D NetCDF output when 2D NetCDF input is used (i.e., `infmt_opt=0`)). + +Current 3D fields include canopy winds (`canwind`), canopy vertical/eddy diffusivity values `kz`), biogenic emissions (see Table 1 below), +canopy photolysis attenuation correction factors (`rjcf`), and derived Leaf Area Density (`lad`) from the foliage shape function. + +Current 2D fields includes the Wind Adjustment Factor (`waf`), flame heights (`flameh`), and canopy heights (`canheight`). Current 1D fields include the canopy model interface levels (`z`). + **Note for Biogenic emissions:** When `ifcanbio=.TRUE.`, output will include 3D canopy resolved biogenic emissions for the following species (based on Guenther et al., 2012), which have been mapped from Guenther et al. PFTs to input LU_OPT. ### Table 1. Canopy-App Biogenic Emissions Output Variables @@ -111,11 +118,6 @@ Current Canopy-App components: | `emi_svoc` | Stress VOC emissions (15 compounds, Table 1 Guenther et al. (2012) | 18 | | `emi_ovoc` | Other VOC emissions (49 compounds, Table 1 Guenther et al. (2012) | 19 | -**Current Canopy-App Output:** As discussed above, the current Canopy-App optional outputs includes 3D canopy winds (`canwind`), canopy vertical/eddy diffusivity values `kz`), biogenic emissions (see Table 1), and -canopy photolysis attenuation correction factors (`rjcf`), and derived Leaf Area Density (`lad`) from the foliage shape function. Current 2D fields includes the Wind Adjustment Factor (`waf`), flame heights (`flameh`), and canopy heights (`canheight`). Current 1D fields include the canopy model interface levels (`z`). - -Namelist Option : `file_out` Prefix string (e.g., `'test'`) used to name output file (Output is 1D txt when using input 1D data (i.e., `infmt_opt=1`), or is 2D NetCDF output when 2D NetCDF input is used (i.e., `infmt_opt=0`)). - ## Inputs and Settings **Current Canopy-App Input:** Typical 1D or 2D (time=1,lat,lon) gridded atmospheric model input variables in 1st layer above canopy. Some 3D inputs are supported (see `var3d_opt` in [Table 3](#table-3-current-user-namelist-options) and associated options). @@ -170,7 +172,7 @@ The Canopy-App input data in [Table 2](#table-2-canopy-app-required-input-variab | `csz` | Cosine of the solar zenith angle (dimensionless) | [Based on Python Pysolar](https://pysolar.readthedocs.io/en/latest/) | | `mol` | Monin-Obukhov Length (m) | Externally calculated using GFS `tmp2m`, `fricv`, and `shtfl`. ([Essa, 1999](https://inis.iaea.org/collection/NCLCollectionStore/_Public/37/118/37118528.pdf)) | | `href` | Reference height above canopy (m) - 10 m | Assumed constant (i.e., 10 m). Can be taken from NL. | -| `ozone_w126` | Ozone W126 index (ppm-hours) | Climatological value during 04/2021-04/2024 based on GFSv16 lowest model layer ozone mixing ratios. | +| `ozone_w126` | Ozone W126 index (ppm-hours) | A three year climatological calculation between 04/2021-04/2024, based on GFSv16 lowest model layer ozone mixing ratios. The W126 calculation is based on the [EPA definition](https://www.epa.gov/sites/default/files/2015-09/documents/w126_steps_to_calculate_revised_feb19.pdf). | **More Information on Data Sources from [Table 2](#table-2-canopy-app-required-input-variables):** @@ -282,6 +284,12 @@ Otherwise, please contact Patrick.C.Campbell@noaa.gov for other GFSv16 data peri | `hist_opt` | user-set option to use historically averaged short-term (24-hr) and long-term (240-hr) rolling averages for leaf temperature and PAR for biogenic emissions (default is off i.e., `hist_opt=0`) Note: If simulation is 2.0.CO;2). (default is off i.e., `soim_opt=1`, the corresponding $\gamma$ is set to 1). If turned on (`soim_opt=0`), which is recommended, soim $\gamma$ is calculated and the prescribed 4-layer soil depths (`soild[1-4]` below) are used. Four layers are assumed, and are based on GFS Noah and Noah-MP LSM. | | `soild[1-4]` | user-set real values of four level soil depths at centerpoint (cm). Four layers are based on the GFS Noah and Noah-MP LSM, default values are `soild1=5.0`, `soild2=25.0`, `soild3=70.0`, and `soild4=150.0`. | +| `aq_opt` | user-set options for applying an air quality stress factor for biogenic emissions using calculated, spatially-dependent and global GFS-based ozone W126 values (= `0`) or a constant user-set W126 value (= `1`). To turn off aq stress factor set `aq_opt=2` (set as default, Off). Note: The aq_opt should only be turned on during simulations across respective ozone season for specific region (e.g., April-October in the U.S.)| +| `w126_set` | user-set real value of constant ozone W126 values (ppm-hours) (only used if `aq_opt=1`) | +| `ht_opt` | user-set options for applying a daily high temperature stress factor for biogenic emissions using daily maximum 2-meter input temperature (= `0`). This is based on MEGAN3 and it is recommended that this option is only used when turning the historical option on (i.e., `hist_opt=1`) and running longer than 1-day simulations to obtain the daily max. To turn off ht stress factor set `ht_opt=1` (set as default, Off) | +| `lt_opt` | user-set options for applying a daily low temperature stress factor for biogenic emissions using daily minimum 2-meter input temperature (= `0`). This is based on MEGAN3 and it is recommended that this option is only used when turning the historical option on (i.e., `hist_opt=1`) and running longer than 1-day simulations to obtain the daily min. To turn off lt stress factor set `lt_opt=1` (set as default, Off) | +| `hw_opt` | user-set options for applying a daily high wind speed stress factor for biogenic emissions using daily maximum 10-meter input wind speed (= `0`). This is based on MEGAN3 and it is recommended that this option is only used when turning the historical option on (i.e., `hist_opt=1`) and running longer than 1-day simulations to obtain the daily max. To turn off hw stress factor set `hw_opt=1` (set as default, Off) | + **\*\*** If `modres` >> `flameh` then some error in WAF calculation will be incurred. Suggestion is to use relative fine `modres` (at least <= 0.5 m) compared to average flame heights (e.g., ~ 1.0 m) if WAF is required. diff --git a/input/namelist.canopy b/input/namelist.canopy index f68c5b10..34475ce5 100755 --- a/input/namelist.canopy +++ b/input/namelist.canopy @@ -83,5 +83,10 @@ soild2 = 25.0 soild3 = 70.0 soild4 = 150.0 + aq_opt = 2 + w126_set = 30.0 hist_opt = 1 + ht_opt = 1 + lt_opt = 1 + hw_opt = 1 / diff --git a/src/canopy_alloc.F90 b/src/canopy_alloc.F90 index 240dea7e..32dc1d4b 100644 --- a/src/canopy_alloc.F90 +++ b/src/canopy_alloc.F90 @@ -67,6 +67,12 @@ SUBROUTINE canopy_alloc if(.not.allocated(ppfd_sun240)) allocate(ppfd_sun240(nlat*nlon,modlays)) if(.not.allocated(ppfd_shade240)) allocate(ppfd_shade240(nlat*nlon,modlays)) + if(.not.allocated(tmp2mref_tmp)) allocate(tmp2mref_tmp(ntime,nlat*nlon)) + if(.not.allocated(ubzref_tmp)) allocate(ubzref_tmp(ntime,nlat*nlon)) + if(.not.allocated(daily_maxt2m)) allocate(daily_maxt2m(nlat*nlon)) + if(.not.allocated(daily_mint2m)) allocate(daily_mint2m(nlat*nlon)) + if(.not.allocated(daily_maxws10m)) allocate(daily_maxws10m(nlat*nlon)) + if(.not.allocated(tleaf_sun24_tmp_3d)) allocate(tleaf_sun24_tmp_3d(ntime,nlon,nlat,modlays)) if(.not.allocated(tleaf_shade24_tmp_3d)) allocate(tleaf_shade24_tmp_3d(ntime,nlon,nlat,modlays)) if(.not.allocated(tleaf_ave24_tmp_3d)) allocate(tleaf_ave24_tmp_3d(ntime,nlon,nlat,modlays)) @@ -88,6 +94,12 @@ SUBROUTINE canopy_alloc if(.not.allocated(ppfd_sun240_3d)) allocate(ppfd_sun240_3d(nlon,nlat,modlays)) if(.not.allocated(ppfd_shade240_3d)) allocate(ppfd_shade240_3d(nlon,nlat,modlays)) + if(.not.allocated(tmp2mref_tmp_3d)) allocate(tmp2mref_tmp_3d(ntime,nlon,nlat)) + if(.not.allocated(ubzref_tmp_3d)) allocate(ubzref_tmp_3d(ntime,nlon,nlat)) + if(.not.allocated(daily_maxt2m_2d)) allocate(daily_maxt2m_2d(nlon,nlat)) + if(.not.allocated(daily_mint2m_2d)) allocate(daily_mint2m_2d(nlon,nlat)) + if(.not.allocated(daily_maxws10m_2d)) allocate(daily_maxws10m_2d(nlon,nlat)) + !------------------------------------------------------------------------------- ! Allocate arrays for Canopy Wind Outputs !------------------------------------------------------------------------------- diff --git a/src/canopy_bioemi_mod.F90 b/src/canopy_bioemi_mod.F90 index 241123be..8ec43e2e 100644 --- a/src/canopy_bioemi_mod.F90 +++ b/src/canopy_bioemi_mod.F90 @@ -14,7 +14,9 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & LEAFAGEOPT, PASTLAI, CURRENTLAI, TSTEPLAI, & LOSSOPT, LOSSSET, LOSSIND, LIFETIME, USTAR, & SOIMOPT, SOIM1, SOIM2, SOIM3, SOIM4, SOID1, SOID2, SOID3, & - SOID4, WILT, & + SOID4, WILT, AQOPT, W126_SET, W126_REF, & + HTOPT, LTOPT, HWOPT, DAILY_MAXT2, DAILY_MINT2, & + DAILY_MAXWS10, & MODLAYS, EMI_IND, EMI_OUT) !----------------------------------------------------------------------- @@ -47,7 +49,8 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & use canopy_const_mod, ONLY: rk,rgasuniv !constants for canopy models use canopy_utils_mod, ONLY: interp_linear1_internal, & GET_GAMMA_CO2,GET_GAMMA_LEAFAGE, & - GET_GAMMA_SOIM, GET_CANLOSS_BIO + GET_GAMMA_SOIM, GET_GAMMA_AQ, GET_GAMMA_HT, & + GET_GAMMA_LT, GET_GAMMA_HW, GET_CANLOSS_BIO use canopy_bioparm_mod use canopy_tleaf_mod @@ -88,6 +91,15 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & REAL(RK), INTENT( IN ) :: SOID3 ! Soil depth layer 3 [cm] REAL(RK), INTENT( IN ) :: SOID4 ! Soil depth layer 4 [cm] REAL(RK), INTENT( IN ) :: WILT ! Wilting point [proportion] + INTEGER, INTENT( IN ) :: AQOPT ! Option for aq stress calculation + REAL(RK), INTENT( IN ) :: W126_SET ! User set ozone W126 [ppm-hours] + REAL(RK), INTENT( IN ) :: W126_REF ! GFS calculated, ozone W126 [ppm-hours] + INTEGER, INTENT( IN ) :: HTOPT ! Option for high temperature stress calculation + INTEGER, INTENT( IN ) :: LTOPT ! Option for low temperature stress calculation + INTEGER, INTENT( IN ) :: HWOPT ! Option for high wind speed stress calculation + REAL(RK), INTENT( IN ) :: DAILY_MAXT2 ! Daily maximum model input 2-m temperature (K) + REAL(RK), INTENT( IN ) :: DAILY_MINT2 ! Daily minimum model input 2-m temperature (K) + REAL(RK), INTENT( IN ) :: DAILY_MAXWS10 ! Daily maximum model input 10-m wind speed temperature (m/s) INTEGER, INTENT( IN ) :: LEAFAGEOPT ! leafage_opt (0= ON, 1= off i.e. GAMMALEAFAGE =1, in canopy_readnml.F90) REAL(RK), INTENT( IN ) :: PASTLAI ! Past LAI [cm2/cm2] @@ -137,15 +149,43 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & REAL(RK) :: AMAT REAL(RK) :: AOLD + !Coeff.'s and threshold/delta threshold for air quality stress factors from canopy_biop + REAL(RK) :: CAQ + REAL(RK) :: TAQ ![ppm-hours] + REAL(RK) :: DTAQ ![ppm-hours] + + !Coeff.'s and threshold/delta threshold for high temperature stress factors from canopy_biop + REAL(RK) :: CHT + REAL(RK) :: THT ![K] + REAL(RK) :: DTHT ![K] + + !Coeff.'s and threshold/delta threshold for low temperature stress factors from canopy_biop + REAL(RK) :: CLT + REAL(RK) :: TLT ![K] + REAL(RK) :: DTLT ![K] + + !Coeff.'s and threshold/delta threshold for high wind stress factors from canopy_biop + REAL(RK) :: CHW + REAL(RK) :: THW ![m/s] + REAL(RK) :: DTHW ![m/s] + + ! Coefficients A and B used for PFT dependent cumulative root depth fraction REAL(RK) :: ROOTA ! [m-1] REAL(RK) :: ROOTB ! [m-1] REAL(RK) :: GAMMASOIM ! Soil moisture factor + REAL(RK) :: GAMMAAQ !Air quality stress factor + REAL(RK) :: GAMMAHT !High temperature stress factor + REAL(RK) :: GAMMALT !Low temperature stress factor + REAL(RK) :: GAMMAHW !High wind speed stress factor + REAL(RK) :: GAMMACO2 ! CO2 inhibition factor (isoprene only) REAL(RK) :: GAMMALEAFAGE !(SIZE(ZK)) ! LEAF AGE factor + REAL(RK) :: CANLOSS_FAC !Canopy loss factor for summing option + integer i, LAYERS ! Constant Canopy Parameters @@ -157,8 +197,12 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & TLEAF_OPT = 313.0_rk + (0.6_rk * (TLEAF240_AVE-297.0_rk)) !Guenther et al. (2012) ! Calculate emission species/plant-dependent mapped emission factors and other important coefficients for gamma terms - call canopy_biop(EMI_IND, LU_OPT, VTYPE, EF, CT1, CEO, ANEW, AGRO, AMAT, AOLD, ROOTA, ROOTB) + call canopy_biop(EMI_IND, LU_OPT, VTYPE, EF, CT1, CEO, ANEW, AGRO, AMAT, AOLD, ROOTA, ROOTB, CAQ, TAQ, DTAQ, & + CHT, THT, DTHT, CLT, TLT, DTLT, CHW, THW, DTHW) +! print*,'CHT=',CHT,'THT=',THT,'DTHT=',DTHT +! print*,'CLT=',CLT,'TLT=',TLT,'DTLT=',DTLT +! print*,'CHW=',CHW,'THW=',THW,'DTHW=',DTHW E_OPT = CEO * EXP(0.05_rk * (TLEAF24_AVE-297.0_rk)) * EXP(0.05_rk * (TLEAF240_AVE-297.0_rk)) ! Calculate gamma (activity) values for average Tleaf (Clifton et al., 2022; based on Guenther et al. 2012) @@ -205,6 +249,18 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & GAMMALEAFAGE = GET_GAMMA_LEAFAGE(LEAFAGEOPT, PASTLAI, CURRENTLAI, TSTEPLAI, TABOVECANOPY, ANEW, AGRO, AMAT, AOLD) !end do +! Get AQ Stress Factor + GAMMAAQ = GET_GAMMA_AQ(AQOPT, W126_REF, W126_SET, CAQ, TAQ, DTAQ) + +! Get HT Stress Factor + GAMMAHT = GET_GAMMA_HT(HTOPT, DAILY_MAXT2, CHT, THT, DTHT) + +! Get LT Stress Factor + GAMMALT = GET_GAMMA_LT(LTOPT, DAILY_MINT2, CLT, TLT, DTLT) + +! Get HW Stress Factor + GAMMAHW = GET_GAMMA_HW(HWOPT, DAILY_MAXWS10, CHW, THW, DTHW) + ! Get canopy loss factor (only used in vertical summing options and empirical formulation and parameters based on isoprene) ! Note: Allowed for other BVOCs but use caution when applying to compare with above canopy flux observations @@ -240,7 +296,7 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & FLAI(i) = FLAI(MODLAYS-1) end if EMI_OUT(i) = FLAI(i) * EF * GammaTLEAF_AVE(i) * GammaPPFD_AVE(i) * GAMMACO2 * CCE * & - GAMMALEAFAGE * GAMMASOIM ! (ug m-3 hr-1) + GAMMALEAFAGE * GAMMASOIM * GAMMAAQ * GAMMAHT * GAMMALT * GAMMAHW ! (ug m-3 hr-1) EMI_OUT(i) = EMI_OUT(i) * 2.7777777777778E-13_rk !convert emissions output to (kg m-3 s-1) end if end do @@ -264,7 +320,8 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & end if end do EMI_OUT(SIZE(ZK)) = LAI * EF * SUM(GammaTLEAF_AVE(1:LAYERS) * GammaPPFD_AVE(1:LAYERS) * & - VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) + VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * & + GAMMAAQ * GAMMAHT * GAMMALT * GAMMAHW * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) EMI_OUT = EMI_OUT * 2.7777777777778E-13_rk !convert emissions output to (kg m-2 s-1) else if (VERT .eq. 2) then !"MEGANv3-like": Add weighted sum of activity coefficients using normal distribution !across canopy layers using 5 layer numbers directly from MEGANv3 @@ -296,7 +353,8 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & VPGWT(i) = GAUSS(i)/sum(GAUSS(1:LAYERS)) end do EMI_OUT(SIZE(ZK)) = LAI * EF * SUM(GammaTLEAF_AVE(1:LAYERS) * GammaPPFD_AVE(1:LAYERS) * & - VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) + VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * & + GAMMAAQ * GAMMAHT * GAMMALT * GAMMAHW * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) EMI_OUT = EMI_OUT * 2.7777777777778E-13_rk !convert emissions output to (kg m-2 s-1) else if (VERT .eq. 3) then !"MEGANv3-like": Add weighted sum of activity coefficients equally !across canopy layers @@ -307,7 +365,8 @@ SUBROUTINE CANOPY_BIO( ZK, FCLAI, FCH, LAI, FSUN, & VPGWT(i) = 1.0_rk/LAYERS end do EMI_OUT(SIZE(ZK)) = LAI * EF * SUM(GammaTLEAF_AVE(1:LAYERS) * GammaPPFD_AVE(1:LAYERS) * & - VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) + VPGWT(1:LAYERS)) * GAMMACO2 * CCE * GAMMALEAFAGE * GAMMASOIM * & + GAMMAAQ * GAMMAHT * GAMMALT * GAMMAHW * CANLOSS_FAC !put into top model layer (ug m-2 hr-1) EMI_OUT = EMI_OUT * 2.7777777777778E-13_rk !convert emissions output to (kg m-2 s-1) else write(*,*) 'Wrong BIOVERT_OPT choice of ', VERT, ' in namelist...exiting' diff --git a/src/canopy_bioparm_mod.F90 b/src/canopy_bioparm_mod.F90 index e09a377f..e5bde7bf 100644 --- a/src/canopy_bioparm_mod.F90 +++ b/src/canopy_bioparm_mod.F90 @@ -6,7 +6,9 @@ module canopy_bioparm_mod !::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & - EF, CT1, CEO, ANEW, AGRO, AMAT, AOLD, ROOTA, ROOTB) + EF, CT1, CEO, ANEW, AGRO, AMAT, AOLD, ROOTA, ROOTB, & + CAQ, TAQ, DTAQ, CHT, THT, DTHT, CLT, TLT, DTLT, & + CHW, THW, DTHW) !----------------------------------------------------------------------- @@ -43,6 +45,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & REAL(RK), INTENT( OUT ) :: CEO ! Out Empirical coefficient REAL(RK), INTENT( OUT ) :: ANEW, AGRO, AMAT, AOLD !Empirical factors or coefficients for: growing, mature, and old/senescing foliage, as per Table 4 of Guenther et al., 2012 REAL(RK), INTENT( OUT ) :: ROOTA, ROOTB ! Coefficients A and B used for PFT dependent cumulative root depth fraction [m-1] + REAL(RK), INTENT( OUT ) :: CAQ ! coefficient for poor Air Quality stress + REAL(RK), INTENT( OUT ) :: TAQ ! threshold for poor Air Quality stress (ppm-hours) + REAL(RK), INTENT( OUT ) :: DTAQ ! delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), INTENT( OUT ) :: CHT ! coefficient for high temperature stress + REAL(RK), INTENT( OUT ) :: THT ! threshold for high temperature stress (K) + REAL(RK), INTENT( OUT ) :: DTHT ! delta threshold high temperature stress (K) + REAL(RK), INTENT( OUT ) :: CLT ! coefficient for low temperature stress + REAL(RK), INTENT( OUT ) :: TLT ! threshold for low temperature stress (K) + REAL(RK), INTENT( OUT ) :: DTLT ! delta threshold low temperature stress (K) + REAL(RK), INTENT( OUT ) :: CHW ! coefficient for high wind stress + REAL(RK), INTENT( OUT ) :: THW ! threshold for high wind stress (m/s) + REAL(RK), INTENT( OUT ) :: DTHW ! delta threshold high wind stress (m/s) ! LOCAL REAL(RK) :: EF1,EF2,EF3,EF4,EF5,EF6,EF7 ! Plant Emission factors (EF) (ug/m2 hr) @@ -496,45 +510,288 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & ! Species-Dependent Parameterized Canopy Model Parameters (Table 4 of Guenther et al., 2012) REAL(RK), PARAMETER :: CT1_ISOP = 95.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_ISOP = 2.0_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_ISOP = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_ISOP = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_ISOP = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_ISOP = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_ISOP = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_ISOP = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_ISOP = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_ISOP = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_ISOP = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_ISOP = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_ISOP = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_ISOP = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_MYRC = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_MYRC = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_MYRC = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_MYRC = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_MYRC = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_MYRC = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_MYRC = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_MYRC = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_MYRC = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_MYRC = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_MYRC = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_MYRC = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_MYRC = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_MYRC = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_SABI = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_SABI = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_SABI = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_SABI = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_SABI = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_SABI = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_SABI = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_SABI = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_SABI = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_SABI = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_SABI = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_SABI = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_SABI = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_SABI = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_LIMO = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_LIMO = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_LIMO = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_LIMO = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_LIMO = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_LIMO = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_LIMO = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_LIMO = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_LIMO = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_LIMO = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_LIMO = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_LIMO = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_LIMO = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_LIMO = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_CARE = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_CARE = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_CARE = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_CARE = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_CARE = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_CARE = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_CARE = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_CARE = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_CARE = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_CARE = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_CARE = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_CARE = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_CARE = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_CARE = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_OCIM = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_OCIM = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_OCIM = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_OCIM = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_OCIM = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_OCIM = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_OCIM = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_OCIM = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_OCIM = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_OCIM = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_OCIM = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_OCIM = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_OCIM = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_OCIM = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_BPIN = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_BPIN = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_BPIN = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_BPIN = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_BPIN = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_BPIN = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_BPIN = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_BPIN = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_BPIN = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_BPIN = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_BPIN = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_BPIN = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_BPIN = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_BPIN = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_APIN = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_APIN = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_APIN = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_APIN = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_APIN = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_APIN = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_APIN = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_APIN = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_APIN = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_APIN = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_APIN = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_APIN = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_APIN = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_APIN = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_MONO = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_MONO = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_MONO = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_MONO = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_MONO = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_MONO = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_MONO = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_MONO = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_MONO = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_MONO = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_MONO = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_MONO = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_MONO = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_MONO = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_FARN = 130.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_FARN = 2.37_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_FARN = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_FARN = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_FARN = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_FARN = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_FARN = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_FARN = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_FARN = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_FARN = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_FARN = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_FARN = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_FARN = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_FARN = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_CARY = 130.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_CARY = 2.37_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_CARY = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_CARY = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_CARY = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_CARY = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_CARY = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_CARY = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_CARY = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_CARY = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_CARY = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_CARY = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_CARY = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_CARY = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_SESQ = 130.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_SESQ = 2.37_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_SESQ = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_SESQ = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_SESQ = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_SESQ = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_SESQ = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_SESQ = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_SESQ = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_SESQ = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_SESQ = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_SESQ = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_SESQ = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_SESQ = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_MBOL = 95.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_MBOL = 2.0_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_MBOL = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_MBOL = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_MBOL = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_MBOL = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_MBOL = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_MBOL = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_MBOL = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_MBOL = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_MBOL = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_MBOL = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_MBOL = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_MBOL = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_METH = 60.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_METH = 1.6_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_METH = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_METH = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_METH = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_METH = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_METH = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_METH = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_METH = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_METH = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_METH = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_METH = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_METH = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_METH = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_ACET = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_ACET = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_ACET = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_ACET = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_ACET = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_ACET = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_ACET = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_ACET = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_ACET = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_ACET = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_ACET = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_ACET = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_ACET = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_ACET = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_CO = 60.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_CO = 1.6_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_CO = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_CO = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_CO = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_CO = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_CO = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_CO = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_CO = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_CO = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_CO = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_CO = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_CO = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_CO = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_BVOC = 95.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_BVOC = 2.0_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_BVOC = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_BVOC = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_BVOC = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_BVOC = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_BVOC = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_BVOC = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_BVOC = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_BVOC = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_BVOC = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_BVOC = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_BVOC = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_BVOC = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_SVOC = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_SVOC = 1.83_rk !Empirical coefficient + REAL(RK), PARAMETER :: CAQ_SVOC = 5.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_SVOC = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_SVOC = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_SVOC = 5.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_SVOC = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_SVOC = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_SVOC = 5.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_SVOC = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_SVOC = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_SVOC = 5.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_SVOC = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_SVOC = 8.0_rk !delta threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: CT1_OVOC = 80.0_rk !Activation energy (kJ/mol) REAL(RK), PARAMETER :: CEO_OVOC = 1.83_rk !Empirical coefficient - - - + REAL(RK), PARAMETER :: CAQ_OVOC = 1.0_rk !coefficient for poor Air Quality stress + REAL(RK), PARAMETER :: TAQ_OVOC = 20.0_rk !threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: DTAQ_OVOC = 30.0_rk !delta threshold for poor Air Quality stress (ppm-hours) + REAL(RK), PARAMETER :: CHT_OVOC = 1.0_rk !coefficient for high temperature stress + REAL(RK), PARAMETER :: THT_OVOC = 313.15_rk !threshold for high temperature stress (K) + REAL(RK), PARAMETER :: DTHT_OVOC = 8.0_rk !delta threshold for high temperature stress (K) + REAL(RK), PARAMETER :: CLT_OVOC = 1.0_rk !coefficient for low temperature stress + REAL(RK), PARAMETER :: TLT_OVOC = 283.15_rk !threshold for low temperature stress (K) + REAL(RK), PARAMETER :: DTLT_OVOC = 8.0_rk !delta threshold for low temperature stress (K) + REAL(RK), PARAMETER :: CHW_OVOC = 1.0_rk !coefficient for high wind stress + REAL(RK), PARAMETER :: THW_OVOC = 12.0_rk !threshold for high wind stress (m/s) + REAL(RK), PARAMETER :: DTHW_OVOC = 8.0_rk !delta threshold for high wind stress (m/s) ! Set tree and species dependent coefficients if (EMI_IND .eq. 1 ) then @@ -559,6 +816,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_ISOP AMAT = AMAT_ISOP AOLD = AOLD_ISOP + CAQ = CAQ_ISOP + TAQ = TAQ_ISOP + DTAQ = DTAQ_ISOP + CHT = CHT_ISOP + THT = THT_ISOP + DTHT = DTHT_ISOP + CLT = CLT_ISOP + TLT = TLT_ISOP + DTLT = DTLT_ISOP + CHW = CHW_ISOP + THW = THW_ISOP + DTHW = DTHW_ISOP else if (EMI_IND .eq. 2 ) then CT1 = CT1_MYRC CEO = CEO_MYRC @@ -581,6 +850,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_MYRC AMAT = AMAT_MYRC AOLD = AOLD_MYRC + CAQ = CAQ_MYRC + TAQ = TAQ_MYRC + DTAQ = DTAQ_MYRC + CHT = CHT_MYRC + THT = THT_MYRC + DTHT = DTHT_MYRC + CLT = CLT_MYRC + TLT = TLT_MYRC + DTLT = DTLT_MYRC + CHW = CHW_MYRC + THW = THW_MYRC + DTHW = DTHW_MYRC else if (EMI_IND .eq. 3 ) then CT1 = CT1_SABI CEO = CEO_SABI @@ -603,6 +884,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_SABI AMAT = AMAT_SABI AOLD = AOLD_SABI + CAQ = CAQ_SABI + TAQ = TAQ_SABI + DTAQ = DTAQ_SABI + CHT = CHT_SABI + THT = THT_SABI + DTHT = DTHT_SABI + CLT = CLT_SABI + TLT = TLT_SABI + DTLT = DTLT_SABI + CHW = CHW_SABI + THW = THW_SABI + DTHW = DTHW_SABI else if (EMI_IND .eq. 4 ) then CT1 = CT1_LIMO CEO = CEO_LIMO @@ -625,6 +918,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_LIMO AMAT = AMAT_LIMO AOLD = AOLD_LIMO + CAQ = CAQ_LIMO + TAQ = TAQ_LIMO + DTAQ = DTAQ_LIMO + CHT = CHT_LIMO + THT = THT_LIMO + DTHT = DTHT_LIMO + CLT = CLT_LIMO + TLT = TLT_LIMO + DTLT = DTLT_LIMO + CHW = CHW_LIMO + THW = THW_LIMO + DTHW = DTHW_LIMO else if (EMI_IND .eq. 5 ) then CT1 = CT1_CARE CEO = CEO_CARE @@ -647,6 +952,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_CARE AMAT = AMAT_CARE AOLD = AOLD_CARE + CAQ = CAQ_CARE + TAQ = TAQ_CARE + DTAQ = DTAQ_CARE + CHT = CHT_CARE + THT = THT_CARE + DTHT = DTHT_CARE + CLT = CLT_CARE + TLT = TLT_CARE + DTLT = DTLT_CARE + CHW = CHW_CARE + THW = THW_CARE + DTHW = DTHW_CARE else if (EMI_IND .eq. 6 ) then CT1 = CT1_OCIM CEO = CEO_OCIM @@ -669,6 +986,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_OCIM AMAT = AMAT_OCIM AOLD = AOLD_OCIM + CAQ = CAQ_OCIM + TAQ = TAQ_OCIM + DTAQ = DTAQ_OCIM + CHT = CHT_OCIM + THT = THT_OCIM + DTHT = DTHT_OCIM + CLT = CLT_OCIM + TLT = TLT_OCIM + DTLT = DTLT_OCIM + CHW = CHW_OCIM + THW = THW_OCIM + DTHW = DTHW_OCIM else if (EMI_IND .eq. 7 ) then CT1 = CT1_BPIN CEO = CEO_BPIN @@ -691,6 +1020,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_BPIN AMAT = AMAT_BPIN AOLD = AOLD_BPIN + CAQ = CAQ_BPIN + TAQ = TAQ_BPIN + DTAQ = DTAQ_BPIN + CHT = CHT_BPIN + THT = THT_BPIN + DTHT = DTHT_BPIN + CLT = CLT_BPIN + TLT = TLT_BPIN + DTLT = DTLT_BPIN + CHW = CHW_BPIN + THW = THW_BPIN + DTHW = DTHW_BPIN else if (EMI_IND .eq. 8 ) then CT1 = CT1_APIN CEO = CEO_APIN @@ -713,6 +1054,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_APIN AMAT = AMAT_APIN AOLD = AOLD_APIN + CAQ = CAQ_APIN + TAQ = TAQ_APIN + DTAQ = DTAQ_APIN + CHT = CHT_APIN + THT = THT_APIN + DTHT = DTHT_APIN + CLT = CLT_APIN + TLT = TLT_APIN + DTLT = DTLT_APIN + CHW = CHW_APIN + THW = THW_APIN + DTHW = DTHW_APIN else if (EMI_IND .eq. 9 ) then CT1 = CT1_MONO CEO = CEO_MONO @@ -735,6 +1088,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_MONO AMAT = AMAT_MONO AOLD = AOLD_MONO + CAQ = CAQ_MONO + TAQ = TAQ_MONO + DTAQ = DTAQ_MONO + CHT = CHT_MONO + THT = THT_MONO + DTHT = DTHT_MONO + CLT = CLT_MONO + TLT = TLT_MONO + DTLT = DTLT_MONO + CHW = CHW_MONO + THW = THW_MONO + DTHW = DTHW_MONO else if (EMI_IND .eq. 10 ) then CT1 = CT1_FARN CEO = CEO_FARN @@ -757,6 +1122,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_FARN AMAT = AMAT_FARN AOLD = AOLD_FARN + CAQ = CAQ_FARN + TAQ = TAQ_FARN + DTAQ = DTAQ_FARN + CHT = CHT_FARN + THT = THT_FARN + DTHT = DTHT_FARN + CLT = CLT_FARN + TLT = TLT_FARN + DTLT = DTLT_FARN + CHW = CHW_FARN + THW = THW_FARN + DTHW = DTHW_FARN else if (EMI_IND .eq. 11 ) then CT1 = CT1_CARY CEO = CEO_CARY @@ -779,6 +1156,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_CARY AMAT = AMAT_CARY AOLD = AOLD_CARY + CAQ = CAQ_CARY + TAQ = TAQ_CARY + DTAQ = DTAQ_CARY + CHT = CHT_CARY + THT = THT_CARY + DTHT = DTHT_CARY + CLT = CLT_CARY + TLT = TLT_CARY + DTLT = DTLT_CARY + CHW = CHW_CARY + THW = THW_CARY + DTHW = DTHW_CARY else if (EMI_IND .eq. 12 ) then CT1 = CT1_SESQ CEO = CEO_SESQ @@ -801,6 +1190,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_SESQ AMAT = AMAT_SESQ AOLD = AOLD_SESQ + CAQ = CAQ_SESQ + TAQ = TAQ_SESQ + DTAQ = DTAQ_SESQ + CHT = CHT_SESQ + THT = THT_SESQ + DTHT = DTHT_SESQ + CLT = CLT_SESQ + TLT = TLT_SESQ + DTLT = DTLT_SESQ + CHW = CHW_SESQ + THW = THW_SESQ + DTHW = DTHW_SESQ else if (EMI_IND .eq. 13 ) then CT1 = CT1_MBOL CEO = CEO_MBOL @@ -823,6 +1224,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_MBOL AMAT = AMAT_MBOL AOLD = AOLD_MBOL + CAQ = CAQ_MBOL + TAQ = TAQ_MBOL + DTAQ = DTAQ_MBOL + CHT = CHT_MBOL + THT = THT_MBOL + DTHT = DTHT_MBOL + CLT = CLT_MBOL + TLT = TLT_MBOL + DTLT = DTLT_MBOL + CHW = CHW_MBOL + THW = THW_MBOL + DTHW = DTHW_MBOL else if (EMI_IND .eq. 14 ) then CT1 = CT1_METH CEO = CEO_METH @@ -845,6 +1258,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_METH AMAT = AMAT_METH AOLD = AOLD_METH + CAQ = CAQ_METH + TAQ = TAQ_METH + DTAQ = DTAQ_METH + CHT = CHT_METH + THT = THT_METH + DTHT = DTHT_METH + CLT = CLT_METH + TLT = TLT_METH + DTLT = DTLT_METH + CHW = CHW_METH + THW = THW_METH + DTHW = DTHW_METH else if (EMI_IND .eq. 15 ) then CT1 = CT1_ACET CEO = CEO_ACET @@ -867,6 +1292,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_ACET AMAT = AMAT_ACET AOLD = AOLD_ACET + CAQ = CAQ_ACET + TAQ = TAQ_ACET + DTAQ = DTAQ_ACET + CHT = CHT_ACET + THT = THT_ACET + DTHT = DTHT_ACET + CLT = CLT_ACET + TLT = TLT_ACET + DTLT = DTLT_ACET + CHW = CHW_ACET + THW = THW_ACET + DTHW = DTHW_ACET else if (EMI_IND .eq. 16 ) then CT1 = CT1_CO CEO = CEO_CO @@ -889,6 +1326,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_CO AMAT = AMAT_CO AOLD = AOLD_CO + CAQ = CAQ_CO + TAQ = TAQ_CO + DTAQ = DTAQ_CO + CHT = CHT_CO + THT = THT_CO + DTHT = DTHT_CO + CLT = CLT_CO + TLT = TLT_CO + DTLT = DTLT_CO + CHW = CHW_CO + THW = THW_CO + DTHW = DTHW_CO else if (EMI_IND .eq. 17 ) then CT1 = CT1_BVOC CEO = CEO_BVOC @@ -911,6 +1360,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_BVOC AMAT = AMAT_BVOC AOLD = AOLD_BVOC + CAQ = CAQ_BVOC + TAQ = TAQ_BVOC + DTAQ = DTAQ_BVOC + CHT = CHT_BVOC + THT = THT_BVOC + DTHT = DTHT_BVOC + CLT = CLT_BVOC + TLT = TLT_BVOC + DTLT = DTLT_BVOC + CHW = CHW_BVOC + THW = THW_BVOC + DTHW = DTHW_BVOC else if (EMI_IND .eq. 18 ) then CT1 = CT1_SVOC CEO = CEO_SVOC @@ -933,6 +1394,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_SVOC AMAT = AMAT_SVOC AOLD = AOLD_SVOC + CAQ = CAQ_SVOC + TAQ = TAQ_SVOC + DTAQ = DTAQ_SVOC + CHT = CHT_SVOC + THT = THT_SVOC + DTHT = DTHT_SVOC + CLT = CLT_SVOC + TLT = TLT_SVOC + DTLT = DTLT_SVOC + CHW = CHW_SVOC + THW = THW_SVOC + DTHW = DTHW_SVOC else ! EMI_IND = 19 CT1 = CT1_OVOC CEO = CEO_OVOC @@ -955,6 +1428,18 @@ SUBROUTINE CANOPY_BIOP( EMI_IND, LU_OPT, VTYPE, & AGRO = AGRO_OVOC AMAT = AMAT_OVOC AOLD = AOLD_OVOC + CAQ = CAQ_OVOC + TAQ = TAQ_OVOC + DTAQ = DTAQ_OVOC + CHT = CHT_OVOC + THT = THT_OVOC + DTHT = DTHT_OVOC + CLT = CLT_OVOC + TLT = TLT_OVOC + DTLT = DTLT_OVOC + CHW = CHW_OVOC + THW = THW_OVOC + DTHW = DTHW_OVOC end if if (LU_OPT .eq. 0 .or. LU_OPT .eq. 1) then !VIIRS or MODIS LU types diff --git a/src/canopy_calcs.F90 b/src/canopy_calcs.F90 index 29204d98..84ac5d5f 100644 --- a/src/canopy_calcs.F90 +++ b/src/canopy_calcs.F90 @@ -68,33 +68,34 @@ SUBROUTINE canopy_calcs(nn) do i=1, nlon do j=1, nlat - hcmref = variables_2d(i,j)%ch - uref = variables_2d(i,j)%ugrd10m - vref = variables_2d(i,j)%vgrd10m - cluref = variables_2d(i,j)%clu - lairef = variables_2d(i,j)%lai - vtyperef = variables_2d(i,j)%vtype - canfracref = variables_2d(i,j)%canfrac - ustref = variables_2d(i,j)%fricv - cszref = variables_2d(i,j)%csz - z0ref = variables_2d(i,j)%sfcr - molref = variables_2d(i,j)%mol - frpref = variables_2d(i,j)%frp - hgtref = variables_2d(i,j)%href - sotypref = variables_2d(i,j)%sotyp - pressfcref = variables_2d(i,j)%pressfc - dswrfref = variables_2d(i,j)%dswrf - shtflref = variables_2d(i,j)%shtfl - tmpsfcref = variables_2d(i,j)%tmpsfc - tmp2mref = variables_2d(i,j)%tmp2m - spfh2mref = variables_2d(i,j)%spfh2m - hpblref = variables_2d(i,j)%hpbl - prate_averef = variables_2d(i,j)%prate_ave - soilw1ref = variables_2d(i,j)%soilw1 - soilw2ref = variables_2d(i,j)%soilw2 - soilw3ref = variables_2d(i,j)%soilw3 - soilw4ref = variables_2d(i,j)%soilw4 - wiltref = variables_2d(i,j)%wilt + hcmref = variables_2d(i,j)%ch + uref = variables_2d(i,j)%ugrd10m + vref = variables_2d(i,j)%vgrd10m + cluref = variables_2d(i,j)%clu + lairef = variables_2d(i,j)%lai + vtyperef = variables_2d(i,j)%vtype + canfracref = variables_2d(i,j)%canfrac + ustref = variables_2d(i,j)%fricv + cszref = variables_2d(i,j)%csz + z0ref = variables_2d(i,j)%sfcr + molref = variables_2d(i,j)%mol + frpref = variables_2d(i,j)%frp + hgtref = variables_2d(i,j)%href + sotypref = variables_2d(i,j)%sotyp + pressfcref = variables_2d(i,j)%pressfc + dswrfref = variables_2d(i,j)%dswrf + shtflref = variables_2d(i,j)%shtfl + tmpsfcref = variables_2d(i,j)%tmpsfc + tmp2mref = variables_2d(i,j)%tmp2m + spfh2mref = variables_2d(i,j)%spfh2m + hpblref = variables_2d(i,j)%hpbl + prate_averef = variables_2d(i,j)%prate_ave + soilw1ref = variables_2d(i,j)%soilw1 + soilw2ref = variables_2d(i,j)%soilw2 + soilw3ref = variables_2d(i,j)%soilw3 + soilw4ref = variables_2d(i,j)%soilw4 + wiltref = variables_2d(i,j)%wilt + ozone_w126ref = variables_2d(i,j)%ozone_w126 ! ... calculate wind speed from u and v ubzref = sqrt((uref**2.0) + (vref**2.0)) @@ -310,6 +311,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240_3d(i,j,:) = tleaf_sun tleaf_shade240_3d(i,j,:) = tleaf_shade tleaf_ave240_3d(i,j,:) = tleaf_ave + !for AQ, temp, and wind stress factors in biogenics, use instantaneous only (caution!) + daily_maxt2m_2d(i,j) = tmp2mref + daily_mint2m_2d(i,j) = tmp2mref + daily_maxws10m_2d(i,j) = ubzref else if (hist_opt .eq. 1) then !Try for historical average values ! Calculate weights for running means of historic variables ! DNEWFRAC and DOLDFRAC are the weights given to the current @@ -331,6 +336,9 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240_tmp_3d(nn,i,j,:) = tleaf_sun tleaf_shade240_tmp_3d(nn,i,j,:) = tleaf_shade tleaf_ave240_tmp_3d(nn,i,j,:) = tleaf_ave + !Track times for daily maximum/minimum temperature and maximum wind speed calculation below + tmp2mref_tmp_3d(nn,i,j) = tmp2mref + ubzref_tmp_3d(nn,i,j) = ubzref if (nn .le. 24) then !TODO: Restart capability needed to get past leaf temp and PAR if avaialble !For now, if <= 24 hours then only option is to use current instantaneous values ppfd_sun24_3d(i,j,:) = ppfd_sun @@ -343,6 +351,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240_3d(i,j,:) = tleaf_sun tleaf_shade240_3d(i,j,:) = tleaf_shade tleaf_ave240_3d(i,j,:) = tleaf_ave + !for AQ, temp, and wind stress factors in biogenics, still use instantaneous only (caution!) + daily_maxt2m_2d(i,j) = tmp2mref + daily_mint2m_2d(i,j) = tmp2mref + daily_maxws10m_2d(i,j) = ubzref else !Updated running 24 hour (hourly, short term) and 240 hour (daily, long-term) averages ppfd_sun24_3d(i,j,:) = 0.0_rk ppfd_shade24_3d(i,j,:) = 0.0_rk @@ -388,6 +400,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240_3d(i,j,:) = ( doldfrac * tleaf_sun240_3d(i,j,:) ) + ( dnewfrac * tleaf_sun ) tleaf_shade240_3d(i,j,:) = ( doldfrac * tleaf_shade240_3d(i,j,:) ) + ( dnewfrac * tleaf_shade ) tleaf_ave240_3d(i,j,:) = ( doldfrac * tleaf_ave240_3d(i,j,:) ) + ( dnewfrac * tleaf_ave ) + !Take daily max/min for temperature and daily max for wind speed + daily_maxt2m_2d(i,j) = maxval(tmp2mref_tmp_3d(nn-24:nn-1,i,j)) + daily_mint2m_2d(i,j) = minval(tmp2mref_tmp_3d(nn-24:nn-1,i,j)) + daily_maxws10m_2d(i,j) = maxval(ubzref_tmp_3d(nn-24:nn-1,i,j)) end if else write(*,*) 'wrong HIST_OPT namelist option = ', hist_opt, 'only option = 0 or 1' @@ -407,7 +423,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 1, emi_isop_3d(i,j,:)) !MYRC call canopy_bio(zk, fafraczInt, hcmref, & @@ -419,7 +437,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 2, emi_myrc_3d(i,j,:)) !SABI call canopy_bio(zk, fafraczInt, hcmref, & @@ -431,7 +451,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 3, emi_sabi_3d(i,j,:)) !LIMO call canopy_bio(zk, fafraczInt, hcmref, & @@ -443,7 +465,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 4, emi_limo_3d(i,j,:)) !CARE call canopy_bio(zk, fafraczInt, hcmref, & @@ -455,7 +479,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 5, emi_care_3d(i,j,:)) !OCIM call canopy_bio(zk, fafraczInt, hcmref, & @@ -467,7 +493,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 6, emi_ocim_3d(i,j,:)) !BPIN call canopy_bio(zk, fafraczInt, hcmref, & @@ -479,7 +507,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 7, emi_bpin_3d(i,j,:)) !APIN call canopy_bio(zk, fafraczInt, hcmref, & @@ -491,7 +521,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 8, emi_apin_3d(i,j,:)) !MONO call canopy_bio(zk, fafraczInt, hcmref, & @@ -503,7 +535,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 9, emi_mono_3d(i,j,:)) !FARN call canopy_bio(zk, fafraczInt, hcmref, & @@ -515,7 +549,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 10, emi_farn_3d(i,j,:)) !CARY call canopy_bio(zk, fafraczInt, hcmref, & @@ -527,7 +563,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 11, emi_cary_3d(i,j,:)) !SESQ call canopy_bio(zk, fafraczInt, hcmref, & @@ -539,7 +577,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 12, emi_sesq_3d(i,j,:)) !MBOL call canopy_bio(zk, fafraczInt, hcmref, & @@ -551,7 +591,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 13, emi_mbol_3d(i,j,:)) !METH call canopy_bio(zk, fafraczInt, hcmref, & @@ -563,7 +605,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 14, emi_meth_3d(i,j,:)) !ACET call canopy_bio(zk, fafraczInt, hcmref, & @@ -575,7 +619,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 15, emi_acet_3d(i,j,:)) !CO call canopy_bio(zk, fafraczInt, hcmref, & @@ -587,7 +633,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 16, emi_co_3d(i,j,:)) !BIDI VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -599,7 +647,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 17, emi_bvoc_3d(i,j,:)) !Stress VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -611,7 +661,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 18, emi_svoc_3d(i,j,:)) !Other VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -623,7 +675,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m_2d(i,j), daily_mint2m_2d(i,j), & + daily_maxws10m_2d(i,j), & modlays, 19, emi_ovoc_3d(i,j,:)) end if end if @@ -661,33 +715,34 @@ SUBROUTINE canopy_calcs(nn) ! ... Main loop through model grid cells do loc=1, nlat*nlon - hcmref = variables(loc)%ch - uref = variables(loc)%ugrd10m - vref = variables(loc)%vgrd10m - cluref = variables(loc)%clu - lairef = variables(loc)%lai - vtyperef = variables(loc)%vtype - canfracref = variables(loc)%canfrac - ustref = variables(loc)%fricv - cszref = variables(loc)%csz - z0ref = variables(loc)%sfcr - molref = variables(loc)%mol - frpref = variables(loc)%frp - hgtref = variables(loc)%href - sotypref = variables(loc)%sotyp - pressfcref = variables(loc)%pressfc - dswrfref = variables(loc)%dswrf - shtflref = variables(loc)%shtfl - tmpsfcref = variables(loc)%tmpsfc - tmp2mref = variables(loc)%tmp2m - spfh2mref = variables(loc)%spfh2m - hpblref = variables(loc)%hpbl - prate_averef = variables(loc)%prate_ave - soilw1ref = variables(loc)%soilw1 - soilw2ref = variables(loc)%soilw2 - soilw3ref = variables(loc)%soilw3 - soilw4ref = variables(loc)%soilw4 - wiltref = variables(loc)%wilt + hcmref = variables(loc)%ch + uref = variables(loc)%ugrd10m + vref = variables(loc)%vgrd10m + cluref = variables(loc)%clu + lairef = variables(loc)%lai + vtyperef = variables(loc)%vtype + canfracref = variables(loc)%canfrac + ustref = variables(loc)%fricv + cszref = variables(loc)%csz + z0ref = variables(loc)%sfcr + molref = variables(loc)%mol + frpref = variables(loc)%frp + hgtref = variables(loc)%href + sotypref = variables(loc)%sotyp + pressfcref = variables(loc)%pressfc + dswrfref = variables(loc)%dswrf + shtflref = variables(loc)%shtfl + tmpsfcref = variables(loc)%tmpsfc + tmp2mref = variables(loc)%tmp2m + spfh2mref = variables(loc)%spfh2m + hpblref = variables(loc)%hpbl + prate_averef = variables(loc)%prate_ave + soilw1ref = variables(loc)%soilw1 + soilw2ref = variables(loc)%soilw2 + soilw3ref = variables(loc)%soilw3 + soilw4ref = variables(loc)%soilw4 + wiltref = variables(loc)%wilt + ozone_w126ref = variables(loc)%ozone_w126 if (var3d_opt .eq. 1) then !allocated so set pavd_arr = (/variables_can(loc)%pavd01, & @@ -938,6 +993,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240(loc,:) = tleaf_sun tleaf_shade240(loc,:) = tleaf_shade tleaf_ave240(loc,:) = tleaf_ave + !for AQ, temp, and wind stress factors in biogenics, use instantaneous only (caution!) + daily_maxt2m(loc) = tmp2mref + daily_mint2m(loc) = tmp2mref + daily_maxws10m(loc) = ubzref else if (hist_opt .eq. 1) then !Try for historical average values ! Calculate weights for running means of historic variables ! DNEWFRAC and DOLDFRAC are the weights given to the current @@ -959,6 +1018,9 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240_tmp(nn,loc,:) = tleaf_sun tleaf_shade240_tmp(nn,loc,:) = tleaf_shade tleaf_ave240_tmp(nn,loc,:) = tleaf_ave + !Track times for daily maximum/minimum temperature and maximum wind speed calculation below + tmp2mref_tmp(nn,loc) = tmp2mref + ubzref_tmp(nn,loc) = ubzref if (nn .le. 24) then !TODO: Restart capability needed to get past leaf temp and PAR if avaialble !For now, if <= 24 hours then use current instantaneous ppfd_sun24(loc,:) = ppfd_sun @@ -971,6 +1033,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240(loc,:) = tleaf_sun tleaf_shade240(loc,:) = tleaf_shade tleaf_ave240(loc,:) = tleaf_ave + !for AQ, temp, and wind stress factors in biogenics, still use instantaneous only (caution!) + daily_maxt2m(loc) = tmp2mref + daily_mint2m(loc) = tmp2mref + daily_maxws10m(loc) = ubzref else ppfd_sun24(loc,:) = 0.0_rk ppfd_shade24(loc,:) = 0.0_rk @@ -1016,6 +1082,10 @@ SUBROUTINE canopy_calcs(nn) tleaf_sun240(loc,:) = ( doldfrac * tleaf_sun240(loc,:) ) + ( dnewfrac * tleaf_sun ) tleaf_shade240(loc,:) = ( doldfrac * tleaf_shade240(loc,:) ) + ( dnewfrac * tleaf_shade ) tleaf_ave240(loc,:) = ( doldfrac * tleaf_ave240(loc,:) ) + ( dnewfrac * tleaf_ave ) + !Take daily max/min for temperature and daily max for wind speed + daily_maxt2m(loc) = maxval(tmp2mref_tmp(nn-24:nn-1,loc)) + daily_mint2m(loc) = minval(tmp2mref_tmp(nn-24:nn-1,loc)) + daily_maxws10m(loc) = maxval(ubzref_tmp(nn-24:nn-1,loc)) end if else write(*,*) 'wrong HIST_OPT namelist option = ', hist_opt, 'only option = 0 or 1' @@ -1035,7 +1105,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 1, emi_isop(loc,:)) !MYRC call canopy_bio(zk, fafraczInt, hcmref, & @@ -1047,7 +1119,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 2, emi_myrc(loc,:)) !SABI call canopy_bio(zk, fafraczInt, hcmref, & @@ -1059,7 +1133,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 3, emi_sabi(loc,:)) !LIMO call canopy_bio(zk, fafraczInt, hcmref, & @@ -1071,7 +1147,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 4, emi_limo(loc,:)) !CARE call canopy_bio(zk, fafraczInt, hcmref, & @@ -1083,7 +1161,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 5, emi_care(loc,:)) !OCIM call canopy_bio(zk, fafraczInt, hcmref, & @@ -1095,7 +1175,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 6, emi_ocim(loc,:)) !BPIN call canopy_bio(zk, fafraczInt, hcmref, & @@ -1107,7 +1189,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 7, emi_bpin(loc,:)) !APIN call canopy_bio(zk, fafraczInt, hcmref, & @@ -1119,7 +1203,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 8, emi_apin(loc,:)) !MONO call canopy_bio(zk, fafraczInt, hcmref, & @@ -1131,7 +1217,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 9, emi_mono(loc,:)) !FARN call canopy_bio(zk, fafraczInt, hcmref, & @@ -1143,7 +1231,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 10, emi_farn(loc,:)) !CARY call canopy_bio(zk, fafraczInt, hcmref, & @@ -1155,7 +1245,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 11, emi_cary(loc,:)) !SESQ call canopy_bio(zk, fafraczInt, hcmref, & @@ -1167,7 +1259,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 12, emi_sesq(loc,:)) !MBOL call canopy_bio(zk, fafraczInt, hcmref, & @@ -1179,7 +1273,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 13, emi_mbol(loc,:)) !METH call canopy_bio(zk, fafraczInt, hcmref, & @@ -1191,7 +1287,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 14, emi_meth(loc,:)) !ACET call canopy_bio(zk, fafraczInt, hcmref, & @@ -1203,7 +1301,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 15, emi_acet(loc,:)) !CO call canopy_bio(zk, fafraczInt, hcmref, & @@ -1215,7 +1315,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 16, emi_co(loc,:)) !BIDI VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -1227,7 +1329,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 17, emi_bvoc(loc,:)) !Stress VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -1239,7 +1343,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 18, emi_svoc(loc,:)) !Other VOC call canopy_bio(zk, fafraczInt, hcmref, & @@ -1251,7 +1357,9 @@ SUBROUTINE canopy_calcs(nn) leafage_opt, pastlai, currentlai, tsteplai, & loss_opt, loss_set, loss_ind, lifetime, ustref, & soim_opt, soilw1ref, soilw2ref, soilw3ref, soilw4ref, & - soild1, soild2, soild3, soild4, wiltref, & + soild1, soild2, soild3, soild4, wiltref, aq_opt, w126_set, ozone_w126ref, & + ht_opt, lt_opt, hw_opt, daily_maxt2m(loc), daily_mint2m(loc), & + daily_maxws10m(loc), & modlays, 19, emi_ovoc(loc,:)) end if end if diff --git a/src/canopy_canmet_mod.F90 b/src/canopy_canmet_mod.F90 index d770270c..79e0549b 100644 --- a/src/canopy_canmet_mod.F90 +++ b/src/canopy_canmet_mod.F90 @@ -41,6 +41,7 @@ MODULE canopy_canmet_mod real(rk) :: soilw3 !volumetric soil moisture level 3 (m3/m3) real(rk) :: soilw4 !volumetric soil moisture level 4 (m3/m3) real(rk) :: wilt !wilting point (proportion) + real(rk) :: ozone_w126 !ozone W126 values (ppm-hours) end TYPE variable_type @@ -127,6 +128,8 @@ MODULE canopy_canmet_mod real(rk) :: soilw3ref !volumetric soil moisture (m3/m3) Layer 3 real(rk) :: soilw4ref !volumetric soil moisture (m3/m3) Layer 4 real(rk) :: wiltref !wilting point (proportion) + real(rk) :: ozone_w126ref !ozone W126 values (ppm-hours) + ! real(rk) :: lev01ref, lev02ref, lev03ref, lev04ref, lev05ref, & !Input canopy profile levels ! lev06ref, lev07ref, lev08ref, lev09ref, lev10ref, & ! lev11ref, lev12ref, lev13ref, lev14ref diff --git a/src/canopy_canopts_mod.F90 b/src/canopy_canopts_mod.F90 index ca4241bf..6db5bdba 100644 --- a/src/canopy_canopts_mod.F90 +++ b/src/canopy_canopts_mod.F90 @@ -58,4 +58,9 @@ MODULE canopy_canopts_mod real(rk) :: soild2 !User set real value of depth of soil layer 2 (default = 25 cm @ centerpoint, based on Noah/Noah-MP) real(rk) :: soild3 !User set real value of depth of soil layer 3 (default = 70 cm @ centerpoint, based on Noah/Noah-MP) real(rk) :: soild4 !User set real value of depth of soil layer 4 (default = 150 cm @ centerpoint, based on Noah/Noah-MP) + integer :: aq_opt !Set default integer for air quality stress index for gamma_aq in biogenic emissions + real(rk) :: w126_set !Set default value for constant ozone W126 value (ppm-hours) + integer :: ht_opt !Set default integer for high temperature stress index for gamma_ht in biogenic emissions + integer :: lt_opt !Set default integer for low temperature stress index for gamma_lt in biogenic emissions + integer :: hw_opt !Set default integer for high wind stress index for gamma_hw in biogenic emissions END MODULE canopy_canopts_mod diff --git a/src/canopy_canvars_mod.F90 b/src/canopy_canvars_mod.F90 index 7009beed..a7b8303d 100644 --- a/src/canopy_canvars_mod.F90 +++ b/src/canopy_canvars_mod.F90 @@ -50,6 +50,8 @@ MODULE canopy_canvars_mod real(rk), allocatable :: tleaf_ave240_tmp ( : , :, : ) ! Average Leaf temp for sunlit and shaded leaves (K) real(rk), allocatable :: ppfd_sun240_tmp ( : , :, : ) ! PPFD for sunlit leaves (umol phot/m2 s) real(rk), allocatable :: ppfd_shade240_tmp ( : , :, : ) ! PPFD for shaded leaves (umol phot/m2 s) + real(rk), allocatable :: tmp2mref_tmp ( : , : ) ! 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: ubzref_tmp ( : , : ) ! 10-meter (AGL) input reference wind speed (m/s) real(rk), allocatable :: tleaf_sun24 ( : , : ) ! Leaf temp for sunlit leaves (K) real(rk), allocatable :: tleaf_shade24 ( : , : ) ! Leaf temp for shaded leaves (K) real(rk), allocatable :: tleaf_ave24 ( : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) @@ -60,6 +62,9 @@ MODULE canopy_canvars_mod real(rk), allocatable :: tleaf_ave240 ( : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) real(rk), allocatable :: ppfd_sun240 ( : , : ) ! PPFD for sunlit leaves (umol phot/m2 s) real(rk), allocatable :: ppfd_shade240 ( : , : ) ! PPFD for shaded leaves (umol phot/m2 s) + real(rk), allocatable :: daily_maxt2m ( : ) ! Daily maximum 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: daily_mint2m ( : ) ! Daily minimum 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: daily_maxws10m ( : ) ! Daily maximum 10-meter (AGL) input wind speed (m/s) real(rk), allocatable :: tleaf_sun24_tmp_3d ( : , : , : , : ) ! Leaf temp for sunlit leaves (K) real(rk), allocatable :: tleaf_shade24_tmp_3d ( : , : , : , : ) ! Leaf temp for shaded leaves (K) real(rk), allocatable :: tleaf_ave24_tmp_3d ( : , : , : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) @@ -70,6 +75,8 @@ MODULE canopy_canvars_mod real(rk), allocatable :: tleaf_ave240_tmp_3d ( : , : , : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) real(rk), allocatable :: ppfd_sun240_tmp_3d ( : , : , : , : ) ! PPFD for sunlit leaves (umol phot/m2 s) real(rk), allocatable :: ppfd_shade240_tmp_3d ( : , : , : , : ) ! PPFD for shaded leaves (umol phot/m2 s) + real(rk), allocatable :: tmp2mref_tmp_3d ( : , : , : ) ! 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: ubzref_tmp_3d ( : , : , : ) ! 10-meter (AGL) input reference wind speed (m/s) real(rk), allocatable :: tleaf_sun24_3d ( : , : , : ) ! Leaf temp for sunlit leaves (K) real(rk), allocatable :: tleaf_shade24_3d ( : , : , : ) ! Leaf temp for shaded leaves (K) real(rk), allocatable :: tleaf_ave24_3d ( : , : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) @@ -80,6 +87,10 @@ MODULE canopy_canvars_mod real(rk), allocatable :: tleaf_ave240_3d ( : , : , : ) ! Average Leaf temp for sunlit and shaded leaves (K) real(rk), allocatable :: ppfd_sun240_3d ( : , : , : ) ! PPFD for sunlit leaves (umol phot/m2 s) real(rk), allocatable :: ppfd_shade240_3d ( : , : , : ) ! PPFD for shaded leaves (umol phot/m2 s) + real(rk), allocatable :: daily_maxt2m_2d ( : , : ) ! Daily maximum 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: daily_mint2m_2d ( : , : ) ! Daily minimum 2-meter (AGL) input reference air temperature (K) + real(rk), allocatable :: daily_maxws10m_2d ( : , : ) ! Daily maximum 10-meter (AGL) input wind speed (m/s) + real(rk), allocatable :: canBOT ( : ) ! Canopy bottom wind reduction factors real(rk), allocatable :: canTOP ( : ) ! Canopy top wind reduction factors real(rk), allocatable :: canWIND ( : , : ) ! canopy wind speeds (m/s) diff --git a/src/canopy_dealloc.F90 b/src/canopy_dealloc.F90 index 99093302..7e19c473 100644 --- a/src/canopy_dealloc.F90 +++ b/src/canopy_dealloc.F90 @@ -57,6 +57,8 @@ SUBROUTINE canopy_dealloc if(allocated(tleaf_ave240_tmp)) deallocate(tleaf_ave240_tmp) if(allocated(ppfd_sun240_tmp)) deallocate(ppfd_sun240_tmp) if(allocated(ppfd_shade240_tmp)) deallocate(ppfd_shade240_tmp) + if(allocated(tmp2mref_tmp)) deallocate(tmp2mref_tmp) + if(allocated(ubzref_tmp)) deallocate(ubzref_tmp) if(allocated(tleaf_sun24)) deallocate(tleaf_sun24) if(allocated(tleaf_shade24)) deallocate(tleaf_shade24) if(allocated(tleaf_ave24)) deallocate(tleaf_ave24) @@ -67,6 +69,9 @@ SUBROUTINE canopy_dealloc if(allocated(tleaf_ave240)) deallocate(tleaf_ave240) if(allocated(ppfd_sun240)) deallocate(ppfd_sun240) if(allocated(ppfd_shade240)) deallocate(ppfd_shade240) + if(allocated(daily_maxt2m)) deallocate(daily_maxt2m) + if(allocated(daily_mint2m)) deallocate(daily_mint2m) + if(allocated(daily_maxws10m)) deallocate(daily_maxws10m) if(allocated(tleaf_sun24_tmp_3d)) deallocate(tleaf_sun24_tmp_3d) if(allocated(tleaf_shade24_tmp_3d)) deallocate(tleaf_shade24_tmp_3d) @@ -78,6 +83,8 @@ SUBROUTINE canopy_dealloc if(allocated(tleaf_ave240_tmp_3d)) deallocate(tleaf_ave240_tmp_3d) if(allocated(ppfd_sun240_tmp_3d)) deallocate(ppfd_sun240_tmp_3d) if(allocated(ppfd_shade240_tmp_3d)) deallocate(ppfd_shade240_tmp_3d) + if(allocated(tmp2mref_tmp_3d)) deallocate(tmp2mref_tmp_3d) + if(allocated(ubzref_tmp_3d)) deallocate(ubzref_tmp_3d) if(allocated(tleaf_sun24_3d)) deallocate(tleaf_sun24_3d) if(allocated(tleaf_shade24_3d)) deallocate(tleaf_shade24_3d) if(allocated(tleaf_ave24_3d)) deallocate(tleaf_ave24_3d) @@ -88,6 +95,9 @@ SUBROUTINE canopy_dealloc if(allocated(tleaf_ave240_3d)) deallocate(tleaf_ave240_3d) if(allocated(ppfd_sun240_3d)) deallocate(ppfd_sun240_3d) if(allocated(ppfd_shade240_3d)) deallocate(ppfd_shade240_3d) + if(allocated(daily_maxt2m_2d)) deallocate(daily_maxt2m_2d) + if(allocated(daily_mint2m_2d)) deallocate(daily_mint2m_2d) + if(allocated(daily_maxws10m_2d)) deallocate(daily_maxws10m_2d) !------------------------------------------------------------------------------- ! Deallocate arrays for Canopy Wind diff --git a/src/canopy_init.F90 b/src/canopy_init.F90 index ec39ff17..8861221c 100644 --- a/src/canopy_init.F90 +++ b/src/canopy_init.F90 @@ -41,6 +41,8 @@ SUBROUTINE canopy_init if(allocated(tleaf_ave240_tmp)) tleaf_ave240_tmp(:,:,:) = 0.0_rk if(allocated(ppfd_sun240_tmp)) ppfd_sun240_tmp(:,:,:) = 0.0_rk if(allocated(ppfd_shade240_tmp)) ppfd_shade240_tmp(:,:,:) = 0.0_rk + if(allocated(tmp2mref_tmp)) tmp2mref_tmp(:,:) = 0.0_rk + if(allocated(ubzref_tmp)) ubzref_tmp(:,:) = 0.0_rk if(allocated(tleaf_sun24)) tleaf_sun24(:,:) = fillreal if(allocated(tleaf_shade24)) tleaf_shade24(:,:) = fillreal if(allocated(tleaf_ave24)) tleaf_ave24(:,:) = fillreal @@ -51,6 +53,9 @@ SUBROUTINE canopy_init if(allocated(tleaf_ave240)) tleaf_ave240(:,:) = fillreal if(allocated(ppfd_sun240)) ppfd_sun240(:,:) = fillreal if(allocated(ppfd_shade240)) ppfd_shade240(:,:) = fillreal + if(allocated(daily_maxt2m)) daily_maxt2m(:) = fillreal + if(allocated(daily_mint2m)) daily_mint2m(:) = fillreal + if(allocated(daily_maxws10m)) daily_maxws10m(:) = fillreal if(allocated(tleaf_sun24_tmp_3d)) tleaf_sun24_tmp_3d(:,:,:,:) = 0.0_rk if(allocated(tleaf_shade24_tmp_3d)) tleaf_shade24_tmp_3d(:,:,:,:) = 0.0_rk @@ -62,6 +67,8 @@ SUBROUTINE canopy_init if(allocated(tleaf_ave240_tmp_3d)) tleaf_ave240_tmp_3d(:,:,:,:) = 0.0_rk if(allocated(ppfd_sun240_tmp_3d)) ppfd_sun240_tmp_3d(:,:,:,:) = 0.0_rk if(allocated(ppfd_shade240_tmp_3d)) ppfd_shade240_tmp_3d(:,:,:,:) = 0.0_rk + if(allocated(tmp2mref_tmp_3d)) tmp2mref_tmp_3d(:,:,:) = 0.0_rk + if(allocated(ubzref_tmp_3d)) ubzref_tmp_3d(:,:,:) = 0.0_rk if(allocated(tleaf_sun24_3d)) tleaf_sun24_3d(:,:,:) = fillreal if(allocated(tleaf_shade24_3d)) tleaf_shade24_3d(:,:,:) = fillreal if(allocated(tleaf_ave24_3d)) tleaf_ave24_3d(:,:,:) = fillreal @@ -72,7 +79,9 @@ SUBROUTINE canopy_init if(allocated(tleaf_ave240_3d)) tleaf_ave240_3d(:,:,:) = fillreal if(allocated(ppfd_sun240_3d)) ppfd_sun240_3d(:,:,:) = fillreal if(allocated(ppfd_shade240_3d)) ppfd_shade240_3d(:,:,:) = fillreal - + if(allocated(daily_maxt2m_2d)) daily_maxt2m_2d(:,:) = fillreal + if(allocated(daily_mint2m_2d)) daily_mint2m_2d(:,:) = fillreal + if(allocated(daily_maxws10m_2d)) daily_maxws10m_2d(:,:) = fillreal !------------------------------------------------------------------------------- ! Initialize arrays for Canopy Wind !------------------------------------------------------------------------------- diff --git a/src/canopy_ncf_io_mod.F90 b/src/canopy_ncf_io_mod.F90 index 7e67907f..1663e393 100644 --- a/src/canopy_ncf_io_mod.F90 +++ b/src/canopy_ncf_io_mod.F90 @@ -2603,8 +2603,21 @@ SUBROUTINE canopy_read_ncf(infile) CALL exit(2) ENDIF variables_2d%wilt=variables_2d_real + !Also reshape to 1D array for 1D calculation and output ! variables%wilt=reshape(variables_2d%wilt,[size(variables_2d%wilt)]) + !Ozone W126 + CALL get_var_2d_real_cdf (cdfid, 'ozone_w126', variables_2d_real, it, rcode) + IF ( rcode /= nf90_noerr ) THEN + WRITE (*,f9410) TRIM(pname), 'ozone_w126', & + TRIM(nf90_strerror(rcode)) + CALL exit(2) + ENDIF + variables_2d%ozone_w126=variables_2d_real + + !Also reshape to 1D array for 1D calculation and output +! variables%ozone_w126=reshape(variables_2d%ozone_w126,[size(variables_2d%ozone_w126)]) + !3D Input Level Profile if (var3d_opt .eq. 1) then CALL get_var_1d_real_cdf (cdfid, 'lev', variables_1d_lev_real, it, rcode) diff --git a/src/canopy_readnml.F90 b/src/canopy_readnml.F90 index 205aaf0d..4061fb6b 100644 --- a/src/canopy_readnml.F90 +++ b/src/canopy_readnml.F90 @@ -27,8 +27,8 @@ SUBROUTINE canopy_readnml ifcanwaf, ifcaneddy, ifcanphot, ifcanbio, pai_opt, pai_set, lu_opt, z0_opt, & dx_opt, dx_set, lai_thresh, cf_thresh, ch_thresh, rsl_opt, bio_cce, & biospec_opt, biovert_opt, ssg_opt, ssg_set, crop_opt, crop_set, co2_opt, co2_set, & - leafage_opt, lai_tstep, soim_opt, soild1, soild2, soild3, soild4, hist_opt, & - loss_opt, loss_set, loss_ind, lifetime + leafage_opt, lai_tstep, soim_opt, soild1, soild2, soild3, soild4, aq_opt, w126_set, & + ht_opt, lt_opt, hw_opt, hist_opt, loss_opt, loss_set, loss_ind, lifetime !------------------------------------------------------------------------------- @@ -343,6 +343,31 @@ SUBROUTINE canopy_readnml soild4 = 150.0_rk !------------------------------------------------------------------------------- +!------------------------------------------------------------------------------ +! Set default integer for using air quality stress gamma for biogenic emissions (default=2; Off) + aq_opt = 2 +!------------------------------------------------------------------------------- + +!------------------------------------------------------------------------------- +! Set default value for spatially constant w126 value (ppm-hours) + w126_set = 20.0_rk +!------------------------------------------------------------------------------- + +!------------------------------------------------------------------------------ +! Set default integer for using high temperature stress gamma for biogenic emissions (default=1; Off) + ht_opt = 1 +!------------------------------------------------------------------------------- + +!------------------------------------------------------------------------------ +! Set default integer for using low temperature stress gamma for biogenic emissions (default=1; Off) + lt_opt = 1 +!------------------------------------------------------------------------------- + +!------------------------------------------------------------------------------ +! Set default integer for using high wind stress gamma for biogenic emissions (default=1; Off) + hw_opt = 1 +!------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- ! Read namelist to get user definitions. Rewind namelist file after each ! read in case namelists are not in the correct order in the namelist. diff --git a/src/canopy_utils_mod.F90 b/src/canopy_utils_mod.F90 index b459712d..b36af5dc 100644 --- a/src/canopy_utils_mod.F90 +++ b/src/canopy_utils_mod.F90 @@ -7,7 +7,8 @@ module canopy_utils_mod private public IntegrateTrapezoid,interp_linear1_internal,CalcPAI, & CalcDX,CalcFlameH,GET_GAMMA_CO2,GET_GAMMA_LEAFAGE, & - GET_GAMMA_SOIM,GET_CANLOSS_BIO + GET_GAMMA_SOIM,GET_GAMMA_AQ,GET_GAMMA_HT,GET_GAMMA_LT, & + GET_GAMMA_HW,GET_CANLOSS_BIO contains @@ -873,4 +874,197 @@ function GET_GAMMA_SOIM(soim_opt,soim1,soim2,soim3,soim4, & end function GET_GAMMA_SOIM +!---------------------------------------------------------------- +! +! Function GAMMA_AQ +! EA response to air quality +! +!---------------------------------------------------------------- + + real(rk) function GET_GAMMA_AQ(aq_opt, w126_ozone, w126_set, caq, taq, dtaq) result( GAMMA_AQ ) + + ! !IROUTINE: get_gamma_aq + ! + ! !DESCRIPTION: Function GET\_GAMMA\_AQ computes the activity factor + ! associated with air qualtity (ozone W126 stress of biogenic emission. Called from + ! GET\_MEGAN\_EMISSIONS only. + !\\ + !\\ + ! !INTERFACE: + + ! !INPUT PARAMETERS: + integer, INTENT(IN) :: aq_opt ! Option for aq stress calculation + ! 0=MEGANv3.2 implementation with climatological, spatially dependent GFSv16-based W126; + ! 1=MEGANv3.2 implementation with user-set, spatially constant value of ozone W126 + ! >1=off (gamma_aq=1) + real(rk), INTENT(IN) :: w126_ozone ! spatially dependent GFS w126 ozone [ppm-hours] + real(rk), INTENT(IN) :: w126_set ! user set spatially constant w126 ozone [ppm-hours] + real(rk), INTENT(IN) :: taq ! threshold for poor Air Quality stress (ppm-hours) + real(rk), INTENT(IN) :: dtaq ! delta threshold for poor Air Quality stress (ppm-hours) + real(rk), INTENT(IN) :: caq ! coefficient for poor Air Quality stress + ! + ! !RETURN VALUE: + !REAL(rk) :: GAMMA_AQ ! AQ activity factor [unitless] + ! + ! !LOCAL VARIABLES: + REAL(rk) :: w126 ! local w126 value (ppm-hours) + REAL(rk) :: t1 ! combined threshold + delta threshold AQ value + + if (aq_opt .eq. 0) then !Use spatial GFS W126 ozone + w126 = w126_ozone + else !Use user set value of W126 ozone + w126 = w126_set + end if + + + if (aq_opt .le. 1) then !Calculate GAMMA_AQ + t1 = taq + dtaq + if (w126 <= taq) then + GAMMA_AQ = 1.0_rk + else if ( w126 > taq .and. w126 < t1) then + GAMMA_AQ = 1.0_rk + (caq - 1.0_rk)* (w126 - & + taq)/dtaq + else + GAMMA_AQ = caq + end if + else ! GAMMA_AQ = 1 + GAMMA_AQ = 1.0_rk + end if + + end function GET_GAMMA_AQ +!----------------------------------------------------------------------- + + real(rk) function GET_GAMMA_HT(ht_opt, maxt2m, cht, tht, dtht) result( GAMMA_HT ) + + ! !IROUTINE: get_gamma_ht + ! + ! !DESCRIPTION: Function GET\_GAMMA\_HT computes the activity factor + ! associated with high temperature stress of biogenic emission. Called from + ! GET\_MEGAN\_EMISSIONS only. + !\\ + !\\ + ! !INTERFACE: + + ! !INPUT PARAMETERS: + integer, INTENT(IN) :: ht_opt ! Option for ht stress calculation + ! 0=MEGANv3.2 On; + ! 1=MEGANv3.2 Off + real(rk), INTENT(IN) :: maxt2m ! maximum input 2-m temperature [K] + real(rk), INTENT(IN) :: tht ! threshold for high temperature [K] + real(rk), INTENT(IN) :: dtht ! delta threshold for high temperature [K] + real(rk), INTENT(IN) :: cht ! coefficient for high temperature stress + ! + ! !RETURN VALUE: + !REAL(rk) :: GAMMA_HT ! HT activity factor [unitless] + ! + ! !LOCAL VARIABLES: + REAL(rk) :: t1 ! combined threshold + delta threshold HT value + + if (ht_opt .eq. 0) then !Calculate GAMMA_HT + t1 = tht + dtht + if (maxt2m <= tht) then + GAMMA_HT = 1.0_rk + else if ( maxt2m > tht .and. maxt2m < t1) then + GAMMA_HT = 1.0_rk + (cht - 1.0_rk)* (maxt2m - & + tht)/dtht + else + GAMMA_HT = cht + end if + else ! GAMMA_HT = 1 + GAMMA_HT = 1.0_rk + end if + + end function GET_GAMMA_HT +!----------------------------------------------------------------------- + +!----------------------------------------------------------------------- + + real(rk) function GET_GAMMA_LT(lt_opt, mint2m, clt, tlt, dtlt) result( GAMMA_LT ) + + ! !IROUTINE: get_gamma_lt + ! + ! !DESCRIPTION: Function GET\_GAMMA\_LT computes the activity factor + ! associated with low temperature stress of biogenic emission. Called from + ! GET\_MEGAN\_EMISSIONS only. + !\\ + !\\ + ! !INTERFACE: + + ! !INPUT PARAMETERS: + integer, INTENT(IN) :: lt_opt ! Option for lt stress calculation + ! 0=MEGANv3.2 On; + ! 1=MEGANv3.2 Off + real(rk), INTENT(IN) :: mint2m ! minimum input 2-m temperature [K] + real(rk), INTENT(IN) :: tlt ! threshold for low temperature [K] + real(rk), INTENT(IN) :: dtlt ! delta threshold for low temperature [K] + real(rk), INTENT(IN) :: clt ! coefficient for low temperature stress + ! + ! !RETURN VALUE: + !REAL(rk) :: GAMMA_LT ! LT activity factor [unitless] + ! + ! !LOCAL VARIABLES: + REAL(rk) :: t1 ! combined threshold + delta threshold LT value + + if (lt_opt .eq. 0) then !Calculate GAMMA_LT + t1 = tlt - dtlt + if (mint2m >= tlt) then + GAMMA_LT = 1.0_rk + else if ( mint2m < tlt .and. mint2m > t1) then + GAMMA_LT = 1.0_rk + (clt - 1.0_rk)* (tlt - & + mint2m)/dtlt + else + GAMMA_LT = clt + end if + else ! GAMMA_LT = 1 + GAMMA_LT = 1.0_rk + end if + + end function GET_GAMMA_LT +!----------------------------------------------------------------------- + +!----------------------------------------------------------------------- + + real(rk) function GET_GAMMA_HW(hw_opt, maxws10m, chw, thw, dthw) result( GAMMA_HW ) + + ! !IROUTINE: get_gamma_hw + ! + ! !DESCRIPTION: Function GET\_GAMMA\_HW computes the activity factor + ! associated with high wind stress of biogenic emission. Called from + ! GET\_MEGAN\_EMISSIONS only. + !\\ + !\\ + ! !INTERFACE: + + ! !INPUT PARAMETERS: + integer, INTENT(IN) :: hw_opt ! Option for hw stress calculation + ! 0=MEGANv3.2 On; + ! 1=MEGANv3.2 Off + real(rk), INTENT(IN) :: maxws10m ! maximum input 10-m wind speed [m/s] + real(rk), INTENT(IN) :: thw ! threshold for high wind speed [m/s] + real(rk), INTENT(IN) :: dthw ! delta threshold for high wind speed [m/s] + real(rk), INTENT(IN) :: chw ! coefficient for high wind speed stress + ! + ! !RETURN VALUE: + !REAL(rk) :: GAMMA_HW ! HT activity factor [unitless] + ! + ! !LOCAL VARIABLES: + REAL(rk) :: t1 ! combined threshold + delta threshold HW value + + if (hw_opt .eq. 0) then !Calculate GAMMA_HW + t1 = thw + dthw + if (maxws10m <= thw) then + GAMMA_HW = 1.0_rk + else if ( maxws10m > thw .and. maxws10m < t1) then + GAMMA_HW = 1.0_rk + (chw - 1.0_rk)* (maxws10m - & + thw)/dthw + else + GAMMA_HW = chw + end if + else ! GAMMA_HW = 1 + GAMMA_HW = 1.0_rk + end if + + end function GET_GAMMA_HW +!----------------------------------------------------------------------- + end module canopy_utils_mod