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