Skip to content
Snippets Groups Projects
mode_bl_depth_diag.F90 4.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2022 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 MODE_BL_DEPTH_DIAG
    
    !
    INTERFACE BL_DEPTH_DIAG  
          MODULE PROCEDURE BL_DEPTH_DIAG_3D
          MODULE PROCEDURE BL_DEPTH_DIAG_1D
    END INTERFACE
    !
    CONTAINS
    !
    
    SUBROUTINE BL_DEPTH_DIAG_3D(D,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF,BL_DEPTH_DIAG3D)
    
    USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
    
    !
    !
    !!****  *SBL_DEPTH* - computes SBL depth
    !!
    !!    PURPOSE
    !!    -------
    !
    !!**  METHOD
    !!    ------
    !!
    !!    SBL is defined as the layer where momentum flux is equal to XSBL_FRAC of its surface value
    !!    
    !!    EXTERNAL
    !!    --------
    !!
    !!    IMPLICIT ARGUMENTS
    !!    ------------------
    !!
    !!
    !!    REFERENCE
    !!    ---------
    !!
    !!    AUTHOR
    !!    ------
    !!      V. Masson * Meteo-France *
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original         nov. 2005
    !!
    !! --------------------------------------------------------------------------
    !       
    !*      0. DECLARATIONS
    !          ------------
    !
    !*      0.1  declarations of arguments
    !
    
    TYPE(DIMPHYEX_t),              INTENT(IN)           :: D
    REAL, DIMENSION(D%NIJT),       INTENT(IN)           :: PSURF        ! surface flux
    REAL, DIMENSION(D%NIJT),       INTENT(IN)           :: PZS          ! orography
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)           :: PFLUX        ! flux
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)           :: PZZ          ! altitude of flux points
    REAL,                          INTENT(IN)           :: PFTOP_O_FSURF! Flux at BL top / Surface flux
    REAL, DIMENSION(D%NIJT),       INTENT(OUT)          :: BL_DEPTH_DIAG3D
    
    !
    !
    !       0.2  declaration of local variables
    !
    
    INTEGER :: JIJ,JK ! loop counters
    
    REAL    :: ZFLX     ! flux at top of BL
    !
    !----------------------------------------------------------------------------
    !
    
    REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
    
    IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_3D',0,ZHOOK_HANDLE)
    
          ZFLX = PSURF(JIJ) * PFTOP_O_FSURF
    
          IF ( (PFLUX(JIJ,JK)-ZFLX)*(PFLUX(JIJ,JK-IKL)-ZFLX) <= 0. ) THEN
            BL_DEPTH_DIAG3D(JIJ) = (PZZ  (JIJ,JK-IKL) - PZS(JIJ))     &
                             + (PZZ  (JIJ,JK) - PZZ  (JIJ,JK-IKL))    &
                             * (ZFLX          - PFLUX(JIJ,JK-IKL)  )  &
                             / (PFLUX(JIJ,JK) - PFLUX(JIJ,JK-IKL)   )
    
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    BL_DEPTH_DIAG3D(IIJB:IIJE) = BL_DEPTH_DIAG3D(IIJB:IIJE) / (1. - PFTOP_O_FSURF)
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    
    !
    IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_3D',1,ZHOOK_HANDLE)
    
    END SUBROUTINE BL_DEPTH_DIAG_3D
    
    SUBROUTINE BL_DEPTH_DIAG_1D(D,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF,BL_DEPTH_DIAG1D)
    
    USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
    
    REAL,                   INTENT(IN)           :: PSURF        ! surface flux
    REAL,                   INTENT(IN)           :: PZS          ! orography
    
    REAL, DIMENSION(D%NKT), INTENT(IN)           :: PFLUX        ! flux
    REAL, DIMENSION(D%NKT), INTENT(IN)           :: PZZ          ! altitude of flux points
    
    REAL,                   INTENT(IN)           :: PFTOP_O_FSURF! Flux at BL top / Surface flux
    
    REAL,                   INTENT(OUT)          :: BL_DEPTH_DIAG1D
    
    REAL, DIMENSION(1,1,D%NKT)       :: ZFLUX
    REAL, DIMENSION(1,1,D%NKT)       :: ZZZ
    
    REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
    
    IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',0,ZHOOK_HANDLE)
    
    ZFLUX(1,1,1:IKT) = PFLUX(1:IKT)
    ZZZ  (1,1,1:IKT) = PZZ  (1:IKT)
    
    CALL BL_DEPTH_DIAG_3D(D,ZSURF,ZZS,ZFLUX,ZZZ,PFTOP_O_FSURF,ZBL_DEPTH_DIAG)
    
    BL_DEPTH_DIAG1D = ZBL_DEPTH_DIAG(1,1)
    
    !
    !-------------------------------------------------------------------------------
    !
    IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',1,ZHOOK_HANDLE)
    
    END SUBROUTINE BL_DEPTH_DIAG_1D