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

Annotation of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (hide annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 9504 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

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 221 SUBROUTINE clqh(dtime, julien, debut, nisurf, knindex, tsoil, qsol, rmu0, &
8 guez 209 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 guez 221 integer, intent(in):: julien ! 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 215 REAL, intent(inout):: snow(:) ! (knon) ! 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 221 REAL, intent(out):: d_ts(:) ! (knon) variation of surface temperature
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 221 CALL interfsurf_hq(dtime, julien, 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     DO i = 1, knon
253 guez 206 local_h(i, 1) = zx_ch(i, 1) + zx_dh(i, 1) * flux_t(i) * dtime
254     local_q(i, 1) = zx_cq(i, 1) + zx_dq(i, 1) * flux_q(i) * dtime
255 guez 49 ENDDO
256     DO k = 2, klev
257     DO i = 1, knon
258 guez 206 local_q(i, k) = zx_cq(i, k) + zx_dq(i, k) * local_q(i, k - 1)
259     local_h(i, k) = zx_ch(i, k) + zx_dh(i, k) * local_h(i, k - 1)
260 guez 49 ENDDO
261     ENDDO
262 guez 155
263 guez 208 ! Calcul des tendances
264 guez 49 DO k = 1, klev
265     DO i = 1, knon
266 guez 155 d_t(i, k) = local_h(i, k) / zx_pkf(i, k) / RCPD - t(i, k)
267 guez 49 d_q(i, k) = local_q(i, k) - q(i, k)
268     ENDDO
269     ENDDO
270    
271     END SUBROUTINE clqh
272    
273     end module clqh_m

  ViewVC Help
Powered by ViewVC 1.1.21