Skip to content
Snippets Groups Projects
Commit 7ef4358c authored by Gaelle DELAUTIER's avatar Gaelle DELAUTIER
Browse files

J. Colin 15/5/2018 : new routines for the no-slip bottom condition

parent 699f1a39
No related branches found
No related tags found
No related merge requests found
!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
!
! #######################
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
! ###################
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment