Skip to content
Snippets Groups Projects
blowsnow.f90 8.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
    !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
    !MNH_LIC for details. version 1.
    !    ########################
         MODULE MODI_BLOWSNOW
    !    ########################
    !
    !
    INTERFACE
    !
          SUBROUTINE BLOWSNOW(HLBCX,HLBCY,PTSTEP,KRR,PPABST,PTHT,PRT,PZZ,PRHODREF,  &
                               PRHODJ,PEXNREF,PRS,PTHS,PSVT,PSVS,PSNWSUBL3D)
    !
    CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
    REAL,                     INTENT(IN)   :: PTSTEP ! Time step :XTSTEP in namelist
    INTEGER,                  INTENT(IN)   :: KRR      ! Number of moist variables
    !
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABST  ! abs. pressure at time t
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHT    ! Theta at time t
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT     !  Moist  variable at time t
    
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PZZ     ! Height (z)
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODREF! Reference dry air density
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODJ  !Dry density * Jacobian
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PEXNREF ! Reference Exner function
    
    REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS  ! Theta source
    REAL, DIMENSION(:,:,:,:),   INTENT(INOUT) :: PRS   !  Moist  variable sources
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT  ! Scalar variable at time t
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS  ! Scalar variable sources
    
    REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PSNWSUBL3D  ! Blowing snow sublimation profile 
    !
    END SUBROUTINE BLOWSNOW
    !
    END INTERFACE
    END MODULE MODI_BLOWSNOW
    !
    !     ######################################################################
          SUBROUTINE BLOWSNOW(HLBCX,HLBCY,PTSTEP,KRR,PPABST,PTHT,PRT,PZZ,PRHODREF, &
                               PRHODJ,PEXNREF,PRS,PTHS,PSVT,PSVS,PSNWSUBL3D)
    !     ######################################################################
    !     ##########################################################################
    !
    !!
    !!    PURPOSE
    !!    -------
    !!      The purpose of this routine is to compute the evolution of blowing snow
    !:      particles in Meso-NH and the related variables in Canopy 
    !!
    !!
    !!**  METHOD
    !!    ------
    !!
    !!    EXTERNAL
    !!    --------
    !!      Subroutine BLOWSNOW_VELGRAV: Computes settling velocity of blown snow
    !                                     particles
    !!      Subroutine SUBL_BLOWSNOW   : Computes sublimation of blown snow
    !!                                    particles
    !!      Subroutine SEDIM_BLOWSNOW  : Computes sedimentation of blown snow
    !!                                    particles
    !!
    !!
    !!    IMPLICIT ARGUMENTS
    !!    ------------------
    !!
    !!    REFERENCE
    !!    ---------
    !!
    !!    Vionnet, V., Martin, E., Masson, V., Guyomarc’h, G., Naaim-Bouvet, F., Prokop, A., 
    !!    Durand, Y. and Lac, C. : 
    !!    Simulation of wind-induced snow transport and sublimation in alpine terrain 
    !!    using a fully coupled snowpack/atmosphere model, The Cryosphere, 8, 395-415, 2014  
    !!
    !!    AUTHOR
    !!    ------
    !!      V. Vionnet      * CNRM/GAME*
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original    10/10/11
    !!      Implementation in MNH 53 07/2017
    !
    !*       0.    DECLARATIONS
    !  
    USE MODE_ll
    !
    USE MODD_NSV
    USE MODD_PARAMETERS
    USE MODD_BLOWSNOW_n
    USE MODD_BLOWSNOW
    !
    USE MODI_SUBL_BLOWSNOW
    USE MODI_SEDIM_BLOWSNOW
    USE MODI_BLOWSNOW_VELGRAV
    !
    IMPLICIT NONE
    !
    !*       0.1   Declarations of dummy arguments :
    !
    !
    !
    CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
    REAL,                     INTENT(IN)   :: PTSTEP ! Time step :XTSTEP in namelist
    INTEGER,                  INTENT(IN)   :: KRR      ! Number of moist variables
    !
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABST  ! abs. pressure at time t
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHT    ! Theta at time t
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT     !  Moist  variable at time t
    
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PZZ     ! Height (z)
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODREF! Reference dry air density
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODJ  !Dry density * Jacobian
    REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PEXNREF ! Reference Exner function
    
    REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS  ! Theta source
    REAL, DIMENSION(:,:,:,:),   INTENT(INOUT) :: PRS   !  Moist  variable sources
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT  ! Scalar variable at time t
    REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS  ! Scalar variable sources
    
    REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PSNWSUBL3D  ! Blowing snow sublimation profile  
    !
    !
    !*       0.2   Declarations of local variables :
    !
    INTEGER :: JRR,JSV       ! Loop index for the moist and scalar variables
    INTEGER :: IIB           !  Define the physical domain
    INTEGER :: IIE           !
    INTEGER :: IJB           !
    INTEGER :: IJE           !
    INTEGER :: IKB           !
    INTEGER :: IKE           !
    
    REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT   ! scalar variable for microphysics only
    REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS   ! scalar tendency for microphysics only
    REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZVGK   ! settling velocity for blowing snow variables
    !------------------------------------------------------------------------------
    !
    !*       1.     PRELIMINARY COMPUTATIONS
    !               ------------------------
    !
    IIB=1+JPHEXT
    IIE=SIZE(PZZ,1) - JPHEXT
    IJB=1+JPHEXT
    IJE=SIZE(PZZ,2) - JPHEXT
    IKB=1+JPVEXT
    IKE=SIZE(PZZ,3) - JPVEXT
    
    
    ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV_SNWEND - NSV_SNWBEG + 1))
    ALLOCATE(ZSVS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV_SNWEND - NSV_SNWBEG + 1))
    ALLOCATE(ZVGK(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV_SNWEND - NSV_SNWBEG + 1))
    
    ZSVT = PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND) 
    ZSVS = PSVS(:,:,:,NSV_SNWBEG:NSV_SNWEND)
    ZVGK = 0.
    !
    !*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
    !               ---------------------------------------
    !
    PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:)
    DO JRR = 1,KRR
      PRS(:,:,:,JRR)  = PRS(:,:,:,JRR) / PRHODJ(:,:,:)
    END DO
    
    DO  JSV = 1,SIZE(ZSVS,4)
        ZSVS(:,:,:,JSV) = ZSVS(:,:,:,JSV) / PRHODJ(:,:,:)
    END DO
    
    !
    !  complete the vertical boundaries
    !
    PTHS(:,:,IKB-1) = PTHS(:,:,IKB)
    PTHS(:,:,IKE+1) = PTHS(:,:,IKE)
    !
    PRS(:,:,IKB-1,1) = PRS(:,:,IKB,1)
    PRS(:,:,IKE+1,1) = PRS(:,:,IKE,1)
    PRS(:,:,IKB-1,2:) = 0.0
    PRS(:,:,IKE+1,2:) = 0.0
    !
    PRT(:,:,IKB-1,1) = PRT(:,:,IKB,1)
    PRT(:,:,IKE+1,1) = PRT(:,:,IKE,1)
    PRT(:,:,IKB-1,2:) = 0.0
    PRT(:,:,IKE+1,2:) = 0.0
    !
    ZSVS(:,:,IKB-1,:) = 0.0
    ZSVS(:,:,IKE+1,:) = 0.0
    ZSVT(:,:,IKB-1,:) = 0.0
    ZSVT(:,:,IKE+1,:) = 0.0
    !
    !------------------------------------------------------------------------------
    !
    !*       3.     Settling velocity
    !               ------------------------
    !
    ! Compute number-averaged and mass-averaged settling velocity. Used later for: 
    !      - sublimation as ventilation velocity 
    !      - sedimentation
    !
    CALL BLOWSNOW_VELGRAV(ZSVT(:,:,1:IKE+1,:),PTHT(:,:,1:IKE+1),    &
                          PPABST(:,:,1:IKE+1),                       &
                          PRHODREF(:,:,1:IKE+1),ZVGK(:,:,1:IKE+1,:))
    
    !------------------------------------------------------------------------------
    !
    !*       4.     Sublimation (optional)
    !               ------------------------
    !
    IF(LSNOWSUBL) THEN 
    ! Initialize blowing snow sublimation profile         
         PSNWSUBL3D(:,:,:) = 0.        
    !    Compute sublimation for MNH levels        
         CALL SUBL_BLOWSNOW(PZZ, PRHODJ,PRHODREF, PEXNREF, PPABST,          &
                             PTHT, PRT(:,:,:,1), PRT(:,:,:,2),PRT(:,:,:,3),  &
                             PRT(:,:,:,4), PRT(:,:,:,5),PRT(:,:,:,6),        & 
                             ZSVT,PTHS,PRS(:,:,:,1),ZSVS,PSNWSUBL3D,ZVGK(:,:,:,2)  )  
    END IF
    !------------------------------------------------------------------------------
    !
    !*       5.     Sedimentation 
    !               ------------------------
    !
    CALL SEDIM_BLOWSNOW(PTHT(IIB:IIE,IJB:IJE,IKB:IKE), PTSTEP,&
                      PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),         &
                      PPABST(IIB:IIE,IJB:IJE,IKB:IKE),           &
                      PZZ(IIB:IIE,IJB:IJE,IKB:IKE+1),            &
                      ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),           &
                      ZSVS(IIB:IIE,IJB:IJE,IKB:IKE,:),ZVGK(IIB:IIE,IJB:IJE,IKB:IKE,:))
    !                  
    !-------------------------------------------------------------------------------
    !
    !
    !*      6.     SWITCH BACK TO THE PROGNOSTIC VARIABLES
    !               ---------------------------------------
    !
    PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:)
    !
    DO JRR = 1,KRR
      PRS(:,:,:,JRR)  = PRS(:,:,:,JRR) * PRHODJ(:,:,:)
    END DO
    
    DO  JSV = 1,SIZE(ZSVS,4)
        PSVS(:,:,:,JSV+NSV_SNWBEG-1) = ZSVS(:,:,:,JSV) * PRHODJ(:,:,:)
    END DO
    DO JSV = NSV_SNWBEG, NSV_SNWEND
         PSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP / PRHODJ(:,:,:)
    END DO
    
    
    DEALLOCATE(ZSVS)
    DEALLOCATE(ZSVT)
    
    END SUBROUTINE BLOWSNOW