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

Contents of /trunk/Sources/phylmd/diagetpq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 6760 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

1 module diagetpq_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE diagetpq(airephy, tit, iprt, idiag, idiag2, dtime, t, q, ql, &
8 u, v, paprs, d_h_vcol, d_qt, 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, rcw, rg, rlvtt
30
31 ! Arguments:
32
33 ! Input variables
34 real, intent(in):: airephy(klon) ! grid area
35 CHARACTER(len=*), intent(in):: tit ! comment added in PRINT
36 INTEGER, intent(in):: iprt ! PRINT level ( <=1 : no PRINT)
37
38 INTEGER, intent(in):: idiag
39 ! indice dans lequel seront rangés les nouveaux bilans d'enthalpie et
40 ! de masse
41
42 INTEGER, intent(in):: idiag2
43 ! Les nouveaux bilans d'enthalpie et de masse sont comparés au
44 ! bilan de d'enthalpie de masse de l'indice numéro idiag2. Cas
45 ! particulier : si idiag2=0, pas de comparaison, on sort
46 ! directement les bilans d'enthalpie et de masse.
47
48 REAL, intent(in):: dtime ! time step (s)
49 REAL, intent(in):: t(klon, klev) ! temperature (K)
50 REAL, intent(in):: q(klon, klev) ! vapeur d'eau (kg/kg)
51 REAL, intent(in):: ql(klon, klev) ! liquid water (kg/kg)
52 REAL, intent(in):: u(klon, klev), v(klon, klev) ! vitesse
53 REAL, intent(in):: paprs(klon, klev+1) ! pression a intercouche (Pa)
54
55 ! The following total values are computed per UNIT of Earth surface
56
57 REAL, intent(out):: d_h_vcol
58 ! heat flux (W/m2) defined as the enthalpy change (J/m2) during
59 ! one time step (dtime) for the whole atmosphere (air, water
60 ! vapour, liquid and solid)
61
62 REAL, intent(out):: d_qt
63 ! total water mass flux (kg/m2/s) defined as the
64 ! total water (kg/m2) change during one time step (dtime)
65
66 REAL, intent(out):: d_ec
67 ! kinetic energy budget (W/m2) for vertical air column
68
69 ! Local:
70
71 REAL d_qw
72 ! water vapour mass flux (kg/m2/s) defined as the water vapour
73 ! (kg/m2) change during one time step (dtime)
74
75 REAL d_ql ! same, for the liquid water only (kg/m2/s)
76
77 REAL h_vcol_tot
78 ! total enthalpy of vertical air column (air with water vapour,
79 ! liquid and solid) (J/m2)
80
81 REAL h_dair_tot ! total enthalpy of dry air (J/m2)
82 REAL h_qw_tot ! total enthalpy of water vapour (J/m2)
83 REAL h_ql_tot ! total enthalpy of liquid water (J/m2)
84 REAL qw_tot ! total mass of water vapour (kg/m2)
85 REAL ql_tot ! total mass of liquid water (kg/m2)
86 real ec_tot ! total kinetic energy (kg/m2)
87 REAL zairm(klon, klev) ! layer air mass (kg/m2)
88 REAL zqw_col(klon)
89 REAL zql_col(klon)
90 REAL zec_col(klon)
91 REAL zh_dair_col(klon)
92 REAL zh_qw_col(klon), zh_ql_col(klon)
93 REAL airetot, zcpvap, zcwat
94 INTEGER i, k
95 INTEGER, PARAMETER:: ndiag = 10 ! max number of diagnostic in parallel
96 integer:: pas(ndiag) = 0
97 REAL, save:: h_vcol_pre(ndiag)
98 REAL, save:: qw_pre(ndiag), ql_pre(ndiag)
99 REAL, save:: ec_pre(ndiag)
100
101 !-------------------------------------------------------------
102
103 DO k = 1, klev
104 DO i = 1, klon
105 zairm(i, k) = (paprs(i, k)-paprs(i, k+1))/RG
106 ENDDO
107 END DO
108
109 ! Reset variables
110 DO i = 1, klon
111 zqw_col(i)=0.
112 zql_col(i)=0.
113 zec_col(i) = 0.
114 zh_dair_col(i) = 0.
115 zh_qw_col(i) = 0.
116 zh_ql_col(i) = 0.
117 ENDDO
118
119 zcpvap=RCPV
120 zcwat=RCW
121
122 ! Compute vertical sum for each atmospheric column
123 DO k = 1, klev
124 DO i = 1, klon
125 ! Water mass
126 zqw_col(i) = zqw_col(i) + q(i, k)*zairm(i, k)
127 zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
128 ! Kinetic Energy
129 zec_col(i) = zec_col(i) +0.5*(u(i, k)**2+v(i, k)**2)*zairm(i, k)
130 ! Air enthalpy
131 zh_dair_col(i) = zh_dair_col(i) &
132 + RCPD*(1.-q(i, k)-ql(i, k))*zairm(i, k)*t(i, k)
133 zh_qw_col(i) = zh_qw_col(i) + zcpvap*q(i, k)*zairm(i, k)*t(i, k)
134 zh_ql_col(i) = zh_ql_col(i) &
135 + zcwat*ql(i, k)*zairm(i, k)*t(i, k) &
136 - RLVTT*ql(i, k)*zairm(i, k)
137 END DO
138 ENDDO
139
140 ! Mean over the planet surface
141 qw_tot = 0.
142 ql_tot = 0.
143 ec_tot = 0.
144 h_vcol_tot = 0.
145 h_dair_tot = 0.
146 h_qw_tot = 0.
147 h_ql_tot = 0.
148 airetot=0.
149
150 do i=1, klon
151 qw_tot = qw_tot + zqw_col(i)*airephy(i)
152 ql_tot = ql_tot + zql_col(i)*airephy(i)
153 ec_tot = ec_tot + zec_col(i)*airephy(i)
154 h_dair_tot = h_dair_tot + zh_dair_col(i)*airephy(i)
155 h_qw_tot = h_qw_tot + zh_qw_col(i)*airephy(i)
156 h_ql_tot = h_ql_tot + zh_ql_col(i)*airephy(i)
157 airetot=airetot+airephy(i)
158 END DO
159
160 qw_tot = qw_tot/airetot
161 ql_tot = ql_tot/airetot
162 ec_tot = ec_tot/airetot
163 h_dair_tot = h_dair_tot/airetot
164 h_qw_tot = h_qw_tot/airetot
165 h_ql_tot = h_ql_tot/airetot
166
167 h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot
168
169 ! Compute the change of the atmospheric state compared to the one
170 ! stored in "idiag2", and convert it in flux. This computation is
171 ! performed if idiag2 /= 0 and if it is not the first call for
172 ! "idiag".
173
174 IF (idiag2 > 0 .and. pas(idiag2) /= 0) THEN
175 d_h_vcol = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
176 d_qw = (qw_tot - qw_pre(idiag2) )/dtime
177 d_ql = (ql_tot - ql_pre(idiag2) )/dtime
178 d_ec = (ec_tot - ec_pre(idiag2) )/dtime
179 d_qt = d_qw + d_ql
180 ELSE
181 d_h_vcol = 0.
182 d_qw = 0.
183 d_ql = 0.
184 d_ec = 0.
185 d_qt = 0.
186 ENDIF
187
188 IF (iprt >= 2) THEN
189 print 9000, tit, pas(idiag), d_qt, d_qw, d_ql
190 print 9001, tit, pas(idiag), d_h_vcol
191 print 9002, tit, pas(idiag), d_ec
192 END IF
193
194 ! Store the new atmospheric state in "idiag"
195 pas(idiag)=pas(idiag)+1
196 h_vcol_pre(idiag) = h_vcol_tot
197 qw_pre(idiag) = qw_tot
198 ql_pre(idiag) = ql_tot
199 ec_pre (idiag) = ec_tot
200
201 9000 format('Physics water mass budget (kg/m2/s)', A15, 1i6, 10(1pE14.6))
202 9001 format('Physics enthalpy budget (W/m2) ', A15, 1i6, 10(F8.2))
203 9002 format('Physics kinetic energy budget (W/m2) ', A15, 1i6, 10(F8.2))
204
205 END SUBROUTINE diagetpq
206
207 end module diagetpq_m

  ViewVC Help
Powered by ViewVC 1.1.21