source: LMDZ5/trunk/libf/phylmd/thermcell_alim.F90 @ 2388

Last change on this file since 2388 was 2388, checked in by fhourdin, 9 years ago

Ajout de la routine thermcell_alim calculant l'alimentation laterale.

File size: 4.0 KB
Line 
1!
2! $Id: thermcell_plume.F90 2311 2015-06-25 07:45:24Z emillour $
3!
4      SUBROUTINE thermcell_alim(flag,ngrid,klev,ztv,d_temp,zlev,alim_star,lalim)
5IMPLICIT NONE
6
7!--------------------------------------------------------------------------
8! FH : 2015/11/06
9! thermcell_alim: calcule la distribution verticale de l'alimentation
10! laterale a la base des panaches thermiques
11!--------------------------------------------------------------------------
12
13#include "YOMCST.h"
14#include "YOETHF.h"
15#include "FCTTRE.h"
16#include "thermcell.h"
17
18!      fort(10) ptimestep,ztv,zthl,po,zl,rhobarz,zlev,pplev,pphi,zpspsk,f0
19      INTEGER, INTENT(IN) :: ngrid,klev
20      REAL, INTENT(IN) :: ztv(ngrid,klev)
21      REAL, INTENT(IN) :: d_temp(ngrid)
22      REAL, INTENT(IN) :: zlev(ngrid,klev+1)
23      REAL, INTENT(OUT) :: alim_star(ngrid,klev)
24      INTEGER, INTENT(OUT) :: lalim(ngrid)
25      INTEGER, INTENT(IN) :: flag
26
27      REAL :: alim_star_tot(ngrid),zi(ngrid),zh(ngrid)
28      REAL :: zlay(ngrid,klev)
29      REAL ztv_parcel
30
31      INTEGER ig,l
32
33      REAL h,z,falim
34      falim(h,z)=z*z*(h/2.-z/3.)
35
36!===================================================================
37
38
39   DO ig=1,ngrid
40      lalim(ig)=1
41   ENDDO
42
43!-------------------------------------------------------------------------
44! Definition de l'alimentation a l'origine dans thermcell_init
45!-------------------------------------------------------------------------
46   IF (flag==0) THEN ! CMIP5 version
47      do l=1,klev-1
48         do ig=1,ngrid
49            if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then
50               alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.)  &
51     &                       *sqrt(zlev(ig,l+1))
52               lalim(ig)=l+1
53               alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l)
54            endif
55         enddo
56      enddo
57      do l=1,klev
58         do ig=1,ngrid
59            if (alim_star_tot(ig) > 1.e-10 ) then
60               alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig)
61            endif
62         enddo
63      enddo
64      alim_star_tot(:)=1.
65
66!-------------------------------------------------------------------------
67! Nouvelle definition avec possibilite d'introduire un DT en surface
68! On suppose que la forme du profile d'alimentation scale avec la hauteur
69! d'inversion calculée avec une particule partant de la premieere couche
70
71! Fonction  f(z) = z ( h - z ) , avec h = zi/3
72! On utilise l'integralle
73! Int_0^z f(z') dz' = z^2 ( h/2 - z/3 ) = falim(h,z)
74! Pour calculer l'alimentation des couches
75!-------------------------------------------------------------------------
76   ELSE
77! Computing inversion height zi and zh=zi/3.
78      zi(:)=0.
79! Il faut recalculer zlay qui n'est pas dispo dans thermcell_plume
80! A changer eventuellement.
81      do l=1,klev
82         zlay(:,l)=0.5*(zlev(:,l)+zlev(:,l+1))
83      enddo
84
85      do l=1,klev-1
86         do ig=1,ngrid
87            ztv_parcel=ztv(ig,1)+d_temp(ig)
88            if (ztv_parcel<ztv(ig,l+1) .and. lalim(ig)==1 ) THEN
89                lalim(ig)=l
90                zi(ig)=zlay(ig,l)+(zlay(ig,l+1)-zlay(ig,l))/(ztv(ig,l+1)-ztv(ig,l))*(ztv_parcel-ztv(ig,l))
91                print*,'NEW ALIM CALCUL DE ZI ',zlay(ig,l),zi(ig),zlay(ig,l+1)
92                IF (zi(ig)<0.) STOP
93            endif
94         enddo
95      enddo
96      zh(:)=zi(:)/5.
97
98! Coputing lateral entrainment
99      alim_star_tot(:)=0.
100      alim_star(:,:)=0.
101      lalim(:)=0
102      do l=1,klev-1
103         do ig=1,ngrid
104            if (zlev(ig,l+1)<=zh(ig)) THEN
105               alim_star(ig,l)=(falim(zh(ig),zlev(ig,l+1))-falim(zh(ig),zlev(ig,l)))/falim(zh(ig),zh(ig))
106               lalim(ig)=l
107            ELSE IF (zlev(ig,l)<=zh(ig)) THEN
108               alim_star(ig,l)=(falim(zh(ig),zh(ig))-falim(zh(ig),zlev(ig,l)))/falim(zh(ig),zh(ig))
109               lalim(ig)=l
110            ELSE
111               alim_star(ig,l)=0.
112            ENDIF
113         ENDDO
114         alim_star_tot(:)=alim_star_tot(:)+alim_star(:,l)
115      ENDDO
116      print*,'NEW ALIM CALCUL DE ZI ',alim_star_tot
117      alim_star_tot(:)=1.
118
119   ENDIF
120
121
122RETURN
123END
Note: See TracBrowser for help on using the repository browser.