LMDZ
diagphy.F90
Go to the documentation of this file.
1 
2 ! $Id: diagphy.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 SUBROUTINE diagphy(airephy, tit, iprt, tops, topl, sols, soll, sens, evap, &
5  rain_fall, snow_fall, ts, d_etp_tot, d_qt_tot, d_ec_tot, fs_bound, &
6  fq_bound)
7  ! ======================================================================
8 
9  ! Purpose:
10  ! Compute the thermal flux and the watter mass flux at the atmosphere
11  ! boundaries. Print them and also the atmospheric enthalpy change and
12  ! the atmospheric mass change.
13 
14  ! Arguments:
15  ! airephy-------input-R- grid area
16  ! tit---------input-A15- Comment to be added in PRINT (CHARACTER*15)
17  ! iprt--------input-I- PRINT level ( <=0 : no PRINT)
18  ! tops(klon)--input-R- SW rad. at TOA (W/m2), positive up.
19  ! topl(klon)--input-R- LW rad. at TOA (W/m2), positive down
20  ! sols(klon)--input-R- Net SW flux above surface (W/m2), positive up
21  ! (i.e. -1 * flux absorbed by the surface)
22  ! soll(klon)--input-R- Net LW flux above surface (W/m2), positive up
23  ! (i.e. flux emited - flux absorbed by the surface)
24  ! sens(klon)--input-R- Sensible Flux at surface (W/m2), positive down
25  ! evap(klon)--input-R- Evaporation + sublimation watter vapour mass flux
26  ! (kg/m2/s), positive up
27  ! rain_fall(klon)
28  ! --input-R- Liquid watter mass flux (kg/m2/s), positive down
29  ! snow_fall(klon)
30  ! --input-R- Solid watter mass flux (kg/m2/s), positive down
31  ! ts(klon)----input-R- Surface temperature (K)
32  ! d_etp_tot---input-R- Heat flux equivalent to atmospheric enthalpy
33  ! change (W/m2)
34  ! d_qt_tot----input-R- Mass flux equivalent to atmospheric watter mass
35  ! change (kg/m2/s)
36  ! d_ec_tot----input-R- Flux equivalent to atmospheric cinetic energy
37  ! change (W/m2)
38 
39  ! fs_bound---output-R- Thermal flux at the atmosphere boundaries (W/m2)
40  ! fq_bound---output-R- Watter mass flux at the atmosphere boundaries
41  ! (kg/m2/s)
42 
43  ! J.L. Dufresne, July 2002
44  ! Version prise sur
45  ! ~rlmd833/LMDZOR_201102/modipsl/modeles/LMDZ.3.3/libf/phylmd
46  ! le 25 Novembre 2002.
47  ! ======================================================================
48 
49  USE dimphy
50  IMPLICIT NONE
51 
52  include "YOMCST.h"
53  include "YOETHF.h"
54 
55  ! Input variables
56  REAL airephy(klon)
57  CHARACTER *15 tit
58  INTEGER iprt
59  REAL tops(klon), topl(klon), sols(klon), soll(klon)
60  REAL sens(klon), evap(klon), rain_fall(klon), snow_fall(klon)
61  REAL ts(klon)
62  REAL d_etp_tot, d_qt_tot, d_ec_tot
63  ! Output variables
64  REAL fs_bound, fq_bound
65 
66  ! Local variables
67  REAL stops, stopl, ssols, ssoll
68  REAL ssens, sfront, slat
69  REAL airetot, zcpvap, zcwat, zcice
70  REAL rain_fall_tot, snow_fall_tot, evap_tot
71 
72  INTEGER i
73 
74  INTEGER pas
75  SAVE pas
76  DATA pas/0/
77  !$OMP THREADPRIVATE(pas)
78 
79  pas = pas + 1
80  stops = 0.
81  stopl = 0.
82  ssols = 0.
83  ssoll = 0.
84  ssens = 0.
85  sfront = 0.
86  evap_tot = 0.
87  rain_fall_tot = 0.
88  snow_fall_tot = 0.
89  airetot = 0.
90 
91  ! Pour les chaleur specifiques de la vapeur d'eau, de l'eau et de
92  ! la glace, on travaille par difference a la chaleur specifique de l'
93  ! air sec. En effet, comme on travaille a niveau de pression donne,
94  ! toute variation de la masse d'un constituant est totalement
95  ! compense par une variation de masse d'air.
96 
97  zcpvap = rcpv - rcpd
98  zcwat = rcw - rcpd
99  zcice = rcs - rcpd
100 
101  DO i = 1, klon
102  stops = stops + tops(i)*airephy(i)
103  stopl = stopl + topl(i)*airephy(i)
104  ssols = ssols + sols(i)*airephy(i)
105  ssoll = ssoll + soll(i)*airephy(i)
106  ssens = ssens + sens(i)*airephy(i)
107  sfront = sfront + (evap(i)*zcpvap-rain_fall(i)*zcwat-snow_fall(i)*zcice)* &
108  ts(i)*airephy(i)
109  evap_tot = evap_tot + evap(i)*airephy(i)
110  rain_fall_tot = rain_fall_tot + rain_fall(i)*airephy(i)
111  snow_fall_tot = snow_fall_tot + snow_fall(i)*airephy(i)
112  airetot = airetot + airephy(i)
113  END DO
114  stops = stops/airetot
115  stopl = stopl/airetot
116  ssols = ssols/airetot
117  ssoll = ssoll/airetot
118  ssens = ssens/airetot
119  sfront = sfront/airetot
120  evap_tot = evap_tot/airetot
121  rain_fall_tot = rain_fall_tot/airetot
122  snow_fall_tot = snow_fall_tot/airetot
123 
124  slat = rlvtt*rain_fall_tot + rlstt*snow_fall_tot
125  ! Heat flux at atm. boundaries
126  fs_bound = stops - stopl - (ssols+ssoll) + ssens + sfront + slat
127  ! Watter flux at atm. boundaries
128  fq_bound = evap_tot - rain_fall_tot - snow_fall_tot
129 
130  IF (iprt>=1) WRITE (6, 6666) tit, pas, fs_bound, d_etp_tot, fq_bound, &
131  d_qt_tot
132 
133  IF (iprt>=1) WRITE (6, 6668) tit, pas, d_etp_tot + d_ec_tot - fs_bound, &
134  d_qt_tot - fq_bound
135 
136  IF (iprt>=2) WRITE (6, 6667) tit, pas, stops, stopl, ssols, ssoll, ssens, &
137  slat, evap_tot, rain_fall_tot + snow_fall_tot
138 
139  RETURN
140 
141 6666 FORMAT ('Phys. Flux Budget ', a15, 1i6, 2f8.2, 2(1pe13.5))
142 6667 FORMAT ('Phys. Boundary Flux ', a15, 1i6, 6f8.2, 2(1pe13.5))
143 6668 FORMAT ('Phys. Total Budget ', a15, 1i6, f8.2, 2(1pe13.5))
144 
145 END SUBROUTINE diagphy
146 
147 ! ======================================================================
148 SUBROUTINE diagetpq(airephy, tit, iprt, idiag, idiag2, dtime, t, q, ql, qs, &
149  u, v, paprs, pplay, d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
150  ! ======================================================================
151 
152  ! Purpose:
153  ! Calcul la difference d'enthalpie et de masse d'eau entre 2 appels,
154  ! et calcul le flux de chaleur et le flux d'eau necessaire a ces
155  ! changements. Ces valeurs sont moyennees sur la surface de tout
156  ! le globe et sont exprime en W/2 et kg/s/m2
157  ! Outil pour diagnostiquer la conservation de l'energie
158  ! et de la masse dans la physique. Suppose que les niveau de
159  ! pression entre couche ne varie pas entre 2 appels.
160 
161  ! Plusieurs de ces diagnostics peuvent etre fait en parallele: les
162  ! bilans sont sauvegardes dans des tableaux indices. On parlera
163  ! "d'indice de diagnostic"
164 
165 
166  ! ======================================================================
167  ! Arguments:
168  ! airephy-------input-R- grid area
169  ! tit-----imput-A15- Comment added in PRINT (CHARACTER*15)
170  ! iprt----input-I- PRINT level ( <=1 : no PRINT)
171  ! idiag---input-I- indice dans lequel sera range les nouveaux
172  ! bilans d' entalpie et de masse
173  ! idiag2--input-I-les nouveaux bilans d'entalpie et de masse
174  ! sont compare au bilan de d'enthalpie de masse de
175  ! l'indice numero idiag2
176  ! Cas parriculier : si idiag2=0, pas de comparaison, on
177  ! sort directement les bilans d'enthalpie et de masse
178  ! dtime----input-R- time step (s)
179  ! t--------input-R- temperature (K)
180  ! q--------input-R- vapeur d'eau (kg/kg)
181  ! ql-------input-R- liquid watter (kg/kg)
182  ! qs-------input-R- solid watter (kg/kg)
183  ! u--------input-R- vitesse u
184  ! v--------input-R- vitesse v
185  ! paprs----input-R- pression a intercouche (Pa)
186  ! pplay----input-R- pression au milieu de couche (Pa)
187 
188  ! the following total value are computed by UNIT of earth surface
189 
190  ! d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
191  ! change (J/m2) during one time step (dtime) for the whole
192  ! atmosphere (air, watter vapour, liquid and solid)
193  ! d_qt------output-R- total water mass flux (kg/m2/s) defined as the
194  ! total watter (kg/m2) change during one time step (dtime),
195  ! d_qw------output-R- same, for the watter vapour only (kg/m2/s)
196  ! d_ql------output-R- same, for the liquid watter only (kg/m2/s)
197  ! d_qs------output-R- same, for the solid watter only (kg/m2/s)
198  ! d_ec------output-R- Cinetic Energy Budget (W/m2) for vertical air column
199 
200  ! other (COMMON...)
201  ! RCPD, RCPV, ....
202 
203  ! J.L. Dufresne, July 2002
204  ! ======================================================================
205 
206  USE dimphy
207  IMPLICIT NONE
208 
209  include "YOMCST.h"
210  include "YOETHF.h"
211 
212  ! Input variables
213  REAL airephy(klon)
214  CHARACTER *15 tit
215  INTEGER iprt, idiag, idiag2
216  REAL dtime
217  REAL t(klon, klev), q(klon, klev), ql(klon, klev), qs(klon, klev)
218  REAL u(klon, klev), v(klon, klev)
219  REAL paprs(klon, klev+1), pplay(klon, klev)
220  ! Output variables
221  REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
222 
223  ! Local variables
224 
225  REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, h_qs_tot, qw_tot, ql_tot, &
226  qs_tot, ec_tot
227  ! h_vcol_tot-- total enthalpy of vertical air column
228  ! (air with watter vapour, liquid and solid) (J/m2)
229  ! h_dair_tot-- total enthalpy of dry air (J/m2)
230  ! h_qw_tot---- total enthalpy of watter vapour (J/m2)
231  ! h_ql_tot---- total enthalpy of liquid watter (J/m2)
232  ! h_qs_tot---- total enthalpy of solid watter (J/m2)
233  ! qw_tot------ total mass of watter vapour (kg/m2)
234  ! ql_tot------ total mass of liquid watter (kg/m2)
235  ! qs_tot------ total mass of solid watter (kg/m2)
236  ! ec_tot------ total cinetic energy (kg/m2)
237 
238  REAL zairm(klon, klev) ! layer air mass (kg/m2)
239  REAL zqw_col(klon)
240  REAL zql_col(klon)
241  REAL zqs_col(klon)
242  REAL zec_col(klon)
243  REAL zh_dair_col(klon)
244  REAL zh_qw_col(klon), zh_ql_col(klon), zh_qs_col(klon)
245 
246  REAL d_h_dair, d_h_qw, d_h_ql, d_h_qs
247 
248  REAL airetot, zcpvap, zcwat, zcice
249 
250  INTEGER i, k
251 
252  INTEGER ndiag ! max number of diagnostic in parallel
253  parameter(ndiag=10)
254  INTEGER pas(ndiag)
255  SAVE pas
256  DATA pas/ndiag*0/
257  !$OMP THREADPRIVATE(pas)
258 
259  REAL h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag), &
260  h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag), ql_pre(ndiag), &
261  qs_pre(ndiag), ec_pre(ndiag)
262  SAVE h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre, h_qs_pre, qw_pre, ql_pre, &
263  qs_pre, ec_pre
264  !$OMP THREADPRIVATE(h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre)
265  !$OMP THREADPRIVATE(h_qs_pre, qw_pre, ql_pre, qs_pre , ec_pre)
266  ! ======================================================================
267 
268  DO k = 1, klev
269  DO i = 1, klon
270  ! layer air mass
271  zairm(i, k) = (paprs(i,k)-paprs(i,k+1))/rg
272  END DO
273  END DO
274 
275  ! Reset variables
276  DO i = 1, klon
277  zqw_col(i) = 0.
278  zql_col(i) = 0.
279  zqs_col(i) = 0.
280  zec_col(i) = 0.
281  zh_dair_col(i) = 0.
282  zh_qw_col(i) = 0.
283  zh_ql_col(i) = 0.
284  zh_qs_col(i) = 0.
285  END DO
286 
287  zcpvap = rcpv
288  zcwat = rcw
289  zcice = rcs
290 
291  ! Compute vertical sum for each atmospheric column
292  ! ================================================
293  DO k = 1, klev
294  DO i = 1, klon
295  ! Watter mass
296  zqw_col(i) = zqw_col(i) + q(i, k)*zairm(i, k)
297  zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
298  zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k)
299  ! Cinetic Energy
300  zec_col(i) = zec_col(i) + 0.5*(u(i,k)**2+v(i,k)**2)*zairm(i, k)
301  ! Air enthalpy
302  zh_dair_col(i) = zh_dair_col(i) + rcpd*(1.-q(i,k)-ql(i,k)-qs(i,k))* &
303  zairm(i, k)*t(i, k)
304  zh_qw_col(i) = zh_qw_col(i) + zcpvap*q(i, k)*zairm(i, k)*t(i, k)
305  zh_ql_col(i) = zh_ql_col(i) + zcwat*ql(i, k)*zairm(i, k)*t(i, k) - &
306  rlvtt*ql(i, k)*zairm(i, k)
307  zh_qs_col(i) = zh_qs_col(i) + zcice*qs(i, k)*zairm(i, k)*t(i, k) - &
308  rlstt*qs(i, k)*zairm(i, k)
309 
310  END DO
311  END DO
312 
313  ! Mean over the planete surface
314  ! =============================
315  qw_tot = 0.
316  ql_tot = 0.
317  qs_tot = 0.
318  ec_tot = 0.
319  h_vcol_tot = 0.
320  h_dair_tot = 0.
321  h_qw_tot = 0.
322  h_ql_tot = 0.
323  h_qs_tot = 0.
324  airetot = 0.
325 
326  DO i = 1, klon
327  qw_tot = qw_tot + zqw_col(i)*airephy(i)
328  ql_tot = ql_tot + zql_col(i)*airephy(i)
329  qs_tot = qs_tot + zqs_col(i)*airephy(i)
330  ec_tot = ec_tot + zec_col(i)*airephy(i)
331  h_dair_tot = h_dair_tot + zh_dair_col(i)*airephy(i)
332  h_qw_tot = h_qw_tot + zh_qw_col(i)*airephy(i)
333  h_ql_tot = h_ql_tot + zh_ql_col(i)*airephy(i)
334  h_qs_tot = h_qs_tot + zh_qs_col(i)*airephy(i)
335  airetot = airetot + airephy(i)
336  END DO
337 
338  qw_tot = qw_tot/airetot
339  ql_tot = ql_tot/airetot
340  qs_tot = qs_tot/airetot
341  ec_tot = ec_tot/airetot
342  h_dair_tot = h_dair_tot/airetot
343  h_qw_tot = h_qw_tot/airetot
344  h_ql_tot = h_ql_tot/airetot
345  h_qs_tot = h_qs_tot/airetot
346 
347  h_vcol_tot = h_dair_tot + h_qw_tot + h_ql_tot + h_qs_tot
348 
349  ! Compute the change of the atmospheric state compare to the one
350  ! stored in "idiag2", and convert it in flux. THis computation
351  ! is performed IF idiag2 /= 0 and IF it is not the first CALL
352  ! for "idiag"
353  ! ===================================
354 
355  IF ((idiag2>0) .AND. (pas(idiag2)/=0)) THEN
356  d_h_vcol = (h_vcol_tot-h_vcol_pre(idiag2))/dtime
357  d_h_dair = (h_dair_tot-h_dair_pre(idiag2))/dtime
358  d_h_qw = (h_qw_tot-h_qw_pre(idiag2))/dtime
359  d_h_ql = (h_ql_tot-h_ql_pre(idiag2))/dtime
360  d_h_qs = (h_qs_tot-h_qs_pre(idiag2))/dtime
361  d_qw = (qw_tot-qw_pre(idiag2))/dtime
362  d_ql = (ql_tot-ql_pre(idiag2))/dtime
363  d_qs = (qs_tot-qs_pre(idiag2))/dtime
364  d_ec = (ec_tot-ec_pre(idiag2))/dtime
365  d_qt = d_qw + d_ql + d_qs
366  ELSE
367  d_h_vcol = 0.
368  d_h_dair = 0.
369  d_h_qw = 0.
370  d_h_ql = 0.
371  d_h_qs = 0.
372  d_qw = 0.
373  d_ql = 0.
374  d_qs = 0.
375  d_ec = 0.
376  d_qt = 0.
377  END IF
378 
379  IF (iprt>=2) THEN
380  WRITE (6, 9000) tit, pas(idiag), d_qt, d_qw, d_ql, d_qs
381 9000 FORMAT ('Phys. Watter Mass Budget (kg/m2/s)', a15, 1i6, 10(1pe14.6))
382  WRITE (6, 9001) tit, pas(idiag), d_h_vcol
383 9001 FORMAT ('Phys. Enthalpy Budget (W/m2) ', a15, 1i6, 10(f8.2))
384  WRITE (6, 9002) tit, pas(idiag), d_ec
385 9002 FORMAT ('Phys. Cinetic Energy Budget (W/m2) ', a15, 1i6, 10(f8.2))
386  END IF
387 
388  ! Store the new atmospheric state in "idiag"
389 
390  pas(idiag) = pas(idiag) + 1
391  h_vcol_pre(idiag) = h_vcol_tot
392  h_dair_pre(idiag) = h_dair_tot
393  h_qw_pre(idiag) = h_qw_tot
394  h_ql_pre(idiag) = h_ql_tot
395  h_qs_pre(idiag) = h_qs_tot
396  qw_pre(idiag) = qw_tot
397  ql_pre(idiag) = ql_tot
398  qs_pre(idiag) = qs_tot
399  ec_pre(idiag) = ec_tot
400 
401  RETURN
402 END SUBROUTINE diagetpq
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL pplay
Definition: calcul_STDlev.h:26
subroutine diagetpq(airephy, tit, iprt, idiag, idiag2, dtime, t, q, ql, qs, u, v, paprs, pplay, d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
Definition: diagphy.F90:150
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm u(l)
subroutine diagphy(airephy, tit, iprt, tops, topl, sols, soll, sens, evap, rain_fall, snow_fall, ts, d_etp_tot, d_qt_tot, d_ec_tot, fs_bound, fq_bound)
Definition: diagphy.F90:7
Definition: dimphy.F90:1
real rg
Definition: comcstphy.h:1