Skip to content
Snippets Groups Projects
Forked from Méso-NH / Méso-NH code
4240 commits behind the upstream repository.
ch_aer_mineral.f90 6.97 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/05/18 13:07:25
!-----------------------------------------------------------------
!!   #######################
     MODULE MODI_CH_AER_MINERAL
!!   #######################
!!
INTERFACE
!
SUBROUTINE CH_AER_MINERAL(PCTOTG, PCTOTA, PRV, PDENAIR, PPRESSURE, PTEMP, PRC, POM,&
                           PCCTOT,PSIG0, PRG0, PDT)
IMPLICIT NONE
REAL, DIMENSION(:,:),   INTENT(INOUT) :: PCTOTG, POM
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCTOTA, PCCTOT 
REAL, DIMENSION(:),     INTENT(IN)    :: PRV, PDENAIR, PPRESSURE, PTEMP, PRC
REAL, DIMENSION(:,:),   INTENT(INOUT) :: PSIG0, PRG0
REAL,                   INTENT(IN)    :: PDT
!
END SUBROUTINE CH_AER_MINERAL
!
END INTERFACE
!
END MODULE MODI_CH_AER_MINERAL
!!
!!
!##########################################################################################
     SUBROUTINE CH_AER_MINERAL(PCTOTG, PCTOTA, PRV, PDENAIR, PPRESSURE, PTEMP, PRC, POM,&
                               PCCTOT,PSIG0, PRG0,PDT)
!###########################################################################################
!!
!!   PURPOSE
!!   -------
!!   solve the mineral thermodynamic balance
!!
!!    REFERENCE
!!    ---------
!!    none
!!
!!    AUTHOR
!!    ------
!!    P. Tulet  (GMEI)
!!
!!    MODIFICATIONS
!!    -------------
!!
!!    EXTERNAL
!!    --------
!!    None
!!
!-------------------------------------------------------------------------------
!
USE MODD_CH_AEROSOL
USE MODI_CH_NNARES
USE MODI_CH_ARES
USE MODI_CH_ISOROPIA
USE MODI_CH_AER_THERMO
USE MODI_CH_AER_EQSAM
USE MODD_CST, ONLY : XMNH_TINY
!USE MODI_CH_AER_DIFF
!!
IMPLICIT NONE
!
!*       0.1   Declarations of arguments
!
REAL, DIMENSION(:,:),   INTENT(INOUT) :: PCTOTG, POM
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCTOTA, PCCTOT 
REAL, DIMENSION(:),     INTENT(IN)    :: PRV, PDENAIR, PPRESSURE, PTEMP, PRC
REAL, DIMENSION(:,:),   INTENT(INOUT) :: PSIG0, PRG0
REAL,                   INTENT(IN)    :: PDT
!
!*       0.2   Declarations of local variables
!
INTEGER :: JI,JJ
REAL, DIMENSION(SIZE(PCTOTA,1),NSP,JPMODE) :: ZFRAC
REAL, DIMENSION(SIZE(PCTOTA,1),NSP) :: ZTOT,ZTOTNEW, ZTOTGNEW 
REAL, DIMENSION(SIZE(PCTOTA,1),NSP+NCARB+NSOA) :: ZDEL
REAL, DIMENSION(SIZE(PCTOTA,1),6) :: ZAER
REAL, DIMENSION(SIZE(PCTOTA,1))   :: ZPKM, ZPKH2O, ZSAT, ZRH

!*****************************************************************
!*****************************************************************
! SOLVEUR DE L'EQUILIBRE CHIMIQUE MINERAL
!*****************************************************************
!*****************************************************************

ZPKM(:) = 1E-3*PDENAIR(:) * 6.0221367E+23 / 28.9644
ZPKH2O(:) = ZPKM(:)*1.6077*PRV(:)
!
! compute relative humidity
ZSAT(:)=0.611*EXP(17.2694*(PTEMP(:)-273.16)/(PTEMP(:)-35.86))
ZSAT(:)=ZSAT(:)*1000.
ZRH(:)=(ZPKH2O(:)/(ZPKM(:)*1.6077))*PPRESSURE(:)/&
       &(0.622+(ZPKH2O(:)/(ZPKM(:)*1.6077)))/ZSAT(:)
