diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index d8dc56c4a3a12cfd1d12951c6996139fe08e6554..25711a16726c5d06e5b4418456078eae8042fc79 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -1139,6 +1139,7 @@ ENDIF ! IF (KMI == 1) THEN LMEAN_FIELD = .FALSE. + LCOV_FIELD = .FALSE. ENDIF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_mean_field.f90 b/src/MNH/ini_mean_field.f90 index 32ddfbb8847adcfe2cbe1887368abee74b2370b9..1abffffd053f5d6ead06c6979420e037acc58249 100644 --- a/src/MNH/ini_mean_field.f90 +++ b/src/MNH/ini_mean_field.f90 @@ -50,6 +50,7 @@ END MODULE MODI_INI_MEAN_FIELD !! 10/2016 (C.Lac) Add max values !! 02/2021 (T.Nagel) add passive scalar (XSVT) and UW wind component !! 05/2021 (PA.Joulin) add wind turbine variables +!! 11/2022 (E. Jezequel) add covariances !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -79,13 +80,18 @@ IF (CTURB /= 'NONE') XTKEM_MEAN = 0.0 XPABSM_MEAN = 0.0 XSVT_MEAN = 0.0 ! -XU2_MEAN = 0.0 -XV2_MEAN = 0.0 -XW2_MEAN = 0.0 -XUW_MEAN = 0.0 -XTH2_MEAN = 0.0 -XTEMP2_MEAN = 0.0 -XPABS2_MEAN = 0.0 +XU2_M2 = 0.0 +XV2_M2 = 0.0 +XW2_M2 = 0.0 +IF (LCOV_FIELD) THEN + XUV_MEAN = 0.0 + XUW_MEAN = 0.0 + XVW_MEAN = 0.0 + XWTH_MEAN = 0.0 +END IF +XTH2_M2 = 0.0 +XTEMP2_M2 = 0.0 +XPABS2_M2 = 0.0 ! IMI = GET_CURRENT_MODEL_INDEX() IF (LMAIN_EOL .AND. IMI==NMODEL_EOL) THEN diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 3d9aa05443f72ccb3c8beb9d0530ce48c56ed393..5d7ae53bf1d45b1e3fc868ca208593acd9762605 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -777,13 +777,21 @@ IF (LMEAN_FIELD) THEN END IF ALLOCATE(XPABSM_MEAN(IIU,IJU,IKU)) ; XPABSM_MEAN = 0.0 ! - ALLOCATE(XU2_MEAN(IIU,IJU,IKU)) ; XU2_MEAN = 0.0 - ALLOCATE(XV2_MEAN(IIU,IJU,IKU)) ; XV2_MEAN = 0.0 - ALLOCATE(XW2_MEAN(IIU,IJU,IKU)) ; XW2_MEAN = 0.0 - ALLOCATE(XUW_MEAN(IIU,IJU,IKU)) ; XUW_MEAN = 0.0 - ALLOCATE(XTH2_MEAN(IIU,IJU,IKU)) ; XTH2_MEAN = 0.0 - ALLOCATE(XTEMP2_MEAN(IIU,IJU,IKU)) ; XTEMP2_MEAN = 0.0 - ALLOCATE(XPABS2_MEAN(IIU,IJU,IKU)) ; XPABS2_MEAN = 0.0 + ALLOCATE(XU2_M2(IIU,IJU,IKU)) ; XU2_M2 = 0.0 +! + ALLOCATE(XU2_M2(IIU,IJU,IKU)) ; XU2_M2 = 0.0 + ALLOCATE(XV2_M2(IIU,IJU,IKU)) ; XV2_M2 = 0.0 + ALLOCATE(XW2_M2(IIU,IJU,IKU)) ; XW2_M2 = 0.0 + ALLOCATE(XTH2_M2(IIU,IJU,IKU)) ; XTH2_M2 = 0.0 + ALLOCATE(XTEMP2_M2(IIU,IJU,IKU)) ; XTEMP2_M2 = 0.0 + ALLOCATE(XPABS2_M2(IIU,IJU,IKU)) ; XPABS2_M2 = 0.0 +! + IF (LCOV_FIELD) THEN + ALLOCATE(XUV_MEAN(IIU,IJU,IKU)) ; XUV_MEAN = 0.0 + ALLOCATE(XUW_MEAN(IIU,IJU,IKU)) ; XUW_MEAN = 0.0 + ALLOCATE(XVW_MEAN(IIU,IJU,IKU)) ; XVW_MEAN = 0.0 + ALLOCATE(XWTH_MEAN(IIU,IJU,IKU)) ; XWTH_MEAN = 0.0 + END IF ! ALLOCATE(XUM_MAX(IIU,IJU,IKU)) ; XUM_MAX = -1.E20 ALLOCATE(XVM_MAX(IIU,IJU,IKU)) ; XVM_MAX = -1.E20 @@ -798,6 +806,7 @@ IF (LMEAN_FIELD) THEN END IF ALLOCATE(XPABSM_MAX(IIU,IJU,IKU)) ; XPABSM_MAX = 0.0 ELSE +! ALLOCATE(XUM_MEAN(0,0,0)) ALLOCATE(XVM_MEAN(0,0,0)) ALLOCATE(XWM_MEAN(0,0,0)) @@ -807,13 +816,19 @@ ELSE ALLOCATE(XTKEM_MEAN(0,0,0)) ALLOCATE(XPABSM_MEAN(0,0,0)) ! - ALLOCATE(XU2_MEAN(0,0,0)) - ALLOCATE(XV2_MEAN(0,0,0)) - ALLOCATE(XW2_MEAN(0,0,0)) - ALLOCATE(XUW_MEAN(0,0,0)) - ALLOCATE(XTH2_MEAN(0,0,0)) - ALLOCATE(XTEMP2_MEAN(0,0,0)) - ALLOCATE(XPABS2_MEAN(0,0,0)) + ALLOCATE(XU2_M2(0,0,0)) + ALLOCATE(XV2_M2(0,0,0)) + ALLOCATE(XW2_M2(0,0,0)) + ALLOCATE(XTH2_M2(0,0,0)) + ALLOCATE(XTEMP2_M2(0,0,0)) + ALLOCATE(XPABS2_M2(0,0,0)) +! + IF (LCOV_FIELD) THEN + ALLOCATE(XUV_MEAN(0,0,0)) + ALLOCATE(XUW_MEAN(0,0,0)) + ALLOCATE(XVW_MEAN(0,0,0)) + ALLOCATE(XWTH_MEAN(0,0,0)) + END IF ! ALLOCATE(XUM_MAX(0,0,0)) ALLOCATE(XVM_MAX(0,0,0)) diff --git a/src/MNH/mean_field.f90 b/src/MNH/mean_field.f90 index 048eb689dfa04f798b16e555bb6b220e896b3484..a94d92633b762071be438dd28d4dd9c6f4bda493 100644 --- a/src/MNH/mean_field.f90 +++ b/src/MNH/mean_field.f90 @@ -48,6 +48,7 @@ END MODULE MODI_MEAN_FIELD !! Original 07/2009 !! (C.Lac) 09/2016 Max values !! (PA.Joulin) 12/2020 Wind turbine variables +!! (E. Jezequel) 11/2022 Welford algorithm and covariances !!--------------------------------------------------------------- ! ! @@ -67,6 +68,7 @@ USE MODD_EOL_SHARED_IO, ONLY: XTHRU_SUM, XTORQ_SUM, XPOW_SUM USE MODD_EOL_ALM USE MODD_EOL_ADNR USE MODE_MODELN_HANDLER +USE MODI_UPDATE_WELFORD ! IMPLICIT NONE @@ -82,6 +84,9 @@ 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 ! INTEGER :: IMI !Current model index ! @@ -103,22 +108,8 @@ IKE=IKU-JPVEXT ! ZTEMPT = PTHT*(((PPABST)/XP00)**(XRD/XCPD)) ! - XUM_MEAN = PUT + XUM_MEAN - XVM_MEAN = PVT + XVM_MEAN - XWM_MEAN = PWT + XWM_MEAN - XTHM_MEAN = PTHT + XTHM_MEAN - XTEMPM_MEAN = ZTEMPT + XTEMPM_MEAN IF (LPASPOL) XSVT_MEAN = PSVT + XSVT_MEAN IF (CTURB/='NONE') XTKEM_MEAN = PTKET + XTKEM_MEAN - XPABSM_MEAN = PPABST + XPABSM_MEAN -! - XU2_MEAN = PUT**2 + XU2_MEAN - XV2_MEAN = PVT**2 + XV2_MEAN - XW2_MEAN = PWT**2 + XW2_MEAN - XUW_MEAN = PUT*PWT + XUW_MEAN - XTH2_MEAN = PTHT**2 + XTH2_MEAN - XTEMP2_MEAN = ZTEMPT**2 + XTEMP2_MEAN - XPABS2_MEAN = PPABST**2 + XPABS2_MEAN ! ! Wind turbine variables IMI = GET_CURRENT_MODEL_INDEX() @@ -137,6 +128,28 @@ IKE=IKU-JPVEXT ! MEAN_COUNT = MEAN_COUNT + 1 ! +! Save old mean values for covariance computations +! + ZUMEAN_OLD = XUM_MEAN + ZWMEAN_OLD = XWM_MEAN + ZTHMEAN_OLD = XTHM_MEAN +! Welford method for variables whom we compute variances +! + CALL UPDATE_WELFORD(MEAN_COUNT,XUM_MEAN,XU2_M2,PUT) + CALL UPDATE_WELFORD(MEAN_COUNT,XVM_MEAN,XV2_M2,PVT) + CALL UPDATE_WELFORD(MEAN_COUNT,XWM_MEAN,XW2_M2,PWT) + CALL UPDATE_WELFORD(MEAN_COUNT,XTHM_MEAN,XTH2_M2,PTHT) + CALL UPDATE_WELFORD(MEAN_COUNT,XTEMPM_MEAN,XTEMP2_M2,ZTEMPT) + CALL UPDATE_WELFORD(MEAN_COUNT,XPABSM_MEAN,XPABS2_M2,PPABST) +! +! Welford method for covariances +! + IF (LCOV_FIELD) THEN + XUV_MEAN = XUV_MEAN + (PUT-ZUMEAN_OLD)*(PVT-XVM_MEAN) + 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) + END IF ! !----------------------------------------------------------------------- ! diff --git a/src/MNH/modd_mean_field.f90 b/src/MNH/modd_mean_field.f90 index 8c0e6a0515d9e9cae32b304157e1ba7e8676e30d..71e59e61fc8b88edb54f2785bef8bb05501030a0 100644 --- a/src/MNH/modd_mean_field.f90 +++ b/src/MNH/modd_mean_field.f90 @@ -48,5 +48,6 @@ USE MODD_PARAMETERS IMPLICIT NONE LOGICAL :: LMEAN_FIELD +LOGICAL :: LCOV_FIELD END MODULE MODD_MEAN_FIELD diff --git a/src/MNH/modd_mean_fieldn.f90 b/src/MNH/modd_mean_fieldn.f90 index 38572bc0bb2cb8f50ea1bc4cd4352100af779c84..eb346a3e709798b9ee6efe107c7d6b98ca9d1fa0 100644 --- a/src/MNH/modd_mean_fieldn.f90 +++ b/src/MNH/modd_mean_fieldn.f90 @@ -31,6 +31,7 @@ !! ------------- !! Original 01/07/11 !! 10/2016 (C.Lac) Add max values +!! 11/2022 (E. Jezequel) add covariances !! !------------------------------------------------------------------------------- ! @@ -38,6 +39,7 @@ ! ------------ ! USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_MEAN_FIELD IMPLICIT NONE TYPE MEAN_FIELD_t @@ -48,10 +50,13 @@ TYPE MEAN_FIELD_t REAL, DIMENSION(:,:,:), POINTER :: XPABSM_MEAN=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSVT_MEAN=>NULL() - REAL, DIMENSION(:,:,:), POINTER :: XU2_MEAN=>NULL(),XV2_MEAN=>NULL(),XW2_MEAN=>NULL(),XUW_MEAN=>NULL() - REAL, DIMENSION(:,:,:), POINTER :: XTH2_MEAN=>NULL() - REAL, DIMENSION(:,:,:), POINTER :: XTEMP2_MEAN=>NULL() - REAL, DIMENSION(:,:,:), POINTER :: XPABS2_MEAN=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XU2_M2=>NULL(),XV2_M2=>NULL(),XW2_M2=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XTH2_M2=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XTEMP2_M2=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XPABS2_M2=>NULL() + + REAL, DIMENSION(:,:,:), POINTER :: XUV_MEAN=>NULL(),XUW_MEAN=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XVW_MEAN=>NULL(),XWTH_MEAN=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XUM_MAX=>NULL(),XVM_MAX=>NULL(),XWM_MAX=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XTHM_MAX=>NULL() @@ -74,10 +79,13 @@ REAL, DIMENSION(:,:,:), POINTER :: XTKEM_MEAN=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XPABSM_MEAN=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSVT_MEAN=>NULL() -REAL, DIMENSION(:,:,:), POINTER :: XU2_MEAN=>NULL(),XV2_MEAN=>NULL(),XW2_MEAN=>NULL(),XUW_MEAN=>NULL() -REAL, DIMENSION(:,:,:), POINTER :: XTH2_MEAN=>NULL() -REAL, DIMENSION(:,:,:), POINTER :: XTEMP2_MEAN=>NULL() -REAL, DIMENSION(:,:,:), POINTER :: XPABS2_MEAN=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XU2_M2=>NULL(),XV2_M2=>NULL(),XW2_M2=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XTH2_M2=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XTEMP2_M2=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XPABS2_M2=>NULL() + +REAL, DIMENSION(:,:,:), POINTER :: XUV_MEAN=>NULL(),XUW_MEAN=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XVW_MEAN=>NULL(),XWTH_MEAN=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XUM_MAX=>NULL(),XVM_MAX=>NULL(),XWM_MAX=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XTHM_MAX=>NULL() @@ -110,14 +118,19 @@ MEAN_FIELD_MODEL(KFROM)%XTEMPM_MAX=>XTEMPM_MAX MEAN_FIELD_MODEL(KFROM)%XTKEM_MAX=>XTKEM_MAX MEAN_FIELD_MODEL(KFROM)%XPABSM_MAX=>XPABSM_MAX -MEAN_FIELD_MODEL(KFROM)%XU2_MEAN=>XU2_MEAN -MEAN_FIELD_MODEL(KFROM)%XV2_MEAN=>XV2_MEAN -MEAN_FIELD_MODEL(KFROM)%XW2_MEAN=>XW2_MEAN -MEAN_FIELD_MODEL(KFROM)%XUW_MEAN=>XUW_MEAN -MEAN_FIELD_MODEL(KFROM)%XTH2_MEAN=>XTH2_MEAN -MEAN_FIELD_MODEL(KFROM)%XTEMP2_MEAN=>XTEMP2_MEAN -MEAN_FIELD_MODEL(KFROM)%XPABS2_MEAN=>XPABS2_MEAN - +MEAN_FIELD_MODEL(KFROM)%XU2_M2=>XU2_M2 +MEAN_FIELD_MODEL(KFROM)%XV2_M2=>XV2_M2 +MEAN_FIELD_MODEL(KFROM)%XW2_M2=>XW2_M2 +MEAN_FIELD_MODEL(KFROM)%XTH2_M2=>XTH2_M2 +MEAN_FIELD_MODEL(KFROM)%XTEMP2_M2=>XTEMP2_M2 +MEAN_FIELD_MODEL(KFROM)%XPABS2_M2=>XPABS2_M2 + +IF (LCOV_FIELD) THEN + MEAN_FIELD_MODEL(KFROM)%XUV_MEAN=>XUV_MEAN + MEAN_FIELD_MODEL(KFROM)%XUW_MEAN=>XUW_MEAN + MEAN_FIELD_MODEL(KFROM)%XVW_MEAN=>XVW_MEAN + MEAN_FIELD_MODEL(KFROM)%XWTH_MEAN=>XWTH_MEAN +END IF ! ! Current model is set to model KTO XUM_MEAN=>MEAN_FIELD_MODEL(KTO)%XUM_MEAN @@ -137,13 +150,19 @@ XTEMPM_MAX=>MEAN_FIELD_MODEL(KTO)%XTEMPM_MAX XTKEM_MAX=>MEAN_FIELD_MODEL(KTO)%XTKEM_MAX XPABSM_MAX=>MEAN_FIELD_MODEL(KTO)%XPABSM_MAX -XU2_MEAN=>MEAN_FIELD_MODEL(KTO)%XU2_MEAN -XV2_MEAN=>MEAN_FIELD_MODEL(KTO)%XV2_MEAN -XW2_MEAN=>MEAN_FIELD_MODEL(KTO)%XW2_MEAN -XUW_MEAN=>MEAN_FIELD_MODEL(KTO)%XUW_MEAN -XTH2_MEAN=>MEAN_FIELD_MODEL(KTO)%XTH2_MEAN -XTEMP2_MEAN=>MEAN_FIELD_MODEL(KTO)%XTEMP2_MEAN -XPABS2_MEAN=>MEAN_FIELD_MODEL(KTO)%XPABS2_MEAN +XU2_M2=>MEAN_FIELD_MODEL(KTO)%XU2_M2 +XV2_M2=>MEAN_FIELD_MODEL(KTO)%XV2_M2 +XW2_M2=>MEAN_FIELD_MODEL(KTO)%XW2_M2 +XTH2_M2=>MEAN_FIELD_MODEL(KTO)%XTH2_M2 +XTEMP2_M2=>MEAN_FIELD_MODEL(KTO)%XTEMP2_M2 +XPABS2_M2=>MEAN_FIELD_MODEL(KTO)%XPABS2_M2 + +IF (LCOV_FIELD) THEN + XUV_MEAN=>MEAN_FIELD_MODEL(KTO)%XUV_MEAN + XUW_MEAN=>MEAN_FIELD_MODEL(KTO)%XUW_MEAN + XVW_MEAN=>MEAN_FIELD_MODEL(KTO)%XVW_MEAN + XWTH_MEAN=>MEAN_FIELD_MODEL(KTO)%XWTH_MEAN +END IF MEAN_COUNT=>MEAN_FIELD_MODEL(KTO)%MEAN_COUNT diff --git a/src/MNH/modn_mean.f90 b/src/MNH/modn_mean.f90 index 99f0143f6c881af2e268642ec9bbe571973788f6..5b39656863e21fafe1030fdeafc3c894a6ae57ca 100644 --- a/src/MNH/modn_mean.f90 +++ b/src/MNH/modn_mean.f90 @@ -38,7 +38,7 @@ USE MODD_MEAN_FIELD ! IMPLICIT NONE ! -NAMELIST/NAM_MEAN/LMEAN_FIELD +NAMELIST/NAM_MEAN/LMEAN_FIELD,LCOV_FIELD ! ! END MODULE MODN_MEAN diff --git a/src/MNH/update_welford.f90 b/src/MNH/update_welford.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8aa8e869b090caebb1d305676188606df19c20a5 --- /dev/null +++ b/src/MNH/update_welford.f90 @@ -0,0 +1,63 @@ +!MNH_LIC Copyright 2022-2022 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. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_UPDATE_WELFORD +! ####################### +! +INTERFACE +! +SUBROUTINE UPDATE_WELFORD(KCOUNT,PMEAN,PM2,PVALUE) + INTEGER, INTENT(IN) :: KCOUNT ! time count + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PMEAN ! aggregate for mean value + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PM2 ! aggregate for var value + REAL, DIMENSION(:,:,:), INTENT(IN) :: PVALUE ! variables +END SUBROUTINE UPDATE_WELFORD +! +END INTERFACE +! +END MODULE MODI_UPDATE_WELFORD +!######################################################### +SUBROUTINE UPDATE_WELFORD(KCOUNT,PMEAN,PM2,PVALUE) +!!**** *UPDATE_WELFORD* - Welford Algorithm +!! +!! PURPOSE +!! ------- +! The purpose of this module is to compute variance on a large number of sample +! and avoid catastrophic cancellation, leading to negative variance +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! E. Jezequel +!! +!! MODIFICATIONS +!! ------------- +!! Original November, 2022 +! ------------------------------------------------------------------------------ +! +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KCOUNT ! time count +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PMEAN ! aggregate for mean value +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PM2 ! aggregate for var value +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVALUE ! current value +! local variables +REAL, DIMENSION(SIZE(PVALUE,1),SIZE(PVALUE,2),SIZE(PVALUE,3)) :: ZDELTA, ZDELTA2 +! +ZDELTA = PVALUE - PMEAN +PMEAN = PMEAN + ZDELTA / KCOUNT +ZDELTA2= PVALUE - PMEAN +PM2 = PM2 + ZDELTA * ZDELTA2 +! +END SUBROUTINE UPDATE_WELFORD +! diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 4e11a572ddfe69d8ea56805d977068321fd4efbb..dd96607f1733505d37f5e5a40a110a1f5729cec1 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -181,6 +181,7 @@ END MODULE MODI_WRITE_LFIFM_n ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL ! J.L. Redelsperger 03/2021: add OCEAN and auto-coupled O-A LES cases ! A. Costes 12/2021: add Blaze fire model +! E. Jezequel 11/2022 : add covariances from MEAN fields !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -195,6 +196,7 @@ USE MODD_GRID_n USE MODD_TIME USE MODD_TIME_n USE MODD_FIELD_n +USE MODD_MEAN_FIELD USE MODD_MEAN_FIELD_n USE MODD_DUMMY_GR_FIELD_n USE MODD_LSFIELD_n @@ -722,14 +724,14 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CLONGNAME = 'UMME' TZFIELD%CUNITS = 'm s-1' TZFIELD%CCOMMENT = 'X_Y_Z_U component of mean wind' - ZWORK3D = XUM_MEAN/MEAN_COUNT + ZWORK3D = XUM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'U2ME' TZFIELD%CLONGNAME = 'U2ME' TZFIELD%CUNITS = 'm2 s-2' TZFIELD%CCOMMENT = 'X_Y_Z_U component of mean wind variance' - ZWORK3D = XU2_MEAN/MEAN_COUNT-XUM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XU2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'UMMA' @@ -738,27 +740,51 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CCOMMENT = 'X_Y_Z_U component of max wind' CALL IO_Field_write(TPFILE,TZFIELD,XUM_MAX) ! - TZFIELD%CMNHNAME = 'UWME' - TZFIELD%CLONGNAME = 'UWME' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CCOMMENT = 'X_Y_Z_UW component of mean wind variance' - ZWORK3D = XUW_MEAN/MEAN_COUNT-(XUM_MEAN*XWM_MEAN)/MEAN_COUNT**2 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) - ! + IF (LCOV_FIELD) THEN + ! + TZFIELD%CMNHNAME = 'UVME' + TZFIELD%CLONGNAME = 'UVME' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CCOMMENT = 'X_Y_Z_UV component of mean wind variance' + ZWORK3D = XUV_MEAN/MEAN_COUNT + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) + ! + TZFIELD%CMNHNAME = 'UWME' + TZFIELD%CLONGNAME = 'UWME' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CCOMMENT = 'X_Y_Z_UW component of mean wind variance' + ZWORK3D = XUW_MEAN/MEAN_COUNT + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) + ! + TZFIELD%CMNHNAME = 'VWME' + TZFIELD%CLONGNAME = 'VWME' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CCOMMENT = 'X_Y_Z_VW component of mean wind variance' + ZWORK3D = XVW_MEAN/MEAN_COUNT + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) + ! + TZFIELD%CMNHNAME = 'WTHME' + TZFIELD%CLONGNAME = 'WTHME' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CCOMMENT = 'X_Y_Z_WTH component of mean wind variance' + ZWORK3D = XWTH_MEAN/MEAN_COUNT + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) + ! + END IF TZFIELD%NGRID = 3 ! TZFIELD%CMNHNAME = 'VMME' TZFIELD%CLONGNAME = 'VMME' TZFIELD%CUNITS = 'm s-1' TZFIELD%CCOMMENT = 'X_Y_Z_V component of mean wind' - ZWORK3D = XVM_MEAN/MEAN_COUNT + ZWORK3D = XVM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'V2ME' TZFIELD%CLONGNAME = 'V2ME' TZFIELD%CUNITS = 'm2 s-2' TZFIELD%CCOMMENT = 'X_Y_Z_V component of mean wind variance' - ZWORK3D = XV2_MEAN/MEAN_COUNT-XVM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XV2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'VMMA' @@ -773,14 +799,14 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CLONGNAME = 'WMME' TZFIELD%CUNITS = 'm s-1' TZFIELD%CCOMMENT = 'X_Y_Z_vertical mean wind' - ZWORK3D = XWM_MEAN/MEAN_COUNT + ZWORK3D = XWM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'W2ME' TZFIELD%CLONGNAME = 'W2ME' TZFIELD%CUNITS = 'm2 s-2' TZFIELD%CCOMMENT = 'X_Y_Z_vertical mean wind variance' - ZWORK3D = XW2_MEAN/MEAN_COUNT-XWM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XW2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'WMMA' @@ -802,14 +828,14 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CLONGNAME = 'THMME' TZFIELD%CUNITS = 'K' TZFIELD%CCOMMENT = 'X_Y_Z_mean potential temperature' - ZWORK3D = XTHM_MEAN/MEAN_COUNT + ZWORK3D = XTHM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'TH2ME' TZFIELD%CLONGNAME = 'TH2ME' TZFIELD%CUNITS = 'K2' TZFIELD%CCOMMENT = 'X_Y_Z_mean potential temperature variance' - ZWORK3D = XTH2_MEAN/MEAN_COUNT-XTHM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XTH2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'THMMA' @@ -822,14 +848,14 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CLONGNAME = 'TEMPMME' TZFIELD%CUNITS = 'K' TZFIELD%CCOMMENT = 'X_Y_Z_mean temperature' - ZWORK3D = XTEMPM_MEAN/MEAN_COUNT + ZWORK3D = XTEMPM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'TEMP2ME' TZFIELD%CLONGNAME = 'TEMP2ME' TZFIELD%CUNITS = 'K2' TZFIELD%CCOMMENT = 'X_Y_Z_mean temperature variance' - ZWORK3D = XTEMP2_MEAN/MEAN_COUNT-XTEMPM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XTEMP2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'TEMPMMA' @@ -842,14 +868,14 @@ IF (MEAN_COUNT /= 0) THEN TZFIELD%CLONGNAME = 'PABSMME' TZFIELD%CUNITS = 'Pa' TZFIELD%CCOMMENT = 'X_Y_Z_mean ABSolute Pressure' - ZWORK3D = XPABSM_MEAN/MEAN_COUNT + ZWORK3D = XPABSM_MEAN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'PABS2ME' TZFIELD%CLONGNAME = 'PABS2ME' TZFIELD%CUNITS = 'Pa2' TZFIELD%CCOMMENT = 'X_Y_Z_mean ABSolute Pressure variance' - ZWORK3D = XPABS2_MEAN/MEAN_COUNT-XPABSM_MEAN**2/MEAN_COUNT**2 + ZWORK3D = XPABS2_M2/MEAN_COUNT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! TZFIELD%CMNHNAME = 'PABSMMA'