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

Contents of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 1 month ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 10102 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

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

  ViewVC Help
Powered by ViewVC 1.1.21