ZRH(:) = MIN(0.95, MAX(ZRH(:), .1)) ! until 0.95 thermodynamic code is not valid
!
! Mass need to be positive
PCTOTA(:,:,:)= MAX (PCTOTA(:,:,:),0.)
PCTOTG(:,:)= MAX (PCTOTG(:,:),0.)
ZTOTGNEW(:,:)= 0.
!
!******************************************************************
! Calcul de la repartition des differentes especes entre les modes
! pour pouvoir conserver celle ci apres l'equilibre chimique
!******************************************************************
DO JI=1,NSP
  ZTOTNEW(:,JI)=0.
  ZTOT(:,JI)=PCTOTA(:,JI,1)+PCTOTA(:,JI,2)
  ZTOT(:,JI) = MAX(ZTOT(:,JI),1.E-40)
  ZFRAC(:,JI,1)=PCTOTA(:,JI,1)/(ZTOT(:,JI)+1E-25)
  ZFRAC(:,JI,2)=1.-ZFRAC(:,JI,1)
ENDDO
!
ZTOTNEW(:,:) = ZTOT(:,:)
!
ZAER(:,1)=ZTOT(:,JP_AER_SO4)
ZAER(:,2)=PCTOTG(:,JP_AER_NH3g)
ZAER(:,3)=PCTOTG(:,JP_AER_NO3g)
ZAER(:,4)=ZTOT(:,JP_AER_H2O)
!ZAER(:,4)=0.
ZAER(:,5)=ZTOT(:,JP_AER_NO3)
ZAER(:,6)=ZTOT(:,JP_AER_NH3)
ZAER(:,:)=MAX(ZAER(:,:),0.)

! switch here for  ARES (ARES), Neuronal ARES (NARES), ISOROPIA (ISPIA)
IF (CMINERAL == 'NARES') THEN
  CALL CH_NNARES(ZAER,ZRH, PDENAIR, PPRESSURE, PTEMP, PRC)
  ZAER(:,:)=MAX(ZAER(:,:),0.)
  ZTOTNEW(:,JP_AER_SO4)=ZAER(:,1)
  ZTOTGNEW(:,JP_AER_NH3g)=ZAER(:,2)
  ZTOTGNEW(:,JP_AER_NO3g)=ZAER(:,3)
  ZTOTNEW(:,JP_AER_H2O)=ZAER(:,4)
  ZTOTNEW(:,JP_AER_NO3)=ZAER(:,5)
  ZTOTNEW(:,JP_AER_NH3)=ZAER(:,6)

! Especes phase gazeuse
!PCTOTG(:,JP_AER_SO4g)=0.         !H2SO4(g)
ELSE IF (CMINERAL == 'ARES') THEN
! test of stability
!DO III=1, 5
  CALL CH_ARES(ZAER,ZRH, PDENAIR, PPRESSURE, PTEMP, PRC)
  ZAER(:,:) = MAX(ZAER(:,:),0.)
  ZTOTNEW(:,JP_AER_SO4)=ZAER(:,1)
  ZTOTGNEW(:,JP_AER_NH3g)=ZAER(:,2)
  ZTOTGNEW(:,JP_AER_NO3g)=ZAER(:,3)
  ZTOTNEW(:,JP_AER_H2O)=ZAER(:,4)
  ZTOTNEW(:,JP_AER_NO3)=ZAER(:,5)
  ZTOTNEW(:,JP_AER_NH3)=ZAER(:,6)
