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