From 2d670e5545fd88609182933933160a356ed2e3fc Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Thu, 7 Jul 2022 17:04:58 +0200
Subject: [PATCH] Quentin 07/07/2022: Packing LES_MEAN_SUBGRID budgets

---
 docs/TODO                                |   4 +
 src/arome/aux/mode_fill_dimphyexn.F90    |   2 +
 src/arome/turb/les_mean_subgrid_phy.F90  |  78 ++++++++++++++
 src/common/aux/modd_dimphyexn.F90        |   3 +
 src/mesonh/aux/mode_fill_dimphyexn.F90   |   9 ++
 src/mesonh/turb/les_mean_subgrid_phy.f90 | 130 +++++++++++++++++++++++
 6 files changed, 226 insertions(+)
 create mode 100644 src/arome/turb/les_mean_subgrid_phy.F90
 create mode 100644 src/mesonh/turb/les_mean_subgrid_phy.f90

diff --git a/docs/TODO b/docs/TODO
index 5e2a3d112..0c4fed3b5 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -66,6 +66,10 @@ Budgets/DDH
 - Le code des budgets devrait être revu: pas en phase avec celui de Méso-NH et phasage a priori
   inutile car très peu de code semble réellement utile pour AROME
 
+Budgets/LES
+Une fois toutes les routines de la turbulence ont leur dimension horizontale packée et
+utilisent LES_MEAN_SUBGRID_PHY a la place de LES_MEAN_SUBGRID_PHY : renommer les routines arome/turb et mesonh/turb en les_mean_subgrid.F90 et remplacer partout dans le code les appels (enlever le _PHY) + supprimer les anciennes routines
+
 SPP
 - modd_spp_type est pour l'instant dans mpa/micro/externals mais n'est pas de la microphysique
 
diff --git a/src/arome/aux/mode_fill_dimphyexn.F90 b/src/arome/aux/mode_fill_dimphyexn.F90
index 713626623..9771b9e91 100644
--- a/src/arome/aux/mode_fill_dimphyexn.F90
+++ b/src/arome/aux/mode_fill_dimphyexn.F90
@@ -74,6 +74,7 @@ YDDIMPHYEX%NKA=KKT
 YDDIMPHYEX%NKU=1
 YDDIMPHYEX%NKB=KKT-KVEXT
 YDDIMPHYEX%NKE=1+KVEXT
+YDDIMPHYEX%NKLES=KKT-2*KVEXT
 YDDIMPHYEX%NKTB=1+KVEXT
 YDDIMPHYEX%NKTE=KKT-KVEXT
 !
@@ -82,6 +83,7 @@ YDDIMPHYEX%NJBC=1
 YDDIMPHYEX%NIEC=KIE
 YDDIMPHYEX%NJEC=KJT
 !
+YDDIMPHYEX%NLESMASK = 0 ! never used in AROME
 IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 1, ZHOOK_HANDLE)
 !
 END SUBROUTINE FILL_DIMPHYEX
diff --git a/src/arome/turb/les_mean_subgrid_phy.F90 b/src/arome/turb/les_mean_subgrid_phy.F90
new file mode 100644
index 000000000..66f29f61e
--- /dev/null
+++ b/src/arome/turb/les_mean_subgrid_phy.F90
@@ -0,0 +1,78 @@
+!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.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$
+! MASDEV4_7 les 2006/08/30 18:41:10
+!-----------------------------------------------------------------
+!      #####################
+MODULE MODI_LES_MEAN_SUBGRID_PHY
+!      #####################
+!
+INTERFACE LES_MEAN_SUBGRID_PHY
+!
+
+SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,PA, PA_MEAN, OSUM)
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(:,:), INTENT(IN)    :: PA
+REAL,    DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY
+!
+SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,PA, PA_MEAN, OSUM)
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(:), INTENT(IN)    :: PA
+REAL,    DIMENSION(:), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY
+!
+END INTERFACE LES_MEAN_SUBGRID_PHY
+!
+END MODULE MODI_LES_MEAN_SUBGRID_PHY
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(:,:), INTENT(IN)    :: PA
+REAL,    DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(:), INTENT(IN)    :: PA
+REAL,    DIMENSION(:), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY
diff --git a/src/common/aux/modd_dimphyexn.F90 b/src/common/aux/modd_dimphyexn.F90
index b1a9ef2c9..a2767fe04 100644
--- a/src/common/aux/modd_dimphyexn.F90
+++ b/src/common/aux/modd_dimphyexn.F90
@@ -53,6 +53,7 @@ TYPE DIMPHYEX_t
                   !  1: as for Méso-NH, levels are numbered from ground to space
                   ! -1: as for AROME, levels are numbered from space to ground
   INTEGER :: NKT  ! Array total dimension
