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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 175 - (hide annotations)
Fri Feb 5 16:02:34 2016 UTC (8 years, 2 months ago) by guez
File size: 10416 byte(s)
Added argument itau_phy to ini_histins, phyetat0, phytrac and
phyredem0. Removed variable itau_phy of module temps. Avoiding side
effect in etat0 and phyetat0. The procedures ini_histins, phyetat0,
phytrac and phyredem0 are all called by physiq so there is no
cascading variable penalty.

In procedure inifilr, made the condition on colat0 weaker to allow for
rounding error.

Removed arguments flux_o, flux_g and t_slab of clmain, flux_o and
flux_g of clqh and interfsurf_hq, tslab and seaice of phyetat0 and
phyredem. NetCDF variables TSLAB and SEAICE no longer in
restartphy.nc. All these variables were related to the not-implemented
slab ocean. seaice and tslab were just set to 0 in phyetat0 and never
used nor changed. flux_o and flux_g were computed in clmain but never
used in physiq.

Removed argument swnet of clqh. Was used only to compute a local
variable, swdown, which was not used.

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

  ViewVC Help
Powered by ViewVC 1.1.21