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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (hide 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 guez 51 module diagetpq_m
2 guez 47
3 guez 51 IMPLICIT NONE
4 guez 47
5 guez 51 contains
6    
7 guez 98 SUBROUTINE diagetpq(airephy, tit, iprt, idiag, idiag2, dtime, t, q, ql, &
8     u, v, paprs, d_h_vcol, d_qt, d_ec)
9 guez 51
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 guez 178 USE suphec_m, ONLY: rcpd, rcpv, rcw, rg, rlvtt
30 guez 51
31     ! Arguments:
32 guez 91
33     ! Input variables
34 guez 98 real, intent(in):: airephy(klon) ! grid area
35 guez 91 CHARACTER(len=*), intent(in):: tit ! comment added in PRINT
36 guez 98 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 guez 91 REAL, intent(in):: u(klon, klev), v(klon, klev) ! vitesse
53     REAL, intent(in):: paprs(klon, klev+1) ! pression a intercouche (Pa)
54 guez 51
55 guez 98 ! The following total values are computed per UNIT of Earth surface
56 guez 51
57 guez 98 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 guez 51
62 guez 98 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 guez 51
66 guez 98 REAL, intent(out):: d_ec
67     ! kinetic energy budget (W/m2) for vertical air column
68 guez 51
69 guez 98 ! 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 guez 51 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 guez 98 REAL zh_qw_col(klon), zh_ql_col(klon)
93 guez 178 REAL airetot, zcpvap, zcwat
94 guez 51 INTEGER i, k
95     INTEGER, PARAMETER:: ndiag = 10 ! max number of diagnostic in parallel
96     integer:: pas(ndiag) = 0
97 guez 178 REAL, save:: h_vcol_pre(ndiag)
98     REAL, save:: qw_pre(ndiag), ql_pre(ndiag)
99 guez 98 REAL, save:: ec_pre(ndiag)
100 guez 51
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 guez 98 + RCPD*(1.-q(i, k)-ql(i, k))*zairm(i, k)*t(i, k)
133 guez 51 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 guez 98 h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot
168 guez 51
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 guez 98 IF (idiag2 > 0 .and. pas(idiag2) /= 0) THEN
175 guez 51 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 guez 98 d_qt = d_qw + d_ql
180 guez 51 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 guez 98 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 guez 51 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 guez 98 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 guez 51 END SUBROUTINE diagetpq
206    
207     end module diagetpq_m

  ViewVC Help
Powered by ViewVC 1.1.21