Skip to content
Snippets Groups Projects
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