SURFEX v7.3
General documentation of Surfex
|
00001 ! ############### 00002 MODULE MODE_SBLS 00003 ! ############### 00004 ! 00005 !!**** *MODE_SBLS * - contains Surface Boundary Layer characteristics functions 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 ! 00010 !!** METHOD 00011 !! ------ 00012 !! 00013 !! 00014 !! 00015 !! EXTERNAL 00016 !! -------- 00017 !! 00018 !! IMPLICIT ARGUMENTS 00019 !! ------------------ 00020 !! 00021 !! REFERENCE 00022 !! --------- 00023 !! 00024 !! Businger et al 1971, Wyngaard and Cote 1974 00025 !! 00026 !! 00027 !! AUTHOR 00028 !! ------ 00029 !! V. Masson * Meteo France * 00030 !! 00031 !! MODIFICATIONS 00032 !! ------------- 00033 !! Original 13/10/99 00034 !! V. Masson 06/11/02 optimization and add Businger fonction for TKE 00035 !----------------------------------------------------------------------------- 00036 ! 00037 !* 0. DECLARATIONS 00038 ! 00039 ! 00040 ! 00041 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00042 USE PARKIND1 ,ONLY : JPRB 00043 ! 00044 INTERFACE BUSINGER_PHIM 00045 MODULE PROCEDURE BUSINGER_PHIM_0D 00046 MODULE PROCEDURE BUSINGER_PHIM_1D 00047 MODULE PROCEDURE BUSINGER_PHIM_2D 00048 MODULE PROCEDURE BUSINGER_PHIM_3D 00049 END INTERFACE 00050 INTERFACE BUSINGER_PHIH 00051 MODULE PROCEDURE BUSINGER_PHIH_0D 00052 MODULE PROCEDURE BUSINGER_PHIH_1D 00053 MODULE PROCEDURE BUSINGER_PHIH_2D 00054 MODULE PROCEDURE BUSINGER_PHIH_3D 00055 END INTERFACE 00056 INTERFACE BUSINGER_PHIE 00057 MODULE PROCEDURE BUSINGER_PHIE_0D 00058 MODULE PROCEDURE BUSINGER_PHIE_1D 00059 MODULE PROCEDURE BUSINGER_PHIE_2D 00060 MODULE PROCEDURE BUSINGER_PHIE_3D 00061 END INTERFACE 00062 INTERFACE PAULSON_PSIM 00063 MODULE PROCEDURE PAULSON_PSIM_0D 00064 MODULE PROCEDURE PAULSON_PSIM_1D 00065 MODULE PROCEDURE PAULSON_PSIM_2D 00066 MODULE PROCEDURE PAULSON_PSIM_3D 00067 END INTERFACE 00068 INTERFACE PAULSON_PSIH 00069 MODULE PROCEDURE PAULSON_PSIH_0D 00070 MODULE PROCEDURE PAULSON_PSIH_1D 00071 MODULE PROCEDURE PAULSON_PSIH_2D 00072 MODULE PROCEDURE PAULSON_PSIH_3D 00073 END INTERFACE 00074 INTERFACE LMO 00075 MODULE PROCEDURE LMO_0D 00076 MODULE PROCEDURE LMO_1D 00077 MODULE PROCEDURE LMO_2D 00078 END INTERFACE 00079 INTERFACE USTAR 00080 MODULE PROCEDURE USTAR_0D 00081 MODULE PROCEDURE USTAR_1D 00082 MODULE PROCEDURE USTAR_2D 00083 END INTERFACE 00084 ! 00085 !------------------------------------------------------------------------------- 00086 CONTAINS 00087 !------------------------------------------------------------------------------- 00088 ! 00089 FUNCTION BUSINGER_PHIM_3D(PZ_O_LMO) 00090 IMPLICIT NONE 00091 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO 00092 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIM_3D 00093 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00094 ! 00095 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_3D',0,ZHOOK_HANDLE) 00096 WHERE ( PZ_O_LMO(:,:,:) < 0. ) 00097 BUSINGER_PHIM_3D(:,:,:) = (1.-15.*PZ_O_LMO)**(-0.25) 00098 ELSEWHERE 00099 BUSINGER_PHIM_3D(:,:,:) = 1. + 4.7 * PZ_O_LMO 00100 END WHERE 00101 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_3D',1,ZHOOK_HANDLE) 00102 END FUNCTION BUSINGER_PHIM_3D 00103 ! 00104 !------------------------------------------------------------------------------- 00105 ! 00106 FUNCTION BUSINGER_PHIM_2D(PZ_O_LMO) 00107 IMPLICIT NONE 00108 REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO 00109 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIM_2D 00110 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00111 ! 00112 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_2D',0,ZHOOK_HANDLE) 00113 WHERE ( PZ_O_LMO(:,:) < 0. ) 00114 BUSINGER_PHIM_2D(:,:) = (1.-15.*PZ_O_LMO)**(-0.25) 00115 ELSEWHERE 00116 BUSINGER_PHIM_2D(:,:) = 1. + 4.7 * PZ_O_LMO 00117 END WHERE 00118 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_2D',1,ZHOOK_HANDLE) 00119 END FUNCTION BUSINGER_PHIM_2D 00120 ! 00121 !------------------------------------------------------------------------------- 00122 ! 00123 FUNCTION BUSINGER_PHIM_1D(PZ_O_LMO) 00124 IMPLICIT NONE 00125 REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO 00126 REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIM_1D 00127 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00128 ! 00129 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_1D',0,ZHOOK_HANDLE) 00130 WHERE ( PZ_O_LMO(:) < 0. ) 00131 BUSINGER_PHIM_1D(:) = (1.-15.*PZ_O_LMO)**(-0.25) 00132 ELSEWHERE 00133 BUSINGER_PHIM_1D(:) = 1. + 4.7 * PZ_O_LMO 00134 END WHERE 00135 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_1D',1,ZHOOK_HANDLE) 00136 END FUNCTION BUSINGER_PHIM_1D 00137 ! 00138 !------------------------------------------------------------------------------- 00139 ! 00140 FUNCTION BUSINGER_PHIM_0D(PZ_O_LMO) 00141 IMPLICIT NONE 00142 REAL, INTENT(IN) :: PZ_O_LMO 00143 REAL :: BUSINGER_PHIM_0D 00144 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00145 ! 00146 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_0D',0,ZHOOK_HANDLE) 00147 IF ( PZ_O_LMO < 0. ) THEN 00148 BUSINGER_PHIM_0D = (1.-15.*PZ_O_LMO)**(-0.25) 00149 ELSE 00150 BUSINGER_PHIM_0D = 1. + 4.7 * PZ_O_LMO 00151 END IF 00152 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_0D',1,ZHOOK_HANDLE) 00153 END FUNCTION BUSINGER_PHIM_0D 00154 ! 00155 !------------------------------------------------------------------------------- 00156 !------------------------------------------------------------------------------- 00157 ! 00158 FUNCTION BUSINGER_PHIH_3D(PZ_O_LMO) 00159 IMPLICIT NONE 00160 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO 00161 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIH_3D 00162 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00163 ! 00164 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_3D',0,ZHOOK_HANDLE) 00165 WHERE ( PZ_O_LMO(:,:,:) < 0. ) 00166 BUSINGER_PHIH_3D(:,:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) 00167 ELSEWHERE 00168 BUSINGER_PHIH_3D(:,:,:) = 0.74 + 4.7 * PZ_O_LMO 00169 END WHERE 00170 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_3D',1,ZHOOK_HANDLE) 00171 END FUNCTION BUSINGER_PHIH_3D 00172 ! 00173 !------------------------------------------------------------------------------- 00174 ! 00175 FUNCTION BUSINGER_PHIH_2D(PZ_O_LMO) 00176 IMPLICIT NONE 00177 REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO 00178 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIH_2D 00179 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00180 ! 00181 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_2D',0,ZHOOK_HANDLE) 00182 WHERE ( PZ_O_LMO(:,:) < 0. ) 00183 BUSINGER_PHIH_2D(:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) 00184 ELSEWHERE 00185 BUSINGER_PHIH_2D(:,:) = 0.74 + 4.7 * PZ_O_LMO 00186 END WHERE 00187 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_2D',1,ZHOOK_HANDLE) 00188 END FUNCTION BUSINGER_PHIH_2D 00189 ! 00190 !------------------------------------------------------------------------------- 00191 ! 00192 FUNCTION BUSINGER_PHIH_1D(PZ_O_LMO) 00193 IMPLICIT NONE 00194 REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO 00195 REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIH_1D 00196 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00197 ! 00198 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_1D',0,ZHOOK_HANDLE) 00199 WHERE ( PZ_O_LMO(:) < 0. ) 00200 BUSINGER_PHIH_1D(:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) 00201 ELSEWHERE 00202 BUSINGER_PHIH_1D(:) = 0.74 + 4.7 * PZ_O_LMO 00203 END WHERE 00204 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_1D',1,ZHOOK_HANDLE) 00205 END FUNCTION BUSINGER_PHIH_1D 00206 ! 00207 !------------------------------------------------------------------------------- 00208 ! 00209 FUNCTION BUSINGER_PHIH_0D(PZ_O_LMO) 00210 IMPLICIT NONE 00211 REAL, INTENT(IN) :: PZ_O_LMO 00212 REAL :: BUSINGER_PHIH_0D 00213 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00214 ! 00215 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_0D',0,ZHOOK_HANDLE) 00216 IF ( PZ_O_LMO < 0. ) THEN 00217 BUSINGER_PHIH_0D = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) 00218 ELSE 00219 BUSINGER_PHIH_0D = 0.74 + 4.7 * PZ_O_LMO 00220 END IF 00221 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_0D',1,ZHOOK_HANDLE) 00222 END FUNCTION BUSINGER_PHIH_0D 00223 ! 00224 !------------------------------------------------------------------------------- 00225 !------------------------------------------------------------------------------- 00226 ! 00227 FUNCTION BUSINGER_PHIE_3D(PZ_O_LMO) 00228 USE MODD_CANOPY_TURB, ONLY : XALPSBL 00229 IMPLICIT NONE 00230 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO 00231 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIE_3D 00232 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00233 ! 00234 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_3D',0,ZHOOK_HANDLE) 00235 WHERE ( PZ_O_LMO(:,:,:) < 0. ) 00236 BUSINGER_PHIE_3D(:,:,:) = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & 00237 * (1.-15.*PZ_O_LMO)**(0.5) 00238 ELSEWHERE 00239 BUSINGER_PHIE_3D(:,:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2 00240 END WHERE 00241 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_3D',1,ZHOOK_HANDLE) 00242 END FUNCTION BUSINGER_PHIE_3D 00243 00244 !------------------------------------------------------------------------------- 00245 ! 00246 FUNCTION BUSINGER_PHIE_2D(PZ_O_LMO) 00247 USE MODD_CANOPY_TURB, ONLY : XALPSBL 00248 IMPLICIT NONE 00249 REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO 00250 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIE_2D 00251 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00252 ! 00253 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_2D',0,ZHOOK_HANDLE) 00254 WHERE ( PZ_O_LMO(:,:) < 0. ) 00255 BUSINGER_PHIE_2D(:,:) = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & 00256 * (1.-15.*PZ_O_LMO)**(0.5) 00257 ELSEWHERE 00258 BUSINGER_PHIE_2D(:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2 00259 END WHERE 00260 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_2D',1,ZHOOK_HANDLE) 00261 END FUNCTION BUSINGER_PHIE_2D 00262 00263 !------------------------------------------------------------------------------- 00264 ! 00265 FUNCTION BUSINGER_PHIE_1D(PZ_O_LMO) 00266 USE MODD_CANOPY_TURB, ONLY : XALPSBL 00267 IMPLICIT NONE 00268 REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO 00269 REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: BUSINGER_PHIE_1D 00270 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00271 ! 00272 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_1D',0,ZHOOK_HANDLE) 00273 WHERE ( PZ_O_LMO(:) < 0. ) 00274 BUSINGER_PHIE_1D(:) = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & 00275 * (1.-15.*PZ_O_LMO)**(0.5) 00276 ELSEWHERE 00277 BUSINGER_PHIE_1D(:) = 1./(1. + 4.7 * PZ_O_LMO)**2 00278 END WHERE 00279 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_1D',1,ZHOOK_HANDLE) 00280 END FUNCTION BUSINGER_PHIE_1D 00281 00282 !------------------------------------------------------------------------------- 00283 ! 00284 FUNCTION BUSINGER_PHIE_0D(PZ_O_LMO) 00285 USE MODD_CANOPY_TURB, ONLY : XALPSBL 00286 IMPLICIT NONE 00287 REAL, INTENT(IN):: PZ_O_LMO 00288 REAL :: BUSINGER_PHIE_0D 00289 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00290 ! 00291 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_0D',0,ZHOOK_HANDLE) 00292 IF ( PZ_O_LMO < 0. ) THEN 00293 BUSINGER_PHIE_0D = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & 00294 * (1.-15.*PZ_O_LMO)**(0.5) 00295 ELSE 00296 BUSINGER_PHIE_0D = 1./(1. + 4.7 * PZ_O_LMO)**2 00297 END IF 00298 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_0D',1,ZHOOK_HANDLE) 00299 END FUNCTION BUSINGER_PHIE_0D 00300 ! 00301 !------------------------------------------------------------------------------- 00302 !------------------------------------------------------------------------------- 00303 ! 00304 FUNCTION PAULSON_PSIM_3D(PZ_O_LMO) 00305 USE MODD_CSTS 00306 IMPLICIT NONE 00307 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO 00308 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: PAULSON_PSIM_3D 00309 ! 00310 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: ZX 00311 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00312 00313 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_3D',0,ZHOOK_HANDLE) 00314 ZX=1. 00315 WHERE ( PZ_O_LMO(:,:,:) < 0. ) 00316 ZX=(1.-15.*PZ_O_LMO)**(0.25) 00317 PAULSON_PSIM_3D(:,:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. 00318 ELSEWHERE 00319 PAULSON_PSIM_3D(:,:,:) = - 4.7 * PZ_O_LMO 00320 END WHERE 00321 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_3D',1,ZHOOK_HANDLE) 00322 END FUNCTION PAULSON_PSIM_3D 00323 ! 00324 !------------------------------------------------------------------------------- 00325 ! 00326 FUNCTION PAULSON_PSIM_2D(PZ_O_LMO) 00327 USE MODD_CSTS 00328 IMPLICIT NONE 00329 REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO 00330 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIM_2D 00331 ! 00332 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZX 00333 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00334 00335 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_2D',0,ZHOOK_HANDLE) 00336 ZX=1. 00337 WHERE ( PZ_O_LMO(:,:) < 0. ) 00338 ZX=(1.-15.*PZ_O_LMO)**(0.25) 00339 PAULSON_PSIM_2D(:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. 00340 ELSEWHERE 00341 PAULSON_PSIM_2D(:,:) = - 4.7 * PZ_O_LMO 00342 END WHERE 00343 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_2D',1,ZHOOK_HANDLE) 00344 END FUNCTION PAULSON_PSIM_2D 00345 ! 00346 !------------------------------------------------------------------------------- 00347 ! 00348 FUNCTION PAULSON_PSIM_1D(PZ_O_LMO) 00349 USE MODD_CSTS 00350 IMPLICIT NONE 00351 REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO 00352 REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIM_1D 00353 ! 00354 REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZX 00355 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00356 00357 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_1D',0,ZHOOK_HANDLE) 00358 ZX=1. 00359 WHERE ( PZ_O_LMO(:) < 0. ) 00360 ZX=(1.-15.*PZ_O_LMO)**(0.25) 00361 PAULSON_PSIM_1D(:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. 00362 ELSEWHERE 00363 PAULSON_PSIM_1D(:) = - 4.7 * PZ_O_LMO 00364 END WHERE 00365 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_1D',1,ZHOOK_HANDLE) 00366 END FUNCTION PAULSON_PSIM_1D 00367 ! 00368 !------------------------------------------------------------------------------- 00369 ! 00370 FUNCTION PAULSON_PSIM_0D(PZ_O_LMO) 00371 USE MODD_CSTS 00372 IMPLICIT NONE 00373 REAL, INTENT(IN) :: PZ_O_LMO 00374 REAL :: PAULSON_PSIM_0D 00375 ! 00376 REAL :: ZX 00377 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00378 00379 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_0D',0,ZHOOK_HANDLE) 00380 ZX=1. 00381 IF ( PZ_O_LMO < 0. ) THEN 00382 ZX=(1.-15.*PZ_O_LMO)**(0.25) 00383 PAULSON_PSIM_0D = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. 00384 ELSE 00385 PAULSON_PSIM_0D = - 4.7 * PZ_O_LMO 00386 END IF 00387 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_0D',1,ZHOOK_HANDLE) 00388 END FUNCTION PAULSON_PSIM_0D 00389 ! 00390 !------------------------------------------------------------------------------- 00391 !------------------------------------------------------------------------------- 00392 ! 00393 FUNCTION PAULSON_PSIH_3D(PZ_O_LMO) 00394 IMPLICIT NONE 00395 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO 00396 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: PAULSON_PSIH_3D 00397 ! 00398 REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: ZY 00399 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00400 00401 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_3D',0,ZHOOK_HANDLE) 00402 ZY=1. 00403 WHERE ( PZ_O_LMO(:,:,:) < 0. ) 00404 ZY=(1.-9.*PZ_O_LMO)**(0.5) 00405 PAULSON_PSIH_3D(:,:,:) = LOG( (1.+ZY)/2. ) 00406 ELSEWHERE 00407 PAULSON_PSIH_3D(:,:,:) = - 4.7 * PZ_O_LMO / 0.74 00408 END WHERE 00409 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_3D',1,ZHOOK_HANDLE) 00410 END FUNCTION PAULSON_PSIH_3D 00411 ! 00412 !------------------------------------------------------------------------------- 00413 ! 00414 FUNCTION PAULSON_PSIH_2D(PZ_O_LMO) 00415 IMPLICIT NONE 00416 REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO 00417 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIH_2D 00418 ! 00419 REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZY 00420 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00421 00422 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_2D',0,ZHOOK_HANDLE) 00423 ZY=1. 00424 WHERE ( PZ_O_LMO(:,:) < 0. ) 00425 ZY=(1.-9.*PZ_O_LMO)**(0.5) 00426 PAULSON_PSIH_2D(:,:) = LOG( (1.+ZY)/2. ) 00427 ELSEWHERE 00428 PAULSON_PSIH_2D(:,:) = - 4.7 * PZ_O_LMO / 0.74 00429 END WHERE 00430 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_2D',1,ZHOOK_HANDLE) 00431 END FUNCTION PAULSON_PSIH_2D 00432 ! 00433 !------------------------------------------------------------------------------- 00434 ! 00435 FUNCTION PAULSON_PSIH_1D(PZ_O_LMO) 00436 IMPLICIT NONE 00437 REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO 00438 REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIH_1D 00439 ! 00440 REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZY 00441 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00442 00443 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_1D',0,ZHOOK_HANDLE) 00444 ZY=1. 00445 WHERE ( PZ_O_LMO(:) < 0. ) 00446 ZY=(1.-9.*PZ_O_LMO)**(0.5) 00447 PAULSON_PSIH_1D(:) = LOG( (1.+ZY)/2. ) 00448 ELSEWHERE 00449 PAULSON_PSIH_1D(:) = - 4.7 * PZ_O_LMO / 0.74 00450 END WHERE 00451 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_1D',1,ZHOOK_HANDLE) 00452 END FUNCTION PAULSON_PSIH_1D 00453 ! 00454 !------------------------------------------------------------------------------- 00455 ! 00456 FUNCTION PAULSON_PSIH_0D(PZ_O_LMO) 00457 IMPLICIT NONE 00458 REAL, INTENT(IN) :: PZ_O_LMO 00459 REAL :: PAULSON_PSIH_0D 00460 ! 00461 REAL :: ZY 00462 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00463 00464 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_0D',0,ZHOOK_HANDLE) 00465 ZY=1. 00466 IF ( PZ_O_LMO < 0. ) THEN 00467 ZY=(1.-9.*PZ_O_LMO)**(0.5) 00468 PAULSON_PSIH_0D = LOG( (1.+ZY)/2. ) 00469 ELSE 00470 PAULSON_PSIH_0D = - 4.7 * PZ_O_LMO / 0.74 00471 END IF 00472 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_0D',1,ZHOOK_HANDLE) 00473 END FUNCTION PAULSON_PSIH_0D 00474 ! 00475 !------------------------------------------------------------------------------- 00476 !------------------------------------------------------------------------------- 00477 ! 00478 ! 00479 FUNCTION LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) 00480 USE MODD_CSTS 00481 USE MODD_SURF_PAR, ONLY : XUNDEF 00482 IMPLICIT NONE 00483 REAL, DIMENSION(:,:), INTENT(IN) :: PUSTAR 00484 REAL, DIMENSION(:,:), INTENT(IN) :: PTHETA 00485 REAL, DIMENSION(:,:), INTENT(IN) :: PRV 00486 REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH 00487 REAL, DIMENSION(:,:), INTENT(IN) :: PSFRV 00488 REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: LMO_2D 00489 ! 00490 REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZTHETAV 00491 REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZQ0 00492 REAL :: ZEPS 00493 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00494 ! 00495 ! 00496 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_2D',0,ZHOOK_HANDLE) 00497 ZEPS=(XRV-XRD)/XRD 00498 ZTHETAV(:,:) = PTHETA(:,:) * ( 1. +ZEPS * PRV(:,:)) 00499 ZQ0 (:,:) = PSFTH(:,:) + ZTHETAV(:,:) * ZEPS * PSFRV(:,:) 00500 ! 00501 LMO_2D(:,:) = XUNDEF 00502 WHERE ( ZQ0(:,:) /=0. ) & 00503 LMO_2D(:,:) = - MAX(PUSTAR(:,:),1.E-6)**3 & 00504 / ( XKARMAN * XG / ZTHETAV(:,:) *ZQ0(:,:) ) 00505 ! 00506 WHERE(ABS(LMO_2D)>10000.) LMO_2D=XUNDEF 00507 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_2D',1,ZHOOK_HANDLE) 00508 00509 END FUNCTION LMO_2D 00510 ! 00511 !------------------------------------------------------------------------------- 00512 ! 00513 FUNCTION LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) 00514 USE MODD_CSTS 00515 USE MODD_SURF_PAR, ONLY : XUNDEF 00516 IMPLICIT NONE 00517 REAL, DIMENSION(:), INTENT(IN) :: PUSTAR 00518 REAL, DIMENSION(:), INTENT(IN) :: PTHETA 00519 REAL, DIMENSION(:), INTENT(IN) :: PRV 00520 REAL, DIMENSION(:), INTENT(IN) :: PSFTH 00521 REAL, DIMENSION(:), INTENT(IN) :: PSFRV 00522 REAL, DIMENSION(SIZE(PUSTAR)) :: LMO_1D 00523 ! 00524 REAL, DIMENSION(SIZE(PUSTAR)) :: ZTHETAV 00525 REAL :: ZEPS 00526 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00527 ! 00528 ! 00529 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_1D',0,ZHOOK_HANDLE) 00530 ZEPS=(XRV-XRD)/XRD 00531 ! 00532 ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:)) 00533 ! 00534 LMO_1D(:) = XUNDEF 00535 WHERE ( PSFTH(:)/ZTHETAV(:)+ZEPS*PSFRV(:)/=0. ) & 00536 LMO_1D(:) = - MAX(PUSTAR(:),1.E-6)**3 & 00537 / ( XKARMAN * ( XG / ZTHETAV(:) * PSFTH(:) & 00538 + XG * ZEPS * PSFRV(:) ) ) 00539 00540 WHERE(ABS(LMO_1D)>10000.) LMO_1D=XUNDEF 00541 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_1D',1,ZHOOK_HANDLE) 00542 00543 END FUNCTION LMO_1D 00544 ! 00545 !------------------------------------------------------------------------------- 00546 ! 00547 FUNCTION LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) 00548 USE MODD_CSTS 00549 USE MODD_SURF_PAR, ONLY : XUNDEF 00550 IMPLICIT NONE 00551 REAL, INTENT(IN) :: PUSTAR 00552 REAL, INTENT(IN) :: PTHETA 00553 REAL, INTENT(IN) :: PRV 00554 REAL, INTENT(IN) :: PSFTH 00555 REAL, INTENT(IN) :: PSFRV 00556 REAL :: LMO_0D 00557 ! 00558 REAL :: ZTHETAV 00559 REAL :: ZEPS 00560 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00561 ! 00562 ! 00563 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_0D',0,ZHOOK_HANDLE) 00564 ZEPS=(XRV-XRD)/XRD 00565 ! 00566 ! 00567 ZTHETAV = PTHETA * ( 1. +ZEPS * PRV) 00568 ! 00569 LMO_0D = XUNDEF 00570 IF ( PSFTH/ZTHETAV+ZEPS*PSFRV/=0. ) & 00571 LMO_0D = - MAX(PUSTAR,1.E-6)**3 & 00572 / ( XKARMAN * ( XG / ZTHETAV * PSFTH & 00573 + XG * ZEPS * PSFRV ) ) 00574 00575 IF(ABS(LMO_0D)>10000.) LMO_0D=XUNDEF 00576 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_0D',1,ZHOOK_HANDLE) 00577 00578 END FUNCTION LMO_0D 00579 ! 00580 !------------------------------------------------------------------------------- 00581 !------------------------------------------------------------------------------- 00582 ! 00583 FUNCTION USTAR_2D(PWIND,PZ,PZ0,PLMO) 00584 USE MODD_CSTS 00585 USE MODD_SURF_PAR, ONLY : XUNDEF 00586 IMPLICIT NONE 00587 REAL, DIMENSION(:,:), INTENT(IN) :: PWIND 00588 REAL, DIMENSION(:,:), INTENT(IN) :: PZ 00589 REAL, DIMENSION(:,:), INTENT(IN) :: PZ0 00590 REAL, DIMENSION(:,:), INTENT(IN) :: PLMO 00591 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: USTAR_2D 00592 00593 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ZZ_O_LMO 00594 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ZZ0_O_LMO 00595 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00596 ! 00597 !* purely unstable case 00598 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_2D',0,ZHOOK_HANDLE) 00599 USTAR_2D (:,:) = 0. 00600 ZZ_O_LMO (:,:) = XUNDEF 00601 ZZ0_O_LMO(:,:) = XUNDEF 00602 ! 00603 !* general case 00604 WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) 00605 ZZ_O_LMO = PZ(:,:) / PLMO(:,:) 00606 ZZ0_O_LMO = PZ0(:,:) / PLMO(:,:) 00607 USTAR_2D(:,:) = PWIND(:,:) & 00608 * XKARMAN / ( LOG(PZ(:,:)/PZ0(:,:)) & 00609 - PAULSON_PSIM(ZZ_O_LMO(:,:)) & 00610 + PAULSON_PSIM(ZZ0_O_LMO(:,:)) ) 00611 END WHERE 00612 ! 00613 !* purely neutral case 00614 WHERE(PLMO==XUNDEF) 00615 ZZ_O_LMO = 0. 00616 USTAR_2D(:,:) = PWIND(:,:) & 00617 * XKARMAN / LOG(PZ(:,:)/PZ0(:,:)) 00618 END WHERE 00619 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_2D',1,ZHOOK_HANDLE) 00620 ! 00621 END FUNCTION USTAR_2D 00622 ! 00623 !------------------------------------------------------------------------------- 00624 ! 00625 FUNCTION USTAR_1D(PWIND,PZ,PZ0,PLMO) 00626 USE MODD_CSTS 00627 USE MODD_SURF_PAR, ONLY : XUNDEF 00628 IMPLICIT NONE 00629 REAL, DIMENSION(:), INTENT(IN) :: PWIND 00630 REAL, DIMENSION(:), INTENT(IN) :: PZ 00631 REAL, DIMENSION(:), INTENT(IN) :: PZ0 00632 REAL, DIMENSION(:), INTENT(IN) :: PLMO 00633 REAL, DIMENSION(SIZE(PZ)) :: USTAR_1D 00634 00635 REAL, DIMENSION(SIZE(PZ)) :: ZZ_O_LMO 00636 REAL, DIMENSION(SIZE(PZ)) :: ZZ0_O_LMO 00637 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00638 ! 00639 !* purely unstable case 00640 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_1D',0,ZHOOK_HANDLE) 00641 USTAR_1D (:) = 0. 00642 ZZ_O_LMO (:) = XUNDEF 00643 ZZ0_O_LMO(:) = XUNDEF 00644 ! 00645 !* general case 00646 WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) 00647 ZZ_O_LMO = PZ(:) / PLMO(:) 00648 ZZ0_O_LMO = PZ0(:) / PLMO(:) 00649 USTAR_1D(:) = PWIND & 00650 * XKARMAN / ( LOG(PZ(:)/PZ0(:)) & 00651 - PAULSON_PSIM(ZZ_O_LMO(:)) & 00652 + PAULSON_PSIM(ZZ0_O_LMO(:)) ) 00653 END WHERE 00654 ! 00655 !* purely neutral case 00656 WHERE(PLMO==XUNDEF) 00657 ZZ_O_LMO = 0. 00658 USTAR_1D(:) = PWIND & 00659 * XKARMAN / LOG(PZ(:)/PZ0(:)) 00660 END WHERE 00661 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_1D',1,ZHOOK_HANDLE) 00662 ! 00663 END FUNCTION USTAR_1D 00664 ! 00665 !------------------------------------------------------------------------------- 00666 ! 00667 FUNCTION USTAR_0D(PWIND,PZ,PZ0,PLMO) 00668 USE MODD_CSTS 00669 USE MODD_SURF_PAR, ONLY : XUNDEF 00670 IMPLICIT NONE 00671 REAL, INTENT(IN) :: PWIND 00672 REAL, INTENT(IN) :: PZ 00673 REAL, INTENT(IN) :: PZ0 00674 REAL, INTENT(IN) :: PLMO 00675 REAL :: USTAR_0D 00676 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00677 ! 00678 !* purely unstable case 00679 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_0D',0,ZHOOK_HANDLE) 00680 USTAR_0D = 0. 00681 ! 00682 !* general case 00683 IF ( ABS(PLMO) >= 1.E-20 .AND. PLMO/=XUNDEF) & 00684 USTAR_0D = PWIND * XKARMAN / ( LOG(PZ/PZ0) - PAULSON_PSIM(PZ/PLMO) + PAULSON_PSIM(PZ0/PLMO) ) 00685 ! 00686 !* purely neutral case 00687 IF (PLMO==XUNDEF) & 00688 USTAR_0D = PWIND * XKARMAN / LOG(PZ/PZ0) 00689 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_0D',1,ZHOOK_HANDLE) 00690 00691 END FUNCTION USTAR_0D 00692 ! 00693 !------------------------------------------------------------------------------- 00694 ! 00695 END MODULE MODE_SBLS 00696