source: trunk/LMDZ.GENERIC/libf/phystd/thermcell_dry.F90 @ 2113

Last change on this file since 2113 was 2060, checked in by aboissinot, 6 years ago

Add the thermal plume model (cf. Rio et al. 2010) extended to gas giant.
Specific parameters are set in thermcell_mod.

File size: 7.6 KB
Line 
1!
2!
3!
4      SUBROUTINE thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star,            &
5      &                        lalim,lmin,zmax,wmax,lev_out)
6     
7     
8      USE print_control_mod, ONLY: prt_level
9      USE thermcell_mod
10     
11      IMPLICIT NONE
12     
13!==============================================================================
14! thermcell_dry: calcul de zmax et wmax du thermique sec
15! Calcul de la vitesse maximum et de la hauteur maximum pour un panache
16! ascendant avec une fonction d'alimentation alim_star et sans changement
17! de phase.
18! Le calcul pourrait etre sans doute simplifie.
19! La temperature potentielle virtuelle dans la panache ascendant est
20! la temperature potentielle virtuelle ponderee par alim_star.
21!==============================================================================
22     
23!==============================================================================
24! Declaration
25!==============================================================================
26     
27      INTEGER l,ig
28      INTEGER lalim(ngrid)
29      INTEGER lev_out                           ! niveau pour les print
30      INTEGER ngrid,nlay
31     
32      REAL zlev(ngrid,nlay+1)
33      REAL pphi(ngrid,nlay)
34      REAl ztv(ngrid,nlay)
35      REAL alim_star(ngrid,nlay)
36     
37      REAL zmax(ngrid)
38      REAL wmax(ngrid)
39     
40!      local:
41!      ------
42     
43      REAL zw2(ngrid,nlay+1)
44      REAL f_star(ngrid,nlay+1)
45      REAL ztva(ngrid,nlay+1)
46      REAL wmaxa(ngrid)
47      REAL wa_moy(ngrid,nlay+1)
48      REAL linter(ngrid)                        ! level such as zw2(zlev=0)
49      REAL zlevinter(ngrid)                     ! zlev such as zw2(zlev=0)
50     
51      INTEGER lmix(ngrid)                       ! level where zw2 is max
52      INTEGER lmax(ngrid)                       ! plume highest level
53      INTEGER lmin(ngrid)                       ! plume starting level
54     
55      CHARACTER (LEN=20) :: modname='thermcell_dry'
56      CHARACTER (LEN=80) :: abort_message
57     
58!==============================================================================
59! Initialization
60!==============================================================================
61     
62      DO ig=1,ngrid
63         DO l=1,nlay+1
64            zw2(ig,l)=0.
65            wa_moy(ig,l)=0.
66         ENDDO
67      ENDDO
68     
69      DO ig=1,ngrid
70         DO l=1,nlay
71            ztva(ig,l)=ztv(ig,l)
72         ENDDO
73      ENDDO
74     
75      DO ig=1,ngrid
76         wmax(ig)=0.
77         wmaxa(ig)=0.
78      ENDDO
79     
80!------------------------------------------------------------------------------
81! Calcul de la vitesse a partir de la CAPE en melangeant thetav
82!------------------------------------------------------------------------------
83     
84      f_star(:,1)=0.
85     
86      DO l=1,nlay
87         f_star(:,l+1)=f_star(:,l)+alim_star(:,l)
88      ENDDO
89     
90      linter(:) = 0.
91     
92      lmax(:) = 1
93     
94!==============================================================================
95! Calcul de la vitesse verticale au carre
96!==============================================================================
97     
98      DO l=1,nlay-2
99         DO ig=1,ngrid
100            IF (l.eq.lmin(ig).and.lalim(ig).gt.lmin(ig)) THEN
101               zw2(ig,l+1) = 2. * RG * (zlev(ig,l+1) - zlev(ig,l))            &
102               &                * (ztv(ig,l) - ztv(ig,l+1)) / ztv(ig,l+1)
103!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104! Tant que la vitesse en bas de la couche et la somme du flux de masse
105! et de l'entrainement (c'est a dire le flux de masse en haut) sont
106! positifs, on calcul
107! 1. le flux de masse en haut  f_star(ig,l+1)
108! 2. la temperature potentielle virtuelle dans la couche ztva(ig,l)
109! 3. la vitesse au carré en haut zw2(ig,l+1)
110!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111            ELSEIF (zw2(ig,l).ge.1e-10) THEN
112               ztva(ig,l) = (f_star(ig,l)*ztva(ig,l-1)+alim_star(ig,l)        &
113               &            *ztv(ig,l))/f_star(ig,l+1)
114               zw2(ig,l+1) = zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+      &
115               &             2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)           &
116               &             *(zlev(ig,l+1)-zlev(ig,l))
117            ENDIF
118           
119!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120! determination de zmax continu par interpolation lineaire
121! Le niveau linter est une variable continue qui se trouve dans la couche lmax
122!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
123           
124            IF (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then
125!               stop'On tombe sur le cas particulier de thermcell_dry'
126!               print *, 'On tombe sur le cas particulier de thermcell_dry'
127               zw2(ig,l+1) = 0.
128               linter(ig) = l+1
129               lmax(ig) = l
130            ENDIF
131           
132            IF (zw2(ig,l+1).lt.0.) THEN
133               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))                          &
134               &           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
135               zw2(ig,l+1)=0.
136               lmax(ig)=l
137!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
138!CR:zmax continu 06/05/12: calcul de linter quand le thermique est stoppe par le detrainement
139!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
140            ELSEIF (f_star(ig,l+1).lt.0.) THEN
141               linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l))                    &
142               &           -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l))
143               zw2(ig,l+1)=0.
144               lmax(ig)=l
145            ENDIF
146           
147            wa_moy(ig,l+1) = sqrt(zw2(ig,l+1))
148           
149            IF (wa_moy(ig,l+1).gt.wmaxa(ig)) THEN
150!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
151! lmix est le niveau de la couche ou w (wa_moy) est maximum
152!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
153               lmix(ig) = l + 1
154               wmaxa(ig) = wa_moy(ig,l+1)
155            ENDIF
156         ENDDO
157      ENDDO
158     
159      IF (prt_level.ge.1) print*,'fin calcul zw2'
160     
161!==============================================================================
162! Determination de zw2 max
163!==============================================================================
164     
165      DO ig=1,ngrid
166         wmax(ig)=0.
167      ENDDO
168     
169      DO l=1,nlay
170         DO ig=1,ngrid
171            IF (l.le.lmax(ig) .and. l.gt.lmin(ig)) THEN
172               zw2(ig,l) = sqrt(zw2(ig,l))
173!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
174! AB : WARNING zw2 becomes its square root !
175!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
176               wmax(ig)=max(wmax(ig),zw2(ig,l))
177            ELSE
178               zw2(ig,l)=0.
179            ENDIF
180         ENDDO
181      ENDDO
182     
183!==============================================================================
184! Calcul de la longueur caracteristique correspondant a la hauteur des thermiques.
185!==============================================================================
186     
187      DO  ig=1,ngrid
188         zmax(ig) = 0.
189         zlevinter(ig) = zlev(ig,1)
190      ENDDO
191     
192!------------------------------------------------------------------------------
193! Calcul de zlevinter
194!------------------------------------------------------------------------------
195     
196      DO ig=1,ngrid
197         zlevinter(ig)=zlev(ig,lmax(ig)) +                                    &
198         &    (linter(ig)-lmax(ig))*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
199         zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
200      ENDDO
201     
202     
203RETURN
204END
Note: See TracBrowser for help on using the repository browser.