4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE interfsurf_hq(dtime, jour, rmu0, nisurf, knon, knindex, debut, & |
SUBROUTINE interfsurf_hq(dtime, julien, rmu0, nisurf, knon, knindex, debut, & |
8 |
tsoil, qsol, u1_lay, v1_lay, temp_air, spechum, tq_cdrag, petAcoef, & |
tsoil, qsol, u1_lay, v1_lay, temp_air, spechum, tq_cdrag, petAcoef, & |
9 |
peqAcoef, petBcoef, peqBcoef, precip_rain, precip_snow, fder, rugos, & |
peqAcoef, petBcoef, peqBcoef, precip_rain, precip_snow, fder, rugos, & |
10 |
rugoro, snow, qsurf, tsurf, p1lay, ps, radsol, evap, flux_t, fluxlat, & |
rugoro, snow, qsurf, ts, p1lay, ps, radsol, evap, flux_t, fluxlat, & |
11 |
dflux_l, dflux_s, tsurf_new, albedo, z0_new, pctsrf_new_sic, agesno, & |
dflux_l, dflux_s, tsurf_new, albedo, z0_new, pctsrf_new_sic, agesno, & |
12 |
fqcalving, ffonte, run_off_lic_0) |
fqcalving, ffonte, run_off_lic_0) |
13 |
|
|
33 |
USE suphec_m, ONLY: rcpd, rtt |
USE suphec_m, ONLY: rcpd, rtt |
34 |
|
|
35 |
real, intent(IN):: dtime ! pas de temps de la physique (en s) |
real, intent(IN):: dtime ! pas de temps de la physique (en s) |
36 |
integer, intent(IN):: jour ! jour dans l'annee en cours |
integer, intent(IN):: julien ! jour dans l'annee en cours |
37 |
real, intent(IN):: rmu0(klon) ! cosinus de l'angle solaire zenithal |
real, intent(IN):: rmu0(klon) ! cosinus de l'angle solaire zenithal |
38 |
integer, intent(IN):: nisurf ! index de la surface a traiter |
integer, intent(IN):: nisurf ! index de la surface a traiter |
39 |
integer, intent(IN):: knon ! nombre de points de la surface a traiter |
integer, intent(IN):: knon ! nombre de points de la surface a traiter |
74 |
real, intent(IN):: rugoro(klon) ! rugosite orographique |
real, intent(IN):: rugoro(klon) ! rugosite orographique |
75 |
real, intent(INOUT):: snow(:) ! (knon) |
real, intent(INOUT):: snow(:) ! (knon) |
76 |
real, intent(INOUT):: qsurf(klon) |
real, intent(INOUT):: qsurf(klon) |
77 |
real, intent(IN):: tsurf(:) ! (knon) temp\'erature de surface |
real, intent(IN):: ts(:) ! (knon) temp\'erature de surface |
78 |
real, intent(IN):: p1lay(klon) ! pression 1er niveau (milieu de couche) |
real, intent(IN):: p1lay(klon) ! pression 1er niveau (milieu de couche) |
79 |
real, dimension(klon), intent(IN):: ps ! pression au sol |
real, dimension(klon), intent(IN):: ps ! pression au sol |
80 |
|
|
155 |
dif_grnd = 999999. |
dif_grnd = 999999. |
156 |
capsol = 999999. |
capsol = 999999. |
157 |
z0_new = 999999. |
z0_new = 999999. |
|
tsurf_new = 999999. |
|
158 |
|
|
159 |
! Aiguillage vers les differents schemas de surface |
! Aiguillage vers les differents schemas de surface |
160 |
|
|
167 |
! Read albedo from the file containing boundary conditions then |
! Read albedo from the file containing boundary conditions then |
168 |
! add the albedo of snow: |
! add the albedo of snow: |
169 |
|
|
170 |
call interfsur_lim(dtime, jour, knindex, debut, albedo, z0_new) |
call interfsur_lim(dtime, julien, knindex, debut, albedo, z0_new) |
171 |
|
|
172 |
! Calcul de snow et qsurf, hydrologie adapt\'ee |
! Calcul de snow et qsurf, hydrologie adapt\'ee |
173 |
CALL calbeta(is_ter, snow, qsol(:knon), beta(:knon), & |
CALL calbeta(is_ter, snow, qsol(:knon), beta(:knon), & |
174 |
capsol(:knon), dif_grnd(:knon)) |
capsol(:knon), dif_grnd(:knon)) |
175 |
|
|
176 |
IF (soil_model) THEN |
IF (soil_model) THEN |
177 |
CALL soil(dtime, is_ter, snow, tsurf, tsoil, soilcap, soilflux) |
CALL soil(dtime, is_ter, snow, ts, tsoil, soilcap, soilflux) |
178 |
cal = RCPD / soilcap |
cal = RCPD / soilcap |
179 |
radsol(1:knon) = radsol(1:knon) + soilflux |
radsol(1:knon) = radsol(1:knon) + soilflux |
180 |
ELSE |
ELSE |
181 |
cal = RCPD * capsol(:knon) |
cal = RCPD * capsol(:knon) |
182 |
ENDIF |
ENDIF |
183 |
|
|
184 |
CALL calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, & |
CALL calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta(:knon), & |
185 |
beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), & |
tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol(:knon), & |
186 |
radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), & |
dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), & |
187 |
u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), & |
v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & |
188 |
petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, & |
peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, & |
189 |
fluxlat, flux_t, dflux_s(:knon), dflux_l(:knon)) |
dflux_s(:knon), dflux_l(:knon)) |
190 |
CALL fonte_neige(is_ter, dtime, precip_rain(:knon), & |
CALL fonte_neige(is_ter, dtime, precip_rain(:knon), & |
191 |
precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, & |
precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, & |
192 |
fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon)) |
fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon)) |
199 |
case (is_oce) |
case (is_oce) |
200 |
! Surface "oc\'ean", appel \`a l'interface avec l'oc\'ean |
! Surface "oc\'ean", appel \`a l'interface avec l'oc\'ean |
201 |
|
|
202 |
call read_sst(dtime, jour, knindex, debut, tsurf_temp) |
call read_sst(julien, knindex, tsurf_temp) |
203 |
cal = 0. |
cal = 0. |
204 |
beta = 1. |
beta = 1. |
205 |
dif_grnd = 0. |
dif_grnd = 0. |
217 |
! Surface "glace de mer" appel a l'interface avec l'ocean |
! Surface "glace de mer" appel a l'interface avec l'ocean |
218 |
|
|
219 |
DO ii = 1, knon |
DO ii = 1, knon |
|
tsurf_new(ii) = tsurf(ii) |
|
220 |
IF (pctsrf_new_sic(knindex(ii)) < EPSFRA) then |
IF (pctsrf_new_sic(knindex(ii)) < EPSFRA) then |
221 |
snow(ii) = 0. |
snow(ii) = 0. |
222 |
tsurf_new(ii) = RTT - 1.8 |
tsurf_new(ii) = RTT - 1.8 |
223 |
IF (soil_model) tsoil(ii, :) = RTT - 1.8 |
IF (soil_model) tsoil(ii, :) = RTT - 1.8 |
224 |
|
else |
225 |
|
tsurf_new(ii) = ts(ii) |
226 |
endif |
endif |
227 |
enddo |
enddo |
228 |
|
|
266 |
! Surface "glacier continentaux" appel a l'interface avec le sol |
! Surface "glacier continentaux" appel a l'interface avec le sol |
267 |
|
|
268 |
IF (soil_model) THEN |
IF (soil_model) THEN |
269 |
CALL soil(dtime, is_lic, snow, tsurf, tsoil, soilcap, soilflux) |
CALL soil(dtime, is_lic, snow, ts, tsoil, soilcap, soilflux) |
270 |
cal = RCPD / soilcap |
cal = RCPD / soilcap |
271 |
radsol(1:knon) = radsol(1:knon) + soilflux |
radsol(1:knon) = radsol(1:knon) + soilflux |
272 |
ELSE |
ELSE |
276 |
beta = 1. |
beta = 1. |
277 |
dif_grnd = 0. |
dif_grnd = 0. |
278 |
|
|
279 |
call calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, & |
call calcul_fluxs(dtime, ts, p1lay(:knon), cal, & |
280 |
beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), & |
beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), & |
281 |
radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), & |
radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), & |
282 |
u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), & |
u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), & |