From 7ef4358cccb8ad6833b5e9251ed0a018a7378fe6 Mon Sep 17 00:00:00 2001
From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr>
Date: Tue, 15 May 2018 14:20:34 +0200
Subject: [PATCH]  J. Colin 15/5/2018 : new routines for the no-slip bottom
 condition

---
 src/MNH/ini_drag.f90   | 112 +++++++++++++++++++++++++++++++++++++++++
 src/MNH/modd_dragn.f90 |  72 ++++++++++++++++++++++++++
 src/MNH/modn_dragn.f90 |  62 +++++++++++++++++++++++
 3 files changed, 246 insertions(+)
 create mode 100644 src/MNH/ini_drag.f90
 create mode 100644 src/MNH/modd_dragn.f90
 create mode 100644 src/MNH/modn_dragn.f90

diff --git a/src/MNH/ini_drag.f90 b/src/MNH/ini_drag.f90
new file mode 100644
index 000000000..39bcf5b53
--- /dev/null
+++ b/src/MNH/ini_drag.f90
@@ -0,0 +1,112 @@
+!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_INI_DRAG
+!     ######################
+!
+INTERFACE 
+!
+      SUBROUTINE INI_DRAG(OMOUNT,PZS,PHSTART,KSTART,PDRAG)
+REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! Orographie
+LOGICAL,               INTENT(IN) :: OMOUNT !Logical switch to activate the no-slip condition on a moutain only
+!
+INTEGER, INTENT(IN) :: KSTART ! Index from which the no-slip condition is applied, when LMOUNT = .FALSE.  
+REAL, INTENT(IN) :: PHSTART ! height above which the no-slip condition is applied, when LMOUNT = .TRUE.  
+REAL, DIMENSION(:,:),          INTENT(OUT) :: PDRAG    ! Array defining where the no-slip condition is applied (-1/1)
+END SUBROUTINE INI_DRAG
+!
+END INTERFACE
+!
+END MODULE MODI_INI_DRAG
+!
+!
+!     ############################################################
+        SUBROUTINE INI_DRAG(OMOUNT,PZS,PHSTART,KSTART,PDRAG)
+!     ############################################################
+!
+!!****  *INI_DRAG* - routine to initialize the XDRAG array defining where the no-slip condition is applied
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to set the XDRAG array to -1 where the no-slip is applied and to 1 elsewhere. This values are then used in MODI_VISCi to define the no-slip condition
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      Module MODD_CONF   : NVERB
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!  	J. Colin         * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original        27/03/12
+!!
+!! 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+USE MODE_FM
+USE MODE_ll
+USE MODD_PARAMETERS
+!
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! Orography 
+LOGICAL,               INTENT(IN) :: OMOUNT !Logical switch to activate the no-slip condition on a moutain only
+!
+INTEGER, INTENT(IN) :: KSTART ! Index from which the no-slip condition is applied, when LMOUNT = .FALSE.  
+REAL, INTENT(IN) :: PHSTART ! height above which the no-slip condition is applied, when LMOUNT = .TRUE.
+!
+REAL, DIMENSION(:,:),          INTENT(OUT) :: PDRAG    ! Array defining where the no-slip condition is applied (-1/1)
+! where PDRAG = 1 => Free slip
+! where PDRAG = -1 => No slip
+!
+!*       0.2   declarations of local variables
+!
+INTEGER             :: IIU     ! Upper dimension in x direction (local)
+INTEGER             :: IJU     ! Upper dimension in y direction (local)
+INTEGER             :: IIU_ll  ! Upper dimension in x direction (global)
+INTEGER             :: IJU_ll  ! Upper dimension in y direction (global)
+INTEGER             :: IXORI     ! 
+INTEGER             :: IXENDI     ! 
+INTEGER             :: IYORI    ! 
+INTEGER             :: IYENDI    ! indice intersection
+INTEGER             :: IINFO    ! 
+INTEGER             :: JI,JJ   ! Loop index 
+!
+!-------------------------------------------------------------------------------
+!
+PDRAG = 1.
+! 
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+!
+ IF (OMOUNT) THEN
+      DO JI=1,IIU
+         DO JJ=1,IJU
+             IF ( PZS(JI,JJ) >= PHSTART ) THEN
+          PDRAG(JI,JJ) = -1.
+             ENDIF
+          ENDDO
+      ENDDO
+    ELSE
+      CALL GET_GLOBALDIMS_ll(IIU_ll,IJU_ll)
+      IIU_ll = IIU_ll + 2*JPHEXT
+      IJU_ll = IJU_ll + 2*JPHEXT
+      CALL GET_INTERSECTION_ll(KSTART,1,IIU_ll,IJU_ll, &
+            IXORI, IYORI, IXENDI, IYENDI, "EXTE",IINFO)   
+        IF ((IINFO /= 1).AND.(IINFO/=-1)) THEN
+        PDRAG(IXORI:IXENDI,IYORI:IYENDI) = -1
+        ENDIF
+    ENDIF
+!
+END SUBROUTINE INI_DRAG
diff --git a/src/MNH/modd_dragn.f90 b/src/MNH/modd_dragn.f90
new file mode 100644
index 000000000..5fa17ab90
--- /dev/null
+++ b/src/MNH/modd_dragn.f90
@@ -0,0 +1,72 @@
+!
+!      #######################
+          MODULE MODD_DRAG_n
+!      #######################
+!
+!!****   *MODD_DRAG*  - declaration of drag (no-slip) parameters
+!!
+!!     PURPOSE
+!!     -------
+!!       The purpose of this declarative module is to declare the drag booleans
+!!       and parameters
+!!
+!!**   IMPLICIT ARGUMENTS
+!!     ------------------
+!!       NONE
+!!
+!!    
+!!     AUTHOR
+!!     ------
+!1       Jeanne Colin         * Meteo-France *
+!!
+!!     MODIFICATIONS
+!!     -------------
+!!       Original            28/10/11
+!----------------------------------------------------------------------------
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
+IMPLICIT NONE
+
+!
+TYPE DRAG_t
+
+LOGICAL :: LDRAG          ! Logical switch to activate the no-slip condition 
+LOGICAL :: LMOUNT          ! Logical switch to activate the no-slip condition only on a moutain
+INTEGER :: NSTART         ! Grid point number (in the X-direction) from which the no-slip condition is applied, when LMOUNT = .FALSE.  
+REAL  :: XHSTART         ! Height abobe  which the no-slip condition is applied, when LMOUNT = .TRUE.  
+REAL, DIMENSION(:,:),POINTER :: XDRAG =>NULL() ! Array defining where the no-slip condition is applied (-1/1)
+!where XDRAG = 1 => free slip
+! where XDRAG = -1 => no slip
+!
+END TYPE DRAG_t
+
+TYPE(DRAG_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DRAG_MODEL
+
+LOGICAL, POINTER :: LDRAG=>NULL()
+LOGICAL, POINTER :: LMOUNT=>NULL()
+INTEGER, POINTER :: NSTART=>NULL()
+REAL, POINTER :: XHSTART=>NULL()
+REAL,DIMENSION(:,:), POINTER :: XDRAG =>NULL()
+
+CONTAINS
+
+SUBROUTINE DRAG_GOTO_MODEL(KFROM, KTO)
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+! Save current state for allocated arrays
+!
+DRAG_MODEL(KFROM)%XDRAG=>XDRAG
+!
+! Current model is set to model KTO
+LDRAG=>DRAG_MODEL(KTO)%LDRAG
+LMOUNT=>DRAG_MODEL(KTO)%LMOUNT
+NSTART=>DRAG_MODEL(KTO)%NSTART
+XHSTART=>DRAG_MODEL(KTO)%XHSTART
+XDRAG=>DRAG_MODEL(KTO)%XDRAG
+
+END SUBROUTINE DRAG_GOTO_MODEL
+
+END MODULE MODD_DRAG_n
diff --git a/src/MNH/modn_dragn.f90 b/src/MNH/modn_dragn.f90
new file mode 100644
index 000000000..c95530875
--- /dev/null
+++ b/src/MNH/modn_dragn.f90
@@ -0,0 +1,62 @@
+!     ###################
+      MODULE MODN_DRAG_n
+!     ###################
+!
+!!****  *MODN_DRAG* - declaration of namelist NAM_DRAG
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this module is to specify the namelist NAM_DRAG
+!!    (no-slip condition)
+!!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!          
+!!    AUTHOR
+!!    ------
+!!	    J. Colin                  * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    October 2011
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_DRAG_n, ONLY: &
+     LDRAG_n =>LDRAG, &
+     LMOUNT_n =>LMOUNT, &
+     NSTART_n =>NSTART, &
+     XHSTART_n =>XHSTART
+!
+IMPLICIT NONE
+!
+LOGICAL,SAVE  :: LDRAG
+LOGICAL,SAVE  :: LMOUNT
+INTEGER,SAVE  :: NSTART
+REAL,SAVE     :: XHSTART
+!
+NAMELIST/NAM_DRAGn/LDRAG,LMOUNT,XHSTART,NSTART
+!
+CONTAINS
+!
+SUBROUTINE INIT_NAM_DRAGn
+  LDRAG = LDRAG_n
+  LMOUNT = LMOUNT_n
+  NSTART = NSTART_n
+  XHSTART = XHSTART_n
+END SUBROUTINE INIT_NAM_DRAGn
+
+SUBROUTINE UPDATE_NAM_DRAGn
+  LDRAG_n = LDRAG
+  LMOUNT_n = LMOUNT
+  NSTART_n = NSTART
+  XHSTART_n = XHSTART
+END SUBROUTINE UPDATE_NAM_DRAGn
+
+END MODULE MODN_DRAG_n
-- 
GitLab