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

Last change on this file since 1300 was 1300, checked in by emillour, 10 years ago

Common dynamics:
Some updates to keep up with LMDZ5 Earth model evolution (up to LMDZ5 rev 1955).
Main change is the introduction of a "dyn3d_common" directory
to store files common to dyn3d and dyn3dpar.
See file "DOC/chantiers/commit_importants.log" for detailed list
of changes. These changes do not change results on test cases.
EM

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      IMPLICIT NONE
56C
57#include "dimensions.h"
58#include "paramet.h"
59#include "comgeom.h"
60#include "iniprint.h"
61
62#ifdef CPP_EARTH
63#include "../phylmd/YOMCST.h"
64#include "../phylmd/YOETHF.h"
65#endif
66C
67      INTEGER imjmp1
68      PARAMETER( imjmp1=iim*jjp1)
69c     Input variables
70      CHARACTER*15 tit
71      INTEGER iprt,idiag, idiag2
72      REAL dtime
73      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
74      REAL ps(ip1jmp1)                       ! pression  au sol
75      REAL p (ip1jmp1,llmp1  )  ! pression aux interfac.des couches
76      REAL pk (ip1jmp1,llm  )  ! = (p/Pref)**kappa
77      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
78      REAL q(ip1jmp1,llm)               ! champs eau vapeur
79      REAL ql(ip1jmp1,llm)               ! champs eau liquide
80
81
82c     Output variables
83      REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
84C
85C     Local variables
86c
87      REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
88     .  , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
89c h_vcol_tot--  total enthalpy of vertical air column
90C            (air with watter vapour, liquid and solid) (J/m2)
91c h_dair_tot-- total enthalpy of dry air (J/m2)
92c h_qw_tot----  total enthalpy of watter vapour (J/m2)
93c h_ql_tot----  total enthalpy of liquid watter (J/m2)
94c h_qs_tot----  total enthalpy of solid watter  (J/m2)
95c qw_tot------  total mass of watter vapour (kg/m2)
96c ql_tot------  total mass of liquid watter (kg/m2)
97c qs_tot------  total mass of solid watter (kg/m2)
98c ec_tot------  total cinetic energy (kg/m2)
99C
100      REAL masse(ip1jmp1,llm)                ! masse d'air
101      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
102      REAL ecin(ip1jmp1,llm)
103
104      REAL zaire(imjmp1)
105      REAL zps(imjmp1)
106      REAL zairm(imjmp1,llm)
107      REAL zecin(imjmp1,llm)
108      REAL zpaprs(imjmp1,llm)
109      REAL zpk(imjmp1,llm)
110      REAL zt(imjmp1,llm)
111      REAL zh(imjmp1,llm)
112      REAL zqw(imjmp1,llm)
113      REAL zql(imjmp1,llm)
114      REAL zqs(imjmp1,llm)
115
116      REAL  zqw_col(imjmp1)
117      REAL  zql_col(imjmp1)
118      REAL  zqs_col(imjmp1)
119      REAL  zec_col(imjmp1)
120      REAL  zh_dair_col(imjmp1)
121      REAL  zh_qw_col(imjmp1), zh_ql_col(imjmp1), zh_qs_col(imjmp1)
122C
123      REAL      d_h_dair, d_h_qw, d_h_ql, d_h_qs
124C
125      REAL airetot, zcpvap, zcwat, zcice
126C
127      INTEGER i, k, jj, ij , l ,ip1jjm1
128C
129      INTEGER ndiag     ! max number of diagnostic in parallel
130      PARAMETER (ndiag=10)
131      integer pas(ndiag)
132      save pas
133      data pas/ndiag*0/
134C     
135      REAL      h_vcol_pre(ndiag), h_dair_pre(ndiag), h_qw_pre(ndiag)
136     $    , h_ql_pre(ndiag), h_qs_pre(ndiag), qw_pre(ndiag)
137     $    , ql_pre(ndiag), qs_pre(ndiag) , ec_pre(ndiag)
138      SAVE      h_vcol_pre, h_dair_pre, h_qw_pre, h_ql_pre
139     $        , h_qs_pre, qw_pre, ql_pre, qs_pre , ec_pre
140
141
142      real,external :: cpdet
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.