diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index a5d28030d88c7706332d98de04f7db63a7659678..a0817ad3d45431477a4b89d4f809982237968cad 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 062cd4afa4cd7221157c6e5e550a96145bc38730..04a4a91cd280cb170667db196631e49d3b3d9d88 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 0627e3f4fcbdfbce2cc1536fc368f73887593acc..91994b803da64a835311586ea0b9d46bf31edfc7 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 ae7d5e41dac257a6881440f4d0a291f65794a562..42e04d16e941a48f3483e5e49a5666dd7c0ef953 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 793e407af8923876d115ba8af9d4002d89a919b5..a8c847c3f280ae1e4f7e1a27561252b676a3c574 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