SURFEX v8.1
General documentation of Surfex
ecumev6_flux.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 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
6 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
7 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
8 !SFX_LIC for details. version 1.
9 ! #########
10  SUBROUTINE ecumev6_flux(PZ0SEA,PTA,PEXNA,PRHOA,PSST,PSSS,PEXNS,PQA,PVMOD, &
11  PZREF,PUREF,PPS,PPA,PICHCE,OPRECIP,OPWEBB, &
12  PQSAT,PSFTH,PSFTQ,PUSTAR,PCD,PCDN,PCH,PCE, &
13  PRI,PRESA,PRAIN,KZ0,PZ0HSEA,OPERTFLUX,PPERTFLUX )
14 !###############################################################################
15 !!
16 !!**** *ECUMEV6_FLUX*
17 !!
18 !! PURPOSE
19 !! -------
20 ! Calculate the surface turbulent fluxes of heat, moisture, and momentum
21 ! over sea surface + corrections due to rainfall & Webb effect.
22 !!
23 !!** METHOD
24 !! ------
25 ! The estimation of the transfer coefficients relies on the iterative
26 ! computation of the scaling parameters U*/Teta*/q*. The convergence is
27 ! supposed to be reached in NITERFL iterations maximum.
28 ! Neutral transfer coefficients for momentum/temperature/humidity
29 ! are computed as a function of the 10m-height neutral wind speed using
30 ! the ECUME_V6 formulation based on the multi-campaign (POMME,FETCH,CATCH,
31 ! SEMAPHORE,EQUALANT) ALBATROS dataset.
32 !!
33 !! EXTERNAL
34 !! --------
35 !!
36 !! IMPLICIT ARGUMENTS
37 !! ------------------
38 !!
39 !! REFERENCE
40 !! ---------
41 !! Fairall et al (1996), JGR, 3747-3764
42 !! Gosnell et al (1995), JGR, 437-442
43 !! Fairall et al (1996), JGR, 1295-1308
44 !!
45 !! AUTHOR
46 !! ------
47 !! C. Lebeaupin *Météo-France* (adapted from S. Belamari's code)
48 !!
49 !! MODIFICATIONS
50 !! -------------
51 !! Original 15/03/2005
52 !! Modified 01/2006 C. Lebeaupin (adapted from A. Pirani's code)
53 !! Modified 08/2009 B. Decharme: limitation of Ri
54 !! Modified 09/2012 B. Decharme: CD correction
55 !! Modified 09/2012 B. Decharme: limitation of Ri in surface_ri.F90
56 !! Modified 10/2012 P. Le Moigne: extra inputs for FLake use
57 !! Modified 06/2013 B. Decharme: bug in z0 (output) computation
58 !! Modified 12/2013 S. Belamari: ZRF computation updated:
59 !! 1. ZP00/PPA in ZDWAT, ZLVA in ZDQSDT/ZBULB/ZRF
60 !! 2. ZDWAT/ZDTMP in ZBULB/ZRF (Gosnell et al 95)
61 !! 3. cool skin correction included
62 !! Modified 01/2014 S. Belamari: salinity impact on latent heat of
63 !! vaporization of seawater included
64 !! Modified 01/2014 S. Belamari: new formulation for pure water
65 !! specific heat (ZCPWA)
66 !! Modified 01/2014 S. Belamari: 4 choices for PZ0SEA computation
67 !! Modified 12/2015 S. Belamari: ECUME now provides parameterisations
68 !! for: U10n*sqrt(CDN) instead of CDN
69 !! U10n*CHN/sqrt(CDN) " CHN
70 !! U10n*CEN/sqrt(CDN) " CEN
71 !! Modified 01/2016 S. Belamari: New ECUME formulation
72 !!
73 !! To be done:
74 !! include gustiness computation following Mondon & Redelsperger (1998)
75 !!!
76 !-------------------------------------------------------------------------------
77 !!
78 !! MODIFICATIONS RELATED TO SST CORRECTION COMPUTATION
79 !! ---------------------------------------------------
80 !! Modified 09/2013 S. Belamari: use 0.98 for the ocean emissivity
81 !! following up to date satellite measurements in
82 !! the 8-14 μm range (obtained values range from
83 !! 0.98 to 0.99).
84 !!!
85 !-------------------------------------------------------------------------------
86 !
87 ! 0. DECLARATIONS
88 ! ------------
89 !
90 USE modd_csts, ONLY : xpi, xday, xkarman, xg, xp00, xstefan, xrd, xrv, &
91  xcpd, xcpv, xcl, xtt, xlvtt
92 USE modd_surf_par, ONLY : xundef
93 USE modd_surf_atm, ONLY : xvchrnk, xvz0cm
94 USE modd_reprod_oper, ONLY : ccharnock
95 !
96 USE mode_thermos
97 USE modi_wind_threshold
98 USE modi_surface_ri
99 !
100 USE yomhook, ONLY : lhook, dr_hook
101 USE parkind1, ONLY : jprb
102 !
103 USE modi_abor1_sfx
104 !
105 IMPLICIT NONE
106 !
107 ! 0.1. Declarations of arguments
108 !
109 REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of wind at atm level (m/s)
110 REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature at atm level (K)
111 REAL, DIMENSION(:), INTENT(IN) :: PQA ! air spec. hum. at atm level (kg/kg)
112 REAL, DIMENSION(:), INTENT(IN) :: PPA ! air pressure at atm level (Pa)
113 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density at atm level (kg/m3)
114 REAL, DIMENSION(:), INTENT(IN) :: PEXNA ! Exner function at atm level
115 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! atm level for wind (m)
116 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! atm level for temp./hum. (m)
117 REAL, DIMENSION(:), INTENT(IN) :: PSSS ! Sea Surface Salinity (g/kg)
118 REAL, DIMENSION(:), INTENT(IN) :: PPS ! air pressure at sea surface (Pa)
119 REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! Exner function at sea surface
120 REAL, DIMENSION(:), INTENT(IN) :: PPERTFLUX ! stochastic flux perturbation pattern
121 ! for correction
122 REAL, INTENT(IN) :: PICHCE !
123 LOGICAL, INTENT(IN) :: OPRECIP !
124 LOGICAL, INTENT(IN) :: OPWEBB !
125 LOGICAL, INTENT(IN) :: OPERTFLUX
126 REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! precipitation rate (kg/s/m2)
127 !
128 INTEGER, INTENT(IN) :: KZ0
129 !
130 REAL, DIMENSION(:), INTENT(INOUT) :: PSST ! Sea Surface Temperature (K)
131 REAL, DIMENSION(:), INTENT(INOUT) :: PZ0SEA ! roughness length over sea
132 REAL, DIMENSION(:), INTENT(OUT) :: PZ0HSEA ! heat roughness length over sea
133 
134 ! surface fluxes : latent heat, sensible heat, friction fluxes
135 REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR ! friction velocity (m/s)
136 REAL, DIMENSION(:), INTENT(OUT) :: PSFTH ! heat flux (W/m2)
137 REAL, DIMENSION(:), INTENT(OUT) :: PSFTQ ! water flux (kg/m2/s)
138 
139 ! diagnostics
140 REAL, DIMENSION(:), INTENT(OUT) :: PQSAT ! sea surface spec. hum. (kg/kg)
141 REAL, DIMENSION(:), INTENT(OUT) :: PCD ! transfer coef. for momentum
142 REAL, DIMENSION(:), INTENT(OUT) :: PCH ! transfer coef. for temperature
143 REAL, DIMENSION(:), INTENT(OUT) :: PCE ! transfer coef. for humidity
144 REAL, DIMENSION(:), INTENT(OUT) :: PCDN ! neutral coef. for momentum
145 REAL, DIMENSION(:), INTENT(OUT) :: PRI ! Richardson number
146 REAL, DIMENSION(:), INTENT(OUT) :: PRESA ! aerodynamical resistance
147 !
148 ! 0.2. Declarations of local variables
149 !
150 ! specif SB
151 INTEGER, DIMENSION(SIZE(PTA)) :: JCV ! convergence index
152 INTEGER, DIMENSION(SIZE(PTA)) :: JITER ! nb of iterations to converge
153 
154 REAL, DIMENSION(SIZE(PTA)) :: ZTAU ! momentum flux (N/m2)
155 REAL, DIMENSION(SIZE(PTA)) :: ZHF ! sensible heat flux (W/m2)
156 REAL, DIMENSION(SIZE(PTA)) :: ZEF ! latent heat flux (W/m2)
157 REAL, DIMENSION(SIZE(PTA)) :: ZTAUR ! momentum flx due to rain (N/m2)
158 REAL, DIMENSION(SIZE(PTA)) :: ZRF ! sensible flx due to rain (W/m2)
159 REAL, DIMENSION(SIZE(PTA)) :: ZEFWEBB ! Webb corr. on latent flx (W/m2)
160 
161 REAL, DIMENSION(SIZE(PTA)) :: ZVMOD ! wind intensity at atm level (m/s)
162 REAL, DIMENSION(SIZE(PTA)) :: ZQSATA ! sat.spec.hum. at atm level (kg/kg)
163 REAL, DIMENSION(SIZE(PTA)) :: ZLVA ! vap.heat of pure water at atm level (J/kg)
164 REAL, DIMENSION(SIZE(PTA)) :: ZLVS ! vap.heat of seawater at sea surface (J/kg)
165 REAL, DIMENSION(SIZE(PTA)) :: ZCPA ! specif.heat moist air (J/kg/K)
166 REAL, DIMENSION(SIZE(PTA)) :: ZVISA ! kinemat.visc. of dry air (m2/s)
167 REAL, DIMENSION(SIZE(PTA)) :: ZDU ! U vert.grad. (real atm)
168 REAL, DIMENSION(SIZE(PTA)) :: ZDT,ZDQ ! T,Q vert.grad. (real atm)
169 REAL, DIMENSION(SIZE(PTA)) :: ZDDU ! U vert.grad. (real atm + gust)
170 REAL, DIMENSION(SIZE(PTA)) :: ZDDT,ZDDQ ! T,Q vert.grad. (real atm + WL/CS)
171 REAL, DIMENSION(SIZE(PTA)) :: ZUSR ! velocity scaling param. (m/s)
172  ! =friction velocity
173 REAL, DIMENSION(SIZE(PTA)) :: ZTSR ! temperature scaling param. (K)
174 REAL, DIMENSION(SIZE(PTA)) :: ZQSR ! humidity scaling param. (kg/kg)
175 REAL, DIMENSION(SIZE(PTA)) :: ZDELTAU10N,ZDELTAT10N,ZDELTAQ10N
176  ! U,T,Q vert.grad. (10m, neutral atm)
177 REAL, DIMENSION(SIZE(PTA)) :: ZUSR0,ZTSR0,ZQSR0 ! ITERATIVE PROCESS
178 REAL, DIMENSION(SIZE(PTA)) :: ZDUSTO,ZDTSTO,ZDQSTO ! ITERATIVE PROCESS
179 REAL, DIMENSION(SIZE(PTA)) :: ZPSIU,ZPSIT! PSI funct for U, T/Q (Z0 comp)
180 REAL, DIMENSION(SIZE(PTA)) :: ZCHARN ! Charnock parameter (Z0 comp)
181 
182 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR2 ! square of friction velocity
183 REAL, DIMENSION(SIZE(PTA)) :: ZAC ! aerodynamical conductance
184 REAL, DIMENSION(SIZE(PTA)) :: ZDIRCOSZW ! orography slope cosine
185  ! (=1 on water!)
186 REAL, DIMENSION(SIZE(PTA)) :: ZPARUN,ZPARTN,ZPARQN ! neutral parameter for U,T,Q
187 REAL, DIMENSION(0:5) :: ZCOEFU,ZCOEFT,ZCOEFQ
188 
189 ! local constants
190 LOGICAL :: OPCVFLX ! to force convergence
191 INTEGER :: NITERMAX ! nb of iterations to get free convergence
192 INTEGER :: NITERSUP ! nb of additional iterations if OPCVFLX=.TRUE.
193 INTEGER :: NITERFL ! maximum number of iterations
194 REAL :: ZETV,ZRDSRV ! thermodynamic constants
195 REAL :: ZSQR3
196 REAL :: ZLMOMIN,ZLMOMAX ! min/max value of Obukhovs stability param. z/l
197 REAL :: ZBTA,ZGMA ! parameters of the stability functions
198 REAL :: ZDUSR0,ZDTSR0,ZDQSR0 ! maximum gap for USR/TSR/QSR between 2 steps
199 REAL :: ZP00 ! [OPRECIP] - water vap. diffusiv.ref.press.(Pa)
200 REAL :: ZUTU,ZUTT,ZUTQ ! U10n threshold in ECUME parameterisation
201 REAL :: ZCDIRU,ZCDIRT,ZCDIRQ ! coef directeur pour fonction affine U,T,Q
202 REAL :: ZORDOU,ZORDOT,ZORDOQ ! ordonnee a l'origine pour fonction affine U,T,Q
203 
204 INTEGER :: JJ ! for ITERATIVE PROCESS
205 INTEGER :: JLON,JK
206 REAL :: ZLMOU,ZLMOT ! Obukhovs param. z/l for U, T/Q
207 REAL :: ZPSI_U,ZPSI_T ! PSI funct. for U, T/Q
208 REAL :: Z0TSEA,Z0QSEA ! roughness length for T, Q
209 REAL :: ZCHIC,ZCHIK,ZPSIC,ZPSIK,ZLOGUS10,ZLOGTS10
210 REAL :: ZTAC,ZCPWA,ZDQSDT,ZDWAT,ZDTMP,ZBULB ! [OPRECIP]
211 REAL :: ZWW ! [OPWEBB]
212 
213 REAL(KIND=JPRB) :: ZHOOK_HANDLE
214 !
215 !-------------------------------------------------------------------------------
216 IF (lhook) CALL dr_hook('ECUMEV6_FLUX',0,zhook_handle)
217 !
218 zdusr0 = 1.e-06
219 zdtsr0 = 1.e-06
220 zdqsr0 = 1.e-09
221 !
222 nitermax = 5
223 nitersup = 5
224 opcvflx = .true.
225 !
226 niterfl = nitermax
227 IF (opcvflx) niterfl = nitermax+nitersup
228 !
229 zcoefu = (/ 1.00e-03, 3.66e-02, -1.92e-03, 2.32e-04, -7.02e-06, 6.40e-08 /)
230 zcoeft = (/ 5.36e-03, 2.90e-02, -1.24e-03, 4.50e-04, -2.06e-05, 0.0 /)
231 zcoefq = (/ 1.00e-03, 3.59e-02, -2.87e-04, 0.0, 0.0, 0.0 /)
232 !
233 zutu = 40.0
234 zutt = 14.4
235 zutq = 10.0
236 !
237 zcdiru = zcoefu(1) + 2.0*zcoefu(2)*zutu + 3.0*zcoefu(3)*zutu**2 &
238  + 4.0*zcoefu(4)*zutu**3 + 5.0*zcoefu(5)*zutu**4
239 zcdirt = zcoeft(1) + 2.0*zcoeft(2)*zutt + 3.0*zcoeft(3)*zutt**2 &
240  + 4.0*zcoeft(4)*zutt**3
241 zcdirq = zcoefq(1) + 2.0*zcoefq(2)*zutq
242 !
243 zordou = zcoefu(0) + zcoefu(1)*zutu + zcoefu(2)*zutu**2 + zcoefu(3)*zutu**3 &
244  + zcoefu(4)*zutu**4 + zcoefu(5)*zutu**5
245 zordot = zcoeft(0) + zcoeft(1)*zutt + zcoeft(2)*zutt**2 + zcoeft(3)*zutt**3 &
246  + zcoeft(4)*zutt**4
247 zordoq = zcoefq(0) + zcoefq(1)*zutq + zcoefq(2)*zutq**2
248 !
249 !-------------------------------------------------------------------------------
250 !
251 ! 1. AUXILIARY CONSTANTS & ARRAY INITIALISATION BY UNDEFINED VALUES.
252 ! --------------------------------------------------------------------
253 !
254 zdircoszw(:) = 1.0
255 !
256 zetv = xrv/xrd-1.0 !~0.61 (cf Liu et al. 1979)
257 zrdsrv = xrd/xrv !~0.622
258 zsqr3 = sqrt(3.0)
259 zlmomin = -200.0
260 zlmomax = 0.25
261 zbta = 16.0
262 zgma = 7.0 !initially =4.7, modified to 7.0 following G. Caniaux
263 !
264 zp00 = 1013.25e+02
265 !
266 pcd(:) = xundef
267 pch(:) = xundef
268 pce(:) = xundef
269 pcdn(:) = xundef
270 zusr(:) = xundef
271 ztsr(:) = xundef
272 zqsr(:) = xundef
273 ztau(:) = xundef
274 zhf(:) = xundef
275 zef(:) = xundef
276 !
277 psfth(:) = xundef
278 psftq(:) = xundef
279 pustar(:) = xundef
280 presa(:) = xundef
281 pri(:) = xundef
282 !
283 ztaur(:) = 0.0
284 zrf(:) = 0.0
285 zefwebb(:) = 0.0
286 !
287 !-------------------------------------------------------------------------------
288 !
289 ! 2. INITIALISATIONS BEFORE ITERATIVE LOOP.
290 ! -------------------------------------------
291 !
292 zvmod(:) = wind_threshold(pvmod(:),puref(:)) !set a minimum value to wind
293 !
294 ! 2.0. Radiative fluxes - For warm layer & cool skin
295 !
296 ! 2.0b. Warm Layer correction
297 !
298 ! 2.1. Specific humidity at saturation
299 !
300 WHERE(psss(:)>0.0.AND.psss(:)/=xundef)
301  pqsat(:) = qsat_seawater2(psst(:),pps(:),psss(:)) !at sea surface
302 ELSEWHERE
303  pqsat(:) = qsat_seawater(psst(:),pps(:)) !at sea surface
304 ENDWHERE
305 zqsata(:) = qsat(pta(:),ppa(:)) !at atm level
306 !
307 ! 2.2. Gradients at the air-sea interface
308 !
309 zdu(:) = zvmod(:) !one assumes u is measured / sea surface current
310 zdt(:) = pta(:)/pexna(:)-psst(:)/pexns(:)
311 zdq(:) = pqa(:)-pqsat(:)
312 !
313 ! 2.3. Latent heat of vaporisation
314 !
315 zlva(:) = xlvtt+(xcpv-xcl)*(pta(:)-xtt) !of pure water at atm level
316 zlvs(:) = xlvtt+(xcpv-xcl)*(psst(:)-xtt) !of pure water at sea surface
317 WHERE(psss(:)>0.0.AND.psss(:)/=xundef)
318  zlvs(:) = zlvs(:)*(1.0-1.00472e-3*psss(:)) !of seawater at sea surface
319 ENDWHERE
320 !
321 ! 2.4. Specific heat of moist air (Businger 1982)
322 !
323 !ZCPA(:) = XCPD*(1.0+(XCPV/XCPD-1.0)*PQA(:))
324 zcpa(:) = xcpd
325 !
326 ! 2.4b Kinematic viscosity of dry air (Andreas 1989, CRREL Rep. 89-11)
327 !
328 zvisa(:) = 1.326e-05*(1.0+6.542e-03*(pta(:)-xtt)+8.301e-06*(pta(:)-xtt)**2 &
329  -4.84e-09*(pta(:)-xtt)**3)
330 !
331 ! 2.4c Coefficients for warm layer and/or cool skin correction
332 !
333 ! 2.5. Initial guess
334 !
335 zddu(:) = zdu(:)
336 zddt(:) = zdt(:)
337 zddq(:) = zdq(:)
338 zddu(:) = sign(max(abs(zddu(:)),10.0*zdusr0),zddu(:))
339 zddt(:) = sign(max(abs(zddt(:)),10.0*zdtsr0),zddt(:))
340 zddq(:) = sign(max(abs(zddq(:)),10.0*zdqsr0),zddq(:))
341 !
342 jcv(:) = -1
343 zusr(:) = 0.04*zddu(:)
344 ztsr(:) = 0.04*zddt(:)
345 zqsr(:) = 0.04*zddq(:)
346 zdeltau10n(:) = zddu(:)
347 zdeltat10n(:) = zddt(:)
348 zdeltaq10n(:) = zddq(:)
349 jiter(:) = 99
350 !
351 ! In the following, we suppose that Richardson number PRI < XRIMAX
352 ! If not true, Monin-Obukhov theory can't (and therefore shouldn't) be applied !
353 !-------------------------------------------------------------------------------
354 !
355 ! 3. ITERATIVE LOOP TO COMPUTE U*, T*, Q*.
356 ! ------------------------------------------
357 !
358 DO jj=1,niterfl
359  DO jlon=1,SIZE(pta)
360 !
361  IF (jcv(jlon) == -1) THEN
362  zusr0(jlon)=zusr(jlon)
363  ztsr0(jlon)=ztsr(jlon)
364  zqsr0(jlon)=zqsr(jlon)
365  IF (jj == nitermax+1 .OR. jj == nitermax+nitersup) THEN
366  zdeltau10n(jlon) = 0.5*(zdusto(jlon)+zdeltau10n(jlon)) !forced convergence
367  zdeltat10n(jlon) = 0.5*(zdtsto(jlon)+zdeltat10n(jlon))
368  zdeltaq10n(jlon) = 0.5*(zdqsto(jlon)+zdeltaq10n(jlon))
369  IF (jj == nitermax+nitersup) jcv(jlon)=3
370  ENDIF
371  zdusto(jlon) = zdeltau10n(jlon)
372  zdtsto(jlon) = zdeltat10n(jlon)
373  zdqsto(jlon) = zdeltaq10n(jlon)
374 !
375 ! 3.1. Neutral parameter for wind speed (ECUME_V6 formulation)
376 !
377  IF (zdeltau10n(jlon) <= zutu) THEN
378  zparun(jlon) = zcoefu(0) + zcoefu(1)*zdeltau10n(jlon) &
379  + zcoefu(2)*zdeltau10n(jlon)**2 &
380  + zcoefu(3)*zdeltau10n(jlon)**3 &
381  + zcoefu(4)*zdeltau10n(jlon)**4 &
382  + zcoefu(5)*zdeltau10n(jlon)**5
383  ELSE
384  zparun(jlon) = zcdiru*(zdeltau10n(jlon)-zutu) + zordou
385  ENDIF
386  pcdn(jlon) = (zparun(jlon)/zdeltau10n(jlon))**2
387 !
388 ! 3.2. Neutral parameter for temperature (ECUME_V6 formulation)
389 !
390  IF (zdeltau10n(jlon) <= zutt) THEN
391  zpartn(jlon) = zcoeft(0) + zcoeft(1)*zdeltau10n(jlon) &
392  + zcoeft(2)*zdeltau10n(jlon)**2 &
393  + zcoeft(3)*zdeltau10n(jlon)**3 &
394  + zcoeft(4)*zdeltau10n(jlon)**4
395  ELSE
396  zpartn(jlon) = zcdirt*(zdeltau10n(jlon)-zutt) + zordot
397  ENDIF
398 !
399 ! 3.3. Neutral parameter for humidity (ECUME_V6 formulation)
400 !
401  IF (zdeltau10n(jlon) <= zutq) THEN
402  zparqn(jlon) = zcoefq(0) + zcoefq(1)*zdeltau10n(jlon) &
403  + zcoefq(2)*zdeltau10n(jlon)**2
404  ELSE
405  zparqn(jlon) = zcdirq*(zdeltau10n(jlon)-zutq) + zordoq
406  ENDIF
407 !
408 ! 3.4. Scaling parameters U*, T*, Q*
409 !
410  zusr(jlon) = zparun(jlon)
411  ztsr(jlon) = zpartn(jlon)*zdeltat10n(jlon)/zdeltau10n(jlon)
412  zqsr(jlon) = zparqn(jlon)*zdeltaq10n(jlon)/zdeltau10n(jlon)
413 !
414 ! 3.4b Gustiness factor (Deardorff 1970)
415 !
416 ! 3.4c Cool skin correction
417 !
418 ! 3.5. Obukhovs stability param. z/l following Liu et al. (JAS, 1979)
419 !
420 ! For U
421  zlmou = puref(jlon)*xg*xkarman*(ztsr(jlon)/pta(jlon) &
422  +zetv*zqsr(jlon)/(1.0+zetv*pqa(jlon)))/zusr(jlon)**2
423 ! For T/Q
424  zlmot = zlmou*(pzref(jlon)/puref(jlon))
425  zlmou = max(min(zlmou,zlmomax),zlmomin)
426  zlmot = max(min(zlmot,zlmomax),zlmomin)
427 !
428 ! 3.6. Stability function psi (see Liu et al, 1979 ; Dyer and Hicks, 1970)
429 ! Modified to include convective form following Fairall (unpublished)
430 !
431 ! For U
432  IF (zlmou == 0.0) THEN
433  zpsi_u = 0.0
434  ELSEIF (zlmou > 0.0) THEN
435  zpsi_u = -zgma*zlmou
436  ELSE
437  zchik = (1.0-zbta*zlmou)**0.25
438  zpsik = 2.0*log((1.0+zchik)/2.0) &
439  +log((1.0+zchik**2)/2.0) &
440  -2.0*atan(zchik)+0.5*xpi
441  zchic = (1.0-12.87*zlmou)**(1.0/3.0) !for very unstable conditions
442  zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
443  -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
444  +xpi/zsqr3
445  zpsi_u = zpsic+(zpsik-zpsic)/(1.0+zlmou**2) !match Kansas & free-conv. forms
446  ENDIF
447  zpsiu(jlon) = zpsi_u
448 ! For T/Q
449  IF (zlmot == 0.0) THEN
450  zpsi_t = 0.0
451  ELSEIF (zlmot > 0.0) THEN
452  zpsi_t = -zgma*zlmot
453  ELSE
454  zchik = (1.0-zbta*zlmot)**0.25
455  zpsik = 2.0*log((1.0+zchik**2)/2.0)
456  zchic = (1.0-12.87*zlmot)**(1.0/3.0) !for very unstable conditions
457  zpsic = 1.5*log((zchic**2+zchic+1.0)/3.0) &
458  -zsqr3*atan((2.0*zchic+1.0)/zsqr3) &
459  +xpi/zsqr3
460  zpsi_t = zpsic+(zpsik-zpsic)/(1.0+zlmot**2) !match Kansas & free-conv. forms
461  ENDIF
462  zpsit(jlon) = zpsi_t
463 !
464 ! 3.7. Update air-sea gradients
465 !
466  zddu(jlon) = zdu(jlon)
467  zddt(jlon) = zdt(jlon)
468  zddq(jlon) = zdq(jlon)
469  zddu(jlon) = sign(max(abs(zddu(jlon)),10.0*zdusr0),zddu(jlon))
470  zddt(jlon) = sign(max(abs(zddt(jlon)),10.0*zdtsr0),zddt(jlon))
471  zddq(jlon) = sign(max(abs(zddq(jlon)),10.0*zdqsr0),zddq(jlon))
472  zlogus10 = log(puref(jlon)/10.0)
473  zlogts10 = log(pzref(jlon)/10.0)
474  zdeltau10n(jlon) = zddu(jlon)-zusr(jlon)*(zlogus10-zpsi_u)/xkarman
475  zdeltat10n(jlon) = zddt(jlon)-ztsr(jlon)*(zlogts10-zpsi_t)/xkarman
476  zdeltaq10n(jlon) = zddq(jlon)-zqsr(jlon)*(zlogts10-zpsi_t)/xkarman
477  zdeltau10n(jlon) = sign(max(abs(zdeltau10n(jlon)),10.0*zdusr0), &
478  zdeltau10n(jlon))
479  zdeltat10n(jlon) = sign(max(abs(zdeltat10n(jlon)),10.0*zdtsr0), &
480  zdeltat10n(jlon))
481  zdeltaq10n(jlon) = sign(max(abs(zdeltaq10n(jlon)),10.0*zdqsr0), &
482  zdeltaq10n(jlon))
483 !
484 ! 3.8. Test convergence for U*, T*, Q*
485 !
486  IF (abs(zusr(jlon)-zusr0(jlon)) < zdusr0 .AND. &
487  abs(ztsr(jlon)-ztsr0(jlon)) < zdtsr0 .AND. &
488  abs(zqsr(jlon)-zqsr0(jlon)) < zdqsr0) THEN
489  jcv(jlon) = 1 !free convergence
490  IF (jj >= nitermax+1) jcv(jlon) = 2 !leaded convergence
491  ENDIF
492  jiter(jlon) = jj
493  ENDIF
494 !
495  ENDDO
496 ENDDO
497 !
498 !-------------------------------------------------------------------------------
499 !
500 ! 4. COMPUTATION OF TURBULENT FLUXES AND EXCHANGE COEFFICIENTS.
501 ! ---------------------------------------------------------------
502 !
503 DO jlon=1,SIZE(pta)
504 !
505 ! 4.1. Surface turbulent fluxes
506 ! (ATM CONV.: ZTAU<<0 ; ZHF,ZEF<0 if atm looses heat)
507 !
508  ztau(jlon) = -prhoa(jlon)*zusr(jlon)**2
509  zhf(jlon) = -prhoa(jlon)*zcpa(jlon)*zusr(jlon)*ztsr(jlon)
510  zef(jlon) = -prhoa(jlon)*zlvs(jlon)*zusr(jlon)*zqsr(jlon)
511 !
512 ! 4.2. Exchange coefficients PCD, PCH, PCE
513 !
514  pcd(jlon) = (zusr(jlon)/zddu(jlon))**2
515  pch(jlon) = (zusr(jlon)*ztsr(jlon))/(zddu(jlon)*zddt(jlon))
516  pce(jlon) = (zusr(jlon)*zqsr(jlon))/(zddu(jlon)*zddq(jlon))
517 !
518 ! 4.3. Stochastic perturbation of turbulent fluxes
519 !
520  IF( opertflux )THEN
521  ztau(jlon) = ztau(jlon)* ( 1. + ppertflux(jlon) / 2. )
522  zhf(jlon) = zhf(jlon)* ( 1. + ppertflux(jlon) / 2. )
523  zef(jlon) = zef(jlon)* ( 1. + ppertflux(jlon) / 2. )
524  ENDIF
525 !
526 ENDDO
527 !
528 !-------------------------------------------------------------------------------
529 !
530 ! 5. COMPUTATION OF FLUX CORRECTIONS DUE TO RAINFALL.
531 ! (ATM conv: ZRF<0 if atm. looses heat, ZTAUR<<0)
532 ! -----------------------------------------------------
533 !
534 IF (oprecip) THEN
535  DO jlon=1,SIZE(pta)
536 !
537 ! 5.1. Momentum flux due to rainfall (ZTAUR, N/m2)
538 !
539 ! See pp3752 in FBR96.
540  ztaur(jlon) = -0.85*prain(jlon)*pvmod(jlon)
541 !
542 ! 5.2. Sensible heat flux due to rainfall (ZRF, W/m2)
543 !
544 ! See Eq.12 in GoF95 with ZCPWA as specific heat of water at atm level (J/kg/K),
545 ! ZDQSDT from Clausius-Clapeyron relation, ZDWAT as water vapor diffusivity
546 ! (Eq.13-3 of Pruppacher and Klett, 1978), ZDTMP as heat diffusivity, and ZBULB
547 ! as wet-bulb factor (Eq.11 in GoF95).
548 !
549  ztac = pta(jlon)-xtt
550  zcpwa = 4217.51 -3.65566*ztac +0.1381*ztac**2 &
551  -2.8309e-03*ztac**3 +3.42061e-05*ztac**4 &
552  -2.18107e-07*ztac**5 +5.74535e-10*ztac**6
553  zdqsdt = (zlva(jlon)*zqsata(jlon))/(xrv*pta(jlon)**2)
554  zdwat = 2.11e-05*(zp00/ppa(jlon))*(pta(jlon)/xtt)**1.94
555  zdtmp = (1.0+3.309e-03*ztac-1.44e-06*ztac**2) &
556  *0.02411/(prhoa(jlon)*zcpa(jlon))
557  zbulb = 1.0/(1.0+zdqsdt*(zlva(jlon)*zdwat)/(zcpa(jlon)*zdtmp))
558  zrf(jlon) = prain(jlon)*zcpwa*zbulb*((psst(jlon)-pta(jlon)) &
559  +(pqsat(jlon)-pqa(jlon))*(zlva(jlon)*zdwat)/(zcpa(jlon)*zdtmp))
560 !
561  ENDDO
562 ENDIF
563 !
564 !-------------------------------------------------------------------------------
565 !
566 ! 6. COMPUTATION OF WEBB CORRECTION TO LATENT HEAT FLUX (ZEFWEBB, W/m2).
567 ! ------------------------------------------------------------------------
568 !
569 ! See Eq.21 and Eq.22 in FBR96.
570 IF (opwebb) THEN
571  DO jlon=1,SIZE(pta)
572  zww = (1.0+zetv)*(zusr(jlon)*zqsr(jlon)) &
573  +(1.0+(1.0+zetv)*pqa(jlon))*(zusr(jlon)*ztsr(jlon))/pta(jlon)
574  zefwebb(jlon) = -prhoa(jlon)*zlvs(jlon)*zww*pqa(jlon)
575  ENDDO
576 ENDIF
577 !
578 !-------------------------------------------------------------------------------
579 !
580 ! 7. FINAL STEP : TOTAL SURFACE FLUXES AND DERIVED DIAGNOSTICS.
581 ! ---------------------------------------------------------------
582 !
583 ! 7.1. Richardson number
584 !
585  CALL surface_ri(psst,pqsat,pexns,pexna,pta,pqa, &
586  pzref,puref,zdircoszw,pvmod,pri)
587 !
588 ! 7.2. Friction velocity which contains correction due to rain
589 !
590 zustar2(:) = -(ztau(:)+ztaur(:))/prhoa(:)
591 !
592 IF (oprecip) THEN
593  pcd(:) = zustar2(:)/zddu(:)**2
594 ENDIF
595 !
596 pustar(:) = sqrt(zustar2(:))
597 !
598 ! 7.3. Aerodynamical conductance and resistance
599 !
600 zac(:) = pch(:)*zddu(:)
601 presa(:) = 1.0/zac(:)
602 !
603 ! 7.4. Total surface fluxes
604 !
605 psfth(:) = zhf(:)+zrf(:)
606 psftq(:) = (zef(:)+zefwebb(:))/zlvs(:)
607 !
608 ! 7.5. Charnock number
609 !
610 IF (ccharnock == 'OLD') THEN
611  zcharn(:) = xvchrnk
612 ELSE !modified for moderate wind speed as in COARE3.0
613  zcharn(:) = min(0.018,max(0.011,0.011+(0.007/8.0)*(zddu(:)-10.0)))
614 ENDIF
615 !
616 ! 7.6. Roughness lengths Z0 and Z0H over sea
617 !
618 IF (kz0 == 0) THEN ! ARPEGE formulation
619  pz0sea(:) = (zcharn(:)/xg)*zustar2(:) + xvz0cm*pcd(:)/pcdn(:)
620  pz0hsea(:) = pz0sea(:)
621 ELSEIF (kz0 == 1) THEN ! Smith (1988) formulation
622  pz0sea(:) = (zcharn(:)/xg)*zustar2(:) + 0.11*zvisa(:)/pustar(:)
623  pz0hsea(:) = pz0sea(:)
624 ELSEIF (kz0 == 2) THEN ! Direct computation using the stability functions
625  DO jlon=1,SIZE(pta)
626  pz0sea(jlon) = puref(jlon)/exp(xkarman*zddu(jlon)/pustar(jlon)+zpsiu(jlon))
627  z0tsea = pzref(jlon)/exp(xkarman*zddt(jlon)/ztsr(jlon)+zpsit(jlon))
628  z0qsea = pzref(jlon)/exp(xkarman*zddq(jlon)/zqsr(jlon)+zpsit(jlon))
629  pz0hsea(jlon) = 0.5*(z0tsea+z0qsea)
630  ENDDO
631 ENDIF
632 !
633 !
634 IF (lhook) CALL dr_hook('ECUMEV6_FLUX',1,zhook_handle)
635 !
636 !-------------------------------------------------------------------------------
637  END SUBROUTINE ecumev6_flux
real, save xcpd
Definition: modd_csts.F90:63
real function, dimension(size(pwind)) wind_threshold(PWIND, PUREF)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
Definition: surface_ri.F90:8
character(len=3) ccharnock
real, save xstefan
Definition: modd_csts.F90:59
real, save xlvtt
Definition: modd_csts.F90:70
real, save xpi
Definition: modd_csts.F90:43
subroutine ecumev6_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PSSS, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PPA, PICHCE, OPRECIP, OPWEBB, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, KZ0, PZ0HSEA, OPERTFLUX, PPERTFLUX)
real, save xkarman
Definition: modd_csts.F90:48
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
real, save xrv
Definition: modd_csts.F90:62
real, save xcpv
Definition: modd_csts.F90:63
real, save xday
Definition: modd_csts.F90:45
real, save xcl
Definition: modd_csts.F90:65
logical lhook
Definition: yomhook.F90:15
real, save xtt
Definition: modd_csts.F90:66
real, save xp00
Definition: modd_csts.F90:57