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

Contents of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 175 - (show annotations)
Fri Feb 5 16:02:34 2016 UTC (8 years, 2 months ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 10416 byte(s)
Added argument itau_phy to ini_histins, phyetat0, phytrac and
phyredem0. Removed variable itau_phy of module temps. Avoiding side
effect in etat0 and phyetat0. The procedures ini_histins, phyetat0,
phytrac and phyredem0 are all called by physiq so there is no
cascading variable penalty.

In procedure inifilr, made the condition on colat0 weaker to allow for
rounding error.

Removed arguments flux_o, flux_g and t_slab of clmain, flux_o and
flux_g of clqh and interfsurf_hq, tslab and seaice of phyetat0 and
phyredem. NetCDF variables TSLAB and SEAICE no longer in
restartphy.nc. All these variables were related to the not-implemented
slab ocean. seaice and tslab were just set to 0 in phyetat0 and never
used nor changed. flux_o and flux_g were computed in clmain but never
used in physiq.

Removed argument swnet of clqh. Was used only to compute a local
variable, swdown, which was not used.

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

  ViewVC Help
Powered by ViewVC 1.1.21