GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/lmdz_thermcell_dry.F90 Lines: 57 63 90.5 %
Date: 2023-06-30 12:56:34 Branches: 51 54 94.4 %

Line Branch Exec Source
1
MODULE lmdz_thermcell_dry
2
!
3
! $Id: lmdz_thermcell_dry.F90 4590 2023-06-29 01:03:15Z fhourdin $
4
!
5
CONTAINS
6
7
288
       SUBROUTINE thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star,  &
8
288
     &                            lalim,lmin,zmax,wmax)
9
10
!--------------------------------------------------------------------------
11
!thermcell_dry: calcul de zmax et wmax du thermique sec
12
! Calcul de la vitesse maximum et de la hauteur maximum pour un panache
13
! ascendant avec une fonction d'alimentation alim_star et sans changement
14
! de phase.
15
! Le calcul pourrait etre sans doute simplifier.
16
! La temperature potentielle virtuelle dans la panache ascendant est
17
! la temperature potentielle virtuelle pondérée par alim_star.
18
!--------------------------------------------------------------------------
19
       USE lmdz_thermcell_ini, ONLY: prt_level, RG
20
       IMPLICIT NONE
21
22
       integer, intent(in) :: ngrid,nlay
23
       real, intent(in), dimension(ngrid,nlay+1) :: zlev,pphi,ztv,alim_star
24
       integer, intent(in), dimension(ngrid) :: lalim
25
       real, intent(out), dimension(ngrid) :: zmax,wmax
26
27
!variables locales
28
576
       REAL zw2(ngrid,nlay+1)
29
576
       REAL f_star(ngrid,nlay+1)
30
576
       REAL ztva(ngrid,nlay+1)
31
576
       REAL wmaxa(ngrid)
32
576
       REAL wa_moy(ngrid,nlay+1)
33
576
       REAL linter(ngrid),zlevinter(ngrid)
34
288
       INTEGER lmix(ngrid),lmax(ngrid),lmin(ngrid)
35
      CHARACTER (LEN=20) :: modname='thermcell_dry'
36
      CHARACTER (LEN=80) :: abort_message
37
       INTEGER l,ig
38
39
!initialisations
40
286560
       do ig=1,ngrid
41
11737440
          do l=1,nlay+1
42
11450880
             zw2(ig,l)=0.
43
11737152
             wa_moy(ig,l)=0.
44
          enddo
45
       enddo
46
286560
       do ig=1,ngrid
47
11451168
          do l=1,nlay
48
11450880
             ztva(ig,l)=ztv(ig,l)
49
          enddo
50
       enddo
51
286560
       do ig=1,ngrid
52
286272
          wmax(ig)=0.
53
286560
          wmaxa(ig)=0.
54
       enddo
55
!calcul de la vitesse a partir de la CAPE en melangeant thetav
56
57
58
! Calcul des F^*, integrale verticale de E^*
59
286560
       f_star(:,1)=0.
60
11520
       do l=1,nlay
61
11176128
          f_star(:,l+1)=f_star(:,l)+alim_star(:,l)
62
       enddo
63
64
! niveau (reel) auquel zw2 s'annule FH :n'etait pas initialise
65
286560
       linter(:)=0.
66
67
! couche la plus haute concernee par le thermique.
68
286560
       lmax(:)=1
69
70
! Le niveau linter est une variable continue qui se trouve dans la couche
71
! lmax
72
73
10944
       do l=1,nlay-2
74
10603008
         do ig=1,ngrid
75

10592064
            if (l.eq.lmin(ig).and.lalim(ig).gt.1) then
76
77
!------------------------------------------------------------------------
78
!  Calcul de la vitesse en haut de la premiere couche instable.
79
!  Premiere couche du panache thermique
80
!------------------------------------------------------------------------
81
82
               zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1)  &
83
     &                     *(zlev(ig,l+1)-zlev(ig,l))  &
84
137471
     &                     *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
85
86
!------------------------------------------------------------------------
87
! Tant que la vitesse en bas de la couche et la somme du flux de masse
88
! et de l'entrainement (c'est a dire le flux de masse en haut) sont
89
! positifs, on calcul
90
! 1. le flux de masse en haut  f_star(ig,l+1)
91
! 2. la temperature potentielle virtuelle dans la couche ztva(ig,l)
92
! 3. la vitesse au carr� en haut zw2(ig,l+1)
93
!------------------------------------------------------------------------
94
95
10454593
            else if (zw2(ig,l).ge.1e-10) then
96
97
               ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+alim_star(ig,l)  &
98
647446
     &                    *ztv(ig,l))/f_star(ig,l+1)
99
               zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+  &
100
     &                     2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)  &
101
647446
     &                     *(zlev(ig,l+1)-zlev(ig,l))
102
            endif
103
! determination de zmax continu par interpolation lineaire
104
!------------------------------------------------------------------------
105
106

10592064
            if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then
107
!               stop'On tombe sur le cas particulier de thermcell_dry'
108
!               print*,'On tombe sur le cas particulier de thermcell_dry'
109
                zw2(ig,l+1)=0.
110
                linter(ig)=l+1
111
                lmax(ig)=l
112
            endif
113
114
10592064
            if (zw2(ig,l+1).lt.0.) then
115
               linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l))  &
116
137471
     &           -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
117
137471
               zw2(ig,l+1)=0.
118
137471
               lmax(ig)=l
119
!            endif
120
!CR:zmax continu 06/05/12: calcul de linter quand le thermique est stoppe par le detrainement
121
10454593
            elseif (f_star(ig,l+1).lt.0.) then
122
               linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l))  &
123
     &           -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l))
124
               zw2(ig,l+1)=0.
125
               lmax(ig)=l
126
            endif
127
!CRfin
128
10592064
               wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
129
130
10602720
            if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
131
!   lmix est le niveau de la couche ou w (wa_moy) est maximum
132
596562
               lmix(ig)=l+1
133
596562
               wmaxa(ig)=wa_moy(ig,l+1)
134
            endif
135
         enddo
136
      enddo
137
288
       if (prt_level.ge.1) print*,'fin calcul zw2'
138
!
139
! Determination de zw2 max
140
286560
      do ig=1,ngrid
141
286560
         wmax(ig)=0.
142
      enddo
143
144
11520
      do l=1,nlay
145
11176128
         do ig=1,ngrid
146
11175840
            if (l.le.lmax(ig)) then
147
933718
                zw2(ig,l)=sqrt(zw2(ig,l))
148
933718
                wmax(ig)=max(wmax(ig),zw2(ig,l))
149
            else
150
10230890
                 zw2(ig,l)=0.
151
            endif
152
          enddo
153
      enddo
154
155
!   Longueur caracteristique correspondant a la hauteur des thermiques.
156
286560
      do  ig=1,ngrid
157
286272
         zmax(ig)=0.
158
286560
         zlevinter(ig)=zlev(ig,1)
159
      enddo
160
286560
      do  ig=1,ngrid
161
! calcul de zlevinter
162
          zlevinter(ig)=zlev(ig,lmax(ig)) + &
163
286272
     &    (linter(ig)-lmax(ig))*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
164
286560
           zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
165
      enddo
166
167
288
 RETURN
168
      END
169
END MODULE lmdz_thermcell_dry