      MODULE gwstress_mod
      
      IMPLICIT NONE
      
      CONTAINS

      SUBROUTINE GWSTRESS
     *         (  klon  , klev
     *         , KKCRIT, KSECT, KKHLIM, KTEST, KKCRITH, KCRIT, kkenvh
     *         , kknu
     *         , PRHO  , PSTAB, PVPH  , PVAR ,PVARor, psig  
     *         , PTFR  , PTAU  
     *         ,pgeom1 , pgamma, pd1  , pd2   ,pdmod ,pnu )
C
C**** *GWSTRESS*
C
C     PURPOSE.
C     --------
C
C**   INTERFACE.
C     ----------
C     CALL *GWSTRESS*  FROM *GWDRAG*
C
C        EXPLICIT ARGUMENTS :
C        --------------------
C     ==== INPUTS ===
C     ==== OUTPUTS ===
C
C        IMPLICIT ARGUMENTS :   NONE
C        --------------------
C
C     METHOD.
C     -------
C
C
C     EXTERNALS.
C     ----------
C
C
C     REFERENCE.
C     ----------
C
C        SEE ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE "I.F.S."
C
C     AUTHOR.
C     -------
C
C     MODIFICATIONS.
C     --------------
C     F. LOTT PUT THE NEW GWD ON IFS      22/11/93
C
C-----------------------------------------------------------------------
      use dimradmars_mod, only: ndlo2
      implicit none
      integer klon,klev,kidia,kfdia

      include "yoegwd.h"

C-----------------------------------------------------------------------
C
C*       0.1   ARGUMENTS
C              ---------
C
      INTEGER KKCRIT(NDLO2),KKCRITH(NDLO2),KCRIT(NDLO2),KSECT(NDLO2),
     *        KKHLIM(NDLO2),KTEST(NDLO2),KKENVH(NDLO2),KKNU(NDLO2)
C
      REAL PRHO(NDLO2,klev+1),PSTAB(NDLO2,klev+1),PTAU(NDLO2,klev+1),
     *     PVPH(NDLO2,klev+1),PVAR(NDLO2,4),PTFR(NDLO2),
     *     pgeom1(NDLO2,klev),PVARor(NDLO2)
C
      real pd1(NDLO2),pd2(NDLO2),pnu(NDLO2),psig(NDLO2),pgamma(NDLO2)
      real pdmod(NDLO2)
C
C-----------------------------------------------------------------------
C
C*       0.2   LOCAL ARRAYS
C              ------------
      integer jl
      real zblock,zvar,zeff
      logical lo

C
C-----------------------------------------------------------------------
C
C*       0.3   FUNCTIONS
C              ---------
C     ------------------------------------------------------------------
C
C*         1.    INITIALIZATION
C                --------------


      kidia=1
      kfdia=klon


C
 100  CONTINUE
C
C*         3.1     GRAVITY WAVE STRESS.
C
  300 CONTINUE
C
C
      DO 301 JL=kidia,kfdia
      IF(KTEST(JL).EQ.1) THEN
      
C  EFFECTIVE MOUNTAIN HEIGHT ABOVE THE BLOCKED FLOW
  
c        IF(KKENVH(JL).EQ.KLEV)THEN
         ZBLOCK=0.0 
c        ELSE
c         ZBLOCK=(PGEOM1(JL,KKENVH(JL))+PGEOM1(JL,KKENVH(JL)+1))/2./RG          
c        ENDIF
      
        ZVAR=PVAROR(JL)
        ZEFF=AMAX1(0.,2.*ZVAR-ZBLOCK)

        PTAU(JL,KLEV+1)=PRHO(JL,KLEV+1)*GKDRAG*psig(jl)*ZEFF**2
     *    /4./ZVAR*PVPH(JL,KLEV+1)*pdmod(jl)*sqrt(pstab(jl,klev+1))

C  TOO SMALL VALUE OF STRESS OR  LOW LEVEL FLOW INCLUDE CRITICAL LEVEL
C  OR LOW LEVEL FLOW:  GRAVITY WAVE STRESS NUL.
                
        LO=(PTAU(JL,KLEV+1).LT.GTSEC).OR.(KCRIT(JL).GE.KKNU(JL))
     *      .OR.(PVPH(JL,KLEV+1).LT.GVCRIT)
c       IF(LO) PTAU(JL,KLEV+1)=0.0
      
      ELSE
      
          PTAU(JL,KLEV+1)=0.0
          
      ENDIF
      
  301 CONTINUE
C

      END SUBROUTINE GWSTRESS
      
      END MODULE gwstress_mod
