GCC Code Coverage Report


Directory: ./
File: phys/thermcell_dry.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 57 63 90.5%
Branches: 51 54 94.4%

Line Branch Exec Source
1 !
2 ! $Id: thermcell_dry.F90 2311 2015-06-25 07:45:24Z emillour $
3 !
4 1369932 SUBROUTINE thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star, &
5 480 & lalim,lmin,zmax,wmax,lev_out)
6
7 !--------------------------------------------------------------------------
8 !thermcell_dry: calcul de zmax et wmax du thermique sec
9 ! Calcul de la vitesse maximum et de la hauteur maximum pour un panache
10 ! ascendant avec une fonction d'alimentation alim_star et sans changement
11 ! de phase.
12 ! Le calcul pourrait etre sans doute simplifier.
13 ! La temperature potentielle virtuelle dans la panache ascendant est
14 ! la temperature potentielle virtuelle pondérée par alim_star.
15 !--------------------------------------------------------------------------
16
17 USE print_control_mod, ONLY: prt_level
18 IMPLICIT NONE
19 !
20 ! $Header$
21 !
22 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
23 ! veillez � n'utiliser que des ! pour les commentaires
24 ! et � bien positionner les & des lignes de continuation
25 ! (les placer en colonne 6 et en colonne 73)
26 !
27 !
28 ! A1.0 Fundamental constants
29 REAL RPI,RCLUM,RHPLA,RKBOL,RNAVO
30 ! A1.1 Astronomical constants
31 REAL RDAY,REA,REPSM,RSIYEA,RSIDAY,ROMEGA
32 ! A1.1.bis Constantes concernant l'orbite de la Terre:
33 REAL R_ecc, R_peri, R_incl
34 ! A1.2 Geoide
35 REAL RA,RG,R1SA
36 ! A1.3 Radiation
37 ! REAL RSIGMA,RI0
38 REAL RSIGMA
39 ! A1.4 Thermodynamic gas phase
40 REAL RMO3,RMCO2,RMC,RMCH4,RMN2O,RMCFC11,RMCFC12
41 REAL R,RMD,RMV,RD,RV,RCPD,RCPV,RCVD,RCVV
42 REAL RKAPPA,RETV, eps_w
43 ! A1.5,6 Thermodynamic liquid,solid phases
44 REAL RCW,RCS
45 ! A1.7 Thermodynamic transition of phase
46 REAL RLVTT,RLSTT,RLMLT,RTT,RATM
47 ! A1.8 Curve of saturation
48 REAL RESTT,RALPW,RBETW,RGAMW,RALPS,RBETS,RGAMS
49 REAL RALPD,RBETD,RGAMD
50 !
51 COMMON/YOMCST/RPI ,RCLUM ,RHPLA ,RKBOL ,RNAVO &
52 & ,RDAY ,REA ,REPSM ,RSIYEA,RSIDAY,ROMEGA &
53 & ,R_ecc, R_peri, R_incl &
54 & ,RA ,RG ,R1SA &
55 & ,RSIGMA &
56 & ,R ,RMD ,RMV ,RD ,RV ,RCPD &
57 & ,RMO3 ,RMCO2 ,RMC ,RMCH4 ,RMN2O ,RMCFC11 ,RMCFC12 &
58 & ,RCPV ,RCVD ,RCVV ,RKAPPA,RETV, eps_w &
59 & ,RCW ,RCS &
60 & ,RLVTT ,RLSTT ,RLMLT ,RTT ,RATM &
61 & ,RESTT ,RALPW ,RBETW ,RGAMW ,RALPS ,RBETS ,RGAMS &
62 & ,RALPD ,RBETD ,RGAMD
63 ! ------------------------------------------------------------------
64 !$OMP THREADPRIVATE(/YOMCST/)
65 INTEGER l,ig
66
67 INTEGER ngrid,nlay
68 REAL zlev(ngrid,nlay+1)
69 REAL pphi(ngrid,nlay)
70 REAl ztv(ngrid,nlay)
71 REAL alim_star(ngrid,nlay)
72 INTEGER lalim(ngrid)
73 integer lev_out ! niveau pour les print
74
75 REAL zmax(ngrid)
76 REAL wmax(ngrid)
77
78 !variables locales
79 960 REAL zw2(ngrid,nlay+1)
80 960 REAL f_star(ngrid,nlay+1)
81 960 REAL ztva(ngrid,nlay+1)
82 960 REAL wmaxa(ngrid)
83 960 REAL wa_moy(ngrid,nlay+1)
84 960 REAL linter(ngrid),zlevinter(ngrid)
85 480 INTEGER lmix(ngrid),lmax(ngrid),lmin(ngrid)
86 CHARACTER (LEN=20) :: modname='thermcell_dry'
87 CHARACTER (LEN=80) :: abort_message
88
89 !initialisations
90
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
91
2/2
✓ Branch 0 taken 19084800 times.
✓ Branch 1 taken 477120 times.
19562400 do l=1,nlay+1
92 19084800 zw2(ig,l)=0.
93 19561920 wa_moy(ig,l)=0.
94 enddo
95 enddo
96
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
97
2/2
✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 477120 times.
19085280 do l=1,nlay
98 19084800 ztva(ig,l)=ztv(ig,l)
99 enddo
100 enddo
101
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
102 477120 wmax(ig)=0.
103 477600 wmaxa(ig)=0.
104 enddo
105 !calcul de la vitesse a partir de la CAPE en melangeant thetav
106
107
108 ! Calcul des F^*, integrale verticale de E^*
109
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 f_star(:,1)=0.
110
2/2
✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
19200 do l=1,nlay
111
2/2
✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 18607680 times.
18626880 f_star(:,l+1)=f_star(:,l)+alim_star(:,l)
112 enddo
113
114 ! niveau (reel) auquel zw2 s'annule FH :n'etait pas initialise
115
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 linter(:)=0.
116
117 ! couche la plus haute concernee par le thermique.
118
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 lmax(:)=1
119
120 ! Le niveau linter est une variable continue qui se trouve dans la couche
121 ! lmax
122
123
2/2
✓ Branch 0 taken 17760 times.
✓ Branch 1 taken 480 times.
18240 do l=1,nlay-2
124
2/2
✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
17671680 do ig=1,ngrid
125
4/4
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 17176320 times.
✓ Branch 2 taken 248430 times.
✓ Branch 3 taken 228690 times.
17653440 if (l.eq.lmin(ig).and.lalim(ig).gt.1) then
126
127 !------------------------------------------------------------------------
128 ! Calcul de la vitesse en haut de la premiere couche instable.
129 ! Premiere couche du panache thermique
130 !------------------------------------------------------------------------
131
132 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) &
133 & *(zlev(ig,l+1)-zlev(ig,l)) &
134 248430 & *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l))
135
136 !------------------------------------------------------------------------
137 ! Tant que la vitesse en bas de la couche et la somme du flux de masse
138 ! et de l'entrainement (c'est a dire le flux de masse en haut) sont
139 ! positifs, on calcul
140 ! 1. le flux de masse en haut f_star(ig,l+1)
141 ! 2. la temperature potentielle virtuelle dans la couche ztva(ig,l)
142 ! 3. la vitesse au carr� en haut zw2(ig,l+1)
143 !------------------------------------------------------------------------
144
145
2/2
✓ Branch 0 taken 1121022 times.
✓ Branch 1 taken 16283988 times.
17405010 else if (zw2(ig,l).ge.1e-10) then
146
147 ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+alim_star(ig,l) &
148 1121022 & *ztv(ig,l))/f_star(ig,l+1)
149 zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+ &
150 & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) &
151 1121022 & *(zlev(ig,l+1)-zlev(ig,l))
152 endif
153 ! determination de zmax continu par interpolation lineaire
154 !------------------------------------------------------------------------
155
156
3/4
✓ Branch 0 taken 1121022 times.
✓ Branch 1 taken 16532418 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1121022 times.
17653440 if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then
157 ! stop'On tombe sur le cas particulier de thermcell_dry'
158 ! print*,'On tombe sur le cas particulier de thermcell_dry'
159 zw2(ig,l+1)=0.
160 linter(ig)=l+1
161 lmax(ig)=l
162 endif
163
164
2/2
✓ Branch 0 taken 248430 times.
✓ Branch 1 taken 17405010 times.
17653440 if (zw2(ig,l+1).lt.0.) then
165 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) &
166 248430 & -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l))
167 248430 zw2(ig,l+1)=0.
168 248430 lmax(ig)=l
169 ! endif
170 !CR:zmax continu 06/05/12: calcul de linter quand le thermique est stoppe par le detrainement
171
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17405010 times.
17405010 elseif (f_star(ig,l+1).lt.0.) then
172 linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l)) &
173 & -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l))
174 zw2(ig,l+1)=0.
175 lmax(ig)=l
176 endif
177 !CRfin
178 17653440 wa_moy(ig,l+1)=sqrt(zw2(ig,l+1))
179
180
2/2
✓ Branch 0 taken 1033842 times.
✓ Branch 1 taken 16619598 times.
17671200 if (wa_moy(ig,l+1).gt.wmaxa(ig)) then
181 ! lmix est le niveau de la couche ou w (wa_moy) est maximum
182 1033842 lmix(ig)=l+1
183 1033842 wmaxa(ig)=wa_moy(ig,l+1)
184 endif
185 enddo
186 enddo
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
480 if (prt_level.ge.1) print*,'fin calcul zw2'
188 !
189 ! Determination de zw2 max
190
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
191 477600 wmax(ig)=0.
192 enddo
193
194
2/2
✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
19200 do l=1,nlay
195
2/2
✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
18626880 do ig=1,ngrid
196
2/2
✓ Branch 0 taken 1598142 times.
✓ Branch 1 taken 17009538 times.
18626400 if (l.le.lmax(ig)) then
197 1598142 zw2(ig,l)=sqrt(zw2(ig,l))
198 1598142 wmax(ig)=max(wmax(ig),zw2(ig,l))
199 else
200 17009538 zw2(ig,l)=0.
201 endif
202 enddo
203 enddo
204
205 ! Longueur caracteristique correspondant a la hauteur des thermiques.
206
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
207 477120 zmax(ig)=0.
208 477600 zlevinter(ig)=zlev(ig,1)
209 enddo
210
2/2
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
477600 do ig=1,ngrid
211 ! calcul de zlevinter
212 zlevinter(ig)=zlev(ig,lmax(ig)) + &
213 477120 & (linter(ig)-lmax(ig))*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
214 477600 zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
215 enddo
216
217 480 RETURN
218 END
219