GCC Code Coverage Report


Directory: ./
File: phys/orografi.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 499 0.0%
Branches: 0 326 0.0%

Line Branch Exec Source
1
2 ! $Id: orografi.F90 2357 2015-08-31 16:25:19Z lguez $
3
4 ✗ SUBROUTINE drag_noro(nlon, nlev, dtime, paprs, pplay, pmea, pstd, psig, pgam, &
5 ✗ pthe, ppic, pval, kgwd, kdx, ktest, t, u, v, pulow, pvlow, pustr, pvstr, &
6 ✗ d_t, d_u, d_v)
7
8 USE dimphy
9 IMPLICIT NONE
10 ! ======================================================================
11 ! Auteur(s): F.Lott (LMD/CNRS) date: 19950201
12 ! Objet: Frottement de la montagne Interface
13 ! ======================================================================
14 ! Arguments:
15 ! dtime---input-R- pas d'integration (s)
16 ! paprs---input-R-pression pour chaque inter-couche (en Pa)
17 ! pplay---input-R-pression pour le mileu de chaque couche (en Pa)
18 ! t-------input-R-temperature (K)
19 ! u-------input-R-vitesse horizontale (m/s)
20 ! v-------input-R-vitesse horizontale (m/s)
21
22 ! d_t-----output-R-increment de la temperature
23 ! d_u-----output-R-increment de la vitesse u
24 ! d_v-----output-R-increment de la vitesse v
25 ! ======================================================================
26 include "YOMCST.h"
27
28 ! ARGUMENTS
29
30 INTEGER nlon, nlev
31 REAL dtime
32 REAL paprs(klon, klev+1)
33 REAL pplay(klon, klev)
34 REAL pmea(nlon), pstd(nlon), psig(nlon), pgam(nlon), pthe(nlon)
35 REAL ppic(nlon), pval(nlon)
36 REAL pulow(nlon), pvlow(nlon), pustr(nlon), pvstr(nlon)
37 REAL t(nlon, nlev), u(nlon, nlev), v(nlon, nlev)
38 REAL d_t(nlon, nlev), d_u(nlon, nlev), d_v(nlon, nlev)
39
40 INTEGER i, k, kgwd, kdx(nlon), ktest(nlon)
41
42 ! Variables locales:
43
44 ✗ REAL zgeom(klon, klev)
45 ✗ REAL pdtdt(klon, klev), pdudt(klon, klev), pdvdt(klon, klev)
46 ✗ REAL pt(klon, klev), pu(klon, klev), pv(klon, klev)
47 ✗ REAL papmf(klon, klev), papmh(klon, klev+1)
48
49 ! initialiser les variables de sortie (pour securite)
50
51 ✗ DO i = 1, klon
52 ✗ pulow(i) = 0.0
53 ✗ pvlow(i) = 0.0
54 ✗ pustr(i) = 0.0
55 ✗ pvstr(i) = 0.0
56 END DO
57 ✗ DO k = 1, klev
58 ✗ DO i = 1, klon
59 ✗ d_t(i, k) = 0.0
60 ✗ d_u(i, k) = 0.0
61 ✗ d_v(i, k) = 0.0
62 ✗ pdudt(i, k) = 0.0
63 ✗ pdvdt(i, k) = 0.0
64 ✗ pdtdt(i, k) = 0.0
65 END DO
66 END DO
67
68 ! preparer les variables d'entree (attention: l'ordre des niveaux
69 ! verticaux augmente du haut vers le bas)
70
71 ✗ DO k = 1, klev
72 ✗ DO i = 1, klon
73 ✗ pt(i, k) = t(i, klev-k+1)
74 ✗ pu(i, k) = u(i, klev-k+1)
75 ✗ pv(i, k) = v(i, klev-k+1)
76 ✗ papmf(i, k) = pplay(i, klev-k+1)
77 END DO
78 END DO
79 ✗ DO k = 1, klev + 1
80 ✗ DO i = 1, klon
81 ✗ papmh(i, k) = paprs(i, klev-k+2)
82 END DO
83 END DO
84 ✗ DO i = 1, klon
85 ✗ zgeom(i, klev) = rd*pt(i, klev)*log(papmh(i,klev+1)/papmf(i,klev))
86 END DO
87 ✗ DO k = klev - 1, 1, -1
88 ✗ DO i = 1, klon
89 zgeom(i, k) = zgeom(i, k+1) + rd*(pt(i,k)+pt(i,k+1))/2.0*log(papmf(i,k+ &
90 ✗ 1)/papmf(i,k))
91 END DO
92 END DO
93
94 ! appeler la routine principale
95
96 CALL orodrag(klon, klev, kgwd, kdx, ktest, dtime, papmh, papmf, zgeom, pt, &
97 pu, pv, pmea, pstd, psig, pgam, pthe, ppic, pval, pulow, pvlow, pdudt, &
98 ✗ pdvdt, pdtdt)
99
100 ✗ DO k = 1, klev
101 ✗ DO i = 1, klon
102 ✗ d_u(i, klev+1-k) = dtime*pdudt(i, k)
103 ✗ d_v(i, klev+1-k) = dtime*pdvdt(i, k)
104 ✗ d_t(i, klev+1-k) = dtime*pdtdt(i, k)
105 pustr(i) = pustr(i) & ! IM BUG .
106 ! +rg*pdudt(i,k)*(papmh(i,k+1)-papmh(i,k))
107 ✗ +pdudt(i, k)*(papmh(i,k+1)-papmh(i,k))/rg
108 pvstr(i) = pvstr(i) & ! IM BUG .
109 ! +rg*pdvdt(i,k)*(papmh(i,k+1)-papmh(i,k))
110 ✗ +pdvdt(i, k)*(papmh(i,k+1)-papmh(i,k))/rg
111 END DO
112 END DO
113
114 ✗ RETURN
115 END SUBROUTINE drag_noro
116 ✗ SUBROUTINE orodrag(nlon, nlev, kgwd, kdx, ktest, ptsphy, paphm1, papm1, &
117 pgeom1, ptm1, pum1, pvm1, pmea, pstd, psig, pgamma, ptheta, ppic, pval &
118 ! outputs
119 ✗ , pulow, pvlow, pvom, pvol, pte)
120
121 ✗ USE dimphy
122 IMPLICIT NONE
123
124
125
126 ! **** *gwdrag* - does the gravity wave parametrization.
127
128 ! purpose.
129 ! --------
130
131 ! this routine computes the physical tendencies of the
132 ! prognostic variables u,v and t due to vertical transports by
133 ! subgridscale orographically excited gravity waves
134
135 ! ** interface.
136 ! ----------
137 ! called from *callpar*.
138
139 ! the routine takes its input from the long-term storage:
140 ! u,v,t and p at t-1.
141
142 ! explicit arguments :
143 ! --------------------
144 ! ==== inputs ===
145 ! ==== outputs ===
146
147 ! implicit arguments : none
148 ! --------------------
149
150 ! implicit logical (l)
151
152 ! method.
153 ! -------
154
155 ! externals.
156 ! ----------
157 INTEGER ismin, ismax
158 EXTERNAL ismin, ismax
159
160 ! reference.
161 ! ----------
162
163 ! author.
164 ! -------
165 ! m.miller + b.ritter e.c.m.w.f. 15/06/86.
166
167 ! f.lott + m. miller e.c.m.w.f. 22/11/94
168 ! -----------------------------------------------------------------------
169
170
171 include "YOMCST.h"
172 include "YOEGWD.h"
173 ! -----------------------------------------------------------------------
174
175 ! * 0.1 arguments
176 ! ---------
177
178
179 ! ym integer nlon, nlev, klevm1
180 INTEGER nlon, nlev
181 INTEGER kgwd, jl, ilevp1, jk, ji
182 REAL zdelp, ztemp, zforc, ztend
183 REAL rover, zb, zc, zconb, zabsv
184 REAL zzd1, ratio, zbet, zust, zvst, zdis
185 REAL pte(nlon, nlev), pvol(nlon, nlev), pvom(nlon, nlev), pulow(klon), &
186 pvlow(klon)
187 REAL pum1(nlon, nlev), pvm1(nlon, nlev), ptm1(nlon, nlev), pmea(nlon), &
188 pstd(nlon), psig(nlon), pgamma(nlon), ptheta(nlon), ppic(nlon), &
189 pval(nlon), pgeom1(nlon, nlev), papm1(nlon, nlev), paphm1(nlon, nlev+1)
190
191 INTEGER kdx(nlon), ktest(nlon)
192 ! -----------------------------------------------------------------------
193
194 ! * 0.2 local arrays
195 ! ------------
196 ✗ INTEGER isect(klon), icrit(klon), ikcrith(klon), ikenvh(klon), iknu(klon), &
197 ✗ iknu2(klon), ikcrit(klon), ikhlim(klon)
198
199 ✗ REAL ztau(klon, klev+1), ztauf(klon, klev+1), zstab(klon, klev+1), &
200 ✗ zvph(klon, klev+1), zrho(klon, klev+1), zri(klon, klev+1), &
201 ✗ zpsi(klon, klev+1), zzdep(klon, klev)
202 ✗ REAL zdudt(klon), zdvdt(klon), zdtdt(klon), zdedt(klon), zvidis(klon), &
203 ✗ znu(klon), zd1(klon), zd2(klon), zdmod(klon)
204 REAL ztmst, ptsphy, zrtmst
205
206 ! ------------------------------------------------------------------
207
208 ! * 1. initialization
209 ! --------------
210
211
212 ! ------------------------------------------------------------------
213
214 ! * 1.1 computational constants
215 ! -----------------------
216
217
218 ! ztmst=twodt
219 ! if(nstep.eq.nstart) ztmst=0.5*twodt
220 ! ym klevm1=klev-1
221 ✗ ztmst = ptsphy
222 zrtmst = 1./ztmst
223
224 ! ------------------------------------------------------------------
225
226 ! * 1.3 check whether row contains point for printing
227 ! ---------------------------------------------
228
229
230 ! ------------------------------------------------------------------
231
232 ! * 2. precompute basic state variables.
233 ! * ---------- ----- ----- ----------
234 ! * define low level wind, project winds in plane of
235 ! * low level wind, determine sector in which to take
236 ! * the variance and set indicator for critical levels.
237
238
239
240
241 CALL orosetup(nlon, ktest, ikcrit, ikcrith, icrit, ikenvh, iknu, iknu2, &
242 paphm1, papm1, pum1, pvm1, ptm1, pgeom1, pstd, zrho, zri, zstab, ztau, &
243 zvph, zpsi, zzdep, pulow, pvlow, ptheta, pgamma, pmea, ppic, pval, znu, &
244 ✗ zd1, zd2, zdmod)
245
246 ! ***********************************************************
247
248
249 ! * 3. compute low level stresses using subcritical and
250 ! * supercritical forms.computes anisotropy coefficient
251 ! * as measure of orographic twodimensionality.
252
253
254 CALL gwstress(nlon, nlev, ktest, icrit, ikenvh, iknu, zrho, zstab, zvph, &
255 ✗ pstd, psig, pmea, ppic, ztau, pgeom1, zdmod)
256
257 ! * 4. compute stress profile.
258 ! * ------- ------ --------
259
260
261
262 CALL gwprofil(nlon, nlev, kgwd, kdx, ktest, ikcrith, icrit, paphm1, zrho, &
263 ✗ zstab, zvph, zri, ztau, zdmod, psig, pstd)
264
265 ! * 5. compute tendencies.
266 ! * -------------------
267
268
269 ! explicit solution at all levels for the gravity wave
270 ! implicit solution for the blocked levels
271
272 ✗ DO jl = kidia, kfdia
273 ✗ zvidis(jl) = 0.0
274 ✗ zdudt(jl) = 0.0
275 ✗ zdvdt(jl) = 0.0
276 ✗ zdtdt(jl) = 0.0
277 END DO
278
279 ✗ ilevp1 = klev + 1
280
281
282 ✗ DO jk = 1, klev
283
284
285 ! do 523 jl=1,kgwd
286 ! ji=kdx(jl)
287 ! Modif vectorisation 02/04/2004
288 ✗ DO ji = kidia, kfdia
289 ✗ IF (ktest(ji)==1) THEN
290
291 ✗ zdelp = paphm1(ji, jk+1) - paphm1(ji, jk)
292 ✗ ztemp = -rg*(ztau(ji,jk+1)-ztau(ji,jk))/(zvph(ji,ilevp1)*zdelp)
293 ✗ zdudt(ji) = (pulow(ji)*zd1(ji)-pvlow(ji)*zd2(ji))*ztemp/zdmod(ji)
294 ✗ zdvdt(ji) = (pvlow(ji)*zd1(ji)+pulow(ji)*zd2(ji))*ztemp/zdmod(ji)
295
296 ! controle des overshoots:
297
298 ✗ zforc = sqrt(zdudt(ji)**2+zdvdt(ji)**2) + 1.E-12
299 ✗ ztend = sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/ztmst + 1.E-12
300 rover = 0.25
301 ✗ IF (zforc>=rover*ztend) THEN
302 ✗ zdudt(ji) = rover*ztend/zforc*zdudt(ji)
303 ✗ zdvdt(ji) = rover*ztend/zforc*zdvdt(ji)
304 END IF
305
306 ! fin du controle des overshoots
307
308 ✗ IF (jk>=ikenvh(ji)) THEN
309 ✗ zb = 1.0 - 0.18*pgamma(ji) - 0.04*pgamma(ji)**2
310 ✗ zc = 0.48*pgamma(ji) + 0.3*pgamma(ji)**2
311 ✗ zconb = 2.*ztmst*gkwake*psig(ji)/(4.*pstd(ji))
312 ✗ zabsv = sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/2.
313 ✗ zzd1 = zb*cos(zpsi(ji,jk))**2 + zc*sin(zpsi(ji,jk))**2
314 ratio = (cos(zpsi(ji,jk))**2+pgamma(ji)*sin(zpsi(ji, &
315 ✗ jk))**2)/(pgamma(ji)*cos(zpsi(ji,jk))**2+sin(zpsi(ji,jk))**2)
316 ✗ zbet = max(0., 2.-1./ratio)*zconb*zzdep(ji, jk)*zzd1*zabsv
317
318 ! simplement oppose au vent
319
320 ✗ zdudt(ji) = -pum1(ji, jk)/ztmst
321 ✗ zdvdt(ji) = -pvm1(ji, jk)/ztmst
322
323 ! projection dans la direction de l'axe principal de l'orographie
324 ! mod zdudt(ji)=-(pum1(ji,jk)*cos(ptheta(ji)*rpi/180.)
325 ! mod * +pvm1(ji,jk)*sin(ptheta(ji)*rpi/180.))
326 ! mod * *cos(ptheta(ji)*rpi/180.)/ztmst
327 ! mod zdvdt(ji)=-(pum1(ji,jk)*cos(ptheta(ji)*rpi/180.)
328 ! mod * +pvm1(ji,jk)*sin(ptheta(ji)*rpi/180.))
329 ! mod * *sin(ptheta(ji)*rpi/180.)/ztmst
330 ✗ zdudt(ji) = zdudt(ji)*(zbet/(1.+zbet))
331 ✗ zdvdt(ji) = zdvdt(ji)*(zbet/(1.+zbet))
332 END IF
333 ✗ pvom(ji, jk) = zdudt(ji)
334 ✗ pvol(ji, jk) = zdvdt(ji)
335 ✗ zust = pum1(ji, jk) + ztmst*zdudt(ji)
336 ✗ zvst = pvm1(ji, jk) + ztmst*zdvdt(ji)
337 ✗ zdis = 0.5*(pum1(ji,jk)**2+pvm1(ji,jk)**2-zust**2-zvst**2)
338 ✗ zdedt(ji) = zdis/ztmst
339 ✗ zvidis(ji) = zvidis(ji) + zdis*zdelp
340 ✗ zdtdt(ji) = zdedt(ji)/rcpd
341 ! pte(ji,jk)=zdtdt(ji)
342
343 ! ENCORE UN TRUC POUR EVITER LES EXPLOSIONS
344
345 ✗ pte(ji, jk) = 0.0
346
347 END IF
348 END DO
349
350 END DO
351
352
353 ✗ RETURN
354 END SUBROUTINE orodrag
355 ✗ SUBROUTINE orosetup(nlon, ktest, kkcrit, kkcrith, kcrit, kkenvh, kknu, kknu2, &
356 ✗ paphm1, papm1, pum1, pvm1, ptm1, pgeom1, pstd, prho, pri, pstab, ptau, &
357 ✗ pvph, ppsi, pzdep, pulow, pvlow, ptheta, pgamma, pmea, ppic, pval, pnu, &
358 pd1, pd2, pdmod)
359
360 ! **** *gwsetup*
361
362 ! purpose.
363 ! --------
364
365 ! ** interface.
366 ! ----------
367 ! from *orodrag*
368
369 ! explicit arguments :
370 ! --------------------
371 ! ==== inputs ===
372 ! ==== outputs ===
373
374 ! implicit arguments : none
375 ! --------------------
376
377 ! method.
378 ! -------
379
380
381 ! externals.
382 ! ----------
383
384
385 ! reference.
386 ! ----------
387
388 ! see ecmwf research department documentation of the "i.f.s."
389
390 ! author.
391 ! -------
392
393 ! modifications.
394 ! --------------
395 ! f.lott for the new-gwdrag scheme november 1993
396
397 ! -----------------------------------------------------------------------
398 USE dimphy
399 IMPLICIT NONE
400
401
402 include "YOMCST.h"
403 include "YOEGWD.h"
404
405 ! -----------------------------------------------------------------------
406
407 ! * 0.1 arguments
408 ! ---------
409
410 INTEGER nlon
411 INTEGER jl, jk
412 REAL zdelp
413
414 INTEGER kkcrit(nlon), kkcrith(nlon), kcrit(nlon), ktest(nlon), kkenvh(nlon)
415
416
417 REAL paphm1(nlon, klev+1), papm1(nlon, klev), pum1(nlon, klev), &
418 pvm1(nlon, klev), ptm1(nlon, klev), pgeom1(nlon, klev), &
419 prho(nlon, klev+1), pri(nlon, klev+1), pstab(nlon, klev+1), &
420 ptau(nlon, klev+1), pvph(nlon, klev+1), ppsi(nlon, klev+1), &
421 pzdep(nlon, klev)
422 REAL pulow(nlon), pvlow(nlon), ptheta(nlon), pgamma(nlon), pnu(nlon), &
423 pd1(nlon), pd2(nlon), pdmod(nlon)
424 REAL pstd(nlon), pmea(nlon), ppic(nlon), pval(nlon)
425
426 ! -----------------------------------------------------------------------
427
428 ! * 0.2 local arrays
429 ! ------------
430
431
432 INTEGER ilevm1, ilevm2, ilevh
433 REAL zcons1, zcons2, zcons3, zhgeo
434 REAL zu, zphi, zvt1, zvt2, zst, zvar, zdwind, zwind
435 REAL zstabm, zstabp, zrhom, zrhop, alpha
436 REAL zggeenv, zggeom1, zgvar
437 LOGICAL lo
438 ✗ LOGICAL ll1(klon, klev+1)
439 ✗ INTEGER kknu(klon), kknu2(klon), kknub(klon), kknul(klon), kentp(klon), &
440 ✗ ncount(klon)
441
442 ✗ REAL zhcrit(klon, klev), zvpf(klon, klev), zdp(klon, klev)
443 ✗ REAL znorm(klon), zb(klon), zc(klon), zulow(klon), zvlow(klon), znup(klon), &
444 ✗ znum(klon)
445
446 ! ------------------------------------------------------------------
447
448 ! * 1. initialization
449 ! --------------
450
451 ! print *,' entree gwsetup'
452
453 ! ------------------------------------------------------------------
454
455 ! * 1.1 computational constants
456 ! -----------------------
457
458
459 ✗ ilevm1 = klev - 1
460 ilevm2 = klev - 2
461 ✗ ilevh = klev/3
462
463 ✗ zcons1 = 1./rd
464 ! old zcons2=g**2/cpd
465 ✗ zcons2 = rg**2/rcpd
466 ! old zcons3=1.5*api
467 zcons3 = 1.5*rpi
468
469 ! ------------------------------------------------------------------
470
471 ! * 2.
472 ! --------------
473
474
475 ! ------------------------------------------------------------------
476
477 ! * 2.1 define low level wind, project winds in plane of
478 ! * low level wind, determine sector in which to take
479 ! * the variance and set indicator for critical levels.
480
481
482
483 ✗ DO jl = kidia, kfdia
484 ✗ kknu(jl) = klev
485 ✗ kknu2(jl) = klev
486 ✗ kknub(jl) = klev
487 ✗ kknul(jl) = klev
488 ✗ pgamma(jl) = max(pgamma(jl), gtsec)
489 ✗ ll1(jl, klev+1) = .FALSE.
490 END DO
491
492 ! Ajouter une initialisation (L. Li, le 23fev99):
493
494 ✗ DO jk = klev, ilevh, -1
495 ✗ DO jl = kidia, kfdia
496 ✗ ll1(jl, jk) = .FALSE.
497 END DO
498 END DO
499
500 ! * define top of low level flow
501 ! ----------------------------
502 ✗ DO jk = klev, ilevh, -1
503 ✗ DO jl = kidia, kfdia
504 ✗ lo = (paphm1(jl,jk)/paphm1(jl,klev+1)) >= gsigcr
505 ✗ IF (lo) THEN
506 ✗ kkcrit(jl) = jk
507 END IF
508 ✗ zhcrit(jl, jk) = ppic(jl)
509 ✗ zhgeo = pgeom1(jl, jk)/rg
510 ✗ ll1(jl, jk) = (zhgeo>zhcrit(jl,jk))
511 ✗ IF (ll1(jl,jk) .NEQV. ll1(jl,jk+1)) THEN
512 ✗ kknu(jl) = jk
513 END IF
514 ✗ IF (.NOT. ll1(jl,ilevh)) kknu(jl) = ilevh
515 END DO
516 END DO
517 ✗ DO jk = klev, ilevh, -1
518 ✗ DO jl = kidia, kfdia
519 ✗ zhcrit(jl, jk) = ppic(jl) - pval(jl)
520 ✗ zhgeo = pgeom1(jl, jk)/rg
521 ✗ ll1(jl, jk) = (zhgeo>zhcrit(jl,jk))
522 ✗ IF (ll1(jl,jk) .NEQV. ll1(jl,jk+1)) THEN
523 ✗ kknu2(jl) = jk
524 END IF
525 ✗ IF (.NOT. ll1(jl,ilevh)) kknu2(jl) = ilevh
526 END DO
527 END DO
528 ✗ DO jk = klev, ilevh, -1
529 ✗ DO jl = kidia, kfdia
530 ✗ zhcrit(jl, jk) = amax1(ppic(jl)-pmea(jl), pmea(jl)-pval(jl))
531 ✗ zhgeo = pgeom1(jl, jk)/rg
532 ✗ ll1(jl, jk) = (zhgeo>zhcrit(jl,jk))
533 ✗ IF (ll1(jl,jk) .NEQV. ll1(jl,jk+1)) THEN
534 ✗ kknub(jl) = jk
535 END IF
536 ✗ IF (.NOT. ll1(jl,ilevh)) kknub(jl) = ilevh
537 END DO
538 END DO
539
540 ✗ DO jl = kidia, kfdia
541 ✗ kknu(jl) = min(kknu(jl), nktopg)
542 ✗ kknu2(jl) = min(kknu2(jl), nktopg)
543 ✗ kknub(jl) = min(kknub(jl), nktopg)
544 ✗ kknul(jl) = klev
545 END DO
546
547 ! c* initialize various arrays
548
549 ✗ DO jl = kidia, kfdia
550 ✗ prho(jl, klev+1) = 0.0
551 ✗ pstab(jl, klev+1) = 0.0
552 ✗ pstab(jl, 1) = 0.0
553 ✗ pri(jl, klev+1) = 9999.0
554 ✗ ppsi(jl, klev+1) = 0.0
555 ✗ pri(jl, 1) = 0.0
556 ✗ pvph(jl, 1) = 0.0
557 ✗ pulow(jl) = 0.0
558 ✗ pvlow(jl) = 0.0
559 ✗ zulow(jl) = 0.0
560 ✗ zvlow(jl) = 0.0
561 ✗ kkcrith(jl) = klev
562 ✗ kkenvh(jl) = klev
563 ✗ kentp(jl) = klev
564 ✗ kcrit(jl) = 1
565 ✗ ncount(jl) = 0
566 ✗ ll1(jl, klev+1) = .FALSE.
567 END DO
568
569 ! * define low-level flow
570 ! ---------------------
571
572 ✗ DO jk = klev, 2, -1
573 ✗ DO jl = kidia, kfdia
574 ✗ IF (ktest(jl)==1) THEN
575 ✗ zdp(jl, jk) = papm1(jl, jk) - papm1(jl, jk-1)
576 ✗ prho(jl, jk) = 2.*paphm1(jl, jk)*zcons1/(ptm1(jl,jk)+ptm1(jl,jk-1))
577 pstab(jl, jk) = 2.*zcons2/(ptm1(jl,jk)+ptm1(jl,jk-1))* &
578 ✗ (1.-rcpd*prho(jl,jk)*(ptm1(jl,jk)-ptm1(jl,jk-1))/zdp(jl,jk))
579 ✗ pstab(jl, jk) = max(pstab(jl,jk), gssec)
580 END IF
581 END DO
582 END DO
583
584 ! ********************************************************************
585
586 ! * define blocked flow
587 ! -------------------
588 ✗ DO jk = klev, ilevh, -1
589 ✗ DO jl = kidia, kfdia
590 ✗ IF (jk>=kknub(jl) .AND. jk<=kknul(jl)) THEN
591 ✗ pulow(jl) = pulow(jl) + pum1(jl, jk)*(paphm1(jl,jk+1)-paphm1(jl,jk))
592 ✗ pvlow(jl) = pvlow(jl) + pvm1(jl, jk)*(paphm1(jl,jk+1)-paphm1(jl,jk))
593 END IF
594 END DO
595 END DO
596 ✗ DO jl = kidia, kfdia
597 ✗ pulow(jl) = pulow(jl)/(paphm1(jl,kknul(jl)+1)-paphm1(jl,kknub(jl)))
598 ✗ pvlow(jl) = pvlow(jl)/(paphm1(jl,kknul(jl)+1)-paphm1(jl,kknub(jl)))
599 ✗ znorm(jl) = max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
600 ✗ pvph(jl, klev+1) = znorm(jl)
601 END DO
602
603 ! ******* setup orography axes and define plane of profiles *******
604
605 ✗ DO jl = kidia, kfdia
606 ✗ lo = (pulow(jl)<gvsec) .AND. (pulow(jl)>=-gvsec)
607 IF (lo) THEN
608 ✗ zu = pulow(jl) + 2.*gvsec
609 ELSE
610 zu = pulow(jl)
611 END IF
612 ✗ zphi = atan(pvlow(jl)/zu)
613 ✗ ppsi(jl, klev+1) = ptheta(jl)*rpi/180. - zphi
614 ✗ zb(jl) = 1. - 0.18*pgamma(jl) - 0.04*pgamma(jl)**2
615 ✗ zc(jl) = 0.48*pgamma(jl) + 0.3*pgamma(jl)**2
616 ✗ pd1(jl) = zb(jl) - (zb(jl)-zc(jl))*(sin(ppsi(jl,klev+1))**2)
617 ✗ pd2(jl) = (zb(jl)-zc(jl))*sin(ppsi(jl,klev+1))*cos(ppsi(jl,klev+1))
618 ✗ pdmod(jl) = sqrt(pd1(jl)**2+pd2(jl)**2)
619 END DO
620
621 ! ************ define flow in plane of lowlevel stress *************
622
623 ✗ DO jk = 1, klev
624 ✗ DO jl = kidia, kfdia
625 ✗ IF (ktest(jl)==1) THEN
626 ✗ zvt1 = pulow(jl)*pum1(jl, jk) + pvlow(jl)*pvm1(jl, jk)
627 ✗ zvt2 = -pvlow(jl)*pum1(jl, jk) + pulow(jl)*pvm1(jl, jk)
628 ✗ zvpf(jl, jk) = (zvt1*pd1(jl)+zvt2*pd2(jl))/(znorm(jl)*pdmod(jl))
629 END IF
630 ✗ ptau(jl, jk) = 0.0
631 ✗ pzdep(jl, jk) = 0.0
632 ✗ ppsi(jl, jk) = 0.0
633 ✗ ll1(jl, jk) = .FALSE.
634 END DO
635 END DO
636 ✗ DO jk = 2, klev
637 ✗ DO jl = kidia, kfdia
638 ✗ IF (ktest(jl)==1) THEN
639 ✗ zdp(jl, jk) = papm1(jl, jk) - papm1(jl, jk-1)
640 pvph(jl, jk) = ((paphm1(jl,jk)-papm1(jl,jk-1))*zvpf(jl,jk)+(papm1(jl, &
641 ✗ jk)-paphm1(jl,jk))*zvpf(jl,jk-1))/zdp(jl, jk)
642 ✗ IF (pvph(jl,jk)<gvsec) THEN
643 ✗ pvph(jl, jk) = gvsec
644 ✗ kcrit(jl) = jk
645 END IF
646 END IF
647 END DO
648 END DO
649
650 ! * 2.2 brunt-vaisala frequency and density at half levels.
651
652
653 ✗ DO jk = ilevh, klev
654 ✗ DO jl = kidia, kfdia
655 ✗ IF (ktest(jl)==1) THEN
656 ✗ IF (jk>=(kknub(jl)+1) .AND. jk<=kknul(jl)) THEN
657 zst = zcons2/ptm1(jl, jk)*(1.-rcpd*prho(jl,jk)*(ptm1(jl, &
658 ✗ jk)-ptm1(jl,jk-1))/zdp(jl,jk))
659 ✗ pstab(jl, klev+1) = pstab(jl, klev+1) + zst*zdp(jl, jk)
660 ✗ pstab(jl, klev+1) = max(pstab(jl,klev+1), gssec)
661 prho(jl, klev+1) = prho(jl, klev+1) + paphm1(jl, jk)*2.*zdp(jl, jk) &
662 ✗ *zcons1/(ptm1(jl,jk)+ptm1(jl,jk-1))
663 END IF
664 END IF
665 END DO
666 END DO
667
668 ✗ DO jl = kidia, kfdia
669 pstab(jl, klev+1) = pstab(jl, klev+1)/(papm1(jl,kknul(jl))-papm1(jl,kknub &
670 ✗ (jl)))
671 prho(jl, klev+1) = prho(jl, klev+1)/(papm1(jl,kknul(jl))-papm1(jl,kknub( &
672 ✗ jl)))
673 ✗ zvar = pstd(jl)
674 END DO
675
676 ! * 2.3 mean flow richardson number.
677 ! * and critical height for froude layer
678
679
680 ✗ DO jk = 2, klev
681 ✗ DO jl = kidia, kfdia
682 ✗ IF (ktest(jl)==1) THEN
683 ✗ zdwind = max(abs(zvpf(jl,jk)-zvpf(jl,jk-1)), gvsec)
684 ✗ pri(jl, jk) = pstab(jl, jk)*(zdp(jl,jk)/(rg*prho(jl,jk)*zdwind))**2
685 ✗ pri(jl, jk) = max(pri(jl,jk), grcrit)
686 END IF
687 END DO
688 END DO
689
690
691
692 ! * define top of 'envelope' layer
693 ! ----------------------------
694
695 ✗ DO jl = kidia, kfdia
696 ✗ pnu(jl) = 0.0
697 ✗ znum(jl) = 0.0
698 END DO
699
700 ✗ DO jk = 2, klev - 1
701 ✗ DO jl = kidia, kfdia
702
703 ✗ IF (ktest(jl)==1) THEN
704
705 ✗ IF (jk>=kknub(jl)) THEN
706
707 ✗ znum(jl) = pnu(jl)
708 zwind = (pulow(jl)*pum1(jl,jk)+pvlow(jl)*pvm1(jl,jk))/ &
709 ✗ max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
710 ✗ zwind = max(sqrt(zwind**2), gvsec)
711 ✗ zdelp = paphm1(jl, jk+1) - paphm1(jl, jk)
712 ✗ zstabm = sqrt(max(pstab(jl,jk),gssec))
713 ✗ zstabp = sqrt(max(pstab(jl,jk+1),gssec))
714 ✗ zrhom = prho(jl, jk)
715 ✗ zrhop = prho(jl, jk+1)
716 pnu(jl) = pnu(jl) + (zdelp/rg)*((zstabp/zrhop+zstabm/zrhom)/2.)/ &
717 ✗ zwind
718 ✗ IF ((znum(jl)<=gfrcrit) .AND. (pnu(jl)>gfrcrit) .AND. (kkenvh( &
719 ✗ jl)==klev)) kkenvh(jl) = jk
720
721 END IF
722
723 END IF
724
725 END DO
726 END DO
727
728 ! calculation of a dynamical mixing height for the breaking
729 ! of gravity waves:
730
731
732 ✗ DO jl = kidia, kfdia
733 ✗ znup(jl) = 0.0
734 ✗ znum(jl) = 0.0
735 END DO
736
737 ✗ DO jk = klev - 1, 2, -1
738 ✗ DO jl = kidia, kfdia
739
740 ✗ IF (ktest(jl)==1) THEN
741
742 ✗ znum(jl) = znup(jl)
743 zwind = (pulow(jl)*pum1(jl,jk)+pvlow(jl)*pvm1(jl,jk))/ &
744 ✗ max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
745 ✗ zwind = max(sqrt(zwind**2), gvsec)
746 ✗ zdelp = paphm1(jl, jk+1) - paphm1(jl, jk)
747 ✗ zstabm = sqrt(max(pstab(jl,jk),gssec))
748 ✗ zstabp = sqrt(max(pstab(jl,jk+1),gssec))
749 ✗ zrhom = prho(jl, jk)
750 ✗ zrhop = prho(jl, jk+1)
751 znup(jl) = znup(jl) + (zdelp/rg)*((zstabp/zrhop+zstabm/zrhom)/2.)/ &
752 ✗ zwind
753 ✗ IF ((znum(jl)<=rpi/2.) .AND. (znup(jl)>rpi/2.) .AND. (kkcrith( &
754 ✗ jl)==klev)) kkcrith(jl) = jk
755
756 END IF
757
758 END DO
759 END DO
760
761 ✗ DO jl = kidia, kfdia
762 ✗ kkcrith(jl) = min0(kkcrith(jl), kknu2(jl))
763 ✗ kkcrith(jl) = max0(kkcrith(jl), ilevh*2)
764 END DO
765
766 ! directional info for flow blocking *************************
767
768 ✗ DO jk = ilevh, klev
769 ✗ DO jl = kidia, kfdia
770 ✗ IF (jk>=kkenvh(jl)) THEN
771 ✗ lo = (pum1(jl,jk)<gvsec) .AND. (pum1(jl,jk)>=-gvsec)
772 IF (lo) THEN
773 ✗ zu = pum1(jl, jk) + 2.*gvsec
774 ELSE
775 zu = pum1(jl, jk)
776 END IF
777 ✗ zphi = atan(pvm1(jl,jk)/zu)
778 ✗ ppsi(jl, jk) = ptheta(jl)*rpi/180. - zphi
779 END IF
780 END DO
781 END DO
782 ! forms the vertical 'leakiness' **************************
783
784 alpha = 3.
785
786 ✗ DO jk = ilevh, klev
787 ✗ DO jl = kidia, kfdia
788 ✗ IF (jk>=kkenvh(jl)) THEN
789 zggeenv = amax1(1., (pgeom1(jl,kkenvh(jl))+pgeom1(jl, &
790 ✗ kkenvh(jl)-1))/2.)
791 ✗ zggeom1 = amax1(pgeom1(jl,jk), 1.)
792 zgvar = amax1(pstd(jl)*rg, 1.)
793 ! mod pzdep(jl,jk)=sqrt((zggeenv-zggeom1)/(zggeom1+zgvar))
794 pzdep(jl, jk) = (pgeom1(jl,kkenvh(jl)-1)-pgeom1(jl,jk))/ &
795 ✗ (pgeom1(jl,kkenvh(jl)-1)-pgeom1(jl,klev))
796 END IF
797 END DO
798 END DO
799
800 ✗ RETURN
801 END SUBROUTINE orosetup
802 ✗ SUBROUTINE gwstress(nlon, nlev, ktest, kcrit, kkenvh, kknu, prho, pstab, &
803 ✗ pvph, pstd, psig, pmea, ppic, ptau, pgeom1, pdmod)
804
805 ! **** *gwstress*
806
807 ! purpose.
808 ! --------
809
810 ! ** interface.
811 ! ----------
812 ! call *gwstress* from *gwdrag*
813
814 ! explicit arguments :
815 ! --------------------
816 ! ==== inputs ===
817 ! ==== outputs ===
818
819 ! implicit arguments : none
820 ! --------------------
821
822 ! method.
823 ! -------
824
825
826 ! externals.
827 ! ----------
828
829
830 ! reference.
831 ! ----------
832
833 ! see ecmwf research department documentation of the "i.f.s."
834
835 ! author.
836 ! -------
837
838 ! modifications.
839 ! --------------
840 ! f. lott put the new gwd on ifs 22/11/93
841
842 ! -----------------------------------------------------------------------
843 ✗ USE dimphy
844 IMPLICIT NONE
845 include "YOMCST.h"
846 include "YOEGWD.h"
847
848 ! -----------------------------------------------------------------------
849
850 ! * 0.1 arguments
851 ! ---------
852
853 INTEGER nlon, nlev
854 INTEGER kcrit(nlon), ktest(nlon), kkenvh(nlon), kknu(nlon)
855
856 REAL prho(nlon, nlev+1), pstab(nlon, nlev+1), ptau(nlon, nlev+1), &
857 pvph(nlon, nlev+1), pgeom1(nlon, nlev), pstd(nlon)
858
859 REAL psig(nlon)
860 REAL pmea(nlon), ppic(nlon)
861 REAL pdmod(nlon)
862
863 ! -----------------------------------------------------------------------
864
865 ! * 0.2 local arrays
866 ! ------------
867 INTEGER jl
868 REAL zblock, zvar, zeff
869 LOGICAL lo
870
871 ! -----------------------------------------------------------------------
872
873 ! * 0.3 functions
874 ! ---------
875 ! ------------------------------------------------------------------
876
877 ! * 1. initialization
878 ! --------------
879
880
881 ! * 3.1 gravity wave stress.
882
883
884
885 ✗ DO jl = kidia, kfdia
886 ✗ IF (ktest(jl)==1) THEN
887
888 ! effective mountain height above the blocked flow
889
890 ✗ IF (kkenvh(jl)==klev) THEN
891 zblock = 0.0
892 ELSE
893 ✗ zblock = (pgeom1(jl,kkenvh(jl))+pgeom1(jl,kkenvh(jl)+1))/2./rg
894 END IF
895
896 ✗ zvar = ppic(jl) - pmea(jl)
897 ✗ zeff = amax1(0., zvar-zblock)
898
899 ptau(jl, klev+1) = prho(jl, klev+1)*gkdrag*psig(jl)*zeff**2/4./ &
900 ✗ pstd(jl)*pvph(jl, klev+1)*pdmod(jl)*sqrt(pstab(jl,klev+1))
901
902 ! too small value of stress or low level flow include critical level
903 ! or low level flow: gravity wave stress nul.
904
905 lo = (ptau(jl,klev+1)<gtsec) .OR. (kcrit(jl)>=kknu(jl)) .OR. &
906 (pvph(jl,klev+1)<gvcrit)
907 ! if(lo) ptau(jl,klev+1)=0.0
908
909 ELSE
910
911 ✗ ptau(jl, klev+1) = 0.0
912
913 END IF
914
915 END DO
916
917 ✗ RETURN
918 END SUBROUTINE gwstress
919 ✗ SUBROUTINE gwprofil(nlon, nlev, kgwd, kdx, ktest, kkcrith, kcrit, paphm1, &
920 ✗ prho, pstab, pvph, pri, ptau, pdmod, psig, pvar)
921
922 ! **** *GWPROFIL*
923
924 ! PURPOSE.
925 ! --------
926
927 ! ** INTERFACE.
928 ! ----------
929 ! FROM *GWDRAG*
930
931 ! EXPLICIT ARGUMENTS :
932 ! --------------------
933 ! ==== INPUTS ===
934 ! ==== OUTPUTS ===
935
936 ! IMPLICIT ARGUMENTS : NONE
937 ! --------------------
938
939 ! METHOD:
940 ! -------
941 ! THE STRESS PROFILE FOR GRAVITY WAVES IS COMPUTED AS FOLLOWS:
942 ! IT IS CONSTANT (NO GWD) AT THE LEVELS BETWEEN THE GROUND
943 ! AND THE TOP OF THE BLOCKED LAYER (KKENVH).
944 ! IT DECREASES LINEARLY WITH HEIGHTS FROM THE TOP OF THE
945 ! BLOCKED LAYER TO 3*VAROR (kKNU), TO SIMULATES LEE WAVES OR
946 ! NONLINEAR GRAVITY WAVE BREAKING.
947 ! ABOVE IT IS CONSTANT, EXCEPT WHEN THE WAVE ENCOUNTERS A CRITICAL
948 ! LEVEL (KCRIT) OR WHEN IT BREAKS.
949
950
951
952 ! EXTERNALS.
953 ! ----------
954
955
956 ! REFERENCE.
957 ! ----------
958
959 ! SEE ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE "I.F.S."
960
961 ! AUTHOR.
962 ! -------
963
964 ! MODIFICATIONS.
965 ! --------------
966 ! PASSAGE OF THE NEW GWDRAG TO I.F.S. (F. LOTT, 22/11/93)
967 ! -----------------------------------------------------------------------
968 ✗ USE dimphy
969 IMPLICIT NONE
970
971
972
973
974 include "YOMCST.h"
975 include "YOEGWD.h"
976
977 ! -----------------------------------------------------------------------
978
979 ! * 0.1 ARGUMENTS
980 ! ---------
981
982 INTEGER nlon, nlev
983 INTEGER kkcrith(nlon), kcrit(nlon), kdx(nlon), ktest(nlon)
984
985
986 REAL paphm1(nlon, nlev+1), pstab(nlon, nlev+1), prho(nlon, nlev+1), &
987 pvph(nlon, nlev+1), pri(nlon, nlev+1), ptau(nlon, nlev+1)
988
989 REAL pdmod(nlon), psig(nlon), pvar(nlon)
990
991 ! -----------------------------------------------------------------------
992
993 ! * 0.2 LOCAL ARRAYS
994 ! ------------
995
996 INTEGER ilevh, ji, kgwd, jl, jk
997 REAL zsqr, zalfa, zriw, zdel, zb, zalpha, zdz2n
998 REAL zdelp, zdelpt
999 ✗ REAL zdz2(klon, klev), znorm(klon), zoro(klon)
1000 ✗ REAL ztau(klon, klev+1)
1001
1002 ! -----------------------------------------------------------------------
1003
1004 ! * 1. INITIALIZATION
1005 ! --------------
1006
1007 ! print *,' entree gwprofil'
1008
1009
1010 ! * COMPUTATIONAL CONSTANTS.
1011 ! ------------- ----------
1012
1013 ilevh = klev/3
1014
1015 ! DO 400 ji=1,kgwd
1016 ! jl=kdx(ji)
1017 ! Modif vectorisation 02/04/2004
1018 ✗ DO jl = kidia, kfdia
1019 ✗ IF (ktest(jl)==1) THEN
1020 ✗ zoro(jl) = psig(jl)*pdmod(jl)/4./max(pvar(jl), 1.0)
1021 ✗ ztau(jl, klev+1) = ptau(jl, klev+1)
1022 END IF
1023 END DO
1024
1025
1026 ✗ DO jk = klev, 2, -1
1027
1028 ! * 4.1 CONSTANT WAVE STRESS UNTIL TOP OF THE
1029 ! BLOCKING LAYER.
1030
1031 ! DO 411 ji=1,kgwd
1032 ! jl=kdx(ji)
1033 ! Modif vectorisation 02/04/2004
1034 ✗ DO jl = kidia, kfdia
1035 ✗ IF (ktest(jl)==1) THEN
1036 ✗ IF (jk>kkcrith(jl)) THEN
1037 ✗ ptau(jl, jk) = ztau(jl, klev+1)
1038 ! ENDIF
1039 ! IF(JK.EQ.KKCRITH(JL)) THEN
1040 ELSE
1041 ✗ ptau(jl, jk) = grahilo*ztau(jl, klev+1)
1042 END IF
1043 END IF
1044 END DO
1045
1046 ! * 4.15 CONSTANT SHEAR STRESS UNTIL THE TOP OF THE
1047 ! LOW LEVEL FLOW LAYER.
1048
1049
1050 ! * 4.2 WAVE DISPLACEMENT AT NEXT LEVEL.
1051
1052
1053 ! DO 421 ji=1,kgwd
1054 ! jl=kdx(ji)
1055 ! Modif vectorisation 02/04/2004
1056 ✗ DO jl = kidia, kfdia
1057 ✗ IF (ktest(jl)==1) THEN
1058 ✗ IF (jk<kkcrith(jl)) THEN
1059 znorm(jl) = gkdrag*prho(jl, jk)*sqrt(pstab(jl,jk))*pvph(jl, jk)* &
1060 ✗ zoro(jl)
1061 ✗ zdz2(jl, jk) = ptau(jl, jk+1)/max(znorm(jl), gssec)
1062 END IF
1063 END IF
1064 END DO
1065
1066 ! * 4.3 WAVE RICHARDSON NUMBER, NEW WAVE DISPLACEMENT
1067 ! * AND STRESS: BREAKING EVALUATION AND CRITICAL
1068 ! LEVEL
1069
1070
1071 ! DO 431 ji=1,kgwd
1072 ! jl=Kdx(ji)
1073 ! Modif vectorisation 02/04/2004
1074 ✗ DO jl = kidia, kfdia
1075 ✗ IF (ktest(jl)==1) THEN
1076
1077 ✗ IF (jk<kkcrith(jl)) THEN
1078 ✗ IF ((ptau(jl,jk+1)<gtsec) .OR. (jk<=kcrit(jl))) THEN
1079 ✗ ptau(jl, jk) = 0.0
1080 ELSE
1081 ✗ zsqr = sqrt(pri(jl,jk))
1082 ✗ zalfa = sqrt(pstab(jl,jk)*zdz2(jl,jk))/pvph(jl, jk)
1083 ✗ zriw = pri(jl, jk)*(1.-zalfa)/(1+zalfa*zsqr)**2
1084 ✗ IF (zriw<grcrit) THEN
1085 ✗ zdel = 4./zsqr/grcrit + 1./grcrit**2 + 4./grcrit
1086 ✗ zb = 1./grcrit + 2./zsqr
1087 ✗ zalpha = 0.5*(-zb+sqrt(zdel))
1088 ✗ zdz2n = (pvph(jl,jk)*zalpha)**2/pstab(jl, jk)
1089 ✗ ptau(jl, jk) = znorm(jl)*zdz2n
1090 ELSE
1091 ✗ ptau(jl, jk) = znorm(jl)*zdz2(jl, jk)
1092 END IF
1093 ✗ ptau(jl, jk) = min(ptau(jl,jk), ptau(jl,jk+1))
1094 END IF
1095 END IF
1096 END IF
1097 END DO
1098
1099 END DO
1100
1101 ! REORGANISATION OF THE STRESS PROFILE AT LOW LEVEL
1102
1103 ! DO 530 ji=1,kgwd
1104 ! jl=kdx(ji)
1105 ! Modif vectorisation 02/04/2004
1106 ✗ DO jl = kidia, kfdia
1107 ✗ IF (ktest(jl)==1) THEN
1108 ✗ ztau(jl, kkcrith(jl)) = ptau(jl, kkcrith(jl))
1109 ✗ ztau(jl, nstra) = ptau(jl, nstra)
1110 END IF
1111 END DO
1112
1113 ✗ DO jk = 1, klev
1114
1115 ! DO 532 ji=1,kgwd
1116 ! jl=kdx(ji)
1117 ! Modif vectorisation 02/04/2004
1118 ✗ DO jl = kidia, kfdia
1119 ✗ IF (ktest(jl)==1) THEN
1120
1121
1122 ✗ IF (jk>kkcrith(jl)) THEN
1123
1124 ✗ zdelp = paphm1(jl, jk) - paphm1(jl, klev+1)
1125 ✗ zdelpt = paphm1(jl, kkcrith(jl)) - paphm1(jl, klev+1)
1126 ptau(jl, jk) = ztau(jl, klev+1) + (ztau(jl,kkcrith(jl))-ztau(jl, &
1127 ✗ klev+1))*zdelp/zdelpt
1128
1129 END IF
1130
1131 END IF
1132 END DO
1133
1134 ! REORGANISATION IN THE STRATOSPHERE
1135
1136 ! DO 533 ji=1,kgwd
1137 ! jl=kdx(ji)
1138 ! Modif vectorisation 02/04/2004
1139 ✗ DO jl = kidia, kfdia
1140 ✗ IF (ktest(jl)==1) THEN
1141
1142
1143 ✗ IF (jk<nstra) THEN
1144
1145 ✗ zdelp = paphm1(jl, nstra)
1146 ✗ zdelpt = paphm1(jl, jk)
1147 ✗ ptau(jl, jk) = ztau(jl, nstra)*zdelpt/zdelp
1148
1149 END IF
1150
1151 END IF
1152 END DO
1153
1154 ! REORGANISATION IN THE TROPOSPHERE
1155
1156 ! DO 534 ji=1,kgwd
1157 ! jl=kdx(ji)
1158 ! Modif vectorisation 02/04/2004
1159 ✗ DO jl = kidia, kfdia
1160 ✗ IF (ktest(jl)==1) THEN
1161
1162
1163 ✗ IF (jk<kkcrith(jl) .AND. jk>nstra) THEN
1164
1165 ✗ zdelp = paphm1(jl, jk) - paphm1(jl, kkcrith(jl))
1166 ✗ zdelpt = paphm1(jl, nstra) - paphm1(jl, kkcrith(jl))
1167 ptau(jl, jk) = ztau(jl, kkcrith(jl)) + (ztau(jl,nstra)-ztau(jl, &
1168 ✗ kkcrith(jl)))*zdelp/zdelpt
1169
1170 END IF
1171 END IF
1172 END DO
1173
1174
1175 END DO
1176
1177
1178 ✗ RETURN
1179 END SUBROUTINE gwprofil
1180 ✗ SUBROUTINE lift_noro(nlon, nlev, dtime, paprs, pplay, plat, pmea, pstd, ppic, &
1181 ✗ ktest, t, u, v, pulow, pvlow, pustr, pvstr, d_t, d_u, d_v)
1182
1183 USE dimphy
1184 IMPLICIT NONE
1185 ! ======================================================================
1186 ! Auteur(s): F.Lott (LMD/CNRS) date: 19950201
1187 ! Objet: Frottement de la montagne Interface
1188 ! ======================================================================
1189 ! Arguments:
1190 ! dtime---input-R- pas d'integration (s)
1191 ! paprs---input-R-pression pour chaque inter-couche (en Pa)
1192 ! pplay---input-R-pression pour le mileu de chaque couche (en Pa)
1193 ! t-------input-R-temperature (K)
1194 ! u-------input-R-vitesse horizontale (m/s)
1195 ! v-------input-R-vitesse horizontale (m/s)
1196
1197 ! d_t-----output-R-increment de la temperature
1198 ! d_u-----output-R-increment de la vitesse u
1199 ! d_v-----output-R-increment de la vitesse v
1200 ! ======================================================================
1201 include "YOMCST.h"
1202
1203 ! ARGUMENTS
1204
1205 INTEGER nlon, nlev
1206 REAL dtime
1207 REAL paprs(klon, klev+1)
1208 REAL pplay(klon, klev)
1209 REAL plat(nlon), pmea(nlon)
1210 REAL pstd(nlon)
1211 REAL ppic(nlon)
1212 REAL pulow(nlon), pvlow(nlon), pustr(nlon), pvstr(nlon)
1213 REAL t(nlon, nlev), u(nlon, nlev), v(nlon, nlev)
1214 REAL d_t(nlon, nlev), d_u(nlon, nlev), d_v(nlon, nlev)
1215
1216 INTEGER i, k, ktest(nlon)
1217
1218 ! Variables locales:
1219
1220 ✗ REAL zgeom(klon, klev)
1221 ✗ REAL pdtdt(klon, klev), pdudt(klon, klev), pdvdt(klon, klev)
1222 ✗ REAL pt(klon, klev), pu(klon, klev), pv(klon, klev)
1223 ✗ REAL papmf(klon, klev), papmh(klon, klev+1)
1224
1225 ! initialiser les variables de sortie (pour securite)
1226
1227 ✗ DO i = 1, klon
1228 ✗ pulow(i) = 0.0
1229 ✗ pvlow(i) = 0.0
1230 ✗ pustr(i) = 0.0
1231 ✗ pvstr(i) = 0.0
1232 END DO
1233 ✗ DO k = 1, klev
1234 ✗ DO i = 1, klon
1235 ✗ d_t(i, k) = 0.0
1236 ✗ d_u(i, k) = 0.0
1237 ✗ d_v(i, k) = 0.0
1238 ✗ pdudt(i, k) = 0.0
1239 ✗ pdvdt(i, k) = 0.0
1240 ✗ pdtdt(i, k) = 0.0
1241 END DO
1242 END DO
1243
1244 ! preparer les variables d'entree (attention: l'ordre des niveaux
1245 ! verticaux augmente du haut vers le bas)
1246
1247 ✗ DO k = 1, klev
1248 ✗ DO i = 1, klon
1249 ✗ pt(i, k) = t(i, klev-k+1)
1250 ✗ pu(i, k) = u(i, klev-k+1)
1251 ✗ pv(i, k) = v(i, klev-k+1)
1252 ✗ papmf(i, k) = pplay(i, klev-k+1)
1253 END DO
1254 END DO
1255 ✗ DO k = 1, klev + 1
1256 ✗ DO i = 1, klon
1257 ✗ papmh(i, k) = paprs(i, klev-k+2)
1258 END DO
1259 END DO
1260 ✗ DO i = 1, klon
1261 ✗ zgeom(i, klev) = rd*pt(i, klev)*log(papmh(i,klev+1)/papmf(i,klev))
1262 END DO
1263 ✗ DO k = klev - 1, 1, -1
1264 ✗ DO i = 1, klon
1265 zgeom(i, k) = zgeom(i, k+1) + rd*(pt(i,k)+pt(i,k+1))/2.0*log(papmf(i,k+ &
1266 ✗ 1)/papmf(i,k))
1267 END DO
1268 END DO
1269
1270 ! appeler la routine principale
1271
1272 CALL orolift(klon, klev, ktest, dtime, papmh, zgeom, pt, pu, pv, plat, &
1273 ✗ pmea, pstd, ppic, pulow, pvlow, pdudt, pdvdt, pdtdt)
1274
1275 ✗ DO k = 1, klev
1276 ✗ DO i = 1, klon
1277 ✗ d_u(i, klev+1-k) = dtime*pdudt(i, k)
1278 ✗ d_v(i, klev+1-k) = dtime*pdvdt(i, k)
1279 ✗ d_t(i, klev+1-k) = dtime*pdtdt(i, k)
1280 pustr(i) = pustr(i) & ! IM BUG .
1281 ! +RG*pdudt(i,k)*(papmh(i,k+1)-papmh(i,k))
1282 ✗ +pdudt(i, k)*(papmh(i,k+1)-papmh(i,k))/rg
1283 pvstr(i) = pvstr(i) & ! IM BUG .
1284 ! +RG*pdvdt(i,k)*(papmh(i,k+1)-papmh(i,k))
1285 ✗ +pdvdt(i, k)*(papmh(i,k+1)-papmh(i,k))/rg
1286 END DO
1287 END DO
1288
1289 ✗ RETURN
1290 END SUBROUTINE lift_noro
1291 ✗ SUBROUTINE orolift(nlon, nlev, ktest, ptsphy, paphm1, pgeom1, ptm1, pum1, &
1292 pvm1, plat, pmea, pvaror, ppic & ! OUTPUTS
1293 ✗ , pulow, pvlow, pvom, pvol, pte)
1294
1295
1296 ! **** *OROLIFT: SIMULATE THE GEOSTROPHIC LIFT.
1297
1298 ! PURPOSE.
1299 ! --------
1300
1301 ! ** INTERFACE.
1302 ! ----------
1303 ! CALLED FROM *lift_noro
1304 ! ----------
1305
1306 ! AUTHOR.
1307 ! -------
1308 ! F.LOTT LMD 22/11/95
1309
1310 USE dimphy
1311 IMPLICIT NONE
1312
1313
1314 include "YOMCST.h"
1315 include "YOEGWD.h"
1316 ! -----------------------------------------------------------------------
1317
1318 ! * 0.1 ARGUMENTS
1319 ! ---------
1320
1321
1322 INTEGER nlon, nlev
1323 REAL pte(nlon, nlev), pvol(nlon, nlev), pvom(nlon, nlev), pulow(nlon), &
1324 pvlow(nlon)
1325 REAL pum1(nlon, nlev), pvm1(nlon, nlev), ptm1(nlon, nlev), plat(nlon), &
1326 pmea(nlon), pvaror(nlon), ppic(nlon), pgeom1(nlon, nlev), &
1327 paphm1(nlon, nlev+1)
1328
1329 INTEGER ktest(nlon)
1330 REAL ptsphy
1331 ! -----------------------------------------------------------------------
1332
1333 ! * 0.2 LOCAL ARRAYS
1334 ! ------------
1335 LOGICAL lifthigh
1336 ! ym integer klevm1, jl, ilevh, jk
1337 INTEGER jl, ilevh, jk
1338 REAL zcons1, ztmst, zrtmst, zpi, zhgeo
1339 REAL zdelp, zslow, zsqua, zscav, zbet
1340 ✗ INTEGER iknub(klon), iknul(klon)
1341 ✗ LOGICAL ll1(klon, klev+1)
1342
1343 ✗ REAL ztau(klon, klev+1), ztav(klon, klev+1), zrho(klon, klev+1)
1344 ✗ REAL zdudt(klon), zdvdt(klon)
1345 ✗ REAL zhcrit(klon, klev)
1346 CHARACTER (LEN=20) :: modname = 'orografi'
1347 CHARACTER (LEN=80) :: abort_message
1348 ! -----------------------------------------------------------------------
1349
1350 ! * 1.1 INITIALIZATIONS
1351 ! ---------------
1352
1353 lifthigh = .FALSE.
1354
1355 ✗ IF (nlon/=klon .OR. nlev/=klev) THEN
1356 ✗ abort_message = 'pb dimension'
1357 ✗ CALL abort_physic(modname, abort_message, 1)
1358 END IF
1359 ✗ zcons1 = 1./rd
1360 ! ym KLEVM1=KLEV-1
1361 ✗ ztmst = ptsphy
1362 zrtmst = 1./ztmst
1363 zpi = acos(-1.)
1364
1365 ✗ DO jl = kidia, kfdia
1366 ✗ zrho(jl, klev+1) = 0.0
1367 ✗ pulow(jl) = 0.0
1368 ✗ pvlow(jl) = 0.0
1369 ✗ iknub(jl) = klev
1370 ✗ iknul(jl) = klev
1371 ilevh = klev/3
1372 ✗ ll1(jl, klev+1) = .FALSE.
1373 ✗ DO jk = 1, klev
1374 ✗ pvom(jl, jk) = 0.0
1375 ✗ pvol(jl, jk) = 0.0
1376 ✗ pte(jl, jk) = 0.0
1377 END DO
1378 END DO
1379
1380
1381 ! * 2.1 DEFINE LOW LEVEL WIND, PROJECT WINDS IN PLANE OF
1382 ! * LOW LEVEL WIND, DETERMINE SECTOR IN WHICH TO TAKE
1383 ! * THE VARIANCE AND SET INDICATOR FOR CRITICAL LEVELS.
1384
1385
1386
1387 ✗ DO jk = klev, 1, -1
1388 ✗ DO jl = kidia, kfdia
1389 ✗ IF (ktest(jl)==1) THEN
1390 ✗ zhcrit(jl, jk) = amax1(ppic(jl)-pmea(jl), 100.)
1391 ✗ zhgeo = pgeom1(jl, jk)/rg
1392 ✗ ll1(jl, jk) = (zhgeo>zhcrit(jl,jk))
1393 ✗ IF (ll1(jl,jk) .NEQV. ll1(jl,jk+1)) THEN
1394 ✗ iknub(jl) = jk
1395 END IF
1396 END IF
1397 END DO
1398 END DO
1399
1400 ✗ DO jl = kidia, kfdia
1401 ✗ IF (ktest(jl)==1) THEN
1402 ✗ iknub(jl) = max(iknub(jl), klev/2)
1403 ✗ iknul(jl) = max(iknul(jl), 2*klev/3)
1404 ✗ IF (iknub(jl)>nktopg) iknub(jl) = nktopg
1405 ✗ IF (iknub(jl)==nktopg) iknul(jl) = klev
1406 ✗ IF (iknub(jl)==iknul(jl)) iknub(jl) = iknul(jl) - 1
1407 END IF
1408 END DO
1409
1410 ! do 2011 jl=kidia,kfdia
1411 ! IF(KTEST(JL).EQ.1) THEN
1412 ! print *,' iknul= ',iknul(jl),' iknub=',iknub(jl)
1413 ! ENDIF
1414 ! 2011 continue
1415
1416 ! PRINT *,' DANS OROLIFT: 2010'
1417
1418 ✗ DO jk = klev, 2, -1
1419 ✗ DO jl = kidia, kfdia
1420 ✗ zrho(jl, jk) = 2.*paphm1(jl, jk)*zcons1/(ptm1(jl,jk)+ptm1(jl,jk-1))
1421 END DO
1422 END DO
1423 ! PRINT *,' DANS OROLIFT: 223'
1424
1425 ! ********************************************************************
1426
1427 ! * DEFINE LOW LEVEL FLOW
1428 ! -------------------
1429 ✗ DO jk = klev, 1, -1
1430 ✗ DO jl = kidia, kfdia
1431 ✗ IF (ktest(jl)==1) THEN
1432 ✗ IF (jk>=iknub(jl) .AND. jk<=iknul(jl)) THEN
1433 pulow(jl) = pulow(jl) + pum1(jl, jk)*(paphm1(jl,jk+1)-paphm1(jl,jk) &
1434 ✗ )
1435 pvlow(jl) = pvlow(jl) + pvm1(jl, jk)*(paphm1(jl,jk+1)-paphm1(jl,jk) &
1436 ✗ )
1437 zrho(jl, klev+1) = zrho(jl, klev+1) + zrho(jl, jk)*(paphm1(jl,jk+1) &
1438 ✗ -paphm1(jl,jk))
1439 END IF
1440 END IF
1441 END DO
1442 END DO
1443 ✗ DO jl = kidia, kfdia
1444 ✗ IF (ktest(jl)==1) THEN
1445 ✗ pulow(jl) = pulow(jl)/(paphm1(jl,iknul(jl)+1)-paphm1(jl,iknub(jl)))
1446 ✗ pvlow(jl) = pvlow(jl)/(paphm1(jl,iknul(jl)+1)-paphm1(jl,iknub(jl)))
1447 zrho(jl, klev+1) = zrho(jl, klev+1)/(paphm1(jl,iknul(jl)+1)-paphm1(jl, &
1448 ✗ iknub(jl)))
1449 END IF
1450 END DO
1451
1452 ! ***********************************************************
1453
1454 ! * 3. COMPUTE MOUNTAIN LIFT
1455
1456
1457 ✗ DO jl = kidia, kfdia
1458 ✗ IF (ktest(jl)==1) THEN
1459 ztau(jl, klev+1) = -gklift*zrho(jl, klev+1)*2.*romega* & ! *
1460 ! (2*PVAROR(JL)+PMEA(JL))*
1461 ✗ 2*pvaror(jl)*sin(zpi/180.*plat(jl))*pvlow(jl)
1462 ztav(jl, klev+1) = gklift*zrho(jl, klev+1)*2.*romega* & ! *
1463 ! (2*PVAROR(JL)+PMEA(JL))*
1464 ✗ 2*pvaror(jl)*sin(zpi/180.*plat(jl))*pulow(jl)
1465 ELSE
1466 ✗ ztau(jl, klev+1) = 0.0
1467 ✗ ztav(jl, klev+1) = 0.0
1468 END IF
1469 END DO
1470
1471 ! * 4. COMPUTE LIFT PROFILE
1472 ! * --------------------
1473
1474
1475
1476 ✗ DO jk = 1, klev
1477 ✗ DO jl = kidia, kfdia
1478 ✗ IF (ktest(jl)==1) THEN
1479 ✗ ztau(jl, jk) = ztau(jl, klev+1)*paphm1(jl, jk)/paphm1(jl, klev+1)
1480 ✗ ztav(jl, jk) = ztav(jl, klev+1)*paphm1(jl, jk)/paphm1(jl, klev+1)
1481 ELSE
1482 ✗ ztau(jl, jk) = 0.0
1483 ✗ ztav(jl, jk) = 0.0
1484 END IF
1485 END DO
1486 END DO
1487
1488
1489 ! * 5. COMPUTE TENDENCIES.
1490 ! * -------------------
1491 IF (lifthigh) THEN
1492 ! PRINT *,' DANS OROLIFT: 500'
1493
1494 ! EXPLICIT SOLUTION AT ALL LEVELS
1495
1496 DO jk = 1, klev
1497 DO jl = kidia, kfdia
1498 IF (ktest(jl)==1) THEN
1499 zdelp = paphm1(jl, jk+1) - paphm1(jl, jk)
1500 zdudt(jl) = -rg*(ztau(jl,jk+1)-ztau(jl,jk))/zdelp
1501 zdvdt(jl) = -rg*(ztav(jl,jk+1)-ztav(jl,jk))/zdelp
1502 END IF
1503 END DO
1504 END DO
1505
1506 ! PROJECT PERPENDICULARLY TO U NOT TO DESTROY ENERGY
1507
1508 DO jk = 1, klev
1509 DO jl = kidia, kfdia
1510 IF (ktest(jl)==1) THEN
1511
1512 zslow = sqrt(pulow(jl)**2+pvlow(jl)**2)
1513 zsqua = amax1(sqrt(pum1(jl,jk)**2+pvm1(jl,jk)**2), gvsec)
1514 zscav = -zdudt(jl)*pvm1(jl, jk) + zdvdt(jl)*pum1(jl, jk)
1515 IF (zsqua>gvsec) THEN
1516 pvom(jl, jk) = -zscav*pvm1(jl, jk)/zsqua**2
1517 pvol(jl, jk) = zscav*pum1(jl, jk)/zsqua**2
1518 ELSE
1519 pvom(jl, jk) = 0.0
1520 pvol(jl, jk) = 0.0
1521 END IF
1522 zsqua = sqrt(pum1(jl,jk)**2+pum1(jl,jk)**2)
1523 IF (zsqua<zslow) THEN
1524 pvom(jl, jk) = zsqua/zslow*pvom(jl, jk)
1525 pvol(jl, jk) = zsqua/zslow*pvol(jl, jk)
1526 END IF
1527
1528 END IF
1529 END DO
1530 END DO
1531
1532 ! 6. LOW LEVEL LIFT, SEMI IMPLICIT:
1533 ! ----------------------------------
1534
1535 ELSE
1536
1537 ✗ DO jl = kidia, kfdia
1538 ✗ IF (ktest(jl)==1) THEN
1539 ✗ DO jk = klev, iknub(jl), -1
1540 zbet = gklift*2.*romega*sin(zpi/180.*plat(jl))*ztmst* &
1541 (pgeom1(jl,iknub(jl)-1)-pgeom1(jl,jk))/ &
1542 ✗ (pgeom1(jl,iknub(jl)-1)-pgeom1(jl,klev))
1543 ✗ zdudt(jl) = -pum1(jl, jk)/ztmst/(1+zbet**2)
1544 ✗ zdvdt(jl) = -pvm1(jl, jk)/ztmst/(1+zbet**2)
1545 ✗ pvom(jl, jk) = zbet**2*zdudt(jl) - zbet*zdvdt(jl)
1546 ✗ pvol(jl, jk) = zbet*zdudt(jl) + zbet**2*zdvdt(jl)
1547 END DO
1548 END IF
1549 END DO
1550
1551 END IF
1552
1553 ✗ RETURN
1554 END SUBROUTINE orolift
1555
1556
1557 ✗ SUBROUTINE sugwd(nlon, nlev, paprs, pplay)
1558 USE dimphy
1559 USE mod_phys_lmdz_para
1560 USE mod_grid_phy_lmdz
1561 ! USE parallel
1562
1563 ! **** *SUGWD* INITIALIZE COMMON YOEGWD CONTROLLING GRAVITY WAVE DRAG
1564
1565 ! PURPOSE.
1566 ! --------
1567 ! INITIALIZE YOEGWD, THE COMMON THAT CONTROLS THE
1568 ! GRAVITY WAVE DRAG PARAMETRIZATION.
1569
1570 ! ** INTERFACE.
1571 ! ----------
1572 ! CALL *SUGWD* FROM *SUPHEC*
1573 ! ----- ------
1574
1575 ! EXPLICIT ARGUMENTS :
1576 ! --------------------
1577 ! PSIG : VERTICAL COORDINATE TABLE
1578 ! NLEV : NUMBER OF MODEL LEVELS
1579
1580 ! IMPLICIT ARGUMENTS :
1581 ! --------------------
1582 ! COMMON YOEGWD
1583
1584 ! METHOD.
1585 ! -------
1586 ! SEE DOCUMENTATION
1587
1588 ! EXTERNALS.
1589 ! ----------
1590 ! NONE
1591
1592 ! REFERENCE.
1593 ! ----------
1594 ! ECMWF Research Department documentation of the IFS
1595
1596 ! AUTHOR.
1597 ! -------
1598 ! MARTIN MILLER *ECMWF*
1599
1600 ! MODIFICATIONS.
1601 ! --------------
1602 ! ORIGINAL : 90-01-01
1603 ! ------------------------------------------------------------------
1604 IMPLICIT NONE
1605
1606 ! -----------------------------------------------------------------
1607 include "YOEGWD.h"
1608 ! ----------------------------------------------------------------
1609
1610 INTEGER nlon, nlev, jk
1611 REAL paprs(nlon, nlev+1)
1612 REAL pplay(nlon, nlev)
1613 REAL zpr, zstra, zsigt, zpm1r
1614 ✗ REAL :: pplay_glo(klon_glo, nlev)
1615 ✗ REAL :: paprs_glo(klon_glo, nlev+1)
1616
1617 ! * 1. SET THE VALUES OF THE PARAMETERS
1618 ! --------------------------------
1619
1620
1621 ✗ PRINT *, ' DANS SUGWD NLEV=', nlev
1622 ✗ ghmax = 10000.
1623
1624 zpr = 100000.
1625 zstra = 0.1
1626 zsigt = 0.94
1627 ! old ZPR=80000.
1628 ! old ZSIGT=0.85
1629
1630
1631 ✗ CALL gather(pplay, pplay_glo)
1632 ✗ CALL bcast(pplay_glo)
1633 ✗ CALL gather(paprs, paprs_glo)
1634 ✗ CALL bcast(paprs_glo)
1635
1636
1637 ✗ DO jk = 1, nlev
1638 ✗ zpm1r = pplay_glo((klon_glo/2)+1, jk)/paprs_glo((klon_glo/2)+1, 1)
1639 ✗ IF (zpm1r>=zsigt) THEN
1640 ✗ nktopg = jk
1641 END IF
1642 zpm1r = pplay_glo((klon_glo/2)+1, jk)/paprs_glo((klon_glo/2)+1, 1)
1643 ✗ IF (zpm1r>=zstra) THEN
1644 ✗ nstra = jk
1645 END IF
1646 END DO
1647
1648
1649
1650 ! inversion car dans orodrag on compte les niveaux a l'envers
1651 ✗ nktopg = nlev - nktopg + 1
1652 ✗ nstra = nlev - nstra
1653 ✗ PRINT *, ' DANS SUGWD nktopg=', nktopg
1654 ✗ PRINT *, ' DANS SUGWD nstra=', nstra
1655
1656 ✗ gsigcr = 0.80
1657
1658 ! Values now specified in run.def, or conf_phys_m.F90
1659 ! gkdrag = 0.2
1660 ! grahilo = 1.
1661 ! grcrit = 0.01
1662 ! gfrcrit = 1.0
1663 ! gkwake = 0.50
1664 ! gklift = 0.50
1665 ✗ gvcrit = 0.0
1666
1667 ! ----------------------------------------------------------------
1668
1669 ! * 2. SET VALUES OF SECURITY PARAMETERS
1670 ! ---------------------------------
1671
1672
1673 ✗ gvsec = 0.10
1674 ✗ gssec = 1.E-12
1675
1676 ✗ gtsec = 1.E-07
1677
1678 ! ----------------------------------------------------------------
1679
1680 ✗ RETURN
1681 END SUBROUTINE sugwd
1682