diff --git a/src/MNH/mode_chutil.f90 b/src/MNH/mode_chutil.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d1adb2e96a14e79289d3485153cb7510bdacc771 --- /dev/null +++ b/src/MNH/mode_chutil.f90 @@ -0,0 +1,685 @@ +! ################ + MODULE MODI_TROE +! ################ + +INTERFACE TROE + MODULE PROCEDURE TROE8, TROE9 +END INTERFACE TROE + +CONTAINS +! +!======================================================================== +!! ################################################################## + FUNCTION TROE8(PCOEF, PKO, PNEXP, PKINF, PMEXP, PM, PT, KVECNPT) +!! ################################################################## +!! +!!*** *TROE* +!! +!! PURPOSE +!! ------- +! this function implements the TROE reaction rate for RACM +!! +!! REFERENCE +!! --------- +!! Stockwell et al., JGR, 1997 +!! +!! AUTHOR +!! ------ +!! Karsten Suhre (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/01/98 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: TROE8 +REAL, INTENT(IN) :: PCOEF,PKO, PNEXP, PKINF, PMEXP +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZKOTM, ZKINFT, ZFACT +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +TROE8(:) = TROE9(PCOEF, PKO, PNEXP, PKINF, PMEXP, 0.6, PM, PT, KVECNPT) +! +END FUNCTION TROE8 +! +!! ################################################################### + FUNCTION TROE9(PCOEF, PKO, PNEXP, PKINF, PMEXP, PF, PM, PT, KVECNPT) +!! ################################################################### +!! +!!*** *TROE* +!! +!! PURPOSE +!! ------- +! this function implements the TROE reaction rate for RACM +!! +!! REFERENCE +!! --------- +!! Stockwell et al., JGR, 1997 +!! +!! AUTHOR +!! ------ +!! Karsten Suhre (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/01/98 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: TROE9 +REAL, INTENT(IN) :: PCOEF, PKO, PNEXP, PKINF, PMEXP, PF +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZKOTM, ZKINFT, ZFACT +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +ZKOTM(:) = PM(:) * PKO * ( (PT(:)/300.)**(-PNEXP) ) +ZKINFT(:)= PKINF * ( (PT(:)/300.)**(-PMEXP) ) +ZFACT(:) = PF**(1./(1.+ALOG10(ZKOTM(:)/ZKINFT(:))**2 )) +TROE9(:) = PCOEF*(ZKOTM(:)/(1.+ZKOTM(:)/ZKINFT(:)))*ZFACT(:) +! +END FUNCTION TROE9 +! +END MODULE MODI_TROE +! + +! ###################### + MODULE MODI_TROE_EQUIL +! ###################### +INTERFACE TROE_EQUIL + MODULE PROCEDURE TROE_EQUIL9, TROE_EQUIL10 +END INTERFACE TROE_EQUIL + +CONTAINS + +!! ######################################################################### + FUNCTION TROE_EQUIL9(PKO, PNEXP, PKINF, PMEXP, PAFACT, PB, PM, PT, KVECNPT) +!! ######################################################################### +!! +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_EQUIL9 +REAL, INTENT(IN) :: PKO, PNEXP, PKINF, PMEXP, PAFACT, PB +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +TROE_EQUIL9(:) = TROE_EQUIL10(PKO, PNEXP, PKINF, PMEXP, PAFACT, PB, 0.6, PM, PT, KVECNPT) + +END FUNCTION TROE_EQUIL9 +! +!! ############################################################################## + FUNCTION TROE_EQUIL10(PKO, PNEXP, PKINF, PMEXP, PAFACT, PB, PF, PM, PT, KVECNPT) +!! ############################################################################## +!! +!!*** *TROE_EQUIL* +!! +!! PURPOSE +!! ------- +! this function implements the TROE_EQUIL reaction rate for RACM +!! Formulation is from RACM and PKO, PNEXP, PKINF, PMEXP, PF +!! factors are issued from CACM, +!! whereas PAFACT, PB factors are from RACM. +!! +!! REFERENCE +!! --------- +!! Stockwell et al., JGR, 1997 +!! +!! AUTHOR +!! ------ +!! Karsten Suhre (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/01/98 +!! Tulet P. 08/11/04 Update to CACM +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_EQUIL10 +REAL, INTENT(IN) :: PKO, PNEXP, PKINF, PMEXP, PAFACT, PB, PF +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZKOTM, ZKINFT, ZFACT +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +ZKOTM(:) = PM(:) * PKO * ( (PT(:)/300.)**(-PNEXP) ) +ZKINFT(:) = PKINF * ( (PT(:)/300.)**(-PMEXP) ) +ZFACT(:) = PF**(1./(1.+ALOG10(ZKOTM(:)/ZKINFT(:))**2 )) +TROE_EQUIL10(:) = PAFACT*exp(-PB/PT(:))*(ZKOTM(:) & + /(1.+ZKOTM(:)/ZKINFT(:)))*ZFACT(:) +! +END FUNCTION TROE_EQUIL10 + +END MODULE MODI_TROE_EQUIL + +! +!======================================================================== +! +! ###################### + MODULE MODI_TROE_KA +! ###################### +INTERFACE +FUNCTION TROE_KA(PK1, PK1EXP, PK2, PK2EXP, PK3, PK3EXP, PM, PT,KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_KA +REAL, INTENT(IN) :: PK1, PK1EXP, PK2, PK2EXP, PK3, PK3EXP +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +END FUNCTION TROE_KA +END INTERFACE +END MODULE MODI_TROE_KA +! +!! ####################################################################### + FUNCTION TROE_KA(PK1, PK1EXP, PK2, PK2EXP, PK3, PK3EXP, PM, PT,KVECNPT) +!! ####################################################################### +!! +!!*** *TROE_EQUIL* +!! +!! PURPOSE +!! ------- +! this function implements rate constant Calculation for CACM +!! +!! REFERENCE +!! --------- +!! Griffin et al., JGR, 2002 +!! +!! AUTHOR +!! ------ +!! Tulet (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/11/04 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_KA +REAL, INTENT(IN) :: PK1, PK1EXP, PK2, PK2EXP, PK3, PK3EXP +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZK1, ZK2, ZK3 +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +ZK1(:) = PK1* EXP(PK1EXP / PT(:)) +ZK2(:) = PK2* EXP(PK2EXP / PT(:)) +ZK3(:) = PK3* EXP(PK3EXP / PT(:)) +TROE_KA(:) = ZK1(:) + ZK3(:)*PM(:)*(1 + ZK3(:)*PM(:) / ZK2(:)) +! +END FUNCTION TROE_KA +! +!======================================================================== +! +! ###################### + MODULE MODI_TROE_KB +! ###################### +INTERFACE +FUNCTION TROE_KB(PK1, PK1EXP, PK2, PK2EXP, PM, PT,KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_KB +REAL, INTENT(IN) :: PK1, PK1EXP, PK2, PK2EXP +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +END FUNCTION TROE_KB +END INTERFACE +END MODULE MODI_TROE_KB +! +!! ########################################################## + FUNCTION TROE_KB(PK1, PK1EXP, PK2, PK2EXP, PM, PT,KVECNPT) +!! ########################################################## +!! +!!*** *TROE_EQUIL* +!! +!! PURPOSE +!! ------- +! this function implements rate constant Calculation for CACM +!! +!! REFERENCE +!! --------- +!! Griffin et al., JGR, 2002 +!! +!! AUTHOR +!! ------ +!! Tulet (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/11/04 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL,DIMENSION(KVECNPT) :: TROE_KB +REAL, INTENT(IN) :: PK1, PK1EXP, PK2, PK2EXP +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZK1, ZK2 +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +ZK1(:) = PK1* EXP(PK1EXP / PT(:)) +ZK2(:) = PK2* EXP(PK2EXP / PT(:)) +TROE_KB(:) = ZK1(:) + ZK2(:)*PM(:) +! +END FUNCTION TROE_KB +! +!======================================================================== +! +! ############## + MODULE MODI_KT +! ############## +INTERFACE +FUNCTION KT(PALPHA, PMM, PT, PRAD, KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: KT +REAL, INTENT(IN) :: PALPHA,PMM +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT, PRAD +END FUNCTION KT +END INTERFACE +END MODULE MODI_KT +! +! +!! ########################################### + FUNCTION KT(PALPHA, PMM, PT, PRAD, KVECNPT) +!! ########################################### +!! +!!*** *KT* +!! +!! PURPOSE +!! ------- +! this function implements the mass transfer reaction rate +! for exchange between gas and aqueous phase +!! +!! REFERENCE +!! --------- +!! Schwartz, 1986 +!! +!! AUTHORS +!! ------ +!! Céline Mari & Maud Leriche (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 22/02/2007 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: KT +REAL, INTENT(IN) :: PALPHA,PMM +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT, PRAD +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZDG, ZV +! +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +ZV(:) = SQRT(8.*PT(:)*8.3144/(PMM*1.e-3)/3.1415926535898) +ZDG(:) = 1.e-7 * ZV(:) /3. !gas-phase diffusion +KT(:) = 1./(PRAD(:)*PRAD(:)/(3.*ZDG(:))+(4.*PRAD(:)/(3.*ZV(:)*PALPHA))) +! +END FUNCTION KT +! +!======================================================================== +! +! ################# + MODULE MODI_HENRY +! ################# +INTERFACE +FUNCTION HENRY(PH, PDEPT, PT, KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HENRY +REAL, INTENT(IN) :: PH,PDEPT +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT +END FUNCTION HENRY +END INTERFACE +END MODULE MODI_HENRY +! +! +!! ########################################### + FUNCTION HENRY(PH, PDEPT, PT, KVECNPT) +!! ########################################### +!! +!!*** *HENRY* +!! +!! PURPOSE +!! ------- +! this function computes the henry's law constant at a given temperature +!! +!! AUTHOR +!! ------ +!! Maud Leriche (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 23/02/2007 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HENRY +REAL, INTENT(IN) :: PH,PDEPT +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 1. THE EXPRESSION +! ----------------- +! +HENRY(:) = PH*EXP(-PDEPT*((1./PT(:))-(1./298.15))) +! +END FUNCTION HENRY +! +!======================================================================== +! +! ################# + MODULE MODI_HEFFA +! ################# +INTERFACE +FUNCTION HEFFA(PH, PDEPT, PK1, PDEPT1, PK2, PDEPT2, PPH, PT, KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HEFFA +REAL, INTENT(IN) :: PH,PDEPT,PK1,PDEPT1,PK2,PDEPT2 +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT,PPH +END FUNCTION HEFFA +END INTERFACE +END MODULE MODI_HEFFA +! +! +!! ##################################################################### + FUNCTION HEFFA(PH, PDEPT, PK1, PDEPT1, PK2, PDEPT2, PPH, PT, KVECNPT) +!! ##################################################################### +!! +!!*** *HEFFA* +!! +!! PURPOSE +!! ------- +! this function computes the effective henry's law constant +! at a given temperature for acid +!! +!! AUTHOR +!! ------ +!! Maud Leriche (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 23/02/2007 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HEFFA +REAL, INTENT(IN) :: PH,PDEPT,PK1,PDEPT1,PK2,PDEPT2 +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT,PPH +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZHPLUS, ZH, ZK1, ZK2 +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 0. Concentration of H+ +! ------------------------- +! +ZHPLUS(:) = 10.**(-PPH(:)) +! +!* 1. Temperature dependency +! ------------------------- +! +ZH(:) = PH*EXP(-PDEPT*((1./PT(:))-(1./298.15))) +ZK1(:) = PK1*EXP(-PDEPT1*((1./PT(:))-(1./298.15))) +ZK2(:) = PK2*EXP(-PDEPT2*((1./PT(:))-(1./298.15))) +! +!* 2. THE EXPRESSION +! ----------------- +! +HEFFA(:) = ZH(:)*( 1.0 + (ZK1(:)/ZHPLUS(:))*(1.0+(ZK2(:)/(ZHPLUS(:)))) ) +! +END FUNCTION HEFFA +! +!======================================================================== +! +! ################# + MODULE MODI_HEFFB +! ################# +INTERFACE +FUNCTION HEFFB(PH, PDEPT, PK1, PDEPT1, PPH, PT, KVECNPT) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HEFFB +REAL, INTENT(IN) :: PH,PDEPT,PK1,PDEPT1 +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT,PPH +END FUNCTION HEFFB +END INTERFACE +END MODULE MODI_HEFFB +! +! +!! ######################################################## + FUNCTION HEFFB(PH, PDEPT, PK1, PDEPT1, PPH, PT, KVECNPT) +!! ######################################################## +!! +!!*** *HEFFB* +!! +!! PURPOSE +!! ------- +! this function computes the effective henry's law constant +! at a given temperature for base +!! +!! AUTHOR +!! ------ +!! Maud Leriche (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Original 23/02/2007 +!! +!!------------------------------------------------------------------------------ +!! +!! EXTERNAL +!! -------- +!! none +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! none +!! +!! EXPLICIT ARGUMENTS +!! ------------------ +IMPLICIT NONE +INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask +REAL, DIMENSION(KVECNPT) :: HEFFB +REAL, INTENT(IN) :: PH,PDEPT,PK1,PDEPT1 +REAL, DIMENSION(KVECNPT), INTENT(IN) :: PT,PPH +!! +!! LOCAL VARIABLES +!! --------------- +REAL, DIMENSION(KVECNPT) :: ZKH2O, ZHPLUS, ZOHM, ZH, ZK1 +!! +!------------------------------------------------------------------------------ +!! +!! EXECUTABLE STATEMENTS +!! --------------------- +! +!* 0. Concentration of OH- +! ------------------------- +! +ZHPLUS(:) = 10.**(-PPH(:)) +ZKH2O = 1.e-14*EXP(-6716*((1./PT(:))-(1./298.15))) +ZOHM(:) = ZKH2O(:)/ZHPLUS(:) +! +!* 1. Temperature dependency +! ------------------------- +! +ZH(:) = PH*EXP(-PDEPT*((1./PT(:))-(1./298.15))) +ZK1(:) = PK1*EXP(-PDEPT1*((1./PT(:))-(1./298.15))) +! +!* 2. THE EXPRESSION +! ----------------- +! +HEFFB(:) = ZH(:)*( 1.0 + ZK1(:)/ZOHM(:) ) +! +END FUNCTION HEFFB +! + +