From a42eaedf741e3962f191a7025e2bcea208c837de Mon Sep 17 00:00:00 2001
From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr>
Date: Tue, 15 May 2018 14:24:39 +0200
Subject: [PATCH]  J.Colin 15/5/2018 : Viscosity introduction

---
 src/MNH/modd_viscosity.f90 |  48 ++++++
 src/MNH/modn_viscosity.f90 |  37 ++++
 src/MNH/read_desfmn.f90    |  16 ++
 src/MNH/read_exsegn.f90    |  15 +-
 src/MNH/viscosity.f90      | 339 +++++++++++++++++++++++++++++++++++++
 5 files changed, 452 insertions(+), 3 deletions(-)
 create mode 100644 src/MNH/modd_viscosity.f90
 create mode 100644 src/MNH/modn_viscosity.f90
 create mode 100644 src/MNH/viscosity.f90

diff --git a/src/MNH/modd_viscosity.f90 b/src/MNH/modd_viscosity.f90
new file mode 100644
index 000000000..4fb0abcf0
--- /dev/null
+++ b/src/MNH/modd_viscosity.f90
@@ -0,0 +1,48 @@
+!MNH_LIC Copyright 1994-2014 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 MODD_VISC
+!      #######################
+!
+!!****   *MODD_VISCOSITY*  - declaration of viscosity forces constants
+!!
+!!     PURPOSE
+!!     -------
+!        The purpose of this declarative module is to declare the 
+!     viscosity forces constants
+!!
+!!**   IMPLICIT ARGUMENTS
+!!     ------------------
+!!       NONE
+!!
+!!    
+!!     AUTHOR
+!!     ------
+!1       Jeanne Colin         * Meteo-France *
+!!
+!!     MODIFICATIONS
+!!     -------------
+!!       Original            13/04/11
+!----------------------------------------------------------------------------
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+IMPLICIT NONE
+!
+LOGICAL :: LVISC          ! Logical switch to activate viscosity 
+
+LOGICAL :: LVISC_UVW          ! Logical switch to activate viscosity for the
+!                               momentum
+LOGICAL :: LVISC_TH          ! Logical switch to activate viscosity for the
+!                               potential temperature
+LOGICAL :: LVISC_SV          ! Logical switch to activate viscosity for the
+!                               scalar tracer
+LOGICAL :: LVISC_R          ! Logical switch to activate viscosity for the
+!                                moisture
+REAL, SAVE :: XMU_v        ! Molecular (cinematic) viscosity
+REAL, SAVE :: XPRANDTL     ! Prandtl number
+
+END MODULE MODD_VISC
diff --git a/src/MNH/modn_viscosity.f90 b/src/MNH/modn_viscosity.f90
new file mode 100644
index 000000000..d2a9dd8f3
--- /dev/null
+++ b/src/MNH/modn_viscosity.f90
@@ -0,0 +1,37 @@
+!     ###################
+      MODULE MODN_VISC
+!     ###################
+!
+!!****  *MODN_VISCOSITY* - declaration of namelist NAM_VISC
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this module is to specify  the namelist NAM_VISC
+!     which concern the parameters of the viscosity forces for all models
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!          
+!!    AUTHOR
+!!    ------
+!!	    J. Colin                  * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    April 2011
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_VISC
+!
+IMPLICIT NONE
+!
+NAMELIST/NAM_VISC/LVISC,LVISC_UVW,LVISC_TH,LVISC_SV,LVISC_R,XMU_v,XPRANDTL
+!
+END MODULE MODN_VISC
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 98abbf158..1dc1e41e0 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -250,6 +250,8 @@ USE MODN_CH_ORILAM
 USE MODN_DUST
 USE MODN_SALT
 USE MODN_PASPOL
+USE MODN_VISC
+USE MODN_DRAG_n
 #ifdef MNH_FOREFIRE
 USE MODN_FOREFIRE
 #endif
@@ -426,6 +428,12 @@ IF (GFOUND) THEN
   READ(UNIT=ILUDES,NML=NAM_CH_SOLVERn)
   CALL UPDATE_NAM_CH_SOLVERn
 END IF
