SURFEX v8.1
General documentation of Surfex
coupling_seafluxn.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 coupling_seaflux_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, &
7  HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, &
8  KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, &
9  PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, &
10  PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, &
11  PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, &
12  PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, &
13  PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST )
14 ! ###############################################################################
15 !
16 !!**** *COUPLING_SEAFLUX_n * - Driver of the WATER_FLUX scheme for sea
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 !!** METHOD
22 !! ------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! V. Masson
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 01/2004
35 !! Modified 01/2006 : sea flux parameterization.
36 !! Modified 09/2006 : P. Tulet Introduce Sea salt aerosol Emission/Deposition
37 !! Modified 03/2009 : B. Decharme SST could change during a run => ALB and EMIS
38 !! Modified 05/2009 : V. Masson : implicitation of momentum fluxes
39 !! Modified 09/2009 : B. Decharme Radiative properties at time t+1
40 !! Modified 01/2010 : B. Decharme Add XTTS
41 !! Modified 09/2012 : B. Decharme New wind implicitation
42 !! Modified 10/2012 : P. Le Moigne CMO1D update
43 !! Modified 04/2013 : P. Le Moigne Wind implicitation and SST update displaced
44 !! Modified 04/2013 : B. Decharme new coupling variables
45 !! Modified 01/2014 : S. Senesi : handle sea-ice cover, sea-ice model interface,
46 !! and apply to Gelato
47 !! Modified 01/2014 : S. Belamari Remove MODE_THERMOS and XLVTT
48 !! Modified 05/2014 : S. Belamari New ECUME : Include salinity & atm. pressure impact
49 !! Modified 01/2015 : R. Séférian interactive ocaen surface albedo
50 !!
51 !!---------------------------------------------------------------------
52 !
53 !
56 USE modd_surfex_n, ONLY : seaflux_diag_t
57 USE modd_ocean_n, ONLY : ocean_t
58 USE modd_ocean_rel_n, ONLY : ocean_rel_t
59 USE modd_sfx_grid_n, ONLY : grid_t
60 USE modd_seaflux_n, ONLY : seaflux_t
61 !
62 USE modd_dst_n, ONLY : dst_t
63 USE modd_slt_n, ONLY : slt_t
64 !
66 !
67 USE modd_csts, ONLY : xrd, xcpd, xp00, xtt, xtts, xttsi, xday
68 USE modd_surf_par, ONLY : xundef
71 !
72 USE modd_water_par, ONLY : xalbseaice
73 !
74 !
75 USE modi_water_flux
76 USE modi_mr98
77 USE modi_ecume_seaflux
78 USE modi_coare30_seaflux
79 USE modi_add_forecast_to_date_surf
80 USE modi_mod1d_n
81 USE modi_diag_inline_seaflux_n
82 USE modi_ch_aer_dep
83 USE modi_ch_dep_water
84 USE modi_dslt_dep
85 USE modi_sst_update
86 USE modi_interpol_sst_mth
87 USE modi_update_rad_sea
88 !
90 USE modd_dst_surf
91 USE modd_slt_surf
92 !
93 USE modd_ocean_grid, ONLY : nockmin
94 !
95 USE yomhook ,ONLY : lhook, dr_hook
96 USE parkind1 ,ONLY : jprb
97 !
98 USE modi_abor1_sfx
99 !
100 USE modi_coupling_iceflux_n
101 USE modi_seaice_gelato1d_n
102 !
103 USE modi_coupling_slt_n
104 !
105 IMPLICIT NONE
106 !
107 !* 0.1 declarations of arguments
108 !
109 !
110 TYPE(ch_seaflux_t), INTENT(INOUT) :: CHS
111 TYPE(data_seaflux_t), INTENT(INOUT) :: DTS
112 TYPE(seaflux_diag_t), INTENT(INOUT) :: DGS
113 TYPE(ocean_t), INTENT(INOUT) :: O
114 TYPE(ocean_rel_t), INTENT(INOUT) :: OR
115 TYPE(grid_t), INTENT(INOUT) :: G
116 TYPE(seaflux_t), INTENT(INOUT) :: S
117 TYPE(dst_t), INTENT(INOUT) :: DST
118 TYPE(slt_t), INTENT(INOUT) :: SLT
119 !
120  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
121  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
122  ! 'E' : explicit
123  ! 'I' : implicit
124 REAL, INTENT(IN) :: PTIMEC ! current duration since start of the run (s)
125 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
126 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
127 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
128 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
129 INTEGER, INTENT(IN) :: KI ! number of points
130 INTEGER, INTENT(IN) :: KSV ! number of scalars
131 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
132 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
133 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
134 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
135 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
136 !
137 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
138 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
139 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
140 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
141 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
142 ! !
143  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
144 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
145 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
146 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
147 ! ! (W/m2)
148 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
149 ! ! (W/m2)
150 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
151 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical)
152 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1(radian from the vertical)
153 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
154 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
155 ! ! (W/m2)
156 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
157 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
158 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
159 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
160 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
161 !
162 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
163 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
164 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
165 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
166 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
167 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
168 !
169 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
170 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
171 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
172 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
173 !
174 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
175 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
176 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
177 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
178 !
179 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients (m2s/kg)
180 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I' (m/s)
181 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
182 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
183 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
184 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
185  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
186 !
187 !* 0.2 declarations of local variables
188 !
189 REAL, DIMENSION(KI,KSW) :: ZDIR_ALB ! Direct albedo at time t
190 REAL, DIMENSION(KI,KSW) :: ZSCA_ALB ! Diffuse albedo at time t
191 !
192 REAL, DIMENSION(KI) :: ZEXNA ! Exner function at forcing level
193 REAL, DIMENSION(KI) :: ZEXNS ! Exner function at surface level
194 REAL, DIMENSION(KI) :: ZU ! zonal wind
195 REAL, DIMENSION(KI) :: ZV ! meridian wind
196 REAL, DIMENSION(KI) :: ZWIND ! Wind
197 REAL, DIMENSION(KI) :: ZCD ! Drag coefficient on open sea
198 REAL, DIMENSION(KI) :: ZCD_ICE ! " " on seaice
199 REAL, DIMENSION(KI) :: ZCDN ! Neutral Drag coefficient on open sea
200 REAL, DIMENSION(KI) :: ZCDN_ICE ! " " on seaice
201 REAL, DIMENSION(KI) :: ZCH ! Heat transfer coefficient on open sea
202 REAL, DIMENSION(KI) :: ZCH_ICE ! " " on seaice
203 REAL, DIMENSION(KI) :: ZCE ! Vaporization heat transfer coefficient on open sea
204 REAL, DIMENSION(KI) :: ZCE_ICE ! " " on seaice
205 REAL, DIMENSION(KI) :: ZRI ! Richardson number on open sea
206 REAL, DIMENSION(KI) :: ZRI_ICE ! " " on seaice
207 REAL, DIMENSION(KI) :: ZRESA_SEA ! aerodynamical resistance on open sea
208 REAL, DIMENSION(KI) :: ZRESA_SEA_ICE ! " " on seaice
209 REAL, DIMENSION(KI) :: ZUSTAR ! friction velocity (m/s) on open sea
210 REAL, DIMENSION(KI) :: ZUSTAR_ICE ! " " on seaice
211 REAL, DIMENSION(KI) :: ZZ0 ! roughness length over open sea
212 REAL, DIMENSION(KI) :: ZZ0_ICE ! roughness length over seaice
213 REAL, DIMENSION(KI) :: ZZ0H ! heat roughness length over open sea
214 REAL, DIMENSION(KI) :: ZZ0H_ICE ! heat roughness length over seaice
215 REAL, DIMENSION(KI) :: ZZ0W ! Work array for Z0 and Z0H computation
216 REAL, DIMENSION(KI) :: ZQSAT ! humidity at saturation on open sea
217 REAL, DIMENSION(KI) :: ZQSAT_ICE ! " " on seaice
218 !
219 REAL, DIMENSION(KI) :: ZSFTH ! Heat flux for open sea (and for sea-ice points if merged)
220 REAL, DIMENSION(KI) :: ZSFTQ ! Water vapor flux on open sea (and for sea-ice points if merged)
221 REAL, DIMENSION(KI) :: ZSFU ! zonal momentum flux on open sea (and for sea-ice points if merged)(Pa)
222 REAL, DIMENSION(KI) :: ZSFV ! meridional momentum flux on open sea (and for sea-ice points if merged)(Pa)
223 !
224 REAL, DIMENSION(KI) :: ZSFTH_ICE ! Heat flux on sea ice
225 REAL, DIMENSION(KI) :: ZSFTQ_ICE ! Sea-ice sublimation flux
226 REAL, DIMENSION(KI) :: ZSFU_ICE ! zonal momentum flux on seaice (Pa)
227 REAL, DIMENSION(KI) :: ZSFV_ICE ! meridional momentum flux on seaice (Pa)
228 
229 REAL, DIMENSION(KI) :: ZHU ! Near surface relative humidity
230 REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg)
231 REAL, DIMENSION(KI) :: ZEMIS ! Emissivity at time t
232 REAL, DIMENSION(KI) :: ZTRAD ! Radiative temperature at time t
233 !
234 REAL, DIMENSION(KI) :: ZSST ! XSST corrected for anomalously low values (which actually are sea-ice temp)
235 REAL, DIMENSION(KI) :: ZMASK ! A mask for diagnosing where seaice exists (or, for coupling_iceflux, may appear)
236 !
237 REAL :: ZCONVERTFACM0_SLT, ZCONVERTFACM0_DST
238 REAL :: ZCONVERTFACM3_SLT, ZCONVERTFACM3_DST
239 REAL :: ZCONVERTFACM6_SLT, ZCONVERTFACM6_DST
240 !
241 INTEGER :: ISIZE_WATER ! number of points with some sea water
242 INTEGER :: ISIZE_ICE ! number of points with some sea ice
243 !
244 INTEGER :: ISWB ! number of shortwave spectral bands
245 INTEGER :: JSWB ! loop counter on shortwave spectral bands
246 INTEGER :: ISLT ! number of sea salt variable
247 !
248 INTEGER :: IBEG, IEND
249 !
250 REAL(KIND=JPRB) :: ZHOOK_HANDLE
251 !-------------------------------------------------------------------------------------
252 ! Preliminaries:
253 !-------------------------------------------------------------------------------------
254 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N',0,zhook_handle)
255 IF (htest/='OK') THEN
256  CALL abor1_sfx('COUPLING_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER')
257 END IF
258 !-------------------------------------------------------------------------------------
259 !
260 zexna(:) = xundef
261 zexns(:) = xundef
262 zu(:) = xundef
263 zv(:) = xundef
264 zwind(:) = xundef
265 zsftq(:) = xundef
266 zsfth(:) = xundef
267 zcd(:) = xundef
268 zcdn(:) = xundef
269 zch(:) = xundef
270 zce(:) = xundef
271 zri(:) = xundef
272 zhu(:) = xundef
273 zresa_sea(:) = xundef
274 zustar(:) = xundef
275 zz0(:) = xundef
276 zz0h(:) = xundef
277 zqsat(:) = xundef
278 !
279 zsftq_ice(:) = xundef
280 zsfth_ice(:) = xundef
281 zcd_ice(:) = xundef
282 zcdn_ice(:) = xundef
283 zch_ice(:) = xundef
284 zce_ice(:) = xundef
285 zri_ice(:) = xundef
286 zresa_sea_ice= xundef
287 zustar_ice(:) = xundef
288 zz0_ice(:) = xundef
289 zz0h_ice(:) = xundef
290 zqsat_ice(:) = xundef
291 !
292 zemis(:) = xundef
293 ztrad(:) = xundef
294 zdir_alb(:,:) = xundef
295 zsca_alb(:,:) = xundef
296 !
297 !-------------------------------------------------------------------------------------
298 !
299 zexns(:) = (pps(:)/xp00)**(xrd/xcpd)
300 zexna(:) = (ppa(:)/xp00)**(xrd/xcpd)
301 !
302 IF(lcpl_sea)THEN
303  !Sea currents are taken into account
304  zu(:)=pu(:)-s%XUMER(:)
305  zv(:)=pv(:)-s%XVMER(:)
306 ELSE
307  zu(:)=pu(:)
308  zv(:)=pv(:)
309 ENDIF
310 !
311 zwind(:) = sqrt(zu(:)**2+zv(:)**2)
312 !
313 psfts(:,:) = 0.
314 !
315 zhu = 1.
316 !
317 zqa(:) = pqa(:) / prhoa(:)
318 !
319 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
320 ! Time evolution
321 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
322 !
323 s%TTIME%TIME = s%TTIME%TIME + ptstep
324  CALL add_forecast_to_date_surf(s%TTIME%TDATE%YEAR,s%TTIME%TDATE%MONTH,s%TTIME%TDATE%DAY,s%TTIME%TIME)
325 !
326 !--------------------------------------------------------------------------------------
327 ! Fluxes over water according to Charnock formulae
328 !--------------------------------------------------------------------------------------
329 !
330 IF (s%LHANDLE_SIC) THEN
331  ! Flux for sea are computed everywhere
332  isize_water = SIZE(zmask)
333  ! Ensure freezing SST values where XSST actually has very low (sea-ice) values (old habits)
334  zsst(:)=max(s%XSST(:), xttsi)
335  ! Flux over sea-ice will not be computed by next calls, but by coupling_iceflux. Hence :
336  isize_ice = 0
337  ! Flux over sea-ice will be computed by coupling_iceflux anywhere sea-ice could form in one
338  ! time-step (incl. under forcing). ZMASK value is set to 1. on these points
339  zmask(:)=0.
340  WHERE ( s%XSIC(:) > 0. ) zmask(:)=1.
341  ! To be large, assume that seaice may form where SST is < 10C
342  WHERE ( s%XSST(:) - xtts <= 10. ) zmask(:)=1.
343  IF (s%LINTERPOL_SIC) WHERE (s%XFSIC(:) > 0. ) zmask(:)=1.
344  IF (s%LINTERPOL_SIT) WHERE (s%XFSIT(:) > 0. ) zmask(:)=1.
345 ELSE
346  zsst(:) = s%XSST(:)
347  zmask(:) = s%XSST(:) - xtts
348  isize_water = count(zmask(:)>=0.)
349  isize_ice = SIZE(s%XSST) - isize_water
350 ENDIF
351 !
352 SELECT CASE (s%CSEA_FLUX)
353 CASE ('DIRECT')
354  CALL water_flux(s%XZ0, pta, zexna, prhoa, zsst, zexns, zqa, &
355  prain, psnow, xtts, zwind, pzref, puref, &
356  pps, s%LHANDLE_SIC, zqsat, zsfth, zsftq, &
357  zustar, zcd, zcdn, zch, zri, zresa_sea, zz0h )
358 CASE ('ITERAT')
359  CALL mr98 (s%XZ0, pta, zexna, prhoa, s%XSST, zexns, zqa, &
360  xtts, zwind, pzref, puref, pps, zqsat, &
361  zsfth, zsftq, zustar, &
362  zcd, zcdn, zch, zri, zresa_sea, zz0h )
363 
364 CASE ('ECUME ','ECUME6')
365  CALL ecume_seaflux(s, zmask, isize_water, isize_ice, &
366  pta, zexna ,prhoa, zsst, zexns, zqa, &
367  prain, psnow, zwind, pzref, puref, pps, ppa, &
368  zqsat, zsfth, zsftq, zustar, &
369  zcd, zcdn, zch, zce, zri, zresa_sea, zz0h )
370 CASE ('COARE3')
371  CALL coare30_seaflux(s, zmask, isize_water, isize_ice, &
372  pta, zexna ,prhoa, zsst, zexns, zqa, prain, &
373  psnow, zwind, pzref, puref, pps, zqsat, &
374  zsfth, zsftq, zustar, &
375  zcd, zcdn, zch, zce, zri, zresa_sea, zz0h )
376 END SELECT
377 !
378 !-------------------------------------------------------------------------------------
379 !radiative properties at time t
380 !-------------------------------------------------------------------------------------
381 !
382 iswb = SIZE(psw_bands)
383 !
384 DO jswb=1,iswb
385 zdir_alb(:,jswb) = s%XDIR_ALB(:)
386 zsca_alb(:,jswb) = s%XSCA_ALB(:)
387 END DO
388 !
389 IF (s%LHANDLE_SIC) THEN
390 zemis(:) = (1 - s%XSIC(:)) * xemiswat + s%XSIC(:) * xemiswatice
391 ztrad(:) = (((1 - s%XSIC(:)) * xemiswat * s%XSST (:)**4 + &
392  s%XSIC(:) * xemiswatice * s%XTICE(:)**4)/ zemis(:)) ** 0.25
393 ELSE
394 ztrad(:) = s%XSST (:)
395 zemis(:) = s%XEMIS(:)
396 END IF
397 !
398 !-------------------------------------------------------------------------------------
399 !Specific fields for seaice model (when using earth system model or embedded
400 !seaice scheme)
401 !-------------------------------------------------------------------------------------
402 !
403 IF(lcpl_seaice.OR.s%LHANDLE_SIC)THEN
404  CALL coupling_iceflux_n(ki, pta, zexna, prhoa, s%XTICE, zexns, &
405  zqa, prain, psnow, zwind, pzref, puref, &
406  pps, s%XSST, xtts, zsfth_ice, zsftq_ice, &
407  s%LHANDLE_SIC, zmask, zqsat_ice, zz0_ice, &
408  zustar_ice, zcd_ice, zcdn_ice, zch_ice, &
409  zri_ice, zresa_sea_ice, zz0h_ice )
410 ENDIF
411 !
412 IF (s%LHANDLE_SIC) CALL complement_each_other_flux
413 !
414 !-------------------------------------------------------------------------------------
415 ! Momentum fluxes over sea or se-ice
416 !-------------------------------------------------------------------------------------
417 !
418  CALL sea_momentum_fluxes(zcd, zsfu, zsfv)
419 !
420 ! Momentum fluxes over sea-ice if embedded seaice scheme is used
421 !
422 IF (s%LHANDLE_SIC) CALL sea_momentum_fluxes(zcd_ice, zsfu_ice, zsfv_ice)
423 !
424 ! CO2 flux
425 !
426 psfco2(:) = 0.0
427 !
428 !IF(LCPL_SEA.AND.CSEACO2=='NONE')THEN
429 ! PSFCO2(:) = XSEACO2(:)
430 !ELSEIF(CSEACO2=='CST ')THEN
431 ! PSFCO2 = E * deltapCO2
432 ! According to Wanninkhof (medium hypothesis) :
433 ! E = 1.13.10^-3 * WIND^2 CO2mol.m-2.yr-1.uatm-1
434 ! = 1.13.10^-3 * WIND^2 * Mco2.10^-3 * (1/365*24*3600)
435 ! deltapCO2 = -8.7 uatm (Table 1 half hypothesis)
436 psfco2(:) = - zwind(:)**2 * 1.13e-3 * 8.7 * 44.e-3 / ( 365*24*3600 )
437 !ENDIF
438 !
439 !-------------------------------------------------------------------------------------
440 ! Scalar fluxes:
441 !-------------------------------------------------------------------------------------
442 !
443 IF (chs%SVS%NBEQ>0) THEN
444  !
445  IF (chs%CCH_DRY_DEP == "WES89") THEN
446  !
447  ibeg = chs%SVS%NSV_CHSBEG
448  iend = chs%SVS%NSV_CHSEND
449  !
450  CALL ch_dep_water (zresa_sea, zustar, pta, ztrad,psv(:,ibeg:iend), &
451  chs%SVS%CSV(ibeg:iend), chs%XDEP(:,1:chs%SVS%NBEQ) )
452  !
453  psfts(:,ibeg:iend) = - psv(:,ibeg:iend) * chs%XDEP(:,1:chs%SVS%NBEQ)
454  !
455  IF (chs%SVS%NAEREQ > 0 ) THEN
456  !
457  ibeg = chs%SVS%NSV_AERBEG
458  iend = chs%SVS%NSV_AEREND
459  !
460  CALL ch_aer_dep(psv(:,ibeg:iend),psfts(:,ibeg:iend),zustar,zresa_sea,pta,prhoa)
461  !
462  END IF
463  !
464  ELSE
465  !
466  ibeg = chs%SVS%NSV_AERBEG
467  iend = chs%SVS%NSV_AEREND
468  !
469  psfts(:,ibeg:iend) =0.
470  IF (iend.GT.ibeg) psfts(:,ibeg:iend) =0.
471  !
472  ENDIF
473  !
474 ENDIF
475 !
476 IF (chs%SVS%NDSTEQ>0) THEN
477  !
478  ibeg = chs%SVS%NSV_DSTBEG
479  iend = chs%SVS%NSV_DSTEND
480  !
481  CALL dslt_dep(psv(:,ibeg:iend), psfts(:,ibeg:iend), zustar, zresa_sea, pta, &
482  prhoa, dst%XEMISSIG_DST, dst%XEMISRADIUS_DST, jpmode_dst, &
483  xdensity_dst, xmolarweight_dst, zconvertfacm0_dst, zconvertfacm6_dst, &
484  zconvertfacm3_dst, lvarsig_dst, lrgfix_dst, cvermod )
485  !
486  CALL massflux2momentflux( &
487  psfts(:,ibeg:iend), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
488  prhoa, & !I [kg/m3] air density
489  dst%XEMISRADIUS_DST, &!I [um] emitted radius for the modes (max 3)
490  dst%XEMISSIG_DST, &!I [-] emitted sigma for the different modes (max 3)
491  ndstmde, &
492  zconvertfacm0_dst, &
493  zconvertfacm6_dst, &
494  zconvertfacm3_dst, &
496  !
497 ENDIF
498 
499 !
500 IF (chs%SVS%NSLTEQ>0) THEN
501  !
502  ibeg = chs%SVS%NSV_SLTBEG
503  iend = chs%SVS%NSV_SLTEND
504  !
505  islt = iend - ibeg + 1
506  !
507  CALL coupling_slt_n(slt, &
508  SIZE(zustar,1), & !I [nbr] number of sea point
509  islt, & !I [nbr] number of sea salt variables
510  zwind, & !I [m/s] wind velocity
511  psfts(:,ibeg:iend) )
512  !
513  CALL dslt_dep(psv(:,ibeg:iend), psfts(:,ibeg:iend), zustar, zresa_sea, pta, &
514  prhoa, slt%XEMISSIG_SLT, slt%XEMISRADIUS_SLT, jpmode_slt, &
515  xdensity_slt, xmolarweight_slt, zconvertfacm0_slt, zconvertfacm6_slt, &
516  zconvertfacm3_slt, lvarsig_slt, lrgfix_slt, cvermod )
517  !
518  CALL massflux2momentflux( &
519  psfts(:,ibeg:iend), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
520  prhoa, & !I [kg/m3] air density
521  slt%XEMISRADIUS_SLT, &!I [um] emitted radius for the modes (max 3)
522  slt%XEMISSIG_SLT, &!I [-] emitted sigma for the different modes (max 3)
523  nsltmde, &
524  zconvertfacm0_slt, &
525  zconvertfacm6_slt, &
526  zconvertfacm3_slt, &
528  !
529 ENDIF
530 !
531 !-------------------------------------------------------------------------------
532 ! Inline diagnostics at time t for SST and TRAD
533 !-------------------------------------------------------------------------------
534 !
535  CALL diag_inline_seaflux_n(dgs%O, dgs%D, dgs%DC, dgs%DI, dgs%DIC, dgs%DMI, &
536  s, ptstep, pta, zqa, ppa, pps, prhoa, pu, &
537  pv, pzref, puref, zcd, zcdn, zch, zce, zri, zhu,&
538  zz0h, zqsat, zsfth, zsftq, zsfu, zsfv, &
539  pdir_sw, psca_sw, plw, zdir_alb, zsca_alb, &
540  zemis, ztrad, prain, psnow, &
541  zcd_ice, zcdn_ice, zch_ice, zce_ice, zri_ice, &
542  zz0_ice, zz0h_ice, zqsat_ice, zsfth_ice, &
543  zsftq_ice, zsfu_ice, zsfv_ice)
544 !
545 !-------------------------------------------------------------------------------
546 ! A kind of "average_flux"
547 !-------------------------------------------------------------------------------
548 !
549 IF (s%LHANDLE_SIC) THEN
550  psfth(:) = zsfth(:) * ( 1 - s%XSIC (:)) + zsfth_ice(:) * s%XSIC(:)
551  psftq(:) = zsftq(:) * ( 1 - s%XSIC (:)) + zsftq_ice(:) * s%XSIC(:)
552  psfu(:) = zsfu(:) * ( 1 - s%XSIC (:)) + zsfu_ice(:) * s%XSIC(:)
553  psfv(:) = zsfv(:) * ( 1 - s%XSIC (:)) + zsfv_ice(:) * s%XSIC(:)
554 ELSE
555  psfth(:) = zsfth(:)
556  psftq(:) = zsftq(:)
557  psfu(:) = zsfu(:)
558  psfv(:) = zsfv(:)
559 ENDIF
560 !
561 !-------------------------------------------------------------------------------
562 ! IMPOSED SSS OR INTERPOLATED SSS AT TIME t+1
563 !-------------------------------------------------------------------------------
564 !
565 ! Daily update Sea surface salinity from monthly data
566 !
567 IF (s%LINTERPOL_SSS .AND. mod(s%TTIME%TIME,xday) == 0.) THEN
568  CALL interpol_sst_mth(s,'S')
569  IF (any(s%XSSS(:)<0.0)) THEN
570  CALL abor1_sfx('COUPLING_SEAFLUX_N: XSSS should be >=0')
571  ENDIF
572 ENDIF
573 !
574 !-------------------------------------------------------------------------------
575 ! SEA-ICE coupling at time t+1
576 !-------------------------------------------------------------------------------
577 !
578 IF (s%LHANDLE_SIC) THEN
579  !
580  IF (s%LINTERPOL_SIC) THEN
581  IF ((mod(s%TTIME%TIME,xday) == 0.) .OR. (ptimec <= ptstep )) THEN
582  ! Daily update Sea Ice Cover constraint from monthly data
583  CALL interpol_sst_mth(s,'C')
584  IF (any(s%XFSIC(:)>1.0).OR.any(s%XFSIC(:)<0.0)) THEN
585  CALL abor1_sfx('COUPLING_SEAFLUX_N: FSIC should be >=0 and <=1')
586  ENDIF
587  ENDIF
588  ENDIF
589  !
590  IF (s%LINTERPOL_SIT) THEN
591  IF ((mod(s%TTIME%TIME,xday) == 0.) .OR. (ptimec <= ptstep )) THEN
592  ! Daily update Sea Ice Thickness constraint from monthly data
593  CALL interpol_sst_mth(s,'H')
594  IF (any(s%XFSIT(:)<0.0)) THEN
595  CALL abor1_sfx('COUPLING_SEAFLUX_N: XFSIT should be >=0')
596  ENDIF
597  ENDIF
598  ENDIF
599  !
600  IF (s%CSEAICE_SCHEME=='GELATO') THEN
601  CALL seaice_gelato1d_n(s, hprogram,ptimec, ptstep)
602  ENDIF
603  ! Update of cell-averaged albedo, emissivity and radiative
604  ! temperature is done later
605 ENDIF
606 !
607 !-------------------------------------------------------------------------------
608 ! OCEANIC COUPLING, IMPOSED SST OR INTERPOLATED SST AT TIME t+1
609 !-------------------------------------------------------------------------------
610 !
611 IF (o%LMERCATOR) THEN
612  !
613  ! Update SST reference profile for relaxation purpose
614  IF (dts%LSST_DATA) THEN
615  CALL sst_update(dts, s, or%XSEAT_REL(:,nockmin+1))
616  !
617  ! Convert to degree C for ocean model
618  or%XSEAT_REL(:,nockmin+1) = or%XSEAT_REL(:,nockmin+1) - xtt
619  ENDIF
620  !
621  CALL mod1d_n(dgs%GO, o, or, g%XLAT, s, &
622  hprogram,ptime,zemis(:),zdir_alb(:,1:ksw),zsca_alb(:,1:ksw),&
623  plw(:),psca_sw(:,1:ksw),pdir_sw(:,1:ksw),psfth(:), &
624  psftq(:),psfu(:),psfv(:),prain(:))
625  !
626 ELSEIF(dts%LSST_DATA) THEN
627  !
628  ! Imposed SST
629  !
630  CALL sst_update(dts, s, s%XSST)
631  !
632 ELSEIF (s%LINTERPOL_SST.AND.mod(s%TTIME%TIME,xday) == 0.) THEN
633  !
634  ! Imposed monthly SST
635  !
636  CALL interpol_sst_mth(s,'T')
637  !
638 ENDIF
639 !
640 !-------------------------------------------------------------------------------
641 !Physical properties see by the atmosphere in order to close the energy budget
642 !between surfex and the atmosphere. All variables should be at t+1 but very
643 !difficult to do. Maybe it will be done later. However, Ts is at time t+1
644 !-------------------------------------------------------------------------------
645 !
646 IF (s%LHANDLE_SIC) THEN
647  IF (s%CSEAICE_SCHEME/='GELATO') THEN
648  s%XTICE = s%XSST
649  s%XSIC = s%XFSIC
650  s%XICE_ALB = xalbseaice
651  ENDIF
652  ptsurf(:) = s%XSST(:) * ( 1 - s%XSIC (:)) + s%XTICE(:) * s%XSIC(:)
653  pqsurf(:) = zqsat(:) * ( 1 - s%XSIC (:)) + zqsat_ice(:) * s%XSIC(:)
654  zz0w(:) = ( 1 - s%XSIC(:) ) * 1.0/(log(puref(:)/zz0(:)) **2) + &
655  s%XSIC(:) * 1.0/(log(puref(:)/zz0_ice(:))**2)
656  pz0(:) = puref(:) * exp( - sqrt( 1./ zz0w(:) ))
657  zz0w(:) = ( 1 - s%XSIC(:) ) * 1.0/(log(pzref(:)/zz0h(:)) **2) + &
658  s%XSIC(:) * 1.0/(log(pzref(:)/zz0h_ice(:))**2)
659  pz0h(:) = pzref(:) * exp( - sqrt( 1./ zz0w(:) ))
660 ELSE
661  ptsurf(:) = s%XSST(:)
662  pqsurf(:) = zqsat(:)
663  pz0(:) = s%XZ0 (:)
664  pz0h(:) = zz0h(:)
665 ENDIF
666 !
667 !-------------------------------------------------------------------------------
668 !Radiative properties at time t+1 (see by the atmosphere) in order to close
669 !the energy budget between surfex and the atmosphere
670 !-------------------------------------------------------------------------------
671 !
672  CALL update_rad_sea(s,pzenith2,xtts,pdir_alb,psca_alb,pemis,ptrad,pu,pv)
673 !
674 !=======================================================================================
675 !
676 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N',1,zhook_handle)
677 !
678 !=======================================================================================
679 !
680 CONTAINS
681 !
682 SUBROUTINE sea_momentum_fluxes(PCD, PSFU, PSFV)
683 !
684 IMPLICIT NONE
685 !
686 REAL, DIMENSION(KI), INTENT(IN) :: PCD ! Drag coefficient (on open sea or seaice)
687 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
688 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
689 !
690 REAL, DIMENSION(KI) :: ZUSTAR2 ! square of friction velocity (m2/s2)
691 REAL, DIMENSION(KI) :: ZWORK ! Work array
692 !
693 REAL(KIND=JPRB) :: ZHOOK_HANDLE
694 !
695 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N: SEA_MOMENTUM_FLUXES',0,zhook_handle)
696 !
697 zwork(:) = xundef
698 zustar2(:) = xundef
699 !
700 IF(cimplicit_wind=='OLD')THEN
701 ! old implicitation (m2/s2)
702  zustar2(:) = (pcd(:)*zwind(:)*ppew_b_coef(:)) / &
703  (1.0-prhoa(:)*pcd(:)*zwind(:)*ppew_a_coef(:))
704 ELSE
705 ! new implicitation (m2/s2)
706  zustar2(:) = (pcd(:)*zwind(:)*(2.*ppew_b_coef(:)-zwind(:))) /&
707  (1.0-2.0*prhoa(:)*pcd(:)*zwind(:)*ppew_a_coef(:))
708 !
709  zwork(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
710  zwork(:) = max(zwork(:),0.)
711 !
712  WHERE(ppew_a_coef(:)/= 0.)
713  zustar2(:) = max( ( zwork(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
714  ENDWHERE
715 !
716 ENDIF
717 !
718 psfu = 0.
719 psfv = 0.
720 WHERE (zwind(:)>0.)
721  psfu(:) = - prhoa(:) * zustar2(:) * zu(:) / zwind(:)
722  psfv(:) = - prhoa(:) * zustar2(:) * zv(:) / zwind(:)
723 END WHERE
724 !
725 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N: SEA_MOMENTUM_FLUXES',1,zhook_handle)
726 !
727 END SUBROUTINE sea_momentum_fluxes
728 !
729 !=======================================================================================
730 !
732 !
733 ! Provide dummy fluxes on places with no open-sea or no sea-ice
734 ! Allows a smooth computing of CLS parameters in all cases while avoiding
735 ! having to pack arrays (in routines PARAM_CLS and CLS_TQ)
736 !
737 IMPLICIT NONE
738 !
739 REAL(KIND=JPRB) :: ZHOOK_HANDLE
740 !
741 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N: COMPLEMENT_EACH_OTHER_FLUX',0,zhook_handle)
742 !
743  WHERE (s%XSIC(:) == 1.)
744  zsfth=zsfth_ice
745  zsftq=zsftq_ice
746  zsfu=zsfu_ice
747  zsfv=zsfv_ice
748  zqsat=zqsat_ice
749  zcd=zcd_ice
750  zcdn=zcdn_ice
751  zch=zch_ice
752  zce=zce_ice
753  zri=zri_ice
754  zz0h=zz0h_ice
755  END WHERE
756  WHERE (s%XSIC(:) == 0.)
757  zsfth_ice=zsfth
758  zsftq_ice=zsftq
759  zsfu_ice=zsfu
760  zsfv_ice=zsfv
761  zqsat_ice=zqsat
762  zcd_ice=zcd
763  zcdn_ice=zcdn
764  zch_ice=zch
765  zce_ice=zce
766  zri_ice=zri
767  zz0h_ice=zz0h
768  END WHERE
769 !
770 IF (lhook) CALL dr_hook('COUPLING_SEAFLUX_N: COMPLEMENT_EACH_OTHER_FLUX',1,zhook_handle)
771 !
772 END SUBROUTINE complement_each_other_flux
773 !
774 !=======================================================================================
775 !
776 END SUBROUTINE coupling_seaflux_n
subroutine massflux2momentflux(PFLUX, PRHODREF, PEMISRADIUS, PEMISSIG, KMDE, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX)
character(len=3) cimplicit_wind
real, parameter xmolarweight_slt
real, save xttsi
Definition: modd_csts.F90:67
subroutine sea_momentum_fluxes(PCD, PSFU, PSFV)
real, save xcpd
Definition: modd_csts.F90:63
real, parameter xmolarweight_dst
logical lvarsig_dst
subroutine mr98(PZ0SEA,
Definition: mr98.F90:7
real, save xalbseaice
subroutine coupling_slt_n(SLT, KI, KSLT, PWIND, PSFSLT)
real, parameter xdensity_dst
real, save xemiswatice
subroutine seaice_gelato1d_n(S, HPROGRAM, PTIMEC, PTSTEP)
real, save xtts
Definition: modd_csts.F90:68
subroutine coupling_iceflux_n(KI, PTA, PEXNA, PRHOA, PTICE, PEXNS, PQA, PRAIN, PSNOW, PWIND, PZREF, PUREF, PPS, PTWAT, PTTS, PSFTH, PSFTQ, OHANDLE_SIC, PMASK, PQSAT, PZ0, PUSTAR, PCD, PCDN, PCH, PRI, PRESA, PZ0H)
subroutine ch_aer_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF)
Definition: ch_aer_dep.F90:8
subroutine sst_update(DTS, S, PSST)
Definition: sst_update.F90:7
integer jpmode_slt
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
subroutine mod1d_n(DGO, O, OR, PLAT, S, HPROGRAM, PTIME, PEMIS, PDIR_ALB, PSCA_ALB, PLW, PSCA_SW, PDIR_SW, PSFTH, PSFTQ, PSFU, PSFV, PRAIN)
Definition: mod1dn.F90:9
logical lrgfix_dst
subroutine water_flux(PZ0SEA,
Definition: water_flux.F90:7
subroutine interpol_sst_mth(S, HFLAG)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine complement_each_other_flux
subroutine update_rad_sea(S, PZENITH, PTT, PDIR_ALB_ATMOS, PSCA_ALB_ATMOS, PEMIS_ATMOS, PTRAD, PU, PV)
logical lvarsig_slt
real, save xday
Definition: modd_csts.F90:45
subroutine ecume_seaflux(S, PMASK, KSIZE_WATER, KSIZE_ICE, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PRAIN, PSNOW, PVMOD, PZREF, PUREF, PPS, PPA, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PZ0HSEA)
subroutine dslt_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF, PEMISSIG, PEMISRADIUS, KPMODE, PDENSITY, PMOLARWEIGHT, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX, HVERMOD)
Definition: dslt_dep.F90:10
logical lhook
Definition: yomhook.F90:15
integer jpmode_dst
subroutine add_forecast_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
character(len=6) cvermod
subroutine diag_inline_seaflux_n(DGO, D, DC, DI, DIC, DGMSI, S, PTSTEP, PTA, PQA, PPA, PPS, PRHOA, PZONA, PMERA, PHT, PHW, PCD, PCDN, PCH, PCE, PRI, PHU, PZ0H, PQSAT, PSFTH, PSFTQ, PSFZON, PSFMER, PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, PEMIS, PTRAD, PRAIN, PSNOW, PCD_ICE, PCDN_ICE, PCH_ICE, PCE_ICE, PRI_ICE, PZ0_ICE, PZ0H_ICE, PQSAT_ICE, PSFTH_ICE, PSFTQ_ICE, PSFZON_ICE, PSFMER_ICE)
real, parameter xdensity_slt
subroutine ch_dep_water(PRESA, PUSTAR, PTA, PTRAD, PSV, HSV, PDEP)
Definition: ch_dep_water.F90:7
real, save xtt
Definition: modd_csts.F90:66
subroutine coupling_seaflux_n(CHS, DTS, DGS, O, OR, G, S, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST)
logical lrgfix_slt
real, save xp00
Definition: modd_csts.F90:57
subroutine coare30_seaflux(S, PMASK, KSIZE_WATER, KSIZE_ICE, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PRAIN, PSNOW, PVMOD, PZREF, PUREF, PPS, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PZ0HSEA)
integer, save nockmin
static int count
Definition: memory_hook.c:21
real, save xemiswat