SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
coupling_isba_orographyn.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_isba_orography_n (DTCO, UG, U, USS, IM, DTGD, DTGR, TGRO, DST, SLT, &
7  hprogram, hcoupling, &
8  ptstep, kyear, kmonth, kday, ptime, ki, ksv, ksw, ptsun, pzenith, pzenith2, &
9  pazim, pzref, puref, pzs, pu, pv, pqa, pta, prhoa, psv, pco2, hsv, &
10  prain, psnow, plw, pdir_sw, psca_sw, psw_bands, pps, ppa, &
11  psftq, psfth, psfts, psfco2, psfu, psfv, &
12  ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0, pz0h, pqsurf, &
13  ppew_a_coef, ppew_b_coef, &
14  ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
15  htest )
16 ! ###############################################################################
17 !
18 !!**** *COUPLING_ISBA_OROGRAPHY_n * - Parameterizes effects of subgrid
19 !! orography on radiative and energy fluxes
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 !!** METHOD
25 !! ------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! V. Masson
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 01/2004
38 !! modified 05/2004 by P. LeMoigne: vertical shift of implicit
39 !! coefficients
40 !! B. Decharme 2008 reset the subgrid topographic effect on the forcing
41 !! B. Decharme 04/2013 new coupling variables and optimization
42 !! improve forcing vertical shift
43 !----------------------------------------------------------------
44 !
45 !
46 USE modd_surfex_n, ONLY : isba_model_t
47 !
50 USE modd_surf_atm_n, ONLY : surf_atm_t
55 USE modd_dst_n, ONLY : dst_t
56 USE modd_slt_n, ONLY : slt_t
57 !
58 USE modd_surf_par,ONLY : xundef
59 USE modd_csts, ONLY : xstefan, xcpd, xrd, xp00
60 !
61 USE modd_surf_atm, ONLY : lnosof, lvertshift
62 !
63 USE modi_forcing_vert_shift
64 USE modi_coupling_isba_canopy_n
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 IMPLICIT NONE
70 !
71 !* 0.1 declarations of arguments
72 !
73 !
74 TYPE(isba_model_t), INTENT(INOUT) :: im
75 TYPE(data_cover_t), INTENT(INOUT) :: dtco
76 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
77 TYPE(surf_atm_t), INTENT(INOUT) :: u
78 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
79 TYPE(data_teb_garden_t), INTENT(INOUT) :: dtgd
80 TYPE(data_teb_greenroof_t), INTENT(INOUT) :: dtgr
81 TYPE(teb_greenroof_options_t), INTENT(INOUT) :: tgro
82 TYPE(dst_t), INTENT(INOUT) :: dst
83 TYPE(slt_t), INTENT(INOUT) :: slt
84 !
85  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
86  CHARACTER(LEN=1), INTENT(IN) :: hcoupling ! type of coupling
87  ! 'E' : explicit
88  ! 'I' : implicit
89 INTEGER, INTENT(IN) :: kyear ! current year (UTC)
90 INTEGER, INTENT(IN) :: kmonth ! current month (UTC)
91 INTEGER, INTENT(IN) :: kday ! current day (UTC)
92 REAL, INTENT(IN) :: ptime ! current time since midnight (UTC, s)
93 INTEGER, INTENT(IN) :: ki ! number of points
94 INTEGER, INTENT(IN) :: ksv ! number of scalars
95 INTEGER, INTENT(IN) :: ksw ! number of short-wave spectral bands
96 REAL, DIMENSION(KI), INTENT(IN) :: ptsun ! solar time (s from midnight)
97 REAL, INTENT(IN) :: ptstep ! atmospheric time-step (s)
98 REAL, DIMENSION(KI), INTENT(IN) :: pzref ! height of T,q forcing (m)
99 REAL, DIMENSION(KI), INTENT(IN) :: puref ! height of wind forcing (m)
100 !
101 REAL, DIMENSION(KI), INTENT(IN) :: pta ! air temperature forcing (K)
102 REAL, DIMENSION(KI), INTENT(IN) :: pqa ! air humidity forcing (kg/m3)
103 REAL, DIMENSION(KI), INTENT(IN) :: prhoa ! air density (kg/m3)
104 REAL, DIMENSION(KI,KSV),INTENT(IN) :: psv ! scalar variables
105 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
106 ! !
107  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: hsv ! name of all scalar variables
108 REAL, DIMENSION(KI), INTENT(IN) :: pu ! zonal wind (m/s)
109 REAL, DIMENSION(KI), INTENT(IN) :: pv ! meridian wind (m/s)
110 REAL, DIMENSION(KI,KSW),INTENT(IN) :: pdir_sw ! direct solar radiation (on horizontal surf.)
111 ! ! (W/m2)
112 REAL, DIMENSION(KI,KSW),INTENT(IN) :: psca_sw ! diffuse solar radiation (on horizontal surf.)
113 ! ! (W/m2)
114 REAL, DIMENSION(KSW),INTENT(IN) :: psw_bands ! mean wavelength of each shortwave band (m)
115 REAL, DIMENSION(KI), INTENT(IN) :: pzenith ! zenithal angle at t (radian from the vertical)
116 REAL, DIMENSION(KI), INTENT(IN) :: pzenith2 ! zenithal angle at t+1(radian from the vertical)
117 REAL, DIMENSION(KI), INTENT(IN) :: pazim ! azimuthal angle (radian from North, clockwise)
118 REAL, DIMENSION(KI), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
119 ! ! (W/m2)
120 REAL, DIMENSION(KI), INTENT(IN) :: pps ! pressure at atmospheric model surface (Pa)
121 REAL, DIMENSION(KI), INTENT(IN) :: ppa ! pressure at forcing level (Pa)
122 REAL, DIMENSION(KI), INTENT(IN) :: pzs ! atmospheric model orography (m)
123 REAL, DIMENSION(KI), INTENT(IN) :: pco2 ! CO2 concentration in the air (kg/m3)
124 REAL, DIMENSION(KI), INTENT(IN) :: psnow ! snow precipitation (kg/m2/s)
125 REAL, DIMENSION(KI), INTENT(IN) :: prain ! liquid precipitation (kg/m2/s)
126 !
127 !
128 REAL, DIMENSION(KI), INTENT(OUT) :: psfth ! flux of heat (W/m2)
129 REAL, DIMENSION(KI), INTENT(OUT) :: psftq ! flux of water vapor (kg/m2/s)
130 REAL, DIMENSION(KI), INTENT(OUT) :: psfu ! zonal momentum flux (Pa)
131 REAL, DIMENSION(KI), INTENT(OUT) :: psfv ! meridian momentum flux (Pa)
132 REAL, DIMENSION(KI), INTENT(OUT) :: psfco2 ! flux of CO2 (m/s*kg_CO2/kg_air)
133 REAL, DIMENSION(KI,KSV),INTENT(OUT):: psfts ! flux of scalar var. (kg/m2/s)
134 !
135 REAL, DIMENSION(KI), INTENT(OUT) :: ptrad ! radiative temperature (K)
136 REAL, DIMENSION(KI,KSW),INTENT(OUT):: pdir_alb! direct albedo for each spectral band (-)
137 REAL, DIMENSION(KI,KSW),INTENT(OUT):: psca_alb! diffuse albedo for each spectral band (-)
138 REAL, DIMENSION(KI), INTENT(OUT) :: pemis ! emissivity (-)
139 !
140 REAL, DIMENSION(KI), INTENT(OUT) :: ptsurf ! surface effective temperature (K)
141 REAL, DIMENSION(KI), INTENT(OUT) :: pz0 ! roughness length for momentum (m)
142 REAL, DIMENSION(KI), INTENT(OUT) :: pz0h ! roughness length for heat (m)
143 REAL, DIMENSION(KI), INTENT(OUT) :: pqsurf ! specific humidity at surface (kg/kg)
144 !
145 REAL, DIMENSION(KI), INTENT(IN) :: ppew_a_coef! implicit coefficients
146 REAL, DIMENSION(KI), INTENT(IN) :: ppew_b_coef! needed if HCOUPLING='I'
147 REAL, DIMENSION(KI), INTENT(IN) :: ppet_a_coef
148 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_a_coef
149 REAL, DIMENSION(KI), INTENT(IN) :: ppet_b_coef
150 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_b_coef
151  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
152 !
153 !* 0.2 declarations of local variables
154 !
155 REAL, DIMENSION(KI) :: zta ! Temperature at forcing height above surface orography
156 REAL, DIMENSION(KI) :: zpa ! Pressure at forcing height above surface orography
157 REAL, DIMENSION(KI) :: zps ! Pressure at surface orography
158 REAL, DIMENSION(KI) :: zqa ! Humidity at forcing height above surface orography
159 REAL, DIMENSION(KI) :: zrhoa ! Density at forcing height above surface orography
160 REAL, DIMENSION(KI) :: zlw ! LW rad at forcing height above surface orography
161 REAL, DIMENSION(KI) :: zrain ! Rainfall at forcing height above surface orography
162 REAL, DIMENSION(KI) :: zsnow ! Snowfall at forcing height above surface orography
163 !
164 !
165 REAL, DIMENSION(KI) :: z3d_tot_surf ! ratio between actual surface
166 ! ! and horizontal surface
167 REAL, DIMENSION(KI) :: z3d_tot_surf_inv
168 REAL, DIMENSION(KI,KSW)::zdir_sw ! incoming direct SW radiation
169 ! ! per m2 of actual surface
170 REAL, DIMENSION(KI,KSW)::zsca_sw ! incoming diffuse SW radiation
171 ! ! per m2 of actual surface
172 !
173 REAL, DIMENSION(KI) :: zpeq_b_coef ! 1st explicit coefficient
174 REAL, DIMENSION(KI) :: zpet_b_coef ! 2nd explicit coefficient
175 !
176 INTEGER :: iswb ! number of shortwave spectral bands
177 INTEGER :: jswb ! loop on shortwave spectral bands
178 INTEGER :: jsv ! loop on scalar variables
179 REAL(KIND=JPRB) :: zhook_handle
180 !
181 !-------------------------------------------------------------------------------------
182 !
183 !* 1. Goes from atmospheric orography to surface orography
184 ! ----------------------------------------------------
185 !
186 IF (lhook) CALL dr_hook('COUPLING_ISBA_OROGRAPHY_N',0,zhook_handle)
187 !
188 zpeq_b_coef(:) = ppeq_b_coef(:)
189 zpet_b_coef(:) = ppet_b_coef(:)
190 !
191 IF(lvertshift)THEN
192 !
193  zta(:) = xundef
194  zqa(:) = xundef
195  zps(:) = xundef
196  zpa(:) = xundef
197  zrhoa(:) = xundef
198  zlw(:) = xundef
199  zrain(:) = xundef
200  zsnow(:) = xundef
201 !
202  CALL forcing_vert_shift(pzs,im%I%XZS,pta,pqa,ppa,prhoa,plw,prain,psnow,&
203  zta,zqa,zpa,zrhoa,zlw,zrain,zsnow )
204 !
205  zps(:) = zpa(:) + (pps(:) - ppa(:))
206 !
207  IF (hcoupling=='I') THEN
208  zpeq_b_coef = ppeq_b_coef + zqa - pqa
209  zpet_b_coef = ppet_b_coef + zta/(zpa/xp00)**(xrd/xcpd) - pta/(ppa/xp00)**(xrd/xcpd)
210  ENDIF
211 !
212 ELSE
213 !
214  zta(:) = pta(:)
215  zqa(:) = pqa(:)
216  zps(:) = pps(:)
217  zpa(:) = ppa(:)
218  zrhoa(:) = prhoa(:)
219  zlw(:) = plw(:)
220  zrain(:) = prain(:)
221  zsnow(:) = psnow(:)
222 !
223 ENDIF
224 !
225 !-------------------------------------------------------------------------------------
226 !
227 !* 2. Presence of orography slopes
228 ! ----------------------------
229 !
230 IF(lnosof)THEN
231 !
232 ! No modifications to conserve mass and energy with atmosphere
233 !
234  z3d_tot_surf(:) = 0.
235  z3d_tot_surf_inv(:) = 0.
236 !
237  zsca_sw(:,:) = psca_sw(:,:)
238  zdir_sw(:,:) = pdir_sw(:,:)
239 !
240 ELSE
241 !
242 ! Note that this effect is not conservative and should not be use with
243 ! atmospheric model
244 !
245 !* Incoming and outgoing fluxes are supposed to be on a horizontal surface.
246 ! When slopes are present, the actual surface is LARGER than the
247 ! horizontal surface (none conservative).
248 !
249 !* Therefore, this increase of surface will lead to modify the
250 ! radiative and energy fluxes (none conservative).
251 !
252 !* Note that momentum fluxes are not modified, because the
253 ! effect of subgrid orography is already taken into account
254 ! in the effective roughness length (none conservative).
255 !
256 ! The subgrid slope comes from the XSSO_SLOPE field.
257 !
258  z3d_tot_surf(:) = sqrt(1.+im%I%XSSO_SLOPE(:)**2)
259  z3d_tot_surf_inv(:) = 1./z3d_tot_surf(:)
260 !
261 ! number of spectral shortwave bands
262 !
263  iswb = SIZE(psw_bands)
264 !
265  DO jswb=1,iswb
266 ! correcting for the slope angle (scaterred SW flux)
267 !
268  zsca_sw(:,jswb) = psca_sw(:,jswb) * z3d_tot_surf_inv(:)
269 
270 ! correcting for the slope angle (scaterred SW flux)
271 !
272  zdir_sw(:,jswb) = pdir_sw(:,jswb) * z3d_tot_surf_inv(:)
273  END DO
274 !
275 ! part of LW flux is received from the surface itself, so the outgoing flux
276 ! is needed.
277 !
278 ! incoming LW radiation per m2 of actual surface
279 !
280  zlw(:) = zlw(:) * z3d_tot_surf_inv(:) &
281  + xstefan*im%I%XEMIS_NAT(:)*im%I%XTSRAD_NAT(:)**4 * (1.-z3d_tot_surf_inv(:))
282 !
283 ! liquid precipitation per m2 of actual surface
284 !
285  zrain(:) = zrain(:) * z3d_tot_surf_inv(:)
286 !
287 ! solid precipitation per m2 of actual surface
288 !
289  zsnow(:) = zsnow(:) * z3d_tot_surf_inv(:)
290 !
291 ENDIF
292 !
293 !-------------------------------------------------------------------------------------
294 !
295 !* 3. Call of ISBA
296 ! ------------
297 !
298  CALL coupling_isba_canopy_n(dtco, ug, u, uss, im, dtgd, dtgr, tgro, dst, slt, &
299  hprogram, hcoupling, &
300  ptstep, kyear, kmonth, kday, ptime, &
301  ki, ksv, ksw, &
302  ptsun, pzenith, pzenith2, pazim, &
303  pzref, puref, pzs, pu, pv, zqa, zta, zrhoa, psv, pco2, hsv, &
304  zrain, zsnow, zlw, zdir_sw, zsca_sw, psw_bands, zps, zpa, &
305  psftq, psfth, psfts, psfco2, psfu, psfv, &
306  ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0, pz0h, pqsurf, &
307  ppew_a_coef, ppew_b_coef, &
308  ppet_a_coef, ppeq_a_coef, zpet_b_coef, zpeq_b_coef, &
309  'OK' )
310 !
311 !-------------------------------------------------------------------------------------
312 !
313 !* 4. Optional modification of turbulent energy and gaz fluxes
314 ! --------------------------------------------------------
315 !
316 IF(.NOT.lnosof)THEN
317  psfth(:) = psfth(:) * z3d_tot_surf(:)
318  psftq(:) = psftq(:) * z3d_tot_surf(:)
319  psfco2(:) = psfco2(:) * z3d_tot_surf(:)
320  DO jsv=1,SIZE(psfts,2)
321  psfts(:,jsv) = psfts(:,jsv) * z3d_tot_surf(:)
322  END DO
323 ENDIF
324 !
325 IF (lhook) CALL dr_hook('COUPLING_ISBA_OROGRAPHY_N',1,zhook_handle)
326 !
327 !-------------------------------------------------------------------------------------
328 !
329 END SUBROUTINE coupling_isba_orography_n
subroutine coupling_isba_canopy_n(DTCO, UG, U, USS, IM, DTGD, DTGR, TGRO, DST, SLT, HPROGRAM, HCOUPLING, 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 coupling_isba_orography_n(DTCO, UG, U, USS, IM, DTGD, DTGR, TGRO, DST, SLT, HPROGRAM, HCOUPLING, 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 forcing_vert_shift(PZS_ATM, PZS_SURF, PTA_ATM, PQA_ATM, PPA_ATM, PRHOA_ATM, PLW_ATM, PRAIN_ATM, PSNOW_ATM, PTA_SURF, PQA_SURF, PPA_SURF, PRHOA_SURF, PLW_SURF, PRAIN_SURF, PSNOW_SURF)