source: trunk/LMDZ.COMMON/libf/dyn3d_common/diagedyn.F @ 1397

Last change on this file since 1397 was 1397, checked in by milmd, 10 years ago

In LMDZ.GENERIC replacement of all phystd .h files by module files.

File size: 10.8 KB
Line 
1!
2! $Id: diagedyn.F 1279 2009-12-10 09:02:56Z fairhead $
3!
4
5C======================================================================
6      SUBROUTINE diagedyn(tit,iprt,idiag,idiag2,dtime
7     e  , ucov    , vcov , ps, p ,pk , teta , q, ql)
8C======================================================================
9C
10C Purpose:
11C    Calcul la difference d'enthalpie et de masse d'eau entre 2 appels,
12C    et calcul le flux de chaleur et le flux d'eau necessaire a ces
13C    changements. Ces valeurs sont moyennees sur la surface de tout
14C    le globe et sont exprime en W/2 et kg/s/m2
15C    Outil pour diagnostiquer la conservation de l'energie
16C    et de la masse dans la dynamique.
17C
18C
19c======================================================================
20C Arguments:
21C tit-----imput-A15- Comment added in PRINT (CHARACTER*15)
22C iprt----input-I-  PRINT level ( <=1 : no PRINT)
23C idiag---input-I- indice dans lequel sera range les nouveaux
24C                  bilans d' entalpie et de masse
25C idiag2--input-I-les nouveaux bilans d'entalpie et de masse
26C                 sont compare au bilan de d'enthalpie de masse de
27C                 l'indice numero idiag2
28C                 Cas parriculier : si idiag2=0, pas de comparaison, on
29c                 sort directement les bilans d'enthalpie et de masse
30C dtime----input-R- time step (s)
31C uconv, vconv-input-R- vents covariants (m/s)
32C ps-------input-R- Surface pressure (Pa)
33C p--------input-R- pressure at the interfaces
34C pk-------input-R- pk= (p/Pref)**kappa
35c teta-----input-R- potential temperature (K)
36c q--------input-R- vapeur d'eau (kg/kg)
37c ql-------input-R- liquid watter (kg/kg)
38c aire-----input-R- mesh surafce (m2)
39c
40C the following total value are computed by UNIT of earth surface
41C
42C d_h_vcol--output-R- Heat flux (W/m2) define as the Enthalpy
43c            change (J/m2) during one time step (dtime) for the whole
44C            atmosphere (air, watter vapour, liquid and solid)
45C d_qt------output-R- total water mass flux (kg/m2/s) defined as the
46C           total watter (kg/m2) change during one time step (dtime),
47C d_qw------output-R- same, for the watter vapour only (kg/m2/s)
48C d_ql------output-R- same, for the liquid watter only (kg/m2/s)
49C d_ec------output-R- Cinetic Energy Budget (W/m2) for vertical air column
50C
51C
52C J.L. Dufresne, July 2002
53c======================================================================
54 
55      USE cpdet_phy_mod, ONLY: cpdet,tpot2t
56
57      IMPLICIT NONE
58C
59#include "dimensions.h"
60#include "paramet.h"
61#include "comgeom.h"
62#include "iniprint.h"
63
64#ifdef CPP_EARTH
65#include "../phylmd/YOMCST.h"
66#include "../phylmd/YOETHF.h"
67#endif
68C
69      INTEGER imjmp1
70      PARAMETER( imjmp1=iim*jjp1)
71c     Input variables
72      CHARACTER*15 tit
73      INTEGER iprt,idiag, idiag2
74      REAL dtime
75      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
76      REAL ps(ip1jmp1)                       ! pression  au sol
77      REAL p (ip1jmp1,llmp1  )  ! pression aux interfac.des couches
78      REAL pk (ip1jmp1,llm  )  ! = (p/Pref)**kappa
79      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
80      REAL q(ip1jmp1,llm)               ! champs eau vapeur
81      REAL ql(ip1jmp1,llm)               ! champs eau liquide
82
83
84c     Output variables
85      REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
86C
87C     Local variables
88c
89      REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
90     .  , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
91c h_vcol_tot--  total enthalpy of vertical air column
92C            (air with watter vapour, liquid and solid) (J/m2)
93c h_dair_tot-- total enthalpy of dry air (J/m2)
94c h_qw_tot----  total enthalpy of watter vapour (J/m2)
95c h_ql_tot----  total enthalpy of liquid watter (J/m2)
96c h_qs_tot----  total enthalpy of solid watter  (J/m2)
97c qw_tot------  total mass of watter vapour (kg/m2)
98c ql_tot------  total mass of liquid watter (kg/m2)
99c qs_tot------  total mass of solid watter (kg/m2)
100c ec_tot------  total cinetic energy (kg/m2)
101C
102      REAL masse(ip1jmp1,llm)                ! masse d'air
103      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
104      REAL ecin(ip1jmp1,llm)
105
106      REAL zaire(imjmp1)
107      REAL zps(imjmp1)
108      REAL zairm(imjmp1,llm)
109      REAL zecin(imjmp1,llm)
110      REAL zpaprs(imjmp1,llm)
111      REAL zpk(imjmp1,llm)
112      REAL zt(imjmp1,llm)
113      REAL zh(imjmp1,llm)
114      REAL zqw(imjmp1,llm)
115      REAL zql(imjmp1,llm)
116      REAL zqs(imjmp1,llm)
117
118      REAL  zqw_col(imjmp1)
119      REAL  zql_col(imjmp1)
120      REAL  zqs_col(imjmp1)
121      REAL  zec_col(imjmp1)
122      REAL  zh_dair_col(imjmp1)
123      REAL  zh_qw_col(imjmp1), zh_ql_col(imjmp1), zh_qs_col(imjmp1)
124C
125      REAL      d_h_dair, d_h_qw, d_h_ql, d_h_qs
126C
127      REAL airetot, zcpvap, zcwat, zcice
128C
129      INTEGER i, k, jj, ij , l ,ip1jjm1
130C
131      INTEGER ndiag     ! max number of diagnostic in parallel
132      PARAMETER (ndiag=10)
133      integer pas(ndiag)
134      save pas
135      data pas/ndiag*0/
136C     
137      REAL      h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag)
138     $    , h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag)
139     $    , ql_pre(ndiag), qs_pre(ndiag) , ec_pre(ndiag)
140      SAVE      h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre
141     $        , h_qs_pre, qw_pre, ql_pre, qs_pre , ec_pre
142
143
144#ifdef CPP_EARTH
145c======================================================================
146C     Compute Kinetic enrgy
147      CALL covcont  ( llm    , ucov    , vcov , ucont, vcont        )
148      CALL enercin ( vcov   , ucov  , vcont     , ucont  , ecin  )
149      CALL massdair( p, masse )
150c======================================================================
151C
152C
153      print*,'MAIS POURQUOI DONC DIAGEDYN NE MARCHE PAS ?'
154      return
155C     On ne garde les donnees que dans les colonnes i=1,iim
156      DO jj = 1,jjp1
157        ip1jjm1=iip1*(jj-1)
158        DO ij =  1,iim
159          i=iim*(jj-1)+ij
160          zaire(i)=aire(ij+ip1jjm1)
161          zps(i)=ps(ij+ip1jjm1)
162        ENDDO
163      ENDDO
164C 3D arrays
165      DO l  =  1, llm
166        DO jj = 1,jjp1
167          ip1jjm1=iip1*(jj-1)
168          DO ij =  1,iim
169            i=iim*(jj-1)+ij
170            zairm(i,l) = masse(ij+ip1jjm1,l)
171            zecin(i,l) = ecin(ij+ip1jjm1,l)
172            zpaprs(i,l) = p(ij+ip1jjm1,l)
173            zpk(i,l) = pk(ij+ip1jjm1,l)
174            zh(i,l) = teta(ij+ip1jjm1,l)
175            zqw(i,l) = q(ij+ip1jjm1,l)
176            zql(i,l) = ql(ij+ip1jjm1,l)
177            zqs(i,l) = 0.
178          ENDDO
179        ENDDO
180      ENDDO
181C
182C     Reset variables
183      DO i = 1, imjmp1
184        zqw_col(i)=0.
185        zql_col(i)=0.
186        zqs_col(i)=0.
187        zec_col(i) = 0.
188        zh_dair_col(i) = 0.
189        zh_qw_col(i) = 0.
190        zh_ql_col(i) = 0.
191        zh_qs_col(i) = 0.
192      ENDDO
193C
194      zcpvap=RCPV
195      zcwat=RCW
196      zcice=RCS
197C
198C     Compute vertical sum for each atmospheric column
199C     ================================================
200! ADAPTATION GCM POUR CP(T)
201      call tpot2t(imjmp1*llm,zh,zt,zpk)
202      DO k = 1, llm
203        DO i = 1, imjmp1
204C         Watter mass
205          zqw_col(i) = zqw_col(i) + zqw(i,k)*zairm(i,k)
206          zql_col(i) = zql_col(i) + zql(i,k)*zairm(i,k)
207          zqs_col(i) = zqs_col(i) + zqs(i,k)*zairm(i,k)
208C         Cinetic Energy
209          zec_col(i) =  zec_col(i)
210     $        +zecin(i,k)*zairm(i,k)
211C         Air enthalpy
212          zh_dair_col(i) = zh_dair_col(i)
213! ADAPTATION GCM POUR CP(T)
214     $        + cpdet(zt(i,k))*(1.-zqw(i,k)-zql(i,k)-zqs(i,k))
215     $                       *zairm(i,k)*zt(i,k)
216          zh_qw_col(i) = zh_qw_col(i)
217     $        + zcpvap*zqw(i,k)*zairm(i,k)*zt(i,k)
218          zh_ql_col(i) = zh_ql_col(i)
219     $        + zcwat*zql(i,k)*zairm(i,k)*zt(i,k)
220     $        - RLVTT*zql(i,k)*zairm(i,k)
221          zh_qs_col(i) = zh_qs_col(i)
222     $        + zcice*zqs(i,k)*zairm(i,k)*zt(i,k)
223     $        - RLSTT*zqs(i,k)*zairm(i,k)
224
225        END DO
226      ENDDO
227C
228C     Mean over the planete surface
229C     =============================
230      qw_tot = 0.
231      ql_tot = 0.
232      qs_tot = 0.
233      ec_tot = 0.
234      h_vcol_tot = 0.
235      h_dair_tot = 0.
236      h_qw_tot = 0.
237      h_ql_tot = 0.
238      h_qs_tot = 0.
239      airetot=0.
240C
241      do i=1,imjmp1
242        qw_tot = qw_tot + zqw_col(i)
243        ql_tot = ql_tot + zql_col(i)
244        qs_tot = qs_tot + zqs_col(i)
245        ec_tot = ec_tot + zec_col(i)
246        h_dair_tot = h_dair_tot + zh_dair_col(i)
247        h_qw_tot = h_qw_tot + zh_qw_col(i)
248        h_ql_tot = h_ql_tot + zh_ql_col(i)
249        h_qs_tot = h_qs_tot + zh_qs_col(i)
250        airetot=airetot+zaire(i)
251      END DO
252C
253      qw_tot = qw_tot/airetot
254      ql_tot = ql_tot/airetot
255      qs_tot = qs_tot/airetot
256      ec_tot = ec_tot/airetot
257      h_dair_tot = h_dair_tot/airetot
258      h_qw_tot = h_qw_tot/airetot
259      h_ql_tot = h_ql_tot/airetot
260      h_qs_tot = h_qs_tot/airetot
261C
262      h_vcol_tot = h_dair_tot+h_qw_tot+h_ql_tot+h_qs_tot
263C
264C     Compute the change of the atmospheric state compare to the one
265C     stored in "idiag2", and convert it in flux. THis computation
266C     is performed IF idiag2 /= 0 and IF it is not the first CALL
267c     for "idiag"
268C     ===================================
269C
270      IF ( (idiag2.gt.0) .and. (pas(idiag2) .ne. 0) ) THEN
271        d_h_vcol  = (h_vcol_tot - h_vcol_pre(idiag2) )/dtime
272        d_h_dair = (h_dair_tot- h_dair_pre(idiag2))/dtime
273        d_h_qw   = (h_qw_tot  - h_qw_pre(idiag2)  )/dtime
274        d_h_ql   = (h_ql_tot  - h_ql_pre(idiag2)  )/dtime
275        d_h_qs   = (h_qs_tot  - h_qs_pre(idiag2)  )/dtime
276        d_qw     = (qw_tot    - qw_pre(idiag2)    )/dtime
277        d_ql     = (ql_tot    - ql_pre(idiag2)    )/dtime
278        d_qs     = (qs_tot    - qs_pre(idiag2)    )/dtime
279        d_ec     = (ec_tot    - ec_pre(idiag2)    )/dtime
280        d_qt = d_qw + d_ql + d_qs
281      ELSE
282        d_h_vcol = 0.
283        d_h_dair = 0.
284        d_h_qw   = 0.
285        d_h_ql   = 0.
286        d_h_qs   = 0.
287        d_qw     = 0.
288        d_ql     = 0.
289        d_qs     = 0.
290        d_ec     = 0.
291        d_qt     = 0.
292      ENDIF
293C
294      IF (iprt.ge.2) THEN
295        WRITE(6,9000) tit,pas(idiag),d_qt,d_qw,d_ql,d_qs
296 9000   format('Dyn3d. Watter Mass Budget (kg/m2/s)',A15
297     $      ,1i6,10(1pE14.6))
298        WRITE(6,9001) tit,pas(idiag), d_h_vcol
299 9001   format('Dyn3d. Enthalpy Budget (W/m2) ',A15,1i6,10(F8.2))
300        WRITE(6,9002) tit,pas(idiag), d_ec
301 9002   format('Dyn3d. Cinetic Energy Budget (W/m2) ',A15,1i6,10(F8.2))
302C        WRITE(6,9003) tit,pas(idiag), ec_tot
303 9003   format('Dyn3d. Cinetic Energy (W/m2) ',A15,1i6,10(E15.6))
304        WRITE(6,9004) tit,pas(idiag), d_h_vcol+d_ec
305 9004   format('Dyn3d. Total Energy Budget (W/m2) ',A15,1i6,10(F8.2))
306      END IF
307C
308C     Store the new atmospheric state in "idiag"
309C
310      pas(idiag)=pas(idiag)+1
311      h_vcol_pre(idiag)  = h_vcol_tot
312      h_dair_pre(idiag) = h_dair_tot
313      h_qw_pre(idiag)   = h_qw_tot
314      h_ql_pre(idiag)   = h_ql_tot
315      h_qs_pre(idiag)   = h_qs_tot
316      qw_pre(idiag)     = qw_tot
317      ql_pre(idiag)     = ql_tot
318      qs_pre(idiag)     = qs_tot
319      ec_pre (idiag)    = ec_tot
320C
321#else
322      write(lunout,*)'diagedyn: Needs Earth physics to function'
323#endif
324! #endif of #ifdef CPP_EARTH
325      RETURN
326      END
Note: See TracBrowser for help on using the repository browser.