/[lmdze]/trunk/phylmd/clqh.f
ViewVC logotype

Contents of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (show annotations)
Thu Sep 4 10:05:52 2014 UTC (9 years, 7 months ago) by guez
File size: 11537 byte(s)
Removed procedure sortvarc0. Called sortvarc with an additional
argument resetvarc instead. (Following LMDZ.) Moved current time
computations and some printing statements from sortvarc to
caldyn. Could then remove arguments itau and time_0 of sortvarc, and
could remove "use dynetat0". Better to keep "dynetat0.f" as a gcm-only
file.

Moved some variables from module ener to module sortvarc.

Split file "mathelp.f" into single-procedure files.

Removed unused argument nadv of adaptdt. Removed dimension arguments
of bernoui.

Removed unused argument nisurf of interfoce_lim. Changed the size of
argument lmt_sst of interfoce_lim from klon to knon. Removed case when
newlmt is false.

dynredem1 is called only once in each run, either ce0l or gcm. So
variable nb in call to nf95_put_var was always 1. Removed variable nb.

Removed dimension arguments of calcul_fluxs. Removed unused arguments
precip_rain, precip_snow, snow of calcul_fluxs. Changed the size of
all the arrays in calcul_fluxs from klon to knon.

Removed dimension arguments of fonte_neige. Changed the size of all
the arrays in fonte_neige from klon to knon.

Changed the size of arguments tsurf and tsurf_new of interfsurf_hq
from klon to knon. Changed the size of argument ptsrf of soil from
klon to knon.

