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