SURFEX v8.1
General documentation of Surfex
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, SB, NAG, CHI, NCHI, DTV, ID, NGB, GB, &
7  ISS, NISS, IG, NIG, IO, S, K, NK, NP, NPE, NDST, SLT, &
8  HPROGRAM, HCOUPLING, PTSTEP, &
9  KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, &
10  PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PZS, PU, PV, &
11  PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, &
12  PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, &
13  PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, &
14  PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, &
15  PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, &
16  PPEQ_B_COEF, HTEST )
17 ! ###############################################################################
18 !
19 !!**** *COUPLING_ISBA_OROGRAPHY_n * - Parameterizes effects of subgrid
20 !! orography on radiative and energy fluxes
21 !!
22 !! PURPOSE
23 !! -------
24 !
25 !!** METHOD
26 !! ------
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !!
32 !! AUTHOR
33 !! ------
34 !! V. Masson
35 !!
36 !! MODIFICATIONS
37 !! -------------
38 !! Original 01/2004
39 !! modified 05/2004 by P. LeMoigne: vertical shift of implicit
40 !! coefficients
41 !! B. Decharme 2008 reset the subgrid topographic effect on the forcing
42 !! B. Decharme 04/2013 new coupling variables and optimization
43 !! improve forcing vertical shift
44 !----------------------------------------------------------------
45 !
46 USE modd_agri_n, ONLY : agri_np_t
48 USE modd_data_isba_n, ONLY : data_isba_t
49 USE modd_surfex_n, ONLY : isba_diag_t
51 USE modd_sso_n, ONLY : sso_t, sso_np_t
52 USE modd_sfx_grid_n, ONLY : grid_t, grid_np_t
55 !
56 USE modd_dst_n, ONLY : dst_np_t
57 !
58 USE modd_canopy_n, ONLY : canopy_t
59 !
62 USE modd_surf_atm_n, ONLY : surf_atm_t
63 USE modd_sso_n, ONLY : sso_t, sso_np_t
64 USE modd_data_isba_n, ONLY : data_isba_t
65 USE modd_slt_n, ONLY : slt_t
66 !
67 USE modd_surf_par,ONLY : xundef
68 USE modd_csts, ONLY : xstefan, xcpd, xrd, xp00
69 !
70 USE modd_surf_atm, ONLY : lnosof, lvertshift
71 !
72 USE modi_forcing_vert_shift
73 USE modi_coupling_isba_canopy_n
74 !
75 USE yomhook ,ONLY : lhook, dr_hook
76 USE parkind1 ,ONLY : jprb
77 !
78 IMPLICIT NONE
79 !
80 !* 0.1 declarations of arguments
81 !
82 TYPE(agri_np_t), INTENT(INOUT) :: NAG
83 TYPE(ch_isba_t), INTENT(INOUT) :: CHI
84 TYPE(ch_isba_np_t), INTENT(INOUT) :: NCHI
85 TYPE(data_isba_t), INTENT(INOUT) :: DTV
86 TYPE(isba_diag_t), INTENT(INOUT) :: ID
87 TYPE(gr_biog_np_t), INTENT(INOUT) :: NGB
88 TYPE(gr_biog_t), INTENT(INOUT) :: GB
89 TYPE(sso_t), INTENT(INOUT) :: ISS
90 TYPE(sso_np_t), INTENT(INOUT) :: NISS
91 TYPE(grid_t), INTENT(INOUT) :: IG
92 TYPE(grid_np_t), INTENT(INOUT) :: NIG
93 TYPE(isba_options_t), INTENT(INOUT) :: IO
94 TYPE(isba_s_t), INTENT(INOUT) :: S
95 TYPE(isba_k_t), INTENT(INOUT) :: K
96 TYPE(isba_nk_t), INTENT(INOUT) :: NK
97 TYPE(isba_np_t), INTENT(INOUT) :: NP
98 TYPE(isba_npe_t), INTENT(INOUT) ::NPE
99 !
100 TYPE(dst_np_t), INTENT(INOUT) :: NDST
101 !
102 TYPE(canopy_t), INTENT(INOUT) :: SB
103 !
104 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
105 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
106 TYPE(surf_atm_t), INTENT(INOUT) :: U
107 TYPE(sso_t), INTENT(INOUT) :: USS
108 TYPE(slt_t), INTENT(INOUT) :: SLT
109 !
110  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
111  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
112  ! 'E' : explicit
113  ! 'I' : implicit
114 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
115 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
116 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
117 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
118 INTEGER, INTENT(IN) :: KI ! number of points
119 INTEGER, INTENT(IN) :: KSV ! number of scalars
120 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
121 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
122 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
123 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
124 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
125 !
126 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
127 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
128 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
129 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
130 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
131 ! !
132  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
133 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
134 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
135 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
136 ! ! (W/m2)
137 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
138 ! ! (W/m2)
139 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
140 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical)
141 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1(radian from the vertical)
142 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
143 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
144 ! ! (W/m2)
145 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
146 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
147 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
148 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
149 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
150 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
151 !
152 !
153 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
154 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
155 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
156 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
157 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
158 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
159 !
160 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
161 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
162 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
163 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
164 !
165 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
166 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
167 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
168 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
169 !
170 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
171 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
172 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
173 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
174 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
175 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
176  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
177 !
178 !* 0.2 declarations of local variables
179 !
180 REAL, DIMENSION(KI) :: ZTA ! Temperature at forcing height above surface orography
181 REAL, DIMENSION(KI) :: ZPA ! Pressure at forcing height above surface orography
182 REAL, DIMENSION(KI) :: ZPS ! Pressure at surface orography
183 REAL, DIMENSION(KI) :: ZQA ! Humidity at forcing height above surface orography
184 REAL, DIMENSION(KI) :: ZRHOA ! Density at forcing height above surface orography
185 REAL, DIMENSION(KI) :: ZLW ! LW rad at forcing height above surface orography
186 REAL, DIMENSION(KI) :: ZRAIN ! Rainfall at forcing height above surface orography
187 REAL, DIMENSION(KI) :: ZSNOW ! Snowfall at forcing height above surface orography
188 !
189 !
190 REAL, DIMENSION(KI) :: Z3D_TOT_SURF ! ratio between actual surface
191 ! ! and horizontal surface
192 REAL, DIMENSION(KI) :: Z3D_TOT_SURF_INV
193 REAL, DIMENSION(KI,KSW)::ZDIR_SW ! incoming direct SW radiation
194 ! ! per m2 of actual surface
195 REAL, DIMENSION(KI,KSW)::ZSCA_SW ! incoming diffuse SW radiation
196 ! ! per m2 of actual surface
197 !
198 REAL, DIMENSION(KI) :: ZPEQ_B_COEF ! 1st explicit coefficient
199 REAL, DIMENSION(KI) :: ZPET_B_COEF ! 2nd explicit coefficient
200 !
201 INTEGER :: ISWB ! number of shortwave spectral bands
202 INTEGER :: JSWB ! loop on shortwave spectral bands
203 INTEGER :: JSV ! loop on scalar variables
204 REAL(KIND=JPRB) :: ZHOOK_HANDLE
205 !
206 !-------------------------------------------------------------------------------------
207 !
208 !* 1. Goes from atmospheric orography to surface orography
209 ! ----------------------------------------------------
210 !
211 IF (lhook) CALL dr_hook('COUPLING_ISBA_OROGRAPHY_N',0,zhook_handle)
212 !
213 zpeq_b_coef(:) = ppeq_b_coef(:)
214 zpet_b_coef(:) = ppet_b_coef(:)
215 !
216 IF(lvertshift)THEN
217 !
218  zta(:) = xundef
219  zqa(:) = xundef
220  zps(:) = xundef
221  zpa(:) = xundef
222  zrhoa(:) = xundef
223  zlw(:) = xundef
224  zrain(:) = xundef
225  zsnow(:) = xundef
226 !
227  CALL forcing_vert_shift(pzs, s%XZS, pta, pqa, ppa, prhoa, plw, prain, psnow, &
228  zta, zqa, zpa, zrhoa, zlw, zrain, zsnow )
229 !
230  zps(:) = zpa(:) + (pps(:) - ppa(:))
231 !
232  IF (hcoupling=='I') THEN
233  zpeq_b_coef = ppeq_b_coef + zqa - pqa
234  zpet_b_coef = ppet_b_coef + zta/(zpa/xp00)**(xrd/xcpd) - pta/(ppa/xp00)**(xrd/xcpd)
235  ENDIF
236 !
237 ELSE
238 !
239  zta(:) = pta(:)
240  zqa(:) = pqa(:)
241  zps(:) = pps(:)
242  zpa(:) = ppa(:)
243  zrhoa(:) = prhoa(:)
244  zlw(:) = plw(:)
245  zrain(:) = prain(:)
246  zsnow(:) = psnow(:)
247 !
248 ENDIF
249 !
250 !-------------------------------------------------------------------------------------
251 !
252 !* 2. Presence of orography slopes
253 ! ----------------------------
254 !
255 IF(lnosof)THEN
256 !
257 ! No modifications to conserve mass and energy with atmosphere
258 !
259  z3d_tot_surf(:) = 0.
260  z3d_tot_surf_inv(:) = 0.
261 !
262  zsca_sw(:,:) = psca_sw(:,:)
263  zdir_sw(:,:) = pdir_sw(:,:)
264 !
265 ELSE
266 !
267 ! Note that this effect is not conservative and should not be use with
268 ! atmospheric model
269 !
270 !* Incoming and outgoing fluxes are supposed to be on a horizontal surface.
271 ! When slopes are present, the actual surface is LARGER than the
272 ! horizontal surface (none conservative).
273 !
274 !* Therefore, this increase of surface will lead to modify the
275 ! radiative and energy fluxes (none conservative).
276 !
277 !* Note that momentum fluxes are not modified, because the
278 ! effect of subgrid orography is already taken into account
279 ! in the effective roughness length (none conservative).
280 !
281 ! The subgrid slope comes from the XSSO_SLOPE field.
282 !
283  z3d_tot_surf(:) = sqrt(1.+iss%XSSO_SLOPE(:)**2)
284  z3d_tot_surf_inv(:) = 1./z3d_tot_surf(:)
285 !
286 ! number of spectral shortwave bands
287 !
288  iswb = SIZE(psw_bands)
289 !
290  DO jswb=1,iswb
291 ! correcting for the slope angle (scaterred SW flux)
292 !
293  zsca_sw(:,jswb) = psca_sw(:,jswb) * z3d_tot_surf_inv(:)
294 
295 ! correcting for the slope angle (scaterred SW flux)
296 !
297  zdir_sw(:,jswb) = pdir_sw(:,jswb) * z3d_tot_surf_inv(:)
298  END DO
299 !
300 ! part of LW flux is received from the surface itself, so the outgoing flux
301 ! is needed.
302 !
303 ! incoming LW radiation per m2 of actual surface
304 !
305  zlw(:) = zlw(:) * z3d_tot_surf_inv(:) &
306  + xstefan*s%XEMIS_NAT(:)*s%XTSRAD_NAT(:)**4 * (1.-z3d_tot_surf_inv(:))
307 !
308 ! liquid precipitation per m2 of actual surface
309 !
310  zrain(:) = zrain(:) * z3d_tot_surf_inv(:)
311 !
312 ! solid precipitation per m2 of actual surface
313 !
314  zsnow(:) = zsnow(:) * z3d_tot_surf_inv(:)
315 !
316 ENDIF
317 !
318 !-------------------------------------------------------------------------------------
319 !
320 !* 3. Call of ISBA
321 ! ------------
322 !
323  CALL coupling_isba_canopy_n(dtco, ug, u, uss, sb, nag, chi, nchi, dtv, id, ngb, gb, &
324  iss, niss, ig, nig, io, s, k, nk, np, npe, ndst, slt, &
325  hprogram, hcoupling, ptstep, &
326  kyear, kmonth, kday, ptime, ki, ksv, ksw, ptsun, pzenith, &
327  pzenith2, pazim, pzref, puref, pzs, pu, pv, zqa, zta, &
328  zrhoa, psv, pco2, hsv, zrain, zsnow, zlw, zdir_sw, &
329  zsca_sw, psw_bands, zps, zpa, psftq, psfth, psfts, psfco2,&
330  psfu, psfv, ptrad, pdir_alb, psca_alb, pemis, ptsurf, pz0,&
331  pz0h, pqsurf, ppew_a_coef, ppew_b_coef, ppet_a_coef, &
332  ppeq_a_coef, zpet_b_coef, zpeq_b_coef, 'OK' )
333 !
334 !-------------------------------------------------------------------------------------
335 !
336 !* 4. Optional modification of turbulent energy and gaz fluxes
337 ! --------------------------------------------------------
338 !
339 IF(.NOT.lnosof)THEN
340  psfth(:) = psfth(:) * z3d_tot_surf(:)
341  psftq(:) = psftq(:) * z3d_tot_surf(:)
342  psfco2(:) = psfco2(:) * z3d_tot_surf(:)
343  DO jsv=1,SIZE(psfts,2)
344  psfts(:,jsv) = psfts(:,jsv) * z3d_tot_surf(:)
345  END DO
346 ENDIF
347 !
348 IF (lhook) CALL dr_hook('COUPLING_ISBA_OROGRAPHY_N',1,zhook_handle)
349 !
350 !-------------------------------------------------------------------------------------
351 !
352 END SUBROUTINE coupling_isba_orography_n
subroutine coupling_isba_canopy_n(DTCO, UG, U, USS, SB, NAG, CHI, NCHI, DTV, ID, NGB, GB, ISS, NISS, IG, NIG, IO, S, K, NK, NP, NPE, NDST, 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, SB, NAG, CHI, NCHI, DTV, ID, NGB, GB, ISS, NISS, IG, NIG, IO, S, K, NK, NP, NPE, NDST, 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)
real, save xcpd
Definition: modd_csts.F90:63
real, save xstefan
Definition: modd_csts.F90:59
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
logical lvertshift
real, save xp00
Definition: modd_csts.F90:57
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)