1 module clqh_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE clqh(dtime, itime, jour, debut, rlat, knon, nisurf, knindex, &
8 pctsrf, tsoil, qsol, rmu0, co2_ppm, rugos, rugoro, u1lay, &
9 v1lay, coef, t, q, ts, paprs, pplay, delp, radsol, albedo, alblw, &
10 snow, qsurf, precip_rain, precip_snow, fder, swnet, fluxlat, &
11 pctsrf_new, agesno, d_t, d_q, d_ts, z0_new, flux_t, flux_q, dflux_s, &
12 dflux_l, fqcalving, ffonte, run_off_lic_0, flux_o, flux_g)
13
14 ! Author: Z. X. Li (LMD/CNRS)
15 ! Date: 1993/08/18
16 ! Objet : diffusion verticale de "q" et de "h"
17
18 USE conf_phys_m, ONLY : iflag_pbl
19 USE dimens_m, ONLY : iim, jjm
20 USE dimphy, ONLY : klev, klon, zmasq
21 USE dimsoil, ONLY : nsoilmx
22 USE indicesol, ONLY : is_ter, nbsrf
23 USE interfsurf_hq_m, ONLY : interfsurf_hq
24 USE suphec_m, ONLY : rcpd, rd, rg, rkappa
25
26 ! Arguments:
27 INTEGER, intent(in):: knon
28 REAL, intent(in):: dtime ! intervalle du temps (s)
29 REAL u1lay(klon) ! vitesse u de la 1ere couche (m/s)
30 REAL v1lay(klon) ! vitesse v de la 1ere couche (m/s)
31
32 REAL, intent(in):: coef(:, :) ! (knon, klev)
33 ! Le coefficient d'echange (m**2/s) multiplie par le cisaillement
34 ! du vent (dV/dz). La premiere valeur indique la valeur de Cdrag
35 ! (sans unite).
36
37 REAL t(klon, klev) ! temperature (K)
38 REAL q(klon, klev) ! humidite specifique (kg/kg)
39 REAL ts(klon) ! temperature du sol (K)
40 REAL evap(klon) ! evaporation au sol
41 REAL paprs(klon, klev+1) ! pression a inter-couche (Pa)
42 REAL pplay(klon, klev) ! pression au milieu de couche (Pa)
43 REAL delp(klon, klev) ! epaisseur de couche en pression (Pa)
44 REAL radsol(klon) ! ray. net au sol (Solaire+IR) W/m2
45 REAL albedo(klon) ! albedo de la surface
46 REAL alblw(klon)
47 REAL snow(klon) ! hauteur de neige
48 REAL qsurf(klon) ! humidite de l'air au dessus de la surface
49
50 real, intent(in):: precip_rain(klon)
51 ! liquid water mass flux (kg/m2/s), positive down
52
53 real, intent(in):: precip_snow(klon)
54 ! solid water mass flux (kg/m2/s), positive down
55
56 REAL agesno(klon)
57 REAL rugoro(klon)
58 REAL run_off_lic_0(klon)! runof glacier au pas de temps precedent
59 integer, intent(in):: jour ! jour de l'annee en cours
60 real, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal
61 real rugos(klon) ! rugosite
62 integer, intent(in):: knindex(klon)
63 real, intent(in):: pctsrf(klon, nbsrf)
64 real, intent(in):: rlat(klon)
65 REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
66
67 REAL d_t(klon, klev) ! incrementation de "t"
68 REAL d_q(klon, klev) ! incrementation de "q"
69 REAL d_ts(klon) ! incrementation de "ts"
70 REAL flux_t(klon, klev) ! (diagnostic) flux de la chaleur
71 ! sensible, flux de Cp*T, positif vers
72 ! le bas: j/(m**2 s) c.a.d.: W/m2
73 REAL flux_q(klon, klev) ! flux de la vapeur d'eau:kg/(m**2 s)
74 REAL dflux_s(klon) ! derivee du flux sensible dF/dTs
75 REAL dflux_l(klon) ! derivee du flux latent dF/dTs
76 !IM cf JLD
77 ! Flux thermique utiliser pour fondre la neige
78 REAL ffonte(klon)
79 ! Flux d'eau "perdue" par la surface et nécessaire pour que limiter la
80 ! hauteur de neige, en kg/m2/s
81 REAL fqcalving(klon)
82
83 !IM "slab" ocean
84
85 REAL, intent(out):: flux_o(klon) ! flux entre l'ocean et l'atmosphere W/m2
86
87 REAL, intent(out):: flux_g(klon)
88 ! flux entre l'ocean et la glace de mer W/m2
89
90 INTEGER i, k
91 REAL zx_cq(klon, klev)
92 REAL zx_dq(klon, klev)
93 REAL zx_ch(klon, klev)
94 REAL zx_dh(klon, klev)
95 REAL zx_buf1(klon)
96 REAL zx_buf2(klon)
97 REAL zx_coef(klon, klev)
98 REAL local_h(klon, klev) ! enthalpie potentielle
99 REAL local_q(klon, klev)
100 REAL local_ts(klon)
101 REAL psref(klon) ! pression de reference pour temperature potent.
102 REAL zx_pkh(klon, klev), zx_pkf(klon, klev)
103
104 ! contre-gradient pour la vapeur d'eau: (kg/kg)/metre
105 REAL gamq(klon, 2:klev)
106 ! contre-gradient pour la chaleur sensible: Kelvin/metre
107 REAL gamt(klon, 2:klev)
108 REAL z_gamaq(klon, 2:klev), z_gamah(klon, 2:klev)
109 REAL zdelz
110
111 ! Rajout pour l'interface
112 integer, intent(in):: itime
113 integer nisurf
114 logical, intent(in):: debut
115 real zlev1(klon)
116 real fder(klon)
117 real temp_air(klon), spechum(klon)
118 real epot_air(klon), ccanopy(klon)
119 real tq_cdrag(klon), petAcoef(klon), peqAcoef(klon)
120 real petBcoef(klon), peqBcoef(klon)
121 real swnet(klon), swdown(klon)
122 real p1lay(klon)
123 !$$$C PB ajout pour soil
124 REAL tsoil(klon, nsoilmx)
125
126 REAL, intent(inout):: qsol(klon)
127 ! column-density of water in soil, in kg m-2
128
129 ! Parametres de sortie
130 real fluxsens(klon), fluxlat(klon)
131 real tsurf_new(klon), alb_new(klon)
132 real z0_new(klon)
133 real pctsrf_new(klon, nbsrf)
134 ! JLD
135 real zzpk
136
137 character (len = 20) :: modname = 'Debut clqh'
138 LOGICAL check
139 PARAMETER (check=.false.)
140
141 !----------------------------------------------------------------
142
143 if (check) THEN
144 write(*, *) modname, ' nisurf=', nisurf
145 !C call flush(6)
146 endif
147
148 if (check) THEN
149 WRITE(*, *)' qsurf (min, max)' &
150 , minval(qsurf(1:knon)), maxval(qsurf(1:knon))
151 !C call flush(6)
152 ENDIF
153
154 if (iflag_pbl.eq.1) then
155 do k = 3, klev
156 do i = 1, knon
157 gamq(i, k)= 0.0
158 gamt(i, k)= -1.0e-03
159 enddo
160 enddo
161 do i = 1, knon
162 gamq(i, 2) = 0.0
163 gamt(i, 2) = -2.5e-03
164 enddo
165 else
166 do k = 2, klev
167 do i = 1, knon
168 gamq(i, k) = 0.0
169 gamt(i, k) = 0.0
170 enddo
171 enddo
172 endif
173
174 DO i = 1, knon
175 psref(i) = paprs(i, 1) !pression de reference est celle au sol
176 local_ts(i) = ts(i)
177 ENDDO
178 DO k = 1, klev
179 DO i = 1, knon
180 zx_pkh(i, k) = (psref(i)/paprs(i, k))**RKAPPA
181 zx_pkf(i, k) = (psref(i)/pplay(i, k))**RKAPPA
182 local_h(i, k) = RCPD * t(i, k) * zx_pkf(i, k)
183 local_q(i, k) = q(i, k)
184 ENDDO
185 ENDDO
186
187 ! Convertir les coefficients en variables convenables au calcul:
188
189 DO k = 2, klev
190 DO i = 1, knon
191 zx_coef(i, k) = coef(i, k)*RG/(pplay(i, k-1)-pplay(i, k)) &
192 *(paprs(i, k)*2/(t(i, k)+t(i, k-1))/RD)**2
193 zx_coef(i, k) = zx_coef(i, k) * dtime*RG
194 ENDDO
195 ENDDO
196
197 ! Preparer les flux lies aux contre-gardients
198
199 DO k = 2, klev
200 DO i = 1, knon
201 zdelz = RD * (t(i, k-1)+t(i, k))/2.0 / RG /paprs(i, k) &
202 *(pplay(i, k-1)-pplay(i, k))
203 z_gamaq(i, k) = gamq(i, k) * zdelz
204 z_gamah(i, k) = gamt(i, k) * zdelz *RCPD * zx_pkh(i, k)
205 ENDDO
206 ENDDO
207 DO i = 1, knon
208 zx_buf1(i) = zx_coef(i, klev) + delp(i, klev)
209 zx_cq(i, klev) = (local_q(i, klev)*delp(i, klev) &
210 -zx_coef(i, klev)*z_gamaq(i, klev))/zx_buf1(i)
211 zx_dq(i, klev) = zx_coef(i, klev) / zx_buf1(i)
212
213 zzpk=(pplay(i, klev)/psref(i))**RKAPPA
214 zx_buf2(i) = zzpk*delp(i, klev) + zx_coef(i, klev)
215 zx_ch(i, klev) = (local_h(i, klev)*zzpk*delp(i, klev) &
216 -zx_coef(i, klev)*z_gamah(i, klev))/zx_buf2(i)
217 zx_dh(i, klev) = zx_coef(i, klev) / zx_buf2(i)
218 ENDDO
219 DO k = klev-1, 2 , -1
220 DO i = 1, knon
221 zx_buf1(i) = delp(i, k)+zx_coef(i, k) &
222 +zx_coef(i, k+1)*(1.-zx_dq(i, k+1))
223 zx_cq(i, k) = (local_q(i, k)*delp(i, k) &
224 +zx_coef(i, k+1)*zx_cq(i, k+1) &
225 +zx_coef(i, k+1)*z_gamaq(i, k+1) &
226 -zx_coef(i, k)*z_gamaq(i, k))/zx_buf1(i)
227 zx_dq(i, k) = zx_coef(i, k) / zx_buf1(i)
228
229 zzpk=(pplay(i, k)/psref(i))**RKAPPA
230 zx_buf2(i) = zzpk*delp(i, k)+zx_coef(i, k) &
231 +zx_coef(i, k+1)*(1.-zx_dh(i, k+1))
232 zx_ch(i, k) = (local_h(i, k)*zzpk*delp(i, k) &
233 +zx_coef(i, k+1)*zx_ch(i, k+1) &
234 +zx_coef(i, k+1)*z_gamah(i, k+1) &
235 -zx_coef(i, k)*z_gamah(i, k))/zx_buf2(i)
236 zx_dh(i, k) = zx_coef(i, k) / zx_buf2(i)
237 ENDDO
238 ENDDO
239
240 DO i = 1, knon
241 zx_buf1(i) = delp(i, 1) + zx_coef(i, 2)*(1.-zx_dq(i, 2))
242 zx_cq(i, 1) = (local_q(i, 1)*delp(i, 1) &
243 +zx_coef(i, 2)*(z_gamaq(i, 2)+zx_cq(i, 2))) &
244 /zx_buf1(i)
245 zx_dq(i, 1) = -1. * RG / zx_buf1(i)
246
247 zzpk=(pplay(i, 1)/psref(i))**RKAPPA
248 zx_buf2(i) = zzpk*delp(i, 1) + zx_coef(i, 2)*(1.-zx_dh(i, 2))
249 zx_ch(i, 1) = (local_h(i, 1)*zzpk*delp(i, 1) &
250 +zx_coef(i, 2)*(z_gamah(i, 2)+zx_ch(i, 2))) &
251 /zx_buf2(i)
252 zx_dh(i, 1) = -1. * RG / zx_buf2(i)
253 ENDDO
254
255 ! Appel a interfsurf (appel generique) routine d'interface avec la surface
256
257 ! initialisation
258 petAcoef =0.
259 peqAcoef = 0.
260 petBcoef =0.
261 peqBcoef = 0.
262 p1lay =0.
263
264 petAcoef(1:knon) = zx_ch(1:knon, 1)
265 peqAcoef(1:knon) = zx_cq(1:knon, 1)
266 petBcoef(1:knon) = zx_dh(1:knon, 1)
267 peqBcoef(1:knon) = zx_dq(1:knon, 1)
268 tq_cdrag(1:knon) =coef(:knon, 1)
269 temp_air(1:knon) =t(1:knon, 1)
270 epot_air(1:knon) =local_h(1:knon, 1)
271 spechum(1:knon)=q(1:knon, 1)
272 p1lay(1:knon) = pplay(1:knon, 1)
273 zlev1(1:knon) = delp(1:knon, 1)
274
275 if(nisurf.eq.is_ter) THEN
276 swdown(1:knon) = swnet(1:knon)/(1-albedo(1:knon))
277 else
278 swdown(1:knon) = swnet(1:knon)
279 endif
280 ccanopy = co2_ppm
281
282 CALL interfsurf_hq(itime, dtime, jour, rmu0, nisurf, knon, knindex, &
283 pctsrf, rlat, debut, nsoilmx, tsoil, qsol, u1lay, v1lay, &
284 temp_air, spechum, tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, &
285 precip_rain, precip_snow, fder, rugos, rugoro, snow, qsurf, ts(:knon), &
286 p1lay, psref, radsol, evap, fluxsens, fluxlat, dflux_l, dflux_s, &
287 tsurf_new(:knon), alb_new, alblw, z0_new, pctsrf_new, agesno, fqcalving, &
288 ffonte, run_off_lic_0, flux_o, flux_g)
289
290 do i = 1, knon
291 flux_t(i, 1) = fluxsens(i)
292 flux_q(i, 1) = - evap(i)
293 d_ts(i) = tsurf_new(i) - ts(i)
294 albedo(i) = alb_new(i)
295 enddo
296
297 !==== une fois on a zx_h_ts, on peut faire l'iteration ========
298 DO i = 1, knon
299 local_h(i, 1) = zx_ch(i, 1) + zx_dh(i, 1)*flux_t(i, 1)*dtime
300 local_q(i, 1) = zx_cq(i, 1) + zx_dq(i, 1)*flux_q(i, 1)*dtime
301 ENDDO
302 DO k = 2, klev
303 DO i = 1, knon
304 local_q(i, k) = zx_cq(i, k) + zx_dq(i, k)*local_q(i, k-1)
305 local_h(i, k) = zx_ch(i, k) + zx_dh(i, k)*local_h(i, k-1)
306 ENDDO
307 ENDDO
308 !======================================================================
309 !== flux_q est le flux de vapeur d'eau: kg/(m**2 s) positive vers bas
310 !== flux_t est le flux de cpt (energie sensible): j/(m**2 s)
311 DO k = 2, klev
312 DO i = 1, knon
313 flux_q(i, k) = (zx_coef(i, k)/RG/dtime) &
314 * (local_q(i, k)-local_q(i, k-1)+z_gamaq(i, k))
315 flux_t(i, k) = (zx_coef(i, k)/RG/dtime) &
316 * (local_h(i, k)-local_h(i, k-1)+z_gamah(i, k)) &
317 / zx_pkh(i, k)
318 ENDDO
319 ENDDO
320 !======================================================================
321 ! Calcul tendances
322 DO k = 1, klev
323 DO i = 1, knon
324 d_t(i, k) = local_h(i, k)/zx_pkf(i, k)/RCPD - t(i, k)
325 d_q(i, k) = local_q(i, k) - q(i, k)
326 ENDDO
327 ENDDO
328
329 END SUBROUTINE clqh
330
331 end module clqh_m

  ViewVC Help
Powered by ViewVC 1.1.21