SURFEX v8.1
General documentation of Surfex
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
426 
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
447 
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
468 
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(pz)) ustar_1d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:638
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phim_2d(PZ_O_LMO)
Definition: mode_sbls.F90:113
real function lmo_0d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:560
real function, dimension(size(pustar)) lmo_1d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:526
real function, dimension(size(pz_o_lmo, 1)) paulson_psim_1d(PZ_O_LMO)
Definition: mode_sbls.F90:359
real function, dimension(size(pz_o_lmo, 1)) paulson_psih_1d(PZ_O_LMO)
Definition: mode_sbls.F90:448
real function ustar_0d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:680
function businger_phim_3d(PZ_O_LMO)
Definition: mode_sbls.F90:95
real function, dimension(size(pz_o_lmo)) businger_phih_1d(PZ_O_LMO)
Definition: mode_sbls.F90:200
real function paulson_psih_0d(PZ_O_LMO)
Definition: mode_sbls.F90:469
real, save xpi
Definition: modd_csts.F90:43
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phih_2d(PZ_O_LMO)
Definition: mode_sbls.F90:183
real, save xkarman
Definition: modd_csts.F90:48
real, parameter xundef
real function businger_phih_0d(PZ_O_LMO)
Definition: mode_sbls.F90:217
real, save xrd
Definition: modd_csts.F90:62
real function, dimension(size(pz_o_lmo)) businger_phim_1d(PZ_O_LMO)
Definition: mode_sbls.F90:130
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) paulson_psim_2d(PZ_O_LMO)
Definition: mode_sbls.F90:337
real function businger_phim_0d(PZ_O_LMO)
Definition: mode_sbls.F90:147
function businger_phie_3d(PZ_O_LMO)
Definition: mode_sbls.F90:235
function businger_phih_3d(PZ_O_LMO)
Definition: mode_sbls.F90:165
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) paulson_psih_2d(PZ_O_LMO)
Definition: mode_sbls.F90:427
real function, dimension(size(pustar, 1), size(pustar, 2)) lmo_2d(PUSTAR, PTHETA, PRV, PSFTH, PSFRV)
Definition: mode_sbls.F90:492
real function, dimension(size(pz_o_lmo, 1), size(pz_o_lmo, 2)) businger_phie_2d(PZ_O_LMO)
Definition: mode_sbls.F90:255
real, save xrv
Definition: modd_csts.F90:62
logical lhook
Definition: yomhook.F90:15
real function businger_phie_0d(PZ_O_LMO)
Definition: mode_sbls.F90:293
real function, dimension(size(pz, 1), size(pz, 2)) ustar_2d(PWIND, PZ, PZ0, PLMO)
Definition: mode_sbls.F90:596
real function, dimension(size(pz_o_lmo, 1)) businger_phie_1d(PZ_O_LMO)
Definition: mode_sbls.F90:274
real function paulson_psim_0d(PZ_O_LMO)
Definition: mode_sbls.F90:381
function paulson_psih_3d(PZ_O_LMO)
Definition: mode_sbls.F90:404
function paulson_psim_3d(PZ_O_LMO)
Definition: mode_sbls.F90:313