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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 206 - (hide annotations)
Tue Aug 30 12:52:46 2016 UTC (7 years, 7 months ago) by guez
File size: 9595 byte(s)
Removed dimension klev of flux_[tquv] and y_flux_[tquv] in
clmain. Removed dimension klev of flux_[tquv] in physiq. Removed
dimension klev of flux_[tq] in hbtm. Removed dimension klev of
flux_[tq] in clqh and computations for layers other than the surface
layer. Removed dimension klev of flux_v in clvent and computations for
layers other than the surface layer. Values for layers other than the
surface layer were not used nor output (not even in LMDZ).

Removed argument dnwd0 of concvl. Simply write - mp in physiq
(following LMDZ).

Removed useless intermediary variables zxflux[tquv] in physiq.

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

  ViewVC Help
Powered by ViewVC 1.1.21