From 4592b94baed6828257b222d1c06dccfa3a1956ca Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 8 Nov 2023 16:32:28 +0100
Subject: [PATCH] Philippe 08/11/2023: mean_field: allocate arrays only when
 necessary

---
 src/MNH/mean_field.f90 | 61 ++++++++++++++++++++++++++++--------------
 1 file changed, 41 insertions(+), 20 deletions(-)

diff --git a/src/MNH/mean_field.f90 b/src/MNH/mean_field.f90
index e91972c77..e19ea9ed0 100644
--- a/src/MNH/mean_field.f90
+++ b/src/MNH/mean_field.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2009-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2009-2023 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.
@@ -90,23 +90,23 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PSVT
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZTEMPT
 INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
 INTEGER           :: JI,JJ,JK   ! Loop indexes
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZUMEAN_OLD
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZWMEAN_OLD
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZTHMEAN_OLD
-!
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZRT
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZQSAT_W
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZQSAT_I
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZQACT
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZRH_W
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZRH_I
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZRH_P
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZFRAC
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUMEAN_OLD
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWMEAN_OLD
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHMEAN_OLD
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQSAT_W
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQSAT_I
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQACT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_W
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_I
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_P
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFRAC
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZAUX_WIFF
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) ::  ZAUX_WIDD
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2))             ::  ZRH_W_MAXCOL
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2))             ::  ZRH_I_MAXCOL
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2))             ::  ZRH_P_MAXCOL
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRH_W_MAXCOL
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRH_I_MAXCOL
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRH_P_MAXCOL
 !
 INTEGER :: IMI !Current model index
 !
@@ -130,6 +130,18 @@ ZTEMPT = PTHT*(((PPABST)/XP00)**(XRD/XCPD))
 !
 !
 IF(LUSERV) THEN
+  ALLOCATE( ZRT    (IIU, IJU, IKU) )
+  ALLOCATE( ZQSAT_W(IIU, IJU, IKU) )
+  ALLOCATE( ZQSAT_I(IIU, IJU, IKU) )
+  ALLOCATE( ZQACT  (IIU, IJU, IKU) )
+  ALLOCATE( ZRH_W  (IIU, IJU, IKU) )
+  ALLOCATE( ZRH_I  (IIU, IJU, IKU) )
+  ALLOCATE( ZRH_P  (IIU, IJU, IKU) )
+  ALLOCATE( ZFRAC  (IIU, IJU, IKU) )
+  ALLOCATE( ZRH_W_MAXCOL( IIU, IJU) )
+  ALLOCATE( ZRH_I_MAXCOL( IIU, IJU) )
+  ALLOCATE( ZRH_P_MAXCOL( IIU, IJU) )
+
   ! Calculation of saturation specific humidity over water/ice
   !
   ZQSAT_W = QSAT (ZTEMPT, PPABST)
@@ -173,7 +185,10 @@ IF(LUSERV) THEN
   XRH_W_MAXCOL_MEAN = XRH_W_MAXCOL_MEAN + ZRH_W_MAXCOL
   XRH_I_MAXCOL_MEAN = XRH_I_MAXCOL_MEAN + ZRH_I_MAXCOL
   XRH_P_MAXCOL_MEAN = XRH_P_MAXCOL_MEAN + ZRH_P_MAXCOL
-END IF   
+
+  DEALLOCATE( ZRT, ZQSAT_W, ZQSAT_I, ZQACT, ZRH_W, ZRH_I, ZRH_P, ZFRAC )
+  DEALLOCATE( ZRH_W_MAXCOL, ZRH_I_MAXCOL, ZRH_P_MAXCOL )
+END IF
 
    IF (LPASPOL)  XSVT_MEAN  = PSVT + XSVT_MEAN
    IF (CTURB/='NONE') XTKEM_MEAN = PTKET + XTKEM_MEAN
@@ -197,9 +212,14 @@ END IF
 !
 !  Save old mean values for covariance computations
 !
-   ZUMEAN_OLD  = XUM_MEAN
-   ZWMEAN_OLD  = XWM_MEAN
-   ZTHMEAN_OLD = XTHM_MEAN
+   IF (LCOV_FIELD) THEN
+      ALLOCATE( ZUMEAN_OLD (IIU, IJU, IKU) )
+      ALLOCATE( ZWMEAN_OLD (IIU, IJU, IKU) )
+      ALLOCATE( ZTHMEAN_OLD(IIU, IJU, IKU) )
+      ZUMEAN_OLD (:,:,:) = XUM_MEAN (:,:,:)
+      ZWMEAN_OLD (:,:,:) = XWM_MEAN (:,:,:)
+      ZTHMEAN_OLD(:,:,:) = XTHM_MEAN(:,:,:)
+   END IF
 !  Welford method for variables whom we compute variances
 !
    CALL UPDATE_WELFORD(MEAN_COUNT,XUM_MEAN,XU2_M2,PUT)
@@ -216,6 +236,7 @@ END IF
      XUW_MEAN  = XUW_MEAN + (PUT-ZUMEAN_OLD)*(PWT-XWM_MEAN)
      XVW_MEAN  = XVW_MEAN + (PWT-ZWMEAN_OLD)*(PVT-XVM_MEAN)
      XWTH_MEAN = XVW_MEAN + (PWT-ZWMEAN_OLD)*(PTHT-XTHM_MEAN)
+     DEALLOCATE( ZUMEAN_OLD, ZWMEAN_OLD, ZTHMEAN_OLD )
    END IF
 !
 !-----------------------------------------------------------------------
-- 
GitLab