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

Contents of /trunk/Sources/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (show annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years ago) by guez
File size: 9504 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

1 module clqh_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE clqh(dtime, julien, 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):: julien ! 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(:) ! (knon) ! 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, intent(out):: fluxlat(:) ! (knon)
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) variation of surface temperature
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, julien, 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 DO i = 1, knon
253 local_h(i, 1) = zx_ch(i, 1) + zx_dh(i, 1) * flux_t(i) * dtime
254 local_q(i, 1) = zx_cq(i, 1) + zx_dq(i, 1) * flux_q(i) * dtime
255 ENDDO
256 DO k = 2, klev
257 DO i = 1, knon
258 local_q(i, k) = zx_cq(i, k) + zx_dq(i, k) * local_q(i, k - 1)
259 local_h(i, k) = zx_ch(i, k) + zx_dh(i, k) * local_h(i, k - 1)
260 ENDDO
261 ENDDO
262
263 ! Calcul des tendances
264 DO k = 1, klev
265 DO i = 1, knon
266 d_t(i, k) = local_h(i, k) / zx_pkf(i, k) / RCPD - t(i, k)
267 d_q(i, k) = local_q(i, k) - q(i, k)
268 ENDDO
269 ENDDO
270
271 END SUBROUTINE clqh
272
273 end module clqh_m

  ViewVC Help
Powered by ViewVC 1.1.21