!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
! Modifications:
!  P. Wautelet 03/05/2019: modi_bikhardt -> mode_bikhardt
!-----------------------------------------------------------------
!###################
module mode_bikhardt
!###################

implicit none

private

public :: Bikhardt

interface Bikhardt
  module procedure Bikhardt2d, Bikhardt3d, Bikhardt4d
end interface

contains

!     #########################################################################
      SUBROUTINE BIKHARDT4D (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, &
                             PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, &
                             KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,KGRID,   &
                             HLBCX,HLBCY,PFIELD1,PFIELD2)
!     #########################################################################
!
!!****  *BIKHARDT4D * - interpolates a 4D field with Bikhardt method
!!
!!    PURPOSE
!!    -------
!!
!     This routine interpolates a field from outer model (PFIELD1) to 
!     inner model (PFIELD2), using Bikhardt interpolation.
!!
!!**  METHOD
!!    ------
!!
!!    The outer model field is extrapolated in each horizontal dimension
!!    in order to allow all cases of KXOR,KYOR,KXEND and KYEND
!!
!!    EXTERNAL
!!    --------
!!
!! 
!!    IMPLICIT ARGUMENTS
!!    ------------------ 
!!
!!      Module MODD_PARAMETERS : contains parameters 
!!
!!    REFERENCE
!!    ---------
!!
!!       Book1 of the documentation
!!       Routine BIKHARDT3D (Book2 of the documentation)
!!      
!!
!!    AUTHOR
!!    ------
!!
!!       V. Masson     * METEO-FRANCE *
!!
!!    MODIFICATIONS
!!    -------------
!!
!!      Original     10/06/96
!!      J.P. Lafore  22/10/96  interpolation coefficients added to the arguments
!!                             list to avoid duplication. 
!!     V. Masson and F. Gheusi (10/10/97) bug in cyclic case
!!     J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
!!     J.Escobar : 18/12/2015 : set valide default values in corner in // for NHALO <>1 
!-------------------------------------------------------------------------------
!
!*       0.     DECLARATIONS
!               ------------
!
USE MODD_PARAMETERS       ! Declarative modules

use mode_tools_ll,        only: GET_INDICE_ll
!
IMPLICIT NONE
!
!*       0.1   Declarations of dummy arguments :
!
                                    ! interpolation coefficients
REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFX1,PBFX2,PBFX3,PBFX4 ! Flux points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFY1,PBFY2,PBFY3,PBFY4 ! Flux points in Y-direc.
!
INTEGER,   INTENT(IN)  :: KXOR,KXEND !  horizontal position (i,j) of the ORigin and END  
INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the inner model  domain, relative to outer model
INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
INTEGER,   INTENT(IN)  :: KDYRATIO   ! between inner model and outer model
INTEGER,   INTENT(IN)  :: KGRID      ! code of grid point
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCX   ! type of lateral
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY   ! boundary conditions
REAL, DIMENSION(:,:,:,:),         INTENT(IN) :: PFIELD1 ! field of outer model
REAL, DIMENSION(:,:,:,:),         INTENT(OUT):: PFIELD2 ! field of inner model
!
!*       0.2    Declarations of local variables for print on FM file
!
REAL, DIMENSION(0:SIZE(PFIELD1,1)+2, &
                0:SIZE(PFIELD1,2)+2, &
                  SIZE(PFIELD1,3)  , &
                  SIZE(PFIELD1,4)   ) :: ZFIELD1   ! field of outer model 
!
                                    ! interpolation coefficients 
