source: trunk/LMDZ.GENERIC/libf/phystd/thermcell_dv2.F90 @ 2105

Last change on this file since 2105 was 2060, checked in by aboissinot, 7 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: 5.9 KB
Line 
1!
2!
3!
4      SUBROUTINE thermcell_dv2(ngrid,nlay,ptimestep,fm,entr,masse,      &
5      &                        fraca,larga,                             &
6      &                        u,v,du,dv,ua,va,lev_out)
7     
8      USE print_control_mod, ONLY: prt_level,lunout
9     
10      implicit none
11
12!=======================================================================
13!
14!   Calcul du transport verticale dans la couche limite en presence
15!   de "thermiques" explicitement representes
16!   calcul du dq/dt une fois qu'on connait les ascendances
17!
18! Vectorisation, FH : 2010/03/08
19!
20!=======================================================================
21
22
23      integer ngrid,nlay
24
25      real ptimestep
26      real masse(ngrid,nlay),fm(ngrid,nlay+1)
27      real fraca(ngrid,nlay+1)
28      real larga(ngrid)
29      real entr(ngrid,nlay)
30      real u(ngrid,nlay)
31      real ua(ngrid,nlay)
32      real du(ngrid,nlay)
33      real v(ngrid,nlay)
34      real va(ngrid,nlay)
35      real dv(ngrid,nlay)
36      integer lev_out                           ! niveau pour les print
37
38      real qa(ngrid,nlay),detr(ngrid,nlay),zf,zf2
39      real wvd(ngrid,nlay+1),wud(ngrid,nlay+1)
40      real gamma0(ngrid,nlay+1),gamma(ngrid,nlay+1)
41      real ue(ngrid,nlay),ve(ngrid,nlay)
42      LOGICAL ltherm(ngrid,nlay)
43      real dua(ngrid,nlay),dva(ngrid,nlay)
44      integer iter
45
46      integer ig,k,nlarga0
47
48!-------------------------------------------------------------------------
49!   calcul du detrainement
50!---------------------------
51     
52      nlarga0=0.
53     
54      do k=1,nlay
55         do ig=1,ngrid
56            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
57         enddo
58      enddo
59     
60!   calcul de la valeur dans les ascendances
61      do ig=1,ngrid
62         ua(ig,1)=u(ig,1)
63         va(ig,1)=v(ig,1)
64         ue(ig,1)=u(ig,1)
65         ve(ig,1)=v(ig,1)
66      enddo
67     
68      IF(prt_level>9)WRITE(lunout,*)                                    &
69     &      'WARNING on initialise gamma(1:ngrid,1)=0.'
70      gamma(1:ngrid,1)=0.
71      do k=2,nlay
72         do ig=1,ngrid
73            ltherm(ig,k)=(fm(ig,k+1)+detr(ig,k))*ptimestep > 1.e-5*masse(ig,k)
74            if(ltherm(ig,k).and.larga(ig)>0.) then
75               gamma0(ig,k)=masse(ig,k)  &
76     &         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )  &
77     &         *0.5/larga(ig)  &
78     &         *1.
79            else
80               gamma0(ig,k)=0.
81            endif
82            if (ltherm(ig,k).and.larga(ig)<=0.) nlarga0=nlarga0+1
83         enddo
84      enddo
85
86      gamma(:,:)=0.
87     
88     
89      do k=2,nlay
90         
91         do ig=1,ngrid
92            if (ltherm(ig,k)) then
93               dua(ig,k)=ua(ig,k-1)-u(ig,k-1)
94               dva(ig,k)=va(ig,k-1)-v(ig,k-1)
95            else
96               ua(ig,k)=u(ig,k)
97               va(ig,k)=v(ig,k)
98               ue(ig,k)=u(ig,k)
99               ve(ig,k)=v(ig,k)
100            endif
101         enddo
102         
103! Debut des iterations
104!----------------------
105         do iter=1,5
106            do ig=1,ngrid
107! Pour memoire : calcul prenant en compte la fraction reelle
108!               zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
109!               zf2=1./(1.-zf)
110! Calcul avec fraction infiniement petite
111               zf=0.
112               zf2=1.
113                 
114!  la première fois on multiplie le coefficient de freinage
115!  par le module du vent dans la couche en dessous.
116!  Mais pourquoi donc ???
117               if (ltherm(ig,k)) then
118!   On choisit une relaxation lineaire.
119!                  gamma(ig,k)=gamma0(ig,k)
120!   On choisit une relaxation quadratique.
121                  gamma(ig,k)=gamma0(ig,k)*sqrt(dua(ig,k)**2+dva(ig,k)**2)
122                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)  &
123     &               +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))  &
124     &               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2  &
125     &               +gamma(ig,k))
126                  va(ig,k)=(fm(ig,k)*va(ig,k-1)  &
127     &               +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))  &
128     &               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2  &
129     &               +gamma(ig,k))
130!                  print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua(ig,k),dva(ig,k)
131                  dua(ig,k)=ua(ig,k)-u(ig,k)
132                  dva(ig,k)=va(ig,k)-v(ig,k)
133                  ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
134                  ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
135               endif
136            enddo
137! Fin des iterations
138!--------------------
139         enddo
140      enddo ! k=2,nlay
141     
142! Calcul du flux vertical de moment dans l'environnement.
143!---------------------------------------------------------
144      do k=2,nlay
145         do ig=1,ngrid
146            wud(ig,k)=fm(ig,k)*ue(ig,k)
147            wvd(ig,k)=fm(ig,k)*ve(ig,k)
148         enddo
149      enddo
150     
151      do ig=1,ngrid
152         wud(ig,1)=0.
153         wud(ig,nlay+1)=0.
154         wvd(ig,1)=0.
155         wvd(ig,nlay+1)=0.
156      enddo
157     
158! calcul des tendances.
159!-----------------------
160      do k=1,nlay
161         do ig=1,ngrid
162            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)  &
163     &               -(entr(ig,k)+gamma(ig,k))*ue(ig,k)  &
164     &               -wud(ig,k)+wud(ig,k+1))  &
165     &               /masse(ig,k)
166            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)  &
167     &               -(entr(ig,k)+gamma(ig,k))*ve(ig,k)  &
168     &               -wvd(ig,k)+wvd(ig,k+1))  &
169     &               /masse(ig,k)
170         enddo
171      enddo
172     
173! Sorties eventuelles.
174!----------------------
175     
176      if(prt_level.GE.10) then
177         do k=1,nlay
178            do ig=1,ngrid
179               print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), &
180     &         entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), &
181     &         masse(ig,k)
182            enddo
183         enddo
184      endif
185     
186      if (nlarga0>0) then
187          print*,'WARNING !!!!!! DANS THERMCELL_DV2 '
188          print*,nlarga0,' points pour lesquels laraga=0. dans un thermique'
189          print*,'Il faudrait decortiquer ces points'
190      endif
191     
192     
193return
194end
Note: See TracBrowser for help on using the repository browser.