source: LMDZ5/trunk/libf/phylmd/ener_conserv.F90 @ 1754

Last change on this file since 1754 was 1754, checked in by idelkadi, 11 years ago

New routin added for energy conservation
--Cettg ligne, et les suivantes ci-dessous, seront ignorées--

A phylmd/ener_conserv.F90

File size: 4.5 KB
Line 
1subroutine ener_conserv(klon,klev,pdtphys, &
2 &    puo,pvo,pto,pqo,pun,pvn,ptn,pqn,masse,exner,d_t_ec)
3
4!=============================================================
5! Energy conservation
6! Based on the TKE equation
7! The M2 and N2 terms at the origin of TKE production are
8! concerted into heating in the d_t_ec term
9! Option 1 is the standard
10!        101 is for M2 term only
11!        101 for N2 term only
12!         -1 is a previours treatment for kinetic energy only
13!  FH (hourdin@lmd.jussieu.fr), 2013/04/25
14!=============================================================
15
16!=============================================================
17! Declarations
18!=============================================================
19
20! From module
21USE phys_local_var_mod, ONLY : d_u_vdf,d_v_vdf,d_t_vdf,d_u_ajs,d_v_ajs,d_t_ajs,d_u_con,d_v_con,d_t_con
22USE phys_output_var_mod, ONLY : bils_ec,bils_kinetic,bils_enthalp,bils_latent
23
24IMPLICIT none
25#include "YOMCST.h"
26#include "YOETHF.h"
27#include "clesphys.h"
28
29! Arguments
30INTEGER, INTENT(IN) :: klon,klev
31REAL, INTENT(IN) :: pdtphys
32REAL, DIMENSION(klon,klev),INTENT(IN) :: puo,pvo,pto,pqo
33REAL, DIMENSION(klon,klev),INTENT(IN) :: pun,pvn,ptn,pqn
34REAL, DIMENSION(klon,klev),INTENT(IN) :: masse,exner
35REAL, DIMENSION(klon,klev),INTENT(OUT) :: d_t_ec
36      integer k,i
37
38! Local
39REAL, DIMENSION(klon,klev+1) :: fluxu,fluxv,fluxt
40REAL, DIMENSION(klon,klev+1) :: dddu,dddv,dddt
41REAL, DIMENSION(klon,klev) :: d_u,d_v,d_t,zv,zu
42REAL ZRCPD
43
44character*80 abort_message
45character*20 :: modname
46
47
48modname='ener_conser'
49d_t_ec(:,:)=0.
50
51IF (iflag_ener_conserv==-1) THEN
52!+jld ec_conser
53   DO k = 1, klev
54   DO i = 1, klon
55      ZRCPD = RCPD*(1.0+RVTMP2*pqn(i,k))
56      d_t_ec(i,k)=0.5/ZRCPD &
57 &      *(puo(i,k)**2+pvo(i,k)**2-pun(i,k)**2-pvn(i,k)**2)
58      ENDDO
59      ENDDO
60!-jld ec_conser
61
62
63
64ELSEIF (iflag_ener_conserv>=1) THEN
65
66   IF (iflag_ener_conserv<=2) THEN
67      d_t(:,:)=d_t_vdf(:,:)+d_t_ajs(:,:)   ! d_t_ajs = adjust + thermals
68      d_u(:,:)=d_u_vdf(:,:)+d_u_ajs(:,:)+d_u_con(:,:)
69      d_v(:,:)=d_v_vdf(:,:)+d_v_ajs(:,:)+d_v_con(:,:)
70   ELSEIF (iflag_ener_conserv==101) THEN
71      d_t(:,:)=0.
72      d_u(:,:)=d_u_vdf(:,:)+d_u_ajs(:,:)+d_u_con(:,:)
73      d_v(:,:)=d_v_vdf(:,:)+d_v_ajs(:,:)+d_v_con(:,:)
74   ELSEIF (iflag_ener_conserv==110) THEN
75      d_t(:,:)=d_t_vdf(:,:)+d_t_ajs(:,:)
76      d_u(:,:)=0.
77      d_v(:,:)=0.
78   ELSE
79      abort_message = 'iflag_ener_conserv non prevu'
80      CALL abort_gcm (modname,abort_message,1)
81   ENDIF
82
83!----------------------------------------------------------------------------
84! Two options wether we consider time integration in the energy conservation
85!----------------------------------------------------------------------------
86
87   if (iflag_ener_conserv==2) then
88      zu(:,:)=puo(:,:)
89      zv(:,:)=pvo(:,:)
90   else
91      zu(:,:)=puo(:,:)+0.5*d_u(:,:)
92      zv(:,:)=pvo(:,:)+0.5*d_v(:,:)
93   endif
94
95   fluxu(:,klev+1)=0.
96   fluxv(:,klev+1)=0.
97   fluxt(:,klev+1)=0.
98
99   do k=klev,1,-1
100      fluxu(:,k)=fluxu(:,k+1)+masse(:,k)*d_u(:,k)
101      fluxv(:,k)=fluxv(:,k+1)+masse(:,k)*d_v(:,k)
102      fluxt(:,k)=fluxt(:,k+1)+masse(:,k)*d_t(:,k)/exner(:,k)
103   enddo
104
105   dddu(:,1)=2*zu(:,1)*fluxu(:,1)
106   dddv(:,1)=2*zv(:,1)*fluxv(:,1)
107   dddt(:,1)=(exner(:,1)-1.)*fluxt(:,1)
108
109   do k=2,klev
110      dddu(:,k)=(zu(:,k)-zu(:,k-1))*fluxu(:,k)
111      dddv(:,k)=(zv(:,k)-zv(:,k-1))*fluxv(:,k)
112      dddt(:,k)=(exner(:,k)-exner(:,k-1))*fluxt(:,k)
113   enddo
114   dddu(:,klev+1)=0.
115   dddv(:,klev+1)=0.
116   dddt(:,klev+1)=0.
117
118   do k=1,klev
119      d_t_ec(:,k)=-(dddu(:,k)+dddu(:,k+1)+dddv(:,k)+dddv(:,k+1) &
120   &  +rcpd*(dddt(:,k)+dddt(:,k+1)))/(2.*rcpd*masse(:,k))
121   enddo
122! d_t_ec=0.
123
124ENDIF
125
126!================================================================
127!  Computation of integrated enthalpie and kinetic energy variation
128!  FH (hourdin@lmd.jussieu.fr), 2013/04/25
129!================================================================
130
131      bils_ec(:)=0.
132      bils_kinetic(:)=0.
133      bils_enthalp(:)=0.
134      bils_latent(:)=0.
135      DO k=1,klev
136        bils_ec(:)=bils_ec(:)-d_t_ec(:,k)*masse(:,k)
137        bils_kinetic(:)=bils_kinetic(:)+masse(:,k)* &
138     &           (pun(:,k)*pun(:,k)+pvn(:,k)*pvn(:,k) &
139     &            -puo(:,k)*puo(:,k)-pvo(:,k)*pvo(:,k))
140        bils_enthalp(:)= &
141     &  bils_enthalp(:)+masse(:,k)*(ptn(:,k)-pto(:,k)+d_t_ec(:,k))
142        bils_latent(:)=bils_latent(:)+masse(:,k)* &
143     &             (pqn(:,k)-pqo(:,k))
144      ENDDO
145      bils_ec(:)=rcpd*bils_ec(:)/pdtphys
146      bils_kinetic(:)= 0.5*bils_kinetic(:)/pdtphys
147      bils_enthalp(:)=rcpd*bils_enthalp(:)/pdtphys
148      bils_latent(:)=rlvtt*bils_latent(:)/pdtphys
149
150
151RETURN
152
153END
Note: See TracBrowser for help on using the repository browser.