SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE RMC01_SURF(PZ, PLMO, PLK, PLEPS, ONEUTRAL) 00003 ! ############################################################## 00004 ! 00005 !!**** *RMC01_SURF* - 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 !! This routine modifies the mixing and dissipative length near the SBL. 00010 !! (Redelsperger, Mahe and Carlotti, 2001) 00011 !! 00012 !!** METHOD 00013 !! ------ 00014 !! 00015 !! EXTERNAL 00016 !! -------- 00017 !! 00018 !! IMPLICIT ARGUMENTS 00019 !! ------------------ 00020 !! 00021 !! 00022 !! REFERENCE 00023 !! --------- 00024 !! 00025 !! Book 2 00026 !! 00027 !! AUTHOR 00028 !! ------ 00029 !! 00030 !! V. Masson - Meteo-France - 00031 !! 00032 !! MODIFICATIONS 00033 !! ------------- 00034 !! Original 07/2006 00035 !------------------------------------------------------------------------------- 00036 ! 00037 !* 0. DECLARATIONS 00038 ! ------------ 00039 ! 00040 USE MODD_SURF_PAR, ONLY : XUNDEF 00041 USE MODD_CSTS, ONLY : XKARMAN 00042 USE MODD_CANOPY_TURB, ONLY : XALPSBL, XCMFS, XCED 00043 ! 00044 USE MODE_SBLS 00045 ! 00046 ! 00047 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00048 USE PARKIND1 ,ONLY : JPRB 00049 ! 00050 IMPLICIT NONE 00051 ! 00052 !* 0.1 Declaration of arguments 00053 ! ------------------------ 00054 ! 00055 REAL, DIMENSION(:,:), INTENT(IN) :: PZ ! altitude of full levels 00056 REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin Obuhkov length 00057 REAL, DIMENSION(:,:), INTENT(OUT) :: PLK ! Mixing length 00058 REAL, DIMENSION(:,:), INTENT(OUT) :: PLEPS! Dissipative length 00059 LOGICAL, OPTIONAL, INTENT(IN) :: ONEUTRAL 00060 ! 00061 !* 0.2 Declaration of local variables 00062 ! ------------------------------ 00063 ! 00064 LOGICAL :: GNEUTRAL 00065 ! 00066 INTEGER :: JK ! loop counter 00067 ! 00068 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ZZ_O_LMO ! height / LMO 00069 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ZPHIM ! MO function 00070 ! for stress 00071 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ZPHIE ! MO function 00072 ! for TKE 00073 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00074 !------------------------------------------------------------------------------- 00075 ! 00076 GNEUTRAL = .FALSE. 00077 IF (PRESENT(ONEUTRAL)) GNEUTRAL = ONEUTRAL 00078 ! 00079 !* 1. MO quantities 00080 ! ------------- 00081 ! 00082 ! z/LMO 00083 IF (LHOOK) CALL DR_HOOK('RMC01_SURF',0,ZHOOK_HANDLE) 00084 ! 00085 !------------------------------------------------------------------------------- 00086 ! 00087 !* 2. Modification of the mixing length 00088 ! --------------------------------- 00089 ! 00090 PLK (:,:) = XKARMAN/SQRT(XALPSBL)/XCMFS * PZ(:,:) 00091 ! 00092 !------------------------------------------------------------------------------- 00093 ! 00094 !* 3. Modification of the dissipative length 00095 ! -------------------------------------- 00096 ! 00097 PLEPS(:,:) = XKARMAN*(XALPSBL**1.5)*XCED * PZ(:,:) 00098 ! 00099 !------------------------------------------------------------------------------- 00100 ! 00101 IF (GNEUTRAL) THEN 00102 IF (LHOOK) CALL DR_HOOK('RMC01_SURF',1,ZHOOK_HANDLE) 00103 RETURN 00104 ENDIF 00105 ! 00106 !------------------------------------------------------------------------------- 00107 ! 00108 WHERE (PLMO(:,:)==XUNDEF) 00109 ZZ_O_LMO(:,:)=0. 00110 ELSEWHERE 00111 ZZ_O_LMO(:,:)=PZ(:,:)/PLMO(:,:) 00112 END WHERE 00113 ZZ_O_LMO(:,:) = MAX(ZZ_O_LMO(:,:),-10.) 00114 ZZ_O_LMO(:,:) = MIN(ZZ_O_LMO(:,:), 10.) 00115 ! 00116 ! 00117 ! MO function for stress 00118 ZPHIM(:,:) = BUSINGER_PHIM(ZZ_O_LMO(:,:)) 00119 ! 00120 ! MO function for TKE 00121 ZPHIE(:,:) = BUSINGER_PHIE(ZZ_O_LMO(:,:)) 00122 ! 00123 !------------------------------------------------------------------------------- 00124 ! 00125 !* 2. Modification of the mixing length 00126 ! --------------------------------- 00127 ! 00128 PLK (:,:) = PLK (:,:) / (ZPHIM(:,:)**2*SQRT(ZPHIE(:,:))) 00129 ! 00130 !------------------------------------------------------------------------------- 00131 ! 00132 !* 3. Modification of the dissipative length 00133 ! -------------------------------------- 00134 ! 00135 PLEPS(:,:) = PLEPS(:,:) / (ZPHIM(:,:)**2*SQRT(ZPHIE(:,:))) 00136 ! 00137 WHERE (ZZ_O_LMO(:,:)<0.) 00138 PLEPS(:,:) = PLEPS(:,:)/(1.-1.9*ZZ_O_LMO(:,:)) 00139 ELSEWHERE 00140 PLEPS(:,:) = PLEPS(:,:)/(1.-0.3*SQRT(ZZ_O_LMO(:,:))) 00141 ENDWHERE 00142 ! 00143 IF (LHOOK) CALL DR_HOOK('RMC01_SURF',1,ZHOOK_HANDLE) 00144 !------------------------------------------------------------------------------- 00145 ! 00146 END SUBROUTINE RMC01_SURF