1 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 |
|
|
|
3 |
|
1152 |
SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, & |
4 |
|
1152 |
cd, tke, km, kn, kq, ustar, iflag_pbl, drgpro) |
5 |
|
|
|
6 |
|
|
USE dimphy, only : klev,klon |
7 |
|
|
USE phys_local_var_mod, only: tke_dissip,wprime |
8 |
|
|
USE yamada_ini_mod, only : new_yamada4,yamada4_num,hboville |
9 |
|
|
USE yamada_ini_mod, only : prt_level, lunout,pbl_lmixmin_alpha,b1,kap,viscom,viscoh |
10 |
|
|
USE yamada_ini_mod, only : ric, yun,ydeux,lmixmin |
11 |
|
|
|
12 |
|
|
IMPLICIT NONE |
13 |
|
|
! ************************************************************************************************ |
14 |
|
|
! |
15 |
|
|
! yamada4: subroutine qui calcule le transfert turbulent avec une fermeture d'ordre 2 ou 2.5 |
16 |
|
|
! |
17 |
|
|
! Reference: Simulation of nocturnal drainage flows by a q2l Turbulence Closure Model |
18 |
|
|
! Yamada T. |
19 |
|
|
! J. Atmos. Sci, 40, 91-106, 1983 |
20 |
|
|
! |
21 |
|
|
!************************************************************************************************ |
22 |
|
|
! Input : |
23 |
|
|
!'====== |
24 |
|
|
! ni: indice horizontal sur la grille de base, non restreinte |
25 |
|
|
! nsrf: type de surface |
26 |
|
|
! ngrid: nombre de mailles concern??es sur l'horizontal |
27 |
|
|
! dt : pas de temps |
28 |
|
|
! g : g |
29 |
|
|
! rconst: constante de l'air sec |
30 |
|
|
! zlev : altitude a chaque niveau (interface inferieure de la couche |
31 |
|
|
! de meme indice) |
32 |
|
|
! zlay : altitude au centre de chaque couche |
33 |
|
|
! u,v : vitesse au centre de chaque couche |
34 |
|
|
! (en entree : la valeur au debut du pas de temps) |
35 |
|
|
! teta : temperature potentielle virtuelle au centre de chaque couche |
36 |
|
|
! (en entree : la valeur au debut du pas de temps) |
37 |
|
|
! cd : cdrag pour la quantit?? de mouvement |
38 |
|
|
! (en entree : la valeur au debut du pas de temps) |
39 |
|
|
! ustar: vitesse de friction calcul??e par une formule diagnostique |
40 |
|
|
! iflag_pbl: flag pour choisir des options du sch??ma de turbulence |
41 |
|
|
! |
42 |
|
|
! iflag_pbl doit valoir entre 6 et 9 |
43 |
|
|
! l=6, on prend systematiquement une longueur d'equilibre |
44 |
|
|
! iflag_pbl=6 : MY 2.0 |
45 |
|
|
! iflag_pbl=7 : MY 2.0.Fournier |
46 |
|
|
! iflag_pbl=8/9 : MY 2.5 |
47 |
|
|
! iflag_pbl=8 with special obsolete treatments for convergence |
48 |
|
|
! with Cmpi5 NPv3.1 simulations |
49 |
|
|
! iflag_pbl=10/11 : New scheme M2 and N2 explicit and dissiptation exact |
50 |
|
|
! iflag_pbl=12 = 11 with vertical diffusion off q2 |
51 |
|
|
! |
52 |
|
|
! 2013/04/01 (FH hourdin@lmd.jussieu.fr) |
53 |
|
|
! Correction for very stable PBLs (iflag_pbl=10 and 11) |
54 |
|
|
! iflag_pbl=8 converges numerically with NPv3.1 |
55 |
|
|
! iflag_pbl=11 -> the model starts with NP from start files created by ce0l |
56 |
|
|
! -> the model can run with longer time-steps. |
57 |
|
|
! 2016/11/30 (EV etienne.vignon@lmd.ipsl.fr) |
58 |
|
|
! On met tke (=q2/2) en entr??e plut??t que q2 |
59 |
|
|
! On corrige l'update de la tke |
60 |
|
|
! 2020/10/01 (EV) |
61 |
|
|
! On ajoute la dissipation de la TKE en diagnostique de sortie |
62 |
|
|
! |
63 |
|
|
! Inpout/Output : |
64 |
|
|
!============== |
65 |
|
|
! tke : tke au bas de chaque couche |
66 |
|
|
! (en entree : la valeur au debut du pas de temps) |
67 |
|
|
! (en sortie : la valeur a la fin du pas de temps) |
68 |
|
|
|
69 |
|
|
! Outputs: |
70 |
|
|
!========== |
71 |
|
|
! km : diffusivite turbulente de quantite de mouvement (au bas de chaque |
72 |
|
|
! couche) |
73 |
|
|
! (en sortie : la valeur a la fin du pas de temps) |
74 |
|
|
! kn : diffusivite turbulente des scalaires (au bas de chaque couche) |
75 |
|
|
! (en sortie : la valeur a la fin du pas de temps) |
76 |
|
|
! |
77 |
|
|
!....................................................................... |
78 |
|
|
|
79 |
|
|
!======================================================================= |
80 |
|
|
! Declarations: |
81 |
|
|
!======================================================================= |
82 |
|
|
|
83 |
|
|
|
84 |
|
|
! Inputs/Outputs |
85 |
|
|
!---------------- |
86 |
|
|
REAL dt, g, rconst |
87 |
|
|
REAL plev(klon, klev+1), temp(klon, klev) |
88 |
|
|
REAL ustar(klon) |
89 |
|
2304 |
REAL kmin, qmin, pblhmin(klon), coriol(klon) |
90 |
|
|
REAL zlev(klon, klev+1) |
91 |
|
|
REAL zlay(klon, klev) |
92 |
|
|
REAL u(klon, klev) |
93 |
|
|
REAL v(klon, klev) |
94 |
|
|
REAL teta(klon, klev) |
95 |
|
|
REAL cd(klon) |
96 |
|
|
REAL tke(klon, klev+1) |
97 |
|
2304 |
REAL unsdz(klon, klev) |
98 |
|
2304 |
REAL unsdzdec(klon, klev+1) |
99 |
|
|
REAL kn(klon, klev+1) |
100 |
|
|
REAL km(klon, klev+1) |
101 |
|
|
INTEGER iflag_pbl, ngrid, nsrf |
102 |
|
|
INTEGER ni(klon) |
103 |
|
|
|
104 |
|
|
!FC |
105 |
|
|
REAL drgpro(klon,klev) |
106 |
|
2304 |
REAL winds(klon,klev) |
107 |
|
|
|
108 |
|
|
! Local |
109 |
|
|
!------- |
110 |
|
|
|
111 |
|
2304 |
REAL q2(klon, klev+1) |
112 |
|
2304 |
REAL kmpre(klon, klev+1), tmp2, qpre |
113 |
|
2304 |
REAL mpre(klon, klev+1) |
114 |
|
|
REAL kq(klon, klev+1) |
115 |
|
2304 |
REAL ff(klon, klev+1), delta(klon, klev+1) |
116 |
|
2304 |
REAL aa(klon, klev+1), aa0, aa1 |
117 |
|
|
INTEGER nlay, nlev |
118 |
|
|
|
119 |
|
|
INTEGER ig, jg, k |
120 |
|
|
REAL ri, zrif, zalpha, zsm, zsn |
121 |
|
2304 |
REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev) |
122 |
|
2304 |
REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1) |
123 |
|
2304 |
REAL dtetadz(klon, klev+1) |
124 |
|
|
REAL m2cstat, mcstat, kmcstat |
125 |
|
2304 |
REAL l(klon, klev+1) |
126 |
|
2304 |
REAL zz(klon, klev+1) |
127 |
|
|
INTEGER iter |
128 |
|
2304 |
REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev) |
129 |
|
|
REAL :: disseff |
130 |
|
|
|
131 |
|
|
REAL,SAVE :: rifc |
132 |
|
|
!$OMP THREADPRIVATE(rifc) |
133 |
|
|
REAL,SAVE :: seuilsm, seuilalpha |
134 |
|
|
!$OMP THREADPRIVATE(seuilsm, seuilalpha) |
135 |
|
|
|
136 |
|
|
REAL frif, falpha, fsm |
137 |
|
|
REAL rino(klon, klev+1), smyam(klon, klev), styam(klon, klev), & |
138 |
|
|
lyam(klon, klev), knyam(klon, klev), w2yam(klon, klev), t2yam(klon, klev) |
139 |
|
|
|
140 |
|
|
CHARACTER (len = 20) :: modname = 'yamada4' |
141 |
|
|
CHARACTER (len = 80) :: abort_message |
142 |
|
|
|
143 |
|
|
|
144 |
|
|
|
145 |
|
|
! Fonctions utilis??es |
146 |
|
|
!-------------------- |
147 |
|
|
|
148 |
|
|
frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156)) |
149 |
|
|
falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri) |
150 |
|
|
fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri)) |
151 |
|
|
|
152 |
|
|
|
153 |
|
|
|
154 |
✓✗ |
1152 |
IF (new_yamada4) THEN |
155 |
|
|
! Corrections et reglages issus du travail de these d'Etienne Vignon. |
156 |
|
1152 |
rifc=frif(ric) |
157 |
|
1152 |
seuilsm=fsm(frif(ric)) |
158 |
|
1152 |
seuilalpha=falpha(frif(ric)) |
159 |
|
|
ELSE |
160 |
|
|
rifc=0.191 |
161 |
|
|
seuilalpha=1.12 |
162 |
|
|
seuilsm=0.085 |
163 |
|
|
ENDIF |
164 |
|
|
|
165 |
|
|
!=============================================================================== |
166 |
|
|
! Flags, tests et ??valuations de constantes |
167 |
|
|
!=============================================================================== |
168 |
|
|
|
169 |
|
|
! On utilise ou non la routine de Holstalg Boville pour les cas tres stables |
170 |
|
|
|
171 |
|
|
|
172 |
✗✓ |
1152 |
IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12)) THEN |
173 |
|
|
abort_message='probleme de coherence dans appel a MY' |
174 |
|
|
CALL abort_physic(modname,abort_message,1) |
175 |
|
|
END IF |
176 |
|
|
|
177 |
|
|
|
178 |
|
1152 |
nlay = klev |
179 |
|
1152 |
nlev = klev + 1 |
180 |
|
|
|
181 |
|
|
|
182 |
|
|
!======================================================================== |
183 |
|
|
! Calcul des increments verticaux |
184 |
|
|
!========================================================================= |
185 |
|
|
|
186 |
|
|
|
187 |
|
|
! Attention: zlev n'est pas declare a nlev |
188 |
✓✓ |
473954 |
DO ig = 1, ngrid |
189 |
|
473954 |
zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1)) |
190 |
|
|
END DO |
191 |
|
|
|
192 |
|
|
|
193 |
✓✓ |
46080 |
DO k = 1, nlay |
194 |
✓✓ |
18485358 |
DO ig = 1, ngrid |
195 |
|
18484206 |
unsdz(ig, k) = 1.E+0/(zlev(ig,k+1)-zlev(ig,k)) |
196 |
|
|
END DO |
197 |
|
|
END DO |
198 |
✓✓ |
473954 |
DO ig = 1, ngrid |
199 |
|
473954 |
unsdzdec(ig, 1) = 1.E+0/(zlay(ig,1)-zlev(ig,1)) |
200 |
|
|
END DO |
201 |
✓✓ |
44928 |
DO k = 2, nlay |
202 |
✓✓ |
18011404 |
DO ig = 1, ngrid |
203 |
|
18010252 |
unsdzdec(ig, k) = 1.E+0/(zlay(ig,k)-zlay(ig,k-1)) |
204 |
|
|
END DO |
205 |
|
|
END DO |
206 |
✓✓ |
473954 |
DO ig = 1, ngrid |
207 |
|
473954 |
unsdzdec(ig, nlay+1) = 1.E+0/(zlev(ig,nlay+1)-zlay(ig,nlay)) |
208 |
|
|
END DO |
209 |
|
|
|
210 |
|
|
!========================================================================= |
211 |
|
|
! Richardson number and stability functions |
212 |
|
|
!========================================================================= |
213 |
|
|
|
214 |
|
|
! initialize arrays: |
215 |
|
|
|
216 |
✓✓✓✓
|
18959312 |
m2(1:ngrid, :) = 0.0 |
217 |
✓✓✓✓
|
18959312 |
sm(1:ngrid, :) = 0.0 |
218 |
✓✓✓✓
|
18959312 |
rif(1:ngrid, :) = 0.0 |
219 |
|
|
|
220 |
|
|
!------------------------------------------------------------ |
221 |
✓✓ |
44928 |
DO k = 2, klev |
222 |
|
|
|
223 |
✓✓ |
18011404 |
DO ig = 1, ngrid |
224 |
|
17966476 |
dz(ig, k) = zlay(ig, k) - zlay(ig, k-1) |
225 |
|
|
m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, & |
226 |
|
17966476 |
k-1))**2)/(dz(ig,k)*dz(ig,k)) |
227 |
|
17966476 |
dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k) |
228 |
|
17966476 |
n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k)) |
229 |
|
17966476 |
ri = n2(ig, k)/max(m2(ig,k), 1.E-10) |
230 |
✓✓ |
17966476 |
IF (ri<ric) THEN |
231 |
|
598145 |
rif(ig, k) = frif(ri) |
232 |
|
|
ELSE |
233 |
|
17368331 |
rif(ig, k) = rifc |
234 |
|
|
END IF |
235 |
✓✗ |
17966476 |
if (new_yamada4) then |
236 |
|
17966476 |
alpha(ig, k) = max(falpha(rif(ig,k)),seuilalpha) |
237 |
|
17966476 |
sm(ig, k) = max(fsm(rif(ig,k)),seuilsm) |
238 |
|
|
else |
239 |
|
|
IF (rif(ig,k)<0.16) THEN |
240 |
|
|
alpha(ig, k) = falpha(rif(ig,k)) |
241 |
|
|
sm(ig, k) = fsm(rif(ig,k)) |
242 |
|
|
ELSE |
243 |
|
|
alpha(ig, k) = seuilalpha |
244 |
|
|
sm(ig, k) = seuilsm |
245 |
|
|
END IF |
246 |
|
|
|
247 |
|
|
end if |
248 |
|
18010252 |
zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k) |
249 |
|
|
END DO |
250 |
|
|
END DO |
251 |
|
|
|
252 |
|
|
|
253 |
|
|
|
254 |
|
|
|
255 |
|
|
|
256 |
|
|
!======================================================================= |
257 |
|
|
! DIFFERENT TYPES DE SCHEMA de YAMADA |
258 |
|
|
!======================================================================= |
259 |
|
|
|
260 |
|
|
! On commence par calculer q2 a partir de la tke |
261 |
|
|
|
262 |
✓✗ |
1152 |
IF (new_yamada4) THEN |
263 |
✓✓ |
47232 |
DO k=1,klev+1 |
264 |
✓✓ |
18959312 |
q2(1:ngrid,k)=tke(1:ngrid,k)*ydeux |
265 |
|
|
ENDDO |
266 |
|
|
ELSE |
267 |
|
|
DO k=1,klev+1 |
268 |
|
|
q2(1:ngrid,k)=tke(1:ngrid,k) |
269 |
|
|
ENDDO |
270 |
|
|
ENDIF |
271 |
|
|
|
272 |
|
|
! ==================================================================== |
273 |
|
|
! Computing the mixing length |
274 |
|
|
! ==================================================================== |
275 |
|
|
|
276 |
|
|
|
277 |
|
1152 |
CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, l) |
278 |
|
|
|
279 |
|
|
|
280 |
|
|
!-------------- |
281 |
|
|
! Yamada 2.0 |
282 |
|
|
!-------------- |
283 |
✗✓ |
1152 |
IF (iflag_pbl==6) THEN |
284 |
|
|
|
285 |
|
|
DO k = 2, klev |
286 |
|
|
q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k) |
287 |
|
|
END DO |
288 |
|
|
|
289 |
|
|
|
290 |
|
|
!------------------ |
291 |
|
|
! Yamada 2.Fournier |
292 |
|
|
!------------------ |
293 |
|
|
|
294 |
✗✓ |
1152 |
ELSE IF (iflag_pbl==7) THEN |
295 |
|
|
|
296 |
|
|
|
297 |
|
|
! Calcul de l, km, au pas precedent |
298 |
|
|
!.................................... |
299 |
|
|
DO k = 2, klev |
300 |
|
|
DO ig = 1, ngrid |
301 |
|
|
delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k)) |
302 |
|
|
kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) |
303 |
|
|
mpre(ig, k) = sqrt(m2(ig,k)) |
304 |
|
|
END DO |
305 |
|
|
END DO |
306 |
|
|
|
307 |
|
|
DO k = 2, klev - 1 |
308 |
|
|
DO ig = 1, ngrid |
309 |
|
|
m2cstat = max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1, 1.E-12) |
310 |
|
|
mcstat = sqrt(m2cstat) |
311 |
|
|
|
312 |
|
|
! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3 |
313 |
|
|
!......................................................................... |
314 |
|
|
|
315 |
|
|
IF (k==2) THEN |
316 |
|
|
kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ & |
317 |
|
|
unsdz(ig,k-1)*cd(ig)*(sqrt(u(ig,3)**2+v(ig,3)**2)-mcstat/unsdzdec & |
318 |
|
|
(ig,k)-mpre(ig,k+1)/unsdzdec(ig,k+1))**2)/(unsdz(ig,k)+unsdz(ig,k & |
319 |
|
|
-1)) |
320 |
|
|
ELSE |
321 |
|
|
kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ & |
322 |
|
|
unsdz(ig,k-1)*kmpre(ig,k-1)*mpre(ig,k-1))/ & |
323 |
|
|
(unsdz(ig,k)+unsdz(ig,k-1)) |
324 |
|
|
END IF |
325 |
|
|
|
326 |
|
|
tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k) |
327 |
|
|
q2(ig, k) = max(tmp2, 1.E-12)**(2./3.) |
328 |
|
|
|
329 |
|
|
END DO |
330 |
|
|
END DO |
331 |
|
|
|
332 |
|
|
|
333 |
|
|
! ------------------------ |
334 |
|
|
! Yamada 2.5 a la Didi |
335 |
|
|
!------------------------- |
336 |
|
|
|
337 |
✗✓ |
1152 |
ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN |
338 |
|
|
|
339 |
|
|
! Calcul de l, km, au pas precedent |
340 |
|
|
!.................................... |
341 |
|
|
DO k = 2, klev |
342 |
|
|
DO ig = 1, ngrid |
343 |
|
|
delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k)) |
344 |
|
|
IF (delta(ig,k)<1.E-20) THEN |
345 |
|
|
delta(ig, k) = 1.E-20 |
346 |
|
|
END IF |
347 |
|
|
km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) |
348 |
|
|
aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1) |
349 |
|
|
aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1) |
350 |
|
|
aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k)) |
351 |
|
|
qpre = sqrt(q2(ig,k)) |
352 |
|
|
IF (aa(ig,k)>0.) THEN |
353 |
|
|
q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2 |
354 |
|
|
ELSE |
355 |
|
|
q2(ig, k) = (qpre/(1.-aa(ig,k)*qpre))**2 |
356 |
|
|
END IF |
357 |
|
|
! else ! iflag_pbl=9 |
358 |
|
|
! if (aa(ig,k)*qpre.gt.0.9) then |
359 |
|
|
! q2(ig,k)=(qpre*10.)**2 |
360 |
|
|
! else |
361 |
|
|
! q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2 |
362 |
|
|
! endif |
363 |
|
|
! endif |
364 |
|
|
q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4) |
365 |
|
|
END DO |
366 |
|
|
END DO |
367 |
|
|
|
368 |
✓✗ |
1152 |
ELSE IF (iflag_pbl>=10) THEN |
369 |
|
|
|
370 |
✓✓✓✓
|
44704512 |
shear(:,:)=0. |
371 |
✓✓✓✓
|
44704512 |
buoy(:,:)=0. |
372 |
✓✓✓✓
|
44704512 |
dissip(:,:)=0. |
373 |
✓✓✓✓
|
45850752 |
km(:,:)=0. |
374 |
|
|
|
375 |
✓✗ |
1152 |
IF (yamada4_num>=1) THEN |
376 |
|
|
|
377 |
✓✓ |
43776 |
DO k = 2, klev - 1 |
378 |
✓✓ |
17537450 |
DO ig=1,ngrid |
379 |
|
17493674 |
q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4) |
380 |
|
17493674 |
km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) |
381 |
|
17493674 |
shear(ig,k)=km(ig, k)*m2(ig, k) |
382 |
|
17493674 |
buoy(ig,k)=km(ig, k)*m2(ig, k)*(-1.*rif(ig,k)) |
383 |
|
|
! dissip(ig,k)=min(max(((sqrt(q2(ig,k)))**3)/(b1*l(ig,k)),1.E-12),1.E4) |
384 |
|
17536298 |
dissip(ig,k)=((sqrt(q2(ig,k)))**3)/(b1*l(ig,k)) |
385 |
|
|
ENDDO |
386 |
|
|
ENDDO |
387 |
|
|
|
388 |
✗✓ |
1152 |
IF (yamada4_num==1) THEN ! Schema du MAR tel quel |
389 |
|
|
DO k = 2, klev - 1 |
390 |
|
|
DO ig=1,ngrid |
391 |
|
|
tkeprov=q2(ig,k)/ydeux |
392 |
|
|
tkeprov= tkeprov* & |
393 |
|
|
& (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ & |
394 |
|
|
& (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)+drgpro(ig,k)*tkeprov)) |
395 |
|
|
q2(ig,k)=tkeprov*ydeux |
396 |
|
|
ENDDO |
397 |
|
|
ENDDO |
398 |
✗✓ |
1152 |
ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation |
399 |
|
|
DO k = 2, klev - 1 |
400 |
|
|
DO ig=1,ngrid |
401 |
|
|
tkeprov=q2(ig,k)/ydeux |
402 |
|
|
disseff=dissip(ig,k)-min(0.,buoy(ig,k)) |
403 |
|
|
tkeprov = tkeprov/(1.+dt*disseff/(2.*tkeprov))**2 |
404 |
|
|
tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))) |
405 |
|
|
q2(ig,k)=tkeprov*ydeux |
406 |
|
|
! En cas stable, on traite la flotabilite comme la |
407 |
|
|
! dissipation, en supposant que buoy/q2^3 est constant. |
408 |
|
|
! Puis on prend la solution exacte |
409 |
|
|
ENDDO |
410 |
|
|
ENDDO |
411 |
✗✓ |
1152 |
ELSE IF (yamada4_num==3) THEN ! version modifiee avec integration exacte pour la dissipation |
412 |
|
|
DO k = 2, klev - 1 |
413 |
|
|
DO ig=1,ngrid |
414 |
|
|
tkeprov=q2(ig,k)/ydeux |
415 |
|
|
disseff=dissip(ig,k)-min(0.,buoy(ig,k)) |
416 |
|
|
tkeprov=tkeprov*exp(-dt*disseff/tkeprov) |
417 |
|
|
tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))) |
418 |
|
|
q2(ig,k)=tkeprov*ydeux |
419 |
|
|
! En cas stable, on traite la flotabilite comme la |
420 |
|
|
! dissipation, en supposant que buoy/q2^3 est constant. |
421 |
|
|
! Puis on prend la solution exacte |
422 |
|
|
ENDDO |
423 |
|
|
ENDDO |
424 |
✗✓ |
1152 |
ELSE IF (yamada4_num==4) THEN ! version modifiee avec integration exacte pour la dissipation |
425 |
|
|
DO k = 2, klev - 1 |
426 |
|
|
DO ig=1,ngrid |
427 |
|
|
tkeprov=q2(ig,k)/ydeux |
428 |
|
|
tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))) |
429 |
|
|
tkeprov= tkeprov* & |
430 |
|
|
& tkeprov/ & |
431 |
|
|
& (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k))) |
432 |
|
|
q2(ig,k)=tkeprov*ydeux |
433 |
|
|
! En cas stable, on traite la flotabilite comme la |
434 |
|
|
! dissipation, en supposant que buoy/q2^3 est constant. |
435 |
|
|
! Puis on prend la solution exacte |
436 |
|
|
ENDDO |
437 |
|
|
ENDDO |
438 |
|
|
|
439 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
440 |
|
|
!! Attention, yamada4_num=5 est inexacte car néglige les termes de flottabilité |
441 |
|
|
!! en conditions instables |
442 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
443 |
✓✗ |
1152 |
ELSE IF (yamada4_num==5) THEN ! version modifiee avec integration exacte pour la dissipation |
444 |
✓✓ |
43776 |
DO k = 2, klev - 1 |
445 |
✓✓ |
17537450 |
DO ig=1,ngrid |
446 |
|
17493674 |
tkeprov=q2(ig,k)/ydeux |
447 |
|
|
!FC on ajoute la dissipation due aux arbres |
448 |
|
17493674 |
disseff=dissip(ig,k)-min(0.,buoy(ig,k)) + drgpro(ig,k)*tkeprov |
449 |
|
17493674 |
tkeexp=exp(-dt*disseff/tkeprov) |
450 |
|
|
! on prend en compte la tke cree par les arbres |
451 |
|
17493674 |
winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2) |
452 |
|
|
tkeprov= (shear(ig,k)+ & |
453 |
|
17493674 |
& drgpro(ig,k)*(winds(ig,k))**3)*tkeprov/disseff*(1.-tkeexp)+tkeprov*tkeexp |
454 |
|
17536298 |
q2(ig,k)=tkeprov*ydeux |
455 |
|
|
! En cas stable, on traite la flotabilite comme la |
456 |
|
|
! dissipation, en supposant que buoy/q2^3 est constant. |
457 |
|
|
! Puis on prend la solution exacte |
458 |
|
|
ENDDO |
459 |
|
|
ENDDO |
460 |
|
|
ELSE IF (yamada4_num==6) THEN ! version modifiee avec integration exacte pour la dissipation |
461 |
|
|
DO k = 2, klev - 1 |
462 |
|
|
DO ig=1,ngrid |
463 |
|
|
! En cas stable, on traite la flotabilite comme la |
464 |
|
|
! dissipation, en supposant que dissipeff/TKE est constant. |
465 |
|
|
! Puis on prend la solution exacte |
466 |
|
|
! With drag and dissipation from high vegetation (EV & FC, 05/10/2020) |
467 |
|
|
winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2) |
468 |
|
|
tkeprov=q2(ig,k)/ydeux |
469 |
|
|
tkeprov=tkeprov+max(buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3,0.)*dt |
470 |
|
|
disseff=dissip(ig,k)-min(0.,buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3) + drgpro(ig,k)*tkeprov |
471 |
|
|
tkeexp=exp(-dt*disseff/tkeprov) |
472 |
|
|
tkeprov= tkeprov*tkeexp |
473 |
|
|
q2(ig,k)=tkeprov*ydeux |
474 |
|
|
|
475 |
|
|
ENDDO |
476 |
|
|
ENDDO |
477 |
|
|
ENDIF |
478 |
|
|
|
479 |
✓✓ |
43776 |
DO k = 2, klev - 1 |
480 |
✓✓ |
17537450 |
DO ig=1,ngrid |
481 |
|
17536298 |
q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4) |
482 |
|
|
ENDDO |
483 |
|
|
ENDDO |
484 |
|
|
|
485 |
|
|
ELSE |
486 |
|
|
|
487 |
|
|
DO k = 2, klev - 1 |
488 |
|
|
km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k) |
489 |
|
|
q2(1:ngrid, k) = q2(1:ngrid, k) + ydeux*dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k)) |
490 |
|
|
! q2(1:ngrid, k) = q2(1:ngrid, k) + dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k)) |
491 |
|
|
q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4) |
492 |
|
|
q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*l(1:ngrid,k)*b1)) |
493 |
|
|
! q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1)) |
494 |
|
|
q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k) |
495 |
|
|
END DO |
496 |
|
|
|
497 |
|
|
ENDIF |
498 |
|
|
|
499 |
|
|
ELSE |
500 |
|
|
abort_message='Cas nom prevu dans yamada4' |
501 |
|
|
CALL abort_physic(modname,abort_message,1) |
502 |
|
|
|
503 |
|
|
END IF ! Fin du cas 8 |
504 |
|
|
|
505 |
|
|
|
506 |
|
|
! ==================================================================== |
507 |
|
|
! Calcul des coefficients de melange |
508 |
|
|
! ==================================================================== |
509 |
|
|
|
510 |
✓✓ |
44928 |
DO k = 2, klev |
511 |
✓✓ |
18011404 |
DO ig = 1, ngrid |
512 |
|
17966476 |
zq = sqrt(q2(ig,k)) |
513 |
|
17966476 |
km(ig, k) = l(ig, k)*zq*sm(ig, k) ! For momentum |
514 |
|
17966476 |
kn(ig, k) = km(ig, k)*alpha(ig, k) ! For scalars |
515 |
|
18010252 |
kq(ig, k) = l(ig, k)*zq*0.2 ! For TKE |
516 |
|
|
END DO |
517 |
|
|
END DO |
518 |
|
|
|
519 |
|
|
|
520 |
|
|
!==================================================================== |
521 |
|
|
! Transport diffusif vertical de la TKE par la TKE |
522 |
|
|
!==================================================================== |
523 |
|
|
|
524 |
|
|
|
525 |
|
|
! initialize near-surface and top-layer mixing coefficients |
526 |
|
|
!........................................................... |
527 |
|
|
|
528 |
✓✓ |
473954 |
kq(1:ngrid, 1) = kq(1:ngrid, 2) ! constant (ie no gradient) near the surface |
529 |
✓✓ |
473954 |
kq(1:ngrid, klev+1) = 0 ! zero at the top |
530 |
|
|
|
531 |
|
|
! Transport diffusif vertical de la TKE. |
532 |
|
|
!....................................... |
533 |
|
|
|
534 |
✓✗ |
1152 |
IF (iflag_pbl>=12) THEN |
535 |
✓✓ |
473954 |
q2(1:ngrid, 1) = q2(1:ngrid, 2) |
536 |
|
1152 |
CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2) |
537 |
|
|
END IF |
538 |
|
|
|
539 |
|
|
|
540 |
|
|
!==================================================================== |
541 |
|
|
! Traitement particulier pour les cas tres stables, introduction d'une |
542 |
|
|
! longueur de m??lange minimale |
543 |
|
|
!==================================================================== |
544 |
|
|
! |
545 |
|
|
! Reference: Local versus Nonlocal boundary-layer diffusion in a global climate model |
546 |
|
|
! Holtslag A.A.M. and Boville B.A. |
547 |
|
|
! J. Clim., 6, 1825-1842, 1993 |
548 |
|
|
|
549 |
|
|
|
550 |
✗✓ |
1152 |
IF (hboville) THEN |
551 |
|
|
|
552 |
|
|
|
553 |
|
|
IF (prt_level>1) THEN |
554 |
|
|
WRITE(lunout,*) 'YAMADA4 0' |
555 |
|
|
END IF |
556 |
|
|
|
557 |
|
|
DO ig = 1, ngrid |
558 |
|
|
coriol(ig) = 1.E-4 |
559 |
|
|
pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5) |
560 |
|
|
END DO |
561 |
|
|
|
562 |
|
|
IF (1==1) THEN |
563 |
|
|
IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN |
564 |
|
|
|
565 |
|
|
DO k = 2, klev |
566 |
|
|
DO ig = 1, ngrid |
567 |
|
|
IF (teta(ig,2)>teta(ig,1)) THEN |
568 |
|
|
qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 |
569 |
|
|
kmin = kap*zlev(ig, k)*qmin |
570 |
|
|
ELSE |
571 |
|
|
kmin = -1. ! kmin n'est utilise que pour les SL stables. |
572 |
|
|
END IF |
573 |
|
|
IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN |
574 |
|
|
|
575 |
|
|
kn(ig, k) = kmin |
576 |
|
|
km(ig, k) = kmin |
577 |
|
|
kq(ig, k) = kmin |
578 |
|
|
|
579 |
|
|
! la longueur de melange est suposee etre l= kap z |
580 |
|
|
! K=l q Sm d'ou q2=(K/l Sm)**2 |
581 |
|
|
|
582 |
|
|
q2(ig, k) = (qmin/sm(ig,k))**2 |
583 |
|
|
END IF |
584 |
|
|
END DO |
585 |
|
|
END DO |
586 |
|
|
|
587 |
|
|
ELSE |
588 |
|
|
DO k = 2, klev |
589 |
|
|
DO ig = 1, ngrid |
590 |
|
|
IF (teta(ig,2)>teta(ig,1)) THEN |
591 |
|
|
qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 |
592 |
|
|
kmin = kap*zlev(ig, k)*qmin |
593 |
|
|
ELSE |
594 |
|
|
kmin = -1. ! kmin n'est utilise que pour les SL stables. |
595 |
|
|
END IF |
596 |
|
|
IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN |
597 |
|
|
kn(ig, k) = kmin |
598 |
|
|
km(ig, k) = kmin |
599 |
|
|
kq(ig, k) = kmin |
600 |
|
|
! la longueur de melange est suposee etre l= kap z |
601 |
|
|
! K=l q Sm d'ou q2=(K/l Sm)**2 |
602 |
|
|
sm(ig, k) = 1. |
603 |
|
|
alpha(ig, k) = 1. |
604 |
|
|
q2(ig, k) = min((qmin/sm(ig,k))**2, 10.) |
605 |
|
|
zq = sqrt(q2(ig,k)) |
606 |
|
|
km(ig, k) = l(ig, k)*zq*sm(ig, k) |
607 |
|
|
kn(ig, k) = km(ig, k)*alpha(ig, k) |
608 |
|
|
kq(ig, k) = l(ig, k)*zq*0.2 |
609 |
|
|
END IF |
610 |
|
|
END DO |
611 |
|
|
END DO |
612 |
|
|
END IF |
613 |
|
|
|
614 |
|
|
END IF |
615 |
|
|
|
616 |
|
|
END IF ! hboville |
617 |
|
|
|
618 |
|
|
! Ajout d'une viscosite moleculaire |
619 |
✓✓✓✓
|
18011404 |
km(1:ngrid,2:klev)=km(1:ngrid,2:klev)+viscom |
620 |
✓✓✓✓
|
18011404 |
kn(1:ngrid,2:klev)=kn(1:ngrid,2:klev)+viscoh |
621 |
✓✓✓✓
|
18011404 |
kq(1:ngrid,2:klev)=kq(1:ngrid,2:klev)+viscoh |
622 |
|
|
|
623 |
✗✓ |
1152 |
IF (prt_level>1) THEN |
624 |
|
|
WRITE(lunout,*)'YAMADA4 1' |
625 |
|
|
END IF !(prt_level>1) THEN |
626 |
|
|
|
627 |
|
|
|
628 |
|
|
!====================================================== |
629 |
|
|
! Estimations de w'2 et T'2 d'apres Abdela et McFarlane |
630 |
|
|
!====================================================== |
631 |
|
|
! |
632 |
|
|
! Reference: A New Second-Order Turbulence Closure Scheme for the Planetary Boundary Layer |
633 |
|
|
! Abdella K and McFarlane N |
634 |
|
|
! J. Atmos. Sci., 54, 1850-1867, 1997 |
635 |
|
|
|
636 |
|
|
! Diagnostique pour stokage |
637 |
|
|
!.......................... |
638 |
|
|
|
639 |
|
|
IF (1==0) THEN |
640 |
|
|
rino = rif |
641 |
|
|
smyam(1:ngrid, 1) = 0. |
642 |
|
|
styam(1:ngrid, 1) = 0. |
643 |
|
|
lyam(1:ngrid, 1) = 0. |
644 |
|
|
knyam(1:ngrid, 1) = 0. |
645 |
|
|
w2yam(1:ngrid, 1) = 0. |
646 |
|
|
t2yam(1:ngrid, 1) = 0. |
647 |
|
|
|
648 |
|
|
smyam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev) |
649 |
|
|
styam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)*alpha(1:ngrid, 2:klev) |
650 |
|
|
lyam(1:ngrid, 2:klev) = l(1:ngrid, 2:klev) |
651 |
|
|
knyam(1:ngrid, 2:klev) = kn(1:ngrid, 2:klev) |
652 |
|
|
|
653 |
|
|
|
654 |
|
|
! Calcul de w'2 et T'2 |
655 |
|
|
!....................... |
656 |
|
|
|
657 |
|
|
w2yam(1:ngrid, 2:klev) = q2(1:ngrid, 2:klev)*0.24 + & |
658 |
|
|
lyam(1:ngrid, 2:klev)*5.17*kn(1:ngrid, 2:klev)*n2(1:ngrid, 2:klev)/ & |
659 |
|
|
sqrt(q2(1:ngrid,2:klev)) |
660 |
|
|
|
661 |
|
|
t2yam(1:ngrid, 2:klev) = 9.1*kn(1:ngrid, 2:klev)* & |
662 |
|
|
dtetadz(1:ngrid, 2:klev)**2/sqrt(q2(1:ngrid,2:klev))* & |
663 |
|
|
lyam(1:ngrid, 2:klev) |
664 |
|
|
END IF |
665 |
|
|
|
666 |
|
|
|
667 |
|
|
|
668 |
|
|
!============================================================================ |
669 |
|
|
! Mise a jour de la tke |
670 |
|
|
!============================================================================ |
671 |
|
|
|
672 |
✓✗ |
1152 |
IF (new_yamada4) THEN |
673 |
✓✓ |
47232 |
DO k=1,klev+1 |
674 |
✓✓ |
18959312 |
tke(1:ngrid,k)=q2(1:ngrid,k)/ydeux |
675 |
|
|
ENDDO |
676 |
|
|
ELSE |
677 |
|
|
DO k=1,klev+1 |
678 |
|
|
tke(1:ngrid,k)=q2(1:ngrid,k) |
679 |
|
|
ENDDO |
680 |
|
|
ENDIF |
681 |
|
|
|
682 |
|
|
|
683 |
|
|
!============================================================================ |
684 |
|
|
! Diagnostique de la dissipation et vitesse verticale |
685 |
|
|
!============================================================================ |
686 |
|
|
|
687 |
|
|
! Diagnostics |
688 |
✓✓✓✓
|
18959312 |
tke_dissip(1:ngrid,:,nsrf)=0. |
689 |
✓✓✓✓
|
18959312 |
wprime(1:ngrid,:,nsrf)=0. |
690 |
✓✓ |
44928 |
DO k=2,klev |
691 |
✓✓ |
18011404 |
DO ig=1,ngrid |
692 |
|
17966476 |
jg=ni(ig) |
693 |
|
17966476 |
wprime(jg,k,nsrf)=sqrt(MAX(1./3*q2(ig,k),0.)) |
694 |
|
18010252 |
tke_dissip(jg,k,nsrf)=dissip(ig,k) |
695 |
|
|
ENDDO |
696 |
|
|
ENDDO |
697 |
|
|
|
698 |
|
|
!============================================================================= |
699 |
|
|
|
700 |
|
1152 |
RETURN |
701 |
|
|
|
702 |
|
|
|
703 |
|
|
END SUBROUTINE yamada4 |
704 |
|
|
|
705 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
706 |
|
|
|
707 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
708 |
|
1152 |
SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2) |
709 |
|
|
|
710 |
|
|
USE dimphy, only : klev,klon |
711 |
|
|
IMPLICIT NONE |
712 |
|
|
|
713 |
|
|
! vdif_q2: subroutine qui calcule la diffusion de la TKE par la TKE |
714 |
|
|
! avec un schema implicite en temps avec |
715 |
|
|
! inversion d'un syst??me tridiagonal |
716 |
|
|
! |
717 |
|
|
! Reference: Description of the interface with the surface and |
718 |
|
|
! the computation of the turbulet diffusion in LMDZ |
719 |
|
|
! Technical note on LMDZ |
720 |
|
|
! Dufresne, J-L, Ghattas, J. and Grandpeix, J-Y |
721 |
|
|
! |
722 |
|
|
!============================================================================ |
723 |
|
|
! Declarations |
724 |
|
|
!============================================================================ |
725 |
|
|
|
726 |
|
|
REAL plev(klon, klev+1) |
727 |
|
|
REAL temp(klon, klev) |
728 |
|
|
REAL timestep |
729 |
|
|
REAL gravity, rconst |
730 |
|
2304 |
REAL kstar(klon, klev+1), zz |
731 |
|
|
REAL kmy(klon, klev+1) |
732 |
|
|
REAL q2(klon, klev+1) |
733 |
|
2304 |
REAL deltap(klon, klev+1) |
734 |
|
1152 |
REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1) |
735 |
|
|
INTEGER ngrid |
736 |
|
|
|
737 |
|
|
INTEGER i, k |
738 |
|
|
|
739 |
|
|
|
740 |
|
|
!========================================================================= |
741 |
|
|
! Calcul |
742 |
|
|
!========================================================================= |
743 |
|
|
|
744 |
✓✓ |
46080 |
DO k = 1, klev |
745 |
✓✓ |
18485358 |
DO i = 1, ngrid |
746 |
|
18439278 |
zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) |
747 |
|
|
kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ & |
748 |
|
18484206 |
(plev(i,k)-plev(i,k+1))*timestep |
749 |
|
|
END DO |
750 |
|
|
END DO |
751 |
|
|
|
752 |
✓✓ |
44928 |
DO k = 2, klev |
753 |
✓✓ |
18011404 |
DO i = 1, ngrid |
754 |
|
18010252 |
deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1)) |
755 |
|
|
END DO |
756 |
|
|
END DO |
757 |
✓✓ |
473954 |
DO i = 1, ngrid |
758 |
|
472802 |
deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2)) |
759 |
|
472802 |
deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1)) |
760 |
|
472802 |
denom(i, klev+1) = deltap(i, klev+1) + kstar(i, klev) |
761 |
|
472802 |
alpha(i, klev+1) = deltap(i, klev+1)*q2(i, klev+1)/denom(i, klev+1) |
762 |
|
473954 |
beta(i, klev+1) = kstar(i, klev)/denom(i, klev+1) |
763 |
|
|
END DO |
764 |
|
|
|
765 |
✓✓ |
44928 |
DO k = klev, 2, -1 |
766 |
✓✓ |
18011404 |
DO i = 1, ngrid |
767 |
|
|
denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + & |
768 |
|
17966476 |
kstar(i, k-1) |
769 |
|
17966476 |
alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k) |
770 |
|
18010252 |
beta(i, k) = kstar(i, k-1)/denom(i, k) |
771 |
|
|
END DO |
772 |
|
|
END DO |
773 |
|
|
|
774 |
|
|
! Si on recalcule q2(1) |
775 |
|
|
!....................... |
776 |
|
|
IF (1==0) THEN |
777 |
|
|
DO i = 1, ngrid |
778 |
|
|
denom(i, 1) = deltap(i, 1) + (1-beta(i,2))*kstar(i, 1) |
779 |
|
|
q2(i, 1) = (q2(i,1)*deltap(i,1)+kstar(i,1)*alpha(i,2))/denom(i, 1) |
780 |
|
|
END DO |
781 |
|
|
END IF |
782 |
|
|
|
783 |
|
|
|
784 |
✓✓ |
46080 |
DO k = 2, klev + 1 |
785 |
✓✓ |
18485358 |
DO i = 1, ngrid |
786 |
|
18484206 |
q2(i, k) = alpha(i, k) + beta(i, k)*q2(i, k-1) |
787 |
|
|
END DO |
788 |
|
|
END DO |
789 |
|
|
|
790 |
|
1152 |
RETURN |
791 |
|
|
END SUBROUTINE vdif_q2 |
792 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
793 |
|
|
|
794 |
|
|
|
795 |
|
|
|
796 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
797 |
|
|
SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2) |
798 |
|
|
|
799 |
|
|
USE dimphy, only : klev,klon |
800 |
|
|
IMPLICIT NONE |
801 |
|
|
|
802 |
|
|
! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE |
803 |
|
|
! avec un schema explicite en temps |
804 |
|
|
|
805 |
|
|
|
806 |
|
|
!==================================================== |
807 |
|
|
! Declarations |
808 |
|
|
!==================================================== |
809 |
|
|
|
810 |
|
|
REAL plev(klon, klev+1) |
811 |
|
|
REAL temp(klon, klev) |
812 |
|
|
REAL timestep |
813 |
|
|
REAL gravity, rconst |
814 |
|
|
REAL kstar(klon, klev+1), zz |
815 |
|
|
REAL kmy(klon, klev+1) |
816 |
|
|
REAL q2(klon, klev+1) |
817 |
|
|
REAL deltap(klon, klev+1) |
818 |
|
|
REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1) |
819 |
|
|
INTEGER ngrid |
820 |
|
|
INTEGER i, k |
821 |
|
|
|
822 |
|
|
|
823 |
|
|
!================================================== |
824 |
|
|
! Calcul |
825 |
|
|
!================================================== |
826 |
|
|
|
827 |
|
|
DO k = 1, klev |
828 |
|
|
DO i = 1, ngrid |
829 |
|
|
zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) |
830 |
|
|
kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ & |
831 |
|
|
(plev(i,k)-plev(i,k+1))*timestep |
832 |
|
|
END DO |
833 |
|
|
END DO |
834 |
|
|
|
835 |
|
|
DO k = 2, klev |
836 |
|
|
DO i = 1, ngrid |
837 |
|
|
deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1)) |
838 |
|
|
END DO |
839 |
|
|
END DO |
840 |
|
|
DO i = 1, ngrid |
841 |
|
|
deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2)) |
842 |
|
|
deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1)) |
843 |
|
|
END DO |
844 |
|
|
|
845 |
|
|
DO k = klev, 2, -1 |
846 |
|
|
DO i = 1, ngrid |
847 |
|
|
q2(i, k) = q2(i, k) + (kstar(i,k)*(q2(i,k+1)-q2(i, & |
848 |
|
|
k))-kstar(i,k-1)*(q2(i,k)-q2(i,k-1)))/deltap(i, k) |
849 |
|
|
END DO |
850 |
|
|
END DO |
851 |
|
|
|
852 |
|
|
DO i = 1, ngrid |
853 |
|
|
q2(i, 1) = q2(i, 1) + (kstar(i,1)*(q2(i,2)-q2(i,1)))/deltap(i, 1) |
854 |
|
|
q2(i, klev+1) = q2(i, klev+1) + (-kstar(i,klev)*(q2(i,klev+1)-q2(i, & |
855 |
|
|
klev)))/deltap(i, klev+1) |
856 |
|
|
END DO |
857 |
|
|
|
858 |
|
|
RETURN |
859 |
|
|
END SUBROUTINE vdif_q2e |
860 |
|
|
|
861 |
|
|
!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
862 |
|
|
|
863 |
|
|
|
864 |
|
|
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
865 |
|
|
|
866 |
|
1152 |
SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, lmix) |
867 |
|
|
|
868 |
|
|
|
869 |
|
|
|
870 |
|
|
USE dimphy, only : klev,klon |
871 |
|
|
USE yamada_ini_mod, only : l0 |
872 |
|
|
USE phys_state_var_mod, only: zstd, zsig, zmea |
873 |
|
|
USE phys_local_var_mod, only: l_mixmin, l_mix |
874 |
|
|
USE yamada_ini_mod, only : kap, kapb |
875 |
|
|
|
876 |
|
|
! zstd: ecart type de la'altitud e sous-maille |
877 |
|
|
! zmea: altitude moyenne sous maille |
878 |
|
|
! zsig: pente moyenne de le maille |
879 |
|
|
|
880 |
|
|
USE geometry_mod, only: cell_area |
881 |
|
|
! aire_cell: aire de la maille |
882 |
|
|
|
883 |
|
|
IMPLICIT NONE |
884 |
|
|
!************************************************************************* |
885 |
|
|
! Subrourine qui calcule la longueur de m??lange dans le sch??ma de turbulence |
886 |
|
|
! avec la formule de Blackadar |
887 |
|
|
! Calcul d'un minimum en fonction de l'orographie sous-maille: |
888 |
|
|
! L'id??e est la suivante: plus il y a de relief, plus il y a du m??lange |
889 |
|
|
! induit par les circulations meso et submeso ??chelles. |
890 |
|
|
! |
891 |
|
|
! References: * The vertical distribution of wind and turbulent exchange in a neutral atmosphere |
892 |
|
|
! Blackadar A.K. |
893 |
|
|
! J. Geophys. Res., 64, No 8, 1962 |
894 |
|
|
! |
895 |
|
|
! * An evaluation of neutral and convective planetary boundary-layer parametrisations relative |
896 |
|
|
! to large eddy simulations |
897 |
|
|
! Ayotte K et al |
898 |
|
|
! Boundary Layer Meteorology, 79, 131-175, 1996 |
899 |
|
|
! |
900 |
|
|
! |
901 |
|
|
! * Local Similarity in the Stable Boundary Layer and Mixing length Approaches: consistency of concepts |
902 |
|
|
! Van de Wiel B.J.H et al |
903 |
|
|
! Boundary-Lay Meteorol, 128, 103-166, 2008 |
904 |
|
|
! |
905 |
|
|
! |
906 |
|
|
! Histoire: |
907 |
|
|
!---------- |
908 |
|
|
! * premi??re r??daction, Etienne et Frederic, 09/06/2016 |
909 |
|
|
! |
910 |
|
|
! *********************************************************************** |
911 |
|
|
|
912 |
|
|
!================================================================== |
913 |
|
|
! Declarations |
914 |
|
|
!================================================================== |
915 |
|
|
|
916 |
|
|
! Inputs |
917 |
|
|
!------- |
918 |
|
|
INTEGER ni(klon) ! indice sur la grille original (non restreinte) |
919 |
|
|
INTEGER nsrf ! Type de surface |
920 |
|
|
INTEGER ngrid ! Nombre de points concern??s sur l'horizontal |
921 |
|
|
INTEGER iflag_pbl ! Choix du sch??ma de turbulence |
922 |
|
|
REAL pbl_lmixmin_alpha ! on active ou non le calcul de la longueur de melange minimum en fonction du relief |
923 |
|
|
REAL lmixmin ! Minimum absolu de la longueur de m??lange |
924 |
|
|
REAL zlay(klon, klev) ! altitude du centre de la couche |
925 |
|
|
REAL zlev(klon, klev+1) ! atitude de l'interface inf??rieure de la couche |
926 |
|
|
REAL u(klon, klev) ! vitesse du vent zonal |
927 |
|
|
REAL v(klon, klev) ! vitesse du vent meridional |
928 |
|
|
REAL q2(klon, klev+1) ! energie cin??tique turbulente |
929 |
|
|
REAL n2(klon, klev+1) ! frequence de Brunt-Vaisala |
930 |
|
|
|
931 |
|
|
!In/out |
932 |
|
|
!------- |
933 |
|
|
|
934 |
|
|
! Outputs |
935 |
|
|
!--------- |
936 |
|
|
|
937 |
|
|
REAL lmix(klon, klev+1) ! Longueur de melange |
938 |
|
|
|
939 |
|
|
|
940 |
|
|
! Local |
941 |
|
|
!------- |
942 |
|
|
|
943 |
|
|
INTEGER ig,jg, k |
944 |
|
2304 |
REAL h_oro(klon) |
945 |
|
2304 |
REAL hlim(klon) |
946 |
|
|
REAL zq |
947 |
|
2304 |
REAL sq(klon), sqz(klon) |
948 |
|
|
REAL fl, zzz, zl0, zq2, zn2 |
949 |
|
|
REAL famorti, zzzz, zh_oro, zhlim |
950 |
|
2304 |
REAL l1(klon, klev+1), l2(klon,klev+1) |
951 |
|
2304 |
REAL winds(klon, klev) |
952 |
|
|
REAL xcell |
953 |
|
|
REAL zstdslope(klon) |
954 |
|
|
REAL lmax |
955 |
|
|
REAL l2strat, l2neutre, extent |
956 |
|
|
REAL l2limit(klon) |
957 |
|
|
!=============================================================== |
958 |
|
|
! Fonctions utiles |
959 |
|
|
!=============================================================== |
960 |
|
|
|
961 |
|
|
! Calcul de l suivant la formule de Blackadar 1962 adapt??e par Ayotte 1996 |
962 |
|
|
!.......................................................................... |
963 |
|
|
|
964 |
|
|
fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, & |
965 |
|
|
k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( & |
966 |
|
|
max(n2(ig,k),1.E-10))), 1.E-5) |
967 |
|
|
|
968 |
|
|
! Fonction d'amortissement de la turbulence au dessus de la montagne |
969 |
|
|
! On augmente l'amortissement en diminuant la valeur de hlim (extent) dans le code |
970 |
|
|
!..................................................................... |
971 |
|
|
|
972 |
|
|
famorti(zzzz, zh_oro, zhlim)=(-1.)*ATAN((zzzz-zh_oro)/(zhlim-zh_oro))*2./3.1416+1. |
973 |
|
|
|
974 |
✗✓ |
1152 |
IF (ngrid==0) RETURN |
975 |
|
|
|
976 |
|
|
|
977 |
|
|
!===================================================================== |
978 |
|
|
! CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1 |
979 |
|
|
!===================================================================== |
980 |
|
|
|
981 |
✓✓✓✓
|
18959312 |
l1(1:ngrid,:)=0. |
982 |
✗✓ |
1152 |
IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN |
983 |
|
|
|
984 |
|
|
|
985 |
|
|
! Iterative computation of l0 |
986 |
|
|
! This version is kept for iflag_pbl only for convergence |
987 |
|
|
! with NPv3.1 Cmip5 simulations |
988 |
|
|
!................................................................... |
989 |
|
|
|
990 |
|
|
DO ig = 1, ngrid |
991 |
|
|
sq(ig) = 1.E-10 |
992 |
|
|
sqz(ig) = 1.E-10 |
993 |
|
|
END DO |
994 |
|
|
DO k = 2, klev - 1 |
995 |
|
|
DO ig = 1, ngrid |
996 |
|
|
zq = sqrt(q2(ig,k)) |
997 |
|
|
sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1)) |
998 |
|
|
sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1)) |
999 |
|
|
END DO |
1000 |
|
|
END DO |
1001 |
|
|
DO ig = 1, ngrid |
1002 |
|
|
l0(ig) = 0.2*sqz(ig)/sq(ig) |
1003 |
|
|
END DO |
1004 |
|
|
DO k = 2, klev |
1005 |
|
|
DO ig = 1, ngrid |
1006 |
|
|
l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k)) |
1007 |
|
|
END DO |
1008 |
|
|
END DO |
1009 |
|
|
|
1010 |
|
|
ELSE |
1011 |
|
|
|
1012 |
|
|
|
1013 |
|
|
! In all other case, the assymptotic mixing length l0 is imposed (150m) |
1014 |
|
|
!...................................................................... |
1015 |
|
|
|
1016 |
✓✓ |
473954 |
l0(1:ngrid) = 150. |
1017 |
✓✓ |
44928 |
DO k = 2, klev |
1018 |
✓✓ |
18011404 |
DO ig = 1, ngrid |
1019 |
|
18010252 |
l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k)) |
1020 |
|
|
END DO |
1021 |
|
|
END DO |
1022 |
|
|
|
1023 |
|
|
END IF |
1024 |
|
|
|
1025 |
|
|
!=========================================================================================== |
1026 |
|
|
! CALCUL d'une longueur de melange minimum en fonctions de la topographie sous maille: l2 |
1027 |
|
|
! si pbl_lmixmin_alpha=TRUE et si on se trouve sur de la terre ( pas actif sur les |
1028 |
|
|
! glacier, la glace de mer et les oc??ans) |
1029 |
|
|
!=========================================================================================== |
1030 |
|
|
|
1031 |
✓✓✓✓
|
18959312 |
l2(1:ngrid,:)=0.0 |
1032 |
✓✓✓✓
|
18959312 |
l_mixmin(1:ngrid,:,nsrf)=0. |
1033 |
✓✓✓✓
|
18959312 |
l_mix(1:ngrid,:,nsrf)=0. |
1034 |
✓✓ |
473954 |
hlim(1:ngrid)=0. |
1035 |
|
|
|
1036 |
✓✓ |
1152 |
IF (nsrf .EQ. 1) THEN |
1037 |
|
|
|
1038 |
|
|
! coefficients |
1039 |
|
|
!-------------- |
1040 |
|
|
|
1041 |
|
|
extent=2. ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. |
1042 |
|
|
lmax=150. ! Longueur de m??lange max dans l'absolu |
1043 |
|
|
|
1044 |
|
|
! calculs |
1045 |
|
|
!--------- |
1046 |
|
|
|
1047 |
✓✓ |
148896 |
DO ig=1,ngrid |
1048 |
|
|
|
1049 |
|
|
! On calcule la hauteur du relief |
1050 |
|
|
!................................. |
1051 |
|
|
! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille |
1052 |
|
|
! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon) |
1053 |
|
|
! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief |
1054 |
|
|
! (en gros, une maille de taille xcell avec une pente constante zstdslope) |
1055 |
|
148608 |
jg=ni(ig) |
1056 |
|
|
! IF (zsig(jg) .EQ. 0.) THEN |
1057 |
|
|
! zstdslope(ig)=0. |
1058 |
|
|
! ELSE |
1059 |
|
|
! xcell=sqrt(cell_area(jg)) |
1060 |
|
|
! zstdslope(ig)=max((xcell*zsig(jg)-zmea(jg))**3 /(3.*zsig(jg)),0.) |
1061 |
|
|
! zstdslope(ig)=sqrt(zstdslope(ig)) |
1062 |
|
|
! END IF |
1063 |
|
|
|
1064 |
|
|
! h_oro(ig)=max(zstd(jg)-zstdslope(ig),0.) ! Hauteur du relief |
1065 |
|
148608 |
h_oro(ig)=zstd(jg) |
1066 |
|
148896 |
hlim(ig)=extent*h_oro(ig) |
1067 |
|
|
ENDDO |
1068 |
|
|
|
1069 |
✓✓ |
148896 |
l2limit(1:ngrid)=0. |
1070 |
|
|
|
1071 |
✓✓ |
11232 |
DO k=2,klev |
1072 |
✓✓ |
5658336 |
DO ig=1,ngrid |
1073 |
|
5647104 |
winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2) |
1074 |
✓✓ |
5658048 |
IF (zlev(ig,k) .LE. h_oro(ig)) THEN ! sous l'orographie |
1075 |
|
271872 |
l2strat= kapb*pbl_lmixmin_alpha*winds(ig,k)/sqrt(max(n2(ig,k),1.E-10)) ! si stratifi??, amplitude d'oscillation * kappab (voir Van de Wiel et al 2008) |
1076 |
|
271872 |
l2neutre=kap*zlev(ig,k)*h_oro(ig)/(kap*zlev(ig,k)+h_oro(ig)) ! Dans le cas neutre, formule de blackadar. tend asymptotiquement vers h |
1077 |
|
271872 |
l2neutre=MIN(l2neutre,lmax) ! On majore par lmax |
1078 |
|
271872 |
l2limit(ig)=MIN(l2neutre,l2strat) ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e) |
1079 |
|
271872 |
l2(ig,k)=l2limit(ig) |
1080 |
|
|
|
1081 |
✓✓ |
5375232 |
ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles |
1082 |
|
|
|
1083 |
|
|
! Au dessus des montagnes, on prend la l2limit au sommet des montagnes |
1084 |
|
|
! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z) |
1085 |
|
|
! et on multiplie l2limit par une fonction qui d??croit entre h et hlim |
1086 |
|
152451 |
l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig)) |
1087 |
|
|
ELSE ! Au dessus de extent*h, on prend l2=l0 |
1088 |
|
5222781 |
l2(ig,k)=0. |
1089 |
|
|
END IF |
1090 |
|
|
ENDDO |
1091 |
|
|
ENDDO |
1092 |
|
|
ENDIF ! pbl_lmixmin_alpha |
1093 |
|
|
|
1094 |
|
|
!================================================================================== |
1095 |
|
|
! On prend le max entre la longueur de melange de blackadar et celle calcul??e |
1096 |
|
|
! en fonction de la topographie |
1097 |
|
|
!=================================================================================== |
1098 |
|
|
|
1099 |
|
|
|
1100 |
✓✓ |
47232 |
DO k=1,klev+1 |
1101 |
✓✓ |
18959312 |
DO ig=1,ngrid |
1102 |
|
18958160 |
lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin) |
1103 |
|
|
ENDDO |
1104 |
|
|
ENDDO |
1105 |
|
|
|
1106 |
|
|
! Diagnostics |
1107 |
|
|
|
1108 |
✓✓ |
47232 |
DO k=1,klev+1 |
1109 |
✓✓ |
18959312 |
DO ig=1,ngrid |
1110 |
|
18912080 |
jg=ni(ig) |
1111 |
|
18912080 |
l_mix(jg,k,nsrf)=lmix(ig,k) |
1112 |
|
18958160 |
l_mixmin(jg,k,nsrf)=MAX(l2(ig,k),lmixmin) |
1113 |
|
|
ENDDO |
1114 |
|
|
ENDDO |
1115 |
|
|
|
1116 |
|
|
|
1117 |
|
|
|
1118 |
|
1152 |
END SUBROUTINE mixinglength |