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

Contents of /trunk/phylmd/diagetpq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 91 - (show 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 module diagetpq_m
2
3 IMPLICIT NONE
4
5 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 ! From LMDZ4/libf/phylmd/diagphy.F, version 1.1.1.1, 2004/05/19 12:53:08
11
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 USE dimphy, ONLY: klev, klon
29 USE suphec_m, ONLY: rcpd, rcpv, rcs, rcw, rg, rlstt, rlvtt
30
31 ! Arguments:
32
33 ! Input variables
34 real airephy(klon)
35 ! airephy-------input-R- grid area
36 CHARACTER(len=*), intent(in):: tit ! comment added in PRINT
37 INTEGER iprt, idiag, idiag2
38 ! 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 REAL, intent(in):: dtime
47 ! dtime----input-R- time step (s)
48 REAL, intent(in):: t(klon, klev)
49 ! t--------input-R- temperature (K)
50 REAL, intent(in):: q(klon, klev), ql(klon, klev), qs(klon, klev)
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 REAL, intent(in):: u(klon, klev), v(klon, klev) ! vitesse
55 REAL, intent(in):: paprs(klon, klev+1) ! pression a intercouche (Pa)
56
57 ! Output variables
58 ! the following total value are computed by UNIT of earth surface
59 REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
60
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