source: LMDZ4/branches/LMDZ4_par_0/libf/phylmd/orografi.F @ 633

Last change on this file since 633 was 633, checked in by (none), 19 years ago

This commit was manufactured by cvs2svn to create branch 'LMDZ4_par_0'.

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