From 598c8ac8915fba1fea64a3d1f3c6c1a01cd352ce Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 27 Jan 2023 16:08:54 +0100 Subject: [PATCH] Merge branch 'MNH-55X-dev-IO' into MNH-56-branch --- src/common/aux/modd_cst.F90 | 149 +++++------ src/common/turb/mode_prandtl.F90 | 123 ++++----- src/common/turb/mode_tke_eps_sources.F90 | 147 +++++------ src/common/turb/mode_turb_hor_dyn_corr.F90 | 73 +++--- src/common/turb/mode_turb_hor_sv_flux.F90 | 53 ++-- src/common/turb/mode_turb_hor_thermo_corr.F90 | 75 +++--- src/common/turb/mode_turb_hor_thermo_flux.F90 | 130 +++++----- src/common/turb/mode_turb_hor_uv.F90 | 25 +- src/common/turb/mode_turb_hor_uw.F90 | 25 +- src/common/turb/mode_turb_hor_vw.F90 | 25 +- src/common/turb/mode_turb_ver.F90 | 108 ++++---- src/common/turb/mode_turb_ver_dyn_flux.F90 | 95 +++---- src/common/turb/mode_turb_ver_sv_flux.F90 | 91 +++---- src/common/turb/mode_turb_ver_thermo_corr.F90 | 92 +++---- src/common/turb/mode_turb_ver_thermo_flux.F90 | 231 ++++++++--------- src/common/turb/shallow_mf.F90 | 50 ++-- src/common/turb/turb.F90 | 237 +++++++++--------- src/mesonh/aux/modd_budget.f90 | 11 +- src/mesonh/aux/mode_io_field_write.f90 | 164 ++++++------ src/mesonh/micro/c2r2_adjust.f90 | 31 +-- src/mesonh/micro/lima_adjust.f90 | 46 ++-- src/mesonh/micro/lima_adjust_split.f90 | 48 ++-- src/mesonh/micro/lima_ccn_activation.f90 | 47 ++-- src/mesonh/micro/lima_notadjust.f90 | 25 +- src/mesonh/micro/lima_warm_nucl.f90 | 46 ++-- src/mesonh/micro/rain_c2r2_khko.f90 | 88 +++---- src/mesonh/turb/mode_ibm_mixinglength.F90 | 2 +- 27 files changed, 1146 insertions(+), 1091 deletions(-) diff --git a/src/common/aux/modd_cst.F90 b/src/common/aux/modd_cst.F90 index 544c75464..cb0aed25e 100644 --- a/src/common/aux/modd_cst.F90 +++ b/src/common/aux/modd_cst.F90 @@ -1,10 +1,10 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ############### - MODULE MODD_CST + MODULE MODD_CST ! ############### ! !!**** *MODD_CST* - declaration of Physic constants @@ -12,7 +12,7 @@ !! PURPOSE !! ------- ! The purpose of this declarative module is to declare the -! Physics constants. +! Physics constants. ! !! !!** IMPLICIT ARGUMENTS @@ -38,85 +38,85 @@ !! V. Masson 01/03/03 add conductivity of ice !! R. El Khatib 04/08/14 add pre-computed quantities !! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar -!! S. Riette: Jan 2022: introduction of a strucuture +! J.L. Redelsperger 03/2021: add constants for ocean penetrating solar +! S. Riette 01/2022: introduction of a structure +! P. Wautelet 20/05/2022: add RASTA cloud radar wavelength !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE + +REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz + TYPE CST_t -REAL :: XPI ! Pi -! -REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, - ! sideral day duration -! -REAL :: XKARMAN ! von karman constant -REAL :: XLIGHTSPEED ! light speed -REAL :: XPLANCK ! Planck constant -REAL :: XBOLTZ ! Boltzman constant -REAL :: XAVOGADRO ! Avogadro number -! -REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation -REAL :: XG ! Gravity constant -! -REAL :: XP00 ! Reference pressure -REAL :: XP00OCEAN ! Reference pressure for ocean model -REAL :: XRH00OCEAN ! Reference density for ocean model -! -REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant -! -REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor -REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -REAL :: XEPSILO ! XMV/XMD -REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -REAL :: XRHOLW ! Volumic mass of liquid water -REAL :: XCL,XCI ! Cl (liquid), Ci (ice) -REAL :: XTT ! Triple point temperature -REAL :: XLVTT ! Vaporization heat constant -REAL :: XLSTT ! Sublimation heat constant -REAL :: XLMTT ! Melting heat constant -REAL :: XESTT ! Saturation vapor pressure at triple point - ! temperature -REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor - ! pressure function -REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor - ! pressure function over solid ice -REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) -REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) -REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) -REAL :: XTH00 ! reference value for the potential temperature -REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model -REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model -REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) -REAL :: XD1=1.1 -REAL :: XD2=23. -! Values used in SURFEX CMO -!REAL :: XROC=0.58 -!REAL :: XD1=0.35 -!REAL :: XD2=23. + REAL :: XPI ! Pi + ! + REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, sideral day duration + ! + REAL :: XKARMAN ! von karman constant + REAL :: XLIGHTSPEED ! light speed + REAL :: XPLANCK ! Planck constant + REAL :: XBOLTZ ! Boltzman constant + REAL :: XAVOGADRO ! Avogadro number + ! + REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation + REAL :: XG ! Gravity constant + ! + REAL :: XP00 ! Reference pressure + REAL :: XP00OCEAN ! Reference pressure for ocean model + REAL :: XRH00OCEAN ! Reference density for ocean model + ! + REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant + ! + REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor + REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor + REAL :: XEPSILO ! XMV/XMD + REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) + REAL :: XRHOLW ! Volumic mass of liquid water + REAL :: XCL,XCI ! Cl (liquid), Ci (ice) + REAL :: XTT ! Triple point temperature + REAL :: XLVTT ! Vaporization heat constant + REAL :: XLSTT ! Sublimation heat constant + REAL :: XLMTT ! Melting heat constant + REAL :: XESTT ! Saturation vapor pressure at triple point temperature + REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure function + REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure function over solid ice + REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) + REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) + REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) + REAL :: XTH00 ! reference value for the potential temperature + REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model + REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model + REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) + REAL :: XD1=1.1 + REAL :: XD2=23. + ! Values used in SURFEX CMO + !REAL :: XROC=0.58 + !REAL :: XD1=0.35 + !REAL :: XD2=23. -REAL :: XRHOLI ! Volumic mass of ice -! -INTEGER :: NDAYSEC ! Number of seconds in a day -! -REAL :: RDSRV ! XRD/XRV -REAL :: RDSCPD ! XRD/XCPD -REAL :: RINVXP00 ! 1./XP00 -! -! Some machine precision value depending of real4/8 use -! -REAL :: XMNH_TINY ! minimum real on this machine -REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) -REAL :: XMNH_EPSILON ! minimum space with 1.0 -REAL :: XMNH_HUGE ! maximum real on this machine -REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine + REAL :: XRHOLI ! Volumic mass of ice + ! + INTEGER :: NDAYSEC ! Number of seconds in a day + ! + REAL :: RDSRV ! XRD/XRV + REAL :: RDSCPD ! XRD/XCPD + REAL :: RINVXP00 ! 1./XP00 + ! + ! Some machine precision value depending of real4/8 use + ! + REAL :: XMNH_TINY ! minimum real on this machine + REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) + REAL :: XMNH_EPSILON ! minimum space with 1.0 + REAL :: XMNH_HUGE ! maximum real on this machine + REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine -REAL :: XEPS_DT ! default value for DT test -REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance -REAL :: XRES_OTHER ! default not flat&cart residual tolerance -REAL :: XRES_PREP ! default prep residual tolerance + REAL :: XEPS_DT ! default value for DT test + REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance + REAL :: XRES_OTHER ! default not flat&cart residual tolerance + REAL :: XRES_PREP ! default prep residual tolerance END TYPE CST_t TYPE(CST_t), TARGET, SAVE :: CST @@ -172,6 +172,7 @@ REAL, POINTER :: XRES_OTHER=>NULL() REAL, POINTER :: XRES_PREP=>NULL() ! CONTAINS + SUBROUTINE CST_ASSOCIATE() IMPLICIT NONE XPI=>CST%XPI diff --git a/src/common/turb/mode_prandtl.F90 b/src/common/turb/mode_prandtl.F90 index 120b784a5..9a0d77c6d 100644 --- a/src/common/turb/mode_prandtl.F90 +++ b/src/common/turb/mode_prandtl.F90 @@ -144,16 +144,16 @@ CONTAINS USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST, ONLY : CST_t -USE MODD_CTURB, ONLY : CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB ! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_M_PHY, ONLY: GX_M_M_PHY, GY_M_M_PHY -USE MODE_EMOIST, ONLY : EMOIST -USE MODE_ETHETA, ONLY : ETHETA USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY ! IMPLICIT NONE @@ -174,7 +174,7 @@ LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: OHARAT LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file @@ -230,7 +230,7 @@ INTEGER :: IIJB,IIJE,IKT,IKA,IKL INTEGER :: JLOOP REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS @@ -656,68 +656,73 @@ END DO IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the RED_TH1 - TZFIELD%CMNHNAME = 'RED_TH1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_TH1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_TH1', & + CSTDNAME = '', & + CLONGNAME = 'RED_TH1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_TH1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDTH1) ! ! stores the RED_R1 - TZFIELD%CMNHNAME = 'RED_R1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_R1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_R1', & + CSTDNAME = '', & + CLONGNAME = 'RED_R1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_R1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDR1) ! ! stores the RED2_TH3 - TZFIELD%CMNHNAME = 'RED2_TH3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_TH3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_TH3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_TH3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_TH3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2TH3) ! ! stores the RED2_R3 - TZFIELD%CMNHNAME = 'RED2_R3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_R3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_R3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_R3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_R3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2R3) ! ! stores the RED2_THR3 - TZFIELD%CMNHNAME = 'RED2_THR3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_THR3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_THR3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_THR3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_THR3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2THR3) ! END IF diff --git a/src/common/turb/mode_tke_eps_sources.F90 b/src/common/turb/mode_tke_eps_sources.F90 index 516d4e689..f7f6a5082 100644 --- a/src/common/turb/mode_tke_eps_sources.F90 +++ b/src/common/turb/mode_tke_eps_sources.F90 @@ -2,6 +2,7 @@ !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 MODE_TKE_EPS_SOURCES IMPLICIT NONE CONTAINS @@ -116,7 +117,6 @@ CONTAINS !! 2012-02 Y. Seity, add possibility to run with reversed !! vertical levels !! 2014-11 Y. Seity, add output terms for TKE DDHs budgets -!! -------------------------------------------------------------------------- !! 2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O @@ -127,29 +127,28 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_BUDGET, ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY +USE MODD_BUDGET, ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_ll ! -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY -! USE MODI_GET_HALO USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE +USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE ! ! IMPLICIT NONE @@ -164,37 +163,35 @@ TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) INTEGER, INTENT(IN) :: KMI ! model index number REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM ! mixing length REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! physical height w-pt REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL ! Coef. temporal. disc. -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate online diagnostics (mesonh) -LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTP ! Ther. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * TKE at t+deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDISS ! Dissipation TKE term -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh ! ! ! @@ -220,7 +217,7 @@ INTEGER :: IIJB,IIJE,IKB,IKE,IKT,IKA,IKL ! Index value for the mass ! TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JIJ,JK ! @@ -476,58 +473,62 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the dynamic production ! - TZFIELD%CMNHNAME = 'DP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DP' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DP', & + CSTDNAME = '', & + CLONGNAME = 'DP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDP) ! ! stores the thermal production ! - TZFIELD%CMNHNAME = 'TP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TP' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_TP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TP', & + CSTDNAME = '', & + CLONGNAME = 'TP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTP) ! ! stores the whole turbulent transport ! - TZFIELD%CMNHNAME = 'TR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TR' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_TR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TR', & + CSTDNAME = '', & + CLONGNAME = 'TR', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZTR) ! ! stores the dissipation of TKE ! - TZFIELD%CMNHNAME = 'DISS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DISS' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DISS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DISS', & + CSTDNAME = '', & + CLONGNAME = 'DISS', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DISS', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDISS) END IF ! diff --git a/src/common/turb/mode_turb_hor_dyn_corr.F90 b/src/common/turb/mode_turb_hor_dyn_corr.F90 index 6bfd6f98e..32270e64e 100644 --- a/src/common/turb/mode_turb_hor_dyn_corr.F90 +++ b/src/common/turb/mode_turb_hor_dyn_corr.F90 @@ -75,7 +75,7 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -189,7 +189,7 @@ REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ ! coefficients for the uncentred gradient ! computation near the ground -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! -------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -304,17 +304,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <U U> - TZFIELD%CMNHNAME = 'U_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'U_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_U_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'U_VAR', & + CSTDNAME = '', & + CLONGNAME = 'U_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the U tendency @@ -399,17 +400,18 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <V V> - TZFIELD%CMNHNAME = 'V_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'V_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_V_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'V_VAR', & + CSTDNAME = '', & + CLONGNAME = 'V_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the V tendency @@ -486,17 +488,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <W W> - TZFIELD%CMNHNAME = 'W_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the W tendency diff --git a/src/common/turb/mode_turb_hor_sv_flux.F90 b/src/common/turb/mode_turb_hor_sv_flux.F90 index ae50bb870..db1b033eb 100644 --- a/src/common/turb/mode_turb_hor_sv_flux.F90 +++ b/src/common/turb/mode_turb_hor_sv_flux.F90 @@ -63,7 +63,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -139,8 +139,9 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground ! +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME INTEGER :: IKU -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL :: ZTIME1, ZTIME2 ! --------------------------------------------------------------------------- ! @@ -202,17 +203,19 @@ DO JSV=1,ISV ! ! stores <U SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXX) + WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXX) END IF ! IF (TLES%LLES_CALL .AND. KSPLT==1) THEN @@ -253,17 +256,19 @@ DO JSV=1,ISV ! ! stores <V SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXY) + WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM(TZFIELD%CMNHNAME), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME), & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXY) END IF ! ELSE diff --git a/src/common/turb/mode_turb_hor_thermo_corr.F90 b/src/common/turb/mode_turb_hor_thermo_corr.F90 index 6c00603ea..268f92393 100644 --- a/src/common/turb/mode_turb_hor_thermo_corr.F90 +++ b/src/common/turb/mode_turb_hor_thermo_corr.F90 @@ -59,14 +59,14 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY : CST_t +USE MODD_CST, ONLY : CST_t USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -142,7 +142,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! --------------------------------------------------------------------------- ! @@ -211,16 +211,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_HVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_HVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -299,16 +300,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLR_HCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLR_HCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLR_HCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLR_HCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLR_HCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLR_HCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -367,16 +369,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'R_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'R_HVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_R_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'R_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'R_HVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_R_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_thermo_flux.F90 b/src/common/turb/mode_turb_hor_thermo_flux.F90 index 93313669a..0654ed991 100644 --- a/src/common/turb/mode_turb_hor_thermo_flux.F90 +++ b/src/common/turb/mode_turb_hor_thermo_flux.F90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -149,7 +149,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! computation near the ground ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -246,16 +246,17 @@ END IF ! ! stores the horizontal <U THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UTHL_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UTHL_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -349,16 +350,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <U Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UR_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UR_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -398,16 +400,17 @@ END IF !! ! !! ! stores the horizontal <U VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'UVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'UVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_UVPT_FLX' -!! TZFIELD%NGRID = 2 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'UVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'UVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_UVPT_FLX', & +!! NGRID = 2, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTU) !! END IF !!! @@ -501,16 +504,17 @@ END IF ! ! stores the horizontal <V THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VTHL_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VTHL_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -613,16 +617,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <V Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VR_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VR_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -666,16 +671,17 @@ END IF !! ! !! ! stores the horizontal <V VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'VVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'VVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_VVPT_FLX' -!! TZFIELD%NGRID = 3 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'VVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'VVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_VVPT_FLX', & +!! NGRID = 3, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTV) !! END IF !!! diff --git a/src/common/turb/mode_turb_hor_uv.F90 b/src/common/turb/mode_turb_hor_uv.F90 index cd9a3f32a..717ef5907 100644 --- a/src/common/turb/mode_turb_hor_uv.F90 +++ b/src/common/turb/mode_turb_hor_uv.F90 @@ -62,7 +62,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -146,7 +146,7 @@ REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GY_U_UV_PUM REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GX_V_UV_PVM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -208,16 +208,17 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & ! ! stores <U V> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UV_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UV_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UV_FLX' - TZFIELD%NGRID = 5 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UV_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UV_FLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UV_FLX', & + NGRID = 5, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_uw.F90 b/src/common/turb/mode_turb_hor_uw.F90 index b13acfaa2..1885d3d9e 100644 --- a/src/common/turb/mode_turb_hor_uw.F90 +++ b/src/common/turb/mode_turb_hor_uw.F90 @@ -66,7 +66,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -137,7 +137,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GX_W_UW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -170,16 +170,17 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UW_HFLX' - TZFIELD%NGRID = 6 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UW_HFLX', & + NGRID = 6, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_vw.F90 b/src/common/turb/mode_turb_hor_vw.F90 index 196734ea6..2fe089f60 100644 --- a/src/common/turb/mode_turb_hor_vw.F90 +++ b/src/common/turb/mode_turb_hor_vw.F90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -136,7 +136,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GY_W_VW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -176,16 +176,17 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VW_HFLX' - TZFIELD%NGRID = 7 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VW_HFLX', & + NGRID = 7, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 index ddc28851f..b014aa191 100644 --- a/src/common/turb/mode_turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -2,6 +2,7 @@ !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 MODE_TURB_VER IMPLICIT NONE CONTAINS @@ -9,7 +10,7 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& OOCEAN,ODEEPOC,OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & PEXPL, HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW,PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER,PRSNOW, & PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -209,29 +210,29 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL -USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_LES, ONLY: TLES_t +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL +USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX +USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX +USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR USE MODE_TURB_VER_THERMO_FLUX, ONLY: TURB_VER_THERMO_FLUX USE MODE_TURB_VER_THERMO_CORR, ONLY: TURB_VER_THERMO_CORR -USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX -USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX -USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR ! USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH @@ -252,6 +253,7 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice water var. INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version @@ -386,8 +388,8 @@ INTEGER :: IKB,IKE,IIJE,IIJB,IKT ! index value for the Beginning INTEGER :: JSV,JIJ,JK ! loop counter REAL :: ZTIME1 REAL :: ZTIME2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -TYPE(TFIELDDATA) :: TZFIELD +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! @@ -502,7 +504,7 @@ ENDIF ! CALL TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES,OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -575,7 +577,7 @@ IF (TURBN%LHARAT) ZLM(:,:)=PLENGTHH(:,:) IF (KSV>0) & CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -613,42 +615,46 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. TURBN%LHARAT) THEN ! ! stores the Turbulent Prandtl number ! - TZFIELD%CMNHNAME = 'PHI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PHI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Prandtl number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PHI3', & + CSTDNAME = '', & + CLONGNAME = 'PHI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Prandtl number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPHI3) ! ! stores the Turbulent Schmidt number ! - TZFIELD%CMNHNAME = 'PSI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PSI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Schmidt number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PSI3', & + CSTDNAME = '', & + CLONGNAME = 'PSI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Schmidt number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPSI3) ! ! ! stores the Turbulent Schmidt number for the scalar variables ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for SV in turb_ver', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) DO JSV=1,KSV WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) diff --git a/src/common/turb/mode_turb_ver_dyn_flux.F90 b/src/common/turb/mode_turb_ver_dyn_flux.F90 index f68fc2d23..17f8d5500 100644 --- a/src/common/turb/mode_turb_ver_dyn_flux.F90 +++ b/src/common/turb/mode_turb_ver_dyn_flux.F90 @@ -204,31 +204,29 @@ SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! -USE SHUMAN_PHY USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY, GX_U_M_PHY USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY, GY_V_M_PHY USE MODE_GRADIENT_W_PHY, ONLY : GX_W_UW_PHY, GY_W_VW_PHY, GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY : GX_M_U_PHY, GY_M_V_PHY -! -USE MODI_SECOND_MNH -! -USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND -USE MODI_LES_MEAN_SUBGRID_PHY -! USE MODE_IO_FIELD_WRITE, only: IO_FIELD_WRITE_PHY USE MODE_ll +USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND +! +USE MODI_LES_MEAN_SUBGRID_PHY +USE MODI_SECOND_MNH ! IMPLICIT NONE ! @@ -334,7 +332,7 @@ REAL, DIMENSION(D%NIJT) :: ZCOEFFLXU, & ! PVSLOPEM in local 3D arrays ! REAL :: ZTIME1, ZTIME2, ZCMFS -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -516,16 +514,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the U wind component vertical flux - TZFIELD%CMNHNAME = 'UW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'U wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'U wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -882,16 +881,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the V wind component vertical flux - TZFIELD%CMNHNAME = 'VW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'V wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'V wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1119,16 +1119,17 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. TURBN%CTURBDIM == '1DIM') THEN ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance - TZFIELD%CMNHNAME = 'W_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VVAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VVAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/common/turb/mode_turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 index 99e56fa58..09d51b09c 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -1,13 +1,14 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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 MODE_TURB_VER_SV_FLUX IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -201,35 +202,34 @@ SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & !! to avoid unknwon values outside physical domain !! and avoid negative values in sv tendencies !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modifications: June 2019 (Wim de Rooy) with energycascade, 50MF nog -!! longer necessary +! Wim de Rooy 06/2019: with energycascade, 50MF nog longer necessary +! P. Wautelet 30/11/2022: compute PWSV only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -! - -USE SHUMAN_PHY , ONLY : DZM_PHY, MZM_PHY, MZF_PHY +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZM_PHY, MZM_PHY, MZF_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, NMNHNAMELGTMAX +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY -USE MODE_TRIDIAG, ONLY: TRIDIAG -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_TRIDIAG, ONLY: TRIDIAG ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -246,6 +246,7 @@ INTEGER, INTENT(IN) :: KSV, & KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step @@ -302,13 +303,14 @@ REAL :: ZTIME1, ZTIME2 REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) REAL :: ZCSV !constant for the scalar flux ! -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES ! ------------- ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_FLUX',0,ZHOOK_HANDLE) ! IKT=D%NKT @@ -429,30 +431,35 @@ DO JSV=1,KSV !$mnh_expand_array(JIJ=IIJB:IIJE) ZFLXZ(IIJB:IIJE,IKA) = ZFLXZ(IIJB:IIJE,IKB) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - DO JK=IKTB+1,IKTE-1 + + IF ( OFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) + PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) THEN ! stores the JSVth vertical flux - WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(YMNHNAME,'("WSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF diff --git a/src/common/turb/mode_turb_ver_thermo_corr.F90 b/src/common/turb/mode_turb_ver_thermo_corr.F90 index 6d71d9196..56c4e01d7 100644 --- a/src/common/turb/mode_turb_ver_thermo_corr.F90 +++ b/src/common/turb/mode_turb_ver_thermo_corr.F90 @@ -2,6 +2,7 @@ !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 MODE_TURB_VER_THERMO_CORR IMPLICIT NONE CONTAINS @@ -203,23 +204,23 @@ SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -248,7 +249,6 @@ REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of t ! normal to the ground surface ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual ! Potential Temperature @@ -299,6 +299,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRP ! guess of r at t+ deltat ! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),& MERGE(D%NKT,0,OCOMPUTE_SRC)), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t ! @@ -346,7 +347,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -614,16 +615,17 @@ END IF ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_VVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_VVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -927,16 +929,17 @@ END IF END IF ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLRCONS_VCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLRCONS_VCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLRCONS_VCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLRCONS_VCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLRCONS_VCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1192,16 +1195,17 @@ ENDIF END IF ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RTOT_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RTOT_VVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RTOT_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'RTOT_VVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RTOT_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/common/turb/mode_turb_ver_thermo_flux.F90 b/src/common/turb/mode_turb_ver_thermo_flux.F90 index 97366b22a..618fb377a 100644 --- a/src/common/turb/mode_turb_ver_thermo_flux.F90 +++ b/src/common/turb/mode_turb_ver_thermo_flux.F90 @@ -1,13 +1,14 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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 MODE_TURB_VER_THERMO_FLUX IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES, OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM, & TPFILE, & @@ -222,34 +223,32 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & !! June 2020 (B. Vie) Patch preventing negative rc and ri in 2.3 and 3.3 !! JL Redelsperger : 03/2021: Ocean and Autocoupling O-A LES Cases !! Sfc flux shape for LDEEPOC Case +! P. Wautelet 30/11/2022: compute PWTH and PWRC only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZF_PHY, DZM_PHY, MXF_PHY, MYF_PHY, MZF_PHY, MZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO -USE MODE_TM06_H, ONLY: TM06_H +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY, DZF_PHY, & - MXF_PHY,MYF_PHY -USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_TM06_H, ONLY: TM06_H +USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -263,44 +262,36 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES ! modd_les structure -INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KSV ! number of scalar var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV ! number of scalar var. +INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic +LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY ! Metric coefficients +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the normal to the ground surface REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! altitudes ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual Potential Temperature ! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat +REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients REAL, DIMENSION(D%NIJT), INTENT(IN) :: PZS ! orography (for LEONARD terms) +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time t - deltat +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time t + deltat ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM ! Vertical wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at time t @@ -335,13 +326,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIT,0,TURBN%CTOM=='TM06'),& MERGE(D%NJT,0,TURBN%CTOM=='TM06')), INTENT(INOUT):: PBL_DEPTH ! BL depth REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PWTHV ! buoyancy flux ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRP ! guess of r at t+ deltat ! @@ -396,7 +387,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -672,42 +663,48 @@ ELSE !$mnh_end_expand_array(JIJ=IIJB:IIJE) END IF ! -DO JK=IKTB+1,IKTE-1 - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -END DO -! -!$mnh_expand_array(JIJ=IIJB:IIJE) -PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) -!$mnh_end_expand_array(JIJ=IIJB:IIJE) -! -IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWTH(IIJB:IIJE,IKA)=0. - PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -ELSE +IF ( OFLYER ) THEN + PWTH(:,:IKTB) = XUNDEF + PWTH(:,IKTE:) = XUNDEF + ! + DO JK = IKTB + 1, IKTE - 1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO + ! !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) - PWTH(IIJB:IIJE,IKU)=0. + PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWTH(IIJB:IIJE,IKA)=0. + PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) + PWTH(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative potential temperature vertical flux - TZFIELD%CMNHNAME = 'THW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'THW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1061,41 +1058,44 @@ IF (KRR /= 0) THEN ZFLXZ(IIJB:IIJE,IKU) = ZFLXZ(IIJB:IIJE,IKE) END IF ! - DO JK=IKTB+1,IKTE-1 + IF ( OFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ! - IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWRC(IIJB:IIJE,IKA)=0. - PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ELSE - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) - PWRC(IIJB:IIJE,IKU)=0. - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ENDIF + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWRC(IIJB:IIJE,IKA)=0. + PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) + PWRC(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF + END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative mixing ratio vertical flux - TZFIELD%CMNHNAME = 'RCONSW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCONSW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCONSW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCONSW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1273,16 +1273,17 @@ IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL) .AND. (KRRL > ! ! store the liquid water mixing ratio vertical flux IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RCW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Liquid water mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Liquid water mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index ec3a76764..898883076 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -72,6 +72,10 @@ !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE MODD_BUDGET, ONLY: TBUDGETCONF_t, TBUDGETDATA, NBUDGET_U, NBUDGET_V, & NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -82,18 +86,15 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_PARAMETERS, ONLY: JPSVMAX ! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY -USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF -USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY +USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD +USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 -USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA -USE MODE_MF_TURB, ONLY: MF_TURB -USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL -USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD -USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE MODE_MF_TURB, ONLY: MF_TURB +USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF ! IMPLICIT NONE @@ -120,16 +121,15 @@ REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the reference state REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme @@ -157,13 +157,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL -REAL, INTENT(IN) :: PDX, PDY -REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN),OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) -TYPE(TBUDGETCONF_t), INTENT(IN),OPTIONAL :: BUCONF ! budget structure -INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT),OPTIONAL :: TBUDGETS -REAL,DIMENSION(JPSVMAX),INTENT(IN),OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN), OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) +REAL,DIMENSION(JPSVMAX), INTENT(IN), OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +TYPE(TBUDGETCONF_t), INTENT(IN), OPTIONAL :: BUCONF ! budget structure +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT), OPTIONAL :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs ! ! 0.2 Declaration of local variables diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index cf97ca6de..58e0ba184 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -7,7 +7,7 @@ & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO, & & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM, & & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH, & - & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -226,7 +226,7 @@ ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! Q. Rodier 01/2018: introduction of RM17 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! June 2019 (Wim de Rooy) update statistical cloud scheme +! Wim de Rooy 06/2019: update statistical cloud scheme ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices @@ -239,45 +239,44 @@ !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZF_PHY,MXF_PHY,MYF_PHY +USE YOMHOOK , ONLY: LHOOK, DR_HOOK ! -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & +USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & TBUDGETDATA, TBUDGETCONF_t -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -! -USE MODD_LES, ONLY : TLES_t +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_BL89, ONLY: BL89 -USE MODE_TURB_VER, ONLY : TURB_VER -USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND -USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT -USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES -USE MODE_RMC01, ONLY: RMC01 -USE MODE_TM06, ONLY: TM06 -USE MODE_UPDATE_LM, ONLY: UPDATE_LM -USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_SBL_PHY, ONLY: LMO +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BL89, ONLY: BL89 +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_U_PHY, ONLY: GZ_U_UW_PHY +USE MODE_GRADIENT_V_PHY, ONLY: GZ_V_VW_PHY +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_RMC01, ONLY: RMC01 +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND +USE MODE_SBL_PHY, ONLY: LMO USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT_PHY -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_TM06, ONLY: TM06 +USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES +USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT +USE MODE_TURB_VER, ONLY: TURB_VER +USE MODE_UPDATE_LM, ONLY: UPDATE_LM ! USE MODI_LES_MEAN_SUBGRID_PHY ! -USE SHUMAN_PHY, ONLY : MZF_PHY,MXF_PHY,MYF_PHY -USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY -USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY -USE MODE_GRADIENT_W_PHY, ONLY : GZ_W_M_PHY -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY ! IMPLICIT NONE ! @@ -305,6 +304,7 @@ INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud m LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow @@ -500,7 +500,7 @@ REAL :: ZALPHA ! work coefficient : ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !* 1.PRELIMINARIES ! ------------- @@ -641,28 +641,30 @@ IF (KRRL >=1) THEN ! ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_DIAG ) THEN - TZFIELD%CMNHNAME = 'ATHETA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ATHETA' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_ATHETA' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATHETA', & + CSTDNAME = '', & + CLONGNAME = 'ATHETA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ATHETA', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZATHETA) ! - TZFIELD%CMNHNAME = 'AMOIST' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AMOIST' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_AMOIST' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AMOIST', & + CSTDNAME = '', & + CLONGNAME = 'AMOIST', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_AMOIST', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZAMOIST) END IF ! @@ -1006,7 +1008,7 @@ CALL TURB_VER(D,CST,CSTURB,TURBN,TLES, & OOCEAN, ODEEPOC, OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & ZEXPL,HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW, PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -1239,46 +1241,49 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the mixing length ! - TZFIELD%CMNHNAME = 'LM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Mixing length' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM', & + CSTDNAME = '', & + CLONGNAME = 'LM', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Mixing length', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ! IF (KRR /= 0) THEN ! ! stores the conservative potential temperature ! - TZFIELD%CMNHNAME = 'THLM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLM' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLM', & + CSTDNAME = '', & + CLONGNAME = 'THLM', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTHLT) ! ! stores the conservative mixing ratio ! - TZFIELD%CMNHNAME = 'RNPM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RNPM' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RNPM', & + CSTDNAME = '', & + CLONGNAME = 'RNPM', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio',& + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRT(:,:,1)) END IF END IF @@ -1973,16 +1978,17 @@ ENDIF ! ! Impression before modification of the mixing length IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLEAR_SKY', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLEAR_SKY', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLEAR SKY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ENDIF ! @@ -2007,27 +2013,30 @@ END WHERE ! ---------- ! IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'COEF_AMPL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COEF_AMPL' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COEF_AMPL', & + CSTDNAME = '', & + CLONGNAME = 'COEF_AMPL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_COEF AMPL', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZCOEF_AMPL) ! - TZFIELD%CMNHNAME = 'LM_CLOUD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLOUD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLOUD', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLOUD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLOUD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF diff --git a/src/mesonh/aux/modd_budget.f90 b/src/mesonh/aux/modd_budget.f90 index 1f052f578..0270f474a 100644 --- a/src/mesonh/aux/modd_budget.f90 +++ b/src/mesonh/aux/modd_budget.f90 @@ -35,7 +35,7 @@ ! P. Wautelet 19/07/2019: parameters to identify budget number ! P. Wautelet 15/11/2019: remove unused CBURECORD variable ! P. Wautelet 17/01/2020: add new budget data types -! P. Wautelet 27/01/2020: use the tfield_metadata_base abstract datatype +! P. Wautelet 27/01/2020: use the tfieldmetadata_base abstract datatype ! P. Wautelet 28/01/2020: add trhodj in tbudgetdata datatype ! P. Wautelet 09/03/2020: add tburhodj variable ! P. Wautelet 17/04/2020: set default values for budgets switch values @@ -53,7 +53,7 @@ !* 0. DECLARATIONS ! ------------ -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_parameters, only: NBUNAMELGTMAX, NCOMMENTLGTMAX implicit none @@ -102,7 +102,7 @@ character(len=*), dimension(NMAXLEVELS), parameter :: CNCGROUPNAMES = [ & integer :: nbudgets ! Number of budget categories -type, extends( tfield_metadata_base ) :: tbusourcedata +type, extends( tfieldmetadata_base ) :: tbusourcedata integer :: ngroup = 0 ! Number of the source term group in which storing the source term ! (0: no store, 1: individual store, >1: number of the group) logical :: lavailable = .false. ! If true, the source is available in the run (conditions to access it are met), @@ -114,16 +114,17 @@ type, extends( tfield_metadata_base ) :: tbusourcedata ! It may be true only if the source term is in a group not containing other sources end type tbusourcedata -type, extends( tfield_metadata_base ) :: tbugroupdata +type, extends( tfieldmetadata_base ) :: tbugroupdata integer :: nsources = 0 ! Number of source terms composing this group integer, dimension(:), allocatable :: nsourcelist ! List of the source terms composing this group real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data end type tbugroupdata -type, extends( tfield_metadata_base ) :: tburhodata +type, extends( tfieldmetadata_base ) :: tburhodata real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data end type tburhodata +!PW: a commenter + renommer??? type :: tbudiachrometadata character(len=NBUNAMELGTMAX), dimension(NMAXLEVELS) :: clevels = '' !Name of the different groups/levels in the netCDF file character(len=NCOMMENTLGTMAX), dimension(NMAXLEVELS) :: ccomments ='' !Comments for the different groups/levels in the netCDF file diff --git a/src/mesonh/aux/mode_io_field_write.f90 b/src/mesonh/aux/mode_io_field_write.f90 index a4a6a28c0..e513093ca 100644 --- a/src/mesonh/aux/mode_io_field_write.f90 +++ b/src/mesonh/aux/mode_io_field_write.f90 @@ -25,7 +25,8 @@ MODULE MODE_IO_FIELD_WRITE - use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL + use modd_field, only: tfieldlist, tfieldmetadata, tfieldmetadata_base, & + TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA, TOUTBAK USE MODD_MPIF use modd_parameters, only: NMNHNAMELGTMAX @@ -86,10 +87,10 @@ MODULE MODE_IO_FIELD_WRITE CONTAINS SUBROUTINE IO_Field_metadata_check(TPFIELD,KTYPE,KDIMS,HCALLER) - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD ! Field to check - INTEGER, INTENT(IN) :: KTYPE ! Expected datatype - INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions - CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine + CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD ! Field to check + INTEGER, INTENT(IN) :: KTYPE ! Expected datatype + INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions + CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine ! CHARACTER(LEN=2) :: YDIMOK,YDIMKO CHARACTER(LEN=8) :: YTYPEOK,YTYPEKO @@ -182,13 +183,13 @@ CONTAINS subroutine IO_Field_write_error_check( tpfile, tpfield, hsubr, kresp_in, kresp_lfi, kresp_nc4, kresp_out ) use modd_io, only: gsmonoproc - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield - character(len=*), intent(in) :: hsubr - integer, intent(in) :: kresp_in - integer, intent(in) :: kresp_lfi - integer, intent(in) :: kresp_nc4 - integer, intent(out) :: kresp_out + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(in) :: tpfield + character(len=*), intent(in) :: hsubr + integer, intent(in) :: kresp_in + integer, intent(in) :: kresp_lfi + integer, intent(in) :: kresp_nc4 + integer, intent(out) :: kresp_out character(len=:), allocatable :: ymsg character(len=6) :: yresp @@ -316,14 +317,14 @@ subroutine IO_Field_create( tpfile, tpfield ) use modd_field use modd_io, only: gsmonoproc, isp - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata), intent(in) :: tpfield - integer :: ik_file - integer :: iresp - logical :: glfi, gnc4 - type(tfielddata) :: tzfield - type(tfiledata), pointer :: tzfile + integer :: ik_file + integer :: iresp + logical :: glfi, gnc4 + class(tfieldmetadata), allocatable :: tzfield + type(tfiledata), pointer :: tzfile call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) ) @@ -345,7 +346,7 @@ subroutine IO_Field_create( tpfile, tpfield ) end if if ( iresp == 0 ) then - tzfield = tpfield + Allocate( tzfield, source = tpfield ) if ( All( tzfield%ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) then call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': ' & @@ -448,8 +449,8 @@ subroutine IO_Ndimlist_reduce( tpfile, tpfield ) use modd_io, only: gsmonoproc, l1d, l2d, lpack use modd_parameters_ll, only: jphext - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(inout) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(inout) :: tpfield integer :: ihextot integer :: ji @@ -534,7 +535,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -633,7 +634,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -651,7 +652,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -669,7 +670,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -687,7 +688,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -708,7 +709,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(1), optional, intent(in) :: koffset @@ -838,7 +839,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(2), optional, intent(in) :: koffset @@ -866,7 +867,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -897,8 +898,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -915,7 +916,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp0d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -930,8 +930,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -947,7 +947,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1097,7 +1096,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -1140,7 +1139,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE ! TZFILE => NULL() @@ -1178,8 +1177,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1196,7 +1195,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1210,8 +1208,8 @@ end subroutine IO_Ndimlist_reduce end if endif ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1229,7 +1227,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :) if ( Present ( koffset ) ) then @@ -1503,7 +1500,7 @@ end subroutine IO_Ndimlist_reduce ! end of MNH_GA #endif !Not global reduction because a broadcast is done in IO_Field_write_error_check - call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 1, MNHINT_MPI, MPI_MIN, & + call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 2, MNHINT_MPI, MPI_MIN, & tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr ) iresp_lfi = iresps(1) iresp_nc4 = iresps(2) @@ -1562,7 +1559,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -1585,7 +1582,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1615,8 +1612,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1635,7 +1632,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1650,8 +1646,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1671,7 +1667,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -1777,7 +1772,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -1797,7 +1792,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1822,8 +1817,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1836,7 +1831,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp3d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1846,8 +1840,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1860,7 +1854,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp4d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp4d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp, iresp_lfi ) @@ -1950,7 +1943,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2061,7 +2054,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2153,7 +2146,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2265,7 +2258,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2288,7 +2281,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2314,8 +2307,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2325,7 +2318,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp0d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp0d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2335,8 +2327,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2346,7 +2338,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -2446,7 +2437,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2468,7 +2459,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2494,8 +2485,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2506,7 +2497,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2516,8 +2506,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2528,7 +2518,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp2d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp, iresp_lfi ) @@ -2624,7 +2613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -2647,7 +2636,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2677,8 +2666,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2697,7 +2686,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2712,8 +2700,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2733,7 +2721,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -2833,7 +2820,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2925,7 +2912,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:),TARGET, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3032,7 +3019,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3112,7 +3099,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3216,7 +3203,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3293,7 +3280,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME),DIMENSION(:), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3373,7 +3360,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PLB ! array containing the LB field INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code @@ -3402,7 +3389,7 @@ end subroutine IO_Ndimlist_reduce TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -3437,8 +3424,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -3449,7 +3436,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ztx2dp, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ztx2dp, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE tx3dp => plb(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, tx3dp, iresp_lfi ) @@ -3533,7 +3519,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3627,7 +3613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3721,7 +3707,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3815,7 +3801,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -4325,7 +4311,7 @@ IMPLICIT NONE ! TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 INTEGER :: IKB diff --git a/src/mesonh/micro/c2r2_adjust.f90 b/src/mesonh/micro/c2r2_adjust.f90 index b97914d1a..c5e9d27bc 100644 --- a/src/mesonh/micro/c2r2_adjust.f90 +++ b/src/mesonh/micro/c2r2_adjust.f90 @@ -146,7 +146,7 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_sv, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, only: tfielddata, TYPEREAL +USE MODD_FIELD, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV, ONLY: NSV_C2R2BEG @@ -195,10 +195,10 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZW1,ZW2,ZW3 ! Work arrays for intermediate ! fields ! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment -INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -405,16 +405,17 @@ IF ( HRAD /= 'NONE' ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW1) END IF ! diff --git a/src/mesonh/micro/lima_adjust.f90 b/src/mesonh/micro/lima_adjust.f90 index 189fe4514..54b749e8b 100644 --- a/src/mesonh/micro/lima_adjust.f90 +++ b/src/mesonh/micro/lima_adjust.f90 @@ -151,7 +151,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -288,7 +288,7 @@ INTEGER :: JL ! and PACK intrinsics INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -1201,16 +1201,17 @@ IF ( SIZE(PSRCS,3) /= 0 ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! @@ -1256,16 +1257,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90 index 9482c616c..724b835b9 100644 --- a/src/mesonh/micro/lima_adjust_split.f90 +++ b/src/mesonh/micro/lima_adjust_split.f90 @@ -158,7 +158,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -302,6 +302,7 @@ INTEGER :: JITER,ITERMAX ! iterative loop for first order adju INTEGER :: ILUOUT ! Logical unit of output listing ! INTEGER :: ISIZE +LOGICAL :: G_SIGMAS, GUSERI REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN ! @@ -309,8 +310,7 @@ integer :: idx integer :: JI, JJ, JK, jl INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! -TYPE(TFIELDDATA) :: TZFIELD -LOGICAL :: G_SIGMAS, GUSERI +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -683,16 +683,17 @@ ELSE END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PCLDFR) END IF ! @@ -737,16 +738,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_ccn_activation.f90 b/src/mesonh/micro/lima_ccn_activation.f90 index fa0a276eb..bac576fa0 100644 --- a/src/mesonh/micro/lima_ccn_activation.f90 +++ b/src/mesonh/micro/lima_ccn_activation.f90 @@ -98,7 +98,7 @@ END MODULE MODI_LIMA_CCN_ACTIVATION ! ------------ ! USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMNH_EPSILON, XMV, XRV, XTT -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT @@ -181,7 +181,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -502,29 +502,30 @@ IF ( tpfile%lopened ) THEN ZW (:,:,:) = 0. ZW2(:,:,:) = 0. END IF - - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/mesonh/micro/lima_notadjust.f90 b/src/mesonh/micro/lima_notadjust.f90 index 42a0b33d5..ddd221297 100644 --- a/src/mesonh/micro/lima_notadjust.f90 +++ b/src/mesonh/micro/lima_notadjust.f90 @@ -83,7 +83,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -168,7 +168,7 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& ZSAT,ZCCS INTEGER :: JK ! For loop integer :: idx -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source REAL, DIMENSION(:,:), ALLOCATABLE :: ZZNFS ! CCN C. available source @@ -588,16 +588,17 @@ ENDWHERE ! IF ( tpfile%lopened ) THEN ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) - TZFIELD%CMNHNAME = 'NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NACT' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_warm_nucl.f90 b/src/mesonh/micro/lima_warm_nucl.f90 index cf5382b50..8591b848e 100644 --- a/src/mesonh/micro/lima_warm_nucl.f90 +++ b/src/mesonh/micro/lima_warm_nucl.f90 @@ -108,7 +108,7 @@ END MODULE MODI_LIMA_WARM_NUCL ! ------------ ! USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT @@ -198,7 +198,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -509,28 +509,30 @@ IF ( tpfile%lopened ) THEN ZW2(:,:,:) = 0. END IF - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/mesonh/micro/rain_c2r2_khko.f90 b/src/mesonh/micro/rain_c2r2_khko.f90 index 5708c0d4c..cc19dbbf0 100644 --- a/src/mesonh/micro/rain_c2r2_khko.f90 +++ b/src/mesonh/micro/rain_c2r2_khko.f90 @@ -225,7 +225,7 @@ USE MODD_CH_AEROSOL USE MODD_CONF USE MODD_CST USE MODD_DUST -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY : NSV_C2R2BEG USE MODD_PARAM_C2R2 @@ -415,7 +415,7 @@ REAL :: ZFACT, JSV, ZMU, ZALPHA REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN REAL :: ZTMP -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! ! @@ -595,16 +595,17 @@ end if !! !! ! IF ( tpfile%lopened ) THEN -! TZFIELD%CMNHNAME = 'ZCHEN' -! TZFIELD%CSTDNAME = '' -! TZFIELD%CLONGNAME = 'ZCHEN' -! TZFIELD%CUNITS = '' -! TZFIELD%CDIR = 'XY' -! TZFIELD%CCOMMENT = 'X_Y_Z_ZCHEN' -! TZFIELD%NGRID = 1 -! TZFIELD%NTYPE = TYPEREAL -! TZFIELD%NDIMS = 3 -! TZFIELD%LTIMEDEP = .TRUE. +! TZFIELD = TFIELDMETADATA( & +! CMNHNAME = 'ZCHEN', & +! CSTDNAME = '', & +! CLONGNAME = 'ZCHEN', & +! CUNITS = '', & +! CDIR = 'XY', & +! CCOMMENT = 'X_Y_Z_ZCHEN', & +! NGRID = 1, & +! NTYPE = TYPEREAL, & +! NDIMS = 3, & +! LTIMEDEP = .TRUE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,ZCHEN) ! END IF ! @@ -878,16 +879,17 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SMAX' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZZW1LOG) END IF ! @@ -1896,28 +1898,30 @@ DO JN = 1 , KSPLITR END IF ! IF ( OSEDC .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SEDFLUXC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXC' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXC' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXC', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXC', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXC', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC) ! - TZFIELD%CMNHNAME = 'SEDFLUXR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXR', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXR', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDR) END IF END DO diff --git a/src/mesonh/turb/mode_ibm_mixinglength.F90 b/src/mesonh/turb/mode_ibm_mixinglength.F90 index 7f74c571a..bc584c940 100644 --- a/src/mesonh/turb/mode_ibm_mixinglength.F90 +++ b/src/mesonh/turb/mode_ibm_mixinglength.F90 @@ -55,7 +55,7 @@ SUBROUTINE IBM_MIXINGLENGTH(D,PLM,PLEPS,PMU,PHI,PTKE) USE MODD_REF_n, ONLY: XRHODJ,XRHODREF USE MODD_CTURB USE MODD_CST - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ + USE MODD_GRID_n, ONLY: XZZ ! ! interface ! -- GitLab