Skip to content
Snippets Groups Projects
Forked from Méso-NH / Méso-NH code
4389 commits behind the upstream repository.
ch_aer_activation.f90 9.12 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.
!-----------------------------------------------------------------
!!   ##############################
     MODULE MODI_CH_AER_ACTIVATION
!!   ##############################
!!
INTERFACE
!
SUBROUTINE CH_AER_ACTIVATION(PSVT,PTEMP,  PWT, PTRAD, &
                             PRHODREF,PPABST, PNCN, PMCN,&
                             PSOLORG, PMI, PSMAX)

IMPLICIT NONE

REAL,  DIMENSION(:,:),  INTENT(INOUT) :: PSVT  ! Aerosol concentration
REAL,  DIMENSION(:),    INTENT(IN)    :: PTEMP ! Air temperature (K)
REAL,  DIMENSION(:),    INTENT(IN)    :: PRHODREF ! Air density (kg/m3)
REAL,  DIMENSION(:),    INTENT(IN)    :: PWT   ! Activation vertical velocity (m/s)
REAL,  DIMENSION(:),    INTENT(IN)    :: PTRAD ! Activation cooling radiative tendency (K/s)
REAL,  DIMENSION(:),    INTENT(IN)    :: PPABST! Air pressure (Pa)
REAL,  DIMENSION(:,:),  INTENT(IN)    :: PSOLORG ! ratio of SOA in acqueous phase
REAL,  DIMENSION(:,:),  INTENT(IN)    :: PMI   ! Molecular weight (g/mol)
REAL,  DIMENSION(:),    INTENT(OUT)   :: PNCN  ! Number of activated aerosol (#/m3) 
REAL,  DIMENSION(:),    INTENT(OUT)   :: PMCN  ! Mass of activated aerosol (ug/m3)
REAL,  DIMENSION(:),    INTENT(INOUT) :: PSMAX ! Maximum supersaturation


END SUBROUTINE CH_AER_ACTIVATION
!!
END INTERFACE
!!
END MODULE MODI_CH_AER_ACTIVATION
!!
!!   #######################################
SUBROUTINE CH_AER_ACTIVATION(PSVT,PTEMP,  PWT, PTRAD, &
                             PRHODREF,PPABST, PNCN, PMCN,&
                             PSOLORG, PMI, PSMAX)
!!   #######################################
!!
!!   PURPOSE
!!   -------
!!   Input of Abdul-Razzak activation scheme
!!   Here we compute the size distribution of aerosols together with the 
!!   dissociative ions and the soluble fraction need in the parameterization.
!!   Dynamical variables are also passed by argument.
!!   REFERENCE
!!   ---------
!!   none
!!
!!   AUTHOR
!!    ------
!!    Pierre TULET (GMEI)  
!!
!!   MODIFICATIONS
!!    -------------
!!   Original
!!
!!
!!   IMPLICIT ARGUMENTS
!
USE MODD_CH_AEROSOL
USE MODD_DUST
USE MODD_SALT
USE MODD_NSV
USE MODD_CSTS_SALT
USE MODE_AERO_PSD
USE MODE_DUST_PSD
USE MODE_SALT_PSD
USE MODI_ABDULRAZZAK

!!
IMPLICIT NONE

!! Arguments variables

REAL,  DIMENSION(:,:),  INTENT(INOUT) :: PSVT  ! Aerosol concentration
REAL,  DIMENSION(:),    INTENT(IN)    :: PTEMP ! Air temperature (K)
REAL,  DIMENSION(:),    INTENT(IN)    :: PRHODREF ! Air density (kg/m3)
REAL,  DIMENSION(:),    INTENT(IN)    :: PWT   ! Activation vertical velocity (m/s)
REAL,  DIMENSION(:),    INTENT(IN)    :: PTRAD ! Activation cooling radiative tendency (K/s)
REAL,  DIMENSION(:),    INTENT(IN)    :: PPABST! Air pressure (Pa)
REAL,  DIMENSION(:,:),  INTENT(IN)    :: PSOLORG ! ratio of SOA in acqueous phase
REAL,  DIMENSION(:,:),  INTENT(IN)    :: PMI   ! Molecular weight (g/mol)
REAL,  DIMENSION(:),    INTENT(OUT)   :: PNCN  ! Number of activated aerosol (#/m3) 
REAL,  DIMENSION(:),    INTENT(OUT)   :: PMCN  ! Mass of activated aerosol (ug/m3)
REAL,  DIMENSION(:),    INTENT(INOUT) :: PSMAX ! Maximum supersaturation

!! Local variables

REAL,  DIMENSION(SIZE(PSVT,1))          :: ZSUM, ZWT, ZTRAD
REAL,  DIMENSION(SIZE(PSVT,1),JPMODE)   :: ZRG_AER, ZSIG_AER, ZN0_AER
REAL,  DIMENSION(SIZE(PSVT,1),NMODE_DST):: ZRG_DST, ZSIG_DST, ZN0_DST
REAL,  DIMENSION(SIZE(PSVT,1),NMODE_SLT):: ZRG_SLT, ZSIG_SLT, ZN0_SLT
REAL,  DIMENSION(SIZE(PSVT,1),NSP+NCARB+NSOA,JPMODE) :: ZCTOTA
REAL,  DIMENSION(SIZE(PSVT,1),NMODE_DST) :: ZCTOTAD
REAL,  DIMENSION(SIZE(PSVT,1),NMODE_SLT) :: ZCTOTAS
!REAL,  DIMENSION(SIZE(PSVT,1),NSP+NCARB+NSOA) :: ZEPS
!REAL,  DIMENSION(SIZE(PSVT,1),NSP+NCARB+NSOA,JPMODE) :: ZNUE
REAL,  DIMENSION(:,:), ALLOCATABLE   :: ZNCN, ZMCN
REAL,  DIMENSION(:,:), ALLOCATABLE   :: ZNUE
REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZEPS, ZMI
REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZCTOTAL
REAL,  DIMENSION(:,:),  ALLOCATABLE  :: ZRG, ZSIG, ZN0
REAL  :: ZRHOP
INTEGER  :: NMODE, JN, JJ, i



IF (LORILAM) THEN
ZCTOTA(:,:,:) = 0.
CALL  PPP2AERO1D(PSVT(:,NSV_AERBEG:NSV_AEREND),&
                PRHODREF, PMI, PSIG1D=ZSIG_AER, PRG1D=ZRG_AER,&
                PN1D=ZN0_AER, PCTOTA=ZCTOTA) 
END IF
IF (LDUST) THEN
ZCTOTAD(:,:) = 0.
CALL  PPP2DUST1D(PSVT(:,NSV_DSTBEG:NSV_DSTEND),& 
                PRHODREF,  PSIG1D=ZSIG_DST, PRG1D=ZRG_DST,&
                PN1D=ZN0_DST, PMASS1D=ZCTOTAD) 
 ZCTOTAD(:,:) = ZCTOTAD(:,:) * 1E9 !kg/m3-->ug/m3
!ZCTOTAD(:,:) = ZN0_DST(:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
!       * (ZRG_DST(:,:)**3)*1.d-18 &  !um-->m
!       * exp(4.5*log(ZSIG_DST(:,:))*log(ZSIG_DST(:,:)))
END IF
IF (LSALT) THEN
ZCTOTAS(:,:) = 0.
CALL  PPP2SALT1D(PSVT(:,NSV_SLTBEG:NSV_SLTEND),& 
                PRHODREF,  PSIG1D=ZSIG_SLT, PRG1D=ZRG_SLT,&
                PN1D=ZN0_SLT, PMASS1D=ZCTOTAS) 
 ZCTOTAS(:,:) = ZCTOTAS(:,:) * 1E9 !kg/m3-->ug/m3
END IF
!Aerosol density (kg/m3)
ZRHOP   = 1.8e3

! Number of actived modes 
NMODE = 0
IF (LDUST)  THEN
    NMODE=NMODE+NMODE_DST
ELSE
    NMODE_DST=0
ENDIF
IF (LSALT)  THEN
    NMODE=NMODE+NMODE_SLT
ELSE
   NMODE_SLT=0
ENDIF
IF (LORILAM) THEN
   NMODE=NMODE+JPMODE
ENDIF

ALLOCATE (ZNCN(SIZE(PSVT,1),NMODE))
ALLOCATE (ZMCN(SIZE(PSVT,1),NMODE))
ALLOCATE (ZNUE(NSP+NCARB+NSOA,NMODE))
ALLOCATE (ZEPS(SIZE(PSVT,1),NSP+NCARB+NSOA,NMODE))
ALLOCATE (ZMI(SIZE(PSVT,1),NSP+NCARB+NSOA,NMODE))
ALLOCATE (ZCTOTAL(SIZE(PSVT,1),NSP+NCARB+NSOA,NMODE))
ALLOCATE (ZRG(SIZE(PSVT,1),NMODE))
ALLOCATE (ZSIG(SIZE(PSVT,1),NMODE))
ALLOCATE (ZN0(SIZE(PSVT,1),NMODE))

ZNCN(:,:)  = 0.
ZMCN(:,:)  = 0.
ZNUE(:,:)  = 0.
ZEPS(:,:,:)  = 0.
ZMI(:,:,:)   = 0.
ZCTOTAL(:,:,:) = 0.
ZRG(:,:) = 0.
ZSIG(:,:) = 0.
ZN0(:,:) = 0.

IF (LORILAM) THEN
   ZRG(:,1:JPMODE)  = ZRG_AER(:,1:JPMODE)
   ZSIG(:,1:JPMODE) = ZSIG_AER(:,1:JPMODE)
   ZN0(:,1:JPMODE)  = ZN0_AER(:,1:JPMODE)

   ZCTOTAL(:,1:NSP+NCARB+NSOA,1:JPMODE) = ZCTOTA(:,1:NSP+NCARB+NSOA,1:JPMODE)
   DO JN=1,JPMODE
   ZMI(:,1:NSP+NCARB+NSOA,JN) = PMI(:,1:NSP+NCARB+NSOA)
   ENDDO
END IF
IF (LDUST) THEN
   ZRG(:,NMODE-NMODE_DST+1:NMODE) = ZRG_DST(:,1:NMODE_DST)
   ZSIG(:,NMODE-NMODE_DST+1:NMODE) = ZSIG_DST(:,1:NMODE_DST)
   ZN0(:,NMODE-NMODE_DST+1:NMODE) = ZN0_DST(:,1:NMODE_DST)

   ZCTOTAL(:,1,NMODE-NMODE_DST+1:NMODE) = ZCTOTAD(:,1:NMODE_DST) 
   ZMI(:,:,NMODE-NMODE_DST+1:NMODE) =  XMOLARWEIGHT_DUST * 1E3
END IF
IF (LSALT) THEN
   ZRG(:,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = ZRG_SLT(:,1:NMODE_SLT)
   ZSIG(:,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = ZSIG_SLT(:,1:NMODE_SLT)
   ZN0(:,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = ZN0_SLT(:,1:NMODE_SLT)

   ZCTOTAL(:,1,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = ZCTOTAS(:,1:NMODE_SLT)
   ZMI(:,:,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) =  XMOLARWEIGHT_SALT * 1E3
END IF

! ZNUE:  Nomber of dissociative ions
IF (LDUST) THEN
ZNUE(1,NMODE-NMODE_DST+1:NMODE) = 1.
ENDIF
IF (LSALT) THEN
ZNUE(1,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = 1.
ENDIF

IF (LORILAM) THEN
ZNUE(JP_AER_SO4,1:JPMODE) = 2.
ZNUE(JP_AER_NO3,1:JPMODE) = 1.
ZNUE(JP_AER_NH3,1:JPMODE) = 1.
ZNUE(JP_AER_OC,1:JPMODE) = 1.
IF (NSOA==10) THEN
ZNUE(JP_AER_SOA1,1:JPMODE) = 1.
ZNUE(JP_AER_SOA2,1:JPMODE) = 1.
ZNUE(JP_AER_SOA3,1:JPMODE) = 0.
ZNUE(JP_AER_SOA4,1:JPMODE) = 0.
ZNUE(JP_AER_SOA5,1:JPMODE) = 0.
ZNUE(JP_AER_SOA6,1:JPMODE) = 2.
ZNUE(JP_AER_SOA7,1:JPMODE) = 2.
ZNUE(JP_AER_SOA8,1:JPMODE) = 0.
ZNUE(JP_AER_SOA9,1:JPMODE) = 1.
ZNUE(JP_AER_SOA10,1:JPMODE) = 0.
END IF
END IF

! ZEPS : Soluble fraction of each aerosol compounds
ZEPS(:,:,:) = 0.

IF (LSALT) THEN
ZEPS(:,:,NMODE-NMODE_DST-NMODE_SLT+1:NMODE-NMODE_DST) = 1.
END IF

IF (LDUST) THEN
! Default dust
ZEPS(:,:,NMODE-NMODE_DST+1:NMODE) = 0.1
ENDIF

IF (LORILAM) THEN
ZEPS(:,JP_AER_H2O,1:JPMODE) = 0.
ZEPS(:,JP_AER_SO4,1:JPMODE) = 1.
ZEPS(:,JP_AER_NO3,1:JPMODE) = 1.
ZEPS(:,JP_AER_NH3,1:JPMODE) = 1.
ZEPS(:,JP_AER_OC,1:JPMODE)  = 0.1

IF (NSOA==10) THEN
DO JN=1,JPMODE
ZEPS(:,JP_AER_SOA1,JN) = PSOLORG(:,1)
ZEPS(:,JP_AER_SOA2,JN) = PSOLORG(:,2)
ZEPS(:,JP_AER_SOA3,JN) = PSOLORG(:,3)
ZEPS(:,JP_AER_SOA4,JN) = PSOLORG(:,4)
ZEPS(:,JP_AER_SOA5,JN) = PSOLORG(:,5)
ZEPS(:,JP_AER_SOA6,JN) = PSOLORG(:,6)
ZEPS(:,JP_AER_SOA7,JN) = PSOLORG(:,7)
ZEPS(:,JP_AER_SOA8,JN) = PSOLORG(:,8)
ZEPS(:,JP_AER_SOA9,JN) = PSOLORG(:,9)
ZEPS(:,JP_AER_SOA10,JN) = PSOLORG(:,10)
ENDDO
END IF
END IF


IF (NMODE >= 1) CALL ABDULRAZZAK(NMODE, ZRHOP, ZNUE, ZEPS, ZMI,  PRHODREF,  &
                                  PTEMP, PWT, PTRAD, PPABST, ZRG, ZSIG, ZN0, &
                                  ZCTOTAL, ZNCN, ZMCN, PSMAX) 
PNCN(:) = 0.
PMCN(:) = 0.
!
! Sum of mass and number of activated aerosol for each mode 
DO JJ=1,NMODE
  PNCN(:) =  PNCN(:) + ZNCN(:,JJ)
  PMCN(:) =  PMCN(:) + ZMCN(:,JJ)
ENDDO

!DO JJ=1,NMODE
!print*,' Nb activee mode ZNCN',JJ,' =',MINVAL(ZNCN(:,JJ)), MAXVAL(ZNCN(:,JJ))
!print*,' % nb active mode ',JJ,' =', MINVAL(1.- (ZN0(:,JJ) -ZNCN(:,JJ))/ZN0(:,JJ)),&
!                                MAXVAL(1.- (ZN0(:,JJ) -ZNCN(:,JJ))/ZN0(:,JJ))
!ENDDO

DEALLOCATE (ZNCN)
DEALLOCATE (ZMCN)
DEALLOCATE (ZNUE)
DEALLOCATE (ZEPS)
DEALLOCATE (ZMI)
DEALLOCATE (ZCTOTAL)
DEALLOCATE (ZRG)
DEALLOCATE (ZSIG)
DEALLOCATE (ZN0)


END SUBROUTINE CH_AER_ACTIVATION