/[lmdze]/trunk/libf/phylmd/diagetpq.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/diagetpq.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations)
Thu Jul 26 14:37:37 2012 UTC (11 years, 9 months ago) by guez
File size: 8509 byte(s)
Changed handling of compiler in compilation system.

Removed the prefix letters "y", "p", "t" or "z" in some names of variables.

Replaced calls to NetCDF by calls to NetCDF95.

Extracted "ioget_calendar" procedures from "calendar.f90" into a
separate file.

Extracted to a separate file, "mathop2.f90", procedures that were not
part of the generic interface "mathop" in "mathop.f90".

Removed computation of "dq" in "bilan_dyn", which was not used.

In "iniadvtrac", removed schemes 20 Slopes and 30 Prather. Was not
compatible with declarations of array sizes.

In "clcdrag", "ustarhb", "vdif_kcay", "yamada4" and "coefkz", changed
the size of some arrays from "klon" to "knon".

Removed possible call to "conema3" in "physiq".

Removed unused argument "cd" in "yamada".

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 ! airephy-------input-R- grid area
33 ! iprt----input-I- PRINT level ( <=1 : no PRINT)
34 ! idiag---input-I- indice dans lequel sera range les nouveaux
35 ! bilans d' entalpie et de masse
36 ! idiag2--input-I-les nouveaux bilans d'entalpie et de masse
37 ! sont compare au bilan de d'enthalpie de masse de
38 ! l'indice numero idiag2
39 ! Cas particulier : si idiag2=0, pas de comparaison, on
40 ! sort directement les bilans d'enthalpie et de masse
41 ! dtime----input-R- time step (s)
42 ! t--------input-R- temperature (K)
43 ! q--------input-R- vapeur d'eau (kg/kg)
44 ! ql-------input-R- liquid water (kg/kg)
45 ! qs-------input-R- solid water (kg/kg)
46 ! u--------input-R- vitesse u
47 ! v--------input-R- vitesse v
48 ! paprs----input-R- pression a intercouche (Pa)
49
50 ! the following total value are computed by UNIT of earth surface
51
52 ! d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
53 ! change (J/m2) during one time step (dtime) for the whole
54 ! atmosphere (air, water vapour, liquid and solid)
55 ! d_qt------output-R- total water mass flux (kg/m2/s) defined as the
56 ! total water (kg/m2) change during one time step (dtime),
57 ! d_qw------output-R- same, for the water vapour only (kg/m2/s)
58 ! d_ql------output-R- same, for the liquid water only (kg/m2/s)
59 ! d_qs------output-R- same, for the solid water only (kg/m2/s)
60 ! d_ec------output-R- Kinetic Energy Budget (W/m2) for vertical air column
61
62 ! other (COMMON...)
63 ! RCPD, RCPV, ....
64
65 ! Input variables
66 real airephy(klon)
67 CHARACTER(len=*), intent(in):: tit ! comment added in PRINT
68 INTEGER iprt, idiag, idiag2
69 REAL, intent(in):: dtime
70 REAL, intent(in):: t(klon, klev)
71 REAL, intent(in):: q(klon, klev), ql(klon, klev), qs(klon, klev)
72 REAL u(klon, klev), v(klon, klev)
73 REAL, intent(in):: paprs(klon, klev+1)
74 ! Output variables
75 REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
76
77 ! Local variables
78
79 REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, h_qs_tot, qw_tot, ql_tot
80 real qs_tot , ec_tot
81 ! h_vcol_tot-- total enthalpy of vertical air column
82 ! (air with water vapour, liquid and solid) (J/m2)
83 ! h_dair_tot-- total enthalpy of dry air (J/m2)
84 ! h_qw_tot---- total enthalpy of water vapour (J/m2)
85 ! h_ql_tot---- total enthalpy of liquid water (J/m2)
86 ! h_qs_tot---- total enthalpy of solid water (J/m2)
87 ! qw_tot------ total mass of water vapour (kg/m2)
88 ! ql_tot------ total mass of liquid water (kg/m2)
89 ! qs_tot------ total mass of solid water (kg/m2)
90 ! ec_tot------ total kinetic energy (kg/m2)
91
92 REAL zairm(klon, klev) ! layer air mass (kg/m2)
93 REAL zqw_col(klon)
94 REAL zql_col(klon)
95 REAL zqs_col(klon)
96 REAL zec_col(klon)
97 REAL zh_dair_col(klon)
98 REAL zh_qw_col(klon), zh_ql_col(klon), zh_qs_col(klon)
99
100 REAL d_h_dair, d_h_qw, d_h_ql, d_h_qs
101
102 REAL airetot, zcpvap, zcwat, zcice
103
104 INTEGER i, k
105
106 INTEGER, PARAMETER:: ndiag = 10 ! max number of diagnostic in parallel
107 integer:: pas(ndiag) = 0
108
109 REAL, save:: h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag)
110 REAL, save:: h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag), ql_pre(ndiag)
111 REAL, save:: qs_pre(ndiag), ec_pre(ndiag)
112
113 !-------------------------------------------------------------
114
115 DO k = 1, klev
116 DO i = 1, klon
117 ! layer air mass
118 zairm(i, k) = (paprs(i, k)-paprs(i, k+1))/RG
119 ENDDO
120 END DO
121
122 ! Reset variables
123 DO i = 1, klon
124 zqw_col(i)=0.
125 zql_col(i)=0.
126 zqs_col(i)=0.
127 zec_col(i) = 0.
128 zh_dair_col(i) = 0.
129 zh_qw_col(i) = 0.
130 zh_ql_col(i) = 0.
131 zh_qs_col(i) = 0.
132 ENDDO
133
134 zcpvap=RCPV
135 zcwat=RCW
136 zcice=RCS
137
138 ! Compute vertical sum for each atmospheric column
139 DO k = 1, klev
140 DO i = 1, klon
141 ! Water mass
142 zqw_col(i) = zqw_col(i) + q(i, k)*zairm(i, k)
143 zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
144 zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k)
145 ! Kinetic Energy
146 zec_col(i) = zec_col(i) +0.5*(u(i, k)**2+v(i, k)**2)*zairm(i, k)
147 ! Air enthalpy
148 zh_dair_col(i) = zh_dair_col(i) &
149 + RCPD*(1.-q(i, k)-ql(i, k)-qs(i, k))*zairm(i, k)*t(i, k)
150 zh_qw_col(i) = zh_qw_col(i) + zcpvap*q(i, k)*zairm(i, k)*t(i, k)
151 zh_ql_col(i) = zh_ql_col(i) &
152 + zcwat*ql(i, k)*zairm(i, k)*t(i, k) &
153 - RLVTT*ql(i, k)*zairm(i, k)
154 zh_qs_col(i) = zh_qs_col(i) &
155 + zcice*qs(i, k)*zairm(i, k)*t(i, k) &
156 - RLSTT*qs(i, k)*zairm(i, k)
157 END DO
158 ENDDO
159
160 ! Mean over the planet surface
161 qw_tot = 0.
162 ql_tot = 0.
163 qs_tot = 0.
164 ec_tot = 0.
165 h_vcol_tot = 0.
166 h_dair_tot = 0.
167 h_qw_tot = 0.
168 h_ql_tot = 0.
169 h_qs_tot = 0.
170 airetot=0.
171
172 do i=1, klon
173 qw_tot = qw_tot + zqw_col(i)*airephy(i)
174 ql_tot = ql_tot + zql_col(i)*airephy(i)
175 qs_tot = qs_tot + zqs_col(i)*airephy(i)
176 ec_tot = ec_tot + zec_col(i)*airephy(i)
177 h_dair_tot = h_dair_tot + zh_dair_col(i)*airephy(i)
178 h_qw_tot = h_qw_tot + zh_qw_col(i)*airephy(i)
179 h_ql_tot = h_ql_tot + zh_ql_col(i)*airephy(i)
180 h_qs_tot = h_qs_tot + zh_qs_col(i)*airephy(i)
181 airetot=airetot+airephy(i)
182 END DO
183
184 qw_tot = qw_tot/airetot
185 ql_tot = ql_tot/airetot
186 qs_tot = qs_tot/airetot
187 ec_tot = ec_tot/airetot
188 h_dair_tot = h_dair_tot/airetot
189 h_qw_tot = h_qw_tot/airetot
190 h_ql_tot = h_ql_tot/airetot
191 h_qs_tot = h_qs_tot/airetot
192
193 h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot+h_qs_tot
194
195 ! Compute the change of the atmospheric state compared to the one
196 ! stored in "idiag2", and convert it in flux. This computation is
197 ! performed if idiag2 /= 0 and if it is not the first call for
198 ! "idiag".
199
200 IF ((idiag2 > 0) .and. (pas(idiag2) /= 0)) THEN
201 d_h_vcol = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
202 d_h_dair = (h_dair_tot- h_dair_pre(idiag2))/dtime
203 d_h_qw = (h_qw_tot - h_qw_pre(idiag2) )/dtime
204 d_h_ql = (h_ql_tot - h_ql_pre(idiag2) )/dtime
205 d_h_qs = (h_qs_tot - h_qs_pre(idiag2) )/dtime
206 d_qw = (qw_tot - qw_pre(idiag2) )/dtime
207 d_ql = (ql_tot - ql_pre(idiag2) )/dtime
208 d_qs = (qs_tot - qs_pre(idiag2) )/dtime
209 d_ec = (ec_tot - ec_pre(idiag2) )/dtime
210 d_qt = d_qw + d_ql + d_qs
211 ELSE
212 d_h_vcol = 0.
213 d_h_dair = 0.
214 d_h_qw = 0.
215 d_h_ql = 0.
216 d_h_qs = 0.
217 d_qw = 0.
218 d_ql = 0.
219 d_qs = 0.
220 d_ec = 0.
221 d_qt = 0.
222 ENDIF
223
224 IF (iprt >= 2) THEN
225 WRITE(6, 9000) tit, pas(idiag), d_qt, d_qw, d_ql, d_qs
226 9000 format('Phys. Water Mass Budget (kg/m2/s)', A15, 1i6, 10(1pE14.6))
227 WRITE(6, 9001) tit, pas(idiag), d_h_vcol
228 9001 format('Phys. Enthalpy Budget (W/m2) ', A15, 1i6, 10(F8.2))
229 WRITE(6, 9002) tit, pas(idiag), d_ec
230 9002 format('Phys. Kinetic Energy Budget (W/m2) ', A15, 1i6, 10(F8.2))
231 END IF
232
233 ! Store the new atmospheric state in "idiag"
234 pas(idiag)=pas(idiag)+1
235 h_vcol_pre(idiag) = h_vcol_tot
236 h_dair_pre(idiag) = h_dair_tot
237 h_qw_pre(idiag) = h_qw_tot
238 h_ql_pre(idiag) = h_ql_tot
239 h_qs_pre(idiag) = h_qs_tot
240 qw_pre(idiag) = qw_tot
241 ql_pre(idiag) = ql_tot
242 qs_pre(idiag) = qs_tot
243 ec_pre (idiag) = ec_tot
244
245 END SUBROUTINE diagetpq
246
247 end module diagetpq_m

  ViewVC Help
Powered by ViewVC 1.1.21