GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/lmdz_thermcell_dv2.F90 Lines: 0 70 0.0 %
Date: 2023-06-30 12:56:34 Branches: 0 56 0.0 %

Line Branch Exec Source
1
MODULE lmdz_thermcell_dv2
2
CONTAINS
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
!----------------------
106
do 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 premi�re 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
!--------------------
140
enddo
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
197
END MODULE lmdz_thermcell_dv2