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

Annotation of /trunk/phylmd/diagetpq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 91 - (hide annotations)
Wed Mar 26 17:18:58 2014 UTC (10 years, 2 months ago) by guez
File size: 8396 byte(s)
Removed unused variables lock_startdate and time_stamp of module
calendar.

Noticed that physiq does not change the surface pressure. So removed
arguments ps and dpfi of subroutine addfi. dpfi was always 0. The
computation of ps in addfi included some averaging at the poles. In
principle, this does not change ps but in practice it does because of
finite numerical precision. So the results of the simulation are
changed. Removed arguments ps and dpfi of calfis. Removed argument
d_ps of physiq.

du at the poles is not computed by dudv1, so declare only the
corresponding latitudes in dudv1. caldyn passes only a section of the
array dudyn as argument.

Removed variable niadv of module iniadvtrac_m.

Declared arguments of exner_hyb as assumed-shape arrays and made all
other horizontal sizes in exner_hyb dynamic. This allows the external
program test_disvert to use exner_hyb at a single horizontal position.

1 guez 51 module diagetpq_m
2 guez 47
3 guez 51 IMPLICIT NONE
4 guez 47
5 guez 51 contains
6    
7     SUBROUTINE diagetpq(airephy, tit, iprt, idiag, idiag2, dtime, t, q, ql, qs, &
8     u, v, paprs, d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
9    
10 guez 91 ! From LMDZ4/libf/phylmd/diagphy.F, version 1.1.1.1, 2004/05/19 12:53:08
11 guez 51
12     ! Purpose:
13    
14     ! Calcule la différence d'enthalpie et de masse d'eau entre deux
15     ! appels et calcule le flux de chaleur et le flux d'eau
16     ! nécessaires à ces changements. Ces valeurs sont moyennées sur la
17     ! surface de tout le globe et sont exprimées en W/m2 et
18     ! kg/s/m2. Outil pour diagnostiquer la conservation de l'énergie
19     ! et de la masse dans la physique. Suppose que les niveaux de
20     ! pression entre les couches ne varient pas entre deux appels.
21    
22     ! Plusieurs de ces diagnostics peuvent être faits en parallèle :
23     ! les bilans sont sauvegardés dans des tableaux indices. On
24     ! parlera "d'indice de diagnostic".
25    
26     ! Jean-Louis Dufresne, July 2002
27    
28 guez 52 USE dimphy, ONLY: klev, klon
29     USE suphec_m, ONLY: rcpd, rcpv, rcs, rcw, rg, rlstt, rlvtt
30 guez 51
31     ! Arguments:
32 guez 91
33     ! Input variables
34     real airephy(klon)
35 guez 51 ! airephy-------input-R- grid area
36 guez 91 CHARACTER(len=*), intent(in):: tit ! comment added in PRINT
37     INTEGER iprt, idiag, idiag2
38 guez 51 ! iprt----input-I- PRINT level ( <=1 : no PRINT)
39     ! idiag---input-I- indice dans lequel sera range les nouveaux
40     ! bilans d' entalpie et de masse
41     ! idiag2--input-I-les nouveaux bilans d'entalpie et de masse
42     ! sont compare au bilan de d'enthalpie de masse de
43     ! l'indice numero idiag2
44     ! Cas particulier : si idiag2=0, pas de comparaison, on
45     ! sort directement les bilans d'enthalpie et de masse
46 guez 91 REAL, intent(in):: dtime
47 guez 51 ! dtime----input-R- time step (s)
48 guez 91 REAL, intent(in):: t(klon, klev)
49 guez 51 ! t--------input-R- temperature (K)
50 guez 91 REAL, intent(in):: q(klon, klev), ql(klon, klev), qs(klon, klev)
51 guez 51 ! q--------input-R- vapeur d'eau (kg/kg)
52     ! ql-------input-R- liquid water (kg/kg)
53     ! qs-------input-R- solid water (kg/kg)
54 guez 91 REAL, intent(in):: u(klon, klev), v(klon, klev) ! vitesse
55     REAL, intent(in):: paprs(klon, klev+1) ! pression a intercouche (Pa)
56 guez 51
57 guez 91 ! Output variables
58 guez 51 ! the following total value are computed by UNIT of earth surface
59 guez 91 REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
60 guez 51
61     ! d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
62     ! change (J/m2) during one time step (dtime) for the whole
63     ! atmosphere (air, water vapour, liquid and solid)
64     ! d_qt------output-R- total water mass flux (kg/m2/s) defined as the
65     ! total water (kg/m2) change during one time step (dtime),
66     ! d_qw------output-R- same, for the water vapour only (kg/m2/s)
67     ! d_ql------output-R- same, for the liquid water only (kg/m2/s)
68     ! d_qs------output-R- same, for the solid water only (kg/m2/s)
69     ! d_ec------output-R- Kinetic Energy Budget (W/m2) for vertical air column
70    
71     ! Local variables
72    
73     REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, h_qs_tot, qw_tot, ql_tot
74     real qs_tot , ec_tot
75     ! h_vcol_tot-- total enthalpy of vertical air column
76     ! (air with water vapour, liquid and solid) (J/m2)
77     ! h_dair_tot-- total enthalpy of dry air (J/m2)
78     ! h_qw_tot---- total enthalpy of water vapour (J/m2)
79     ! h_ql_tot---- total enthalpy of liquid water (J/m2)
80     ! h_qs_tot---- total enthalpy of solid water (J/m2)
81     ! qw_tot------ total mass of water vapour (kg/m2)
82     ! ql_tot------ total mass of liquid water (kg/m2)
83     ! qs_tot------ total mass of solid water (kg/m2)
84     ! ec_tot------ total kinetic energy (kg/m2)
85    
86     REAL zairm(klon, klev) ! layer air mass (kg/m2)
87     REAL zqw_col(klon)
88     REAL zql_col(klon)
89     REAL zqs_col(klon)
90     REAL zec_col(klon)
91     REAL zh_dair_col(klon)
92     REAL zh_qw_col(klon), zh_ql_col(klon), zh_qs_col(klon)
93    
94     REAL d_h_dair, d_h_qw, d_h_ql, d_h_qs
95    
96     REAL airetot, zcpvap, zcwat, zcice
97    
98     INTEGER i, k
99    
100     INTEGER, PARAMETER:: ndiag = 10 ! max number of diagnostic in parallel
101     integer:: pas(ndiag) = 0
102    
103     REAL, save:: h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag)
104     REAL, save:: h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag), ql_pre(ndiag)
105     REAL, save:: qs_pre(ndiag), ec_pre(ndiag)
106    
107     !-------------------------------------------------------------
108    
109     DO k = 1, klev
110     DO i = 1, klon
111     ! layer air mass
112     zairm(i, k) = (paprs(i, k)-paprs(i, k+1))/RG
113     ENDDO
114     END DO
115    
116     ! Reset variables
117     DO i = 1, klon
118     zqw_col(i)=0.
119     zql_col(i)=0.
120     zqs_col(i)=0.
121     zec_col(i) = 0.
122     zh_dair_col(i) = 0.
123     zh_qw_col(i) = 0.
124     zh_ql_col(i) = 0.
125     zh_qs_col(i) = 0.
126     ENDDO
127    
128     zcpvap=RCPV
129     zcwat=RCW
130     zcice=RCS
131    
132     ! Compute vertical sum for each atmospheric column
133     DO k = 1, klev
134     DO i = 1, klon
135     ! Water mass
136     zqw_col(i) = zqw_col(i) + q(i, k)*zairm(i, k)
137     zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
138     zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k)
139     ! Kinetic Energy
140     zec_col(i) = zec_col(i) +0.5*(u(i, k)**2+v(i, k)**2)*zairm(i, k)
141     ! Air enthalpy
142     zh_dair_col(i) = zh_dair_col(i) &
143     + RCPD*(1.-q(i, k)-ql(i, k)-qs(i, k))*zairm(i, k)*t(i, k)
144     zh_qw_col(i) = zh_qw_col(i) + zcpvap*q(i, k)*zairm(i, k)*t(i, k)
145     zh_ql_col(i) = zh_ql_col(i) &
146     + zcwat*ql(i, k)*zairm(i, k)*t(i, k) &
147     - RLVTT*ql(i, k)*zairm(i, k)
148     zh_qs_col(i) = zh_qs_col(i) &
149     + zcice*qs(i, k)*zairm(i, k)*t(i, k) &
150     - RLSTT*qs(i, k)*zairm(i, k)
151     END DO
152     ENDDO
153    
154     ! Mean over the planet surface
155     qw_tot = 0.
156     ql_tot = 0.
157     qs_tot = 0.
158     ec_tot = 0.
159     h_vcol_tot = 0.
160     h_dair_tot = 0.
161     h_qw_tot = 0.
162     h_ql_tot = 0.
163     h_qs_tot = 0.
164     airetot=0.
165    
166     do i=1, klon
167     qw_tot = qw_tot + zqw_col(i)*airephy(i)
168     ql_tot = ql_tot + zql_col(i)*airephy(i)
169     qs_tot = qs_tot + zqs_col(i)*airephy(i)
170     ec_tot = ec_tot + zec_col(i)*airephy(i)
171     h_dair_tot = h_dair_tot + zh_dair_col(i)*airephy(i)
172     h_qw_tot = h_qw_tot + zh_qw_col(i)*airephy(i)
173     h_ql_tot = h_ql_tot + zh_ql_col(i)*airephy(i)
174     h_qs_tot = h_qs_tot + zh_qs_col(i)*airephy(i)
175     airetot=airetot+airephy(i)
176     END DO
177    
178     qw_tot = qw_tot/airetot
179     ql_tot = ql_tot/airetot
180     qs_tot = qs_tot/airetot
181     ec_tot = ec_tot/airetot
182     h_dair_tot = h_dair_tot/airetot
183     h_qw_tot = h_qw_tot/airetot
184     h_ql_tot = h_ql_tot/airetot
185     h_qs_tot = h_qs_tot/airetot
186    
187     h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot+h_qs_tot
188    
189     ! Compute the change of the atmospheric state compared to the one
190     ! stored in "idiag2", and convert it in flux. This computation is
191     ! performed if idiag2 /= 0 and if it is not the first call for
192     ! "idiag".
193    
194     IF ((idiag2 > 0) .and. (pas(idiag2) /= 0)) THEN
195     d_h_vcol = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
196     d_h_dair = (h_dair_tot- h_dair_pre(idiag2))/dtime
197     d_h_qw = (h_qw_tot - h_qw_pre(idiag2) )/dtime
198     d_h_ql = (h_ql_tot - h_ql_pre(idiag2) )/dtime
199     d_h_qs = (h_qs_tot - h_qs_pre(idiag2) )/dtime
200     d_qw = (qw_tot - qw_pre(idiag2) )/dtime
201     d_ql = (ql_tot - ql_pre(idiag2) )/dtime
202     d_qs = (qs_tot - qs_pre(idiag2) )/dtime
203     d_ec = (ec_tot - ec_pre(idiag2) )/dtime
204     d_qt = d_qw + d_ql + d_qs
205     ELSE
206     d_h_vcol = 0.
207     d_h_dair = 0.
208     d_h_qw = 0.
209     d_h_ql = 0.
210     d_h_qs = 0.
211     d_qw = 0.
212     d_ql = 0.
213     d_qs = 0.
214     d_ec = 0.
215     d_qt = 0.
216     ENDIF
217    
218     IF (iprt >= 2) THEN
219     WRITE(6, 9000) tit, pas(idiag), d_qt, d_qw, d_ql, d_qs
220     9000 format('Phys. Water Mass Budget (kg/m2/s)', A15, 1i6, 10(1pE14.6))
221     WRITE(6, 9001) tit, pas(idiag), d_h_vcol
222     9001 format('Phys. Enthalpy Budget (W/m2) ', A15, 1i6, 10(F8.2))
223     WRITE(6, 9002) tit, pas(idiag), d_ec
224     9002 format('Phys. Kinetic Energy Budget (W/m2) ', A15, 1i6, 10(F8.2))
225     END IF
226    
227     ! Store the new atmospheric state in "idiag"
228     pas(idiag)=pas(idiag)+1
229     h_vcol_pre(idiag) = h_vcol_tot
230     h_dair_pre(idiag) = h_dair_tot
231     h_qw_pre(idiag) = h_qw_tot
232     h_ql_pre(idiag) = h_ql_tot
233     h_qs_pre(idiag) = h_qs_tot
234     qw_pre(idiag) = qw_tot
235     ql_pre(idiag) = ql_tot
236     qs_pre(idiag) = qs_tot
237     ec_pre (idiag) = ec_tot
238    
239     END SUBROUTINE diagetpq
240    
241     end module diagetpq_m

  ViewVC Help
Powered by ViewVC 1.1.21