+CALL POSNAM(ILUDES,'NAM_DRAGN',GFOUND)
+CALL INIT_NAM_DRAGn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_DRAGn)
+  CALL UPDATE_NAM_DRAGn
+END IF
 
 CALL POSNAM(ILUDES,'NAM_SERIESN',GFOUND,ILUOUT)
 CALL INIT_NAM_SERIESn
@@ -575,6 +583,8 @@ IF (KMI == 1) THEN
   LTEMPDEPOS_AER(:) = LDEPOS_AER(:)
   CALL POSNAM(ILUDES,'NAM_LATZ_EDFLX',GFOUND)
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX)
+  CALL POSNAM(ILUDES,'NAM_VISC',GFOUND,ILUOUT)
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC)
 END IF                                                       
 !
 !-------------------------------------------------------------------------------
@@ -669,6 +679,9 @@ IF (NVERB >= 10) THEN
 !  
   WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')")  
   WRITE(UNIT=ILUOUT,NML=NAM_TURBn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** DRAGn *******************')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_DRAGn)
 !
   WRITE(UNIT=ILUOUT,FMT="('********** NUDGINGn ****************')")  
   WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn)
@@ -760,6 +773,9 @@ IF (NVERB >= 10) THEN
 !    
     WRITE(UNIT=ILUOUT,FMT="('************ PASSIVE POLLUTANT  ***************')")
     WRITE(UNIT=ILUOUT,NML=NAM_PASPOL)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ VISCOSITY  ***************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_VISC)
 !
 #ifdef MNH_FOREFIRE
 	WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE  ***************')")
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 89b59328e..ea4aa6e26 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -322,6 +322,7 @@ USE MODN_PARAM_ICE
 USE MODN_LUNIT_n
 USE MODN_NUDGING_n
 USE MODN_TURB_n
+USE MODN_DRAG_n
 USE MODN_BLANK
 USE MODN_CH_MNHC_n
 USE MODN_CH_SOLVER_n
@@ -373,6 +374,9 @@ USE MODN_CONDSAMP
 USE MODN_BLOWSNOW
 USE MODN_BLOWSNOW_n
 USE MODN_2D_FRC
+USE MODN_VISC
+USE MODD_VISC
+USE MODD_DRAG_n
 !
 IMPLICIT NONE
 !
@@ -463,6 +467,7 @@ CALL INIT_NAM_PARAM_MFSHALLN
 CALL INIT_NAM_LBCN
 CALL INIT_NAM_NUDGINGN
 CALL INIT_NAM_TURBN
+CALL INIT_NAM_DRAGN
 CALL INIT_NAM_CH_MNHCN
 CALL INIT_NAM_CH_SOLVERN
 CALL INIT_NAM_SERIESN
@@ -495,6 +500,8 @@ CALL POSNAM(ILUSEG,'NAM_NUDGINGN',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn)
 CALL POSNAM(ILUSEG,'NAM_TURBN',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURBn)
+CALL POSNAM(ILUSEG,'NAM_DRAGN',GFOUND,ILUOUT)
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn)
 CALL POSNAM(ILUSEG,'NAM_CH_MNHCN',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_MNHCn)
 CALL POSNAM(ILUSEG,'NAM_CH_SOLVERN',GFOUND,ILUOUT)
@@ -647,6 +654,8 @@ IF (KMI == 1) THEN
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX)
   CALL POSNAM(ILUSEG,'NAM_BLOWSNOW',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW)
+  CALL POSNAM(ILUSEG,'NAM_VISC',GFOUND,ILUOUT)
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC)
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -669,7 +678,7 @@ CALL TEST_NAM_VAR(ILUOUT,'CRAD',CRAD,'NONE','FIXE','ECMW',&
 #endif
                  'TOPA')
 CALL TEST_NAM_VAR(ILUOUT,'CCLOUD',CCLOUD,'NONE','REVE','KESS',  &
-      & 'ICE2','ICE3','ICE4','C2R2','C3R5','KHKO','LIMA')
+      & 'ICE3','ICE4','C2R2','C3R5','KHKO','LIMA')
 CALL TEST_NAM_VAR(ILUOUT,'CDCONV',CDCONV,'NONE','KAFR')
 CALL TEST_NAM_VAR(ILUOUT,'CSCONV',CSCONV,'NONE','KAFR','EDKF')
 CALL TEST_NAM_VAR(ILUOUT,'CELEC',CELEC,'NONE','ELE3','ELE4')
