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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 214 - (hide annotations)
Wed Mar 22 13:40:27 2017 UTC (7 years, 1 month ago) by guez
File size: 9544 byte(s)
fluxlat, not yfluxlat, should be set to 0 at the beginning of
clmain. So fluxlat is defined for a given type of surface even if
there is no point of this type at the current time step.

fluxlat is defined at each time step in physiq, no need for the save
attribute.

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

  ViewVC Help
Powered by ViewVC 1.1.21