!ENDDO
!
ELSE IF (CMINERAL == 'ISPIA') THEN
!
  CALL CH_ISOROPIA(ZAER,ZRH, PDENAIR, PPRESSURE, PTEMP, PRC)

  ZAER(:,:)=MAX(ZAER(:,:),0.)
  ZTOTNEW(:,JP_AER_SO4)=ZAER(:,1)
  ZTOTGNEW(:,JP_AER_NH3g)=ZAER(:,2)
  ZTOTGNEW(:,JP_AER_NO3g)=ZAER(:,3)
  ZTOTNEW(:,JP_AER_H2O)=ZAER(:,4)
  ZTOTNEW(:,JP_AER_NO3)=ZAER(:,5)
  ZTOTNEW(:,JP_AER_NH3)=ZAER(:,6)
!

ELSE IF (CMINERAL == 'TABUL') THEN

  CALL CH_AER_THERMO(ZAER,ZRH, PDENAIR, PPRESSURE, PTEMP, PRC)

  ZAER(:,:)=MAX(ZAER(:,:),0.)
  ZTOTNEW(:,JP_AER_SO4)=ZAER(:,1)
  ZTOTGNEW(:,JP_AER_NH3g)=ZAER(:,2)
  ZTOTGNEW(:,JP_AER_NO3g)=ZAER(:,3)
  ZTOTNEW(:,JP_AER_H2O)=ZAER(:,4)
  ZTOTNEW(:,JP_AER_NO3)=ZAER(:,5)
  ZTOTNEW(:,JP_AER_NH3)=ZAER(:,6)

ELSE IF (CMINERAL == 'EQSAM') THEN

  CALL CH_AER_EQSAM(ZAER,ZRH, PPRESSURE, PTEMP)

  ZAER(:,:)=MAX(ZAER(:,:),0.)
  ZTOTNEW(:,JP_AER_SO4)=ZAER(:,1)
  ZTOTGNEW(:,JP_AER_NH3g)=ZAER(:,2)
  ZTOTGNEW(:,JP_AER_NO3g)=ZAER(:,3)
  ZTOTNEW(:,JP_AER_H2O)=ZAER(:,4)
  ZTOTNEW(:,JP_AER_NO3)=ZAER(:,5)
  ZTOTNEW(:,JP_AER_NH3)=ZAER(:,6)
!
ELSE

PRINT *,' WARNING WARNING WARNING WARNING WARNING WARNING'
PRINT *,' PAS D EQUILIBRE THERMODYNAMIQUE ENTRE LES MINERAUX'
PRINT *,' WARNING WARNING WARNING WARNING WARNING WARNING'
  ZTOTNEW(:,:) = MAX(0.,ZTOT(:,:))

ENDIF
! Especes phase gazeuse
ZTOTGNEW(:,JP_AER_SO4g)=0.         !H2SO4(g)
ZTOTNEW(:,:) = MAX(0.,ZTOTNEW(:,:))
!
ZDEL(:,:)=0.
! Concentration des especes 'totales' presentes dans l'aerosol
ZDEL(:,1:NSP)=ZTOTNEW(:,1:NSP)-ZTOT(:,1:NSP)
!
! Calcul de la nouvelle composition chimique
! de chacun des modes apres equilibre chimique
DO JI=1,JPMODE
  DO JJ=1,NSP

  !PCTOTA(:,JJ,JI)=MAX(XMNH_TINY,PCTOTA(:,JJ,JI)+ZFRAC(:,JJ,JI)*ZDEL(:,JJ))
  ! rpartition entre les modes en fonction de la surface des aerosols (facteur
  ! omega)
  !  PCTOTA(:,JJ,JI)=MAX(XMNH_TINY,PCTOTA(:,JJ,JI)+ZDEL(:,JJ)*POM(:,JI)) 
   PCTOTA(:,JJ,JI)=MAX(XMNH_TINY,ZTOTNEW(:,JJ)*POM(:,JI))
 ENDDO
ENDDO
!
DO JJ=1,NSP
  PCTOTG(:,JJ)=MAX(XMNH_TINY,PCTOTG(:,JJ)-ZDEL(:,JJ)) 
ENDDO
!
END SUBROUTINE CH_AER_MINERAL