@@ -690,7 +699,7 @@ CALL TEST_NAM_VAR(ILUOUT,'CLBCY(1)',CLBCY(1),'CYCL','WALL','OPEN')
 CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN')
 !
 CALL TEST_NAM_VAR(ILUOUT,'CTURBDIM',CTURBDIM,'1DIM','3DIM')
-CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','DEAR','BLKR')
+CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','RM17','DEAR','BLKR')
 CALL TEST_NAM_VAR(ILUOUT,'CTOM',CTOM,'NONE','TM06')
 CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM')
 !
@@ -718,7 +727,7 @@ CALL TEST_NAM_VAR(ILUOUT,'CMF_CLOUD',CMF_CLOUD,'NONE','STAT','DIRE')
 !   The test on the CSOLVER name is made elsewhere
 !
 CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE',CPRISTINE_ICE,'PLAT','COLU','BURO')
-CALL TEST_NAM_VAR(ILUOUT,'CSEDIM',CSEDIM,'SPLI','STAT')
+CALL TEST_NAM_VAR(ILUOUT,'CSEDIM',CSEDIM,'SPLI','STAT','NONE')
 IF( CCLOUD == 'C3R5' ) THEN
   CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_C1R3',CPRISTINE_ICE_C1R3, &
                                                 'PLAT','COLU','BURO')
