   !!======================================================================

  SUBROUTINE agrif_obc_ssh(xeuv)
!
!********************************************************************
!
!     objet    : routine de calculs des conditions aux limites
!                en niveau dans le cas d un modele emboite, pour lequel
!                on dispose d un fichier de conditions aux limites etabli
!                par un grand modele le contenant. Cas des frontieres
!                rectiligne.
!
!
!     appelant         : init_xe, stepu, stepv, step2dxy, step2dyx
!                      :
!     appeles          :
!                      :
!     canal d ecriture :
!                      :
!     canal de lecture :
!                      :
!     cle cpp          :
!                      :
!     variables in     : nbouc, nbouc2d, filecl, ieac, iwac
!     variables in     : jnac, jsac, dgac, dfiac, dgp, dfip
!     variables in     : t, it
!                      :
!     variables out    : xe, ul, vl
!                      :
!     variables inout  : xlim, ylim
!                      :
!     dernieres modifs : 13/10/2005
!                      : 12/12/2007 F. Dumas (test sur profondeur 2m au lieu de 2*h0fond)
   !&E       !  2009-05  (F. Dumas)  AGRIF pour nouveau schema temporel
   !&E       !  2011-11  (V. Garnier) Spatial extension of ssh(liminm2:limaxp2,ljminm2:ljmaxp2)
!                      :
!***********************************************************

#include "toolcpp.h"

#ifdef key_agrif
   USE parameters
   USE comvars2d
   USE comvarp2d
   USE agrifcommonid
   USE obccombine, ONLY : l_obc_west,l_obc_east,l_obc_north,l_obc_south
   USE_MPI toolmpi, ONLY : ex_i_rsh,ex_j_rsh
   IMPLICIT NONE
   REAL(kind=rsh),DIMENSION(liminm2:limaxp2,ljminm2:ljmaxp2),INTENT( inout ) :: xeuv
!
   INTEGER              :: nb
   REAL(kind=rlg)       :: TimeIndex
   INTEGER :: i,j
   INTEGER,pointer :: Nbouc_Parent
   External :: interpssh

   !!----------------------------------------------------------------------
   !! * Executable part

   PRINT_DBG*, 'enter AGRIF_OBC_SSH routine',Agrif_Root()

!     Initialisation
!************************************************************
!

!laurent
! cval pourquoi ce test alors que dans AGRIF_OBC_UZ on passe aussi quand on est
! la mere ?
   IF (.not.Agrif_Root()) THEN

     ! Initialization Agrif parameterization
     Agrif_SpecialValue=valmanq
     Agrif_USESpecialValue = .TRUE.
     c_agrif_interp='ssh_bc'

     ! Initialization
     nesting_tabtemp_2d(:,:,1) = xeuv

     ! Agrif on OBC
     CALL Agrif_Bc_Variable(ssh_interp_id,procname=interpssh)

     ! Set up
     xeuv = nesting_tabtemp_2d(:,:,1)

     ! Initialization Agrif parameterization for ????????????????
     Agrif_SpecialValue=valmanq
     Agrif_USESpecialValue = .FALSE.

   END IF

   IF ((Agrif_Grandmother())) THEN

     ! western boundary
     IF_MPI (limin==imin) THEN
       IF ( l_obc_west ) THEN
         WHERE (h0(imin+1,ljminm2:ljmaxp2)/=-valmanq)
         xeuv(imin+1,ljminm2:ljmaxp2) = xeuv(imin+2,ljminm2:ljmaxp2)
       ELSE WHERE
         xeuv(imin+1,ljminm2:ljmaxp2) = valmanq
         END WHERE
       END IF
     ENDIF_MPI

     ! eastern boundary
     IF_MPI (limax==imax) THEN
       IF ( l_obc_east ) THEN
         WHERE (h0(imax,ljminm2:ljmaxp2)/=-valmanq)
         xeuv(imax,ljminm2:ljmaxp2) = xeuv(imax-1,ljminm2:ljmaxp2)
       ELSE WHERE
         xeuv(imax,ljminm2:ljmaxp2) = valmanq
         END WHERE
       END IF
     ENDIF_MPI

     ! southern boundary
     IF_MPI (ljmin==jmin) THEN
       IF ( l_obc_south ) THEN
         WHERE (h0(liminm2:limaxp2,jmin+1)/=-valmanq)
         xeuv(liminm2:limaxp2,jmin+1) = xeuv(liminm2:limaxp2,jmin+2)
       ELSE WHERE
         xeuv(liminm2:limaxp2,jmin+1) = valmanq
         END WHERE
       END IF
     ENDIF_MPI

     ! northern boundary
     IF_MPI (ljmax==jmax) THEN
       IF ( l_obc_north ) THEN
         WHERE (h0(liminm2:limaxp2,jmax)/=-valmanq)
         xeuv(liminm2:limaxp2,jmax) = xeuv(liminm2:limaxp2,jmax-1)
       ELSE WHERE
         xeuv(liminm2:limaxp2,jmax) = valmanq
         END WHERE
       END IF
     ENDIF_MPI
   END IF

