Skip to content
Snippets Groups Projects
Commit 4212517c authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 02/03/2021: blowsnow: small improvements

parent 5c13e45d
No related branches found
No related tags found
No related merge requests found
!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC Copyright 2011-2021 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
! Modifications:
!-----------------------------------------------------------------
! ########################
MODULE MODI_BLOWSNOW
! ########################
......@@ -9,10 +12,9 @@
!
INTERFACE
!
SUBROUTINE BLOWSNOW(HLBCX,HLBCY,PTSTEP,KRR,PPABST,PTHT,PRT,PZZ,PRHODREF, &
SUBROUTINE BLOWSNOW(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
!
......@@ -38,7 +40,7 @@ END INTERFACE
END MODULE MODI_BLOWSNOW
!
! ######################################################################
SUBROUTINE BLOWSNOW(HLBCX,HLBCY,PTSTEP,KRR,PPABST,PTHT,PRT,PZZ,PRHODREF, &
SUBROUTINE BLOWSNOW(PTSTEP,KRR,PPABST,PTHT,PRT,PZZ,PRHODREF, &
PRHODJ,PEXNREF,PRS,PTHS,PSVT,PSVS,PSNWSUBL3D)
! ######################################################################
! ##########################################################################
......@@ -84,25 +86,21 @@ END MODULE MODI_BLOWSNOW
!! 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 MODD_BLOWSNOW_n, only: LSNOWSUBL
USE MODD_NSV, only: NSV_SNWBEG, NSV_SNWEND
USE MODD_PARAMETERS, only: JPHEXT, JPVEXT
USE MODI_BLOWSNOW_VELGRAV
!
USE MODI_SEDIM_BLOWSNOW
USE MODI_SUBL_BLOWSNOW
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
!
......@@ -133,8 +131,6 @@ 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
!------------------------------------------------------------------------------
!
......@@ -148,13 +144,8 @@ 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
......@@ -165,10 +156,9 @@ DO JRR = 1,KRR
PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:)
END DO
DO JSV = 1,SIZE(ZSVS,4)
ZSVS(:,:,:,JSV) = ZSVS(:,:,:,JSV) / PRHODJ(:,:,:)
DO JSV = NSV_SNWBEG, NSV_SNWEND
PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:)
END DO
!
! complete the vertical boundaries
!
......@@ -185,10 +175,10 @@ 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
PSVS(:,:,IKB-1,NSV_SNWBEG:NSV_SNWEND) = 0.0
PSVS(:,:,IKE+1,NSV_SNWBEG:NSV_SNWEND) = 0.0
PSVT(:,:,IKB-1,NSV_SNWBEG:NSV_SNWEND) = 0.0
PSVT(:,:,IKE+1,NSV_SNWBEG:NSV_SNWEND) = 0.0
!
!------------------------------------------------------------------------------
!
......@@ -199,7 +189,7 @@ ZSVT(:,:,IKE+1,:) = 0.0
! - sublimation as ventilation velocity
! - sedimentation
!
CALL BLOWSNOW_VELGRAV(ZSVT(:,:,1:IKE+1,:),PTHT(:,:,1:IKE+1), &
CALL BLOWSNOW_VELGRAV(PSVT(:,:,1:IKE+1,NSV_SNWBEG:NSV_SNWEND),PTHT(:,:,1:IKE+1), &
PPABST(:,:,1:IKE+1), &
PRHODREF(:,:,1:IKE+1),ZVGK(:,:,1:IKE+1,:))
......@@ -208,14 +198,15 @@ CALL BLOWSNOW_VELGRAV(ZSVT(:,:,1:IKE+1,:),PTHT(:,:,1:IKE+1), &
!* 4. Sublimation (optional)
! ------------------------
!
IF(LSNOWSUBL) THEN
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) )
PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),PTHS,PRS(:,:,:,1),PSVS(:,:,:,NSV_SNWBEG:NSV_SNWEND), &
PSNWSUBL3D,ZVGK(:,:,:,2) )
END IF
!------------------------------------------------------------------------------
!
......@@ -224,11 +215,10 @@ END IF
!
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,:))
!
PSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_SNWBEG:NSV_SNWEND), &
PSVS(IIB:IIE,IJB:IJE,IKB:IKE,NSV_SNWBEG:NSV_SNWEND),ZVGK(IIB:IIE,IJB:IJE,IKB:IKE,:))
!
!-------------------------------------------------------------------------------
!
!
......@@ -241,15 +231,10 @@ 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(:,:,:)
DO JSV = NSV_SNWBEG, NSV_SNWEND
PSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP
PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:)
END DO
DEALLOCATE(ZSVS)
DEALLOCATE(ZSVT)
END SUBROUTINE BLOWSNOW
......@@ -1480,9 +1480,9 @@ XT_COUPL = XT_COUPL + ZTIME2 - ZTIME1
!* 8 Bis . Blowing snow scheme
! ---------
!
IF(LBLOWSNOW) THEN
CALL BLOWSNOW(CLBCX,CLBCY,XTSTEP,NRR,XPABST,XTHT,XRT,XZZ,XRHODREF, &
XRHODJ,XEXNREF,XRRS,XRTHS,XSVT,XRSVS,XSNWSUBL3D )
IF ( LBLOWSNOW ) THEN
CALL BLOWSNOW( XTSTEP, NRR, XPABST, XTHT, XRT, XZZ, XRHODREF, &
XRHODJ, XEXNREF, XRRS, XRTHS, XSVT, XRSVS, XSNWSUBL3D )
ENDIF
!
!-----------------------------------------------------------------------
......
!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC Copyright 2018-2021 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.
!-----------------------------------------------------------------
! Modifications:
! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
!-----------------------------------------------------------------
! ##############################
MODULE MODI_SEDIM_BLOWSNOW
!! ##############################
......@@ -13,7 +16,6 @@ SUBROUTINE SEDIM_BLOWSNOW( &
PTHT & !I [K] theta
,PDTMONITOR & !I Time step
,PRHODREF & !I [kg/m3] air density
,PPABST & !I [Pa] pressure
,PZZ & !I [m] height of layers
,PSVT & !IO [scalar variable, ppp] Blowing snow concentration
,PSVS & !IO ! Blowing snow variable source
......@@ -26,7 +28,6 @@ REAL, INTENT(IN) :: PDTMONITOR
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !scalar variable
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS !scalar variable
REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT,PRHODREF, PZZ
REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PVGK !Settling velocity of blowing snow variable
......@@ -39,7 +40,7 @@ END MODULE MODI_SEDIM_BLOWSNOW
!! #######################################
SUBROUTINE SEDIM_BLOWSNOW(PTHT,PDTMONITOR,&
PRHODREF,PPABST,PZZ,PSVT,&
PRHODREF,PZZ,PSVT,&
PSVS,PVGK)
!! #######################################
!!
......@@ -58,7 +59,6 @@ END MODULE MODI_SEDIM_BLOWSNOW
!! -------------
!! Original
!!
! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
!
USE MODD_BLOWSNOW
USE MODD_CSTS_BLOWSNOW
......@@ -73,7 +73,6 @@ REAL, INTENT(IN) :: PDTMONITOR
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !scalar variable
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS !scalar variable
REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT,PRHODREF, PZZ
REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PVGK !Settling velocity of blowing snow variable
!
......
......@@ -103,8 +103,6 @@ INTEGER :: IKE !
!
REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZBETA
REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZT
REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
:: ZW ! work array
LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
:: GSUBL ! Test where to compute sublimation
......@@ -203,7 +201,7 @@ IKE=SIZE(PZZ,3) - JPVEXT
!
!-------------------------------------------------------------------------------
!
!* 2. COMPUTE THE BLOWINGG SNOW SUBLIMATION
!* 2. COMPUTE THE BLOWING SNOW SUBLIMATION
!
! Optimization by looking for locations where
! the blowing snow fields are larger than a minimal value only !!!
......@@ -288,22 +286,14 @@ IF( IMICRO >= 0 ) THEN
ALLOCATE(ZAM3(IMICRO))
ALLOCATE(NMAX(IMICRO))
CALL SNOW_SUBL
CALL SNOW_SUBL
ZW(:,:,:) = PRVS(:,:,:)
PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
ZW(:,:,:) = PTHS(:,:,:)
PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
ZW(:,:,:) = PSVS(:,:,:,1)
PSVS(:,:,:,1) = UNPACK( ZSVS(:,1),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
ZW(:,:,:) = PSVS(:,:,:,2)
PSVS(:,:,:,2) = UNPACK( ZSVS(:,2),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
! ZW(:,:,:) = PSVS(:,:,:,3)
! PSVS(:,:,:,3) = UNPACK( ZSVS(:,3),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
ZW(:,:,:) = PSNWSUBL3D(:,:,:)
PSNWSUBL3D(:,:,:) = UNPACK( ZSNWSUBL(:),MASK=GSUBL(:,:,:),FIELD=ZW(:,:,:) )
PRVS(:,:,:) = UNPACK( ZRVS(:), MASK=GSUBL(:,:,:),FIELD=PRVS(:,:,:) )
PTHS(:,:,:) = UNPACK( ZTHS(:), MASK=GSUBL(:,:,:),FIELD=PTHS(:,:,:) )
PSVS(:,:,:,1) = UNPACK( ZSVS(:,1), MASK=GSUBL(:,:,:),FIELD=PSVS(:,:,:,1) )
PSVS(:,:,:,2) = UNPACK( ZSVS(:,2), MASK=GSUBL(:,:,:),FIELD=PSVS(:,:,:,2) )
! PSVS(:,:,:,3) = UNPACK( ZSVS(:,3),MASK=GSUBL(:,:,:),FIELD=PSVS(:,:,:,3) )
PSNWSUBL3D(:,:,:) = UNPACK( ZSNWSUBL(:),MASK=GSUBL(:,:,:),FIELD=PSNWSUBL3D(:,:,:) )
DEALLOCATE(ZRVT)
DEALLOCATE(ZRCT)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment