SURFEX v8.1
General documentation of Surfex
coupling_surf_atmn.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_surf_atm_n (YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, &
7  KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, &
8  PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, &
9  PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS,&
10  PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, &
11  PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, &
12  PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, &
13  PPET_B_COEF, PPEQ_B_COEF, HTEST )
14 ! #################################################################################
15 !
16 !!**** *COUPLING_INLAND_WATER_n * - Driver to call the schemes for the
17 !! four surface types (SEA, WATER, NATURE, TOWN)
18 !!
19 !! PURPOSE
20 !! -------
21 !
22 !!** METHOD
23 !! ------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! V. Masson
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/2004
36 !! Modified 09/2011 by S.Queguiner: Add total CO2 surface flux (anthropo+biogenic) as diagnostic
37 !! Modified 11/2011 by S.Queguiner: Add total Chemical surface flux (anthropo) as diagnostic
38 !! B. Decharme 04/2013 new coupling variables and replace RW_PRECIP_n by CPL_GCM_n
39 !! Modified 06/2013 by J.Escobar : replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP
40 !! R. Séférian 03/2014 Adding decoupling between CO2 seen by photosynthesis and radiative CO2
41 !!-------------------------------------------------------------
42 !
43 !
44 USE modd_surfex_n, ONLY : surfex_t
45 !
46 USE modd_surf_conf, ONLY : cprogname
47 USE modd_surf_par, ONLY : xundef
48 USE modd_csts, ONLY : xp00, xcpd, xrd, xavogadro, xmd
49 USE modd_co2v_par, ONLY : xmco2
50 USE modd_surf_atm, ONLY : lcpl_gcm, xco2uncpl
51 USE modd_data_cover_par, ONLY : ntilesfc
52 !
53 !
55 !
56 USE modi_add_forecast_to_date_surf
57 USE modi_average_flux
58 USE modi_average_phy
59 USE modi_average_rad
60 USE modi_diag_inline_surf_atm_n
61 USE modi_ch_emission_flux_n
62 USE modi_ch_emission_snap_n
63 USE modi_ch_emission_to_atm_n
64 USE modi_sso_z0_friction_n
65 USE modi_sso_be04_friction_n
66 !
67 USE yomhook ,ONLY : lhook, dr_hook
68 USE parkind1 ,ONLY : jprb
69 !
70 USE modi_abor1_sfx
71 !
72 USE modi_coupling_inland_water_n
73 !
74 USE modi_coupling_nature_n
75 !
76 USE modi_coupling_sea_n
77 !
78 USE modi_coupling_town_n
79 !
80 USE modi_cpl_gcm_n
81 !
82 IMPLICIT NONE
83 !
84 #ifdef SFX_MPI
85 include 'mpif.h'
86 #endif
87 !
88 !* 0.1 declarations of arguments
89 !
90 TYPE(surfex_t), INTENT(INOUT) :: YSC
91 !
92  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
93  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
94  ! 'E' : explicit
95  ! 'I' : implicit
96 REAL, INTENT(IN) :: PTIMEC ! cumulated time since beginning of simulation
97 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
98 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
99 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
100 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
101 INTEGER, INTENT(IN) :: KI ! number of points
102 INTEGER, INTENT(IN) :: KSV ! number of scalars
103 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
104 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
105 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
106 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
107 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
108 !
109 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
110 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
111 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
112 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
113 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
114 ! !
115  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
116 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
117 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
118 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
119 ! ! (W/m2)
120 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
121 ! ! (W/m2)
122 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
123 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical)
124 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1(radian from the vertical)
125 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
126 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
127 ! ! (W/m2)
128 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
129 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
130 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
131 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
132 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
133 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
134 !
135 !
136 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
137 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
138 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
139 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
140 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
141 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
142 !
143 REAL, DIMENSION(KI), INTENT(INOUT) :: PTRAD ! radiative temperature (K)
144 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB ! direct albedo for each spectral band (-)
145 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB ! diffuse albedo for each spectral band (-)
146 REAL, DIMENSION(KI), INTENT(INOUT) :: PEMIS ! emissivity (-)
147 !
148 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
149 REAL, DIMENSION(KI), INTENT(INOUT) :: PZ0 ! roughness length for momentum (m)
150 REAL, DIMENSION(KI), INTENT(INOUT) :: PZ0H ! roughness length for heat (m)
151 REAL, DIMENSION(KI), INTENT(INOUT) :: PQSURF ! specific humidity at surface (kg/kg)
152 !
153 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
154 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
155 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
156 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
157 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
158 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
159  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
160 !
161 !
162 !* 0.2 declarations of local variables
163 !
164 INTEGER :: JTILE ! loop on type of surface
165 LOGICAL :: GNATURE, GTOWN, GWATER, GSEA ! .T. if the corresponding surface is represented
166 INTEGER :: ISWB ! number of shortwave spectral bands
167 !
168 REAL, DIMENSION(KI) :: ZPEW_A_COEF ! implicit coefficients
169 REAL, DIMENSION(KI) :: ZPEW_B_COEF ! needed if HCOUPLING='I'
170 REAL, DIMENSION(KI) :: ZPET_A_COEF
171 REAL, DIMENSION(KI) :: ZPEQ_A_COEF
172 REAL, DIMENSION(KI) :: ZPET_B_COEF
173 REAL, DIMENSION(KI) :: ZPEQ_B_COEF
174 !
175 ! Tile outputs:
176 !
177 REAL, DIMENSION(KI,NTILESFC) :: ZSFTH_TILE ! surface heat flux (Km/s)
178 REAL, DIMENSION(KI,NTILESFC) :: ZSFTQ_TILE ! surface vapor flux (kgm/kg/s)
179 REAL, DIMENSION(KI,KSV,NTILESFC) :: ZSFTS_TILE ! scalar surface flux
180 REAL, DIMENSION(KI,NTILESFC) :: ZSFCO2_TILE ! surface CO2 flux
181 REAL, DIMENSION(KI,NTILESFC) :: ZSFU_TILE ! zonal momentum flux
182 REAL, DIMENSION(KI,NTILESFC) :: ZSFV_TILE ! meridian momentum flux
183 REAL, DIMENSION(KI,NTILESFC) :: ZTRAD_TILE ! radiative surface temperature
184 REAL, DIMENSION(KI,NTILESFC) :: ZEMIS_TILE ! emissivity
185 REAL, DIMENSION(KI,NTILESFC) :: ZFRAC_TILE ! fraction of each surface type
186 REAL, DIMENSION(KI,NTILESFC) :: ZTSURF_TILE ! surface effective temperature
187 REAL, DIMENSION(KI,NTILESFC) :: ZZ0_TILE ! roughness length for momentum
188 REAL, DIMENSION(KI,NTILESFC) :: ZZ0H_TILE ! roughness length for heat
189 REAL, DIMENSION(KI,NTILESFC) :: ZQSURF_TILE ! specific humidity at surface
190 !
191 REAL, DIMENSION(KI,KSW,NTILESFC) :: ZDIR_ALB_TILE ! direct albedo
192 REAL, DIMENSION(KI,KSW,NTILESFC) :: ZSCA_ALB_TILE ! diffuse albedo
193 !
194 REAL :: XTIME0
195 !
196 INTEGER :: IINDEXEND
197 INTEGER :: INBTS, JI
198 REAL(KIND=JPRB) :: ZHOOK_HANDLE
199 !
200 !-------------------------------------------------------------------------------------
201 IF (lhook) CALL dr_hook('COUPLING_SURF_ATM_N',0,zhook_handle)
202 cprogname=hprogram
203 !
204 IF (htest/='OK') THEN
205  CALL abor1_sfx('COUPLING_SURF_ATMN: FATAL ERROR DURING ARGUMENT TRANSFER')
206 END IF
207 !
208 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
209 ! Time evolution
210 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
211 !
212 ysc%U%TTIME%TIME = ysc%U%TTIME%TIME + ptstep
213  CALL add_forecast_to_date_surf(ysc%U%TTIME%TDATE%YEAR,ysc%U%TTIME%TDATE%MONTH,&
214  ysc%U%TTIME%TDATE%DAY,ysc%U%TTIME%TIME)
215 !
216 !-------------------------------------------------------------------------------------
217 ! Preliminaries: Tile related operations
218 !-------------------------------------------------------------------------------------
219 ! FLAGS for the various surfaces:
220 !
221 gsea = ysc%U%NDIM_SEA >0
222 gwater = ysc%U%NDIM_WATER >0
223 gtown = ysc%U%NDIM_TOWN >0
224 gnature = ysc%U%NDIM_NATURE >0
225 
226 !
227 ! Tile counter:
228 !
229 jtile = 0
230 !
231 ! Number of shortwave spectral bands
232 !
233 iswb = SIZE(psw_bands)
234 !
235 ! Initialization: Outputs to atmosphere over each tile:
236 !
237 zsfth_tile(:,:) = xundef
238 ztrad_tile(:,:) = xundef
239 zdir_alb_tile(:,:,:) = xundef
240 zsca_alb_tile(:,:,:) = xundef
241 zemis_tile(:,:) = xundef
242 zsftq_tile(:,:) = xundef
243 zsfts_tile(:,:,:) = 0.
244 zsfco2_tile(:,:) = 0.
245 zsfu_tile(:,:) = xundef
246 zsfv_tile(:,:) = xundef
247 ztsurf_tile(:,:) = xundef
248 zz0_tile(:,:) = xundef
249 zz0h_tile(:,:) = xundef
250 zqsurf_tile(:,:) = xundef
251 !
252 ! Fractions for each tile:
253 !
254 zfrac_tile(:,:) = 0.0
255 !
256 ! initialization of implicit coefficients:
257 !
258 IF (hcoupling=='I') THEN
259  zpew_a_coef = ppew_a_coef
260  zpew_b_coef = ppew_b_coef
261  zpet_a_coef = ppet_a_coef
262  zpeq_a_coef = ppeq_a_coef
263  zpet_b_coef = ppet_b_coef
264  zpeq_b_coef = ppeq_b_coef
265 ELSE
266  zpew_a_coef = 0.
267  zpew_b_coef = sqrt(pu**2+pv**2)
268  zpet_a_coef = xundef
269  zpet_b_coef = xundef
270  zpeq_a_coef = xundef
271  zpeq_b_coef = xundef
272 END IF
273 !
274 !--------------------------------------------------------------------------------------
275 ! Call ALMA interfaces for sea, water, nature and town here...
276 !--------------------------------------------------------------------------------------
277 !
278 #ifdef SFX_MPI
279 xtime0 = mpi_wtime()
280 #endif
281 !
282 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
283 ! SEA Tile calculations:
284 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
285 !
286 ! first, pack vector...then call ALMA routine
287 !
288 jtile = jtile + 1
289 !
290 IF(gsea)THEN
291 !
292  zfrac_tile(:,jtile) = ysc%U%XSEA(:)
293 !
294  CALL treat_surf(jtile,ysc%U%NSIZE_SEA,ysc%U%NR_SEA)
295 !
296 ENDIF
297 !
298 #ifdef SFX_MPI
299 xtime_sea = xtime_sea + (mpi_wtime() - xtime0)*100./max(1,ysc%U%NSIZE_SEA)
300 xtime0 = mpi_wtime()
301 #endif
302 !
303 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
304 ! INLAND WATER Tile calculations:
305 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
306 !
307 jtile = jtile + 1
308 !
309 IF(gwater)THEN
310 !
311  zfrac_tile(:,jtile) = ysc%U%XWATER(:)
312 !
313  CALL treat_surf(jtile,ysc%U%NSIZE_WATER,ysc%U%NR_WATER)
314 !
315 ENDIF
316 !
317 #ifdef SFX_MPI
318 xtime_water = xtime_water + (mpi_wtime() - xtime0)*100./max(1,ysc%U%NSIZE_WATER)
319 xtime0 = mpi_wtime()
320 #endif
321 !
322 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
323 ! NATURAL SURFACE Tile calculations:
324 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
325 !
326 jtile = jtile + 1
327 !
328 IF(gnature)THEN
329 !
330  zfrac_tile(:,jtile) = ysc%U%XNATURE(:)
331 !
332  CALL treat_surf(jtile,ysc%U%NSIZE_NATURE,ysc%U%NR_NATURE)
333 !
334 ENDIF
335 !
336 #ifdef SFX_MPI
337 xtime_nature = xtime_nature + (mpi_wtime() - xtime0)*100./max(1,ysc%U%NSIZE_NATURE)
338 xtime0 = mpi_wtime()
339 #endif
340 !
341 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
342 ! URBAN Tile calculations:
343 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
344 !
345 jtile = jtile + 1
346 !
347 IF(gtown)THEN
348 !
349  zfrac_tile(:,jtile) = ysc%U%XTOWN(:)
350 !
351  CALL treat_surf(jtile,ysc%U%NSIZE_TOWN,ysc%U%NR_TOWN)
352 !
353 ENDIF
354 !
355 #ifdef SFX_MPI
356 xtime_town = xtime_town + (mpi_wtime() - xtime0)*100./max(1,ysc%U%NSIZE_TOWN)
357 #endif
358 !
359 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
360 ! Grid box average fluxes/properties:
361 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
362 !
363  CALL average_flux(zfrac_tile, zsfth_tile, zsftq_tile, zsfts_tile, zsfco2_tile, &
364  zsfu_tile, zsfv_tile, psfth, psftq, psfts, psfco2, psfu, psfv )
365 !
366 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
367 ! Chemical Emissions:
368 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
369 !
370 IF ((ysc%SV%NBEQ > 0).AND.(ysc%CHU%LCH_SURF_EMIS)) THEN
371  IF (ysc%CHU%CCH_EMIS=='AGGR') THEN
372  IF (ysc%SV%NSV_AEREND < 0) THEN
373  iindexend = ysc%SV%NSV_CHSEND ! case only gas chemistry
374  ELSE
375  iindexend = ysc%SV%NSV_AEREND ! case aerosol + gas chemistry
376  ENDIF
377  inbts=0
378  DO ji=1,SIZE(ysc%CHE%TSEMISS)
379  IF (SIZE(ysc%CHE%TSEMISS(ji)%NETIMES).GT.inbts) inbts=SIZE(ysc%CHE%TSEMISS(ji)%NETIMES)
380  ENDDO
381  CALL ch_emission_flux_n(ysc%DTCO, ysc%U, ysc%CHE, ysc%SV, ysc%CHU, &
382  hprogram,ptime,psfts(:,ysc%SV%NSV_CHSBEG:iindexend),prhoa,ptstep,inbts)
383  ELSE IF (ysc%CHU%CCH_EMIS=='SNAP') THEN
384  CALL ch_emission_snap_n(ysc%CHN, hprogram,ysc%U%NSIZE_FULL,ptime,ptsun,kyear,kmonth,kday,prhoa,ysc%UG%G%XLON)
385  CALL ch_emission_to_atm_n(ysc%CHN, ysc%SV, psfts,prhoa)
386  END IF
387 END IF
388 !
389 WHERE(psfts(:,:)==xundef) psfts(:,:)=0.
390 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
391 ! CO2 Flux : adds biogenic and anthropogenic emissions
392 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
393 ! CO2 FLUXES : PSFTS in molecules/m2/s
394 ! PSFCO2 in kgCO2/kgair*m/s = *PRHOA kgCO2/m2/s
395 ! PSFCO2 in kgCO2/m2/s = *Navogadro*1E3/Mco2(44g/mol) molecules/m2/s
396 !
397 DO ji=1,SIZE(psv,2)
398  IF(trim(adjustl(ysc%SV%CSV(ji)))=="CO2") THEN
399  ! CO2 Flux (Antrop + biog) (molec*m2/s)
400  psfts(:,ji) = psfts(:,ji) + psfco2(:)*prhoa(:)*(xavogadro/44.)*1e3
401  ! CO2 Flux (Antrop + biog) (kgCO2/kgair*m/s)
402  psfco2(:) = psfts(:,ji)/(prhoa(:)*(xavogadro/44.)*1e3)
403  END IF
404 END DO
405 !
406 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
407 ! Radiative fluxes
408 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
409  CALL average_rad(zfrac_tile, zdir_alb_tile, zsca_alb_tile, &
410  zemis_tile, ztrad_tile, pdir_alb, psca_alb,&
411  pemis, ptrad)
412 !
413 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
414 ! Physical properties
415 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
416  CALL average_phy(zfrac_tile, ztsurf_tile, zz0_tile, &
417  zz0h_tile, zqsurf_tile, &
418  puref, pzref, ptsurf, pz0, pz0h, pqsurf )
419 !
420 ! store these field to write in restart file (important for AGCM)
421 !
422 IF(lcpl_gcm) CALL cpl_gcm_n(ysc%U, ki,pz0=pz0,pz0h=pz0h,pqsurf=pqsurf)
423 !
424 ! - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
425 ! Orographic friction
426 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
427 !
428 !* adds friction due to subscale orography to momentum fluxes
429 ! but only over continental area
430 !
431 IF (ysc%USS%CROUGH=="Z01D" .OR. ysc%USS%CROUGH=="Z04D") THEN
432  CALL sso_z0_friction_n(ysc%USS, ysc%U%XSEA,puref,prhoa,pu,pv,zpew_a_coef,zpew_b_coef,psfu,psfv)
433 ELSE IF (ysc%USS%CROUGH=="BE04") THEN
434  CALL sso_be04_friction_n(ysc%SB, ysc%USS, ptstep,ysc%U%XSEA,puref,prhoa,pu,pv,psfu,psfv)
435 END IF
436 !
437 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
438 ! Inline diagnostics for full surface
439 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
440 !
441  CALL diag_inline_surf_atm_n(ysc%DUO, ysc%DU, &
442  puref, pzref, pps, prhoa, ptrad, pemis, psfu, psfv, psfco2)
443 !
444 IF (lhook) CALL dr_hook('COUPLING_SURF_ATM_N',1,zhook_handle)
445 !
446 !=======================================================================================
447 CONTAINS
448 !=======================================================================================
449 SUBROUTINE treat_surf(KTILE,KSIZE,KMASK)
450 !
451 IMPLICIT NONE
452 !
453 INTEGER, INTENT(IN) :: KTILE
454 INTEGER, INTENT(IN) :: KSIZE
455 INTEGER, INTENT(IN), DIMENSION(KI) :: KMASK
456 !
457 REAL, DIMENSION(KSIZE) :: ZP_TSUN ! solar time (s from midnight)
458 REAL, DIMENSION(KSIZE) :: ZP_ZREF ! height of T,q forcing (m)
459 REAL, DIMENSION(KSIZE) :: ZP_UREF ! height of wind forcing (m)
460 !
461 REAL, DIMENSION(KSIZE) :: ZP_TA ! air temperature forcing (K)
462 REAL, DIMENSION(KSIZE) :: ZP_QA ! air specific humidity forcing (kg/m3)
463 REAL, DIMENSION(KSIZE) :: ZP_RHOA ! air density (kg/m3)
464 REAL, DIMENSION(KSIZE) :: ZP_U ! zonal wind (m/s)
465 REAL, DIMENSION(KSIZE) :: ZP_V ! meridian wind (m/s)
466 REAL, DIMENSION(KSIZE,ISWB) :: ZP_DIR_SW ! direct solar radiation (on horizontal surf.)
467 ! ! (W/m2)
468 REAL, DIMENSION(KSIZE,ISWB) :: ZP_SCA_SW ! diffuse solar radiation (on horizontal surf.)
469 ! ! (W/m2)
470 REAL, DIMENSION(KSIZE) :: ZP_ZENITH ! zenithal angle at t (radian from the vertical)
471 REAL, DIMENSION(KSIZE) :: ZP_ZENITH2 ! zenithal angle at t+1(radian from the vertical)
472 REAL, DIMENSION(KSIZE) :: ZP_AZIM ! azimuthal angle (radian from North, clockwise)
473 REAL, DIMENSION(KSIZE) :: ZP_LW ! longwave radiation (on horizontal surf.)
474 ! ! (W/m2)
475 REAL, DIMENSION(KSIZE) :: ZP_PS ! pressure at atmospheric model surface (Pa)
476 REAL, DIMENSION(KSIZE) :: ZP_PA ! pressure at forcing level (Pa)
477 REAL, DIMENSION(KSIZE) :: ZP_ZS ! atmospheric model orography (m)
478 REAL, DIMENSION(KSIZE) :: ZP_CO2 ! CO2 concentration in the air (kg/m3)
479 REAL, DIMENSION(KSIZE,KSV) :: ZP_SV ! scalar concentration in the air
480 REAL, DIMENSION(KSIZE) :: ZP_SNOW ! snow precipitation (kg/m2/s)
481 REAL, DIMENSION(KSIZE) :: ZP_RAIN ! liquid precipitation (kg/m2/s)
482 !
483 REAL, DIMENSION(KSIZE) :: ZP_SFTH ! flux of heat (W/m2)
484 REAL, DIMENSION(KSIZE) :: ZP_SFTQ ! flux of water vapor (kg/m2/s)
485 REAL, DIMENSION(KSIZE) :: ZP_SFU ! zonal momentum flux (m/s)
486 REAL, DIMENSION(KSIZE) :: ZP_SFV ! meridian momentum flux (m/s)
487 REAL, DIMENSION(KSIZE) :: ZP_SFCO2 ! flux of CO2 (kg/m2/s)
488 REAL, DIMENSION(KSIZE,KSV) :: ZP_SFTS ! flux of scalar
489 !
490 REAL, DIMENSION(KSIZE) :: ZP_TRAD ! radiative temperature (K)
491 REAL, DIMENSION(KSIZE,ISWB) :: ZP_DIR_ALB ! direct albedo for each spectral band (-)
492 REAL, DIMENSION(KSIZE,ISWB) :: ZP_SCA_ALB ! diffuse albedo for each spectral band (-)
493 REAL, DIMENSION(KSIZE) :: ZP_EMIS ! emissivity
494 !
495 REAL, DIMENSION(KSIZE) :: ZP_TSURF ! surface effective temperature (K)
496 REAL, DIMENSION(KSIZE) :: ZP_Z0 ! roughness length for momentum (m)
497 REAL, DIMENSION(KSIZE) :: ZP_Z0H ! roughness length for heat (m)
498 REAL, DIMENSION(KSIZE) :: ZP_QSURF ! specific humidity at surface (kg/kg)
499 !
500 REAL, DIMENSION(KSIZE) :: ZP_PEW_A_COEF ! implicit coefficients
501 REAL, DIMENSION(KSIZE) :: ZP_PEW_B_COEF ! needed if HCOUPLING='I'
502 REAL, DIMENSION(KSIZE) :: ZP_PET_A_COEF
503 REAL, DIMENSION(KSIZE) :: ZP_PEQ_A_COEF
504 REAL, DIMENSION(KSIZE) :: ZP_PET_B_COEF
505 REAL, DIMENSION(KSIZE) :: ZP_PEQ_B_COEF
506 INTEGER :: JJ, JK
507 REAL(KIND=JPRB) :: ZHOOK_HANDLE
508 !
509 IF (lhook) CALL dr_hook('COUPLING_SURF_ATM_n:TREAT_SURF',0,zhook_handle)
510 !
511 !--------------------------------------------------------------------------------------------
512 !
513 !cdir nodep
514 !cdir unroll=8
515 DO jj=1,ksize
516  ji = kmask(jj)
517  zp_tsun(jj) = ptsun(ji)
518  zp_zenith(jj) = pzenith(ji)
519  zp_zenith2(jj) = pzenith2(ji)
520  zp_azim(jj) = pazim(ji)
521  zp_zref(jj) = pzref(ji)
522  zp_uref(jj) = puref(ji)
523  zp_u(jj) = pu(ji)
524  zp_v(jj) = pv(ji)
525  zp_qa(jj) = pqa(ji)
526  zp_ta(jj) = pta(ji)
527  zp_rhoa(jj) = prhoa(ji)
528  zp_co2(jj) = pco2(ji)
529  zp_rain(jj) = prain(ji)
530  zp_snow(jj) = psnow(ji)
531  zp_lw(jj) = plw(ji)
532  zp_ps(jj) = pps(ji)
533  zp_pa(jj) = ppa(ji)
534  zp_zs(jj) = pzs(ji)
535 ENDDO
536 !
537 !consider decoupling between CO2 emploied for photosynthesis and radiative CO2
538 !recommended as C4MIP option (XCO2UNCPL in ppmv)
539 IF(xco2uncpl/=xundef)THEN
540  zp_co2(:) = zp_rhoa(:) * xco2uncpl * 1.e-6 * xmco2 / xmd
541 ENDIF
542 !
543 DO jk=1,SIZE(psv,2)
544 !cdir nodep
545 !cdir unroll=8
546  DO jj=1,ksize
547  ji = kmask(jj)
548  zp_sv(jj,jk) = psv(ji,jk)
549  ENDDO
550 ENDDO
551 !
552 DO jk=1,iswb
553 !cdir nodep
554 !cdir unroll=8
555  DO jj=1,ksize
556  ji = kmask(jj)
557  zp_dir_sw(jj,jk) = pdir_sw(ji,jk)
558  zp_sca_sw(jj,jk) = psca_sw(ji,jk)
559  ENDDO
560 ENDDO
561 !
562 !cdir nodep
563 !cdir unroll=8
564 DO jj=1,ksize
565  ji = kmask(jj)
566  zp_pew_a_coef(jj) = zpew_a_coef(ji)
567  zp_pew_b_coef(jj) = zpew_b_coef(ji)
568  zp_pet_a_coef(jj) = zpet_a_coef(ji)
569  zp_pet_b_coef(jj) = zpet_b_coef(ji)
570  zp_peq_a_coef(jj) = zpeq_a_coef(ji)
571  zp_peq_b_coef(jj) = zpeq_b_coef(ji)
572 ENDDO
573 !
574 !--------------------------------------------------------------------------------------------
575 !
576 IF (ktile==1) THEN
577  !
578  CALL coupling_sea_n(ysc%SM, ysc%DLO, ysc%DL, ysc%DLC, ysc%U, ysc%NDST%AL(1), ysc%SLT, &
579  hprogram, hcoupling, ptimec, ptstep, kyear, kmonth, kday, ptime, &
580  ysc%U%NSIZE_SEA, ksv, ksw, zp_tsun, zp_zenith, zp_zenith2,zp_azim, &
581  zp_zref, zp_uref, zp_zs, zp_u, zp_v, zp_qa, zp_ta, zp_rhoa, zp_sv, &
582  zp_co2, hsv, zp_rain, zp_snow, zp_lw, zp_dir_sw, zp_sca_sw, psw_bands, &
583  zp_ps, zp_pa, zp_sftq, zp_sfth, zp_sfts, zp_sfco2, zp_sfu, zp_sfv, &
584  zp_trad, zp_dir_alb, zp_sca_alb, zp_emis, zp_tsurf, zp_z0, zp_z0h, &
585  zp_qsurf, zp_pew_a_coef, zp_pew_b_coef, zp_pet_a_coef, zp_peq_a_coef, &
586  zp_pet_b_coef, zp_peq_b_coef, 'OK' )
587  !
588 ELSEIF (ktile==2) THEN
589  !
590  CALL coupling_inland_water_n(ysc%FM, ysc%WM, ysc%DLO, ysc%DL, ysc%DLC, ysc%U, &
591  ysc%NDST%AL(1), ysc%SLT, hprogram, hcoupling, ptimec, ptstep, &
592  kyear, kmonth, kday, ptime, ysc%U%NSIZE_WATER, ksv, ksw, &
593  zp_tsun, zp_zenith, zp_zenith2, zp_azim, zp_zref, zp_uref, &
594  zp_zs, zp_u, zp_v, zp_qa, zp_ta, zp_rhoa, zp_sv, zp_co2, hsv, &
595  zp_rain, zp_snow, zp_lw, zp_dir_sw, zp_sca_sw, psw_bands, &
596  zp_ps, zp_pa, zp_sftq, zp_sfth, zp_sfts, zp_sfco2, zp_sfu, &
597  zp_sfv, zp_trad, zp_dir_alb, zp_sca_alb, zp_emis, zp_tsurf, &
598  zp_z0, zp_z0h, zp_qsurf, zp_pew_a_coef, zp_pew_b_coef, &
599  zp_pet_a_coef, zp_peq_a_coef, zp_pet_b_coef, zp_peq_b_coef, &
600  'OK' )
601  !
602 ELSEIF (ktile==3) THEN
603  !
604  CALL coupling_nature_n(ysc%DTCO, ysc%UG, ysc%U, ysc%USS, ysc%IM, ysc%DTZ, ysc%DLO, ysc%DL, &
605  ysc%DLC, ysc%NDST, ysc%SLT, hprogram, hcoupling, ptimec, ptstep, &
606  kyear, kmonth, kday, ptime, ysc%U%NSIZE_NATURE, ksv, ksw, zp_tsun, &
607  zp_zenith, zp_zenith2, zp_azim, zp_zref, zp_uref, zp_zs, zp_u, zp_v, &
608  zp_qa, zp_ta, zp_rhoa, zp_sv, zp_co2, hsv, zp_rain, zp_snow, zp_lw, &
609  zp_dir_sw, zp_sca_sw, psw_bands, zp_ps, zp_pa, zp_sftq, zp_sfth, &
610  zp_sfts, zp_sfco2, zp_sfu, zp_sfv, zp_trad, zp_dir_alb, zp_sca_alb, &
611  zp_emis, zp_tsurf, zp_z0, zp_z0h, zp_qsurf, zp_pew_a_coef, &
612  zp_pew_b_coef, zp_pet_a_coef, zp_peq_a_coef, zp_pet_b_coef, &
613  zp_peq_b_coef, 'OK' )
614  !
615 ELSEIF (ktile==4) THEN
616  !
617  CALL coupling_town_n(ysc%DTCO, ysc%U, ysc%DLO, ysc%DL, ysc%DLC, ysc%NDST%AL(1), ysc%SLT, ysc%TM, &
618  ysc%GDM, ysc%GRM, hprogram, hcoupling, ptimec, ptstep, kyear, kmonth, &
619  kday, ptime, ysc%U%NSIZE_TOWN, ksv, ksw, zp_tsun, zp_zenith, zp_azim, &
620  zp_zref, zp_uref, zp_zs, zp_u, zp_v, zp_qa, zp_ta, zp_rhoa, zp_sv, &
621  zp_co2, hsv, zp_rain, zp_snow, zp_lw, zp_dir_sw, zp_sca_sw, psw_bands, &
622  zp_ps, zp_pa, zp_sftq, zp_sfth, zp_sfts, zp_sfco2, zp_sfu, zp_sfv, &
623  zp_trad, zp_dir_alb, zp_sca_alb, zp_emis, zp_tsurf, zp_z0, zp_z0h, &
624  zp_qsurf, zp_pew_a_coef, zp_pew_b_coef, zp_pet_a_coef, zp_peq_a_coef, &
625  zp_pet_b_coef, zp_peq_b_coef, 'OK' )
626  !
627 ENDIF
628 !
629 !----------------------------------------------------------------------------------------------
630 !
631 !cdir nodep
632 !cdir unroll=8
633 DO jj=1,ksize
634  ji=kmask(jj)
635  zsftq_tile(ji,ktile) = zp_sftq(jj)
636  zsfth_tile(ji,ktile) = zp_sfth(jj)
637  zsfco2_tile(ji,ktile) = zp_sfco2(jj)
638  zsfu_tile(ji,ktile) = zp_sfu(jj)
639  zsfv_tile(ji,ktile) = zp_sfv(jj)
640  ztrad_tile(ji,ktile) = zp_trad(jj)
641  zemis_tile(ji,ktile) = zp_emis(jj)
642  ztsurf_tile(ji,ktile) = zp_tsurf(jj)
643  zz0_tile(ji,ktile) = zp_z0(jj)
644  zz0h_tile(ji,ktile) = zp_z0h(jj)
645  zqsurf_tile(ji,ktile) = zp_qsurf(jj)
646 ENDDO
647 !
648 DO ji=1,SIZE(zp_sfts,2)
649 !cdir nodep
650 !cdir unroll=8
651  DO jj=1,ksize
652  zsfts_tile(kmask(jj),ji,ktile)= zp_sfts(jj,ji)
653  ENDDO
654 ENDDO
655 !
656 DO ji=1,SIZE(zp_dir_alb,2)
657 !cdir nodep
658 !cdir unroll=8
659  DO jj=1,ksize
660  zdir_alb_tile(kmask(jj),ji,ktile)= zp_dir_alb(jj,ji)
661  zsca_alb_tile(kmask(jj),ji,ktile)= zp_sca_alb(jj,ji)
662  ENDDO
663 ENDDO
664 !
665 !----------------------------------------------------------------------------------------------
666 !
667 IF (lhook) CALL dr_hook('COUPLING_SURF_ATM_n:TREAT_SURF',1,zhook_handle)
668 !
669 END SUBROUTINE treat_surf
670 !=======================================================================================
671 END SUBROUTINE coupling_surf_atm_n
subroutine coupling_town_n(DTCO, U, DGO, DL, DLC, DST, SLT, TM, GDM, GRM, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, 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)
subroutine coupling_sea_n(SM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, 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)
subroutine cpl_gcm_n(U, KI, PRAIN, PSNOW, PZ0, PZ0H, PQSURF)
Definition: cpl_gcmn.F90:7
subroutine coupling_nature_n(DTCO, UG, U, USS, IM, DTZ, DGO, DL, DLC, NDST, SLT, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, 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)
real, save xmd
Definition: modd_csts.F90:61
subroutine sso_be04_friction_n(SB, USS, PTSTEP, PSEA, PUREF, PRHOA, PU, PV, PSFU, PSFV)
real, save xcpd
Definition: modd_csts.F90:63
subroutine diag_inline_surf_atm_n(DGO, D, PHW, PHT, PPS, PRHOA, PTRAD, PEMIS, PSFU, PSFV, PSFCO2)
subroutine ch_emission_to_atm_n(CHN, SV, PSFSV, PRHOA)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
subroutine average_phy(PFRAC_TILE, PTSURF_TILE, PZ0_TILE, PZ0H_TILE, PQSURF_TILE, PUREF, PZREF, PTSURF, PZ0, PZ0H, PQSURF)
Definition: average_phy.F90:11
integer, parameter jprb
Definition: parkind1.F90:32
subroutine ch_emission_flux_n(DTCO, U, CHE, SV, CHU, HPROGRAM, PSI
character(len=6) cprogname
subroutine coupling_surf_atm_n(YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, 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)
subroutine average_flux(PFRAC_TILE, PSFTH_TILE, PSFTQ_TILE, PSFTS_TILE, PSFCO2_TILE, PSFU_TILE, PSFV_TILE, PSFTH, PSFTQ, PSFTS, PSFCO2, PSFU, PSFV)
logical lhook
Definition: yomhook.F90:15
subroutine coupling_inland_water_n(FM, WM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, 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)
subroutine treat_surf(KMASK, YTYPE)
subroutine add_forecast_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
subroutine ch_emission_snap_n(CHN, HPROGRAM, KSIZE, PSIMTIME, PSUNTIME, KYEAR, KMONTH, KDAY, PRHOA, PLON)
subroutine average_rad(PFRAC_TILE, PDIR_ALB_TILE, PSCA_ALB_TILE, PEMIS_TILE, PTRAD_TILE,
Definition: average_rad.F90:8
real, save xavogadro
Definition: modd_csts.F90:52
real, save xp00
Definition: modd_csts.F90:57
subroutine sso_z0_friction_n(USS, PSEA, PUREF, PRHOA, PU, PV, PPEW_A_COEF, PPEW_B_COEF, PSFU, PSFV)