SURFEX v7.3
General documentation of Surfex
|
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