SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_sbls.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ###############
6  MODULE mode_sbls
7 ! ###############
8 !
9 !!**** *MODE_SBLS * - contains Surface Boundary Layer characteristics functions
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 !!** METHOD
15 !! ------
16 !!
17 !!
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! Businger et al 1971, Wyngaard and Cote 1974
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! V. Masson * Meteo France *
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 13/10/99
38 !! V. Masson 06/11/02 optimization and add Businger fonction for TKE
39 !! J. EScobar 28/11/2013 really avoid / 0 in test in real*4
40 !-----------------------------------------------------------------------------
41 !
42 !* 0. DECLARATIONS
43 !
44 !
45 !
46 USE yomhook ,ONLY : lhook, dr_hook
47 USE parkind1 ,ONLY : jprb
48 !
49 INTERFACE businger_phim
50  MODULE PROCEDURE businger_phim_0d
51  MODULE PROCEDURE businger_phim_1d
52  MODULE PROCEDURE businger_phim_2d
53  MODULE PROCEDURE businger_phim_3d
54 END INTERFACE
55 INTERFACE businger_phih
56  MODULE PROCEDURE businger_phih_0d
57  MODULE PROCEDURE businger_phih_1d
58  MODULE PROCEDURE businger_phih_2d
59  MODULE PROCEDURE businger_phih_3d
60 END INTERFACE
61 INTERFACE businger_phie
62  MODULE PROCEDURE businger_phie_0d
63  MODULE PROCEDURE businger_phie_1d
64  MODULE PROCEDURE businger_phie_2d
65  MODULE PROCEDURE businger_phie_3d
66 END INTERFACE
67 INTERFACE paulson_psim
68  MODULE PROCEDURE paulson_psim_0d
69  MODULE PROCEDURE paulson_psim_1d
70  MODULE PROCEDURE paulson_psim_2d
71  MODULE PROCEDURE paulson_psim_3d
72 END INTERFACE
73 INTERFACE paulson_psih
74  MODULE PROCEDURE paulson_psih_0d
75  MODULE PROCEDURE paulson_psih_1d
76  MODULE PROCEDURE paulson_psih_2d
77  MODULE PROCEDURE paulson_psih_3d
78 END INTERFACE
79 INTERFACE lmo
80  MODULE PROCEDURE lmo_0d
81  MODULE PROCEDURE lmo_1d
82  MODULE PROCEDURE lmo_2d
83 END INTERFACE
84 INTERFACE ustar
85  MODULE PROCEDURE ustar_0d
86  MODULE PROCEDURE ustar_1d
87  MODULE PROCEDURE ustar_2d
88 END INTERFACE
89 !
90 !-------------------------------------------------------------------------------
91  CONTAINS
92 !-------------------------------------------------------------------------------
93 !
94 FUNCTION businger_phim_3d(PZ_O_LMO)
95  IMPLICIT NONE
96  REAL, DIMENSION(:,:,:), INTENT(IN) :: pz_o_lmo
97  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: businger_phim_3d
98  REAL(KIND=JPRB) :: zhook_handle
99 !
100  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_3D',0,zhook_handle)
101  WHERE ( pz_o_lmo(:,:,:) < 0. )
102  businger_phim_3d(:,:,:) = (1.-15.*pz_o_lmo)**(-0.25)
103  ELSEWHERE
104  businger_phim_3d(:,:,:) = 1. + 4.7 * pz_o_lmo
105  END WHERE
106 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_3D',1,zhook_handle)
107 END FUNCTION businger_phim_3d
108 !
109 !-------------------------------------------------------------------------------
110 !
111 FUNCTION businger_phim_2d(PZ_O_LMO)
112  IMPLICIT NONE
113  REAL, DIMENSION(:,:), INTENT(IN) :: pz_o_lmo
114  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: businger_phim_2d
115  REAL(KIND=JPRB) :: zhook_handle
116 !
117  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_2D',0,zhook_handle)
118  WHERE ( pz_o_lmo(:,:) < 0. )
119  businger_phim_2d(:,:) = (1.-15.*pz_o_lmo)**(-0.25)
120  ELSEWHERE
121  businger_phim_2d(:,:) = 1. + 4.7 * pz_o_lmo
122  END WHERE
123 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_2D',1,zhook_handle)
124 END FUNCTION businger_phim_2d
125 !
126 !-------------------------------------------------------------------------------
127 !
128 FUNCTION businger_phim_1d(PZ_O_LMO)
129  IMPLICIT NONE
130  REAL, DIMENSION(:), INTENT(IN) :: pz_o_lmo
131  REAL, DIMENSION(SIZE(PZ_O_LMO)) :: businger_phim_1d
132  REAL(KIND=JPRB) :: zhook_handle
133 !
134  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_1D',0,zhook_handle)
135  WHERE ( pz_o_lmo(:) < 0. )
136  businger_phim_1d(:) = (1.-15.*pz_o_lmo)**(-0.25)
137  ELSEWHERE
138  businger_phim_1d(:) = 1. + 4.7 * pz_o_lmo
139  END WHERE
140 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_1D',1,zhook_handle)
141 END FUNCTION businger_phim_1d
142 !
143 !-------------------------------------------------------------------------------
144 !
145 FUNCTION businger_phim_0d(PZ_O_LMO)
146  IMPLICIT NONE
147  REAL, INTENT(IN) :: pz_o_lmo
148  REAL :: businger_phim_0d
149  REAL(KIND=JPRB) :: zhook_handle
150 !
151  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_0D',0,zhook_handle)
152  IF ( pz_o_lmo < 0. ) THEN
153  businger_phim_0d = (1.-15.*pz_o_lmo)**(-0.25)
154  ELSE
155  businger_phim_0d = 1. + 4.7 * pz_o_lmo
156  END IF
157 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIM_0D',1,zhook_handle)
158 END FUNCTION businger_phim_0d
159 !
160 !-------------------------------------------------------------------------------
161 !-------------------------------------------------------------------------------
162 !
163 FUNCTION businger_phih_3d(PZ_O_LMO)
164  IMPLICIT NONE
165  REAL, DIMENSION(:,:,:), INTENT(IN) :: pz_o_lmo
166  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: businger_phih_3d
167  REAL(KIND=JPRB) :: zhook_handle
168 !
169  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_3D',0,zhook_handle)
170  WHERE ( pz_o_lmo(:,:,:) < 0. )
171  businger_phih_3d(:,:,:) = 0.74 * (1.-9.*pz_o_lmo)**(-0.5)
172  ELSEWHERE
173  businger_phih_3d(:,:,:) = 0.74 + 4.7 * pz_o_lmo
174  END WHERE
175 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_3D',1,zhook_handle)
176 END FUNCTION businger_phih_3d
177 !
178 !-------------------------------------------------------------------------------
179 !
180 FUNCTION businger_phih_2d(PZ_O_LMO)
181  IMPLICIT NONE
182  REAL, DIMENSION(:,:), INTENT(IN) :: pz_o_lmo
183  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: businger_phih_2d
184  REAL(KIND=JPRB) :: zhook_handle
185 !
186  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_2D',0,zhook_handle)
187  WHERE ( pz_o_lmo(:,:) < 0. )
188  businger_phih_2d(:,:) = 0.74 * (1.-9.*pz_o_lmo)**(-0.5)
189  ELSEWHERE
190  businger_phih_2d(:,:) = 0.74 + 4.7 * pz_o_lmo
191  END WHERE
192 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_2D',1,zhook_handle)
193 END FUNCTION businger_phih_2d
194 !
195 !-------------------------------------------------------------------------------
196 !
197 FUNCTION businger_phih_1d(PZ_O_LMO)
198  IMPLICIT NONE
199  REAL, DIMENSION(:), INTENT(IN) :: pz_o_lmo
200  REAL, DIMENSION(SIZE(PZ_O_LMO)) :: businger_phih_1d
201  REAL(KIND=JPRB) :: zhook_handle
202 !
203  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_1D',0,zhook_handle)
204  WHERE ( pz_o_lmo(:) < 0. )
205  businger_phih_1d(:) = 0.74 * (1.-9.*pz_o_lmo)**(-0.5)
206  ELSEWHERE
207  businger_phih_1d(:) = 0.74 + 4.7 * pz_o_lmo
208  END WHERE
209 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_1D',1,zhook_handle)
210 END FUNCTION businger_phih_1d
211 !
212 !-------------------------------------------------------------------------------
213 !
214 FUNCTION businger_phih_0d(PZ_O_LMO)
215  IMPLICIT NONE
216  REAL, INTENT(IN) :: pz_o_lmo
217  REAL :: businger_phih_0d
218  REAL(KIND=JPRB) :: zhook_handle
219 !
220  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_0D',0,zhook_handle)
221  IF ( pz_o_lmo < 0. ) THEN
222  businger_phih_0d = 0.74 * (1.-9.*pz_o_lmo)**(-0.5)
223  ELSE
224  businger_phih_0d = 0.74 + 4.7 * pz_o_lmo
225  END IF
226 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIH_0D',1,zhook_handle)
227 END FUNCTION businger_phih_0d
228 !
229 !-------------------------------------------------------------------------------
230 !-------------------------------------------------------------------------------
231 !
232 FUNCTION businger_phie_3d(PZ_O_LMO)
233  USE modd_canopy_turb, ONLY : xalpsbl
234  IMPLICIT NONE
235  REAL, DIMENSION(:,:,:), INTENT(IN) :: pz_o_lmo
236  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: businger_phie_3d
237  REAL(KIND=JPRB) :: zhook_handle
238 !
239  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_3D',0,zhook_handle)
240  WHERE ( pz_o_lmo(:,:,:) < 0. )
241  businger_phie_3d(:,:,:) = (1.+(-pz_o_lmo)**(2./3.)/xalpsbl) &
242  * (1.-15.*pz_o_lmo)**(0.5)
243  ELSEWHERE
244  businger_phie_3d(:,:,:) = 1./(1. + 4.7 * pz_o_lmo)**2
245  END WHERE
246 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_3D',1,zhook_handle)
247 END FUNCTION businger_phie_3d
248 
249 !-------------------------------------------------------------------------------
250 !
251 FUNCTION businger_phie_2d(PZ_O_LMO)
252  USE modd_canopy_turb, ONLY : xalpsbl
253  IMPLICIT NONE
254  REAL, DIMENSION(:,:), INTENT(IN) :: pz_o_lmo
255  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: businger_phie_2d
256  REAL(KIND=JPRB) :: zhook_handle
257 !
258  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_2D',0,zhook_handle)
259  WHERE ( pz_o_lmo(:,:) < 0. )
260  businger_phie_2d(:,:) = (1.+(-pz_o_lmo)**(2./3.)/xalpsbl) &
261  * (1.-15.*pz_o_lmo)**(0.5)
262  ELSEWHERE
263  businger_phie_2d(:,:) = 1./(1. + 4.7 * pz_o_lmo)**2
264  END WHERE
265 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_2D',1,zhook_handle)
266 END FUNCTION businger_phie_2d
267 
268 !-------------------------------------------------------------------------------
269 !
270 FUNCTION businger_phie_1d(PZ_O_LMO)
271  USE modd_canopy_turb, ONLY : xalpsbl
272  IMPLICIT NONE
273  REAL, DIMENSION(:), INTENT(IN) :: pz_o_lmo
274  REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: businger_phie_1d
275  REAL(KIND=JPRB) :: zhook_handle
276 !
277  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_1D',0,zhook_handle)
278  WHERE ( pz_o_lmo(:) < 0. )
279  businger_phie_1d(:) = (1.+(-pz_o_lmo)**(2./3.)/xalpsbl) &
280  * (1.-15.*pz_o_lmo)**(0.5)
281  ELSEWHERE
282  businger_phie_1d(:) = 1./(1. + 4.7 * pz_o_lmo)**2
283  END WHERE
284 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_1D',1,zhook_handle)
285 END FUNCTION businger_phie_1d
286 
287 !-------------------------------------------------------------------------------
288 !
289 FUNCTION businger_phie_0d(PZ_O_LMO)
290  USE modd_canopy_turb, ONLY : xalpsbl
291  IMPLICIT NONE
292  REAL, INTENT(IN):: pz_o_lmo
293  REAL :: businger_phie_0d
294  REAL(KIND=JPRB) :: zhook_handle
295 !
296  IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_0D',0,zhook_handle)
297  IF ( pz_o_lmo < 0. ) THEN
298  businger_phie_0d = (1.+(-pz_o_lmo)**(2./3.)/xalpsbl) &
299  * (1.-15.*pz_o_lmo)**(0.5)
300  ELSE
301  businger_phie_0d = 1./(1. + 4.7 * pz_o_lmo)**2
302  END IF
303 IF (lhook) CALL dr_hook('MODE_SBLS:BUSINGER_PHIE_0D',1,zhook_handle)
304 END FUNCTION businger_phie_0d
305 !
306 !-------------------------------------------------------------------------------
307 !-------------------------------------------------------------------------------
308 !
309 FUNCTION paulson_psim_3d(PZ_O_LMO)
310  USE modd_csts
311  IMPLICIT NONE
312  REAL, DIMENSION(:,:,:), INTENT(IN) :: pz_o_lmo
313  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: paulson_psim_3d
314 !
315  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: zx
316  REAL(KIND=JPRB) :: zhook_handle
317 
318  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_3D',0,zhook_handle)
319  zx=1.
320  WHERE ( pz_o_lmo(:,:,:) < 0. )
321  zx=(1.-15.*pz_o_lmo)**(0.25)
322  paulson_psim_3d(:,:,:) = log( (1.+zx**2)*(1+zx)**2/8. ) - 2.*atan(zx) + xpi/2.
323  ELSEWHERE
324  paulson_psim_3d(:,:,:) = - 4.7 * pz_o_lmo
325  END WHERE
326 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_3D',1,zhook_handle)
327 END FUNCTION paulson_psim_3d
328 !
329 !-------------------------------------------------------------------------------
330 !
331 FUNCTION paulson_psim_2d(PZ_O_LMO)
332  USE modd_csts
333  IMPLICIT NONE
334  REAL, DIMENSION(:,:), INTENT(IN) :: pz_o_lmo
335  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: paulson_psim_2d
336 !
337  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: zx
338  REAL(KIND=JPRB) :: zhook_handle
339 
340  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_2D',0,zhook_handle)
341  zx=1.
342  WHERE ( pz_o_lmo(:,:) < 0. )
343  zx=(1.-15.*pz_o_lmo)**(0.25)
344  paulson_psim_2d(:,:) = log( (1.+zx**2)*(1+zx)**2/8. ) - 2.*atan(zx) + xpi/2.
345  ELSEWHERE
346  paulson_psim_2d(:,:) = - 4.7 * pz_o_lmo
347  END WHERE
348 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_2D',1,zhook_handle)
349 END FUNCTION paulson_psim_2d
350 !
351 !-------------------------------------------------------------------------------
352 !
353 FUNCTION paulson_psim_1d(PZ_O_LMO)
354  USE modd_csts
355  IMPLICIT NONE
356  REAL, DIMENSION(:), INTENT(IN) :: pz_o_lmo
357  REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: paulson_psim_1d
358 !
359  REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: zx
360  REAL(KIND=JPRB) :: zhook_handle
361 
362  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_1D',0,zhook_handle)
363  zx=1.
364  WHERE ( pz_o_lmo(:) < 0. )
365  zx=(1.-15.*pz_o_lmo)**(0.25)
366  paulson_psim_1d(:) = log( (1.+zx**2)*(1+zx)**2/8. ) - 2.*atan(zx) + xpi/2.
367  ELSEWHERE
368  paulson_psim_1d(:) = - 4.7 * pz_o_lmo
369  END WHERE
370 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_1D',1,zhook_handle)
371 END FUNCTION paulson_psim_1d
372 !
373 !-------------------------------------------------------------------------------
374 !
375 FUNCTION paulson_psim_0d(PZ_O_LMO)
376  USE modd_csts
377  IMPLICIT NONE
378  REAL, INTENT(IN) :: pz_o_lmo
379  REAL :: paulson_psim_0d
380 !
381  REAL :: zx
382  REAL(KIND=JPRB) :: zhook_handle
383 
384  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_0D',0,zhook_handle)
385  zx=1.
386  IF ( pz_o_lmo < 0. ) THEN
387  zx=(1.-15.*pz_o_lmo)**(0.25)
388  paulson_psim_0d = log( (1.+zx**2)*(1+zx)**2/8. ) - 2.*atan(zx) + xpi/2.
389  ELSE
390  paulson_psim_0d = - 4.7 * pz_o_lmo
391  END IF
392 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIM_0D',1,zhook_handle)
393 END FUNCTION paulson_psim_0d
394 !
395 !-------------------------------------------------------------------------------
396 !-------------------------------------------------------------------------------
397 !
398 FUNCTION paulson_psih_3d(PZ_O_LMO)
399  IMPLICIT NONE
400  REAL, DIMENSION(:,:,:), INTENT(IN) :: pz_o_lmo
401  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: paulson_psih_3d
402 !
403  REAL, DIMENSION(SIZE(PZ_O_LMO,1), & SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: zy
404  REAL(KIND=JPRB) :: zhook_handle
405 
406  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_3D',0,zhook_handle)
407  zy=1.
408  WHERE ( pz_o_lmo(:,:,:) < 0. )
409  zy=(1.-9.*pz_o_lmo)**(0.5)
410  paulson_psih_3d(:,:,:) = log( (1.+zy)/2. )
411  ELSEWHERE
412  paulson_psih_3d(:,:,:) = - 4.7 * pz_o_lmo / 0.74
413  END WHERE
414 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_3D',1,zhook_handle)
415 END FUNCTION paulson_psih_3d
416 !
417 !-------------------------------------------------------------------------------
418 !
419 FUNCTION paulson_psih_2d(PZ_O_LMO)
420  IMPLICIT NONE
421  REAL, DIMENSION(:,:), INTENT(IN) :: pz_o_lmo
422  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: paulson_psih_2d
423 !
424  REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: zy
425  REAL(KIND=JPRB) :: zhook_handle
427  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_2D',0,zhook_handle)
428  zy=1.
429  WHERE ( pz_o_lmo(:,:) < 0. )
430  zy=(1.-9.*pz_o_lmo)**(0.5)
431  paulson_psih_2d(:,:) = log( (1.+zy)/2. )
432  ELSEWHERE
433  paulson_psih_2d(:,:) = - 4.7 * pz_o_lmo / 0.74
434  END WHERE
435 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_2D',1,zhook_handle)
436 END FUNCTION paulson_psih_2d
437 !
438 !-------------------------------------------------------------------------------
439 !
440 FUNCTION paulson_psih_1d(PZ_O_LMO)
441  IMPLICIT NONE
442  REAL, DIMENSION(:), INTENT(IN) :: pz_o_lmo
443  REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: paulson_psih_1d
444 !
445  REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: zy
446  REAL(KIND=JPRB) :: zhook_handle
448  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_1D',0,zhook_handle)
449  zy=1.
450  WHERE ( pz_o_lmo(:) < 0. )
451  zy=(1.-9.*pz_o_lmo)**(0.5)
452  paulson_psih_1d(:) = log( (1.+zy)/2. )
453  ELSEWHERE
454  paulson_psih_1d(:) = - 4.7 * pz_o_lmo / 0.74
455  END WHERE
456 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_1D',1,zhook_handle)
457 END FUNCTION paulson_psih_1d
458 !
459 !-------------------------------------------------------------------------------
460 !
461 FUNCTION paulson_psih_0d(PZ_O_LMO)
462  IMPLICIT NONE
463  REAL, INTENT(IN) :: pz_o_lmo
464  REAL :: paulson_psih_0d
465 !
466  REAL :: zy
467  REAL(KIND=JPRB) :: zhook_handle
469  IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_0D',0,zhook_handle)
470  zy=1.
471  IF ( pz_o_lmo < 0. ) THEN
472  zy=(1.-9.*pz_o_lmo)**(0.5)
473  paulson_psih_0d = log( (1.+zy)/2. )
474  ELSE
475  paulson_psih_0d = - 4.7 * pz_o_lmo / 0.74
476  END IF
477 IF (lhook) CALL dr_hook('MODE_SBLS:PAULSON_PSIH_0D',1,zhook_handle)
478 END FUNCTION paulson_psih_0d
479 !
480 !-------------------------------------------------------------------------------
481 !-------------------------------------------------------------------------------
482 !
483 !
484 FUNCTION lmo_2d(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
485  USE modd_csts
486  USE modd_surf_par, ONLY : xundef
487  IMPLICIT NONE
488  REAL, DIMENSION(:,:), INTENT(IN) :: pustar
489  REAL, DIMENSION(:,:), INTENT(IN) :: ptheta
490  REAL, DIMENSION(:,:), INTENT(IN) :: prv
491  REAL, DIMENSION(:,:), INTENT(IN) :: psfth
492  REAL, DIMENSION(:,:), INTENT(IN) :: psfrv
493  REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: lmo_2d
494 !
495  REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: zthetav
496  REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: zq0
497  REAL :: zeps
498  REAL(KIND=JPRB) :: zhook_handle
499 !
500 !
501  IF (lhook) CALL dr_hook('MODE_SBLS:LMO_2D',0,zhook_handle)
502  zeps=(xrv-xrd)/xrd
503  zthetav(:,:) = ptheta(:,:) * ( 1. +zeps * prv(:,:))
504  zq0(:,:) = psfth(:,:) + zthetav(:,:) * zeps * psfrv(:,:)
505 !
506  lmo_2d(:,:) = xundef
507  WHERE ( zq0(:,:) /=0. ) &
508  lmo_2d(:,:) = - max(pustar(:,:),1.e-6)**3 &
509  / ( xkarman * xg / zthetav(:,:) *zq0(:,:) )
510 !
511  WHERE(abs(lmo_2d)>10000.) lmo_2d=xundef
512 IF (lhook) CALL dr_hook('MODE_SBLS:LMO_2D',1,zhook_handle)
513 
514 END FUNCTION lmo_2d
515 !
516 !-------------------------------------------------------------------------------
517 !
518 FUNCTION lmo_1d(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
519  USE modd_csts
520  USE modd_surf_par, ONLY : xundef
521  IMPLICIT NONE
522  REAL, DIMENSION(:), INTENT(IN) :: pustar
523  REAL, DIMENSION(:), INTENT(IN) :: ptheta
524  REAL, DIMENSION(:), INTENT(IN) :: prv
525  REAL, DIMENSION(:), INTENT(IN) :: psfth
526  REAL, DIMENSION(:), INTENT(IN) :: psfrv
527  REAL, DIMENSION(SIZE(PUSTAR)) :: lmo_1d
528 !
529  REAL, DIMENSION(SIZE(PUSTAR)) :: zthetav
530  REAL :: zeps
531  REAL(KIND=JPRB) :: zhook_handle
532 !
533 !
534  IF (lhook) CALL dr_hook('MODE_SBLS:LMO_1D',0,zhook_handle)
535  zeps=(xrv-xrd)/xrd
536 !
537  zthetav(:) = ptheta(:) * ( 1. +zeps * prv(:))
538 !
539  lmo_1d(:) = xundef
540  WHERE ( psfth(:)/zthetav(:)+zeps*psfrv(:)/=0. ) &
541  lmo_1d(:) = - max(pustar(:),1.e-6)**3 &
542  / ( xkarman * xg &
543  * ( psfth(:) / zthetav(:) + zeps * psfrv(:) ) )
544 
545  WHERE(abs(lmo_1d)>10000.) lmo_1d=xundef
546 IF (lhook) CALL dr_hook('MODE_SBLS:LMO_1D',1,zhook_handle)
547 
548 END FUNCTION lmo_1d
549 !
550 !-------------------------------------------------------------------------------
551 !
552 FUNCTION lmo_0d(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
553  USE modd_csts
554  USE modd_surf_par, ONLY : xundef
555  IMPLICIT NONE
556  REAL, INTENT(IN) :: pustar
557  REAL, INTENT(IN) :: ptheta
558  REAL, INTENT(IN) :: prv
559  REAL, INTENT(IN) :: psfth
560  REAL, INTENT(IN) :: psfrv
561  REAL :: lmo_0d
562 !
563  REAL :: zthetav
564  REAL :: zeps
565  REAL(KIND=JPRB) :: zhook_handle
566 !
567 !
568  IF (lhook) CALL dr_hook('MODE_SBLS:LMO_0D',0,zhook_handle)
569  zeps=(xrv-xrd)/xrd
570 !
571 !
572  zthetav = ptheta * ( 1. +zeps * prv)
573 !
574  lmo_0d = xundef
575  IF ( psfth/zthetav+zeps*psfrv/=0. ) &
576  lmo_0d = - max(pustar,1.e-6)**3 &
577  / ( xkarman * ( xg / zthetav * psfth &
578  + xg * zeps * psfrv ) )
579 
580  IF(abs(lmo_0d)>10000.) lmo_0d=xundef
581 IF (lhook) CALL dr_hook('MODE_SBLS:LMO_0D',1,zhook_handle)
582 
583 END FUNCTION lmo_0d
584 !
585 !-------------------------------------------------------------------------------
586 !-------------------------------------------------------------------------------
587 !
588 FUNCTION ustar_2d(PWIND,PZ,PZ0,PLMO)
589  USE modd_csts
590  USE modd_surf_par, ONLY : xundef
591  IMPLICIT NONE
592  REAL, DIMENSION(:,:), INTENT(IN) :: pwind
593  REAL, DIMENSION(:,:), INTENT(IN) :: pz
594  REAL, DIMENSION(:,:), INTENT(IN) :: pz0
595  REAL, DIMENSION(:,:), INTENT(IN) :: plmo
596  REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: ustar_2d
597 
598  REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: zz_o_lmo
599  REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: zz0_o_lmo
600  REAL(KIND=JPRB) :: zhook_handle
601 !
602 !* purely unstable case
603  IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_2D',0,zhook_handle)
604  ustar_2d(:,:) = 0.
605  zz_o_lmo(:,:) = xundef
606  zz0_o_lmo(:,:) = xundef
607 !
608 !* general case
609  WHERE(abs(plmo) > 1.e-20 .AND. plmo/=xundef)
610  zz_o_lmo = pz(:,:) / plmo(:,:)
611  zz0_o_lmo = pz0(:,:) / plmo(:,:)
612  ustar_2d(:,:) = pwind(:,:) &
613  * xkarman / ( log(pz(:,:)/pz0(:,:)) &
614  - paulson_psim(zz_o_lmo(:,:)) &
615  + paulson_psim(zz0_o_lmo(:,:)) )
616  END WHERE
617 !
618 !* purely neutral case
619  WHERE(plmo==xundef)
620  zz_o_lmo = 0.
621  ustar_2d(:,:) = pwind(:,:) &
622  * xkarman / log(pz(:,:)/pz0(:,:))
623  END WHERE
624 IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_2D',1,zhook_handle)
625 !
626 END FUNCTION ustar_2d
627 !
628 !-------------------------------------------------------------------------------
629 !
630 FUNCTION ustar_1d(PWIND,PZ,PZ0,PLMO)
631  USE modd_csts
632  USE modd_surf_par, ONLY : xundef
633  IMPLICIT NONE
634  REAL, DIMENSION(:), INTENT(IN) :: pwind
635  REAL, DIMENSION(:), INTENT(IN) :: pz
636  REAL, DIMENSION(:), INTENT(IN) :: pz0
637  REAL, DIMENSION(:), INTENT(IN) :: plmo
638  REAL, DIMENSION(SIZE(PZ)) :: ustar_1d
639 
640  REAL, DIMENSION(SIZE(PZ)) :: zz_o_lmo
641  REAL, DIMENSION(SIZE(PZ)) :: zz0_o_lmo
642  REAL(KIND=JPRB) :: zhook_handle
643 !
644 !* purely unstable case
645  IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_1D',0,zhook_handle)
646  ustar_1d(:) = 0.
647  zz_o_lmo(:) = xundef
648  zz0_o_lmo(:) = xundef
649 !
650 !* general case
651  WHERE(abs(plmo) > 1.e-20 .AND. plmo/=xundef)
652  zz_o_lmo = pz(:) / plmo(:)
653  zz0_o_lmo = pz0(:) / plmo(:)
654  ustar_1d(:) = pwind &
655  * xkarman / ( log(pz(:)/pz0(:)) &
656  - paulson_psim(zz_o_lmo(:)) &
657  + paulson_psim(zz0_o_lmo(:)) )
658  END WHERE
659 !
660 !* purely neutral case
661  WHERE(plmo==xundef)
662  zz_o_lmo = 0.
663  ustar_1d(:) = pwind &
664  * xkarman / log(pz(:)/pz0(:))
665  END WHERE
666 IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_1D',1,zhook_handle)
667 !
668 END FUNCTION ustar_1d
669 !
670 !-------------------------------------------------------------------------------
671 !
672 FUNCTION ustar_0d(PWIND,PZ,PZ0,PLMO)
673  USE modd_csts
674  USE modd_surf_par, ONLY : xundef
675  IMPLICIT NONE
676  REAL, INTENT(IN) :: pwind
677  REAL, INTENT(IN) :: pz
678  REAL, INTENT(IN) :: pz0
679  REAL, INTENT(IN) :: plmo
680  REAL :: ustar_0d
681  REAL(KIND=JPRB) :: zhook_handle
682 !
683 !* purely unstable case
684  IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_0D',0,zhook_handle)
685  ustar_0d = 0.
686 !
687 !* general case
688  IF ( abs(plmo) >= 1.e-20 .AND. plmo/=xundef) &
689  ustar_0d = pwind * xkarman / ( log(pz/pz0) - paulson_psim(pz/plmo) + paulson_psim(pz0/plmo) )
690 !
691 !* purely neutral case
692  IF (plmo==xundef) &
693  ustar_0d = pwind * xkarman / log(pz/pz0)
694 IF (lhook) CALL dr_hook('MODE_SBLS:USTAR_0D',1,zhook_handle)
695 
696 END FUNCTION ustar_0d
697 !
698 !-------------------------------------------------------------------------------
699 !
700 END MODULE mode_sbls
701 
real function, dimension(size(pustar)) lmo_1d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:525
real function, dimension(size(pz_o_lmo, 1),size(pz_o_lmo, 2), size(pz_o_lmo, 3)) businger_phih_3d(PZ_O_LMO)
Definition: mode_sbls.F90:164
real function, dimension(size(pustar, 1), size(pustar, 2)) lmo_2d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:491
real function businger_phim_0d(PZ_O_LMO)
Definition: mode_sbls.F90:146
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phim_2d(PZ_O_LMO)
Definition: mode_sbls.F90:112
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) paulson_psim_2d(PZ_O_LMO)
Definition: mode_sbls.F90:336
real function businger_phih_0d(PZ_O_LMO)
Definition: mode_sbls.F90:216
real function, dimension(size(pz)) ustar_1d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:637
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) paulson_psih_2d(PZ_O_LMO)
Definition: mode_sbls.F90:426
real function, dimension(size(pz_o_lmo)) businger_phih_1d(PZ_O_LMO)
Definition: mode_sbls.F90:199
real function, dimension(size(pz_o_lmo, 1)) paulson_psim_1d(PZ_O_LMO)
Definition: mode_sbls.F90:358
real function, dimension(size(pz_o_lmo, 1),size(pz_o_lmo, 2), size(pz_o_lmo, 3)) paulson_psih_3d(PZ_O_LMO)
Definition: mode_sbls.F90:403
real function, dimension(size(pz_o_lmo, 1),size(pz_o_lmo, 2), size(pz_o_lmo, 3)) businger_phie_3d(PZ_O_LMO)
Definition: mode_sbls.F90:234
real function, dimension(size(pz_o_lmo, 1),size(pz_o_lmo, 2), size(pz_o_lmo, 3)) paulson_psim_3d(PZ_O_LMO)
Definition: mode_sbls.F90:312
real function, dimension(size(pz, 1), size(pz, 2)) ustar_2d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:595
real function, dimension(size(pz_o_lmo, 1)) businger_phie_1d(PZ_O_LMO)
Definition: mode_sbls.F90:273
real function lmo_0d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:559
real function paulson_psim_0d(PZ_O_LMO)
Definition: mode_sbls.F90:380
real function paulson_psih_0d(PZ_O_LMO)
Definition: mode_sbls.F90:468
real function businger_phie_0d(PZ_O_LMO)
Definition: mode_sbls.F90:292
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phih_2d(PZ_O_LMO)
Definition: mode_sbls.F90:182
real function, dimension(size(pz_o_lmo)) businger_phim_1d(PZ_O_LMO)
Definition: mode_sbls.F90:129
real function ustar_0d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:679
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phie_2d(PZ_O_LMO)
Definition: mode_sbls.F90:254
real function, dimension(size(pz_o_lmo, 1)) paulson_psih_1d(PZ_O_LMO)
Definition: mode_sbls.F90:447
real function, dimension(size(pz_o_lmo, 1),size(pz_o_lmo, 2), size(pz_o_lmo, 3)) businger_phim_3d(PZ_O_LMO)
Definition: mode_sbls.F90:94