source: LMDZ5/trunk/libf/phylmd/tend_to_tke.F90 @ 2930

Last change on this file since 2930 was 2897, checked in by fhourdin, 7 years ago

Introduction d'une possible prise en compte de génération de TKE
par les ondes de relief.
Etienne Vignon et FH

File size: 4.9 KB
Line 
1!***************************************************************************************
2! tend_to_tke.F90
3!*************
4!
5! Subroutine that adds a tendency on the TKE created by the
6! fluxes of momentum retrieved from the wind speed tendencies
7! of the physics.
8!
9! The basic concept is the following:
10! the TKE equation writes  de/dt = -u'w' du/dz -v'w' dv/dz +g/theta dtheta/dz +......
11!
12!
13! We expect contributions to the term u'w' and v'w' that do not come from the Yamada
14! scheme, for instance: gravity waves, drag from high vegetation..... These contributions
15! need to be accounted for.
16! we explicitely calculate the fluxes, integrating the wind speed
17!                        tendency from the top of the atmospher
18!
19!
20!
21! contacts: Frederic Hourdin, Etienne Vignon
22!
23! History:
24!---------
25! - 1st redaction, Etienne, 15/10/2016
26! Ajout des 4 sous surfaces pour la tke
27! on sort l'ajout des tendances du if sur les deux cas, pour ne pas
28! dupliuqer les lignes
29! on enleve le pas de temps qui disprait dans les calculs
30!
31!
32!**************************************************************************************
33
34 SUBROUTINE tend_to_tke(dt,plev,exner,temp,windu,windv,dt_a,du_a,dv_a,tke)
35
36 USE dimphy, ONLY: klon, klev
37 USE indice_sol_mod, ONLY: nbsrf
38#include "YOMCST.h"
39
40! Declarations
41!==============
42
43
44! Inputs
45!-------
46  REAL dt                   ! Time step [s]
47  REAL plev(klon,klev+1)    ! inter-layer pressure [Pa]
48  REAL temp(klon,klev)      ! temperature [K], grid-cell average or for a one subsurface
49  REAL windu(klon,klev)     ! zonal wind [m/s], grid-cell average or for a one subsurface
50  REAL windv(klon,klev)     ! meridonal wind [m/s], grid-cell average or for a one subsurface
51  REAL exner(klon,klev)     ! Fonction d'Exner = T/theta
52  REAL dt_a(klon,klev)      ! Temperature tendency [K], grid-cell average or for a one subsurface
53  REAL du_a(klon,klev)      ! Zonal wind speed tendency [m/s], grid-cell average or for a one subsurface
54  REAL dv_a(klon,klev)      ! Meridional wind speed tendency [m/s], grid-cell average or for a one subsurface
55
56! Inputs/Outputs
57!---------------
58  REAL tke(klon,klev,nbsrf)       ! Turbulent Kinetic energy [m2/s2], grid-cell average or for a subsurface
59
60
61! Local
62!-------
63
64
65  INTEGER ig,k,isrf                 ! indices
66  REAL    masse(klon,klev)          ! mass in the layers [kg/m2]
67  REAL    unsmasse(klon,klev+1)     ! linear mass in the layers [kg/m2]
68  REAL    flux_rhotw(klon,klev+1)   ! flux massique de tempe. pot. rho*u'*theta'
69  REAL    flux_rhouw(klon,klev+1)   ! flux massique de quantit?? de mouvement rho*u'*w' [kg/m/s2]
70  REAL    flux_rhovw(klon,klev+1)   ! flux massique de quantit?? de mouvement rho*v'*w' [kg/m/s2]
71  REAL    tendt(klon,klev)        ! new temperature tke tendency [m2/s2/s]
72  REAL    tendu(klon,klev)        ! new zonal tke tendency [m2/s2/s]
73  REAL    tendv(klon,klev)        ! new meridonal tke tendency [m2/s2/s]
74 
75
76
77
78! First calculations:
79!=====================
80
81      unsmasse(:,:)=0.
82      DO k=1,klev
83         masse(:,k)=(plev(:,k)-plev(:,k+1))/RG
84         unsmasse(:,k)=unsmasse(:,k)+0.5/masse(:,k)
85         unsmasse(:,k+1)=unsmasse(:,k+1)+0.5/masse(:,k)
86      END DO
87
88      tendu(:,:)=0.0
89      tendv(:,:)=0.0
90
91! Method 1: Calculation of fluxes using a downward integration
92!============================================================
93
94
95 
96! Flux calculation
97
98 flux_rhotw(:,klev+1)=0.
99 flux_rhouw(:,klev+1)=0.
100 flux_rhovw(:,klev+1)=0.
101
102   DO k=klev,1,-1
103      flux_rhotw(:,k)=flux_rhotw(:,k+1)+masse(:,k)*dt_a(:,k)/exner(:,k)
104      flux_rhouw(:,k)=flux_rhouw(:,k+1)+masse(:,k)*du_a(:,k)
105      flux_rhovw(:,k)=flux_rhovw(:,k+1)+masse(:,k)*dv_a(:,k)
106   ENDDO
107
108
109! TKE update:
110
111   DO k=2,klev
112      tendt(:,k)=-flux_rhotw(:,k)*(exner(:,k)-exner(:,k-1))*unsmasse(:,k)*RCPD
113      tendu(:,k)=-flux_rhouw(:,k)*(windu(:,k)-windu(:,k-1))*unsmasse(:,k)
114      tendv(:,k)=-flux_rhovw(:,k)*(windv(:,k)-windv(:,k-1))*unsmasse(:,k)
115   ENDDO
116   tendt(:,1)=-flux_rhotw(:,1)*(exner(:,1)-1.)*unsmasse(:,1)*RCPD
117   tendu(:,1)=-1.*flux_rhouw(:,1)*windu(:,1)*unsmasse(:,1)
118   tendv(:,1)=-1.*flux_rhovw(:,1)*windv(:,1)*unsmasse(:,1)
119
120
121 DO isrf=1,nbsrf
122    DO k=1,klev
123       tke(:,k,isrf)= tke(:,k,isrf)+tendu(:,k)+tendv(:,k)+tendt(:,k)
124       tke(:,k,isrf)= max(tke(:,k,isrf),1.e-10)
125    ENDDO
126 ENDDO
127
128! dtke_t(:,:)=tendt(:,:)
129! dtke_u(:,:)=tendu(:,:)
130! dtke_v(:,:)=tendv(:,:)
131
132
133!  IF (klon==1) THEN
134!  CALL iophys_ecrit('u',klev,'u','',windu)
135!  CALL iophys_ecrit('v',klev,'v','',windu)
136!  CALL iophys_ecrit('t',klev,'t','',temp)
137!  CALL iophys_ecrit('tke1',klev,'tke1','',tke(:,1:klev,1))
138!  CALL iophys_ecrit('tke2',klev,'tke2','',tke(:,1:klev,2))
139!  CALL iophys_ecrit('tke3',klev,'tke3','',tke(:,1:klev,3))
140!  CALL iophys_ecrit('tke4',klev,'tke4','',tke(:,1:klev,4))
141!  CALL iophys_ecrit('theta',klev,'theta','',temp/exner)
142!  CALL iophys_ecrit('Duv',klev,'Duv','',tendu(:,1:klev)+tendv(:,1:klev))
143!  CALL iophys_ecrit('Dt',klev,'Dt','',tendt(:,1:klev))
144!  ENDIF
145
146 END SUBROUTINE tend_to_tke
Note: See TracBrowser for help on using the repository browser.