source: LMDZ6/trunk/libf/phylmd/lmdz_thermcell_dv2.f90 @ 5440

Last change on this file since 5440 was 5390, checked in by yann meurdesoif, 2 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
RevLine 
[4590]1MODULE lmdz_thermcell_dv2
2CONTAINS
3
[878]4      subroutine thermcell_dv2(ngrid,nlay,ptimestep,fm,entr,masse  &
5     &    ,fraca,larga  &
6     &    ,u,v,du,dv,ua,va,lev_out)
[2311]7      USE print_control_mod, ONLY: prt_level,lunout
[878]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!
[1403]16! Vectorisation, FH : 2010/03/08
17!
[878]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)
[1403]38      real gamma0(ngrid,nlay+1),gamma(ngrid,nlay+1)
[878]39      real ue(ngrid,nlay),ve(ngrid,nlay)
[1403]40      LOGICAL ltherm(ngrid,nlay)
41      real dua(ngrid,nlay),dva(ngrid,nlay)
[878]42      integer iter
43
[1403]44      integer ig,k,nlarga0
[878]45
[1403]46!-------------------------------------------------------------------------
47
[878]48!   calcul du detrainement
[1403]49!---------------------------
[878]50
[1407]51!      print*,'THERMCELL DV2 OPTIMISE 3'
[1403]52
53      nlarga0=0.
54
[878]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
[1146]69      IF(prt_level>9)WRITE(lunout,*)                                    &
70     &      'WARNING on initialise gamma(1:ngrid,1)=0.'
[972]71      gamma(1:ngrid,1)=0.
[878]72      do k=2,nlay
73         do ig=1,ngrid
[1403]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)  &
[878]77     &         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )  &
78     &         *0.5/larga(ig)  &
79     &         *1.
[1403]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
[878]112               zf=0.
[1403]113               zf2=1.
114
[5390]115!  la premiere fois on multiplie le coefficient de freinage
[1403]116!  par le module du vent dans la couche en dessous.
117!  Mais pourquoi donc ???
118               if (ltherm(ig,k)) then
[878]119!   On choisit une relaxation lineaire.
[1403]120!                 gamma(ig,k)=gamma0(ig,k)
[878]121!   On choisit une relaxation quadratique.
[1403]122                  gamma(ig,k)=gamma0(ig,k)*sqrt(dua(ig,k)**2+dva(ig,k)**2)
[878]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))
[1403]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)
[878]134                  ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
135                  ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
[1403]136               endif
[878]137         enddo
[1403]138! Fin des iterations
139!--------------------
140enddo
[878]141
[1403]142      enddo ! k=2,nlay
143
144
145! Calcul du flux vertical de moment dans l'environnement.
146!---------------------------------------------------------
[878]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
[1403]160! calcul des tendances.
161!-----------------------
[878]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
[1403]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
[878]195      return
[5390]196      end subroutine thermcell_dv2
[4590]197END MODULE lmdz_thermcell_dv2
Note: See TracBrowser for help on using the repository browser.