! $Id: hcn_ch3cn_mod.f,v 1.1 2009/06/09 21:51:53 daven Exp $ MODULE HCN_CH3CN_MOD ! !****************************************************************************** ! Module HCN_CH3CN_MOD contains variables and routines that are used for the ! geographically tagged HCN/CH3CN simulation. (qli, xyp, bmy, 8/16/05,9/27/06) ! ! Module Variables: ! ============================================================================ ! (1 ) HCN_BB_REGION : Array to denote tagged HCN biomass tracers ! (2 ) HCN_DF_REGION : Array to denote tagged HCN fossil fuel tracers ! (3 ) CH3CN_BB_REGION : Array to denote tagged CH3CN biomass tracers ! (4 ) CH3CN_DF_REGION : Array to denote tagged CH3CN fossil fuel tracers ! (5 ) EMIS_CO_df : Array for CO from domestic fossil fuel ! (6 ) HCN_INDEX : Index array for HCN tracers ! (7 ) CH3CN_INDEX : Index array for CH3CN tracers ! (8 ) SCNR89 : Weekday/weekend scenarios for fossil fuel scaling ! (9 ) TODH : Time of day scale factor for hydrocarbon emissions ! (10) TODN : Time of day scale factor for NOx emissions ! (11) TODB : Time of day scale factor for biogenic emissions ! ! Module Routines: ! ============================================================================ ! (1 ) DEFINE_BB_REGIONS : Defines geographic regions for biomass burn ! (2 ) DEFINE_DF_REGIONS : Defines geographic regions for fossil fuel ! (3 ) EMISS_HCN_CH3CN : Emits into geographically "tagged" tracers ! (4 ) CHEM_HCN_CH3CN : Does chemistry for "tagged" tracers ! (5 ) INIT_HCN_CH3CN : Allocates and initializes module arrays ! (6 ) CLEANUP_HCN_CH3CN : Deallocates module arrays ! ! GEOS-Chem modules referenced by hcn_ch3cn_mod.f ! ============================================================================ ! (1 ) biomass_mod.f : Module w/ routines to read biomass emissions ! (2 ) bpch2_mod.f : Module w/ routines for binary punch file I/O ! (3 ) dao_mod.f : Module w/ arrays for DAO met fields! ! (4 ) diag_mod.f : Module w/ GEOS-Chem diagnostic arrays ! (5 ) directory_mod.f : Module w/ GEOS-Chem data & met field dirs ! (6 ) geia_mod.f : Module w/ routines to read anthro emissions ! (7 ) global_oh_mod.f : Module w/ routines to read 3-D OH field ! (8 ) grid_mod.f : Module w/ horizontal grid information ! (9 ) global_oh_mod.f : Module w/ routines to read 3-D OH field ! (10) logical_mod.f : Module w/ GEOS-Chem logical switches ! (11) pbl_mix_mod.f : Module w/ routines for PBL height & mixing ! (12) time_mod.f : Module w/ routines for computing time & date ! (13) tracerid_mod.f : Module w/ pointers to tracers & emissions ! (14) transfer_mod.f : Module w/ routines to cast & resize arrays ! ! ! Tagged HCN/CH3CN tracers: ! ============================================================================ ! (1 ) Total HCN ! (2 ) Total CH3CN ! (3 ) HCN from Asian biomass burning ! (4 ) HCN from elsewhere biomass burning ! (5 ) HCN from Asian domestic fossil fuel ! (6 ) HCN from elsewhere domestic fossil fuel ! (7 ) CH3CN from Asian biomass burning ! (8 ) CH3CN from elsewhere biomass burning ! (9 ) CH3CN from Asian domestic fossil fuel ! (10) CH3CN from elsewhere domestic fossil fuel ! ! References: ! ============================================================================ ! (1 ) Li, Q.B., D.J. Jacob, R.M. Yantosca, C.L. Heald, H.B. Singh, M. Koike, ! Y.Zhao, G.W. Sachse, and D.G. Streets, "A Global 3-D Model Evaluation ! of the Atmospheric Budgets of HCN and CH3CN: Constraints From ! Aircraft Measurements Over the Western Pacific", J. Geophys. Res., ! 108(D21), 2003 ! (2 ) Nightingale et al [2000a], J. Geophys. Res, 14, 373-387 ! (3 ) Nightingale et al [2000b], Geophys. Res. Lett, 27, 2117-2120 ! ! NOTES: ! (1 ) Now use Nightingale et al [2000b] formulation for KL (bmy, 8/16/05) ! (2 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (3 ) Remove duplicate variable declarations for Linux IFORT v9 compiler ! (bmy, 11/2/05) ! (4 ) Now modified for new "biomass_mod.f" (bmy, 4/5/06) ! (5 ) BIOMASS(:,:,IDBCO) from "biomass_mod.f" is now in units of ! [molec CO/cm2/s]. Adjust unit conversion accordingly. (bmy, 9/27/06) !****************************************************************************** ! IMPLICIT NONE !================================================================= ! MODULE PRIVATE DECLARATIONS -- keep certain internal variables ! and routines from being seen outside "tagged_hcn_ch3cn_mod.f" !================================================================= ! Make everything PRIVATE ... PRIVATE ! ... except these routines PUBLIC :: CHEM_HCN_CH3CN PUBLIC :: CLEANUP_HCN_CH3CN PUBLIC :: EMISS_HCN_CH3CN !================================================================= ! MODULE VARIABLES !================================================================= ! Scalars REAL*8, PARAMETER :: MAIR = 28.96d-3 ! kg/mol REAL*8, PARAMETER :: MHCN = 27d-3 ! kg/mol REAL*8, PARAMETER :: MCH3CN = 41d-3 ! kg/mol REAL*8, PARAMETER :: XNUMOL_AIR = 6.022d23 / MAIR ! molec/kg REAL*8, PARAMETER :: XNUMOL_HCN = 6.022d23 / MHCN ! molec/kg REAL*8, PARAMETER :: XNUMOL_CH3CN = 6.022d23 / MCH3CN ! molec/kg ! Allocatable arrays INTEGER, ALLOCATABLE :: HCN_REG_bb(:,:) INTEGER, ALLOCATABLE :: HCN_REG_df(:,:) INTEGER, ALLOCATABLE :: CH3CN_REG_bb(:,:) INTEGER, ALLOCATABLE :: CH3CN_REG_df(:,:) REAL*8, ALLOCATABLE :: EMIS_CO_df(:,:) ! Fixed-size arrays INTEGER :: HCN_INDEX(5) INTEGER :: CH3CN_INDEX(5) REAL*8 :: SCNR89(3,3) REAL*8 :: TODH(6) REAL*8 :: TODN(6) REAL*8 :: TODB(6) !================================================================= ! MODULE ROUTINES -- follow below the "CONTAINS" statement !================================================================= CONTAINS !------------------------------------------------------------------------------ SUBROUTINE DEFINE_BB_REGIONS ! !****************************************************************************** ! Subroutine DEFINE_BB_REGIONS defines the geographic regions for biomass ! burning emissions for the tagged HCN/CH3CN simulation. (xyp, bmy, 6/30/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) REGION (INTEGER) : Array of Fossil Fuel CO regions ! ! NOTES: !****************************************************************************** ! ! References to F90 modules USE GRID_MOD, ONLY : GET_XMID, GET_YMID # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, J REAL*8 :: X, Y !================================================================= ! DEFINE_BB_REGIONS begins here! !================================================================= ! Loop over latitudes !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, X, Y ) DO J = 1, JJPAR ! Latitude [degrees] Y = GET_YMID( J ) ! Loop over longitudes DO I = 1, IIPAR ! Longitude [degrees] X = GET_XMID( I ) ! Region #3: SE Asian BB HCN (1st sub-box) IF ( ( X >= 72.5 .AND. X < 127.5 ) .AND. & ( Y >= 8.0 .AND. Y < 28.0 ) ) THEN HCN_REG_bb(I,J) = 3 ! Region #3: SE Asian HCN BB (2nd sub-box) ELSE IF ( ( X >= 72.5 .AND. X < 152.5 ) .AND. & ( Y >= 28.0 .AND. Y < 48.0 ) ) THEN HCN_REG_bb(I,J) = 3 ! Region #4: HCN BB from elsewhere ELSE HCN_REG_bb(I,J) = 4 ENDIF ! CH3CN tracer #'s are HCN tagged tracers + 4 CH3CN_REG_bb(I,J) = HCN_REG_bb(I,J) + 4 ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE DEFINE_BB_REGIONS !------------------------------------------------------------------------------ SUBROUTINE DEFINE_DF_REGIONS ! !****************************************************************************** ! Subroutine DEFINE_DF_REGIONS defines the geographic regions for domestic ! fossil fuel emissions for the HCN/CH3CN simulation. (xyp, bmy, 6/30/05) ! ! Arguments as Output: ! ============================================================================ ! (1 ) REGION (INTEGER) : Array of Fossil Fuel regions ! ! NOTES: !****************************************************************************** ! ! References to F90 modules USE GRID_MOD, ONLY : GET_XMID, GET_YMID # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, J REAL*8 :: X, Y !================================================================= ! DEFINE_DF_REGIONS begins here! !================================================================= ! Loop over latitudes !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, X, Y ) DO J = 1, JJPAR ! Latitude [degrees] Y = GET_YMID( J ) ! Loop over longitudes DO I = 1, IIPAR ! Longitude [degrees] X = GET_XMID( I ) ! Region #5: HCN Asian DF (1st sub-box) IF ( ( X >= 72.5 .AND. X < 127.5 ) .AND. & ( Y >= 8.0 .AND. Y < 28.0 ) ) THEN HCN_REG_df(I,J) = 5 ! Region #5: HCN Asian DF (2nd sub-box) ELSE IF ( ( X >= 72.5 .AND. X < 152.5 ) .AND. & ( Y >= 28.0 .AND. Y < 48.0 ) ) THEN HCN_REG_df(I,J) = 5 ! Region #6: HCN DF from elsewhere ELSE HCN_REG_df(I,J) = 6 ENDIF ! CH3CN tracer #'s are HCN tagged tracers + 4 CH3CN_REG_df(I,J) = HCN_REG_df(I,J) + 4 ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE DEFINE_DF_REGIONS !------------------------------------------------------------------------------ SUBROUTINE EMISS_HCN_CH3CN( N_TRACERS, STT ) ! !****************************************************************************** ! Subroutine EMISS_HCN_CH3CN reads in CO emissions and scale them to get ! HCN/CH3CN emissions for the tagged HCN/CH3CN run. (bmy, 8/16/05, 9/27/06) ! ! Arguments as Input: ! ============================================================================ ! (1 ) N_TRACERS (INTEGER) : Number of tracers ! (2 ) STT (REAL*8 ) : Tracer array [kg] ! ! NOTES: ! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (2 ) Now modified for new "biomass_mod.f" (bmy, 4/5/06) ! (3 ) BIOMASS(:,:,IDBCO) from "biomass_mod.f" is now in units of ! [molec CO/cm2/s]. Adjust unit conversion accordingly. (bmy, 9/27/06) !****************************************************************************** ! ! References to F90 modules USE BIOMASS_MOD, ONLY : BIOMASS, IDBCO USE GEIA_MOD, ONLY : GET_DAY_INDEX, GET_IHOUR USE GRID_MOD, ONLY : GET_AREA_CM2 USE DIAG_MOD, ONLY : AD09_em USE LOGICAL_MOD, ONLY : LSPLIT USE PBL_MIX_MOD, ONLY : GET_FRAC_OF_PBL, GET_PBL_MAX_L USE TIME_MOD, ONLY : GET_MONTH, GET_TS_CHEM, GET_TAU # include "CMN_SIZE" ! Size parameters # include "CMN_DIAG" ! ND09 ! Arguments INTEGER, INTENT(IN) :: N_TRACERS REAL*8, INTENT(INOUT) :: STT(IIPAR,JJPAR,LLPAR,N_TRACERS) ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, J, L, N, NTAU INTEGER :: IHOUR, INDEX, MONTH, PBL_MAX REAL*8 :: ACM2, E_CObb, E_COdf, SFAC89 REAL*8 :: HCN_bb, HCN_df, CH3CN_bb, CH3CN_df REAL*8 :: DTSRCE, FRAC ! Emission ratios for HCN/CH3CN from biomass burning ! and domestic fossil fuel REAL*8, PARAMETER :: EHCN_bb = 0.27d-2 REAL*8, PARAMETER :: EHCN_df = 1.60d-2 REAL*8, PARAMETER :: ECH3CN_bb = 0.20d-2 REAL*8, PARAMETER :: ECH3CN_df = 0.25d-2 ! External functions REAL*8, EXTERNAL :: BOXVL !================================================================= ! EMISS_TAGGED_HCN_CH3CN begins here! !================================================================= ! DTSRCE is the number of seconds per emission timestep DTSRCE = GET_TS_CHEM() * 60d0 ! Get the highest extent of the PBL [levels] PBL_MAX = GET_PBL_MAX_L() ! Get the current month MONTH = GET_MONTH() ! Current TAU value (integer) NTAU = GET_TAU() ! First-time initialization IF ( FIRST ) THEN CALL INIT_HCN_CH3CN FIRST = .FALSE. ENDIF !================================================================= ! Process biomass burning/domestic fossil fuel HCN/CH3CN emissions !================================================================= !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, ACM2, E_CObb, INDEX, SFAC89, E_COdf ) !$OMP+PRIVATE( IHOUR, N, L, HCN_bb, HCN_df, CH3CN_bb, CH3CN_df ) DO J = 1, JJPAR DO I = 1, IIPAR ! Grid area in [cm2] ACM2 = GET_AREA_CM2( J ) !----------------------------------------------------------------- ! (1) Process biomass burning HCN/CH3CN emissions !----------------------------------------------------------------- ! Get CO biomass burning [molec CO/cm2/s] E_CObb = BIOMASS(I,J,IDBCO) ! ND09: biomass burning HCN/CH3CN emissions [molec/cm2/s] IF ( ND09 > 0 ) THEN AD09_em(I,J,1) = AD09_em(I,J,1) + ( EHCN_bb * E_CObb ) AD09_em(I,J,2) = AD09_em(I,J,2) + ( ECH3CN_bb * E_CObb ) ENDIF ! Convert [molec CO/cm2/s] to [mole/grid box]: 1/6.022d23 = 1.66d-24 E_CObb = E_CObb * 1.66d-24 * ACM2 * DTSRCE !----------------------------------------------------------------- ! (2) Process domestic fossil fuel HCN/CH3CN emissions !----------------------------------------------------------------- ! SFAC89 is the Weekday/Saturday/Sunday scale factor INDEX = GET_DAY_INDEX( NTAU ) SFAC89 = SCNR89( 2, INDEX ) ! E_COdf is DF CO emissions in [molec CO/cm2/s] ! Scale E_COdf by the day-of-week scale factor SFAC89 E_COdf = EMIS_CO_df(I,J) * SFAC89 ! Scale E_COdf by the time-of-day scale factor TODH ! IHOUR is the index for the time-of-day scale factor TODH IHOUR = GET_IHOUR( I ) E_COdf = E_COdf * TODH(IHOUR) ! Enhance E_COdf by 18.5% to account for oxidation ! from anthropogenic VOC's (bnd, bmy, 6/8/01) E_COdf = E_COdf * 1.185d0 ! Get HCN domestic fossil fuel region # (either =5 or =6) N = HCN_REG_df(I,J) ! To achieve the best fit to the observed HCN-CH3CN-CO correlations ! in the boundary layer, we have to double the residential coal ! burning source from Asia. This leads us to reduce the residential ! coal burning source from the rest of the world by a factor of eight ! to achieve a best fit to the observed vertical distributions of HCN ! and CH3CN. [According to Li et al 2003.] (xyp, 6/22/05) IF ( N == 5 ) THEN E_COdf = E_COdf * 2.1d0 ! Asian domestic fossil fuel ELSE E_COdf = E_COdf / 8.0d0 ! Elsewhere domestic fossil fuel ENDIF ! ND09: domestic fossil fuel HCN/CH3CN emissions [molec/cm2/s] IF ( ND09 > 0 ) THEN AD09_em(I,J,3) = AD09_em(I,J,3) + ( EHCN_df * E_COdf ) AD09_em(I,J,4) = AD09_em(I,J,4) + ( ECH3CN_df * E_COdf ) ENDIF ! Convert [molec CO/cm2/s] to [mole/grid box]: 1/6.022d23 = 1.66d-24 E_COdf = E_COdf * 1.66d-24 * ACM2 * DTSRCE !----------------------------------------------------------------- ! (3) Partition emissions throughout the boundary layer !----------------------------------------------------------------- ! Loop up to the highest PBL level DO L = 1, PBL_MAX ! Fraction of the PBL occupied by this layer FRAC = GET_FRAC_OF_PBL( I, J, L ) ! HCN biomass and domestic fossil fuel emissions HCN_bb = FRAC * MHCN * EHCN_bb * E_CObb HCN_df = FRAC * MHCN * EHCN_df * E_COdf ! CH3CN biomass and domestic fossil fuel emissions CH3CN_bb = FRAC * MCH3CN * ECH3CN_bb * E_CObb CH3CN_df = FRAC * MCH3CN * ECH3CN_df * E_COdf ! Add total HCN emissions (BB+DF) into STT STT(I,J,L,1) = STT(I,J,L,1) + ( HCN_bb + HCN_df ) ! Add total CH3CN emissions (BB+DF) into STT STT(I,J,L,2) = STT(I,J,L,2) + ( CH3CN_bb + CH3CN_df ) ! If we are using tagged tracers ... IF ( LSPLIT ) THEN ! Add emissions into tagged HCN biomass tracers N = HCN_REG_bb(I,J) STT(I,J,L,N) = STT(I,J,L,N) + HCN_bb ! Add emissions into tagged HCN dom. fossil tracers N = HCN_REG_df(I,J) STT(I,J,L,N) = STT(I,J,L,N) + HCN_df ! Add emissions into tagged CH3CN biomass tracers N = CH3CN_REG_bb(I,J) STT(I,J,L,N) = STT(I,J,L,N) + CH3CN_bb ! Add emissions into tagged CH3CN dom. fossil tracers N = CH3CN_REG_df(I,J) STT(I,J,L,N) = STT(I,J,L,N) + CH3CN_df ENDIF ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE EMISS_HCN_CH3CN !------------------------------------------------------------------------------ SUBROUTINE CHEM_HCN_CH3CN( N_TRACERS, STT ) ! !****************************************************************************** ! Subroutine CHEM_HCN_CH3CN computes the loss of HCN and CH3CN due to ! reaction with OH and ocean uptake. (xyp, bmy, 8/16/05, 11/2/05) ! ! Arguments as Input: ! ============================================================================ ! (1 ) FIRSTCHEM (LOGICAL) : = T if this is the first call to this routine ! ! NOTES: ! (1 ) Now use Nightingale et al [2000b] formulation for KL (bmy, 8/16/05) ! (2 ) Bug fix: remove duplicate declaration of KTMP (bmy, 11/2/05) !****************************************************************************** ! ! References to F90 modules USE DAO_MOD, ONLY : AD, ALBD, T, TS, U10M, V10M USE DIAG_MOD, ONLY : AD09, AD09_em USE GLOBAL_OH_MOD, ONLY : OH, GET_GLOBAL_OH USE GRID_MOD, ONLY : GET_AREA_CM2 USE LOGICAL_MOD, ONLY : LSPLIT USE TIME_MOD, ONLY : GET_TS_CHEM, GET_MONTH, ITS_A_NEW_MONTH # include "CMN_SIZE" ! Size parameters # include "CMN_DIAG" ! ND09 # include "CMN_DEP" ! FRCLND ! Arguments INTEGER, INTENT(IN) :: N_TRACERS REAL*8, INTENT(INOUT) :: STT(IIPAR,JJPAR,LLPAR,N_TRACERS) ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, J, L, N, NN, N_MAX REAL*8 :: K0, K1, KTMP, KRATE, TMP, DTCHEM REAL*8 :: H, U, TC, SC, KL, KG REAL*8 :: KKG, CL, SR, CG, FLUX REAL*8 :: ACM2, AMT_LOST, OCEAN_HCN REAL*8 :: FOCEAN, OCEAN_CH3CN ! Undersaturation ratios for HCN/CH3CN in seawater REAL*8, PARAMETER :: ALPHA_HCN = 0.21d0 REAL*8, PARAMETER :: ALPHA_CH3CN = 0.12d0 ! Coefficients for fitting the Schmdit number for HCN in seawater REAL*8, PARAMETER :: A0 = 2008.917d0 REAL*8, PARAMETER :: A1 = -83.235d0 REAL*8, PARAMETER :: A2 = 1.348d0 REAL*8, PARAMETER :: A3 = -0.009d0 ! Coefficients for fitting the Schmdit number for CH3CN in seawater REAL*8, PARAMETER :: B0 = 2745.722d0 REAL*8, PARAMETER :: B1 = -113.763d0 REAL*8, PARAMETER :: B2 = 1.843d0 REAL*8, PARAMETER :: B3 = -0.012d0 ! External functions REAL*8, EXTERNAL :: BOXVL !================================================================= ! CHEM_HCN_CH3CN begins here! !================================================================= ! First-time initialization (if not already done) IF ( FIRST ) THEN CALL INIT_HCN_CH3CN FIRST = .FALSE. ENDIF ! Read offline OH fields once per month IF ( ITS_A_NEW_MONTH() ) THEN CALL GET_GLOBAL_OH( GET_MONTH() ) ENDIF ! Compute number of tracers to process IF ( LSPLIT ) THEN N_MAX = 5 ELSE N_MAX = 1 ENDIF !================================================================= ! Do HCN and CH3CN chemistry !================================================================= ! Chemistry timestep in seconds DTCHEM = GET_TS_CHEM() * 60d0 ! Loop over grid boxes !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, K0, K1, TMP, KTMP, KRATE, NN, N, AMT_LOST ) DO L = 1, LLPAR DO J = 1, JJPAR DO I = 1, IIPAR !------------------------------------------------------------------ ! (1) HCN loss via reaction with OH !------------------------------------------------------------------ K0 = 7.4d-33 K1 = 9.0d-15 * ( T(I,J,L) / 300d0 ) ** 3.2d0 TMP = K0 / K1 * AD(I,J,L) * XNUMOL_AIR / BOXVL(I,J,L) ! K: [cm3/molec/s] KTMP = K1 * TMP / ( 1d0 + TMP ) & * EXP ( -0.511d0 / ( 1d0 + LOG10( TMP ) ** 2d0 ) ) ! Rate constant for rxn w/ OH [units??] KRATE = KTMP * OH(I,J,L) * DTCHEM ! Subtract lost HCN from STT array DO NN = 1, N_MAX ! Get the pr N = HCN_INDEX(NN) ! Compute the amount of tracer that is lost to OH AMT_LOST = KRATE * STT(I,J,L,N) ! Remove lost tracer from STT array (avoid negatives!) STT(I,J,L,N) = MAX( STT(I,J,L,N) - AMT_LOST, 0d0 ) ! ND09 diagnostic: HCN/CH3CN loss via OH [kg] IF ( ND09 > 0 ) THEN AD09(I,J,L,N) = AD09(I,J,L,N) + AMT_LOST ENDIF ENDDO !------------------------------------------------------------------ ! (2) CH3CN loss via reaction with OH !------------------------------------------------------------------ ! K: [cm3/molec/s] KTMP = 7.8d-13 * EXP( -1050d0 / T(I,J,L) ) KRATE = KTMP * OH(I,J,L) * DTCHEM ! Subtract lost CH3CN tracer from STT DO NN = 1, N_MAX ! Get the proper tracer number N = CH3CN_INDEX(NN) ! Compute the amount of tracer that is lost to OH AMT_LOST = KRATE * STT(I,J,L,N) ! Remove lost CH3CN tracer from STT array (avoid negatives!) STT(I,J,L,N) = MAX( STT(I,J,L,N) - AMT_LOST, 0d0 ) ! ND09 diagnostic: CH3CN loss via OH [kg] IF ( ND09 > 0 ) THEN AD09(I,J,L,N) = AD09(I,J,L,N) + AMT_LOST ENDIF ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO !================================================================= ! HCN and CH3CN ocean uptake !================================================================= ! Loop over grid boxes !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, FOCEAN, OCEAN_HCN, OCEAN_CH3CN, ACM2 ) !$OMP+PRIVATE( U, TC, H, SC, KL, KG ) !$OMP+PRIVATE( KKG, NN, N, CG, FLUX, AMT_LOST ) !$OMP+SCHEDULE( DYNAMIC ) DO J = 1, JJPAR DO I = 1, IIPAR ! Fraction of a grid box that is ocean FOCEAN = 1d0 - FRCLND(I,J) ! Initialize HCN and CH3CN [kg] lost into the ocean OCEAN_HCN = 0d0 OCEAN_CH3CN = 0d0 ! Make sure there is > 50% ocean (not ice) in the grid box IF ( FOCEAN > 0.5d0 .AND. ALBD(I,J) <= 0.4d0 ) THEN ! Grid box area in [cm2] ACM2 = GET_AREA_CM2( J ) ! Wind speed [m/s] at 10m above the surface U = SQRT( U10M(I,J)**2 + V10M(I,J)**2 ) ! Surface temperature [C] TC = TS(I,J) - 273.15d0 !----------------------------------------------------------- ! (1) HCN ocean uptake !----------------------------------------------------------- ! Henry's law constant for HCN [unitless] H = 7.93d4 * EXP( -5000d0 / TS(I,J) ) ! SC is Schmidt # for HCN in seawater [unitless] SC = A0 + TC * ( A1 + TC * ( A2 + TC * ( A3 ))) ! KL: conductance for mass transfer in liquid phase ! (Nightingale 2000b), which has unit of [cm/h] KL = ( 0.24d0*U*U + 0.061d0*U ) * SQRT( 600d0/SC ) ! KG: conductance for mass transfer in gas phase (Asher 1997) ! Convert from m/s to cm/h by multiplying 360000 KG = ( 15.3d0 + 940.6d0 * U ) ! KKG: transfer velocity on a gas phase basis (Liss & Slater 1974) ! Convert from [cm/h] to [cm/s] by dividing 3600 KKG = 2.78d-4 * KL * KG / ( KL + H * KG ) ! Loop over HCN tagged tracers DO NN = 1, N_MAX ! Get HCN tagged tracer number N = HCN_INDEX(NN) ! Bulk concentration of HCN in gas phase [kg/cm3] CG = STT(I,J,1,N) / BOXVL(I,J,1) ! Air-to-sea flux of HCN [kg/cm2/s] FLUX = ALPHA_HCN * KKG * CG ! Amount of tagged tracer lost to ocean [kg] AMT_LOST = FLUX * FOCEAN * ACM2 * DTCHEM ! Save total HCN lost to ocean for ND09 diag [molec/cm2/s] IF ( N == 1 ) THEN OCEAN_HCN = AMT_LOST * XNUMOL_HCN / ( ACM2 * DTCHEM ) ENDIF ! Subtract ocean loss from STT array [kg/box/step] STT(I,J,1,N) = MAX( STT(I,J,1,N) - AMT_LOST, 0d0 ) ENDDO !----------------------------------------------------------- ! (2) CH3CN ocean uptake !----------------------------------------------------------- ! Henry's law constant for CH3CN [unitless] H = 861.7d0 * EXP( -4100d0 / TS(I,J) ) ! SC is Schmidt # for HCN in seawater [unitless] SC = B0 + TC * ( B1 + TC * ( B2 + TC * ( B3 ))) ! KL: conductance for mass transfer in liquid phase ! (Wanninkhof 1992), which has units of [cm/h] KL = ( 0.222d0 * U * U + 0.333d0 * U ) & * ( SC / 600d0 )**( -0.5d0 ) ! KG: conductance for mass transfer in gas phase (Asher 1997) ! Convert from m/s to cm/h by mutiplying by 360000 KG = ( 12.4d0 + 763.3d0 * U ) ! KKG: transfer velocity on a gas phase basis (Liss & Slater 1974) ! Convert from [cm/h] to [cm/s] by dividing by 3600 KKG = 2.78d-4 * KL * KG / ( KL + H * KG ) ! Loop over CH3HCN tagged tracers DO NN = 1, N_MAX ! Get CH3CN tagged tracer number N = CH3CN_INDEX(NN) ! Bulk concentration of CH3CN in gas phase [kg/cm3] CG = STT(I,J,1,N) / BOXVL(I,J,1) ! Air-to-sea flux of HCN [kg/cm2/s] FLUX = ALPHA_HCN * KKG * CG ! Amount of tagged tracer lost to ocean [kg] AMT_LOST = FLUX * FOCEAN * ACM2 * DTCHEM ! Save total HCN lost to ocean for ND09 diag [molec/cm2/s] IF ( N == 2 ) THEN OCEAN_CH3CN = AMT_LOST * XNUMOL_CH3CN / (ACM2*DTCHEM) ENDIF ! Subtract ocean loss from STT array [kg/box/step] STT(I,J,1,N) = MAX( STT(I,J,1,N) - AMT_LOST, 0d0 ) ENDDO ENDIF !-------------------------------------------------------------- ! ND10 diag: Save HCN and CH3CN ocean uptake in [molec/cm2/s] !-------------------------------------------------------------- IF ( ND09 > 0 ) THEN AD09_em(I,J,5) = AD09_em(I,J,5) + OCEAN_HCN AD09_em(I,J,6) = AD09_em(I,J,6) + OCEAN_CH3CN ENDIF ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE CHEM_HCN_CH3CN !------------------------------------------------------------------------------ SUBROUTINE READ_EMISSIONS ! !****************************************************************************** ! Subroutine READ_EMISSIONS reads the domestic fossil fuel emissions from ! disk. (bmy, 6/29/05, 10/3/05) ! ! Arguments as Output: ! ============================================================================ ! (1 ) E_CO (REAL*4) : GEIA anthro CO (no seasonality, 1 level ) ! ! NOTES: ! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) !****************************************************************************** ! ! References to F90 modules USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2 USE DIRECTORY_MOD, ONLY : DATA_DIR USE GEIA_MOD, ONLY : READ_TODX USE TRANSFER_MOD, ONLY : TRANSFER_2D # include "CMN_SIZE" ! Size parameters ! Local variables REAL*4 :: ARRAY(IGLOB,JGLOB,1) CHARACTER(LEN=255) :: FILENAME !================================================================= ! READ_EMISSIONS begins here! !================================================================= ! Define the binary punch file name FILENAME = TRIM( DATA_DIR ) // & 'HCN_200507/domfos_CO_for_TRACEP.' // & GET_NAME_EXT_2D() // '.' // GET_RES_EXT() ! Write file name to stdout WRITE( 6, 100 ) TRIM( FILENAME ) 100 FORMAT( 'READ_EMISSIONS: Reading ', a ) ! Read time-of-day and day-of-week scale factors for GEIA emissions CALL READ_TODX( TODN, TODH, TODB, SCNR89 ) ! Read CO (tracer #4): aseasonal CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 4, & 0d0, IGLOB, JGLOB, & 1, ARRAY(:,:,1), QUIET=.TRUE. ) ! Cast to REAL*8 and resize if necessary CALL TRANSFER_2D( ARRAY(:,:,1), EMIS_CO_df ) ! Return to calling program END SUBROUTINE READ_EMISSIONS !------------------------------------------------------------------------------ SUBROUTINE INIT_HCN_CH3CN ! !****************************************************************************** ! Subroutine INIT_TAGGED_HCN_CH3CN allocates memory to module arrays. ! (bmy, 6/29/05) ! ! NOTES: !****************************************************************************** ! ! References to F90 modules USE ERROR_MOD, ONLY : ALLOC_ERR # include "CMN_SIZE" ! Size parameters ! Local variables LOGICAL, SAVE :: IS_INIT = .FALSE. INTEGER :: AS !================================================================= ! INIT_TAGGED_CO begins here! !================================================================= ! Return if we have already allocated arrays IF ( IS_INIT ) RETURN ! Allocate arrays ALLOCATE( HCN_REG_bb( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'HCN_REG_bb' ) ALLOCATE( HCN_REG_df( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'HCN_REG_df' ) ALLOCATE( CH3CN_REG_bb( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CH3CN_REG_bb' ) ALLOCATE( CH3CN_REG_df( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CH3CN_REG_df' ) ALLOCATE( EMIS_CO_df( IIPAR, JJPAR ), STAT=as ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'EMIS_CO_df' ) ! Define geographic regions for biomass burning CALL DEFINE_BB_REGIONS ! Define geographic regions for domestic fossil fuel burning CALL DEFINE_DF_REGIONS ! Read domestic fossil fuel emissions CALL READ_EMISSIONS ! Index of HCN tracers HCN_INDEX(:) = (/ 1, 3, 4, 5, 6 /) ! Index of CH3CN tracers CH3CN_INDEX(:) = (/ 2, 7, 8, 9, 10 /) ! Set flag IS_INIT = .TRUE. ! Return to calling program END SUBROUTINE INIT_HCN_CH3CN !------------------------------------------------------------------------------ SUBROUTINE CLEANUP_HCN_CH3CN ! !****************************************************************************** ! Subroutine CLEANUP_HCN_CH3CN deallocates memory from previously ! allocated module arrays (bmy, 6/23/05) ! ! NOTES: !****************************************************************************** ! !================================================================= ! CLEANUP_HCN_CH3CN begins here! !================================================================= IF ( ALLOCATED( HCN_REG_bb ) ) DEALLOCATE( HCN_REG_bb ) IF ( ALLOCATED( HCN_REG_df ) ) DEALLOCATE( HCN_REG_df ) IF ( ALLOCATED( CH3CN_REG_bb ) ) DEALLOCATE( CH3CN_REG_bb ) IF ( ALLOCATED( CH3CN_REG_df ) ) DEALLOCATE( CH3CN_REG_df ) IF ( ALLOCATED( EMIS_CO_df ) ) DEALLOCATE( EMIS_CO_df ) ! Return to calling program END SUBROUTINE CLEANUP_HCN_CH3CN !------------------------------------------------------------------------------ ! End of module END MODULE HCN_CH3CN_MOD