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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 191 - (hide annotations)
Mon May 9 19:56:28 2016 UTC (7 years, 11 months ago) by guez
File size: 10053 byte(s)
Extracted the call to read_comdissnew out of conf_gcm.

Made ok_instan a variable of module clesphys, itau_phy a variable of
module phyetat0_m, nid_ins a variable of module ini_histins_m, itap a
variable of new module time_phylmdz, so that histwrite_phy can be
called from any procedure without the need to cascade those variables
into that procedure. Made itau_w a variable of module time_phylmdz so
that it is computed only once per time step of physics.

Extracted variables of module clesphys which were in namelist
conf_phys_nml into their own namelist, clesphys_nml, and created
procedure read_clesphys reading clesphys_nml, to avoid side effect.

No need for double precision in procedure getso4fromfile. Assume there
is a single variable for the whole year in the NetCDF file instead of
one variable per month.

Created generic procedure histwrite_phy and removed procedure
write_histins, following LMDZ. histwrite_phy has only two arguments,
can be called from anywhere, and should manage the logic of writing or
not writing into various history files with various operations. So the
test on ok_instan goes inside histwrite_phy.

Test for raz_date in phyetat0 instead of physiq to avoid side effect.

Created procedure increment_itap to avoid side effect.

Removed unnecessary differences between procedures readsulfate and
readsulfate_pi.

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

  ViewVC Help
Powered by ViewVC 1.1.21