REAL :: ZBMX1,ZBMX2,ZBMX3,ZBMX4     ! at Mass points in X-direc.
REAL :: ZBMY1,ZBMY2,ZBMY3,ZBMY4     ! at Mass points in Y-direc.
REAL :: ZBFX1,ZBFX2,ZBFX3,ZBFX4     ! at Flux points in X-direc.
REAL :: ZBFY1,ZBFY2,ZBFY3,ZBFY4     ! at Flux points in Y-direc.
! 
INTEGER             :: IIU       ! Upper dimension in x direction (inner model)
INTEGER             :: IJU       ! Upper dimension in y direction (inner model)
INTEGER             :: IIB, IIE
INTEGER             :: IJB, IJE
INTEGER             :: IIU1      ! Upper dimension in x direction (outer model)
INTEGER             :: IJU1      ! Upper dimension in y direction (outer model)
INTEGER             :: IIS,IJS   ! indices I and J in x and y dir. for scalars
INTEGER             :: IIF,IJF   ! indices I and J in x and y dir. for flux points
INTEGER             :: JI, JEPSX ! Loop index in x direction
INTEGER             :: JJ, JEPSY ! Loop index in y direction    
!-------------------------------------------------------------------------------
!
!*       1.    PROLOGUE:
!              ---------
! 
!*       1.1   computes dimensions of arrays and other indices
!
IIU = SIZE(PFIELD2,1)
IJU = SIZE(PFIELD2,2)
IIU1= SIZE(PFIELD1,1)
IJU1= SIZE(PFIELD1,2)
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
!
!*       1.2   extrapolates field of outer model
!
ZFIELD1(:,:,:,:) = 0.
ZFIELD1(1:IIU1,1:IJU1,:,:)=PFIELD1(:,:,:,:)
!
ZFIELD1(   0  ,   :  ,:,:) = 2.*ZFIELD1(  1 ,  : ,:,:) -    ZFIELD1(   2  ,   :  ,:,:)
ZFIELD1(IIU1+1,   :  ,:,:) = 2.*ZFIELD1(IIU1,  : ,:,:) -    ZFIELD1(IIU1-1,   :  ,:,:)
ZFIELD1(IIU1+2,   :  ,:,:) = 3.*ZFIELD1(IIU1,  : ,:,:) - 2.*ZFIELD1(IIU1-1,   :  ,:,:)
!
ZFIELD1(   :  ,   0  ,:,:) = 2.*ZFIELD1(  : ,  1 ,:,:) -    ZFIELD1(   :  ,   2  ,:,:)
ZFIELD1(   :  ,IJU1+1,:,:) = 2.*ZFIELD1(  : ,IJU1,:,:) -    ZFIELD1(   :  ,IJU1-1,:,:)
ZFIELD1(   :  ,IJU1+2,:,:) = 3.*ZFIELD1(  : ,IJU1,:,:) - 2.*ZFIELD1(   :  ,IJU1-1,:,:)
!
IF ( HLBCX(1) == 'CYCL' ) THEN
  ZFIELD1(   0  ,:,:,:) = ZFIELD1(IIU1-2*JPHEXT  ,:,:,:)
  ZFIELD1(IIU1+1,:,:,:) = ZFIELD1(  1 +2*JPHEXT  ,:,:,:)
  IF (SIZE(PFIELD1,1) == 3 ) THEN
    ZFIELD1(IIU1+2,:,:,:) = ZFIELD1(  1            ,:,:,:)
  ELSE
    ZFIELD1(IIU1+2,:,:,:) = ZFIELD1(  1 +2*JPHEXT+1,:,:,:)
  END IF
END IF
!
IF ( HLBCY(1) == 'CYCL' ) THEN
  ZFIELD1(:,   0  ,:,:) = ZFIELD1(:,IJU1-2*JPHEXT  ,:,:)
  ZFIELD1(:,IJU1+1,:,:) = ZFIELD1(:,  1 +2*JPHEXT  ,:,:)
  IF (SIZE(PFIELD1,2) == 3 ) THEN
    ZFIELD1(:,IJU1+2,:,:) = ZFIELD1(:,  1            ,:,:)
  ELSE
    ZFIELD1(:,IJU1+2,:,:) = ZFIELD1(:,  1 +2*JPHEXT+1,:,:)
  END IF
END IF
!-------------------------------------------------------------------------------
!
PFIELD2 = ZFIELD1(1,1,1,1) ! some valide values for missing ones
!
SELECT CASE (KGRID)
!
!*      2.1    Mass points
!
       CASE (1,4)
!
  DO JEPSX = 1,KDXRATIO
    ZBMX1 = PBMX1(JEPSX)
    ZBMX2 = PBMX2(JEPSX)
    ZBMX3 = PBMX3(JEPSX)
    ZBMX4 = PBMX4(JEPSX)
    DO JEPSY = 1,KDYRATIO
      ZBMY1 = PBMY1(JEPSY)
      ZBMY2 = PBMY2(JEPSY)
      ZBMY3 = PBMY3(JEPSY)
      ZBMY4 = PBMY4(JEPSY)
      DO JI = KXOR,KXEND
        IIS = IIB+JEPSX-1+KDXRATIO/2+(JI-KXOR-JPHEXT)*KDXRATIO
        DO JJ = KYOR,KYEND
          IJS = IJB+JEPSY-1+KDYRATIO/2+(JJ-KYOR-JPHEXT)*KDYRATIO
!
          IF (1 <= IIS .AND. IIS <= IIU .AND. 1 <= IJS .AND. IJS <= IJU) THEN
