Skip to content
Snippets Groups Projects
Commit 2085a6b8 authored by RODIER Quentin's avatar RODIER Quentin
Browse files

Pierre T. 04/09/2024: bugfix coupling aerosols with LIMA

parent 8262742a
No related branches found
No related tags found
No related merge requests found
...@@ -77,7 +77,6 @@ USE MODD_CH_M9_n, ONLY : CNAMES ...@@ -77,7 +77,6 @@ USE MODD_CH_M9_n, ONLY : CNAMES
USE MODE_AERO_PSD USE MODE_AERO_PSD
USE MODE_SALT_PSD USE MODE_SALT_PSD
USE MODE_DUST_PSD USE MODE_DUST_PSD
USE MODI_CH_AER_EQSAM
USE MODI_DUSTLFI_n USE MODI_DUSTLFI_n
USE MODI_SALTLFI_n USE MODI_SALTLFI_n
! !
...@@ -93,6 +92,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF, PRV, PPABST, PTHT, PZZ ...@@ -93,6 +92,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF, PRV, PPABST, PTHT, PZZ
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NSP+NCARB+NSOA,JPMODE) :: ZCTOTA REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NSP+NCARB+NSOA,JPMODE) :: ZCTOTA
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZSUM, ZSUM2, ZRATH2O, ZRATSO4, ZRATDST REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZSUM, ZSUM2, ZRATH2O, ZRATSO4, ZRATDST
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZRATBC, ZRATOC
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),JPMODE) :: ZSIG_AER, ZRG_AER, ZN0_AER REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),JPMODE) :: ZSIG_AER, ZRG_AER, ZN0_AER
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NMODE_SLT) :: ZSIG_SLT, ZRG_SLT, ZN0_SLT REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NMODE_SLT) :: ZSIG_SLT, ZRG_SLT, ZN0_SLT
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NMODE_DST) :: ZSIG_DST, ZRG_DST, ZN0_DST REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NMODE_DST) :: ZSIG_DST, ZRG_DST, ZN0_DST
...@@ -102,25 +102,14 @@ REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZPKM, ZPKH2O, ZTE ...@@ -102,25 +102,14 @@ REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZPKM, ZPKH2O, ZTE
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),6) :: ZAER REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),6) :: ZAER
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NSV) :: ZTOT REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),NSV) :: ZTOT
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),JPMODE) :: ZOM REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3),JPMODE) :: ZOM
REAL, DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3)) :: ZU, ZN0_CCN
REAL, DIMENSION(NSV) :: ZMI REAL, DIMENSION(NSV) :: ZMI
INTEGER :: JSV, JJ, JI, II, IJ, IK, JK, IDX INTEGER :: JSV, JJ, JI, II, IJ, IK, JK, IDX
REAL :: ZCCNRADIUS, ZRATMASSH2O REAL :: ZCCNRADIUS, ZRATMASSH2O, ZIFNRADIUS
ZCCNRADIUS = 0.02 ! to suppress the aitken mode (µm)
IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) CMINERAL = "EQSAM" ZCCNRADIUS = 0.04 ! to suppress the aitken mode (µm)
ZIFNRADIUS = 0.03 !
IF (CMINERAL == 'EQSAM') THEN
ZRATMASSH2O = 0.02
ELSE
ZRATMASSH2O = 0.
END IF
! !
ZMI(:) = 250.
ZMI(JP_AER_SO4) = 98.
ZMI(JP_AER_NO3) = 63.
ZMI(JP_AER_NH3) = 17.
ZMI(JP_AER_H2O) = 18.
ZCCN_SUM(:,:,:,:) = 0. ZCCN_SUM(:,:,:,:) = 0.
ZIFN_SUM(:,:,:,:) = 0. ZIFN_SUM(:,:,:,:) = 0.
! !
...@@ -132,83 +121,17 @@ IF (LORILAM) THEN ...@@ -132,83 +121,17 @@ IF (LORILAM) THEN
CALL PPP2AERO(PSVT(:,:,:,NSV_AERBEG:NSV_AEREND),PRHODREF,& CALL PPP2AERO(PSVT(:,:,:,NSV_AERBEG:NSV_AEREND),PRHODREF,&
PSIG3D=ZSIG_AER,PRG3D=ZRG_AER,PN3D=ZN0_AER,PCTOTA=ZCTOTA) PSIG3D=ZSIG_AER,PRG3D=ZRG_AER,PN3D=ZN0_AER,PCTOTA=ZCTOTA)
ZCTOTA=MAX(ZCTOTA,XMNH_TINY)
IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN ZCTOTA=MAX(ZCTOTA,XMNH_TINY)
JP_CH_HNO3 = 0
JP_CH_NH3 = 0
DO JJ=1,SIZE(CNAMES)
IF (CNAMES(JJ) == "HNO3") JP_CH_HNO3 = JJ
IF (CNAMES(JJ) == "NH3") JP_CH_NH3 = JJ
END DO
ZPKM(:,:,:) = 1E-3*PRHODREF(:,:,:) * 6.0221367E+23 / 28.9644
ZPKH2O(:,:,:) = ZPKM(:,:,:)*1.6077*PRV(:,:,:)
!
! compute air temperature
ZTEMP(:,:,:) = PTHT(:,:,:)*((PPABST(:,:,:)/XP00)**(XRD/XCPD))
! compute relative humidity
ZSAT(:,:,:)=0.611*EXP(17.2694*(ZTEMP(:,:,:)-273.16)/(ZTEMP(:,:,:)-35.86))
ZSAT(:,:,:)=ZSAT(:,:,:)*1000.
ZRH(:,:,:)=(ZPKH2O(:,:,:)/(ZPKM(:,:,:)*1.6077))*PPABST(:,:,:)/&
&(0.622+(ZPKH2O(:,:,:)/(ZPKM(:,:,:)*1.6077)))/ZSAT(:,:,:)
ZRH(:,:,:) = MIN(0.95, MAX(ZRH(:,:,:), .01)) ! until 0.95 thermodynamic code is not valid
! Gas-particles equilibrium => H2O, SO4 aerosol mass
DO JI=1,NSP
ZTOT(:,:,:,JI)=ZCTOTA(:,:,:,JI,1)+ZCTOTA(:,:,:,JI,2)
ZTOT(:,:,:,JI) = MAX(ZTOT(:,:,:,JI),XMNH_TINY)
ENDDO
!
ZAER(:,:,:,:) = 0.
ZAER(:,:,:,1)=ZTOT(:,:,:,JP_AER_SO4)
! conversion ppp to µg/m3
IF (JP_CH_NH3 .NE. 0) ZAER(:,:,:,2)=PSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_NH3)*XNH3*1E-3*PRHODREF(:,:,:)/XMD
! conversion ppp to µg/m3
IF (JP_CH_HNO3 .NE. 0) ZAER(:,:,:,3)=PSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_HNO3)*XHNO3*1E-3*PRHODREF(:,:,:)/XMD
ZAER(:,:,:,4)=ZTOT(:,:,:,JP_AER_H2O)
ZAER(:,:,:,5)=ZTOT(:,:,:,JP_AER_NO3)
ZAER(:,:,:,6)=ZTOT(:,:,:,JP_AER_NH3)
ZAER(:,:,:,:)=MAX(ZAER(:,:,:,:),0.)
DO IK=1,SIZE(PSVT,3)
DO IJ=1,SIZE(PSVT,2)
CALL CH_AER_EQSAM(ZAER(:,IJ,IK,:),ZRH(:,IJ,IK),PPABST(:,IJ,IK),ZTEMP(:,IJ,IK))
END DO
END DO
ZTOT(:,:,:,JP_AER_SO4) = ZAER(:,:,:,1)
ZTOT(:,:,:,JP_AER_H2O) = ZAER(:,:,:,4)
ZTOT(:,:,:,JP_AER_NO3) = ZAER(:,:,:,5)
ZTOT(:,:,:,JP_AER_NH3) = ZAER(:,:,:,6)
! Balance the mass according to size
ZSUM(:,:,:) = 0.
ZOM(:,:,:,:) = 0.
DO JSV=1,JPMODE
DO JJ=1,NSP
ZSUM(:,:,:) = ZSUM(:,:,:) + ZCTOTA(:,:,:,JJ,JSV)
ZOM(:,:,:,JSV) = ZOM(:,:,:,JSV) + ZCTOTA(:,:,:,JJ,JSV)
ENDDO
ENDDO
DO JSV=1,JPMODE
ZOM(:,:,:,JSV) = ZOM(:,:,:,JSV) / ZSUM(:,:,:)
ENDDO
DO JSV=1,JPMODE
DO JJ=1,NSP
ZCTOTA(:,:,:,JJ,JSV)=MAX(XMNH_TINY,ZTOT(:,:,:,JJ)*ZOM(:,:,:,JSV))
END DO
END DO
END IF !end part of init in case of IDEAL or REAL
! Compute mass ratio of sulfates, water and dusts ! Compute mass ratio of sulfates, water and dusts
DO JSV=1,JPMODE DO JSV=1,JPMODE
ZRATH2O(:,:,:) = 0. ZRATH2O(:,:,:) = 0.
ZRATSO4(:,:,:) = 0. ZRATSO4(:,:,:) = 0.
ZRATDST(:,:,:) = 0. ZRATDST(:,:,:) = 0.
ZRATBC(:,:,:) = 0.
ZRATOC(:,:,:) = 0.
ZSUM(:,:,:) = 0. ZSUM(:,:,:) = 0.
ZSUM2(:,:,:) = 0. ZSUM2(:,:,:) = 0.
...@@ -230,50 +153,50 @@ DO JSV=1,JPMODE ...@@ -230,50 +153,50 @@ DO JSV=1,JPMODE
ZRATDST(:,:,:) = ZCTOTA(:,:,:,JP_AER_DST,JSV) / ZSUM2(:,:,:) ZRATDST(:,:,:) = ZCTOTA(:,:,:,JP_AER_DST,JSV) / ZSUM2(:,:,:)
END WHERE END WHERE
WHERE (ZSUM2(:,:,:) .GT. 0.)
ZRATBC(:,:,:) = ZCTOTA(:,:,:,JP_AER_BC,JSV) / ZSUM2(:,:,:)
END WHERE
WHERE (ZSUM2(:,:,:) .GT. 0.)
ZRATOC(:,:,:) = ZCTOTA(:,:,:,JP_AER_OC,JSV) / ZSUM2(:,:,:)
END WHERE
! #/m3 --> #/kg ! #/m3 --> #/kg
ZN0_AER(:,:,:,JSV) = ZN0_AER(:,:,:,JSV) / PRHODREF(:,:,:) ZN0_AER(:,:,:,JSV) = ZN0_AER(:,:,:,JSV) / PRHODREF(:,:,:)
! CCN_FREE initialization ! CCN_FREE initialization
! aerosol radius greater than ZCCNRADIUS µm to be considers as CCN ! aerosol radius greater than ZCCNRADIUS µm to be considers as CCN
! water mass greater than ZRATMASSH2O % ! Von der Emde and Wacker, 1993
ZU(:,:,:)=LOG(ZCCNRADIUS/ZRG_AER(:,:,:,JSV)) / (SQRT(2.)*LOG(ZSIG_AER(:,:,:,JSV)))
ZN0_CCN(:,:,:) = 0.5*ZN0_AER(:,:,:,JSV) * (1 - ERFA(ZU(:,:,:)))
IF (CACTCCN=="ABRK") THEN IF (CACTCCN=="ABRK") THEN
! only one CCN_FREE mode (activation is not performed upon aerosol class but by physical paramters) ! only one CCN_FREE mode (activation is not performed upon aerosol class but by physical paramters)
! !
WHERE (ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS) ! WHERE (ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS)
ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + ZN0_AER(:,:,:,JSV) ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + ZN0_CCN(:,:,:)
END WHERE ! END WHERE
ELSE ELSE
! Sulfates ! Sulfates
IF (NMOD_CCN .GE. 2) THEN IF (NMOD_CCN .GE. 2) THEN
WHERE ((ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS).AND.(ZRATH2O(:,:,:).GT.ZRATMASSH2O)) ! WHERE (ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS)
ZCCN_SUM(:,:,:,2) = ZCCN_SUM(:,:,:,2) + ZN0_AER(:,:,:,JSV) * ZRATSO4(:,:,:) ZCCN_SUM(:,:,:,2) = ZCCN_SUM(:,:,:,2) + ZN0_CCN(:,:,:) * ZRATSO4(:,:,:)
END WHERE ! END WHERE
END IF END IF
! Hyrdophylic aerosols ! Hydrophylic aerosols
IF (NMOD_CCN .GE. 3) THEN IF (NMOD_CCN .GE. 3) THEN
WHERE ((ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS).AND.(ZRATH2O(:,:,:).GT.ZRATMASSH2O)) ! WHERE (ZRG_AER(:,:,:,JSV) .GT. ZCCNRADIUS)
ZCCN_SUM(:,:,:,3) = ZCCN_SUM(:,:,:,3) + ZN0_AER(:,:,:,JSV) * (1.-ZRATSO4(:,:,:)) ZCCN_SUM(:,:,:,3) = ZCCN_SUM(:,:,:,3) + ZN0_CCN(:,:,:) * &
END WHERE (1.-ZRATSO4(:,:,:)-ZRATDST(:,:,:)-ZRATBC(:,:,:))
! END WHERE
END IF END IF
END IF END IF
! IFN_FREE initialization ! IFN_FREE initialization
IF (LDUST) THEN ZIFN_SUM(:,:,:,2) = ZIFN_SUM(:,:,:,2) + ZN0_AER(:,:,:,JSV) * ZRATBC(:,:,:)
IDX=MIN(NMODE_DST,NMOD_IFN)+JSV
ELSE
IDX= 1 + JSV
END IF
IF (IDX .LE. NMOD_IFN) THEN
ZIFN_SUM(:,:,:,IDX) = 0.
WHERE (ZRATH2O(:,:,:) .LE. ZRATMASSH2O) ! fraction of dust if low water
ZIFN_SUM(:,:,:,IDX) = ZIFN_SUM(:,:,:,IDX) + ZN0_AER(:,:,:,JSV) * ZRATDST(:,:,:)
END WHERE
END IF
END DO END DO
ELSE ! keep lima class intiatialization ELSE ! keep lima class intiatialization
...@@ -293,13 +216,7 @@ ELSE ! keep lima class intiatialization ...@@ -293,13 +216,7 @@ ELSE ! keep lima class intiatialization
END IF END IF
END IF END IF
IF (LDUST) THEN DO JI = 2, NMOD_IFN
IDX =MIN(NMODE_DST,NMOD_IFN)+1
ELSE
IDX = 2
END IF
DO JI = IDX, NMOD_IFN
ZIFN_SUM(:,:,:,JI) = PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1) ZIFN_SUM(:,:,:,JI) = PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1)
END DO END DO
...@@ -318,14 +235,14 @@ IF (LSALT) THEN ...@@ -318,14 +235,14 @@ IF (LSALT) THEN
PSIG3D=ZSIG_SLT,PRG3D=ZRG_SLT,PN3D=ZN0_SLT) PSIG3D=ZSIG_SLT,PRG3D=ZRG_SLT,PN3D=ZN0_SLT)
! !
DO JSV=1,NMODE_SLT DO JSV=1,NMODE_SLT
ZU(:,:,:)=LOG(ZCCNRADIUS/ZRG_SLT(:,:,:,JSV)) / (SQRT(2.)*LOG(ZSIG_SLT(:,:,:,JSV)))
ZN0_CCN(:,:,:) = 0.5*ZN0_SLT(:,:,:,JSV) * (1 - ERFA(ZU(:,:,:)))
! #/m3 --> #/kg ! #/m3 --> #/kg
ZN0_SLT(:,:,:,JSV) = ZN0_SLT(:,:,:,JSV) / PRHODREF(:,:,:) ZN0_CCN(:,:,:) = ZN0_CCN(:,:,:) / PRHODREF(:,:,:)
! CCN_FREE initialization ! CCN_FREE initialization
! !
WHERE (ZRG_SLT(:,:,:,JSV) .GT. ZCCNRADIUS) ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + ZN0_CCN(:,:,:)
ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + ZN0_SLT(:,:,:,JSV)
END WHERE
END DO END DO
ELSE ! keep lima class intiatialization for sea salt + ccn from orilam ELSE ! keep lima class intiatialization for sea salt + ccn from orilam
...@@ -347,9 +264,15 @@ IF (LDUST) THEN ...@@ -347,9 +264,15 @@ IF (LDUST) THEN
CALL PPP2DUST(PSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),PRHODREF,& CALL PPP2DUST(PSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),PRHODREF,&
PSIG3D=ZSIG_DST,PRG3D=ZRG_DST,PN3D=ZN0_DST) PSIG3D=ZSIG_DST,PRG3D=ZRG_DST,PN3D=ZN0_DST)
! !
IDX = MIN(NMODE_DST-1,NMOD_IFN) DO JSV=1,NMODE_DST
ZIFN_SUM(:,:,:,1) = ZN0_DST(:,:,:,2) / PRHODREF(:,:,:) ZU(:,:,:)=LOG(ZIFNRADIUS/ZRG_DST(:,:,:,JSV)) / (SQRT(2.)*LOG(ZSIG_DST(:,:,:,JSV)))
ZIFN_SUM(:,:,:,2) = ZN0_DST(:,:,:,3) / PRHODREF(:,:,:) ZN0_DST(:,:,:,JSV) = 0.5*ZN0_DST(:,:,:,JSV) * (1 - ERFA(ZU(:,:,:)))
! #/m3 --> #/kg
ZN0_DST(:,:,:,JSV) = ZN0_DST(:,:,:,JSV) / PRHODREF(:,:,:)
! IFN_FREE initialization (all dusts)
ZIFN_SUM(:,:,:,1) = ZIFN_SUM(:,:,:,1) + ZN0_DST(:,:,:,JSV)
END DO
ELSE ! keep lima class intiatialization ELSE ! keep lima class intiatialization
IF (NMOD_IFN.GE.1) & IF (NMOD_IFN.GE.1) &
...@@ -368,5 +291,22 @@ IF (NMOD_IFN .GE. 1) THEN ...@@ -368,5 +291,22 @@ IF (NMOD_IFN .GE. 1) THEN
PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) = MAX(ZIFN_SUM(:,:,:,JI) - PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1), 0.) PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) = MAX(ZIFN_SUM(:,:,:,JI) - PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1), 0.)
END DO END DO
END IF END IF
!
CONTAINS
FUNCTION ERFA(X) RESULT(PERF)
USE MODI_ERF
REAL, DIMENSION(:,:,:), INTENT(IN) :: X
REAL, DIMENSION(SIZE(X,1),SIZE(X,2),SIZE(X,3)) :: PERF
INTEGER :: II,IJ,IK
DO II=1,SIZE(X,1)
DO IJ=1,SIZE(X,2)
DO IK=1,SIZE(X,3)
PERF(II,IJ,IK) = erf(X(II,IJ,IK))
ENDDO
ENDDO
ENDDO
END FUNCTION ERFA
! !
END SUBROUTINE AER2LIMA END SUBROUTINE AER2LIMA
...@@ -257,7 +257,8 @@ END IF ...@@ -257,7 +257,8 @@ END IF
IF (LVARSIGI) THEN ! set M6 variable standard deviation IF (LVARSIGI) THEN ! set M6 variable standard deviation
IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN
ZM(:,:,:,3)= ZM(:,:,:,1) * (ZINIRADIUSJ**6)*EXP(18. * LOG(XINISIGJ)**2) ZM(:,:,:,3)= ZM(:,:,:,1) * (ZINIRADIUSI**6)*EXP(18. * LOG(XINISIGI)**2)
ZSIGMA(:,:,:) = XINISIGI
ELSE ELSE
ZM(:,:,:,3) = MAX(ZSV(:,:,:,JP_CH_M6i), XMNH_TINY) ZM(:,:,:,3) = MAX(ZSV(:,:,:,JP_CH_M6i), XMNH_TINY)
...@@ -287,6 +288,7 @@ END IF ...@@ -287,6 +288,7 @@ END IF
IF (LVARSIGJ) THEN ! set M6 variable standard deviation IF (LVARSIGJ) THEN ! set M6 variable standard deviation
IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN
ZM(:,:,:,6)= ZM(:,:,:,4) * (ZINIRADIUSJ**6)*EXP(18. * LOG(XINISIGJ)**2) ZM(:,:,:,6)= ZM(:,:,:,4) * (ZINIRADIUSJ**6)*EXP(18. * LOG(XINISIGJ)**2)
ZSIGMA(:,:,:) = XINISIGJ
ELSE ELSE
ZM(:,:,:,6) = MAX(ZSV(:,:,:,JP_CH_M6j), XMNH_TINY) ZM(:,:,:,6) = MAX(ZSV(:,:,:,JP_CH_M6j), XMNH_TINY)
...@@ -313,7 +315,6 @@ ELSE ! fixed standard deviation ...@@ -313,7 +315,6 @@ ELSE ! fixed standard deviation
IF(PRESENT(PSIG3D)) PSIG3D(:,:,:,2) = XINISIGJ IF(PRESENT(PSIG3D)) PSIG3D(:,:,:,2) = XINISIGJ
END IF END IF
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! !
!* 6 calculate modal parameters from moments !* 6 calculate modal parameters from moments
......
...@@ -161,14 +161,14 @@ ZMASS(:,:,:,5) = (PMASSCAMS(:,:,:,3) * RATIO_6) + ZMASS(:,:,:,5) ! Attribution M ...@@ -161,14 +161,14 @@ ZMASS(:,:,:,5) = (PMASSCAMS(:,:,:,3) * RATIO_6) + ZMASS(:,:,:,5) ! Attribution M
!======================================================== !========================================================
! Adjust the mass / SSA emissions after a few hours ! Adjust the mass / SSA emissions after a few hours
ZMASS(:,:,:,1) = MAX(ZMASS(:,:,:,1) * 0.3, 1E-18) ZMASS(:,:,:,1) = MAX(ZMASS(:,:,:,1), 1E-18)
ZMASS(:,:,:,2) = MAX(ZMASS(:,:,:,2) * 0.1, 1E-17) ZMASS(:,:,:,2) = MAX(ZMASS(:,:,:,2), 1E-17)
ZMASS(:,:,:,3) = MAX(ZMASS(:,:,:,3) * 0.5, 1E-16) ZMASS(:,:,:,3) = MAX(ZMASS(:,:,:,3), 1E-16)
ZMASS(:,:,:,4) = MAX(ZMASS(:,:,:,4) * 0.3, 1E-15) ZMASS(:,:,:,4) = MAX(ZMASS(:,:,:,4), 1E-15)
ZMASS(:,:,:,5) = MAX(ZMASS(:,:,:,5) * 0.1, 1E-14) ZMASS(:,:,:,5) = MAX(ZMASS(:,:,:,5), 1E-14)
IF (NMODE_SLT >= 6) ZMASS(:,:,:,6) = MAX(ZMASS(:,:,:,5) * 0.1, 1E-14) IF (NMODE_SLT >= 6) ZMASS(:,:,:,6) = MAX(ZMASS(:,:,:,5) * 0.1, 1E-14)
IF (NMODE_SLT >= 7) ZMASS(:,:,:,7) = MAX(ZMASS(:,:,:,5) * 0.1, 1E-14) IF (NMODE_SLT >= 7) ZMASS(:,:,:,7) = MAX(ZMASS(:,:,:,5) * 0.01, 1E-14)
IF (NMODE_SLT >= 8) ZMASS(:,:,:,8) = MAX(ZMASS(:,:,:,5) * 0.1, 1E-14) IF (NMODE_SLT >= 8) ZMASS(:,:,:,8) = MAX(ZMASS(:,:,:,5) * 0.001, 1E-14)
!======================================================== !========================================================
......
...@@ -165,7 +165,7 @@ IF (LORILAM) THEN ! for sulphates and hydrophilic aerosols ...@@ -165,7 +165,7 @@ IF (LORILAM) THEN ! for sulphates and hydrophilic aerosols
XRHOI(JP_AER_H2O) = 1.0e3 ! water XRHOI(JP_AER_H2O) = 1.0e3 ! water
XRHOI(JP_AER_DST) = XDENSITY_DUST ! water XRHOI(JP_AER_DST) = XDENSITY_DUST ! water
! assumption: we choose to put sulfates in mode J and hydrophilics compounds in mode I ! assumption: we choose to put sulfates and hydrophilics compounds in mode J (accumulation)
IF (CRGUNIT=="MASS") THEN IF (CRGUNIT=="MASS") THEN
RCCN(2) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) * 1E-6 ! Sulfates RCCN(2) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) * 1E-6 ! Sulfates
RCCN(3) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) * 1E-6 ! Hydrophilic RCCN(3) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) * 1E-6 ! Hydrophilic
...@@ -177,7 +177,7 @@ IF (LORILAM) THEN ! for sulphates and hydrophilic aerosols ...@@ -177,7 +177,7 @@ IF (LORILAM) THEN ! for sulphates and hydrophilic aerosols
LOGSIGCCN(2) = LOG(XINISIGJ) LOGSIGCCN(2) = LOG(XINISIGJ)
LOGSIGCCN(3) = LOG(XINISIGJ) LOGSIGCCN(3) = LOG(XINISIGJ)
RHOCCN(2) = XRHOI(JP_AER_SO4) RHOCCN(2) = XRHOI(JP_AER_SO4)
RHOCCN(3) = XRHOI(JP_AER_BC) RHOCCN(3) = XRHOI(JP_AER_OC)
END IF END IF
IF (LSALT) THEN ! for sea salts IF (LSALT) THEN ! for sea salts
JMOD = 1 JMOD = 1
...@@ -341,6 +341,14 @@ IF ( NMOD_IFN .GE. 1 ) THEN ...@@ -341,6 +341,14 @@ IF ( NMOD_IFN .GE. 1 ) THEN
XMDIAM_IFN = (/ 0.05E-6 , 3.E-6 , 0.016E-6 , 0.016E-6 /) XMDIAM_IFN = (/ 0.05E-6 , 3.E-6 , 0.016E-6 , 0.016E-6 /)
XSIGMA_IFN = (/ 2.4 , 1.6 , 2.5 , 2.5 /) XSIGMA_IFN = (/ 2.4 , 1.6 , 2.5 , 2.5 /)
XRHO_IFN = (/ 2650. , 2650. , 1000. , 1000. /) XRHO_IFN = (/ 2650. , 2650. , 1000. , 1000. /)
CASE ('CAMS_PT')
NSPECIE = 4 ! Dust, Hydrophilic mixture , BC, BIO+(O)
IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
IF (.NOT.(ASSOCIATED(XRHO_IFN))) CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
XMDIAM_IFN = (/0.09E-6, 3.0E-6, 0.025E-6, 0.2E-6/)
XSIGMA_IFN = (/1.75, 2.15, 2.0, 1.6 /)
XRHO_IFN = (/1800., 2600., 1000., 1500./)
CASE ('CAMS_JPP') CASE ('CAMS_JPP')
! sea-salt, sulfate, hydrophilic (GADS data) ! sea-salt, sulfate, hydrophilic (GADS data)
! 2 species, dust-metallic and hydrophobic (as BC) ! 2 species, dust-metallic and hydrophobic (as BC)
...@@ -397,17 +405,13 @@ IF ( NMOD_IFN .GE. 1 ) THEN ...@@ -397,17 +405,13 @@ IF ( NMOD_IFN .GE. 1 ) THEN
ENDSELECT ENDSELECT
IF (LORILAM) THEN IF (LORILAM) THEN
IF (LDUST) THEN IDX=1
IDX=MIN(NMODE_DST-1,NMOD_IFN)
ELSE
IDX= 2
END IF
IF ((IDX+1) .LE. NMOD_IFN) THEN IF ((IDX+1) .LE. NMOD_IFN) THEN
IF (CRGUNIT=="MASS") THEN IF (CRGUNIT=="MASS") THEN
XMDIAM_IFN(IDX+1) = 2 * XINIRADIUSI * EXP(-3.*(LOG(XINISIGI))**2) * 1E-6 XMDIAM_IFN(IDX+1) = 2 * XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) * 1E-6
ELSE ELSE
XMDIAM_IFN(IDX+1) = 2 * XINIRADIUSI * 1E-6 XMDIAM_IFN(IDX+1) = 2 * XINIRADIUSJ * 1E-6
END IF END IF
XRHO_IFN(IDX+1) = XRHOI(JP_AER_BC) XRHO_IFN(IDX+1) = XRHOI(JP_AER_BC)
XSIGMA_IFN(IDX+1) = XINISIGI XSIGMA_IFN(IDX+1) = XINISIGI
...@@ -423,28 +427,18 @@ IF (LORILAM) THEN ...@@ -423,28 +427,18 @@ IF (LORILAM) THEN
XSIGMA_IFN(IDX+2) = XINISIGJ XSIGMA_IFN(IDX+2) = XINISIGJ
END IF END IF
END IF END IF
IF (LDUST) THEN IF (LDUST) THEN
DO JMOD = 1,NMODE_DST IF (CRGUNITD=="MASS") THEN
IF (CRGUNITD=="MASS") THEN XMDIAM_IFN(1) = 2.*XINIRADIUS(JPDUSTORDER(3))*EXP(-3.*(LOG(XINISIG(JPDUSTORDER(3))))**2)
ZINIRADIUS(JMOD) = XINIRADIUS(JPDUSTORDER(JMOD)) * EXP(-3.*(LOG(XINISIG(JPDUSTORDER(JMOD))))**2)
ELSE
ZINIRADIUS(JMOD) = XINIRADIUS(JPDUSTORDER(JMOD))
END IF
ENDDO
IDX = MIN(NMODE_DST-1,NMOD_IFN)
DO JMOD = 1,IDX
IF (JMOD==1) THEN
XMDIAM_IFN(JMOD) = 2 * ZINIRADIUS(2) * 1E-6
XSIGMA_IFN(JMOD) = XINISIG(JPDUSTORDER(2))
ELSE ELSE
XMDIAM_IFN(JMOD) = 2 * ZINIRADIUS(3) * 1E-6 XMDIAM_IFN(1) = 2.*XINIRADIUS(JPDUSTORDER(3))
XSIGMA_IFN(JMOD) = XINISIG(JPDUSTORDER(3))
END IF END IF
XSIGMA_IFN(1) = XINISIG(JPDUSTORDER(3))
XRHO_IFN(1) = XDENSITY_DUST
ENDDO
END IF END IF
!
! internal mixing ! internal mixing
! !
IF (.NOT.(ASSOCIATED(XFRAC))) CALL PARAM_LIMA_ALLOCATE('XFRAC', NSPECIE,NMOD_IFN) IF (.NOT.(ASSOCIATED(XFRAC))) CALL PARAM_LIMA_ALLOCATE('XFRAC', NSPECIE,NMOD_IFN)
...@@ -458,11 +452,15 @@ END IF ...@@ -458,11 +452,15 @@ END IF
XFRAC(3,:)=1. XFRAC(3,:)=1.
CASE ('O') CASE ('O')
XFRAC(4,:)=1. XFRAC(4,:)=1.
CASE ('TULP') CASE ('CAMS_PT')
XFRAC(1,1)=1. XFRAC(1,1)=0.99
XFRAC(1,2)=1. XFRAC(2,1)=0.01
XFRAC(3,3)=0.5 XFRAC(3,1)=0.0
XFRAC(4,3)=0.5 XFRAC(4,1)=0.0
XFRAC(1,2)=0.
XFRAC(2,2)=0.
XFRAC(3,2)=0.5
XFRAC(4,2)=0.5
CASE ('CAMS') CASE ('CAMS')
XFRAC(1,1)=0.99 XFRAC(1,1)=0.99
XFRAC(2,1)=0.01 XFRAC(2,1)=0.01
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment