!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***s/r  height_sponge -  Performs vertical blending
*
#include "model_macros_f.h"
*

      subroutine height_sponge () 1,5
      implicit none
*author 
*     Plante A.           - May 2004 
*
*revision
* v3_30 Lee V.    - changed variables from time level t0 -> t1
*                   see (dynstep and theo_nest)
*
*object
*
*arguments
*       none
*
*implicits
#include "glb_pil.cdk"
#include "glb_ld.cdk"
#include "vt1.cdk"
#include "schm.cdk"
#include "nest.cdk"
#include "lun.cdk"
#include "zblen.cdk"
#include "dcst.cdk"
#include "mtn.cdk"
#include "p_geof.cdk"
#include "geomg.cdk"
*
      integer  vmmlod,vmmget,vmmuld
      external vmmlod,vmmget,vmmuld
*
      integer err,key(12),i,j,k,nvar, longueur
      integer n

      real betav(LDIST_SHAPE,l_nk),work

*----------------------------------------------------------------------
*
      key(1)=VMM_KEY(ut1)
      key(2)=VMM_KEY(vt1)
      key(3)=VMM_KEY(tt1)
      key(4)=VMM_KEY(psdt1)
      key(5)=VMM_KEY(tdt1)
      key(6)=VMM_KEY(fit1)
      nvar = 6
*
      if (.not.Schm_hydro_L) then
         key(7)=VMM_KEY(wt1)
         nvar = 7
      endif
*
      err = vmmlod(key,nvar)
      err = VMM_GET_VAR(ut1)
      err = VMM_GET_VAR(vt1)
      err = VMM_GET_VAR(tt1)
      err = VMM_GET_VAR(psdt1)
      err = VMM_GET_VAR(tdt1)
      err = VMM_GET_VAR(fit1)
      if (.not.Schm_hydro_L) then
         err = VMM_GET_VAR(wt1)
      endif
*
      call set_betav(betav,fit1,LDIST_DIM, l_nk)

      work=mtn_flo/Dcst_rayt_8

      call applique(ut1  ,work,betav,LDIST_DIM, l_nk)
      call applique(vt1  ,0.  ,betav,LDIST_DIM, l_nk)
      call applique(tdt1 ,0.  ,betav,LDIST_DIM, l_nk)
      call applique(psdt1,0.  ,betav,LDIST_DIM, l_nk)
      if (.not.Schm_hydro_L) 
     &call applique(wt1,0.    ,betav,LDIST_DIM, l_nk)
      if(Zblen_spngtt_L)
     &call applique_tt(tt1,fit1,betav,LDIST_DIM, l_nk)

      err = vmmuld(key,nvar)
*
*----------------------------------------------------------------------
      return
      end

c=======================================================================
#include "model_macros_f.h"


      subroutine applique(ff,value,betav, DIST_DIM, Nk) 4

      implicit none

      integer  DIST_DIM, Nk 

#include "glb_pil.cdk"
#include "glb_ld.cdk"

      real ff(DIST_SHAPE,Nk),value,betav(DIST_SHAPE,Nk)

      integer i,j,k,i0,in,j0,jn 

      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1+pil_s
      jn = l_nj-pil_n

      do k=1,Nk
         do j=j0,jn
            do i=i0,in
               ff(i,j,k)=(1.-betav(i,j,k))*ff(i,j,k)+betav(i,j,k)*value
            enddo
         enddo
      enddo
      
      return

      end
c=======================================================================
#include "model_macros_f.h"


      subroutine applique_tt(tt,fi,betav, DIST_DIM, Nk)

      implicit none

      integer  DIST_DIM, Nk 

#include "glb_pil.cdk"
#include "glb_ld.cdk"
#include "dcst.cdk"
#include "mtn.cdk"

      real tt(DIST_SHAPE,Nk),fi(DIST_SHAPE,Nk),value,betav(DIST_SHAPE,Nk)

      real capc1,my_tt,a00

      integer i,j,k,i0,in,j0,jn 

      a00 = mtn_nstar * mtn_nstar/Dcst_grav_8
      capc1 = Dcst_grav_8*Dcst_grav_8/(mtn_nstar*mtn_nstar*Dcst_cpd_8*mtn_tzero)

      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1+pil_s
      jn = l_nj-pil_n

      do k=1,Nk
         do j=j0,jn
            do i=i0,in
               my_tt=mtn_tzero*((1.-capc1)*exp(a00*fi(i,j,k)/Dcst_grav_8)+capc1)
               tt(i,j,k)=(1.-betav(i,j,k))*tt(i,j,k)+betav(i,j,k)*my_tt
            enddo
         enddo
      enddo
      
      return

      end
c=======================================================================
#include "model_macros_f.h"


      subroutine set_betav(betav,fi, DIST_DIM, Nk) 1

      implicit none

      integer  DIST_DIM, Nk 

#include "glb_pil.cdk"
#include "glb_ld.cdk"
#include "dcst.cdk"
#include "zblen.cdk"

      real betav(DIST_SHAPE,Nk),fi(DIST_SHAPE,Nk)

      real work1,work2

      integer i,j,k,i0,in,j0,jn 

      i0 = 1+pil_w
      in = l_ni-pil_e
      j0 = 1+pil_s
      jn = l_nj-pil_n

      do k=1,l_nk
         do j=j0,jn
            do i=i0,in
               work1=fi(i,j,k)/Dcst_grav_8-Zblen_hmin
               work2=fi(i,j,1)/Dcst_grav_8-Zblen_hmin
               work1=max(0.,work1/work2)
               betav(i,j,k)=work1*work1
            enddo
         enddo
      enddo
      
      return

      end