SURFEX v8.1
General documentation of Surfex
z0eff.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 z0eff (HSNOW_SCHEME, &
7  OMEB, PALFA, PZREF, PUREF, PZ0, PZ0REL, PPSN, &
8  PPALPHAN,PZ0LITTER, PWSNOW, ISS, PFF, PZ0_FLOOD, &
9  PZ0_O_Z0H, PZ0_WITH_SNOW, PZ0H_WITH_SNOW,PZ0EFF, &
10  PZ0G_WITHOUT_SNOW, &
11  PZ0_MEBV,PZ0H_MEBV,PZ0EFF_MEBV, &
12  PZ0_MEBN,PZ0H_MEBN,PZ0EFF_MEBN )
13 
14 ! ############################################################################
15 !
16 !!**** *Z0EFF*
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 ! Calculates the z0eff for momentum fluxes according to wind direction.
22 !
23 !
24 !!** METHOD
25 !! ------
26 !
27 !
28 !! EXTERNAL
29 !! --------
30 !!
31 !!
32 !! IMPLICIT ARGUMENTS
33 !! ------------------
34 !!
35 !!
36 !! REFERENCE
37 !! ---------
38 !!
39 !! Mascart et al. (1995)
40 !! Belair (1995)
41 !!
42 !! AUTHOR
43 !! ------
44 !!
45 !! S. Belair * Meteo-France *
46 !!
47 !! MODIFICATIONS
48 !! -------------
49 !! Original 13/03/95
50 !! (J.Stein) 15/11/95 use the potential temperature to compute Ri
51 !! and PVMOD instead of ZVMOD
52 !! (P.Lacarrere)15/03/96 replace * PEXNS by / PEXNS
53 !! (V.Masson) 22/12/97 computation of z0eff after snow treatment
54 !! (V.Masson) 05/10/98 clear routine
55 !! (A.Boone) 11/26/98 Option for PDELTA: forested vs default surface
56 !! (V Masson) 12/07/01 new formulation for aggregation with snow z0
57 !! (P.LeMoigne) 09/02/06 computation of z0h in presence of snow
58 !! (B. Decharme) 2008 floodplains
59 !! (P. Samuelsson) 10/2014 MEB
60 !! P. LeMoigne 12/2014 EBA scheme update
61 !-------------------------------------------------------------------------------
62 !
63 !* 0. DECLARATIONS
64 ! ------------
65 !
66 !
67 USE modd_sso_n, ONLY : sso_t
68 !
69 USE modd_csts, ONLY : xpi, xg
70 USE modd_snow_par, ONLY : xz0sn, xwcrn, xz0hsn
71 !
72 USE modi_subscale_z0eff
73 USE modd_surf_atm, ONLY : laldz0h
74 !
75 !
76 USE yomhook ,ONLY : lhook, dr_hook
77 USE parkind1 ,ONLY : jprb
78 !
79 IMPLICIT NONE
80 !
81 !* 0.1 declarations of arguments
82 !
83 !
84 !
85  CHARACTER(LEN=*), INTENT(IN) :: HSNOW_SCHEME
86 !
87 LOGICAL, INTENT(IN) :: OMEB ! True = patch with multi-energy balance
88 ! ! False = patch with classical ISBA
89 REAL, DIMENSION(:), INTENT(IN) :: PALFA ! wind direction from J axis (clockwise)
90 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! height of atmospheric level
91 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height for wind
92 REAL, DIMENSION(:), INTENT(IN) :: PZ0 ! vegetation roughness length
93 REAL, DIMENSION(:), INTENT(IN) :: PZ0REL ! 1d orographic roughness length
94 REAL, DIMENSION(:), INTENT(IN) :: PPSN ! fraction of snow
95 REAL, DIMENSION(:), INTENT(IN) :: PPALPHAN ! snow/canopy transition coefficient
96 TYPE(sso_t), INTENT(INOUT) :: ISS
97 REAL, DIMENSION(:), INTENT(IN) :: PZ0_O_Z0H ! ratio between heat and momentum z0
98 !
99 REAL, DIMENSION(:), INTENT(IN) :: PFF ! fraction of flood
100 REAL, DIMENSION(:), INTENT(IN) :: PZ0_FLOOD ! floodplains roughness length
101 !
102 ! For multi-energy balance
103 REAL, DIMENSION(:), INTENT(IN) :: PZ0LITTER ! ground litter roughness length for MEB
104 !
105 REAL, DIMENSION(:), INTENT(IN) :: PWSNOW ! equivalent snow water content
106 !
107 REAL, DIMENSION(:), INTENT(OUT) :: PZ0_WITH_SNOW ! vegetation z0 modified by snow
108 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H_WITH_SNOW ! vegetation z0h modified by snow
109 REAL, DIMENSION(:), INTENT(OUT) :: PZ0EFF ! effective z0
110 !
111 ! For multi-energy balance
112 REAL, DIMENSION(:), INTENT(OUT) :: PZ0G_WITHOUT_SNOW ! roughness length for momentum at snow-free canopy floor
113 !
114 REAL, DIMENSION(:), INTENT(OUT) :: PZ0_MEBV ! roughness length for momentum over MEB vegetation part of patch
115 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H_MEBV ! roughness length for heat over MEB vegetation part of path
116 REAL, DIMENSION(:), INTENT(OUT) :: PZ0EFF_MEBV ! roughness length for momentum over MEB vegetation part of patch
117 ! ! eventually including orograhic roughness
118 REAL, DIMENSION(:), INTENT(OUT) :: PZ0_MEBN ! roughness length for momentum over MEB snow part of patch
119 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H_MEBN ! roughness length for heat over MEB snow part of path
120 REAL, DIMENSION(:), INTENT(OUT) :: PZ0EFF_MEBN ! roughness length for momentum over MEB snow part of patch
121 !
122 !
123 !
124 !* 0.2 declarations of local variables
125 !
126 !
127 !
128 REAL, DIMENSION(SIZE(PZ0EFF)) :: ZWORK, ZALFA, &
129  ZZ0EFFIP, ZZ0EFFIM, &
130  ZZ0EFFJP, ZZ0EFFJM, &
131  ZPFF
132 ! effective roughness length in 4
133 ! directions
134 REAL :: Z0CR, ZUZ0CN, ZALRCN1, ZALRCN2
135 REAL(KIND=JPRB) :: ZHOOK_HANDLE
136 !-------------------------------------------------------------------------------
137 !
138 IF (lhook) CALL dr_hook('Z0EFF',0,zhook_handle)
139 zalrcn1=1.e-02
140 zalrcn2=2.5e-03
141 z0cr = zalrcn1
142 zuz0cn=1./zalrcn2
143 zalfa(:) = palfa(:)
144 WHERE(zalfa(:)<=-xpi) zalfa = zalfa + 2.*xpi
145 WHERE(zalfa(:)> xpi) zalfa = zalfa - 2.*xpi
146 !
147 ! Initialisation of MEB roughness lengths
148 pz0g_without_snow=0.
149 pz0_mebv=0.
150 pz0h_mebv=0.
151 pz0eff_mebv=0.
152 pz0_mebn=0.
153 pz0h_mebn=0.
154 pz0eff_mebn=0.
155 !
156 !* 1. GRID-AVERAGED ROUGHNESS LENGTHS
157 ! -------------------------------
158 ! (considering the effect of snow-flood-covered surfaces and orography)
159 !
160 !* 1.1 for heat
161 ! --------
162 !
163 pz0_with_snow(:) = pz0(:)
164 pz0h_with_snow(:) = pz0(:) / pz0_o_z0h(:)
165 !
166 IF(hsnow_scheme=='EBA') THEN
167 !
168  WHERE (ppsn(:)>0.)
169 !
170 !!!!!Flooding scheme not implemented with this option
171  pz0_with_snow(:) = pz0_with_snow(:) + ( z0cr - pz0(:))* &
172  pwsnow(:)/(pwsnow(:) + xwcrn*(1.0+zuz0cn*pz0(:)))
173 !
174  END WHERE
175 
176 
177  IF (laldz0h) THEN
178  WHERE (ppsn(:)>0.)
179  pz0h_with_snow(:) = pz0h_with_snow(:) + ( z0cr - pz0h_with_snow(:))* &
180  pwsnow(:)/(pwsnow(:) + xwcrn*(1.0+zuz0cn*pz0h_with_snow(:)))
181  END WHERE
182  END IF
183 
184 !
185 ELSE
186 !
187  WHERE (ppsn(:)>0..OR.pff(:)>0.)
188 !
189  zwork(:) = ( ppsn(:) /(log(puref(:)/xz0sn ))**2 ) &
190  + ( pff(:) /(log(puref(:)/pz0_flood(:)))**2 ) &
191  + ((1.-ppsn(:)-pff(:))/(log(puref(:)/pz0(:) ))**2 )
192 !
193  pz0_with_snow(:) = puref(:) /exp( sqrt( 1./zwork(:) ) )
194 !
195  zwork(:) = ( ppsn(:) /(log(pzref(:)/xz0hsn ))**2 ) &
196  + ( pff(:) /(log(pzref(:)/(pz0_flood(:)/ pz0_o_z0h(:))))**2 ) &
197  + ((1.-ppsn(:)-pff(:))/(log(pzref(:)/(pz0(:)/pz0_o_z0h(:)) ))**2 )
198 !
199  pz0h_with_snow(:) = pzref(:) /exp( sqrt( 1./zwork(:) ) )
200 !
201  END WHERE
202 !
203 ENDIF
204 !
205 ! For multi-energy balance
206 IF(omeb)THEN
207 
208 ! roughness length for momentum at snow-free canopy floor
209  pz0g_without_snow(:) = pz0litter
210  WHERE (pff(:)>0.)
211  zpff(:)=pff(:)/(1-ppsn(:)+1.e-6)
212  zwork(:) = ( zpff(:) * log(pz0_flood(:)) ) &
213  + ( (1.-zpff(:)) * log(pz0litter(:)) )
214  pz0g_without_snow(:) = exp( zwork(:) )
215  END WHERE
216 !
217 ! roughness length for momentum over MEB vegetation part of patch
218  pz0_mebv(:) = pz0(:)
219 !
220 ! roughness length for momentum over MEB snow part of patch
221  zwork(:) = ( ppalphan(:) /(log(puref(:)/xz0sn ))**2 ) &
222  + ((1.-ppalphan(:))/(log(puref(:)/pz0_mebv(:) ))**2 )
223  pz0_mebn(:) = puref(:) /exp( sqrt( 1./zwork(:) ) )
224 !
225 
226 ! roughness length for momentum over MEB total patch
227  zwork(:) = ( ppsn(:) /(log(puref(:)/pz0_mebn(:) ))**2 ) &
228  + ((1.-ppsn(:))/(log(puref(:)/pz0_mebv(:) ))**2 )
229  pz0_with_snow(:) = puref(:) /exp( sqrt( 1./zwork(:) ) )
230 !
231 ! roughness length for heat over MEB vegetation part of path
232  pz0h_mebv(:) = pz0_mebv(:)/pz0_o_z0h(:)
233 ! for nordic forest, z0h=z0m according to M&#195;&#182;lder (tested in Hirlam):
234 !
235 ! PZ0H_MEBV(:) = PZ0_MEBV(:)
236 !
237 ! roughness length for heat over MEB snow part of path
238  zwork(:) = ( ppalphan(:) /(log(pzref(:)/xz0hsn ))**2 ) &
239  + ( (1.-ppalphan(:))/(log(pzref(:)/pz0h_mebv(:) ))**2 )
240  pz0h_mebn(:) = pzref(:) /exp( sqrt( 1./zwork(:) ) )
241 !
242 
243 ! roughness length for heat over MEB total path
244  zwork(:) = ( ppsn(:) /(log(pzref(:)/pz0h_mebn(:) ))**2 ) &
245  + ( (1.-ppsn(:))/(log(pzref(:)/pz0h_mebv(:) ))**2 )
246  pz0h_with_snow(:) = pzref(:) /exp( sqrt( 1./zwork(:) ) )
247 !
248 ENDIF
249 !
250 !* 1.2 for momentum
251 ! ------------
252 !
253 ! In this particular case, we now use
254 ! the roughness length due to the coupled
255 ! effect of vegetation and topography
256 ! Snow and Flood effects are yet taken
257 ! into account through ZZ0EFF
258 !
259 pz0eff(:) = pz0_with_snow(:)
260 IF(omeb)THEN
261  pz0eff_mebv(:) = pz0_mebv(:)
262  pz0eff_mebn(:) = pz0_mebn(:)
263 ENDIF
264 !
265 IF (lhook) CALL dr_hook('Z0EFF',1,zhook_handle)
266 !
267 !-------------------------------------------------------------------------------
268 !
269 END SUBROUTINE z0eff
real, save xpi
Definition: modd_csts.F90:43
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
subroutine z0eff(HSNOW_SCHEME, OMEB, PALFA, PZREF, PUREF, PZ0, PZ0REL, PPSN, PPALPHAN, PZ0LITTER, PWSNOW, ISS, PFF, PZ0_FLOOD, PZ0_O_Z0H, PZ0_WITH_SNOW, PZ0H_WITH_SNOW, PZ0EFF, PZ0G_WITHOUT_SNOW, PZ0_MEBV, PZ0H_MEBV, PZ0EFF_MEBV, PZ0_MEBN, PZ0H_MEBN, PZ0EFF_MEBN)
Definition: z0eff.F90:13
logical lhook
Definition: yomhook.F90:15