+  INTEGER :: NKLES ! Total physical k dimension (for LES diag)
   INTEGER :: NKA  ! Near ground array index (is an unphysical level if JPVEXT!=0)
   INTEGER :: NKU  ! Uppest atmosphere array index (is an unphysical level if JPVEXT!=0)
   INTEGER :: NKB  ! Near ground physical array index (e.g. equal to 1+JPVEXT if NKL==1)
@@ -73,6 +74,8 @@ TYPE DIMPHYEX_t
   INTEGER :: NIJT  ! NIT*NJT for horizontal packing
   INTEGER :: NIJB  ! First horizontal inner mass point index
   INTEGER :: NIJE  ! Last horizontal inner mass point index
+  !
+  INTEGER :: NLESMASK ! Number of LES masks
 !
 END TYPE DIMPHYEX_t
 !
diff --git a/src/mesonh/aux/mode_fill_dimphyexn.F90 b/src/mesonh/aux/mode_fill_dimphyexn.F90
index 1f5cc3c3c..80679f8e1 100644
--- a/src/mesonh/aux/mode_fill_dimphyexn.F90
+++ b/src/mesonh/aux/mode_fill_dimphyexn.F90
@@ -36,6 +36,8 @@ SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, LTURB)
 !
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_PARAMETERS, ONLY: JPVEXT
+USE MODD_LES, ONLY : LLES_NEB_MASK, LLES_CORE_MASK, LLES_CS_MASK, LLES_MY_MASK, &
+                     NLES_MASKS_USER
 USE PARKIND1, ONLY : JPRB
 USE YOMHOOK , ONLY : LHOOK, DR_HOOK
 USE MODE_ll
@@ -72,6 +74,7 @@ YDDIMPHYEX%NKA=1
 YDDIMPHYEX%NKU=KKT
 YDDIMPHYEX%NKB=1+JPVEXT
 YDDIMPHYEX%NKE=KKT-JPVEXT
+YDDIMPHYEX%NKLES=KKT-2*JPVEXT
 YDDIMPHYEX%NKTB=1+JPVEXT
 YDDIMPHYEX%NKTE=KKT-JPVEXT
 !
@@ -94,5 +97,11 @@ ELSE
 END IF
 IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 1, ZHOOK_HANDLE)
 !
+YDDIMPHYEX%NLESMASK = 1
+IF (LLES_MY_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + NLES_MASKS_USER
+IF (LLES_NEB_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + 2
+IF (LLES_CORE_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + 2
+IF (LLES_CS_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + 3
+!
 END SUBROUTINE FILL_DIMPHYEX
 END MODULE MODE_FILL_DIMPHYEX
diff --git a/src/mesonh/turb/les_mean_subgrid_phy.f90 b/src/mesonh/turb/les_mean_subgrid_phy.f90
new file mode 100644
index 000000000..637d1cc73
--- /dev/null
+++ b/src/mesonh/turb/les_mean_subgrid_phy.f90
@@ -0,0 +1,130 @@
+!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.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$
+! MASDEV4_7 les 2006/08/30 18:41:10
+!-----------------------------------------------------------------
+!      #####################
+MODULE MODI_LES_MEAN_SUBGRID_PHY
+!      #####################
+!
+INTERFACE LES_MEAN_SUBGRID_PHY
+!
+
+SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,PA, PA_MEAN, OSUM)
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PA
+!
+REAL,    DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN
+!
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY
+!
+SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,PA, PA_MEAN, OSUM)
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIJT), INTENT(IN)    :: PA
+!
+REAL,    DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN
+!
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY
+!
+END INTERFACE LES_MEAN_SUBGRID_PHY
+!
+END MODULE MODI_LES_MEAN_SUBGRID_PHY
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PA
+REAL,    DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+CALL LES_MEAN_SUBGRID_unpack3D(D,PA, PA_MEAN, OSUM)
+!
+END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIJT), INTENT(IN)    :: PA
+REAL,    DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+CALL LES_MEAN_SUBGRID_unpackSURF(D,PA, PA_MEAN, OSUM)
+!
+END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_unpack3D(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+USE MODI_LES_MEAN_SUBGRID
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)    :: PA
+REAL,    DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+CALL LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM)
+!
+END SUBROUTINE LES_MEAN_SUBGRID_unpack3D
+!
+!     ##############################################
+      SUBROUTINE LES_MEAN_SUBGRID_unpackSURF(D, PA, PA_MEAN, OSUM)
+!     ##############################################
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT
+USE MODI_LES_MEAN_SUBGRID
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),          INTENT(IN)    :: D
+REAL,    DIMENSION(D%NIT,D%NJT), INTENT(IN)    :: PA
+REAL,    DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN
+LOGICAL, OPTIONAL,         INTENT(IN)    :: OSUM
+!
+CALL LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM)
+!
+END SUBROUTINE LES_MEAN_SUBGRID_unpackSURF
-- 
GitLab