!
            PFIELD2  (IIS,IJS,:,:) = ZBMY1*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ-1,:,:)+ZBMX2*ZFIELD1(JI  ,JJ-1,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ-1,:,:)+ZBMX4*ZFIELD1(JI+2,JJ-1,:,:)) &
                                    +ZBMY2*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ  ,:,:)+ZBMX2*ZFIELD1(JI  ,JJ  ,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ  ,:,:)+ZBMX4*ZFIELD1(JI+2,JJ  ,:,:)) &
                                    +ZBMY3*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ+1,:,:)+ZBMX2*ZFIELD1(JI  ,JJ+1,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ+1,:,:)+ZBMX4*ZFIELD1(JI+2,JJ+1,:,:)) &
                                    +ZBMY4*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ+2,:,:)+ZBMX2*ZFIELD1(JI  ,JJ+2,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ+2,:,:)+ZBMX4*ZFIELD1(JI+2,JJ+2,:,:))
           END IF
         END DO
      END DO
    END DO
  END DO
!
!*      2.2    U points
!
       CASE (2,6)
!
  DO JEPSX = 1,KDXRATIO
    ZBFX1 = PBFX1(JEPSX)
    ZBFX2 = PBFX2(JEPSX)
    ZBFX3 = PBFX3(JEPSX)
    ZBFX4 = PBFX4(JEPSX)
    DO JEPSY = 1,KDYRATIO
      ZBMY1 = PBMY1(JEPSY)
      ZBMY2 = PBMY2(JEPSY)
      ZBMY3 = PBMY3(JEPSY)
      ZBMY4 = PBMY4(JEPSY)
      DO JI = KXOR,KXEND
        IIF = IIB+JEPSX-1           +(JI-KXOR-JPHEXT)*KDXRATIO
        DO JJ = KYOR,KYEND
          IJS = IJB+JEPSY-1+KDYRATIO/2+(JJ-KYOR-JPHEXT)*KDYRATIO

          IF (1 <= IIF .AND. IIF <= IIU .AND. 1 <= IJS .AND. IJS <= IJU) THEN 
!
            PFIELD2  (IIF,IJS,:,:) = ZBMY1*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ-1,:,:)+ZBFX2*ZFIELD1(JI  ,JJ-1,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ-1,:,:)+ZBFX4*ZFIELD1(JI+2,JJ-1,:,:)) &
                                    +ZBMY2*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ  ,:,:)+ZBFX2*ZFIELD1(JI  ,JJ  ,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ  ,:,:)+ZBFX4*ZFIELD1(JI+2,JJ  ,:,:)) &
                                    +ZBMY3*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ+1,:,:)+ZBFX2*ZFIELD1(JI  ,JJ+1,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ+1,:,:)+ZBFX4*ZFIELD1(JI+2,JJ+1,:,:)) &
                                    +ZBMY4*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ+2,:,:)+ZBFX2*ZFIELD1(JI  ,JJ+2,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ+2,:,:)+ZBFX4*ZFIELD1(JI+2,JJ+2,:,:))
          END IF
        END DO
      END DO
    END DO
  END DO
!
!*      2.3    V points
!
       CASE (3,7)
!
  DO JEPSX = 1,KDXRATIO
    ZBMX1 = PBMX1(JEPSX)
    ZBMX2 = PBMX2(JEPSX)
    ZBMX3 = PBMX3(JEPSX)
    ZBMX4 = PBMX4(JEPSX)
    DO JEPSY = 1,KDYRATIO
      ZBFY1 = PBFY1(JEPSY)
      ZBFY2 = PBFY2(JEPSY)
      ZBFY3 = PBFY3(JEPSY)
      ZBFY4 = PBFY4(JEPSY)
      DO JI = KXOR,KXEND
        IIS = IIB+JEPSX-1+KDXRATIO/2+(JI-KXOR-JPHEXT)*KDXRATIO
        DO JJ = KYOR,KYEND
          IJF = IJB+JEPSY-1           +(JJ-KYOR-JPHEXT)*KDYRATIO

          IF (1 <= IIS .AND. IIS <= IIU .AND. 1 <= IJF .AND. IJF <= IJU) THEN 
!
            PFIELD2  (IIS,IJF,:,:) = ZBFY1*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ-1,:,:)+ZBMX2*ZFIELD1(JI  ,JJ-1,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ-1,:,:)+ZBMX4*ZFIELD1(JI+2,JJ-1,:,:)) &
                                    +ZBFY2*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ  ,:,:)+ZBMX2*ZFIELD1(JI  ,JJ  ,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ  ,:,:)+ZBMX4*ZFIELD1(JI+2,JJ  ,:,:)) &
                                    +ZBFY3*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ+1,:,:)+ZBMX2*ZFIELD1(JI  ,JJ+1,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ+1,:,:)+ZBMX4*ZFIELD1(JI+2,JJ+1,:,:)) &
                                    +ZBFY4*                               &
             ( ZBMX1*ZFIELD1(JI-1,JJ+2,:,:)+ZBMX2*ZFIELD1(JI  ,JJ+2,:,:)  &
              +ZBMX3*ZFIELD1(JI+1,JJ+2,:,:)+ZBMX4*ZFIELD1(JI+2,JJ+2,:,:))
          END IF
        END DO
      END DO
    END DO
  END DO
