SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
coupling_isba_svatn.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_svat_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_SVAT_n * - Chooses the time method (explicit,
19 !! implicit, time-spliting) for ISBA scheme
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 !! A. Bogatchev 09/2005 EBA snow option
39 !! A. Boone 11/2009 Exner correction for Offline T-B coef
40 !! B. Decharme 11/2009 Implicit coupling ok with all snow scheme
41 !! B. Decharme 04/2013 new coupling variables and init local variables
42 !!-------------------------------------------------------------------
43 !
44 !
45 USE modd_surfex_n, ONLY : isba_model_t
46 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
54 USE modd_dst_n, ONLY : dst_t
55 USE modd_slt_n, ONLY : slt_t
56 !
57 !
58 USE modd_surf_par, ONLY : xundef
59 !
60 USE yomhook ,ONLY : lhook, dr_hook
61 USE parkind1 ,ONLY : jprb
62 !
63 USE modi_coupling_isba_orography_n
64 !
65 IMPLICIT NONE
66 !
67 !* 0.1 declarations of arguments
68 !
69 !
70 TYPE(isba_model_t), INTENT(INOUT) :: im
71 TYPE(data_cover_t), INTENT(INOUT) :: dtco
72 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
73 TYPE(surf_atm_t), INTENT(INOUT) :: u
74 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
75 TYPE(data_teb_garden_t), INTENT(INOUT) :: dtgd
76 TYPE(data_teb_greenroof_t), INTENT(INOUT) :: dtgr
77 TYPE(teb_greenroof_options_t), INTENT(INOUT) :: tgro
78 TYPE(dst_t), INTENT(INOUT) :: dst
79 TYPE(slt_t), INTENT(INOUT) :: slt
80 !
81  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
82  CHARACTER(LEN=1), INTENT(IN) :: hcoupling ! type of coupling
83  ! 'E' : explicit
84  ! 'I' : implicit
85 INTEGER, INTENT(IN) :: kyear ! current year (UTC)
86 INTEGER, INTENT(IN) :: kmonth ! current month (UTC)
87 INTEGER, INTENT(IN) :: kday ! current day (UTC)
88 REAL, INTENT(IN) :: ptime ! current time since midnight (UTC, s)
89 INTEGER, INTENT(IN) :: ki ! number of points
90 INTEGER, INTENT(IN) :: ksv ! number of scalars
91 INTEGER, INTENT(IN) :: ksw ! number of short-wave spectral bands
92 REAL, DIMENSION(KI), INTENT(IN) :: ptsun ! solar time (s from midnight)
93 REAL, INTENT(IN) :: ptstep ! atmospheric time-step (s)
94 REAL, DIMENSION(KI), INTENT(IN) :: pzref ! height of T,q forcing (m)
95 REAL, DIMENSION(KI), INTENT(IN) :: puref ! height of wind forcing (m)
96 !
97 REAL, DIMENSION(KI), INTENT(IN) :: pta ! air temperature forcing (K)
98 REAL, DIMENSION(KI), INTENT(IN) :: pqa ! air humidity forcing (kg/m3)
99 REAL, DIMENSION(KI), INTENT(IN) :: prhoa ! air density (kg/m3)
100 REAL, DIMENSION(KI,KSV),INTENT(IN) :: psv ! scalar variables
101 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
102 ! !
103  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: hsv ! name of all scalar variables
104 REAL, DIMENSION(KI), INTENT(IN) :: pu ! zonal wind (m/s)
105 REAL, DIMENSION(KI), INTENT(IN) :: pv ! meridian wind (m/s)
106 REAL, DIMENSION(KI,KSW),INTENT(IN) :: pdir_sw ! direct solar radiation (on horizontal surf.)
107 ! ! (W/m2)
108 REAL, DIMENSION(KI,KSW),INTENT(IN) :: psca_sw ! diffuse solar radiation (on horizontal surf.)
109 ! ! (W/m2)
110 REAL, DIMENSION(KSW),INTENT(IN) :: psw_bands ! mean wavelength of each shortwave band (m)
111 REAL, DIMENSION(KI), INTENT(IN) :: pzenith ! zenithal angle at t (radian from the vertical)
112 REAL, DIMENSION(KI), INTENT(IN) :: pzenith2 ! zenithal angle at t+1 (radian from the vertical)
113 REAL, DIMENSION(KI), INTENT(IN) :: pazim ! azimuthal angle (radian from North, clockwise)
114 REAL, DIMENSION(KI), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
115 ! ! (W/m2)
116 REAL, DIMENSION(KI), INTENT(IN) :: pps ! pressure at atmospheric model surface (Pa)
117 REAL, DIMENSION(KI), INTENT(IN) :: ppa ! pressure at forcing level (Pa)
118 REAL, DIMENSION(KI), INTENT(IN) :: pzs ! atmospheric model orography (m)
119 REAL, DIMENSION(KI), INTENT(IN) :: pco2 ! CO2 concentration in the air (kg/m3)
120 REAL, DIMENSION(KI), INTENT(IN) :: psnow ! snow precipitation (kg/m2/s)
121 REAL, DIMENSION(KI), INTENT(IN) :: prain ! liquid precipitation (kg/m2/s)
122 !
123 REAL, DIMENSION(KI), INTENT(OUT) :: psfth ! flux of heat (W/m2)
124 REAL, DIMENSION(KI), INTENT(OUT) :: psftq ! flux of water vapor (kg/m2/s)
125 REAL, DIMENSION(KI), INTENT(OUT) :: psfu ! zonal momentum flux (Pa)
126 REAL, DIMENSION(KI), INTENT(OUT) :: psfv ! meridian momentum flux (Pa)
127 REAL, DIMENSION(KI), INTENT(OUT) :: psfco2 ! flux of CO2 (m/s*kg_CO2/kg_air)
128 REAL, DIMENSION(KI,KSV),INTENT(OUT):: psfts ! flux of scalar var. (kg/m2/s)
129 !
130 REAL, DIMENSION(KI), INTENT(OUT) :: ptrad ! radiative temperature (K)
131 REAL, DIMENSION(KI,KSW),INTENT(OUT):: pdir_alb! direct albedo for each spectral band (-)
132 REAL, DIMENSION(KI,KSW),INTENT(OUT):: psca_alb! diffuse albedo for each spectral band (-)
133 REAL, DIMENSION(KI), INTENT(OUT) :: pemis ! emissivity (-)
134 !
135 REAL, DIMENSION(KI), INTENT(OUT) :: ptsurf ! surface effective temperature (K)
136 REAL, DIMENSION(KI), INTENT(OUT) :: pz0 ! roughness length for momentum (m)
137 REAL, DIMENSION(KI), INTENT(OUT) :: pz0h ! roughness length for heat (m)
138 REAL, DIMENSION(KI), INTENT(OUT) :: pqsurf ! specific humidity at surface (kg/kg)
139 !
140 REAL, DIMENSION(KI), INTENT(IN) :: ppew_a_coef! implicit coefficients
141 REAL, DIMENSION(KI), INTENT(IN) :: ppew_b_coef! needed if HCOUPLING='I'
142 REAL, DIMENSION(KI), INTENT(IN) :: ppet_a_coef
143 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_a_coef
144 REAL, DIMENSION(KI), INTENT(IN) :: ppet_b_coef
145 REAL, DIMENSION(KI), INTENT(IN) :: ppeq_b_coef
146  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
147 !
148 !* 0.2 declarations of local variables
149 !
150 REAL, DIMENSION(KI) :: zsfth ! surface temperature flux
151 REAL, DIMENSION(KI) :: zsftq ! surface water vapor flux
152 REAL, DIMENSION(KI) :: zsfco2 ! surface CO2 flux
153 REAL, DIMENSION(KI,KSV) :: zsfts ! surface scalar flux
154 REAL, DIMENSION(KI) :: zsfu ! zonal momentum flux
155 REAL, DIMENSION(KI) :: zsfv ! meridian momentum flux
156 REAL, DIMENSION(KI) :: ztrad ! surface radiative temperature
157 REAL, DIMENSION(KI) :: zemis ! surface emissivity
158 REAL, DIMENSION(KI,KSW) :: zdir_alb! direct surface albedo
159 REAL, DIMENSION(KI,KSW) :: zsca_alb! diffuse surface albedo
160 REAL, DIMENSION(KI) :: ztsurf ! surface effective temperature (K)
161 REAL, DIMENSION(KI) :: zz0 ! roughness length for momentum (m)
162 REAL, DIMENSION(KI) :: zz0h ! roughness length for heat (m)
163 REAL, DIMENSION(KI) :: zqsurf ! specific humidity at surface (kg/kg)
164 !
165 REAL, DIMENSION(KI) :: zwork_lw ! work array for mean upward longwave surface flux
166 REAL, DIMENSION(KI) :: zwork_z0 ! work array for mean roughness length for momentum
167 REAL, DIMENSION(KI) :: zwork_z0h ! work array for mean roughness length for heat
168 !
169 INTEGER :: jt ! time loop counter
170 INTEGER :: it ! total number of surface timesteps in one atmospheric timestep
171 REAL :: zt ! total number of surface timesteps in one atmospheric timestep
172 REAL :: ztstep ! surface time step
173 !
174 REAL(KIND=JPRB) :: zhook_handle
175 !
176 !-------------------------------------------------------------------------------------
177 !
178 !* 1. number of time-steps
179 ! --------------------
180 !
181 !* only one timestep in Implicit coupling
182 IF (lhook) CALL dr_hook('COUPLING_ISBA_SVAT_N',0,zhook_handle)
183 IF (hcoupling=='I') THEN
184  it=1
185  zt=1.
186  ztstep=ptstep
187 !
188 !* same timestep as atmospheric timestep as default
189 ELSE IF (im%I%XTSTEP==xundef) THEN
190  it=1
191  zt=1.
192  ztstep=ptstep
193 !
194 !* case of specified SVAT time-step
195 ELSE
196  it=max(nint(ptstep/im%I%XTSTEP),1)
197  zt=float(it)
198  ztstep=ptstep/zt
199 ENDIF
200 !
201 !* 3. initialization of outputs
202 ! -------------------------
203 !
204 psftq = 0.0
205 psfth = 0.0
206 psfts = 0.0
207 psfco2 = 0.0
208 psfu = 0.0
209 psfv = 0.0
210 ptrad = 0.0
211 pdir_alb= 0.0
212 psca_alb= 0.0
213 pemis = 0.0
214 ptsurf = 0.0
215 pz0 = 0.0
216 pz0h = 0.0
217 pqsurf = 0.0
218 !
219 zsfth = 0.0 ! surface temperature flux
220 zsftq = 0.0 ! surface water vapor flux
221 zsfco2 = 0.0 ! surface CO2 flux
222 zsfts = 0.0 ! surface scalar flux
223 zsfu = 0.0 ! zonal momentum flux
224 zsfv = 0.0 ! meridian momentum flux
225 ztrad = 0.0 ! surface radiative temperature
226 zemis = 0.0 ! surface emissivity
227 zdir_alb= 0.0 ! direct surface albedo
228 zsca_alb= 0.0 ! diffuse surface albedo
229 ztsurf = 0.0 ! surface effective temperature (K)
230 zz0 = 0.0 ! roughness length for momentum (m)
231 zz0h = 0.0 ! roughness length for heat (m)
232 zqsurf = 0.0 ! specific humidity at surface
233 !
234 zwork_lw = 0.0 ! work array for mean upward longwave surface flux
235 zwork_z0 = 0.0 ! work array for mean roughness length for momentum
236 zwork_z0h= 0.0 ! work array for mean roughness length for heat
237 !
238 !* 4. loop on surface time-step
239 ! -------------------------
240 !
241 DO jt=1,it
242 !
243  CALL coupling_isba_orography_n(dtco, ug, u, uss, im, dtgd, dtgr, tgro, dst, slt, &
244  hprogram, hcoupling, &
245  ztstep, kyear, kmonth, kday, ptime, &
246  ki, ksv, ksw, &
247  ptsun, pzenith, pzenith2, pazim, &
248  pzref, puref, pzs, pu, pv, pqa, pta, prhoa, psv, pco2, hsv, &
249  prain, psnow, plw, pdir_sw, psca_sw, psw_bands, pps, ppa, &
250  zsftq, zsfth, zsfts, zsfco2, zsfu, zsfv, &
251  ztrad, zdir_alb, zsca_alb, zemis, ztsurf, zz0, zz0h, zqsurf, &
252  ppew_a_coef, ppew_b_coef, &
253  ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
254  'OK' )
255 !
256  psftq = psftq + zsftq / zt
257  psfth = psfth + zsfth / zt
258  psfts = psfts + zsfts / zt
259  psfco2 = psfco2 + zsfco2 / zt
260  psfu = psfu + zsfu / zt
261  psfv = psfv + zsfv / zt
262  pemis = pemis + zemis / zt
263  pdir_alb = pdir_alb + zdir_alb / zt
264  psca_alb = psca_alb + zsca_alb / zt
265  ptsurf = ptsurf + ztsurf / zt
266  pqsurf = pqsurf + zqsurf / zt
267 !
268  zwork_lw = zwork_lw + zemis*ztrad**4 / zt
269  zwork_z0 = zwork_z0 + (1.0/(log(puref(:)/zz0 ))**2) / zt
270  zwork_z0h = zwork_z0h + (1.0/(log(pzref(:)/zz0h))**2) / zt
271 !
272 END DO
273 !
274 !* radiative temperature retrieved from upward longwave flux
275 !
276 ptrad = (zwork_lw/pemis)**(0.25)
277 !
278 !* roughness length for momentum and heat
279 !
280 pz0 = puref(:) * exp( - sqrt(1./zwork_z0(:)) )
281 pz0h = pzref(:) * exp( - sqrt(1./zwork_z0h(:)) )
282 !
283 IF (lhook) CALL dr_hook('COUPLING_ISBA_SVAT_N',1,zhook_handle)
284 !
285 !-------------------------------------------------------------------------------------
286 !
287 END SUBROUTINE coupling_isba_svat_n
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 coupling_isba_svat_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)