SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/sm10.F90
Go to the documentation of this file.
00001 !     ###############################################################################
00002 SUBROUTINE SM10(PZ,PBLD_HEIGHT,PLAMBDA_F,PL)
00003 !     ###############################################################################
00004 !
00005 !!****  *SM10* computes the shape for the mixing length according to Santiago and Martilli 2010
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!
00013 !!    REFERENCE
00014 !!    ---------
00015 !!      
00016 !!
00017 !!    AUTHOR
00018 !!    ------
00019 !!     V. Masson 
00020 !!
00021 !!    MODIFICATIONS
00022 !!    -------------
00023 !!      Original    06/2010
00024 !!---------------------------------------------------------------
00025 !
00026 !
00027 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00028 USE PARKIND1  ,ONLY : JPRB
00029 !
00030 IMPLICIT NONE
00031 !
00032 !*      0.1    declarations of arguments
00033 !
00034 REAL, DIMENSION(:,:), INTENT(IN)  :: PZ          ! canopy levels        (m)
00035 REAL, DIMENSION(:),   INTENT(IN)  :: PBLD_HEIGHT ! building height      (m)
00036 REAL, DIMENSION(:),   INTENT(IN)  :: PLAMBDA_F   ! frontal area density (-)
00037 REAL, DIMENSION(:,:), INTENT(OUT) :: PL          ! base profile for mixing 
00038 !                                                ! length computations  (m)
00039 !
00040 !
00041 !*      0.2    declarations of local variables
00042 !
00043 REAL, DIMENSION(SIZE(PZ,1))           :: ZZ_CAN             ! mixing length generic profile in canopy
00044 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)):: ZZ_SURF            ! Mixing length generic profile at mid levels (near the surface)
00045 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)):: ZZ_ISBL            ! Mixing length generic profile at mid levels (in the inertial SBL)
00046 REAL, DIMENSION(SIZE(PZ,1))           :: ZZ_BASE_ISBL       ! Mixing length generic at the base of the ISBL
00047 REAL, DIMENSION(SIZE(PZ,1))           :: ZDISP_H            ! displacement height
00048 REAL, PARAMETER                       :: ZALPHA_CAN = 1.12  ! value to compute lengths in the canyon
00049 
00050 INTEGER                               :: JLAYER             ! vertical loop counter
00051 INTEGER                               :: ILVL               ! number of layers
00052 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00053 !
00054 !-------------------------------------------------------------------------------------
00055 !* Preliminaries:
00056 IF (LHOOK) CALL DR_HOOK('SM10',0,ZHOOK_HANDLE)
00057 ILVL = SIZE(PZ,2)
00058 !
00059 !* Typical uniform value in the canopy (after Santiago and Martilli 2010)
00060 !  Threshold at 3/4 of hte height of the building is added to avoid unphysical
00061 !  values for large lambda_f.
00062 !
00063 ZDISP_H(:) = MIN ( PLAMBDA_F(:)**0.13 * PBLD_HEIGHT(:) , 0.75 * PBLD_HEIGHT )
00064 ZZ_CAN(:)  = ZALPHA_CAN * (PBLD_HEIGHT(:) - ZDISP_H(:))
00065 !
00066 !* Lengths near the surface (road, gardens)
00067 ZZ_SURF(:,:) = PZ(:,:)
00068 !
00069 !* Lengths in the inertial sublayer (z/h>1.5)
00070 DO JLAYER=1,ILVL
00071   ZZ_ISBL(:,JLAYER) = MAX(ZZ_CAN(:), PZ(:,JLAYER) - ZDISP_H(:))
00072 END DO
00073 ! first point is used to compute the value at the base of the ISBL (z/h=1.5)
00074 ZZ_BASE_ISBL(:) = MAX (PZ(:,1),  1.5 * PBLD_HEIGHT(:) )
00075 !
00076 !* Composition of all these mixing lengths
00077 DO JLAYER=1,ILVL
00078   WHERE (PZ(:,JLAYER)<=PBLD_HEIGHT(:))
00079 !* inside canopy, lengths are equal to minimum between uniform value and value limited by the surface
00080     PL(:,JLAYER) = MIN(ZZ_SURF(:,JLAYER), ZZ_CAN(:))
00081   END WHERE
00082   WHERE (PZ(:,JLAYER)>ZZ_BASE_ISBL(:) )
00083 !* in the inertial sublayer
00084     PL(:,JLAYER) = ZZ_ISBL(:,JLAYER)
00085   END WHERE
00086   WHERE (PZ(:,JLAYER)>PBLD_HEIGHT(:) .AND. PZ(:,JLAYER)<=1.5*PBLD_HEIGHT(:))
00087 !* in the transition sublayer
00088     PL(:,JLAYER) = ZZ_CAN(:) + (ZZ_ISBL(:,JLAYER)-ZZ_CAN(:)) &
00089                                * (PZ(:,JLAYER)-PBLD_HEIGHT(:)) / (ZZ_BASE_ISBL(:) - PBLD_HEIGHT(:))
00090   END WHERE
00091 END DO
00092 !
00093 ! check if mixing length scale increases with height
00094 !
00095 DO JLAYER=2,ILVL
00096   PL(:,JLAYER) = MAX(PL(:,JLAYER-1),PL(:,JLAYER))
00097 END DO
00098 IF (LHOOK) CALL DR_HOOK('SM10',1,ZHOOK_HANDLE)
00099 !
00100 !-------------------------------------------------------------------------------------
00101 !
00102 END SUBROUTINE SM10