SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE Z0EFF(HROUGH, PALFA, PZREF, PUREF, PZ0, PZ0REL, PPSN, & 00003 PZ0EFFIP,PZ0EFFIM,PZ0EFFJP,PZ0EFFJM,PFF,PZ0_FLOOD, & 00004 PAOSIP,PAOSIM,PAOSJP,PAOSJM,PHO2IP,PHO2IM,PHO2JP,PHO2JM, & 00005 PZ0_O_Z0H, PZ0_WITH_SNOW, PZ0H_WITH_SNOW,PZ0EFF ) 00006 ! ############################################################################ 00007 ! 00008 !!**** *Z0EFF* 00009 !! 00010 !! PURPOSE 00011 !! ------- 00012 ! 00013 ! Calculates the z0eff for momentum fluxes according to wind direction. 00014 ! 00015 ! 00016 !!** METHOD 00017 !! ------ 00018 ! 00019 ! 00020 !! EXTERNAL 00021 !! -------- 00022 !! 00023 !! 00024 !! IMPLICIT ARGUMENTS 00025 !! ------------------ 00026 !! 00027 !! 00028 !! REFERENCE 00029 !! --------- 00030 !! 00031 !! Mascart et al. (1995) 00032 !! Belair (1995) 00033 !! 00034 !! AUTHOR 00035 !! ------ 00036 !! 00037 !! S. Belair * Meteo-France * 00038 !! 00039 !! MODIFICATIONS 00040 !! ------------- 00041 !! Original 13/03/95 00042 !! (J.Stein) 15/11/95 use the potential temperature to compute Ri 00043 !! and PVMOD instead of ZVMOD 00044 !! (P.Lacarrere)15/03/96 replace * PEXNS by / PEXNS 00045 !! (V.Masson) 22/12/97 computation of z0eff after snow treatment 00046 !! (V.Masson) 05/10/98 clear routine 00047 !! (A.Boone) 11/26/98 Option for PDELTA: forested vs default surface 00048 !! (V Masson) 12/07/01 new formulation for aggregation with snow z0 00049 !! (P.LeMoigne) 09/02/06 computation of z0h in presence of snow 00050 !! (B; Decharme) 2008 floodplains 00051 !------------------------------------------------------------------------------- 00052 ! 00053 !* 0. DECLARATIONS 00054 ! ------------ 00055 ! 00056 USE MODD_CSTS, ONLY : XPI, XG 00057 USE MODD_SNOW_PAR, ONLY : XZ0SN, XWCRN, XZ0HSN 00058 USE MODD_ISBA_n, ONLY : TSNOW 00059 ! 00060 USE MODI_SUBSCALE_Z0EFF 00061 USE MODD_SURF_ATM, ONLY : LALDZ0H 00062 ! 00063 ! 00064 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00065 USE PARKIND1 ,ONLY : JPRB 00066 ! 00067 IMPLICIT NONE 00068 ! 00069 !* 0.1 declarations of arguments 00070 ! 00071 ! 00072 CHARACTER(LEN=*), INTENT(IN) :: HROUGH ! type of roughness length 00073 REAL, DIMENSION(:), INTENT(IN) :: PALFA ! wind direction from J axis (clockwise) 00074 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! height of atmospheric level 00075 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height for wind 00076 REAL, DIMENSION(:), INTENT(IN) :: PZ0 ! vegetation roughness length 00077 REAL, DIMENSION(:), INTENT(IN) :: PZ0REL ! 1d orographic roughness length 00078 REAL, DIMENSION(:), INTENT(IN) :: PPSN ! fraction of snow 00079 REAL, DIMENSION(:), INTENT(IN) :: PZ0EFFIP ! z0eff for increasing x 00080 REAL, DIMENSION(:), INTENT(IN) :: PZ0EFFIM ! z0eff for decreasing x 00081 REAL, DIMENSION(:), INTENT(IN) :: PZ0EFFJP ! z0eff for increasing y 00082 REAL, DIMENSION(:), INTENT(IN) :: PZ0EFFJM ! z0eff for decreasing y 00083 REAL, DIMENSION(:), INTENT(IN) :: PAOSIP ! A/S for increasing x 00084 REAL, DIMENSION(:), INTENT(IN) :: PAOSIM ! A/S for decreasing x 00085 REAL, DIMENSION(:), INTENT(IN) :: PAOSJP ! A/S for increasing y 00086 REAL, DIMENSION(:), INTENT(IN) :: PAOSJM ! A/S for decreasing y 00087 REAL, DIMENSION(:), INTENT(IN) :: PHO2IP ! h/2 for increasing x 00088 REAL, DIMENSION(:), INTENT(IN) :: PHO2IM ! h/2 for decreasing x 00089 REAL, DIMENSION(:), INTENT(IN) :: PHO2JP ! h/2 for increasing y 00090 REAL, DIMENSION(:), INTENT(IN) :: PHO2JM ! h/2 for decreasing y 00091 REAL, DIMENSION(:), INTENT(IN) :: PZ0_O_Z0H ! ratio between heat and momentum z0 00092 ! 00093 REAL, DIMENSION(:), INTENT(IN) :: PFF ! fraction of flood 00094 REAL, DIMENSION(:), INTENT(IN) :: PZ0_FLOOD ! floodplains roughness length 00095 ! 00096 REAL, DIMENSION(:), INTENT(OUT) :: PZ0_WITH_SNOW ! vegetation z0 modified by snow 00097 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H_WITH_SNOW ! vegetation z0h modified by snow 00098 REAL, DIMENSION(:), INTENT(OUT) :: PZ0EFF ! effective z0 00099 ! 00100 ! 00101 ! 00102 ! 00103 !* 0.2 declarations of local variables 00104 ! 00105 ! 00106 ! 00107 REAL, DIMENSION(SIZE(PZ0EFF)) :: ZWORK, ZALFA, 00108 ZZ0EFFIP, ZZ0EFFIM, 00109 ZZ0EFFJP, ZZ0EFFJM 00110 ! effective roughness length in 4 00111 ! directions 00112 REAL :: Z0CR, ZUZ0CN, ZALRCN1, ZALRCN2 00113 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00114 !------------------------------------------------------------------------------- 00115 ! 00116 IF (LHOOK) CALL DR_HOOK('Z0EFF',0,ZHOOK_HANDLE) 00117 ZALRCN1=1.E-03 00118 ZALRCN2=2.5E-03 00119 Z0CR = XG*ZALRCN1 00120 ZUZ0CN=1./(XG*ZALRCN2) 00121 ZALFA(:) = PALFA(:) 00122 WHERE(ZALFA(:)<=-XPI) ZALFA = ZALFA + 2.*XPI 00123 WHERE(ZALFA(:)> XPI) ZALFA = ZALFA - 2.*XPI 00124 ! 00125 ! 00126 !* 1. GRID-AVERAGED ROUGHNESS LENGTHS 00127 ! ------------------------------- 00128 ! (considering the effect of snow-flood-covered surfaces and orography) 00129 ! 00130 !* 1.1 for heat 00131 ! -------- 00132 ! 00133 PZ0_WITH_SNOW(:) = PZ0(:) 00134 PZ0H_WITH_SNOW(:) = PZ0(:) / PZ0_O_Z0H(:) 00135 ! 00136 IF(TSNOW%SCHEME=='EBA') THEN 00137 ! 00138 WHERE (PPSN(:)>0.) 00139 ! 00140 !!!!!Flooding scheme not implemented with this option 00141 PZ0_WITH_SNOW(:) = PZ0_WITH_SNOW(:) + ( Z0CR - PZ0(:))* & 00142 PPSN(:)/(PPSN(:) + XWCRN*(1.0+ZUZ0CN*PZ0(:))) 00143 ! 00144 END WHERE 00145 00146 00147 IF (LALDZ0H) THEN 00148 WHERE (PPSN(:)>0.) 00149 PZ0H_WITH_SNOW(:) = PZ0H_WITH_SNOW(:) + ( Z0CR - PZ0H_WITH_SNOW(:))* & 00150 PPSN(:)/(PPSN(:) + XWCRN*(1.0+ZUZ0CN*PZ0H_WITH_SNOW(:))) 00151 END WHERE 00152 END IF 00153 00154 ! 00155 ELSE 00156 ! 00157 WHERE (PPSN(:)>0..OR.PFF(:)>0.) 00158 ! 00159 ZWORK(:) = ( PPSN(:) /(LOG(PUREF(:)/XZ0SN ))**2 ) & 00160 + ( PFF (:) /(LOG(PUREF(:)/PZ0_FLOOD(:)))**2 ) & 00161 + ((1.-PPSN(:)-PFF (:))/(LOG(PUREF(:)/PZ0(:) ))**2 ) 00162 ! 00163 PZ0_WITH_SNOW(:) = PUREF(:) /EXP( SQRT( 1./ZWORK(:) ) ) 00164 ! 00165 ZWORK(:) = ( PPSN(:) /(LOG(PZREF(:)/XZ0HSN ))**2 ) & 00166 + ( PFF (:) /(LOG(PZREF(:)/(PZ0_FLOOD(:)/ PZ0_O_Z0H(:))))**2 ) & 00167 + ((1.-PPSN(:)-PFF (:))/(LOG(PZREF(:)/(PZ0(:)/PZ0_O_Z0H(:)) ))**2 ) 00168 ! 00169 PZ0H_WITH_SNOW(:) = PZREF(:) /EXP( SQRT( 1./ZWORK(:) ) ) 00170 ! 00171 END WHERE 00172 ! 00173 ENDIF 00174 ! 00175 ! 00176 !* 1.2 for momentum 00177 ! ------------ 00178 ! 00179 ! 00180 ! In this particular case, we now use 00181 ! the roughness length due to the coupled 00182 ! effect of vegetation and topography 00183 ! Snow and Flood effects are yet taken 00184 ! into account through ZZ0EFF 00185 ! 00186 IF (HROUGH=='Z04D') THEN 00187 ! 00188 ZZ0EFFIP(:) = PZ0EFFIP(:) 00189 ZZ0EFFIM(:) = PZ0EFFIM(:) 00190 ZZ0EFFJP(:) = PZ0EFFJP(:) 00191 ZZ0EFFJM(:) = PZ0EFFJM(:) 00192 ! 00193 CALL SUBSCALE_Z0EFF(PAOSIP,PAOSIM,PAOSJP,PAOSJM, & 00194 PHO2IP,PHO2IM,PHO2JP,PHO2JM,PZ0_WITH_SNOW, & 00195 ZZ0EFFIP,ZZ0EFFIM,ZZ0EFFJP,ZZ0EFFJM, & 00196 OMASK=(PPSN>0..OR.PFF(:)>0.) ) 00197 ! 00198 WHERE(ZALFA(:)>=0. .AND. ZALFA(:)<XPI/2.) 00199 PZ0EFF(:)=ZZ0EFFIP(:)*SIN(ZALFA(:))**2 + ZZ0EFFJP(:)*COS(ZALFA(:))**2 00200 END WHERE 00201 WHERE(ZALFA(:)>=XPI/2. .AND. ZALFA(:)<=XPI) 00202 PZ0EFF(:)=ZZ0EFFIP(:)*SIN(ZALFA(:))**2 + ZZ0EFFJM(:)*COS(ZALFA(:))**2 00203 END WHERE 00204 WHERE (ZALFA(:)>=-XPI/2 .AND. ZALFA(:)<0.) 00205 PZ0EFF(:)=ZZ0EFFIM(:)*SIN(ZALFA(:))**2 + ZZ0EFFJP(:)*COS(ZALFA(:))**2 00206 END WHERE 00207 WHERE (ZALFA(:)>=-XPI .AND. ZALFA(:)<-XPI/2.) 00208 PZ0EFF(:)=ZZ0EFFIM(:)*SIN(ZALFA(:))**2 + ZZ0EFFJM(:)*COS(ZALFA(:))**2 00209 END WHERE 00210 ! 00211 ELSE IF (HROUGH=='Z01D') THEN 00212 PZ0EFF(:) = PZ0_WITH_SNOW(:) + PZ0REL(:) 00213 IF (LALDZ0H) THEN 00214 ! Aladin dynamic z0 contains already orographic component 00215 PZ0EFF(:) = PZ0EFF(:) - PZ0REL(:) 00216 ! PZ0H_WITH_SNOW(:) = PZ0EFF(:) / PZ0_O_Z0H(:) ! it is aleardy corrected under IF statement of TSNOW%SCHEME 00217 ENDIF 00218 ELSE 00219 PZ0EFF(:) = PZ0_WITH_SNOW(:) 00220 END IF 00221 IF (LHOOK) CALL DR_HOOK('Z0EFF',1,ZHOOK_HANDLE) 00222 ! 00223 !------------------------------------------------------------------------------- 00224 ! 00225 END SUBROUTINE Z0EFF