ch_aer_reallfin.f90 10.81 KiB
!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!ORILAM_LIC for details.
!-----------------------------------------------------------------
!--------------- special set of characters for RCS information
!-----------------------------------------------------------------
! $Source$ $Revision$
! MASDEV4_7 chimie 2006/06/16 13:28:57
!-----------------------------------------------------------------
!! ########################
MODULE MODI_CH_AER_REALLFI_n
!! ########################
!!
INTERFACE
!!
SUBROUTINE CH_AER_REALLFI_n(PSV, PCO, PRHODREF)
IMPLICIT NONE
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCO
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF
END SUBROUTINE CH_AER_REALLFI_n
!!
END INTERFACE
!!
END MODULE MODI_CH_AER_REALLFI_n
!!
!!
!! ############################################################
SUBROUTINE CH_AER_REALLFI_n(PSV, PCO, PRHODREF)
!! ############################################################
!!
!! PURPOSE
!! -------
!! Initialise des valeurs constantes pour les mineraux
!! Initialise des valeurs proportionnelles au monoxyde de carbone pour OC et BC
!! Realise l'quilibre des moments partir du sigma et du diametre moyen
!!
!! REFERENCE
!! ---------
!! none
!!
!! AUTHOR
!! ------
!! Pierre TULET (LA)
!!
!! MODIFICATIONS
!! -------------
!! M.Leriche 2015 : masse molaire Black carbon 12 g/mol
!!
!! EXTERNAL
!! --------
!! None
!!
!USE MODE_ll
USE MODD_CH_AEROSOL
USE MODD_CSTS_DUST, ONLY : XDENSITY_DUST
USE MODD_CH_AERO_n
USE MODD_CH_MNHC_n , ONLY : CCH_SCHEME
USE MODD_NSV
USE MODD_CST, ONLY : XAVOGADRO & ![molec/mol] avogadros number
,XMD ![kg/mol] molar weight of air
!!
IMPLICIT NONE
!!
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
!* 0.1 declarations of arguments
!
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCO
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF
!
!
!* 0.2 declarations local variables
!
REAL,DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),NSP+NCARB+NSOA,JPMODE) :: ZCTOTA
REAL,DIMENSION(NSP+NCARB+NSOA) :: ZFAC, ZMI, ZRHOI
REAL,DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),JPIN) :: ZM
REAL,DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),JPMODE) :: ZRG, ZSIG, ZN
REAL,DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3)) :: ZSIGMA
REAL :: ZPI, ZCOEFAEROBC, ZCOEFAEROOC, ZSUMAEROCO, ZCOEFAERODST
INTEGER :: NJAERO, NIAERO
INTEGER :: JJ, JN ! loop counter
REAL :: ZDEN2MOL, ZVALBC, ZVALOC, ZVALDST
REAL :: ZINIRADIUSI, ZINIRADIUSJ
!
!-------------------------------------------------------------------------------
!
!* 1. TRANSFER FROM GAS TO AEROSOL MODULE
! ------------------------------------
! 1.1 initialisation
IF (CRGUNIT=="MASS") THEN
ZINIRADIUSI = XINIRADIUSI * EXP(-3.*(LOG(XINISIGI))**2)
ZINIRADIUSJ = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2)
ELSE
ZINIRADIUSI = XINIRADIUSI
ZINIRADIUSJ = XINIRADIUSJ
END IF
!
! Moments index
NM0(1) = 1
NM3(1) = 2
NM6(1) = 3
NM0(2) = 4
NM3(2) = 5
NM6(2) = 6
!
! Default values of molar mass
ZMI(:) = 250.
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.
ZMI(JP_AER_SOA2) = 180.
ZMI(JP_AER_SOA3) = 1.5374857E+02
ZMI(JP_AER_SOA4) = 1.9586780E+02
ZMI(JP_AER_SOA5) = 195.
ZMI(JP_AER_SOA6) = 195.
ZMI(JP_AER_SOA7) = 165.
ZMI(JP_AER_SOA8) = 195.
ZMI(JP_AER_SOA9) = 270.
ZMI(JP_AER_SOA10) = 210.
END IF
! Aerosol Density
! Cf Ackermann (all to black carbon except water)
ZRHOI(:) = 1.8e3
ZRHOI(JP_AER_H2O) = 1.0e3 ! water
ZRHOI(JP_AER_DST) = XDENSITY_DUST
!
PSV(:,:,:,:) = MAX(PSV(:,:,:,:), 0.)
PCO(:,:,:) = MAX(PCO(:,:,:), 10.E-9*PRHODREF(:,:,:))
!
! Special treatment for BC and OC (link to CO gaseous concentration)
IF (LINITPM) THEN
!NIAERO=SIZE(PSV,1)-1
!NJAERO=SIZE(PSV,2)-1
!ZSUMAEROCO=SUM(PCO(2:NIAERO,2:NJAERO,2))/&
! ((NIAERO-1)*(NJAERO-1))
!ZVALBC=1.28058E-9 ! value in kg/m3 (escompte values)
!ZVALOC=2.304978E-9 ! value in kg/m3 (escompte values)
!ZVALBC=1.E-9 ! value in kg/m3 (default values)
!ZVALOC=2.E-9 ! value in kg/m3 (default values)
!ZVALBC= ZVALBC *24.47 / 12. ! conversion into ppp
!ZVALOC= ZVALOC *24.47 / 12. ! conversion into ppp
!ZCOEFAEROBC=ZVALBC/ZSUMAEROCO
!ZCOEFAEROOC=ZVALOC/ZSUMAEROCO
PSV(:,:,:,JP_CH_BCi)=PCO(:,:,:) * 5.84E-3
PSV(:,:,:,JP_CH_BCj)=PCO(:,:,:) * 1.46E-3
PSV(:,:,:,JP_CH_OCi)=PCO(:,:,:) * 2.336E-2
PSV(:,:,:,JP_CH_OCj)=PCO(:,:,:) * 5.84E-3
!PSV(:,:,:,JP_CH_BCi)=PCO(:,:,:) * ZCOEFAEROBC / 2.
!PSV(:,:,:,JP_CH_BCj)=PCO(:,:,:) * ZCOEFAEROBC / 2.
!PSV(:,:,:,JP_CH_OCi)=PCO(:,:,:) * ZCOEFAEROOC / 2.
!PSV(:,:,:,JP_CH_OCj)=PCO(:,:,:) * ZCOEFAEROOC / 2.
END IF
!
!
ZDEN2MOL = 1E-6 * XAVOGADRO / XMD
!
! conversion into mol.cm-3
DO JJ=1, NSV_AER
PSV(:,:,:,JJ) = PSV(:,:,:,JJ) * ZDEN2MOL * PRHODREF(:,:,:)
ENDDO
!
ZPI = 2.*ASIN(1.)
DO JJ=1,NSP+NCARB+NSOA
ZFAC(JJ)=(4./3.)*ZPI*ZRHOI(JJ)*1.e-9
ENDDO
!
!
!* 1.n transfer aerosol mass from gas to aerosol variables
! (and conversion of mol.cm-3 --> microgram/m3)
!
! aerosol phase
ZCTOTA(:,:,:,JP_AER_SO4,1) = PSV(:,:,:,JP_CH_SO4i)*ZMI(JP_AER_SO4)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SO4,2) = PSV(:,:,:,JP_CH_SO4j)*ZMI(JP_AER_SO4)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_NO3,1) = PSV(:,:,:,JP_CH_NO3i)*ZMI(JP_AER_NO3)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_NO3,2) = PSV(:,:,:,JP_CH_NO3j)*ZMI(JP_AER_NO3)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_NH3,1) = PSV(:,:,:,JP_CH_NH3i)*ZMI(JP_AER_NH3)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_NH3,2) = PSV(:,:,:,JP_CH_NH3j)*ZMI(JP_AER_NH3)/6.0221367E+11
!
! water
ZCTOTA(:,:,:,JP_AER_H2O,1) = PSV(:,:,:,JP_CH_H2Oi)*ZMI(JP_AER_H2O)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_H2O,2) = PSV(:,:,:,JP_CH_H2Oj)*ZMI(JP_AER_H2O)/6.0221367E+11
!
! primary organic carbon
ZCTOTA(:,:,:,JP_AER_OC,1) = PSV(:,:,:,JP_CH_OCi)*ZMI(JP_AER_OC)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_OC,2) = PSV(:,:,:,JP_CH_OCj)*ZMI(JP_AER_OC)/6.0221367E+11
!
! primary black carbon
ZCTOTA(:,:,:,JP_AER_BC,1) = PSV(:,:,:,JP_CH_BCi)*ZMI(JP_AER_BC)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_BC,2) = PSV(:,:,:,JP_CH_BCj)*ZMI(JP_AER_BC)/6.0221367E+11
!
!dust
ZCTOTA(:,:,:,JP_AER_DST,1) = PSV(:,:,:,JP_CH_DSTi)*ZMI(JP_AER_DST)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_DST,2) = PSV(:,:,:,JP_CH_DSTj)*ZMI(JP_AER_DST)/6.0221367E+11
!
IF (NSOA .EQ. 10) THEN
ZCTOTA(:,:,:,JP_AER_SOA1,1) = PSV(:,:,:,JP_CH_SOA1i)*ZMI(JP_AER_SOA1)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA1,2) = PSV(:,:,:,JP_CH_SOA1j)*ZMI(JP_AER_SOA1)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA2,1) = PSV(:,:,:,JP_CH_SOA2i)*ZMI(JP_AER_SOA2)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA2,2) = PSV(:,:,:,JP_CH_SOA2j)*ZMI(JP_AER_SOA2)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA3,1) = PSV(:,:,:,JP_CH_SOA3i)*ZMI(JP_AER_SOA3)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA3,2) = PSV(:,:,:,JP_CH_SOA3j)*ZMI(JP_AER_SOA3)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA4,1) = PSV(:,:,:,JP_CH_SOA4i)*ZMI(JP_AER_SOA4)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA4,2) = PSV(:,:,:,JP_CH_SOA4j)*ZMI(JP_AER_SOA4)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA5,1) = PSV(:,:,:,JP_CH_SOA5i)*ZMI(JP_AER_SOA5)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA5,2) = PSV(:,:,:,JP_CH_SOA5j)*ZMI(JP_AER_SOA5)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA6,1) = PSV(:,:,:,JP_CH_SOA6i)*ZMI(JP_AER_SOA6)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA6,2) = PSV(:,:,:,JP_CH_SOA6j)*ZMI(JP_AER_SOA6)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA7,1) = PSV(:,:,:,JP_CH_SOA7i)*ZMI(JP_AER_SOA7)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA7,2) = PSV(:,:,:,JP_CH_SOA7j)*ZMI(JP_AER_SOA7)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA8,1) = PSV(:,:,:,JP_CH_SOA8i)*ZMI(JP_AER_SOA8)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA8,2) = PSV(:,:,:,JP_CH_SOA8j)*ZMI(JP_AER_SOA8)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA9,1) = PSV(:,:,:,JP_CH_SOA9i)*ZMI(JP_AER_SOA9)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA9,2) = PSV(:,:,:,JP_CH_SOA9j)*ZMI(JP_AER_SOA9)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA10,1) = PSV(:,:,:,JP_CH_SOA10i)*ZMI(JP_AER_SOA10)/6.0221367E+11
ZCTOTA(:,:,:,JP_AER_SOA10,2) = PSV(:,:,:,JP_CH_SOA10j)*ZMI(JP_AER_SOA10)/6.0221367E+11
END IF
!
!* 1.1 calculate moment 3 from total aerosol mass
!
ZM(:,:,:,2) = 0.
ZM(:,:,:,5) = 0.
DO JJ = 1,NSP+NCARB+NSOA
ZM(:,:,:,2) = ZM(:,:,:,2)+ZCTOTA(:,:,:,JJ,1)/ZFAC(JJ)
ZM(:,:,:,5) = ZM(:,:,:,5)+ZCTOTA(:,:,:,JJ,2)/ZFAC(JJ)
ENDDO
!
!
!* 1.2 calculate moment 0 from dispersion and mean radius
!
ZM(:,:,:,1)= ZM(:,:,:,2) / &
((ZINIRADIUSI**3)*EXP(4.5 * (LOG(XINISIGI))**2))
ZM(:,:,:,4)= ZM(:,:,:,5) / &
((ZINIRADIUSJ**3)*EXP(4.5 * (LOG(XINISIGJ))**2))
!
!* 1.3 calculate moment 6 from dispersion and mean radius
!
ZM(:,:,:,3) = ZM(:,:,:,1) * (ZINIRADIUSI**6) *EXP(18 *(LOG(XINISIGI))**2)
ZM(:,:,:,6) = ZM(:,:,:,4) * (ZINIRADIUSJ**6) *EXP(18 *(LOG(XINISIGJ))**2)
!
PSV(:,:,:,JP_CH_M0i) = ZM(:,:,:,1) * 1E-6
PSV(:,:,:,JP_CH_M0j) = ZM(:,:,:,4) * 1E-6
IF (LVARSIGI) PSV(:,:,:,JP_CH_M6i) = ZM(:,:,:,3)
IF (LVARSIGJ) PSV(:,:,:,JP_CH_M6j) = ZM(:,:,:,6)
!
DO JN=1,JPMODE
IF (JN .EQ. 1) THEN
!
IF (LVARSIGI) THEN ! variable dispersion for mode 1
ZSIGMA(:,:,:)=ZM(:,:,:,NM3(JN))**2/(ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM6(JN)))
ZSIGMA(:,:,:)=MIN(1-1E-10,ZSIGMA(:,:,:))
ZSIGMA(:,:,:)=MAX(1E-10,ZSIGMA(:,:,:))
ZSIGMA(:,:,:)= LOG(ZSIGMA(:,:,:))
ZSIGMA(:,:,:)= EXP(1./3.*SQRT(-ZSIGMA(:,:,:)))
WHERE (ZSIGMA(:,:,:) > XSIGIMAX)
ZSIGMA(:,:,:) = XSIGIMAX
END WHERE
WHERE (ZSIGMA(:,:,:) < XSIGIMIN)
ZSIGMA(:,:,:) = XSIGIMIN
END WHERE
ELSE ! fixed dispersion for mode 1
ZSIGMA(:,:,:) = XINISIGI
END IF
END IF
!
IF (JN .EQ. 2) THEN
!
IF (LVARSIGJ) THEN ! variable dispersion for mode 2
ZSIGMA(:,:,:)=ZM(:,:,:,NM3(JN))**2/(ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM6(JN)))
ZSIGMA(:,:,:)=MIN(1-1E-10,ZSIGMA(:,:,:))
ZSIGMA(:,:,:)=MAX(1E-10,ZSIGMA(:,:,:))
ZSIGMA(:,:,:)= LOG(ZSIGMA(:,:,:))
ZSIGMA(:,:,:)= EXP(1./3.*SQRT(-ZSIGMA(:,:,:)))
WHERE (ZSIGMA(:,:,:) > XSIGJMAX)
ZSIGMA(:,:,:) = XSIGJMAX
END WHERE
WHERE (ZSIGMA(:,:,:) < XSIGJMIN)
ZSIGMA(:,:,:) = XSIGJMIN
END WHERE
ELSE ! fixed dispersion for mode 2
ZSIGMA(:,:,:) = XINISIGJ
END IF
END IF
!
!* 1.4 calculate modal parameters from moments
!
ZSIG(:,:,:,JN) = ZSIGMA(:,:,:)
ZN(:,:,:,JN) = ZM(:,:,:,NM0(JN))
!
ZSIGMA(:,:,:)=LOG(ZSIG(:,:,:,JN))**2
!
ZRG(:,:,:,JN)=(ZM(:,:,:,NM3(JN))/ZN(:,:,:,JN))**(1./3.)*EXP(-1.5*ZSIGMA(:,:,:))
!
ENDDO
!
!conversion into ppp
DO JJ=1,NSV_AER
PSV(:,:,:,JJ) = PSV(:,:,:,JJ) / (ZDEN2MOL*PRHODREF(:,:,:))
ENDDO
!
!
END SUBROUTINE CH_AER_REALLFI_n