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

Contents of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 209 - (show annotations)
Wed Dec 7 17:37:21 2016 UTC (7 years, 4 months ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 9523 byte(s)
The program did not work with cycle_diurne set to false. mu0 in
physiq, which is supposed to be a cosine, was set to -999.999. So prmu
in swu had a value of the order of 1e3. So zrmum1 in sw2s had a value
of the order of 1e3. So zrayl in sw2s had a value of the order of
1e15. So ztray and ptauaz in swclr also had a large value. So zcorae
at line 138 in swclr had a large negative value, which resulted in
overflow at line 138.

This assignment of -999.999 to mu0 dates from somewhere between
revisions 348 and 524 of LMDZ. It was corrected in revision 1068 of
LMDZ with a call to angle which was present in revision 348. However,
procedure angle was removed from LMDZE in revision 22 because it was
not used. Hesitated to bring back angle but, finally, just removed the
option of having no diurnal cycle.

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

  ViewVC Help
Powered by ViewVC 1.1.21