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

Annotation of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 155 - (hide annotations)
Wed Jul 8 17:03:45 2015 UTC (8 years, 9 months ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 10794 byte(s)
Do not write any longer to startphy.nc nor read from restartphy.nc the
NetCDF variable ALBLW: it was the same than ALBE. ALBE was for the
visible and ALBLW for the near infrared. In physiq, use only variables
falbe and albsol, removed falblw and albsollw. See revision 888 of
LMDZ.

Removed unused arguments pdp of SUBROUTINE lwbv, ptave of SUBROUTINE
lwv, kuaer of SUBROUTINE lwvd, nq of SUBROUTINE initphysto.

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

  ViewVC Help
Powered by ViewVC 1.1.21