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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (hide annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 1 month ago) by guez
File size: 10102 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

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

  ViewVC Help
Powered by ViewVC 1.1.21