#else

   USE parameters, ONLY : rsh,liminm2,limaxp2,ljminm2,ljmaxp2
   REAL(kind=rsh),DIMENSION(liminm2:limaxp2,ljminm2:ljmaxp2),INTENT( in ) :: xeuv

#endif

   PRINT_DBG*, 'exit AGRIF_OBC_SSH routine'

  END SUBROUTINE agrif_obc_ssh

   !!======================================================================

#if defined key_agrif

  SUBROUTINE interpssh(tabres,i1,i2,j1,j2,before)
   USE parameters
   USE comvars2d
   USE comvarp2d
   USE agrif_types
   USE agrifcommonid
   IMPLICIT NONE

   INTEGER i1,i2,j1,j2
   LOGICAL :: before
   REAL(kind=rsh) :: tabres(i1:i2,j1:j2)
   INTEGER :: i,j

   !!----------------------------------------------------------------------
   !! * Executable part

   PRINT_DBG*, 'enter INTERPSSH routine',Agrif_Root()

   IF (before) THEN
     DO j=j1,j2
       DO i=i1,i2
         IF (h0(i,j)+ssh(i,j) <= h0fond) THEN
           tabres(i,j) = Agrif_SpecialValue
         ELSE
           tabres(i,j) = ssh(i,j)
         END IF
       END DO
     END DO
   ELSE
     SELECT CASE(c_agrif_interp)
       CASE ('ssh_init')
         DO j=j1,j2
           DO i=i1,i2
             IF (h0(i,j) == -valmanq) THEN
               nesting_tabtemp_2d(i,j,1) = valmanq
             ELSE IF (h0(i,j)+tabres(i,j) < h0fond) THEN
               nesting_tabtemp_2d(i,j,1) = -h0(i,j)
             ELSE
               nesting_tabtemp_2d(i,j,1) = tabres(i,j)
             END IF
           END DO
         END DO
       CASE('ssh_bc')
         DO j=j1,j2
           DO i=i1,i2
             ! at open boundary of the child grid, copy mother grid field
             IF (i==imin+1.or.i==imax.or.j==jmax.or.j==jmin+1) THEN
               IF (h0(i,j) == -valmanq) THEN
                 nesting_tabtemp_2d(i,j,1) = valmanq
               ELSE IF (h0(i,j)+tabres(i,j) < h0fond) THEN
                 nesting_tabtemp_2d(i,j,1) = -h0(i,j)
               ELSE
                 nesting_tabtemp_2d(i,j,1) = tabres(i,j)
               END IF
             END IF
           END DO
         END DO
     END SELECT
   END IF

   PRINT_DBG*, 'exit INTERPSSH routine',Agrif_Root()

   RETURN

   END SUBROUTINE interpssh

   !!======================================================================

#endif