!
!
!*      2.4    vertical vorticity points
!
       CASE (5,8)
!
  DO JEPSX = 1,KDXRATIO
    ZBFX1 = PBFX1(JEPSX)
    ZBFX2 = PBFX2(JEPSX)
    ZBFX3 = PBFX3(JEPSX)
    ZBFX4 = PBFX4(JEPSX)
    DO JEPSY = 1,KDYRATIO
      ZBFY1 = PBFY1(JEPSY)
      ZBFY2 = PBFY2(JEPSY)
      ZBFY3 = PBFY3(JEPSY)
      ZBFY4 = PBFY4(JEPSY)
      DO JI = KXOR,KXEND
        IIF = IIB+JEPSX-1           +(JI-KXOR-JPHEXT)*KDXRATIO
        DO JJ = KYOR,KYEND
          IJF = IJB+JEPSY-1           +(JJ-KYOR-JPHEXT)*KDYRATIO

          IF (1 <= IIF .AND. IIF <= IIU .AND. 1 <= IJF .AND. IJF <= IJU) THEN 
!
            PFIELD2  (IIF,IJF,:,:) = ZBFY1*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ-1,:,:)+ZBFX2*ZFIELD1(JI  ,JJ-1,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ-1,:,:)+ZBFX4*ZFIELD1(JI+2,JJ-1,:,:)) &
                                    +ZBFY2*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ  ,:,:)+ZBFX2*ZFIELD1(JI  ,JJ  ,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ  ,:,:)+ZBFX4*ZFIELD1(JI+2,JJ  ,:,:)) &
                                    +ZBFY3*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ+1,:,:)+ZBFX2*ZFIELD1(JI  ,JJ+1,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ+1,:,:)+ZBFX4*ZFIELD1(JI+2,JJ+1,:,:)) &
                                    +ZBFY4*                               &
             ( ZBFX1*ZFIELD1(JI-1,JJ+2,:,:)+ZBFX2*ZFIELD1(JI  ,JJ+2,:,:)  &
              +ZBFX3*ZFIELD1(JI+1,JJ+2,:,:)+ZBFX4*ZFIELD1(JI+2,JJ+2,:,:))
          END IF
        END DO
      END DO
    END DO
  END DO
!
END SELECT
!-------------------------------------------------------------------------------
!
!
!
END SUBROUTINE BIKHARDT4D
!  
!     #########################################################################
      SUBROUTINE BIKHARDT3D (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, &
                             PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, &
                             KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,KGRID,   &
                             HLBCX,HLBCY,PFIELD1,PFIELD2)
!     #########################################################################
!
!!****  *BIKHARDT * - interpolates with Bikhardt method
!!
!!    PURPOSE
!!    -------
!!
!     This routine interpolates a field from outer model (PFIELD1) to 
!     inner model (PFIELD2), using Bikhardt interpolation.
!!
!!**  METHOD
!!    ------
!!
!!    The outer model field is extrapolated in each horizontal dimension
!!    in order to allow all cases of KXOR,KYOR,KXEND and KYEND
!!
!!    EXTERNAL
!!    --------
!!
!! 
!!    IMPLICIT ARGUMENTS
!!    ------------------ 
!! 
!!
!!    REFERENCE
!!    ---------
!!
!!       Book1 of the documentation
!!       Routine BIKHARDT (Book2 of the documentation)
!!      
!!
!!    AUTHOR
!!    ------
!!
!!       V. Masson     * METEO-FRANCE *
!!
!!    MODIFICATIONS
!!    -------------
!!
!!      Original     10/06/96 
!!      J.P. Lafore  22/10/96  interpolation coefficients added to the arguments
!!                             list to avoid duplication. 
!-------------------------------------------------------------------------------
!
!*       0.     DECLARATIONS
!               ------------
!
IMPLICIT NONE
!
!*       0.1   Declarations of dummy arguments :
!
                                    ! interpolation coefficients
REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFX1,PBFX2,PBFX3,PBFX4 ! Flux points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFY1,PBFY2,PBFY3,PBFY4 ! Flux points in Y-direc.
!
INTEGER,   INTENT(IN)  :: KXOR,KXEND !  horizontal position (i,j) of the ORigin and END  
INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the inner model domain, relative to outer model
INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
INTEGER,   INTENT(IN)  :: KDYRATIO   ! between inner model and outer model
INTEGER,   INTENT(IN)  :: KGRID      ! code of grid point
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCX   ! type of lateral
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY   ! boundary conditions
REAL, DIMENSION(:,:,:),           INTENT(IN) :: PFIELD1 ! field of outer model
REAL, DIMENSION(:,:,:),           INTENT(OUT):: PFIELD2 ! field of inner model
!
!*       0.2   Declarations of local variables :
!
REAL, DIMENSION(SIZE(PFIELD1,1),SIZE(PFIELD1,2),SIZE(PFIELD1,3),1) :: ZFIELD1 
REAL, DIMENSION(SIZE(PFIELD2,1),SIZE(PFIELD2,2),SIZE(PFIELD2,3),1) :: ZFIELD2 
!
!-------------------------------------------------------------------------------
ZFIELD1(:,:,:,1)=PFIELD1(:,:,:)
CALL BIKHARDT4D(PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, &
                PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, &
      KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,KGRID,HLBCX,HLBCY,ZFIELD1,ZFIELD2)
PFIELD2(:,:,:)  =ZFIELD2(:,:,:,1)
!-------------------------------------------------------------------------------
!
END SUBROUTINE BIKHARDT3D
!
!     #########################################################################
      SUBROUTINE BIKHARDT2D (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, &
                             PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, &
                             KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,KGRID,   &
                             HLBCX,HLBCY,PFIELD1,PFIELD2)
!     #########################################################################
!
!!****  *BIKHARDT * - interpolates with Bikhardt method
!!
!!    PURPOSE
!!    -------
!!
!     This routine interpolates a field from outer model (PFIELD1) to 
!     inner model (PFIELD2), using Bikhardt interpolation.
!!
!!**  METHOD
!!    ------
!!
!!    The outer model field is extrapolated in each horizontal dimension
!!    in order to allow all cases of KXOR,KYOR,KXEND and KYEND
!!
!!    EXTERNAL
!!    --------
!!
!! 
!!    IMPLICIT ARGUMENTS
!!    ------------------ 
!!
!!
!!    REFERENCE
!!    ---------
!!
!!       Book1 of the documentation
!!       Routine BIKHARDT (Book2 of the documentation)
!!      
!!
!!    AUTHOR
!!    ------
!!
!!       V. Masson     * METEO-FRANCE *
!!
!!    MODIFICATIONS
!!    -------------
!!
!!      Original     10/06/96 
!!      J.P. Lafore  22/10/96  interpolation coefficients added to the arguments
!!                             list to avoid duplication. 
!-------------------------------------------------------------------------------
!
!*       0.     DECLARATIONS
!               ------------
!
IMPLICIT NONE
!
!*       0.1   Declarations of dummy arguments :
!
                                    ! interpolation coefficients
REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFX1,PBFX2,PBFX3,PBFX4 ! Flux points in X-direc.
REAL, DIMENSION(:), INTENT(IN) :: PBFY1,PBFY2,PBFY3,PBFY4 ! Flux points in Y-direc.
!
INTEGER,   INTENT(IN)  :: KXOR,KXEND !  horizontal position (i,j) of the ORigin and END  
INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the inner model domain, relative to outer model
INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
INTEGER,   INTENT(IN)  :: KDYRATIO   ! between inner model and outer model
INTEGER,   INTENT(IN)  :: KGRID      ! code of grid point
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCX   ! type of lateral
CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY   ! boundary conditions
REAL, DIMENSION(:,:),             INTENT(IN) :: PFIELD1 ! field of outer model
REAL, DIMENSION(:,:),             INTENT(OUT):: PFIELD2 ! field of inner model
!
!*       0.2   Declarations of local variables :
!
REAL, DIMENSION(SIZE(PFIELD1,1),SIZE(PFIELD1,2),1,1) :: ZFIELD1 
REAL, DIMENSION(SIZE(PFIELD2,1),SIZE(PFIELD2,2),1,1) :: ZFIELD2 
!
!-------------------------------------------------------------------------------
ZFIELD1(:,:,1,1)=PFIELD1(:,:)
CALL BIKHARDT4D(PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, &
                PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, &
      KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,KGRID,HLBCX,HLBCY,ZFIELD1,ZFIELD2)
PFIELD2(:,:)  =ZFIELD2(:,:,1,1)
!-------------------------------------------------------------------------------
!
END SUBROUTINE BIKHARDT2D

end module mode_bikhardt
