From 33d6ad639847a3809e8f2b5f70379d34345a0fd9 Mon Sep 17 00:00:00 2001 From: Gaelle Tanguy <gaelle.tanguy@meteo.fr> Date: Tue, 1 Dec 2015 15:26:23 +0000 Subject: [PATCH] M.Leriche 11/2015 : bug chemistery --- src/MNH/BASIC.f90 | 493 +------------------------------ src/MNH/ch_aer_driver.f90 | 21 +- src/MNH/ch_aer_eqm_initn.f90 | 3 +- src/MNH/ch_aer_nucl.f90 | 12 +- src/MNH/ch_aer_reallfin.f90 | 3 +- src/MNH/ch_aer_solv.f90 | 13 +- src/MNH/ch_aer_wetdepn.f90 | 5 +- src/MNH/ch_aqueous_tmicice.f90 | 3 +- src/MNH/ch_model0d.f90 | 2 + src/MNH/ch_read_chem.f90 | 2 + src/MNH/ch_write_chem.f90 | 2 + src/MNH/exchange.f90 | 12 +- src/MNH/mode_aero_psd.f90 | 4 + src/MNH/prep_real_case.f90 | 8 +- src/SURFEX/ch_emission_fluxn.F90 | 11 +- src/SURFEX/mode_aer_surf.F90 | 10 +- 16 files changed, 83 insertions(+), 521 deletions(-) diff --git a/src/MNH/BASIC.f90 b/src/MNH/BASIC.f90 index 0a3a8f4b2..d01f28929 100644 --- a/src/MNH/BASIC.f90 +++ b/src/MNH/BASIC.f90 @@ -1,21 +1,16 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -! ! !======================================================================== ! ! The following species appear on the left hand side of a reaction, ! but they are not in the list of prognostic variables. Make sure that ! they are defined elsewhere (in begin_module as TPK%something): -! CO2 +! H2 ! O1D +! W_O2 ! O3P -! H2 ! H2O +! CO2 ! N2 -! W_O2 ! O2 ! !======================================================================== @@ -23,11 +18,11 @@ ! The following species appear on the right hand side of a reaction, ! but they are not in the list of prognostic variables. Make sure that ! they are really final products or defined elsewhere: -! CO2 +! H2 ! O1D ! O3P -! H2 ! H2O +! CO2 ! N2 ! O2 ! @@ -1977,468 +1972,6 @@ END MODULE MODD_CH_M9_SCHEME ! !======================================================================== ! -! /BEGIN_ADDITIONAL/ -! -! ################ - MODULE MODI_TROE -! ################ -INTERFACE -FUNCTION TROE(PCOEF,PKO, PNEXP, PKINF, PMEXP, PM, PT, KVECNPT) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KVECNPT ! no. of points in vector mask -REAL, DIMENSION(KVECNPT) :: TROE -REAL, INTENT(IN) :: PCOEF,PKO, PNEXP, PKINF, PMEXP -REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT -END FUNCTION TROE -END INTERFACE -END MODULE MODI_TROE -! -!======================================================================== -!! ############################################################# - FUNCTION TROE(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) :: TROE -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 -! ----------------- -! -ZKOTM(:) = PM(:) * PKO * ( (PT(:)/300.)**(-PNEXP) ) -ZKINFT(:) = PKINF * ( (PT(:)/300.)**(-PMEXP) ) -ZFACT(:) = 0.6**(1./(1.+ALOG10(ZKOTM(:)/ZKINFT(:))**2 )) -TROE(:) = PCOEF*(ZKOTM(:)/(1.+ZKOTM(:)/ZKINFT(:)))*ZFACT(:) -! -END FUNCTION TROE -! -!======================================================================== -! -! ###################### - MODULE MODI_TROE_EQUIL -! ###################### -INTERFACE -FUNCTION TROE_EQUIL(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_EQUIL -REAL, INTENT(IN) :: PKO, PNEXP, PKINF, PMEXP, PAFACT, PB -REAL, DIMENSION(KVECNPT), INTENT(IN) :: PM, PT -END FUNCTION TROE_EQUIL -END INTERFACE -END MODULE MODI_TROE_EQUIL -! -!! ######################################################################### - FUNCTION TROE_EQUIL(PKO, PNEXP, PKINF, PMEXP, PAFACT, PB, PM, PT,KVECNPT) -!! ######################################################################### -!! -!!*** *TROE_EQUIL* -!! -!! PURPOSE -!! ------- -! this function implements the TROE_EQUIL 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) :: TROE_EQUIL -REAL, INTENT(IN) :: PKO, PNEXP, PKINF, PMEXP, PAFACT, PB -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(:) = 0.6**(1./(1.+ALOG10(ZKOTM(:)/ZKINFT(:))**2 )) -TROE_EQUIL(:) = PAFACT*exp(-PB/PT)*(ZKOTM/(1.+ZKOTM(:)/ZKINFT(:)))*ZFACT(:) -! -END FUNCTION TROE_EQUIL -! -!======================================================================== -! -! ############## - 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 -! -! /END_ADDITIONAL/ -! -!======================================================================== -! ! ########################## MODULE MODI_CH_ALLOCATE_TACCS ! ########################## @@ -28772,12 +28305,12 @@ USE MODD_CH_M9_SCHEME USE MODD_CH_M9_n, ONLY : METEOTRANSTYPE USE MODD_CH_MNHC_n, ONLY : XRTMIN_AQ, XCH_PHINIT ! USER DEFINED FUNCTIONS -USE MODI_HEFFA -USE MODI_HEFFB -USE MODI_TROE USE MODI_KT -USE MODI_TROE_EQUIL +USE MODI_TROE USE MODI_HENRY +USE MODI_HEFFA +USE MODI_TROE_EQUIL +USE MODI_HEFFB !! !! EXPLICIT ARGUMENTS !! ------------------ @@ -29635,12 +29168,12 @@ USE MODD_CH_M9_SCHEME USE MODD_CH_M9_n, ONLY : METEOTRANSTYPE USE MODI_CH_ALLOCATE_TACCS ! USER DEFINED FUNCTIONS -USE MODI_HEFFA -USE MODI_HEFFB -USE MODI_TROE USE MODI_KT -USE MODI_TROE_EQUIL +USE MODI_TROE USE MODI_HENRY +USE MODI_HEFFA +USE MODI_TROE_EQUIL +USE MODI_HEFFB !! !! EXPLICIT ARGUMENTS !! ------------------ diff --git a/src/MNH/ch_aer_driver.f90 b/src/MNH/ch_aer_driver.f90 index c7262ca28..dc81a8e59 100644 --- a/src/MNH/ch_aer_driver.f90 +++ b/src/MNH/ch_aer_driver.f90 @@ -55,6 +55,7 @@ SUBROUTINE CH_AER_DRIVER(PM, PSIG0, PRG0, PN0, PCTOTG, PCTOTA,& !! MODIFICATIONS !! ------------- !! Original +!! M.Leriche 2015 Calcul de la fraction massique entre les modes !! !! EXTERNAL !! -------- @@ -84,7 +85,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PRV, PDENAIR, PPRESSURE ! ! Declarations variables internes ! -INTEGER :: II +INTEGER :: II, JI, JJ ! Variables utilisees pour le tranfert de moment de chaque espece ! pour la condensation @@ -97,7 +98,7 @@ REAL :: ZGASMW ! Molecular weight of background REAL, DIMENSION(SIZE(PM,1)) :: ZPGAS ! background gas pressure (Pa) REAL, DIMENSION(SIZE(PM,1)) :: ZRH,PSAT ! Relative humidity REAL :: ZDT ! Pas de temps -REAL, DIMENSION(SIZE(PM,1)) :: ZPKM, ZPKH2O +REAL, DIMENSION(SIZE(PM,1)) :: ZPKM, ZPKH2O, ZSUM !----------------------------------------------------------------------------- @@ -110,6 +111,22 @@ NM0(2) = 4 NM3(2) = 5 NM6(2) = 6 +!************************************************************* +! Calcul de la fraction massique entre les modes +!************************************************************* +ZSUM (:) = 0. +DO JI=1,JPMODE + DO JJ=1,NSP+NCARB+NSOA + ZSUM (:) = ZSUM (:) + PCTOTA(:,JJ,JI) + ENDDO +ENDDO +POM(:,:) = 0. +DO JI=1,JPMODE + DO JJ=1,NSP+NCARB+NSOA + POM(:,JI) = POM(:,JI) + PCTOTA(:,JJ,JI) / ZSUM (:) + ENDDO +ENDDO + !****************************************************** ! Thermodynamic variables initialization diff --git a/src/MNH/ch_aer_eqm_initn.f90 b/src/MNH/ch_aer_eqm_initn.f90 index 8de41ffcc..ef4f69812 100644 --- a/src/MNH/ch_aer_eqm_initn.f90 +++ b/src/MNH/ch_aer_eqm_initn.f90 @@ -48,7 +48,7 @@ END MODULE MODI_CH_AER_EQM_INIT_n !! !! MODIFICATIONS !! ------------- -!! none +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -132,6 +132,7 @@ XMI(:,:,:,JP_AER_SO4) = 98. XMI(:,:,:,JP_AER_NO3) = 63. XMI(:,:,:,JP_AER_NH3) = 17. XMI(:,:,:,JP_AER_H2O) = 18. +XMI(:,:,:,JP_AER_BC) = 12. XMI(:,:,:,JP_AER_DST) = 100. IF (NSOA .EQ. 10) THEN XMI(:,:,:,JP_AER_SOA1) = 88. diff --git a/src/MNH/ch_aer_nucl.f90 b/src/MNH/ch_aer_nucl.f90 index d3acfcef1..738f80a9c 100644 --- a/src/MNH/ch_aer_nucl.f90 +++ b/src/MNH/ch_aer_nucl.f90 @@ -49,6 +49,7 @@ SUBROUTINE CH_AER_NUCL(ZRH,ZT,ZCONC,ZJ,ZAL,KVECNPT) !! MODIFICATIONS !! ------------- !! P. Tulet 05/01/04 +!! M.Leriche 2015 : correction bug !---------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -79,6 +80,8 @@ XH2O(:) = ZRH(:)*PVH2O(:)/(Kb*ZT(:))/1.E6 ZJ(:)=0. ZAL(:)=0. +RA(:)=0. + WHERE(((ZT(:)>=223.).OR.(ZT(:)<=298)).AND.(ZRH(:)>=0.1)) ! 1. Saturation vapor pressure for water (N/m2, T in K) ! (Preining et al, 1981) @@ -100,14 +103,13 @@ WHERE(((ZT(:)>=223.).OR.(ZT(:)<=298)).AND.(ZRH(:)>=0.1)) END WHERE ! 5. H2SO4 mole fraction in the critical nucleous DO II=1,SIZE(ZCONC,1) - IF((ZCONC(II)>0.).AND.(XH2O(II)>0.)) THEN + IF((ZCONC(II)>0.).AND.(XH2O(II)>0.).AND.(RA(II)/=0.)) THEN ZAL(II)=1.2233-0.0154*RA(II)/(RA(II)+ZRH(II))+0.0102*& LOG(ZCONC(II))-0.0415*LOG(XH2O(II))+0.0016*ZT(II) END IF END DO -WHERE(((ZT(:)>=223.).OR.(ZT(:)<=298)).AND.(ZRH(:)>=0.1)) - WHERE(ZAL(:)/=0.) +WHERE(((ZT(:)>=223.).OR.(ZT(:)<=298)).AND.(ZRH(:)>=0.1).AND.ZAL(:)/=0.) ! 6. Sulfuric nucleation rate (molec/cm3/s) XNSULFC(:)=EXP(-14.5125+0.1335*ZT(:)-10.5462*ZRH(:)+1958.4*ZRH(:)/ZT(:)) SIG(:) = 1.+(ZT(:)-273.15)/273.15 @@ -115,11 +117,7 @@ WHERE(((ZT(:)>=223.).OR.(ZT(:)<=298)).AND.(ZRH(:)>=0.1)) KHI(:)=25.1289*XNSULF(:)-4890.8*XNSULF(:)/ZT(:)-1743.3/ZT(:)-2.2479*SIG(:)*XNSULF(:)*ZRH(:)+& 7643.4*ZAL(:)/ZT(:)-1.9712*ZAL(:)*SIG(:)/ZRH(:) ZJ(:)=EXP(KHI(:)) - END WHERE END WHERE -!WHERE(RA(:)>1) -! ZJ(:)=0. -!END WHERE RETURN END SUBROUTINE CH_AER_NUCL diff --git a/src/MNH/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90 index 7cd7ca1e5..99b0f8766 100644 --- a/src/MNH/ch_aer_reallfin.f90 +++ b/src/MNH/ch_aer_reallfin.f90 @@ -46,7 +46,7 @@ END MODULE MODI_CH_AER_REALLFI_n !! !! MODIFICATIONS !! ------------- -!! none +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -117,6 +117,7 @@ ZMI(JP_AER_SO4) = 98. ZMI(JP_AER_NO3) = 63. ZMI(JP_AER_NH3) = 17. ZMI(JP_AER_H2O) = 18. +ZMI(JP_AER_BC) = 12. ZMI(JP_AER_DST) = 100. ! IF (NSOA .EQ. 10) THEN diff --git a/src/MNH/ch_aer_solv.f90 b/src/MNH/ch_aer_solv.f90 index 5e104e8d4..6bfd75ce3 100644 --- a/src/MNH/ch_aer_solv.f90 +++ b/src/MNH/ch_aer_solv.f90 @@ -65,7 +65,7 @@ END MODULE MODI_CH_AER_SOLV !! !! EXTERNAL !! -------- -!! None +!! M.Leriche 2015 correction bug !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,7 +101,6 @@ INTEGER :: JI,JJ,JK, JN, IDT REAL, DIMENSION(SIZE(PM,1)) :: ZSUM REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZNEWM, ZMASK REAL, DIMENSION(SIZE(PM,1)) :: ZSIGMA -REAL, DIMENSION(SIZE(POM,1),SIZE(POM,2)) :: ZOM REAL, DIMENSION(SIZE(PM,1)) :: ZA,ZB,ZC,ZD REAL, DIMENSION(SIZE(PM,1)) :: ZCONST1,ZCONST2 @@ -168,7 +167,7 @@ ZA(:)=0. ZB(:)=0. ZC(:)=0. ZA(:)=PDMINTRA(:,NM0(JI)) -!ZB(:)=PDMINTER(:,NM0(JI)) +ZB(:)=PDMINTER(:,NM0(JI)) ZC(:)=PDMCOND(:,NM0(JI)) DO JK=1,SIZE(PM,1) @@ -266,10 +265,10 @@ DO JI=1,JPMODE ZSUM (:) = ZSUM (:) + PCTOTA(:,JJ,JI) ENDDO ENDDO -ZOM(:,:) = 0. +POM(:,:) = 0. DO JI=1,JPMODE DO JJ=1,NSP+NCARB+NSOA - ZOM(:,JI) = ZOM(:,JI) + PCTOTA(:,JJ,JI) / ZSUM (:) + POM(:,JI) = POM(:,JI) + PCTOTA(:,JJ,JI) / ZSUM (:) ENDDO ENDDO @@ -280,7 +279,7 @@ ENDDO IDT = INT(MAX(5.*PDT,1.)) IF ((PDT .GT. 0.).AND.( MOD(INT(PTIME) , IDT) .EQ. 0)) THEN !IF (PDT .GT. 0.) THEN - CALL CH_AER_MINERAL(PCTOTG, PCTOTA,PRV, PDENAIR, PPRESSURE, PTEMP, PRC, ZOM,& + CALL CH_AER_MINERAL(PCTOTG, PCTOTA,PRV, PDENAIR, PPRESSURE, PTEMP, PRC, POM,& PCCTOT,PSIG0, PRG0, PDT) ! Equilibre Organiques @@ -288,7 +287,7 @@ IF ((PDT .GT. 0.).AND.( MOD(INT(PTIME) , IDT) .EQ. 0)) THEN IF (NSOA .EQ. 10) CALL CH_AER_ORGANIC(PCTOTG, PCTOTA,PRV, PDENAIR, & PPRESSURE, PTEMP,& - PRC, ZOM, PCCTOT,PSIG0, PRG0, PDT, PSOLORG) + PRC, POM, PCCTOT,PSIG0, PRG0, PDT, PSOLORG) END IF ! Mass need to be positive diff --git a/src/MNH/ch_aer_wetdepn.f90 b/src/MNH/ch_aer_wetdepn.f90 index bd5d263b6..b1041d55d 100644 --- a/src/MNH/ch_aer_wetdepn.f90 +++ b/src/MNH/ch_aer_wetdepn.f90 @@ -50,6 +50,7 @@ END MODULE MODI_CH_AER_WETDEP_n !! MODIFICATIONS !! ------------- !! Original +!! M.Leriche 2015 correction bug !! ! Entry variables: ! @@ -107,11 +108,11 @@ ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XSIGJMIN)**2) ! CALL PPP2AERO(PSVT, PRHODREF, PSIG3D=ZSIG, PRG3D=ZRG, PM3D=ZPMOLD) CALL PPP2AERO(PCWETDEP, PRHODREF, PSIG3D=ZSIGN, PRG3D=ZRGN, PM3D=ZPM) +! +DO JN=1,JPMODE WHERE (ZPM(:,:,:,NM3(JN)) .LT. ZPMIN(NM3(JN))) ZPM(:,:,:,NM3(JN)) = ZPMOLD(:,:,:,NM3(JN)) END WHERE -! -DO JN=1,JPMODE ! Calcul pour maintenir le rayon fixe pour la sedimentation : IF (LRGFIX) THEN ZPM(:,:,:,NM0(JN)) = ZPM(:,:,:,NM3(JN)) / & diff --git a/src/MNH/ch_aqueous_tmicice.f90 b/src/MNH/ch_aqueous_tmicice.f90 index 4d0bd5b52..042fefda1 100644 --- a/src/MNH/ch_aqueous_tmicice.f90 +++ b/src/MNH/ch_aqueous_tmicice.f90 @@ -100,6 +100,7 @@ END MODULE MODI_CH_AQUEOUS_TMICICE !! M. Leriche 17/09/2010 add OUSECHIC flag !! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! M.Leriche 2015 correction bug !! !------------------------------------------------------------------------------- ! @@ -1107,7 +1108,6 @@ ENDIF ! ZZW(:) = 0.0 ZZW2(:,:) = 0.0 - ZZW3(:,:) = 0.0 ZZW4(:,:) = 0.0 DO JL = 1,IMICRO IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & ! wet case @@ -1118,6 +1118,7 @@ ENDIF ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) ! rain -> graupel IF (OUSECHIC) THEN + ZZW3(:,:) = 0.0 DO JLI = 1, SIZE(PSGRSVS,4) IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. HICNAMES(JLI)(1:4) == 'IC_A' & diff --git a/src/MNH/ch_model0d.f90 b/src/MNH/ch_model0d.f90 index 70c665dc3..f15d6c4e0 100644 --- a/src/MNH/ch_model0d.f90 +++ b/src/MNH/ch_model0d.f90 @@ -46,6 +46,7 @@ !! 21/09/04 (P. Tulet) update for MASDEV44 bug2 !! 21/03/06 (P. Tulet) update for MASDEV46 and add ORILAM aerosol scheme !! 24/24/14 (M. Leriche) add ReLACS3 +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -245,6 +246,7 @@ ZMI(1,JP_AER_SO4) = 98. ZMI(1,JP_AER_NO3) = 63. ZMI(1,JP_AER_NH3) = 17. ZMI(1,JP_AER_H2O) = 18. +ZMI(1,JP_AER_BC) = 12. IF (NSOA == 10) THEN ZMI(1,JP_AER_SOA1) = 88. ZMI(1,JP_AER_SOA2) = 180. diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90 index 2137bc887..edf49a458 100644 --- a/src/MNH/ch_read_chem.f90 +++ b/src/MNH/ch_read_chem.f90 @@ -59,6 +59,7 @@ END MODULE MODI_CH_READ_CHEM !! Original 21/04/95 !! 18/02/99 (K. Suhre) allow reading from namelist file !! 01/12/03 (D. Gazen) change Chemical scheme interface +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -158,6 +159,7 @@ ZMI(JP_AER_SO4) = 98. ZMI(JP_AER_NO3) = 63. ZMI(JP_AER_NH3) = 17. ZMI(JP_AER_H2O) = 18. +ZMI(JP_AER_BC) = 12. ZMI(JP_AER_DST) = 100. IF (NSOA == 10) THEN ZMI(JP_AER_SOA1) = 88. diff --git a/src/MNH/ch_write_chem.f90 b/src/MNH/ch_write_chem.f90 index 72935df26..25ee92cc4 100644 --- a/src/MNH/ch_write_chem.f90 +++ b/src/MNH/ch_write_chem.f90 @@ -54,6 +54,7 @@ END MODULE MODI_CH_WRITE_CHEM !! ------------- !! Original 21/04/95 !! 01/12/03 (D. Gazen) change Chemical scheme interface +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -107,6 +108,7 @@ ZMI(JP_AER_SO4) = 98. ZMI(JP_AER_NO3) = 63. ZMI(JP_AER_NH3) = 17. ZMI(JP_AER_H2O) = 18. +ZMI(JP_AER_BC) = 12. ZMI(JP_AER_DST) = 100. IF (NSOA == 10) THEN ZMI(JP_AER_SOA1) = 88. diff --git a/src/MNH/exchange.f90 b/src/MNH/exchange.f90 index 4827c03ea..ac14a5b9b 100644 --- a/src/MNH/exchange.f90 +++ b/src/MNH/exchange.f90 @@ -158,25 +158,25 @@ IF (SIZE(PRTKES,1) /= 0) PRTKES(:,:,:) = PRTKES(:,:,:)*PTSTEP/PRHODJ ! REMOVE NEGATIVE VALUES OF CHEM SCALAR ! IF (LUSECHEM) THEN - DO JSV = 1, KSV - IF ( MIN_ll( PRSVS(:,:,:,NSV_CHEMBEG+JSV-1), IINFO_ll) < 0.0 ) THEN + DO JSV=NSV_CHEMBEG,NSV_CHEMEND + IF ( MIN_ll( PRSVS(:,:,:,JSV), IINFO_ll) < 0.0 ) THEN ! ! compute the total water mass computation ! - ZMASSTOT = MAX( 0. , SUM3D_ll( PRSVS(:,:,:,NSV_CHEMBEG+JSV-1), IINFO_ll ) ) + ZMASSTOT = MAX( 0. , SUM3D_ll( PRSVS(:,:,:,JSV), IINFO_ll ) ) ! ! remove the negative values ! - PRSVS(:,:,:,NSV_CHEMBEG+JSV-1) = MAX(0., PRSVS(:,:,:,NSV_CHEMBEG+JSV-1) ) + PRSVS(:,:,:,JSV) = MAX(0., PRSVS(:,:,:,JSV) ) ! ! compute the new total mass ! - ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRSVS(:,:,:,NSV_CHEMBEG+JSV-1), IINFO_ll ) ) + ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRSVS(:,:,:,JSV), IINFO_ll ) ) ! ! correct again in such a way to conserve the total mass ! ZRATIO = ZMASSTOT / ZMASSPOS - PRSVS(:,:,:,NSV_CHEMBEG+JSV-1) = PRSVS(:,:,:,NSV_CHEMBEG+JSV-1) * ZRATIO + PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) * ZRATIO ! WRITE(ILUOUT,*)'DUE TO CHEMISTRY',JSV,'HAS NEGATIVE VALUES' WRITE(ILUOUT,*)'SOURCES IS CORRECTED BY RATIO',ZRATIO diff --git a/src/MNH/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90 index 348c10216..cb09f5461 100644 --- a/src/MNH/mode_aero_psd.f90 +++ b/src/MNH/mode_aero_psd.f90 @@ -62,6 +62,7 @@ CONTAINS !! MODIFICATIONS !! ------------- !! Alf Grini (CNRM) +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol !! !! EXTERNAL !! -------- @@ -135,6 +136,7 @@ ELSE ZMI(:,:,:,JP_AER_NO3) = 63. ZMI(:,:,:,JP_AER_NH3) = 17. ZMI(:,:,:,JP_AER_H2O) = 18. + ZMI(:,:,:,JP_AER_BC) = 12. IF (NSOA .EQ. 10) THEN ZMI(:,:,:,JP_AER_SOA1) = 88. ZMI(:,:,:,JP_AER_SOA2) = 180. @@ -410,6 +412,7 @@ ELSE ZMI(:,:,:,JP_AER_NO3) = 63. ZMI(:,:,:,JP_AER_NH3) = 17. ZMI(:,:,:,JP_AER_H2O) = 18. + ZMI(:,:,:,JP_AER_BC) = 12. ZMI(:,:,:,JP_AER_DST) = 100. IF (NSOA .EQ. 10) THEN ZMI(:,:,:,JP_AER_SOA1) = 88. @@ -641,6 +644,7 @@ ELSE ZMI(:,JP_AER_NO3) = 63. ZMI(:,JP_AER_NH3) = 17. ZMI(:,JP_AER_H2O) = 18. + ZMI(:,JP_AER_BC) = 12. IF (NSOA .EQ. 10) THEN ZMI(:,JP_AER_SOA1) = 88. ZMI(:,JP_AER_SOA2) = 180. diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 8133e5fa7..0d3a0aae5 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -378,6 +378,7 @@ !! Fevr 2015 (M.Moge) Cleaning up !! Aug 2015 (M.Moge) removing EXTRAPOL on XDXX and XDYY in part 8 !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! M.Leriche 2015 : add LUSECHEM dans NAM_CH_CONF !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -447,7 +448,7 @@ USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0M USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT USE MODD_IO_ll, ONLY : GSMONOPROC USE MODD_PREP_REAL -USE MODD_CH_MNHC_n, ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC +USE MODD_CH_MNHC_n, ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC, LUSECHEM_n=>LUSECHEM USE MODI_READ_VER_GRID USE MODE_MPPDB USE MODE_SPLITTINGZ_ll @@ -511,6 +512,7 @@ LOGICAL :: LDUMMY_REAL ! flag to read and interpolate INTEGER :: JRR ! loop counter for moist var. LOGICAL :: LUSECHAQ LOGICAL :: LUSECHIC +LOGICAL :: LUSECHEM ! !* 0.3 Declaration of namelists ! ------------------------ @@ -529,7 +531,7 @@ XANGCONV0, XANGCONV1000, XANGCONV2000, & XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, CRGUNITD,& LSALT, CRGUNITS, NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, NMODE_SLT -NAMELIST/NAM_CH_CONF/ LUSECHAQ,LUSECHIC +NAMELIST/NAM_CH_CONF/ LUSECHAQ,LUSECHIC,LUSECHEM ! name of dad of input FM file INTEGER :: II, IJ, IGRID, ILENGTH CHARACTER (LEN=100) :: HCOMMENT @@ -1180,6 +1182,7 @@ XRES=XRES_n NITR=NITR_n LUSECHAQ=LUSECHAQ_n LUSECHIC=LUSECHIC_n +LUSECHEM=LUSECHEM_n END SUBROUTINE INIT_NMLVAR SUBROUTINE UPDATE_MODD_FROM_NMLVAR @@ -1189,6 +1192,7 @@ XRES_n=XRES NITR_n=NITR LUSECHAQ_n=LUSECHAQ LUSECHIC_n=LUSECHIC +LUSECHEM_n=LUSECHEM END SUBROUTINE UPDATE_MODD_FROM_NMLVAR END PROGRAM PREP_REAL_CASE diff --git a/src/SURFEX/ch_emission_fluxn.F90 b/src/SURFEX/ch_emission_fluxn.F90 index 6d9b29a12..80d8c0cdb 100644 --- a/src/SURFEX/ch_emission_fluxn.F90 +++ b/src/SURFEX/ch_emission_fluxn.F90 @@ -22,6 +22,7 @@ !! D.Gazen 01/12/03 change emissions handling for surf. externalization !! P.Tulet 01/01/04 change emission conversion factor !! P.Tulet 01/01/05 add dust, orilam +!! M.Leriche 2015 suppress ZDEPOT !! !! EXTERNAL !! -------- @@ -87,7 +88,6 @@ TYPE(PRONOSVAR_T),POINTER :: CURPRONOS !Current pronostic variable CHARACTER(LEN=6), DIMENSION(:), POINTER :: CNAMES REAL,DIMENSION(SIZE(PSFSV,1),KNBTS_MAX) :: ZWORK ! temporary array for reading data REAL,DIMENSION(SIZE(PSFSV,1),SIZE(PSFSV,2)) :: ZEMIS ! interpolated in time emission flux -REAL,DIMENSION(SIZE(PSFSV,1),SIZE(PSFSV,2)) :: ZDEPOT! interpolated in time deposition flux REAL,DIMENSION(SIZE(PSFSV,1)) :: ZFCO ! CO flux INTEGER :: INEQ ! number of chemical var !(=NEQ (chimie gaz) + NSV_AER (chimie aerosol) @@ -134,7 +134,7 @@ DO JI=1,SIZE(TSEMISS) ! IF (INBTS == 1) THEN ! Time Constant Flux -! XFWORK already points on data (see ch_buildemiss.f90) +! XFWORK already points on data (see build_emisstabn.F90) IF (IVERB >= 6) THEN WRITE(ILUOUT,*) 'NO interpolation for ',TRIM(TSEMISS(JI)%CNAME) IF (IVERB >= 10 ) WRITE(ILUOUT,*) TSEMISS(JI)%XFWORK @@ -417,13 +417,6 @@ DO WHILE(ASSOCIATED(CURPRONOS)) ! END DO ! -ZDEPOT(:,:) = 0. -WHERE (PSFSV(:,:) >= 0.) - ZEMIS(:,:) = ZEMIS(:,:) + PSFSV(:,:) -ELSE WHERE - ZDEPOT(:,:) = PSFSV(:,:) -END WHERE -! IF ((LCH_AERO_FLUX).AND.(NSV_AERBEG > 0)) THEN IF (GCO) THEN CALL CH_AER_EMISSION(ZEMIS, PRHOA, CSV, NSV_CHSBEG, PFCO=ZFCO) diff --git a/src/SURFEX/mode_aer_surf.F90 b/src/SURFEX/mode_aer_surf.F90 index ca2895d0a..d1d17f673 100644 --- a/src/SURFEX/mode_aer_surf.F90 +++ b/src/SURFEX/mode_aer_surf.F90 @@ -9,7 +9,10 @@ MODULE MODE_AER_SURF !! MODULE DUST PSD (Particle Size Distribution) !! Purpose: Contains subroutines to convert from transported variables (ppp) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} - +!! +!! Modifications +!! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol +!! USE MODD_CHS_AEROSOL USE MODD_DST_SURF, ONLY : XDENSITY_DST ! @@ -60,6 +63,7 @@ ZMI(JP_AER_SO4) = 98. ZMI(JP_AER_NO3) = 63. ZMI(JP_AER_NH3) = 17. ZMI(JP_AER_H2O) = 18. +ZMI(JP_AER_BC) = 12. ZMI(JP_AER_DST) = 100. IF (NSOA .EQ. 10) THEN ZMI(JP_AER_SOA1) = 88. @@ -234,8 +238,8 @@ ENDDO ! !* 3 set moment 0 ! -!ZM(:,1)= MAX(ZSV(:,JP_CH_M0i) * 1E+6, XSURF_TINY) ! molec_{aer}/m3_{air} -!ZM(:,4)= MAX(ZSV(:,JP_CH_M0j) * 1E+6, XSURF_TINY) ! molec_{aer}/m3_{air} +ZM(:,1)= MAX(ZSV(:,JP_CH_M0i) * 1E+6, XSURF_TINY) ! molec_{aer}/m3_{air} +ZM(:,4)= MAX(ZSV(:,JP_CH_M0j) * 1E+6, XSURF_TINY) ! molec_{aer}/m3_{air} !WHERE ((ZM(:,1) .LT. ZMMIN(1)).OR.(ZM(:,2) .LT. ZMMIN(2))) ! ZM(:,1)= ZMMIN(1) ! ZM(:,2)= ZMMIN(2) -- GitLab