From 27ae6bc9a4d392a575e3c28eddc61882e16a9fc4 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Wed, 30 Jun 2021 17:28:29 +0200
Subject: [PATCH] F.Couvreux 30/06/2021: add LRELAX_UVMEAN_FRC forcing. Instead
 of LRELAX_UV_FRC which applies the u,v relaxation read in namelist on each
 atmospheric column, LRELAX_UVMEAN_FRC applies the relaxation on the
 horizontal mean of u and v at each level. To be used in LES mode.

---
 src/MNH/default_desfmn.f90 |  5 ++++-
 src/MNH/forcing.f90        | 40 +++++++++++++++++++++++++++++++++++++-
 src/MNH/modd_frc.f90       |  8 +++++---
 src/MNH/modn_frc.f90       |  8 +++++---
 src/MNH/read_exsegn.f90    | 15 +++++++++++---
 5 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index a5d28030d..a0817ad3d 100644
--- a/src/MNH/default_desfmn.f90
+++ b/src/MNH/default_desfmn.f90
@@ -95,7 +95,8 @@ END MODULE MODI_DEFAULT_DESFM_n
 !!      Module MODD_FRC :
 !!
 !!          LGEOST_UV_FRC,LGEOST_TH_FRC,LTEND_THRV_FRC
-!!          LVERT_MOTION_FRC,LRELAX_THRV_FRC,LRELAX_UV_FRC,XRELAX_TIME_FRC
+!!          LVERT_MOTION_FRC,LRELAX_THRV_FRC,LRELAX_UV_FRC,LRELAX_UVMEAN_FRC,
+!!          XRELAX_TIME_FRC
 !!          XRELAX_HEIGHT_FRC,CRELAX_HEIGHT_TYPE,LTRANS,XUTRANS,XVTRANS,
 !!          LPGROUND_FRC
 !!
@@ -216,6 +217,7 @@ END MODULE MODI_DEFAULT_DESFM_n
 !  JL Redelsperger 06/2021: add parameters allowing to active idealized oceanic convection
 !  B. Vie         06/2021: add prognostic supersaturation for LIMA
 !  Q. Rodier      06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation)
+!  F. Couvreux    06/2021: add LRELAX_UVMEAN_FRC
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -796,6 +798,7 @@ IF (KMI == 1) THEN
   LVERT_MOTION_FRC   = .FALSE.
   LRELAX_THRV_FRC    = .FALSE.
   LRELAX_UV_FRC      = .FALSE.
+  LRELAX_UVMEAN_FRC  = .FALSE.
   XRELAX_TIME_FRC    = 10800.
   XRELAX_HEIGHT_FRC  = 0.
   CRELAX_HEIGHT_TYPE = "FIXE"
diff --git a/src/MNH/forcing.f90 b/src/MNH/forcing.f90
index 062cd4afa..04a4a91cd 100644
--- a/src/MNH/forcing.f90
+++ b/src/MNH/forcing.f90
@@ -149,6 +149,7 @@ END MODULE MODI_FORCING
 !                          use overloaded comparison operator for date_time
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  F. Couvreux    06/2021: add LRELAX_UVMEAN_FRC : relaxation applied to the horizontal avg. wind (for LES)
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -169,9 +170,13 @@ USE MODD_TIME
 !
 use mode_budget,     only: Budget_store_init, Budget_store_end
 USE MODE_DATETIME
+USE MODE_GATHER_ll
 USE MODE_MSG
+USE MODE_ll
+USE MODE_REPRO_SUM
 !
 USE MODI_GET_HALO
+USE MODI_LES_MEAN_ll
 USE MODI_SHUMAN
 USE MODI_UPSTREAM_Z
 !
@@ -209,6 +214,9 @@ REAL, DIMENSION(:,:,:),   INTENT(IN) :: PJ
 !*       0.2   Declarations of local variables
 !
 INTEGER                         :: IIU, IJU, IKU      ! dimensions
+INTEGER                         :: IIB,IJB,IIE,IJE    ! physical domain dimensions
+INTEGER                         :: IKB, IKE           !
+INTEGER                         :: IIMAX_ll,IJMAX_ll
 INTEGER, SAVE                   :: JSX                ! saved loop index
 INTEGER                         :: JI, JJ, JK, JL, JXP! loop indexes 
 !
@@ -248,11 +256,18 @@ INTEGER  :: IRESP   ! Return code of FM-routines
 !
 LOGICAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: GRELAX_MASK_FRC
 !
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUMEAN, ZVMEAN
+REAL :: ZTEMPU, ZTEMPV
+!
 !----------------------------------------------------------------------------
 !
 IIU=SIZE(PUT,1) 
 IJU=SIZE(PUT,2) 
 IKU=SIZE(PUT,3) 
