SURFEX v8.1
General documentation of Surfex
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, NDST, SLT, HPROGRAM, HCOUPLING, PTSTEP, &
7  KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, &
8  PZENITH2, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, &
9  PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, &
10  PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV,&
11  PTRAD, 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_ISBA_SVAT_n * - Chooses the time method (explicit,
17 !! implicit, time-spliting) for ISBA scheme
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 !! A. Bogatchev 09/2005 EBA snow option
37 !! A. Boone 11/2009 Exner correction for Offline T-B coef
38 !! B. Decharme 11/2009 Implicit coupling ok with all snow scheme
39 !! B. Decharme 04/2013 new coupling variables and init local variables
40 !!-------------------------------------------------------------------
41 !
42 !
43 USE modd_surfex_n, ONLY : isba_model_t
44 !
47 USE modd_surf_atm_n, ONLY : surf_atm_t
48 USE modd_sso_n, ONLY : sso_t
49 USE modd_dst_n, ONLY : dst_np_t
50 USE modd_slt_n, ONLY : slt_t
51 !
52 USE modd_surf_par, ONLY : xundef
53 !
54 USE yomhook ,ONLY : lhook, dr_hook
55 USE parkind1 ,ONLY : jprb
56 !
57 USE modi_coupling_isba_orography_n
58 !
59 IMPLICIT NONE
60 !
61 !* 0.1 declarations of arguments
62 !
63 TYPE(isba_model_t), INTENT(INOUT) :: IM
64 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
65 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
66 TYPE(surf_atm_t), INTENT(INOUT) :: U
67 TYPE(sso_t), INTENT(INOUT) :: USS
68 TYPE(dst_np_t), INTENT(INOUT) :: NDST
69 TYPE(slt_t), INTENT(INOUT) :: SLT
70 !
71  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
72  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
73  ! 'E' : explicit
74  ! 'I' : implicit
75 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
76 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
77 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
78 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
79 INTEGER, INTENT(IN) :: KI ! number of points
80 INTEGER, INTENT(IN) :: KSV ! number of scalars
81 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
82 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
83 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
84 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
85 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
86 !
87 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
88 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
89 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
90 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
91 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
92 ! !
93  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
94 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
95 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
96 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
97 ! ! (W/m2)
98 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
99 ! ! (W/m2)
100 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
101 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle at t (radian from the vertical)
102 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH2 ! zenithal angle at t+1 (radian from the vertical)
103 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
104 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
105 ! ! (W/m2)
106 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
107 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
108 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
109 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
110 REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
111 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
112 !
113 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
114 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
115 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
116 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
117 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (m/s*kg_CO2/kg_air)
118 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
119 !
120 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
121 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
122 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
123 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
124 !
125 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
126 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
127 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
128 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
129 !
130 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
131 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
132 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
133 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
134 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
135 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
136  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
137 !
138 !* 0.2 declarations of local variables
139 !
140 REAL, DIMENSION(KI) :: ZSFTH ! surface temperature flux
141 REAL, DIMENSION(KI) :: ZSFTQ ! surface water vapor flux
142 REAL, DIMENSION(KI) :: ZSFCO2 ! surface CO2 flux
143 REAL, DIMENSION(KI,KSV) :: ZSFTS ! surface scalar flux
144 REAL, DIMENSION(KI) :: ZSFU ! zonal momentum flux
145 REAL, DIMENSION(KI) :: ZSFV ! meridian momentum flux
146 REAL, DIMENSION(KI) :: ZTRAD ! surface radiative temperature
147 REAL, DIMENSION(KI) :: ZEMIS ! surface emissivity
148 REAL, DIMENSION(KI,KSW) :: ZDIR_ALB! direct surface albedo
149 REAL, DIMENSION(KI,KSW) :: ZSCA_ALB! diffuse surface albedo
150 REAL, DIMENSION(KI) :: ZTSURF ! surface effective temperature (K)
151 REAL, DIMENSION(KI) :: ZZ0 ! roughness length for momentum (m)
152 REAL, DIMENSION(KI) :: ZZ0H ! roughness length for heat (m)
153 REAL, DIMENSION(KI) :: ZQSURF ! specific humidity at surface (kg/kg)
154 !
155 REAL, DIMENSION(KI) :: ZWORK_LW ! work array for mean upward longwave surface flux
156 REAL, DIMENSION(KI) :: ZWORK_Z0 ! work array for mean roughness length for momentum
157 REAL, DIMENSION(KI) :: ZWORK_Z0H ! work array for mean roughness length for heat
158 !
159 INTEGER :: JT ! time loop counter
160 INTEGER :: IT ! total number of surface timesteps in one atmospheric timestep
161 REAL :: ZT ! total number of surface timesteps in one atmospheric timestep
162 REAL :: ZTSTEP ! surface time step
163 !
164 REAL(KIND=JPRB) :: ZHOOK_HANDLE
165 !
166 !-------------------------------------------------------------------------------------
167 !
168 !* 1. number of time-steps
169 ! --------------------
170 !
171 !* only one timestep in Implicit coupling
172 IF (lhook) CALL dr_hook('COUPLING_ISBA_SVAT_N',0,zhook_handle)
173 IF (hcoupling=='I') THEN
174  it=1
175  zt=1.
176  ztstep=ptstep
177 !
178 !* same timestep as atmospheric timestep as default
179 ELSE IF (im%O%XTSTEP==xundef) THEN
180  it=1
181  zt=1.
182  ztstep=ptstep
183 !
184 !* case of specified SVAT time-step
185 ELSE
186  it=max(nint(ptstep/im%O%XTSTEP),1)
187  zt=float(it)
188  ztstep=ptstep/zt
189 ENDIF
190 !
191 !* 3. initialization of outputs
192 ! -------------------------
193 !
194 psftq = 0.0
195 psfth = 0.0
196 psfts = 0.0
197 psfco2 = 0.0
198 psfu = 0.0
199 psfv = 0.0
200 ptrad = 0.0
201 pdir_alb= 0.0
202 psca_alb= 0.0
203 pemis = 0.0
204 ptsurf = 0.0
205 pz0 = 0.0
206 pz0h = 0.0
207 pqsurf = 0.0
208 !
209 zsfth = 0.0 ! surface temperature flux
210 zsftq = 0.0 ! surface water vapor flux
211 zsfco2 = 0.0 ! surface CO2 flux
212 zsfts = 0.0 ! surface scalar flux
213 zsfu = 0.0 ! zonal momentum flux
214 zsfv = 0.0 ! meridian momentum flux
215 ztrad = 0.0 ! surface radiative temperature
216 zemis = 0.0 ! surface emissivity
217 zdir_alb= 0.0 ! direct surface albedo
218 zsca_alb= 0.0 ! diffuse surface albedo
219 ztsurf = 0.0 ! surface effective temperature (K)
220 zz0 = 0.0 ! roughness length for momentum (m)
221 zz0h = 0.0 ! roughness length for heat (m)
222 zqsurf = 0.0 ! specific humidity at surface
223 !
224 zwork_lw = 0.0 ! work array for mean upward longwave surface flux
225 zwork_z0 = 0.0 ! work array for mean roughness length for momentum
226 zwork_z0h= 0.0 ! work array for mean roughness length for heat
227 !
228 !* 4. loop on surface time-step
229 ! -------------------------
230 !
231 DO jt=1,it
232 !
233  CALL coupling_isba_orography_n(dtco, ug, u, uss, im%SB, im%NAG, im%CHI, im%NCHI, im%DTV, &
234  im%ID, im%NGB, im%GB, im%ISS, im%NISS, im%G, im%NG, im%O, &
235  im%S, im%K, im%NK, im%NP, im%NPE, ndst, slt, &
236  hprogram, hcoupling, ztstep, kyear, kmonth, kday, ptime, ki, &
237  ksv, ksw, ptsun, pzenith, pzenith2, pazim, pzref, puref, pzs, &
238  pu, pv, pqa, pta, prhoa, psv, pco2, hsv, prain, psnow, plw, &
239  pdir_sw, psca_sw, psw_bands, pps, ppa, zsftq, zsfth, zsfts, &
240  zsfco2, zsfu, zsfv, ztrad, zdir_alb, zsca_alb, zemis, ztsurf, &
241  zz0, zz0h, zqsurf, ppew_a_coef, ppew_b_coef, ppet_a_coef, &
242  ppeq_a_coef, ppet_b_coef, ppeq_b_coef, 'OK' )
243 !
244  psftq = psftq + zsftq / zt
245  psfth = psfth + zsfth / zt
246  psfts = psfts + zsfts / zt
247  psfco2 = psfco2 + zsfco2 / zt
248  psfu = psfu + zsfu / zt
249  psfv = psfv + zsfv / zt
250  pemis = pemis + zemis / zt
251  pdir_alb = pdir_alb + zdir_alb / zt
252  psca_alb = psca_alb + zsca_alb / zt
253  ptsurf = ptsurf + ztsurf / zt
254  pqsurf = pqsurf + zqsurf / zt
255 !
256  zwork_lw = zwork_lw + zemis*ztrad**4 / zt
257  zwork_z0 = zwork_z0 + (1.0/(log(puref(:)/zz0 ))**2) / zt
258  zwork_z0h = zwork_z0h + (1.0/(log(pzref(:)/zz0h))**2) / zt
259 !
260 END DO
261 !
262 !* radiative temperature retrieved from upward longwave flux
263 !
264 ptrad = (zwork_lw/pemis)**(0.25)
265 !
266 !* roughness length for momentum and heat
267 !
268 pz0 = puref(:) * exp( - sqrt(1./zwork_z0(:)) )
269 pz0h = pzref(:) * exp( - sqrt(1./zwork_z0h(:)) )
270 !
271 IF (lhook) CALL dr_hook('COUPLING_ISBA_SVAT_N',1,zhook_handle)
272 !
273 !-------------------------------------------------------------------------------------
274 !
275 END SUBROUTINE coupling_isba_svat_n
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, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine coupling_isba_svat_n(DTCO, UG, U, USS, IM, 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)