diff --git a/src/MNH/viscosity.f90 b/src/MNH/viscosity.f90
new file mode 100644
index 000000000..ae03806c0
--- /dev/null
+++ b/src/MNH/viscosity.f90
@@ -0,0 +1,339 @@
+!MNH_LIC Copyright 1994-2014 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_VISC
+!     #####################
+!
+INTERFACE
+!
+    SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL,          &
+                        OVISC_UVW, OVISC_TH, OVISC_SV, OVISC_R,         &
+                        ODRAG,  &
+                        PUT, PVT, PWT, PTHT, PRT, PSVT,                 &
+                        PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY,           &
+                        PRUS, PRVS, PRWS, PRTHS, PRRS, PRSVS,PDRAG      )
+!
+     IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments:
+!
+! X and Y lateral boundary conditions
+     CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY 
+!
+     INTEGER, INTENT(IN) :: KRR      ! number of moist variables
+     INTEGER, INTENT(IN) :: KSV      ! number of scalar variables
+!
+     REAL, INTENT(IN) :: PNU         ! viscosity coefficient
+     REAL, INTENT(IN) :: PPRANDTL    ! Parandtl number
+!
+!
+! logical switches
+     LOGICAL, INTENT(IN) :: OVISC_UVW ! momentum
+     LOGICAL, INTENT(IN) :: OVISC_TH  ! theta
+     LOGICAL, INTENT(IN) :: OVISC_SV  ! scalar tracer
+     LOGICAL, INTENT(IN) :: OVISC_R   ! moisture
+     LOGICAL, INTENT(IN) :: ODRAG     ! noslip/freeslip 
+!
+!
+! input variables at time t
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PVT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT
+     REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT
+     REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT
+!
+!
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! rho_ref * Jacobian
+!
+      REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slipcondition is applied
+! metric coefficients
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY
+!
+! output source terms
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS
+     REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS
+!
+   END SUBROUTINE VISCOSITY
+!
+END INTERFACE
+!
+END MODULE MODI_VISC
+!
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL,          &
+                     OVISC_UVW, OVISC_TH, OVISC_SV, OVISC_R,         &
+                     ODRAG,        &
+                     PUT, PVT, PWT, PTHT, PRT, PSVT,                 &
+                     PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY,           &
+                     PRUS, PRVS, PRWS, PRTHS, PRRS, PRSVS,PDRAG      )
+!
+!    IMPLICIT ARGUMENTS
+!    ------------------ 
+!      Module MODD_PARAMETERS: JPHEXT, JPVEXT
+!      Module MODD_CONF: L2D
+!
+!!    AUTHOR
+!!    ------
+!!      Jeanne Colin                      * CNRM *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      01/18 (C.Lac) Add budgets
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+  USE MODI_LAP_M
+  USE MODI_SHUMAN  
+  USE MODD_PARAMETERS
+  USE MODD_CONF
+  USE MODD_VISC
+  USE MODD_DRAG_n
+  USE MODD_BUDGET
+  USE MODE_ll
+  USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+  USE MODE_FM
+  USE MODI_BUDGET
+!
+!-------------------------------------------------------------------------------
+!
+  IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+! X and Y lateral boundary conditions
+  CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY 
+!
+  INTEGER, INTENT(IN) :: KRR      ! number of moist variables
+  INTEGER, INTENT(IN) :: KSV      ! number of scalar variables
+!
+  REAL, INTENT(IN) :: PPRANDTL    ! Parandtl number
+  REAL, INTENT(IN) :: PNU         ! viscous diffusion rate 
+!
+! logical switches
+     LOGICAL, INTENT(IN) :: OVISC_UVW ! momentum
+     LOGICAL, INTENT(IN) :: OVISC_TH  ! theta
+     LOGICAL, INTENT(IN) :: OVISC_SV  ! scalar tracer
+     LOGICAL, INTENT(IN) :: OVISC_R   ! moisture
+     LOGICAL, INTENT(IN) :: ODRAG     ! moisture
+!
+! input variables at time t
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PVT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT
+     REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT
+     REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT
+!
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! rho_ref * Jacobian
+!
+!
+REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slip condition is applied
+
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX
+     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY
+!
+! output source terms
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS
+     REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS
+!
+!
+!*       0.2   Declarations of local variables
+!
+  INTEGER :: IK ! counter
+  INTEGER :: IKB, IKE
+!
+  REAL, DIMENSION(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3)) :: ZTMP ! temp storage
+  REAL, DIMENSION(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3)) :: ZLAPu ! temp storage
+  REAL, DIMENSION(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3)) :: ZLAPv ! temp storage
+  REAL, DIMENSION(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3)) :: ZY1 ! temp storage
+  REAL, DIMENSION(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3)) :: ZY2 ! temp storage
+!
+!
+INTEGER                          :: IIU,IJU,IKU         ! I,J,K array sizes
+!
+INTEGER                          :: JI,JJ,JK  ! I loop index
+INTEGER :: IINFO_ll
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
+!
+!
+!-------------------------------------------------------------------------------
+!
+IIU=SIZE(PWT,1)
+IJU=SIZE(PWT,2)
+IKU=SIZE(PWT,3)
+
+!*       1.    Viscous forcing for potential temperature
+!	       -----------------------------------------
+!
+!
+IF (OVISC_TH) THEN
+!
+!
+      PRTHS = PRTHS + PNU/PPRANDTL * &
+              LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHT)
+!
+!
+ END IF
+!
+IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'VISC_BU_RU')
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    Viscous forcing for moisture
+!	       ----------------------------
+!
+ IF (OVISC_R .AND. (SIZE(PRT,1) > 0)) THEN
+!
+!
+     DO IK = 1, KRR
+        PRRS(:,:,:,IK) = PRRS(:,:,:,IK) + PNU/PPRANDTL * &
+             LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PRT(:,:,:,IK))
+     END DO
+!
+!
+ END IF
+!
+IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6,'VISC_BU_RRV')
+IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'VISC_BU_RRC')
+IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8,'VISC_BU_RRR')
+IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9,'VISC_BU_RRI')
+IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'VISC_BU_RRS')
+IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'VISC_BU_RRG')
+IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'VISC_BU_RRH')
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    Viscous forcing for passive scalars
+!	       -----------------------------------
+!
+ IF (OVISC_SV .AND. (SIZE(PSVT,1) > 0)) THEN
+!
+!
+      DO IK = 1, KSV
+         PRSVS(:,:,:,IK) = PRSVS(:,:,:,IK) + PNU/PPRANDTL * &
+              LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PSVT(:,:,:,IK))
+      END DO
+!
+ END IF
+!
+IF (LBUDGET_SV) THEN
+  DO  IK = 1, KSV
+    CALL BUDGET (PRSVS(:,:,:,IK), 12+IK, 'VISC_BU_RSV')
+  END DO
+END IF
+!
+
+!-------------------------------------------------------------------------------
+!
+!*       4.    Viscous forcing for momentum
+!	       ----------------------------
+!
+IF (OVISC_UVW) THEN
+!
+!*       4.1   U - component
+!
+!
+      ZY1 = MXF(PUT)
+      IF (ODRAG) THEN
+         ZY1(:,:,1) = PDRAG * ZY1(:,:,2)
+      ENDIF
+!
+! 
+       ZLAPu = LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,   &
+                   PDZY,PDZZ,PRHODJ,ZY1)
+!! Update halo to compute the source term
+NULLIFY(TZFIELDS_ll)
+CALL ADD3DFIELD_ll(TZFIELDS_ll,ZLAPu)
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+PRUS = PRUS + MXM(PNU*ZLAPu)
+!
+!*       4.2   V - component
+!              -------------
+!
+  IF (.NOT. L2D) THEN
+
+      ZY2 = MYF(PVT) 
+         IF (ODRAG) THEN
+         ZY2(:,:,1) = PDRAG * ZY2(:,:,2)
+         ENDIF
+      ELSE
+!
+      ZLAPv =  LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,   &
+                     PDZY,PDZZ,PRHODJ,ZY2)
+!! Update halo to compute the source term
+!
+NULLIFY(TZFIELDS_ll)
+CALL ADD3DFIELD_ll(TZFIELDS_ll,ZLAPv)
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+PRVS = PRVS + MYM(PNU*ZLAPv)
+
+ENDIF 
+
+!
+!*       4.3   W - component
+!              -------------
+!
+   IKB = JPVEXT + 1
+   IKE = SIZE(PWT,3) - JPVEXT
+
+     ZTMP = PWT
+!
+IF (ODRAG) THEN
+         WHERE (PDRAG==-1)
+         ZTMP(:,:,IKB) = 0.
+         ENDWHERE
+ENDIF
+!
+   DO IK = 1,JPVEXT
+      ZTMP(:,:,IK) = ZTMP(:,:,IKB)
+     ZTMP(:,:,IKE+IK) = ZTMP(:,:,IKE)
+   END DO
+!
+   ZTMP = MZM(1,IKU,1, PNU * &
+          LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTMP) )
+
+   DO IK = 1,JPVEXT
+      ZTMP(:,:,IK) = ZTMP(:,:,IKB)
+      ZTMP(:,:,IKE+IK) = ZTMP(:,:,IKE) 
+   END DO
+PRWS = PRWS + ZTMP
+!
+!!! Debug provisoire dans le cas ou le noslip est applique jusqu'au bord de
+!sortie de flux en OPEN
+  IF ( LWEST_ll().AND.(ODRAG).AND.(MINVAL(PDRAG(IIU,:))== -1)) THEN
+              DO JK=1,IKU
+                WHERE(PDRAG(IIU,:)== -1)
+            PRUS(IIU,:,JK) = PRUS(IIU-1,:,JK)
+            PRVS(IIU,:,JK) = PRVS(IIU-1,:,JK)
+            PRWS(IIU,:,JK) = PRWS(IIU-1,:,JK)
+                ENDWHERE
+            END DO
+  ENDIF
+END IF
+!
+IF (LBUDGET_U) CALL BUDGET (PRUS,1,'VISC_BU_RU')
+IF (LBUDGET_V) CALL BUDGET (PRVS,2,'VISC_BU_RV')
+IF (LBUDGET_W) CALL BUDGET (PRWS,2,'VISC_BU_RW')
+!
+END SUBROUTINE VISCOSITY
-- 
GitLab