source: LMDZ6/branches/contrails/libf/phylmd/lmdz_thermcell_dv2.f90 @ 5450

Last change on this file since 5450 was 5390, checked in by yann meurdesoif, 3 weeks ago
  • Remove UTF8 character that inihibit fortran parsing with GPU morphosis
  • Add missing END SUBROUTINE instead of simple END, that inhibit correct parsing with regulat expression parser (quick and dirty parsing)

YM

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