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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (hide annotations)
Thu Sep 4 10:05:52 2014 UTC (9 years, 7 months ago) by guez
Original Path: trunk/phylmd/clqh.f
File size: 11537 byte(s)
Removed procedure sortvarc0. Called sortvarc with an additional
argument resetvarc instead. (Following LMDZ.) Moved current time
computations and some printing statements from sortvarc to
caldyn. Could then remove arguments itau and time_0 of sortvarc, and
could remove "use dynetat0". Better to keep "dynetat0.f" as a gcm-only
file.

Moved some variables from module ener to module sortvarc.

Split file "mathelp.f" into single-procedure files.

Removed unused argument nadv of adaptdt. Removed dimension arguments
of bernoui.

Removed unused argument nisurf of interfoce_lim. Changed the size of
argument lmt_sst of interfoce_lim from klon to knon. Removed case when
newlmt is false.

dynredem1 is called only once in each run, either ce0l or gcm. So
variable nb in call to nf95_put_var was always 1. Removed variable nb.

Removed dimension arguments of calcul_fluxs. Removed unused arguments
precip_rain, precip_snow, snow of calcul_fluxs. Changed the size of
all the arrays in calcul_fluxs from klon to knon.

Removed dimension arguments of fonte_neige. Changed the size of all
the arrays in fonte_neige from klon to knon.

Changed the size of arguments tsurf and tsurf_new of interfsurf_hq
from klon to knon. Changed the size of argument ptsrf of soil from
klon to knon.

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

  ViewVC Help
Powered by ViewVC 1.1.21