Directory: | ./ |
---|---|
File: | phys/thermcell_height.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 45 | 51 | 88.2% |
Branches: | 43 | 46 | 93.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | 480 | SUBROUTINE thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix, & | |
2 | 480 | & zw2,zlev,lmax,zmax,zmax0,zmix,wmax,lev_out) | |
3 | |||
4 | !----------------------------------------------------------------------------- | ||
5 | !thermcell_height: calcul des caracteristiques du thermique: zmax,wmax,zmix | ||
6 | !----------------------------------------------------------------------------- | ||
7 | IMPLICIT NONE | ||
8 | integer :: iflag_thermals,nsplit_thermals | ||
9 | |||
10 | !!! nrlmd le 10/04/2012 | ||
11 | integer :: iflag_trig_bl,iflag_clos_bl | ||
12 | integer :: tau_trig_shallow,tau_trig_deep | ||
13 | real :: s_trig | ||
14 | !!! fin nrlmd le 10/04/2012 | ||
15 | |||
16 | real,parameter :: r_aspect_thermals=2.,l_mix_thermals=30. | ||
17 | real :: alp_bl_k | ||
18 | real :: tau_thermals,fact_thermals_ed_dz | ||
19 | integer,parameter :: w2di_thermals=0 | ||
20 | integer :: isplit | ||
21 | |||
22 | integer :: iflag_coupl,iflag_clos,iflag_wake | ||
23 | integer :: iflag_thermals_ed,iflag_thermals_optflux,iflag_thermals_closure | ||
24 | |||
25 | common/ctherm1/iflag_thermals,nsplit_thermals,iflag_thermals_closure | ||
26 | common/ctherm2/tau_thermals,alp_bl_k,fact_thermals_ed_dz | ||
27 | common/ctherm4/iflag_coupl,iflag_clos,iflag_wake | ||
28 | common/ctherm5/iflag_thermals_ed,iflag_thermals_optflux | ||
29 | |||
30 | !!! nrlmd le 10/04/2012 | ||
31 | common/ctherm6/iflag_trig_bl,iflag_clos_bl | ||
32 | common/ctherm7/tau_trig_shallow,tau_trig_deep | ||
33 | common/ctherm8/s_trig | ||
34 | !!! fin nrlmd le 10/04/2012 | ||
35 | |||
36 | !$OMP THREADPRIVATE(/ctherm1/,/ctherm2/,/ctherm4/,/ctherm5/) | ||
37 | !$OMP THREADPRIVATE(/ctherm6/,/ctherm7/,/ctherm8/) | ||
38 | |||
39 | INTEGER ig,l | ||
40 | INTEGER ngrid,nlay | ||
41 | INTEGER lalim(ngrid),lmin(ngrid) | ||
42 | INTEGER lmix(ngrid) | ||
43 | REAL linter(ngrid) | ||
44 | integer lev_out ! niveau pour les print | ||
45 | |||
46 | REAL zw2(ngrid,nlay+1) | ||
47 | REAL zlev(ngrid,nlay+1) | ||
48 | |||
49 | REAL wmax(ngrid) | ||
50 | INTEGER lmax(ngrid) | ||
51 | REAL zmax(ngrid) | ||
52 | REAL zmax0(ngrid) | ||
53 | REAL zmix(ngrid) | ||
54 | REAL num(ngrid) | ||
55 | 480 | REAL denom(ngrid) | |
56 | |||
57 | 480 | REAL zlevinter(ngrid) | |
58 | |||
59 | !calcul de la hauteur max du thermique | ||
60 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
61 | 477600 | lmax(ig)=lalim(ig) | |
62 | enddo | ||
63 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
64 |
2/2✓ Branch 0 taken 17520899 times.
✓ Branch 1 taken 477120 times.
|
17998499 | do l=nlay,lalim(ig)+1,-1 |
65 |
2/2✓ Branch 0 taken 16824070 times.
✓ Branch 1 taken 696829 times.
|
17998019 | if (zw2(ig,l).le.1.e-10) then |
66 | 16824070 | lmax(ig)=l-1 | |
67 | endif | ||
68 | enddo | ||
69 | enddo | ||
70 | |||
71 | ! On traite le cas particulier qu'il faudrait �viter ou le thermique | ||
72 | ! atteind le haut du modele ... | ||
73 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
74 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 477120 times.
|
477600 | if ( zw2(ig,nlay) > 1.e-10 ) then |
75 | ✗ | print*,'WARNING !!!!! W2 thermiques non nul derniere couche ' | |
76 | ✗ | lmax(ig)=nlay | |
77 | endif | ||
78 | enddo | ||
79 | |||
80 | ! pas de thermique si couche 1 stable | ||
81 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
82 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 477120 times.
|
477600 | if (lmin(ig).gt.1) then |
83 | ✗ | lmax(ig)=1 | |
84 | ✗ | lmin(ig)=1 | |
85 | ✗ | lalim(ig)=1 | |
86 | endif | ||
87 | enddo | ||
88 | ! | ||
89 | ! Determination de zw2 max | ||
90 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
91 | 477600 | wmax(ig)=0. | |
92 | enddo | ||
93 | |||
94 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | do l=1,nlay |
95 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 18720 times.
|
18626880 | do ig=1,ngrid |
96 |
2/2✓ Branch 0 taken 1783610 times.
✓ Branch 1 taken 16824070 times.
|
18626400 | if (l.le.lmax(ig)) then |
97 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1783610 times.
|
1783610 | if (zw2(ig,l).lt.0.)then |
98 | ✗ | print*,'pb2 zw2<0' | |
99 | endif | ||
100 | 1783610 | zw2(ig,l)=sqrt(zw2(ig,l)) | |
101 | 1783610 | wmax(ig)=max(wmax(ig),zw2(ig,l)) | |
102 | else | ||
103 | 16824070 | zw2(ig,l)=0. | |
104 | endif | ||
105 | enddo | ||
106 | enddo | ||
107 | |||
108 | ! Longueur caracteristique correspondant a la hauteur des thermiques. | ||
109 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
110 | 477120 | zmax(ig)=0. | |
111 | 477600 | zlevinter(ig)=zlev(ig,1) | |
112 | enddo | ||
113 | |||
114 | ! if (iflag_thermals_ed.ge.1) then | ||
115 | if (1==0) then | ||
116 | !CR:date de quand le calcul du zmax continu etait buggue | ||
117 | num(:)=0. | ||
118 | denom(:)=0. | ||
119 | do ig=1,ngrid | ||
120 | do l=1,nlay | ||
121 | num(ig)=num(ig)+zw2(ig,l)*zlev(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) | ||
122 | denom(ig)=denom(ig)+zw2(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) | ||
123 | enddo | ||
124 | enddo | ||
125 | do ig=1,ngrid | ||
126 | if (denom(ig).gt.1.e-10) then | ||
127 | zmax(ig)=2.*num(ig)/denom(ig) | ||
128 | zmax0(ig)=zmax(ig) | ||
129 | endif | ||
130 | enddo | ||
131 | |||
132 | else | ||
133 | !CR:Calcul de zmax continu via le linter | ||
134 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
135 | ! calcul de zlevinter | ||
136 | zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* & | ||
137 | & linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) & | ||
138 | 477120 | & -zlev(ig,lmax(ig))) | |
139 | !pour le cas ou on prend tjs lmin=1 | ||
140 | ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) | ||
141 | 477120 | zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,1)) | |
142 | 477600 | zmax0(ig)=zmax(ig) | |
143 | enddo | ||
144 | |||
145 | |||
146 | endif | ||
147 | !endif iflag_thermals_ed | ||
148 | ! | ||
149 | ! def de zmix continu (profil parabolique des vitesses) | ||
150 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
151 |
2/2✓ Branch 0 taken 240493 times.
✓ Branch 1 taken 236627 times.
|
477120 | if (lmix(ig).gt.1) then |
152 | ! test | ||
153 |
2/2✓ Branch 0 taken 240491 times.
✓ Branch 1 taken 2 times.
|
240493 | if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) & |
154 | & *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) & | ||
155 | & -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) & | ||
156 | & *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10) & | ||
157 | & then | ||
158 | ! | ||
159 | zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) & | ||
160 | & *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2) & | ||
161 | & -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) & | ||
162 | & *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2)) & | ||
163 | & /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) & | ||
164 | & *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) & | ||
165 | & -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) & | ||
166 | 240491 | & *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) | |
167 | else | ||
168 | 2 | zmix(ig)=zlev(ig,lmix(ig)) | |
169 | 2 | print*,'pb zmix' | |
170 | endif | ||
171 | else | ||
172 | 236627 | zmix(ig)=0. | |
173 | endif | ||
174 | !test | ||
175 |
2/2✓ Branch 0 taken 230559 times.
✓ Branch 1 taken 246561 times.
|
477600 | if ((zmax(ig)-zmix(ig)).le.0.) then |
176 | 230559 | zmix(ig)=0.9*zmax(ig) | |
177 | ! print*,'pb zmix>zmax' | ||
178 | endif | ||
179 | enddo | ||
180 | ! | ||
181 | ! calcul du nouveau lmix correspondant | ||
182 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
183 |
2/2✓ Branch 0 taken 18607680 times.
✓ Branch 1 taken 477120 times.
|
19085280 | do l=1,nlay |
184 |
4/4✓ Branch 0 taken 1534016 times.
✓ Branch 1 taken 17073664 times.
✓ Branch 2 taken 477120 times.
✓ Branch 3 taken 1056896 times.
|
18607680 | if (zmix(ig).ge.zlev(ig,l).and. & |
185 | 477120 | & zmix(ig).lt.zlev(ig,l+1)) then | |
186 | 477120 | lmix(ig)=l | |
187 | endif | ||
188 | enddo | ||
189 | enddo | ||
190 | ! | ||
191 | 480 | return | |
192 | end | ||
193 |