/[lmdze]/trunk/phylmd/Interface_surf/interfsurf_hq.f
ViewVC logotype

Contents of /trunk/phylmd/Interface_surf/interfsurf_hq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 206 - (show annotations)
Tue Aug 30 12:52:46 2016 UTC (7 years, 8 months ago) by guez
Original Path: trunk/Sources/phylmd/Interface_surf/interfsurf_hq.f
File size: 12900 byte(s)
Removed dimension klev of flux_[tquv] and y_flux_[tquv] in
clmain. Removed dimension klev of flux_[tquv] in physiq. Removed
dimension klev of flux_[tq] in hbtm. Removed dimension klev of
flux_[tq] in clqh and computations for layers other than the surface
layer. Removed dimension klev of flux_v in clvent and computations for
layers other than the surface layer. Values for layers other than the
surface layer were not used nor output (not even in LMDZ).

Removed argument dnwd0 of concvl. Simply write - mp in physiq
(following LMDZ).

Removed useless intermediary variables zxflux[tquv] in physiq.

1 module interfsurf_hq_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE interfsurf_hq(dtime, jour, rmu0, nisurf, knon, knindex, rlat, &
8 debut, nsoilmx, tsoil, qsol, u1_lay, v1_lay, temp_air, spechum, &
9 tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, precip_rain, &
10 precip_snow, fder, rugos, rugoro, snow, qsurf, tsurf, p1lay, ps, &
11 radsol, evap, flux_t, fluxlat, dflux_l, dflux_s, tsurf_new, albedo, &
12 z0_new, pctsrf_new_sic, agesno, fqcalving, ffonte, run_off_lic_0)
13
14 ! Cette routine sert d'aiguillage entre l'atmosph\`ere et la surface
15 ! en g\'en\'eral (sols continentaux, oc\'eans, glaces) pour les flux de
16 ! chaleur et d'humidit\'e.
17
18 ! Laurent Fairhead, February 2000
19
20 USE abort_gcm_m, ONLY: abort_gcm
21 use alboc_cd_m, only: alboc_cd
22 use alboc_m, only: alboc
23 USE albsno_m, ONLY: albsno
24 use calbeta_m, only: calbeta
25 USE calcul_fluxs_m, ONLY: calcul_fluxs
26 use clesphys2, only: soil_model, cycle_diurne
27 USE dimphy, ONLY: klon
28 USE fonte_neige_m, ONLY: fonte_neige
29 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
30 USE interface_surf, ONLY: run_off_lic, conf_interface
31 USE interfsur_lim_m, ONLY: interfsur_lim
32 use read_sst_m, only: read_sst
33 use soil_m, only: soil
34 USE suphec_m, ONLY: rcpd, rtt
35
36 real, intent(IN):: dtime ! pas de temps de la physique (en s)
37 integer, intent(IN):: jour ! jour dans l'annee en cours
38 real, intent(IN):: rmu0(klon) ! cosinus de l'angle solaire zenithal
39 integer, intent(IN):: nisurf ! index de la surface a traiter
40 integer, intent(IN):: knon ! nombre de points de la surface a traiter
41
42 integer, intent(in):: knindex(:) ! (knon)
43 ! index des points de la surface a traiter
44
45 real, intent(IN):: rlat(klon) ! latitudes
46
47 logical, intent(IN):: debut ! 1er appel a la physique
48 ! (si false calcul simplifie des fluxs sur les continents)
49
50 integer, intent(in):: nsoilmx
51 REAL tsoil(klon, nsoilmx)
52
53 REAL, intent(INOUT):: qsol(klon)
54 ! column-density of water in soil, in kg m-2
55
56 real, dimension(klon), intent(IN):: u1_lay, v1_lay
57 ! u1_lay vitesse u 1ere couche
58 ! v1_lay vitesse v 1ere couche
59 real, dimension(klon), intent(IN):: temp_air, spechum
60 ! temp_air temperature de l'air 1ere couche
61 ! spechum humidite specifique 1ere couche
62 real, dimension(klon), intent(INOUT):: tq_cdrag
63 ! tq_cdrag cdrag
64 real, dimension(klon), intent(IN):: petAcoef, peqAcoef
65 ! petAcoef coeff. A de la resolution de la CL pour t
66 ! peqAcoef coeff. A de la resolution de la CL pour q
67 real, dimension(klon), intent(IN):: petBcoef, peqBcoef
68 ! petBcoef coeff. B de la resolution de la CL pour t
69 ! peqBcoef coeff. B de la resolution de la CL pour q
70
71 real, intent(IN):: precip_rain(klon)
72 ! precipitation, liquid water mass flux (kg / m2 / s), positive down
73
74 real, intent(IN):: precip_snow(klon)
75 ! precipitation, solid water mass flux (kg / m2 / s), positive down
76
77 REAL, INTENT(INOUT):: fder(klon) ! derivee des flux (pour le couplage)
78 real, intent(IN):: rugos(klon) ! rugosite
79 real, intent(IN):: rugoro(klon) ! rugosite orographique
80 real, intent(INOUT):: snow(klon), qsurf(klon)
81 real, intent(IN):: tsurf(:) ! (knon) temp\'erature de surface
82 real, dimension(klon), intent(IN):: p1lay
83 ! p1lay pression 1er niveau (milieu de couche)
84 real, dimension(klon), intent(IN):: ps
85 ! ps pression au sol
86
87 REAL, DIMENSION(klon), INTENT(INOUT):: radsol
88 ! rayonnement net au sol (LW + SW)
89
90 real, intent(OUT):: evap(:) ! (knon) evaporation totale
91 real, intent(OUT):: flux_t(:) ! (knon) flux de chaleur sensible
92 real, dimension(klon), intent(OUT):: fluxlat ! flux de chaleur latente
93 real, dimension(klon), intent(OUT):: dflux_l, dflux_s
94 real, intent(OUT):: tsurf_new(knon) ! temp\'erature au sol
95 real, intent(OUT):: albedo(:) ! (knon) albedo
96 real, intent(OUT):: z0_new(klon) ! surface roughness
97
98 real, intent(in):: pctsrf_new_sic(:) ! (klon)
99 ! nouvelle repartition des surfaces
100
101 real, intent(INOUT):: agesno(:) ! (knon)
102
103 ! Flux d'eau "perdue" par la surface et n\'ecessaire pour que limiter la
104 ! hauteur de neige, en kg / m2 / s
105 !jld a rajouter real, dimension(klon), intent(INOUT):: fqcalving
106 real, dimension(klon), intent(INOUT):: fqcalving
107
108 ! Flux thermique utiliser pour fondre la neige
109 !jld a rajouter real, dimension(klon), intent(INOUT):: ffonte
110 real, dimension(klon), intent(INOUT):: ffonte
111
112 real, dimension(klon), intent(INOUT):: run_off_lic_0
113 ! run_off_lic_0 runoff glacier du pas de temps precedent
114
115 ! Local:
116 REAL soilcap(klon)
117 REAL soilflux(klon)
118 logical:: first_call = .true.
119 integer ii
120 real, dimension(klon):: cal, beta, dif_grnd, capsol
121 real, parameter:: calice = 1. / (5.1444e6 * 0.15), tau_gl = 86400. * 5.
122 real, parameter:: calsno = 1. / (2.3867e6 * 0.15)
123 real tsurf_temp(knon)
124 real alb_neig(knon)
125 real zfra(knon)
126
127 !-------------------------------------------------------------
128
129 ! On doit commencer par appeler les schemas de surfaces continentales
130 ! car l'ocean a besoin du ruissellement qui est y calcule
131
132 if (first_call) then
133 call conf_interface
134
135 if (nisurf /= is_ter .and. klon > 1) then
136 print *, ' nisurf = ', nisurf, ' /= is_ter = ', is_ter
137 print *, 'or on doit commencer par les surfaces continentales'
138 call abort_gcm("interfsurf_hq", &
139 'On doit commencer par les surfaces continentales')
140 endif
141
142 if (is_oce > is_sic) then
143 print *, 'is_oce = ', is_oce, '> is_sic = ', is_sic
144 call abort_gcm("interfsurf_hq", &
145 'L''ocean doit etre traite avant la banquise')
146 endif
147
148 first_call = .false.
149 endif
150
151 ! Initialisations diverses
152
153 ffonte(1:knon) = 0.
154 fqcalving(1:knon) = 0.
155 cal = 999999.
156 beta = 999999.
157 dif_grnd = 999999.
158 capsol = 999999.
159 z0_new = 999999.
160 tsurf_new = 999999.
161
162 ! Aiguillage vers les differents schemas de surface
163
164 select case (nisurf)
165 case (is_ter)
166 ! Surface "terre", appel \`a l'interface avec les sols continentaux
167
168 ! Calcul age de la neige
169
170 ! Read albedo from the file containing boundary conditions then
171 ! add the albedo of snow:
172
173 call interfsur_lim(dtime, jour, knindex, debut, albedo, z0_new)
174
175 ! Calcul snow et qsurf, hydrologie adapt\'ee
176 CALL calbeta(is_ter, snow(:knon), qsol(:knon), beta(:knon), &
177 capsol(:knon), dif_grnd(:knon))
178
179 IF (soil_model) THEN
180 CALL soil(dtime, is_ter, knon, snow, tsurf, tsoil, soilcap, soilflux)
181 cal(1:knon) = RCPD / soilcap(1:knon)
182 radsol(1:knon) = radsol(1:knon) + soilflux(:knon)
183 ELSE
184 cal = RCPD * capsol
185 ENDIF
186
187 CALL calcul_fluxs(dtime, tsurf, p1lay(:knon), cal(:knon), &
188 beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &
189 radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &
190 u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &
191 petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &
192 fluxlat(:knon), flux_t, dflux_s(:knon), dflux_l(:knon))
193
194 CALL fonte_neige(is_ter, dtime, tsurf, p1lay(:knon), beta(:knon), &
195 tq_cdrag(:knon), ps(:knon), precip_rain(:knon), &
196 precip_snow(:knon), snow(:knon), qsol(:knon), temp_air(:knon), &
197 spechum(:knon), u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), &
198 peqAcoef(:knon), petBcoef(:knon), peqBcoef(:knon), tsurf_new, &
199 evap, fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))
200
201 call albsno(dtime, agesno, alb_neig, precip_snow(:knon))
202 where (snow(:knon) < 0.0001) agesno = 0.
203 zfra = max(0., min(1., snow(:knon) / (snow(:knon) + 10.)))
204 albedo = alb_neig * zfra + albedo * (1. - zfra)
205 z0_new = sqrt(z0_new**2 + rugoro**2)
206 case (is_oce)
207 ! Surface "oc\'ean", appel \`a l'interface avec l'oc\'ean
208
209 call read_sst(dtime, jour, knindex, debut, tsurf_temp)
210
211 cal = 0.
212 beta = 1.
213 dif_grnd = 0.
214 agesno = 0.
215 call calcul_fluxs(dtime, tsurf_temp, p1lay(:knon), cal(:knon), &
216 beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &
217 radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &
218 u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &
219 petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &
220 fluxlat(:knon), flux_t, dflux_s(:knon), dflux_l(:knon))
221 fder = fder + dflux_s + dflux_l
222
223 ! Compute the albedo:
224 if (cycle_diurne) then
225 CALL alboc_cd(rmu0(knindex), albedo)
226 else
227 CALL alboc(jour, rlat(knindex), albedo)
228 endif
229
230 z0_new = sqrt(rugos**2 + rugoro**2)
231 case (is_sic)
232 ! Surface "glace de mer" appel a l'interface avec l'ocean
233
234 DO ii = 1, knon
235 tsurf_new(ii) = tsurf(ii)
236 IF (pctsrf_new_sic(knindex(ii)) < EPSFRA) then
237 snow(ii) = 0.
238 tsurf_new(ii) = RTT - 1.8
239 IF (soil_model) tsoil(ii, :) = RTT - 1.8
240 endif
241 enddo
242
243 CALL calbeta(is_sic, snow(:knon), qsol(:knon), beta(:knon), &
244 capsol(:knon), dif_grnd(:knon))
245
246 IF (soil_model) THEN
247 CALL soil(dtime, is_sic, knon, snow, tsurf_new, tsoil, soilcap, &
248 soilflux)
249 cal(1:knon) = RCPD / soilcap(1:knon)
250 radsol(1:knon) = radsol(1:knon) + soilflux(1:knon)
251 dif_grnd = 0.
252 ELSE
253 dif_grnd = 1. / tau_gl
254 cal = RCPD * calice
255 WHERE (snow > 0.) cal = RCPD * calsno
256 ENDIF
257 tsurf_temp = tsurf_new
258 beta = 1.
259
260 CALL calcul_fluxs(dtime, tsurf_temp, p1lay(:knon), cal(:knon), &
261 beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &
262 radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &
263 u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &
264 petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &
265 fluxlat(:knon), flux_t, dflux_s(:knon), dflux_l(:knon))
266
267 CALL fonte_neige(is_sic, dtime, tsurf_temp, p1lay(:knon), beta(:knon), &
268 tq_cdrag(:knon), ps(:knon), precip_rain(:knon), &
269 precip_snow(:knon), snow(:knon), qsol(:knon), temp_air(:knon), &
270 spechum(:knon), u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), &
271 peqAcoef(:knon), petBcoef(:knon), peqBcoef(:knon), tsurf_new, &
272 evap, fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))
273
274 ! Compute the albedo:
275
276 CALL albsno(dtime, agesno, alb_neig, precip_snow(:knon))
277 WHERE (snow(:knon) < 0.0001) agesno = 0.
278 zfra = MAX(0., MIN(1., snow(:knon) / (snow(:knon) + 10.)))
279 albedo = alb_neig * zfra + 0.6 * (1. - zfra)
280
281 fder = fder + dflux_s + dflux_l
282 z0_new = SQRT(0.002**2 + rugoro**2)
283 case (is_lic)
284 if (.not. allocated(run_off_lic)) then
285 allocate(run_off_lic(knon))
286 run_off_lic = 0.
287 endif
288
289 ! Surface "glacier continentaux" appel a l'interface avec le sol
290
291 IF (soil_model) THEN
292 CALL soil(dtime, is_lic, knon, snow, tsurf, tsoil, soilcap, soilflux)
293 cal(1:knon) = RCPD / soilcap(1:knon)
294 radsol(1:knon) = radsol(1:knon) + soilflux(1:knon)
295 ELSE
296 cal = RCPD * calice
297 WHERE (snow > 0.) cal = RCPD * calsno
298 ENDIF
299 beta = 1.
300 dif_grnd = 0.
301
302 call calcul_fluxs(dtime, tsurf, p1lay(:knon), cal(:knon), &
303 beta(:knon), tq_cdrag(:knon), ps(:knon), qsurf(:knon), &
304 radsol(:knon), dif_grnd(:knon), temp_air(:knon), spechum(:knon), &
305 u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), &
306 petBcoef(:knon), peqBcoef(:knon), tsurf_new, evap, &
307 fluxlat(:knon), flux_t, dflux_s(:knon), dflux_l(:knon))
308
309 call fonte_neige(is_lic, dtime, tsurf, p1lay(:knon), beta(:knon), &
310 tq_cdrag(:knon), ps(:knon), precip_rain(:knon), &
311 precip_snow(:knon), snow(:knon), qsol(:knon), temp_air(:knon), &
312 spechum(:knon), u1_lay(:knon), v1_lay(:knon), petAcoef(:knon), &
313 peqAcoef(:knon), petBcoef(:knon), peqBcoef(:knon), tsurf_new, &
314 evap, fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon))
315
316 ! calcul albedo
317 CALL albsno(dtime, agesno, alb_neig, precip_snow(:knon))
318 WHERE (snow(:knon) < 0.0001) agesno = 0.
319 albedo = 0.77
320
321 ! Rugosite
322 z0_new = rugoro
323 case default
324 print *, 'Index surface = ', nisurf
325 call abort_gcm("interfsurf_hq", 'Index surface non valable')
326 end select
327
328 END SUBROUTINE interfsurf_hq
329
330 end module interfsurf_hq_m

  ViewVC Help
Powered by ViewVC 1.1.21