SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
rmc01_surf.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  SUBROUTINE rmc01_surf(PZ, PLMO, PLK, PLEPS, ONEUTRAL)
7 ! ##############################################################
8 !
9 !!**** *RMC01_SURF* -
10 !!
11 !! PURPOSE
12 !! -------
13 !! This routine modifies the mixing and dissipative length near the SBL.
14 !! (Redelsperger, Mahe and Carlotti, 2001)
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! Book 2
30 !!
31 !! AUTHOR
32 !! ------
33 !!
34 !! V. Masson - Meteo-France -
35 !!
36 !! MODIFICATIONS
37 !! -------------
38 !! Original 07/2006
39 !-------------------------------------------------------------------------------
40 !
41 !* 0. DECLARATIONS
42 ! ------------
43 !
44 USE modd_surf_par, ONLY : xundef
45 USE modd_csts, ONLY : xkarman
46 USE modd_canopy_turb, ONLY : xalpsbl, xcmfs, xced
47 !
48 USE mode_sbls
49 !
50 !
51 USE yomhook ,ONLY : lhook, dr_hook
52 USE parkind1 ,ONLY : jprb
53 !
54 IMPLICIT NONE
55 !
56 !* 0.1 Declaration of arguments
57 ! ------------------------
58 !
59 REAL, DIMENSION(:,:), INTENT(IN) :: pz ! altitude of full levels
60 REAL, DIMENSION(:,:), INTENT(IN) :: plmo ! Monin Obuhkov length
61 REAL, DIMENSION(:,:), INTENT(OUT) :: plk ! Mixing length
62 REAL, DIMENSION(:,:), INTENT(OUT) :: pleps! Dissipative length
63 LOGICAL, OPTIONAL, INTENT(IN) :: oneutral
64 !
65 !* 0.2 Declaration of local variables
66 ! ------------------------------
67 !
68 LOGICAL :: gneutral
69 !
70 INTEGER :: jk ! loop counter
71 !
72 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: zz_o_lmo ! height / LMO
73 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: zphim ! MO function
74  ! for stress
75 REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2)) :: zphie ! MO function
76  ! for TKE
77 REAL(KIND=JPRB) :: zhook_handle
78 !-------------------------------------------------------------------------------
79 !
80 gneutral = .false.
81 IF (present(oneutral)) gneutral = oneutral
82 !
83 !* 1. MO quantities
84 ! -------------
85 !
86 ! z/LMO
87 IF (lhook) CALL dr_hook('RMC01_SURF',0,zhook_handle)
88 !
89 !-------------------------------------------------------------------------------
90 !
91 !* 2. Modification of the mixing length
92 ! ---------------------------------
93 !
94 plk(:,:) = xkarman/sqrt(xalpsbl)/xcmfs * pz(:,:)
95 !
96 !-------------------------------------------------------------------------------
97 !
98 !* 3. Modification of the dissipative length
99 ! --------------------------------------
100 !
101 pleps(:,:) = xkarman*(xalpsbl**1.5)*xced * pz(:,:)
102 !
103 !-------------------------------------------------------------------------------
104 !
105 IF (gneutral) THEN
106  IF (lhook) CALL dr_hook('RMC01_SURF',1,zhook_handle)
107  RETURN
108 ENDIF
109 !
110 !-------------------------------------------------------------------------------
111 !
112 WHERE (plmo(:,:)==xundef)
113  zz_o_lmo(:,:)=0.
114 ELSEWHERE
115  zz_o_lmo(:,:)=pz(:,:)/plmo(:,:)
116 END WHERE
117 zz_o_lmo(:,:) = max(zz_o_lmo(:,:),-10.)
118 zz_o_lmo(:,:) = min(zz_o_lmo(:,:), 10.)
119 !
120 !
121 ! MO function for stress
122 zphim(:,:) = businger_phim(zz_o_lmo(:,:))
123 !
124 ! MO function for TKE
125 zphie(:,:) = businger_phie(zz_o_lmo(:,:))
126 !
127 !-------------------------------------------------------------------------------
128 !
129 !* 2. Modification of the mixing length
130 ! ---------------------------------
131 !
132 plk(:,:) = plk(:,:) / (zphim(:,:)**2*sqrt(zphie(:,:)))
133 !
134 !-------------------------------------------------------------------------------
135 !
136 !* 3. Modification of the dissipative length
137 ! --------------------------------------
138 !
139 pleps(:,:) = pleps(:,:) / (zphim(:,:)**2*sqrt(zphie(:,:)))
140 !
141 WHERE (zz_o_lmo(:,:)<0.)
142  pleps(:,:) = pleps(:,:)/(1.-1.9*zz_o_lmo(:,:))
143 ELSEWHERE
144  pleps(:,:) = pleps(:,:)/(1.-0.3*sqrt(zz_o_lmo(:,:)))
145 ENDWHERE
146 !
147 IF (lhook) CALL dr_hook('RMC01_SURF',1,zhook_handle)
148 !-------------------------------------------------------------------------------
149 !
150 END SUBROUTINE rmc01_surf
subroutine rmc01_surf(PZ, PLMO, PLK, PLEPS, ONEUTRAL)
Definition: rmc01_surf.F90:6