source: LMDZ4/trunk/libf/phylmd/thermcell_dv2.F90 @ 1407

Last change on this file since 1407 was 1407, checked in by Laurent Fairhead, 14 years ago

Some extraneous prints deleted for optimisation purposes


Des prints supprimés pour optimisation

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