From 788bc0c7769bdb3e864d5d0c7f646f4e93349450 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 27 Mar 2023 13:32:39 +0200
Subject: [PATCH] Philippe 27/03/2023: ZSOLVER: remove qlap.f90 (use the one in
 MNH/)

---
 src/ZSOLVER/qlap.f90 | 641 -------------------------------------------
 1 file changed, 641 deletions(-)
 delete mode 100644 src/ZSOLVER/qlap.f90

diff --git a/src/ZSOLVER/qlap.f90 b/src/ZSOLVER/qlap.f90
deleted file mode 100644
index 5b2e7dd3a..000000000
--- a/src/ZSOLVER/qlap.f90
+++ /dev/null
@@ -1,641 +0,0 @@
-!MNH_LIC Copyright 1994-2022 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.
-!-----------------------------------------------------------------
-!     ################
-      MODULE MODI_QLAP
-!     ################
-!
-INTERFACE
-!
-      FUNCTION QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY)  &
-               RESULT(PQLAP)
-!  
-IMPLICIT NONE
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
-!
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PY        ! field components
-!
-REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PQLAP ! final divergence 
-!
-END FUNCTION QLAP
-!
-!
-#ifdef MNH_OPENACC
-SUBROUTINE QLAP_DEVICE(PQLAP,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY)  
-!  
-IMPLICIT NONE
-!
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQLAP ! final divergence   
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
-!
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PY        ! field components
-!
-
-!
-END SUBROUTINE QLAP_DEVICE
-#endif
-END INTERFACE
-!
-END MODULE MODI_QLAP
-!
-!
-!
-!     #########################################################################
-      FUNCTION QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY)  &
-               RESULT(PQLAP)
-!     #########################################################################
-!
-!!****  *QLAP * - compute the complete quasi-laplacien QLAP of a field P 
-!!
-!!    PURPOSE
-!!    -------
-!       This function computes the quasi-laplacien QLAP of the scalar field P
-!     localized at a mass point, with non-vanishing orography.
-!     The result is localized at a mass point and defined by: 
-!                    for Durran and MAE anelastic equations
-!                                   (                        ( GX_M_U (PY) )  )                 
-!                    PQLAP   = GDIV ( rho * CPd * Thetav * J ( GX_M_V (PY) )  )
-!                                   (                        ( GX_M_W (PY) )  )  
-!                    or for Lipps and Hemler
-!                                   (                        ( GX_M_U (PY) )  )                 
-!                    PQLAP   = GDIV ( rho                * J ( GX_M_V (PY) )  )
-!                                   (                        ( GX_M_W (PY) )  )  
-!     Where GX_M_.. are the cartesian components of the gradient of PY and
-!     GDIV is the operator acting on a vector AA: 
-!                   
-!                   GDIV ( AA ) = J * divergence (1/J  AA  ) 
-!     
-!!**  METHOD
-!!    ------
-!!      First, we compute the gradients along x, y , z of the P field. The 
-!!    result is multiplied by rhod * CPd * Thetav or  rhod depending on the 
-!!    chosen anelastic system where the suffixes indicate 
-!!    d dry and v for virtual.
-!!      Then, the pseudo-divergence ( J * DIV (1/J o ) ) is computed by the 
-!!    subroutine GDIV. The result is localized at a mass point.
-!!
-!!    EXTERNAL
-!!    --------
-!!      Function GX_M_U : compute the gradient along x 
-!!      Function GY_M_V : compute the gradient along y 
-!!      Function GZ_M_W : compute the gradient along z 
-!!      FUNCTION MXM: compute an average in the x direction for a variable  
-!!      at a mass localization
-!!      FUNCTION MYM: compute an average in the y direction for a variable  
-!!      at a mass localization
-!!      FUNCTION MZM: compute an average in the z direction for a variable  
-!!      at a mass localization
-!!      Subroutine GDIV : compute J times the divergence of 1/J times a vector
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------ 
-!!      Module MODD_PARAMETERS: JPHEXT, JPVEXT
-!!      Module MODD_CONF: L2D,CEQNSYS
-!!      Module MODD_CST : XCPD
-!!
-!!    REFERENCE
-!!    ---------
-!!      Pressure solver documentation ( Scientific documentation )
-!!
-!!    AUTHOR
-!!    ------
-!!	P. Hereil and J. Stein       * Meteo France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original       11/07/94 
-!!      Modification   16/03/95 change the argument list of the gradient
-!!                     14/01/97 New anelastic equation ( Stein )
-!!                     17/12/97 include the case of non-vanishing orography
-!!                              at the lbc ( Stein )
-!!                     06/12 V.Masson : update_halo due to CONTRAV changes
-!!   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1  
-!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
-!  F. Auguste       02/21: add IBM
-!-------------------------------------------------------------------------------
-!
-!*       0.    DECLARATIONS
-!              ------------
-!
-USE MODE_ll
-!
-USE MODD_PARAMETERS
-USE MODD_CONF
-USE MODD_CST
-USE MODI_GDIV
-USE MODI_GRADIENT_M
-USE MODI_SHUMAN
-!
-USE MODE_MPPDB
-#ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
-#endif
-!
-USE MODD_IBM_PARAM_n, ONLY: XIBM_LS, LIBM, XIBM_SU
-USE MODI_IBM_BALANCE
-!
-IMPLICIT NONE
-!
-!*       0.1   declarations of arguments
-!
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
-!
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PY        ! field components
-!
-REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PQLAP ! final divergence 
-!
-!*       0.2   declarations of local variables
-!
-#ifndef MNH_OPENACC
-REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZU ! rho*J*gradient along x
-!
-REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZV ! rho*J*gradient along y
-!
-REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZW ! rho*J*gradient along z
-#else
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZU ! rho*J*gradient along x
-!
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZV ! rho*J*gradient along y
-!
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZW ! rho*J*gradient along z
-#endif
-!
-INTEGER                          :: IIU,IJU,IKU         ! I,J,K array sizes
-INTEGER                          :: JK,JJ,JI            ! vertical loop index
-TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
-INTEGER :: IINFO_ll
-INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE
-!-------------------------------------------------------------------------------
-!
-!
-!*       1.    COMPUTE THE GRADIENT COMPONENTS
-!              -------------------------------
-!
-CALL GET_DIM_EXT_ll('B',IIU,IJU)
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKU=SIZE(PY,3)
-IKE = IKU - JPVEXT
-IKB =   1 + JPVEXT
-!
-#ifdef MNH_OPENACC
-!Pin positions in the pools of MNH memory
-CALL MNH_MEM_POSITION_PIN()
-
-CALL MNH_MEM_GET( ZU,IIU,IJU,IKU  )
-CALL MNH_MEM_GET( ZV,IIU,IJU,IKU  )
-CALL MNH_MEM_GET( ZW,IIU,IJU,IKU  )
-#endif
-!
-ZU = GX_M_U(1,IKU,1,PY,PDXX,PDZZ,PDZX)
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU',PRECISION)
-!
-IF ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) THEN
-  DO JK=2,IKU-1
-    DO JJ=1,IJU
-      ZU(IIB,JJ,JK)=  (PY(IIB,JJ,JK) - PY(IIB-1,JJ,JK) - 0.5 * (                  &
-       PDZX(IIB,JJ,JK)   * (PY(IIB,JJ,JK)-PY(IIB,JJ,JK-1)) / PDZZ(IIB,JJ,JK)      &
-      +PDZX(IIB,JJ,JK+1) * (PY(IIB,JJ,JK+1)-PY(IIB,JJ,JK)) / PDZZ(IIB,JJ,JK+1)    &  
-                                      )    ) / PDXX(IIB,JJ,JK)
-    END DO
-  END DO
-END IF
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/W',PRECISION)
-!
-IF ( HLBCX(1) /= 'CYCL' .AND. LEAST_ll() ) THEN
-  DO JK=2,IKU-1
-    DO JJ=1,IJU
-      ZU(IIE+1,JJ,JK)=  (PY(IIE+1,JJ,JK) - PY(IIE+1-1,JJ,JK) - 0.5 * (                    &
-        PDZX(IIE+1,JJ,JK)   * (PY(IIE+1-1,JJ,JK)-PY(IIE+1-1,JJ,JK-1)) / PDZZ(IIE+1-1,JJ,JK)  &
-       +PDZX(IIE+1,JJ,JK+1) * (PY(IIE+1-1,JJ,JK+1)-PY(IIE+1-1,JJ,JK)) / PDZZ(IIE+1-1,JJ,JK+1)&  
-                                            ) ) / PDXX(IIE+1,JJ,JK)
-    END DO
-  END DO
-END IF
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/E',PRECISION)
-!
-IF(.NOT. L2D) THEN 
-!
-  ZV = GY_M_V(1,IKU,1,PY,PDYY,PDZZ,PDZY)
-  CALL MPPDB_CHECK3D(ZV,'QLAP::ZV',PRECISION)
-!
-  IF ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) THEN 
-    DO JK=2,IKU-1
-      DO JI=1,IIU
-        ZV(JI,IJB,JK)=   (PY(JI,IJB,JK) - PY(JI,IJB-1,JK) - 0.5 * (                  &
-          PDZY(JI,IJB,JK)   * (PY(JI,IJB,JK)-PY(JI,IJB,JK-1)) / PDZZ(JI,IJB,JK)      &
-         +PDZY(JI,IJB,JK+1) * (PY(JI,IJB,JK+1)-PY(JI,IJB,JK)) / PDZZ(JI,IJB,JK+1)    &  
-                                            )   ) / PDYY(JI,IJB,JK) 
-      END DO
-    END DO
-  END IF
-  CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/S',PRECISION)
-  IF ( HLBCY(1) /= 'CYCL' .AND. LNORTH_ll() ) THEN
-!
-    DO JK=2,IKU-1
-      DO JI=1,IIU
-        ZV(JI,IJE+1,JK)=    (PY(JI,IJE+1,JK) - PY(JI,IJE+1-1,JK) - 0.5 * (                  &
-          PDZY(JI,IJE+1,JK)   * (PY(JI,IJE+1-1,JK)-PY(JI,IJE+1-1,JK-1)) / PDZZ(JI,IJE+1-1,JK)  &
-         +PDZY(JI,IJE+1,JK+1) * (PY(JI,IJE+1-1,JK+1)-PY(JI,IJE+1-1,JK)) / PDZZ(JI,IJE+1-1,JK+1)&
-                                                )  ) / PDYY(JI,IJE+1,JK) 
-      END DO
-    END DO
-  END IF
- CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/N',PRECISION)
-!
-ELSE
-  ZV=0.
-ENDIF
-!
-IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN
-  ZU = MXM(PRHODJ * XCPD * PTHETAV) *  ZU
-  IF(.NOT. L2D) THEN 
-    ZV = MYM(PRHODJ * XCPD * PTHETAV) *  ZV
-  END IF
-  ZW = MZM(PRHODJ * XCPD * PTHETAV) *  GZ_M_W(1,IKU,1,PY,PDZZ)
-ELSEIF ( CEQNSYS == 'LHE' ) THEN 
-  ZU = MXM(PRHODJ) * ZU
-  IF(.NOT. L2D) THEN 
-    ZV = MYM(PRHODJ) * ZV
-  ENDIF
-  ZW = MZM(PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ)
-END IF
-!
-!-------------------------------------------------------------------------------
-!
-!*       2.    COMPUTE THE DIVERGENCE  
-!              ----------------------
-!
-NULLIFY(TZFIELDS_ll)
-CALL ADD3DFIELD_ll( TZFIELDS_ll, ZU, 'QLAP::ZU' )
-CALL ADD3DFIELD_ll( TZFIELDS_ll, ZV, 'QLAP::ZV' )
-CALL ADD3DFIELD_ll( TZFIELDS_ll, ZW, 'QLAP::ZW' )
-CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
-CALL CLEANLIST_ll(TZFIELDS_ll)
-!
-!$acc update device( ZU, ZV, ZW )
-CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,ZU,ZV,ZW,PQLAP)
-!
-IF (LIBM)  THEN
-   !
-   CALL IBM_BALANCE(XIBM_LS,XIBM_SU,ZU,ZV,ZW,PQLAP)
-   !
-   PQLAP(:,:,IKB-1) = PQLAP(:,:,IKB-1)*XIBM_SU(:,:,IKB,1)
-   PQLAP(:,:,IKE+1) = PQLAP(:,:,IKE+1)*XIBM_SU(:,:,IKE,1)
-   !
-   IF ( HLBCX(1) /= 'CYCL' ) THEN
-      IF(LWEST_ll()) PQLAP(IIB-1,:,:) = PQLAP(IIB-1,:,:)*XIBM_SU(IIB,:,:,1)
-      IF(LEAST_ll()) PQLAP(IIE+1,:,:) = PQLAP(IIE+1,:,:)*XIBM_SU(IIE,:,:,1)
-   ENDIF
-   !
-   IF ( HLBCY(1) /= 'CYCL' ) THEN
-      IF (LSOUTH_ll()) PQLAP(:,IJB-1,:) = PQLAP(:,IJB-1,:)*XIBM_SU(:,IJB,:,1)
-      IF (LNORTH_ll()) PQLAP(:,IJE+1,:) = PQLAP(:,IJE+1,:)*XIBM_SU(:,IJE,:,1)
-   ENDIF
-   !
-ENDIF
-!
-#ifdef MNH_OPENACC
-!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
-CALL MNH_MEM_RELEASE()
-#endif
-!-------------------------------------------------------------------------------
-!
-END FUNCTION QLAP
-
-#ifdef MNH_OPENACC
-!     #########################################################################
-      SUBROUTINE QLAP_DEVICE(PQLAP,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY) 
-!     #########################################################################
-!
-!!****  *QLAP * - compute the complete quasi-laplacien QLAP of a field P 
-!!
-!!    PURPOSE
-!!    -------
-!       This function computes the quasi-laplacien QLAP of the scalar field P
-!     localized at a mass point, with non-vanishing orography.
-!     The result is localized at a mass point and defined by: 
-!                    for Durran and MAE anelastic equations
-!                                   (                        ( GX_M_U (PY) )  )                 
-!                    PQLAP   = GDIV ( rho * CPd * Thetav * J ( GX_M_V (PY) )  )
-!                                   (                        ( GX_M_W (PY) )  )  
-!                    or for Lipps and Hemler
-!                                   (                        ( GX_M_U (PY) )  )                 
-!                    PQLAP   = GDIV ( rho                * J ( GX_M_V (PY) )  )
-!                                   (                        ( GX_M_W (PY) )  )  
-!     Where GX_M_.. are the cartesian components of the gradient of PY and
-!     GDIV is the operator acting on a vector AA: 
-!                   
-!                   GDIV ( AA ) = J * divergence (1/J  AA  ) 
-!     
-!!**  METHOD
-!!    ------
-!!      First, we compute the gradients along x, y , z of the P field. The 
-!!    result is multiplied by rhod * CPd * Thetav or  rhod depending on the 
-!!    chosen anelastic system where the suffixes indicate 
-!!    d dry and v for virtual.
-!!      Then, the pseudo-divergence ( J * DIV (1/J o ) ) is computed by the 
-!!    subroutine GDIV. The result is localized at a mass point.
-!!
-!!    EXTERNAL
-!!    --------
-!!      Function GX_M_U : compute the gradient along x 
-!!      Function GY_M_V : compute the gradient along y 
-!!      Function GZ_M_W : compute the gradient along z 
-!!      FUNCTION MXM: compute an average in the x direction for a variable  
-!!      at a mass localization
-!!      FUNCTION MYM: compute an average in the y direction for a variable  
-!!      at a mass localization
-!!      FUNCTION MZM: compute an average in the z direction for a variable  
-!!      at a mass localization
-!!      Subroutine GDIV : compute J times the divergence of 1/J times a vector
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------ 
-!!      Module MODD_PARAMETERS: JPHEXT, JPVEXT
-!!      Module MODD_CONF: L2D,CEQNSYS
-!!      Module MODD_CST : XCPD
-!!
-!!    REFERENCE
-!!    ---------
-!!      Pressure solver documentation ( Scientific documentation )
-!!
-!!    AUTHOR
-!!    ------
-!!	P. Hereil and J. Stein       * Meteo France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original       11/07/94 
-!!      Modification   16/03/95 change the argument list of the gradient
-!!                     14/01/97 New anelastic equation ( Stein )
-!!                     17/12/97 include the case of non-vanishing orography
-!!                              at the lbc ( Stein )
-!!                     06/12 V.Masson : update_halo due to CONTRAV changes
-!!   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1  
-!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
-!  F. Auguste       02/21: add IBM
-!-------------------------------------------------------------------------------
-!
-!*       0.    DECLARATIONS
-!              ------------
-!
-USE MODE_ll
-!
-USE MODD_PARAMETERS
-USE MODD_CONF
-USE MODD_CST
-USE MODI_GDIV
-USE MODI_GRADIENT_M
-USE MODI_SHUMAN
-USE MODI_SHUMAN_DEVICE
-!
-USE MODE_MPPDB
-!
-USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
-!
-USE MODI_GET_HALO
-USE MODD_IBM_PARAM_n, ONLY: XIBM_LS, LIBM, XIBM_SU
-USE MODI_IBM_BALANCE
-!
-IMPLICIT NONE
-!
-!*       0.1   declarations of arguments
-!
-!
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQLAP ! final divergence   
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
-!
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PY        ! field components
-!
-!*       0.2   declarations of local variables
-!
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZU ! rho*J*gradient along x
-!
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZV ! rho*J*gradient along y
-!
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZW ! rho*J*gradient along z
-!
-INTEGER                          :: IIU,IJU,IKU         ! I,J,K array sizes
-INTEGER                          :: JK,JJ,JI            ! vertical loop index
-TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
-INTEGER :: IINFO_ll
-INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE
-!
-REAL, DIMENSION(:,:,:), pointer , contiguous :: ZMXM,ZMYM,ZMZM,ZRHODJ,ZGZMW
-!
-LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
-!-------------------------------------------------------------------------------
-!
-!
-!*       1.    COMPUTE THE GRADIENT COMPONENTS
-!              -------------------------------
-!
-CALL GET_DIM_EXT_ll('B',IIU,IJU)
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKU=SIZE(PY,3)
-IKE = IKU - JPVEXT
-IKB =   1 + JPVEXT
-!
-GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
-GEAST  = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() )
-GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() )
-GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() )
-!
-CALL MNH_MEM_POSITION_PIN()
-CALL MNH_MEM_GET( ZU, IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZV, IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZW, IIU, IJU, IKU )
-!
-CALL MNH_MEM_GET( ZMXM,   IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZMYM,   IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZMZM,   IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZRHODJ, IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZGZMW,  IIU, IJU, IKU )
-!
-CALL GX_M_U_DEVICE(1,IKU,1,PY,PDXX,PDZZ,PDZX,ZU)
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU',PRECISION)
-!
-IF ( GWEST ) THEN
-   !$acc kernels async
-   DO JK=2,IKU-1
-      DO JJ=1,IJU
-         ZU(IIB,JJ,JK)=  (PY(IIB,JJ,JK) - PY(IIB-1,JJ,JK) - 0.5 * (                  &
-              PDZX(IIB,JJ,JK)   * (PY(IIB,JJ,JK)-PY(IIB,JJ,JK-1)) / PDZZ(IIB,JJ,JK)      &
-              +PDZX(IIB,JJ,JK+1) * (PY(IIB,JJ,JK+1)-PY(IIB,JJ,JK)) / PDZZ(IIB,JJ,JK+1)    &  
-              )    ) / PDXX(IIB,JJ,JK)
-      END DO
-   END DO
-   !$acc end kernels
-END IF
-!
-IF ( GEAST ) THEN
-   !$acc kernels async
-   DO JK=2,IKU-1
-      DO JJ=1,IJU
-         ZU(IIE+1,JJ,JK)=  (PY(IIE+1,JJ,JK) - PY(IIE+1-1,JJ,JK) - 0.5 * (                    &
-              PDZX(IIE+1,JJ,JK)   * (PY(IIE+1-1,JJ,JK)-PY(IIE+1-1,JJ,JK-1)) / PDZZ(IIE+1-1,JJ,JK)  &
-              +PDZX(IIE+1,JJ,JK+1) * (PY(IIE+1-1,JJ,JK+1)-PY(IIE+1-1,JJ,JK)) / PDZZ(IIE+1-1,JJ,JK+1)&  
-              ) ) / PDXX(IIE+1,JJ,JK)
-      END DO
-   END DO
-   !$acc end kernels
-END IF
-!$acc wait
-!
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/W',PRECISION)
-CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/E',PRECISION)
-!
-IF(.NOT. L2D) THEN 
-!
-  CALL GY_M_V_DEVICE(1,IKU,1,PY,PDYY,PDZZ,PDZY,ZV)
-  CALL MPPDB_CHECK3D(ZV,'QLAP::ZV',PRECISION)
-!
-  IF ( GSOUTH ) THEN
-     !$acc kernels async
-     DO JK=2,IKU-1
-        DO JI=1,IIU
-           ZV(JI,IJB,JK)=   (PY(JI,IJB,JK) - PY(JI,IJB-1,JK) - 0.5 * (                  &
-                PDZY(JI,IJB,JK)   * (PY(JI,IJB,JK)-PY(JI,IJB,JK-1)) / PDZZ(JI,IJB,JK)      &
-                +PDZY(JI,IJB,JK+1) * (PY(JI,IJB,JK+1)-PY(JI,IJB,JK)) / PDZZ(JI,IJB,JK+1)    &  
-                )   ) / PDYY(JI,IJB,JK) 
-        END DO
-     END DO
-     !$acc end kernels
-  END IF
-
-  
-  IF ( GNORTH ) THEN
-     !$acc kernels async
-     DO JK=2,IKU-1
-        DO JI=1,IIU
-           ZV(JI,IJE+1,JK)=    (PY(JI,IJE+1,JK) - PY(JI,IJE+1-1,JK) - 0.5 * ( &
-                PDZY(JI,IJE+1,JK)   * (PY(JI,IJE+1-1,JK)-PY(JI,IJE+1-1,JK-1)) &
-                                      / PDZZ(JI,IJE+1-1,JK)  &
-               +PDZY(JI,IJE+1,JK+1) * (PY(JI,IJE+1-1,JK+1)-PY(JI,IJE+1-1,JK)) &
-                                      / PDZZ(JI,IJE+1-1,JK+1)&
-                )  ) / PDYY(JI,IJE+1,JK) 
-        END DO
-     END DO
-     !$acc end kernels
-  END IF
-  !$acc wait
-  CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/S',PRECISION)  
-  CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/N',PRECISION)
-!
-ELSE
-  ZV=0.
-ENDIF
-!
-IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN
-   !$acc kernels
-   ZRHODJ(:,:,:) = PRHODJ(:,:,:) * XCPD * PTHETAV(:,:,:)
-   !$acc end kernels
-   CALL MXM_DEVICE (ZRHODJ, ZMXM )
-   !$acc kernels present(ZU)
-   ZU(:,:,:) = ZMXM(:,:,:) *  ZU(:,:,:)
-   !$acc end kernels
-  IF(.NOT. L2D) THEN 
-     CALL MYM_DEVICE (ZRHODJ, ZMYM )
-     !$acc kernels present(ZV)
-     ZV(:,:,:) = ZMYM(:,:,:) * ZV(:,:,:)
-     !$acc end kernels
-  END IF
-  CALL MZM_DEVICE (ZRHODJ, ZMZM )
-  CALL GZ_M_W_DEVICE(1,IKU,1,PY,PDZZ,ZGZMW)
-  !$acc kernels present(ZW)
-  ZW(:,:,:) = ZMZM(:,:,:) * ZGZMW(:,:,:)
-  !$acc end kernels
-ELSEIF ( CEQNSYS == 'LHE' ) THEN 
-  ZU = MXM(PRHODJ) * ZU
-  IF(.NOT. L2D) THEN 
-    ZV = MYM(PRHODJ) * ZV
-  ENDIF
-  ZW = MZM(PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ)
-END IF
-!
-!-------------------------------------------------------------------------------
-!
-!*       2.    COMPUTE THE DIVERGENCE  
-!              ----------------------
-!
-CALL GET_HALO_D(ZU,HNAME='QLAP::ZU')
-CALL GET_HALO_D(ZV,HNAME='QLAP::ZV')
-CALL GET_HALO_D(ZW,HNAME='QLAP::ZW')
-!
-CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,ZU,ZV,ZW,PQLAP)
-!
-IF (LIBM)  THEN
-   !
-   CALL IBM_BALANCE(XIBM_LS,XIBM_SU,ZU,ZV,ZW,PQLAP)
-   !
-   PQLAP(:,:,IKB-1) = PQLAP(:,:,IKB-1)*XIBM_SU(:,:,IKB,1)
-   PQLAP(:,:,IKE+1) = PQLAP(:,:,IKE+1)*XIBM_SU(:,:,IKE,1)
-   !
-   IF ( HLBCX(1) /= 'CYCL' ) THEN
-      IF(LWEST_ll()) PQLAP(IIB-1,:,:) = PQLAP(IIB-1,:,:)*XIBM_SU(IIB,:,:,1)
-      IF(LEAST_ll()) PQLAP(IIE+1,:,:) = PQLAP(IIE+1,:,:)*XIBM_SU(IIE,:,:,1)
-   ENDIF
-   !
-   IF ( HLBCY(1) /= 'CYCL' ) THEN
-      IF (LSOUTH_ll()) PQLAP(:,IJB-1,:) = PQLAP(:,IJB-1,:)*XIBM_SU(:,IJB,:,1)
-      IF (LNORTH_ll()) PQLAP(:,IJE+1,:) = PQLAP(:,IJE+1,:)*XIBM_SU(:,IJE,:,1)
-   ENDIF
-   !
-ENDIF
-!
-!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
-CALL MNH_MEM_RELEASE()
-!-------------------------------------------------------------------------------
-!
-END SUBROUTINE QLAP_DEVICE
-#endif
-- 
GitLab