+IKE = SIZE(PUT,3) - JPVEXT
+IKB = 1 + JPVEXT
+CALL GET_INDICE_ll( IIB,IJB,IIE,IJE)
+CALL GET_GLOBALDIMS_ll ( IIMAX_ll,IJMAX_ll)
 !
 ILUOUT0 = TLUOUT0%NLU
 
@@ -479,6 +494,8 @@ ALLOCATE(ZDUF(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
 ALLOCATE(ZDVF(SIZE(PVT,1),SIZE(PVT,2),SIZE(PVT,3)))
 ALLOCATE(ZTENDUF(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
 ALLOCATE(ZTENDVF(SIZE(PVT,1),SIZE(PVT,2),SIZE(PVT,3)))
+ALLOCATE(ZUMEAN(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
+ALLOCATE(ZVMEAN(SIZE(PVT,1),SIZE(PVT,2),SIZE(PVT,3)))
 !
 IF (LFLAT) THEN
 !
@@ -782,7 +799,7 @@ PVFRC_PAST(:,:,:) = ZVF(:,:,:)
 !
 !*       4.4    integration of the thermal, moisture and wind relaxation
 !
-IF( LRELAX_THRV_FRC .OR. LRELAX_UV_FRC ) THEN
+IF( LRELAX_THRV_FRC .OR. LRELAX_UV_FRC .OR. LRELAX_UVMEAN_FRC) THEN
 !
   ZDZZ(:,:,:) = DZM(MZF(PZZ(:,:,:)))
   ZDZZ(:,:,IKU) = PZZ(:,:,IKU) - PZZ(:,:,IKU-1)
@@ -837,6 +854,25 @@ IF( LRELAX_THRV_FRC .OR. LRELAX_UV_FRC ) THEN
     END WHERE
 !
   END IF
+!
+  IF ( LRELAX_UVMEAN_FRC ) THEN
+   DO JK=IKB,IKE
+       ZTEMPU=SUM_DD_R2_ll(PUT(IIB:IIE,IJB:IJE,JK))/REAL(IIMAX_ll*IJMAX_ll)
+       ZUMEAN(:,:,JK) = ZTEMPU
+       ZTEMPV=SUM_DD_R2_ll(PVT(IIB:IIE,IJB:IJE,JK))/REAL(IIMAX_ll*IJMAX_ll)
+       ZVMEAN(:,:,JK) = ZTEMPV
+   END DO
+!
+!   apply UV relaxation on the horizontal-average value of UV
+!
+    WHERE( GRELAX_MASK_FRC )
+      PRUS(:,:,:) = PRUS(:,:,:) - MXM(PRHODJ(:,:,:))*(ZUMEAN(:,:,:)-ZUF(:,:,:)) &
+                                                 / XRELAX_TIME_FRC
+      PRVS(:,:,:) = PRVS(:,:,:) - MYM(PRHODJ(:,:,:))*(ZVMEAN(:,:,:)-ZVF(:,:,:)) &
+                                                 / XRELAX_TIME_FRC
+    END WHERE
+!
+  END IF
 !
 END IF
 !
@@ -891,6 +927,8 @@ DEALLOCATE(ZDZZ)
 DEALLOCATE(ZRWCF)
 DEALLOCATE(ZDUF)
 DEALLOCATE(ZDVF)
+DEALLOCATE(ZUMEAN)
+DEALLOCATE(ZVMEAN)
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/modd_frc.f90 b/src/MNH/modd_frc.f90
index 0627e3f4f..91994b803 100644
--- a/src/MNH/modd_frc.f90
+++ b/src/MNH/modd_frc.f90
@@ -17,9 +17,9 @@
 !     and the translation speed of the domain of simulation.
 !     The following control parameters are used by FORCING:
 !     - LGEOST_UV_FRC and LGEOST_TH_FRC
-!     - LTEND_THRV_FRC     
+!     - LTEND_THRV_FRC and LTEND_UV_FRC
 !     - LVERT_MOTION_FRC  
-!     - LRELAX_THRV_FRC and LRELAX_UV_FRC using:
+!     - LRELAX_THRV_FRC, LRELAX_UV_FRC and LRELAX_UVMEAN_FRC using:
 !         XRELAX_TIME_FRC, XRELAX_HEIGHT_FRC and CRELAX_HEIGHT_TYPE
 !     - LTRANS
 !!
@@ -46,6 +46,7 @@
 !!      01/2004  V. Masson     surface externalization: removes SST forcing
 !!                   09/2017 Q.Rodier add LTEND_UV_FRC
 !!      03/2021 JL Redelsperger Parameters defining sfc forcing shape for idealized ocean case
+!!      06/2021 F. Couvreux    add LRELAX_UVMEAN_FRC
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -88,7 +89,8 @@ LOGICAL, SAVE     :: LTEND_UV_FRC       ! enables tendency forcing of the wind
 LOGICAL, SAVE     :: LVERT_MOTION_FRC   ! enables prescribed a forced vertical
 					                    ! transport for all prognostic variables
 LOGICAL, SAVE     :: LRELAX_THRV_FRC    ! enables temp. and humidity relaxation
-LOGICAL, SAVE     :: LRELAX_UV_FRC      ! enables  horizontal  wind  relaxation
+LOGICAL, SAVE     :: LRELAX_UV_FRC      ! enables  horizontal wind relaxation applied to the full wind field
+LOGICAL, SAVE     :: LRELAX_UVMEAN_FRC  ! enables  horizontal wind relaxation applied to the horiz. avg. wind
 !
 REAL,    SAVE     :: XRELAX_TIME_FRC    ! e-folding time for relaxation 
 REAL,    SAVE     :: XRELAX_HEIGHT_FRC  ! height below which relaxation
diff --git a/src/MNH/modn_frc.f90 b/src/MNH/modn_frc.f90
index ae7d5e41d..42e04d16e 100644
--- a/src/MNH/modn_frc.f90
+++ b/src/MNH/modn_frc.f90
@@ -14,9 +14,9 @@
 !       This module contains the following control parameters are used 
 !     by FORCING:
 !     - LGEOST_UV_FRC and LGEOST_TH_FRC
-!     - LTEND_THRV_FRC     
-!     - LVERT_MOTION_FRC  
-!     - LRELAX_THRV_FRC and LRELAX_UV_FRC using:
+!     - LTEND_THRV_FRC and LTEND_UV_FRC
+!     - LVERT_MOTION_FRC
+!     - LRELAX_THRV_FRC, LRELAX_UV_FRC and LRELAX_UVMEAN_FRC using:
 !         XRELAX_TIME_FRC, XRELAX_HEIGHT_FRC and CRELAX_HEIGHT_TYPE
 !     - LTRANS
 !         XUTRANS, XVTRANS
@@ -43,6 +43,7 @@
 !!                             add SST and surf pressure forcing
 !!      06/2003  (V. Masson)   removes SST forcing (externalisation of surface)
 !!                   09/2017 Q.Rodier add LTEND_UV_FRC
+!!                   06/2021 F.Couvreux add LRELAX_UVMEAN_FRC
 !-------------------------------------------------------------------------------
 USE MODD_FRC
 !
@@ -55,6 +56,7 @@ NAMELIST /NAM_FRC/ LGEOST_UV_FRC      , &
                    LVERT_MOTION_FRC   , &
                    LRELAX_THRV_FRC    , &
                    LRELAX_UV_FRC      , &
+                   LRELAX_UVMEAN_FRC  , &
                    XRELAX_TIME_FRC    , &
                    XRELAX_HEIGHT_FRC  , &
                    CRELAX_HEIGHT_TYPE , &
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 793e407af..a8c847c3f 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -2363,15 +2363,24 @@ IF ( LFORCING ) THEN
     WRITE(ILUOUT,FMT=*) 'YOU CHOSE A TEMPERATURE AND HUMIDITY RELAXATION'
     WRITE(ILUOUT,FMT=*) 'TOGETHER WITH TENDENCY OR GEOSTROPHIC FORCING'
     WRITE(ILUOUT,FMT=*) &
-  'YOU MIGHT CHECK YOUR SWITCHES:  LRELAX_THRV_FRC, LTEND_THRV_FRC, AND'
+  'YOU MIGHT CHECK YOUR SWITCHES: LRELAX_THRV_FRC, LTEND_THRV_FRC, AND'
     WRITE(ILUOUT,FMT=*) 'LGEOST_TH_FRC'
   END IF
 !
-  IF ( LRELAX_UV_FRC .AND. LGEOST_UV_FRC ) THEN
+  IF ( LRELAX_UV_FRC .AND. LRELAX_UVMEAN_FRC) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU MUST CHOOSE BETWEEN A RELAXATION APPLIED TO'
+    WRITE(ILUOUT,FMT=*) 'THE 3D FULL WIND FIELD (LRELAX_UV_FRC) OR'
+    WRITE(ILUOUT,FMT=*) 'THE HORIZONTAL MEAN WIND (LRELAX_UVMEAN_FRC)'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF ( (LRELAX_UV_FRC .OR. LRELAX_UVMEAN_FRC) .AND. LGEOST_UV_FRC ) THEN
     WRITE(UNIT=ILUOUT,FMT=9003) KMI
     WRITE(ILUOUT,FMT=*) 'YOU MUST NOT USE A WIND RELAXATION' 
     WRITE(ILUOUT,FMT=*) 'TOGETHER WITH A GEOSTROPHIC FORCING'
-    WRITE(ILUOUT,FMT=*) 'CHECK SWITCHES:  LRELAX_UV_FRC, LGEOST_UV_FRC'
+    WRITE(ILUOUT,FMT=*) 'CHECK SWITCHES: LRELAX_UV_FRC, LRELAX_UVMEAN_FRC, LGEOST_UV_FRC'
  !callabortstop
     CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
   END IF
-- 
GitLab