diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 39bb56a69b1e50141bc39db8f2236a956355faac..1068048830601efb23f77363874bc2d493a6f58f 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 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.
@@ -91,7 +91,7 @@ program LFI2CDF
      CALL IO_Config_set()
   END IF
 
-  CALL INI_FIELD_LIST(1)
+  CALL INI_FIELD_LIST()
 
   CALL OPEN_FILES(infiles, outfiles, nfiles_out, hinfile, houtfile, nbvar_infile, options, runmode)
   IF (options(OPTLIST)%set) STOP
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 5bca2401c4b91d7ce1ea9902cdcf70e017a85c74..d60a7fc7915b113d992c374768bf389b3c719d82 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 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.
@@ -15,7 +15,7 @@
 !  P. Wautelet 10/11/2020: new data structures for netCDF dimensions
 !-----------------------------------------------------------------
 MODULE mode_util
-  use modd_field,      only: tfielddata, tfieldlist
+  use modd_field,      only: tfieldmetadata, tfieldlist
   USE MODD_IO,         ONLY: TFILEDATA, TFILE_ELT
   USE MODD_NETCDF,     ONLY: CDFINT, tdimnc
   USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH, NMNHNAMELGTMAX
@@ -56,7 +56,7 @@ MODULE mode_util
      INTEGER(kind=CDFINT)                  :: NTYPE_FILE  ! netCDF datatype (NF90_CHAR, NF90_INT...) (as present in input file)
      INTEGER,DIMENSION(MAXRAW)             :: src    ! List of variables used to compute the variable (needed only if calc=.true.)
      INTEGER                               :: tgt    ! Target: id of the variable that use it (calc variable)
-     TYPE(TFIELDDATA)                      :: TFIELD ! Metadata about the field
+     TYPE(TFIELDMETADATA)                  :: TFIELD ! Metadata about the field
      TYPE(tdimnc),DIMENSION(:),ALLOCATABLE :: TDIMS  ! Dimensions of the field
   END TYPE workfield
 
@@ -388,7 +388,7 @@ END DO
       ELSE
         CALL FIND_FIELD_ID_FROM_MNHNAME(tpreclist(ji)%name,IID,IRESP,ONOWARNING=.TRUE.)
         IF (IRESP==0) THEN
-          tpreclist(ji)%TFIELD = TFIELDLIST(IID)
+          tpreclist(ji)%TFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
           ! Determine TDIMS
           IF (runmode==MODELFI2CDF) THEN
             ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS))
diff --git a/bin/spl b/bin/spl
index 7d6e4158a71aa63d389d478fddea810e60155cdd..9497c5b36db85b558539f03e36940ab7843ccfe7 100755
--- a/bin/spl
+++ b/bin/spl
@@ -1,7 +1,7 @@
 #!/bin/bash
-#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+#MNH_LIC Copyright 1995-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 #MNH_LIC for details. version 1.
 #set -x
 # HP-UX 10
@@ -83,6 +83,7 @@ fi
 #
 #modified by C. Fischer to split fortran 77 (26/04/95)
 #modified by C. Fischer to correct a bug PROGRAM-CONTAINS (16/02/96)
+#modified by P. Wautelet to add support for PURE and ELEMENTAL functions and subroutines (30/11/2022)
 #
 #.SH COPYRIGHT
 #
@@ -153,7 +154,55 @@ awk '
       }
       { if((i_conta) != "open")
         {
-		  { if((substr(u1,1,9)) == "RECURSIVE")
+          { if((substr(u1,1,9)) == "ELEMENTAL")
+            { if((substr(u2,1,10)) == "SUBROUTINE")
+              { split(u3,p_name,"(");
+                l_name=(tolower(p_name[1]));
+                split((l_name),e_name,"$");
+                f_name=(e_name[1]) (e_name[2]) ".f90";
+                print (f_name); i_flag="bof";
+                print "!     ######spl" > (f_name);
+                n_unit=(n_unit) + 0
+              }
+            }
+          }
+          { if((substr(u1,1,9)) == "ELEMENTAL")
+            { if((substr(u2,1,8)) == "FUNCTION")
+              { split(u3,p_name,"(");
+                l_name=(tolower(p_name[1]));
+                split((l_name),e_name,"$");
+                f_name=(e_name[1]) (e_name[2]) ".f90";
+                print (f_name); i_flag="bof";
+                print "!     ######spl" > (f_name);
+                n_unit=(n_unit) + 0
+              }
+            }
+          }
+          { if((substr(u1,1,4)) == "PURE")
+            { if((substr(u2,1,10)) == "SUBROUTINE")
+              { split(u3,p_name,"(");
+                l_name=(tolower(p_name[1]));
+                split((l_name),e_name,"$");
+                f_name=(e_name[1]) (e_name[2]) ".f90";
+                print (f_name); i_flag="bof";
+                print "!     ######spl" > (f_name);
+                n_unit=(n_unit) + 0
+              }
+            }
+          }
+          { if((substr(u1,1,4)) == "PURE")
+            { if((substr(u2,1,8)) == "FUNCTION")
+              { split(u3,p_name,"(");
+                l_name=(tolower(p_name[1]));
+                split((l_name),e_name,"$");
+                f_name=(e_name[1]) (e_name[2]) ".f90";
+                print (f_name); i_flag="bof";
+                print "!     ######spl" > (f_name);
+                n_unit=(n_unit) + 0
+              }
+            }
+          }
+          { if((substr(u1,1,9)) == "RECURSIVE")
             { if((substr(u2,1,10)) == "SUBROUTINE")
               { split(u3,p_name,"(");
                 l_name=(tolower(p_name[1]));
@@ -164,8 +213,8 @@ awk '
                 n_unit=(n_unit) + 0
               }   
             }   
-		  }
-		  { if((substr(u1,1,9)) == "RECURSIVE")
+          }
+          { if((substr(u1,1,9)) == "RECURSIVE")
             { if((substr(u2,1,8)) == "FUNCTION")
               { split(u3,p_name,"(");
                 l_name=(tolower(p_name[1]));
@@ -176,7 +225,7 @@ awk '
                 n_unit=(n_unit) + 0
               }   
             }
-		  }
+          }
           { if((substr(u1,1,10)) == "SUBROUTINE")
             { split(u2,p_name,"(");
               l_name=(tolower(p_name[1]));
@@ -200,12 +249,32 @@ awk '
         }
         else
         {
-		  { if((substr(u1,1,9)) == "RECURSIVE")
+          { if((substr(u1,1,9)) == "ELEMENTAL")
+            { if((substr(u2,1,10)) == "SUBROUTINE")
+              { n_unit=(n_unit) + 1 }
+            }
+          }
+          { if((substr(u1,1,9)) == "ELEMENTAL")
+            { if((substr(u2,1,8)) == "FUNCTION")
+              { n_unit=(n_unit) + 1 }
+            }
+          }
+          { if((substr(u1,1,4)) == "PURE")
+            { if((substr(u2,1,10)) == "SUBROUTINE")
+              { n_unit=(n_unit) + 1 }
+            }
+          }
+          { if((substr(u1,1,4)) == "PURE")
+            { if((substr(u2,1,8)) == "FUNCTION")
+              { n_unit=(n_unit) + 1 }
+            }
+          }
+          { if((substr(u1,1,9)) == "RECURSIVE")
             { if((substr(u2,1,10)) == "SUBROUTINE")
               { n_unit=(n_unit) + 1 }
             }
           }
-		  { if((substr(u1,1,9)) == "RECURSIVE")
+          { if((substr(u1,1,9)) == "RECURSIVE")
             { if((substr(u2,1,8)) == "FUNCTION")
               { n_unit=(n_unit) + 1 }
             }
diff --git a/src/LIB/FOREFIRE/coupling_forefiren.f90 b/src/LIB/FOREFIRE/coupling_forefiren.f90
index 8d5dde80b6873f4caa1f040cbe0233a4a72d1e72..0791f7f1cca1272e036f8a3d32cfd1ea5bec888d 100644
--- a/src/LIB/FOREFIRE/coupling_forefiren.f90
+++ b/src/LIB/FOREFIRE/coupling_forefiren.f90
@@ -1,8 +1,9 @@
-!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
-!############################## 
+!-----------------------------------------------------------------
+!##############################
 MODULE MODI_COUPLING_FOREFIRE_n
 !############################## 
 
@@ -82,20 +83,20 @@ INTEGER											:: JSV
 	PSFTQ(:, :) = PSFTQ(:, :) + FF_VAPORFLUX(:, :)
 
 	DO JSV = 1, NSV_FF
-		CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) 
+		CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1)
 		PSFSV(:, :, NSV_FFBEG-1+JSV) = PSFSV(:, :, NSV_FFBEG-1+JSV) + FF_SVFLUXES(:, :, JSV)
 	END DO
-	
+
 	IF ( LFFCHEM ) THEN
 		DO JSV = 1, NFFCHEMVAR
-			CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) 
+			CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1)
 			PSFSV(:, :, FF_CHEMINDICES(JSV)) = PSFSV(:, :, FF_CHEMINDICES(JSV)) + FF_CVFLUXES(:, :, JSV)
 		END DO
 	ENDIF
 
 END SUBROUTINE COUPLING_FOREFIRE_n
 
-      	
+
 !##############################################
 SUBROUTINE SEND_GROUND_WIND_n (U, V, KG, IINFO)
 !##############################################
@@ -138,7 +139,7 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
 		FFOUTERWINDV(2,JFF) = V(3,JFF,KG)
 		FFOUTERWINDV(FF_NX-1,JFF) = V(FF_NX-2,JFF,KG)
 	END DO
-	  
+
 	VAL1 = INT(U(2,3,KG)*FFMULT+0.5)
 	VAL2 = INT(U(3,3,KG)*FFMULT+0.5)
 	VAL3 = INT(U(3,2,KG)*FFMULT+0.5)
@@ -176,8 +177,8 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
 	FFOUTERWINDV(FF_NX-1,FF_NY-1) = VAL1*FFMULT*FFMULT*100 + VAL2*FFMULT*10 + VAL3
 
 	NULLIFY(FOREFIREFIELD_ll)
-	CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDU)
-	CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDV)
+	CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDU, 'SEND_GROUND_WIND_n::FFOUTERWINDU' )
+	CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDV, 'SEND_GROUND_WIND_n::FFOUTERWINDV' )
 	CALL UPDATE_HALO_ll(FOREFIREFIELD_ll,IINFO)
 	CALL CLEANLIST_ll(FOREFIREFIELD_ll)
 	CALL MNH_PUT_DOUBLEARRAY(sOutWindU, FF_TIME, FFOUTERWINDU, FF_MATRIXSIZE, 1)
@@ -185,7 +186,7 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
    
 END SUBROUTINE SEND_GROUND_WIND_n
 
-      	
+
 !#####################################
 SUBROUTINE FOREFIRE_RECEIVE_PARAL_n ()
 !#####################################
@@ -208,7 +209,7 @@ IMPLICIT NONE
    
 END SUBROUTINE FOREFIRE_RECEIVE_PARAL_n
 
-      	
+
 !#######################################
 SUBROUTINE FOREFIRE_SEND_PARAL_n (IINFO)
 !#######################################
@@ -238,18 +239,18 @@ TYPE(LIST_ll), POINTER           :: FOREFIREFIELD_ll    ! list of fields to exch
 !* Calling the MNH parallel routines for the forefire-related variables
 !
 	NULLIFY(FOREFIREFIELD_ll)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID)
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSX' )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSY' )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELX' )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELY' )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME, 'FOREFIRE_SEND_PARAL_n::FFNODES_TIME' )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID,   'FOREFIRE_SEND_PARAL_n::FFNODES_ID'   )
 	CALL UPDATE_HALO_ll(FOREFIREFIELD_ll, IINFO)
 	CALL CLEANLIST_ll(FOREFIREFIELD_ll)
    
 END SUBROUTINE FOREFIRE_SEND_PARAL_n
-      	
-      	
+
+
 !#####################################################
 SUBROUTINE FOREFIRE_DUMP_FIELDS_n(U, V, W, MNHSV, TH &
 									, R, PABS, TKE, NX, NY, NZ)
@@ -280,7 +281,7 @@ INTEGER :: JSV
 		FF3DOUT = 1
 		FFNUMOUT = FFNUMOUT + 1
 	END IF
-	
+
 	IF ( FF3DOUTPUTSFLOW .AND. FF3DOUT.EQ.1 ) THEN
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sU, FF_TIME, U, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sV, FF_TIME, V, NX*NY*NZ, NX, NY, NZ, 1)
@@ -290,14 +291,14 @@ INTEGER :: JSV
 				, FF_TIME, MNHSV(:, :, :, NSV_FFBEG-1+JSV), NX*NY*NZ, NX, NY, NZ, 1)
 		END DO
 	END IF
-	
+
 	IF ( FF3DOUTPUTSPHYS .AND. FF3DOUT.EQ.1 ) THEN
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sT, FF_TIME, TH, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sMoist, FF_TIME, R, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sP, FF_TIME, PABS, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sTKE, FF_TIME, TKE, NX*NY*NZ, NX, NY, NZ, 1)
 	END IF
-	
+
 	IF ( LFFCHEM .AND. FF3DOUTPUTSCHEM .AND. FF3DOUT.EQ.1 ) THEN
 		DO JSV = 1, NFFCHEMVAR
 			CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, cast_char_to_c(CNAMES(FF_CHEMINDICES(JSV))) &
@@ -308,7 +309,7 @@ INTEGER :: JSV
 						, FF_TIME, MNHSV(:, :, :, FF_CHEMINDOUT(JSV)), NX*NY*NZ, NX, NY, NZ, 1)
 		END DO
 	END IF
-	
+
 	FF3DOUT = 0
 
 END SUBROUTINE FOREFIRE_DUMP_FIELDS_n
diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index cf3e014068caca76b99fbcba63b96680894a39d6..2c91243c5e593f0286efda9ca9543def70cd5a76 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2016-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2016-2021 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.
@@ -9,14 +9,17 @@
 !  P. Wautelet 12/04/2019: added pointers for C1D, L1D, N1D, X5D and X6D structures in TFIELDDATA
 !  P. Wautelet 12/07/2019: add pointers for T1D structure in TFIELDDATA
 !  P. Wautelet 23/01/2020: split in modd_field.f90 and mode_field.f90
-!  P. Wautelet 27/01/2020: create the tfield_metadata_base abstract datatype
-!  P. Wautelet 14/09/2020: add ndimlist field to tfield_metadata_base
+!  P. Wautelet 27/01/2020: create the tfieldmetadata_base abstract datatype
+!  P. Wautelet 14/09/2020: add ndimlist field to tfieldmetadata_base
 !  P. Wautelet 10/11/2020: new data structures for netCDF dimensions
+!  P. Wautelet 24/09/2021: add Fill_tfielddata and use it as a custom constructor for tfielddata type
 !  P. Wautelet 08/10/2021: add 2 new dimensions: LW_bands (NMNHDIM_NLWB) and SW_bands (NMNHDIM_NSWB)
+!  P. Wautelet 14/10/2021: dynamically allocate tfieldlist (+ reallocate if necessary)
+!  P. Wautelet 04/11/2021: add TFIELDMETADATA type
 !-----------------------------------------------------------------
 module modd_field
 
-use modd_parameters, only: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX
+use modd_parameters, only: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX
 use modd_type_date,  only: date_time
 #ifdef MNH_IOCDF4
 use NETCDF,          only: NF90_FILL_INT, NF90_FILL_REAL
@@ -25,9 +28,11 @@ use NETCDF,          only: NF90_FILL_INT, NF90_FILL_REAL
 implicit none
 
 integer, parameter :: NMNHMAXDIMS = 6 ! Cannot be less than 6
-INTEGER,PARAMETER :: MAXFIELDS = 250
 INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5
 !
+INTEGER, PARAMETER :: NMAXFIELDINIT = 200 !Initial maximum number of fields in tfieldlist
+INTEGER, PARAMETER :: NMAXFIELDSTEP = 50  !Number of fields to add each time tfieldlist is too small
+
 integer, parameter :: NMNHDIM_UNKNOWN             = -2
 
 !For efficient use of memory, it is better that all values for real dimensions be contiguous
@@ -114,6 +119,8 @@ integer, dimension(0:8,3), parameter :: NMNHDIM_ARAKAWA = reshape( [ &
   NMNHDIM_NI_U,    NMNHDIM_NJ_V,    NMNHDIM_LEVEL_W] & ! fw point (=uvw point)
   , shape = [ 9, 3 ], order = [ 2, 1 ] )
 
+INTEGER, SAVE :: NMAXFIELDS !Maximum number of fields in tfieldlist (value is automatically increased if too small)
+
 TYPE TFIELDPTR_C0D
   CHARACTER(LEN=:),     POINTER :: DATA => NULL()
 END TYPE TFIELDPTR_C0D
@@ -182,12 +189,12 @@ TYPE TFIELDPTR_T1D
   TYPE(DATE_TIME), DIMENSION(:), POINTER :: DATA => NULL()
 END TYPE TFIELDPTR_T1D
 !
-type :: tfield_metadata_base
-  CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME  = '' !Name of the field (for MesoNH, non CF convention)
-  CHARACTER(LEN=NSTDNAMELGTMAX) :: CSTDNAME  = '' !Standard name (CF convention)
-  CHARACTER(LEN=32)  :: CLONGNAME = '' !Long name (CF convention)
-  CHARACTER(LEN=40)  :: CUNITS    = '' !Canonical units (CF convention)
-  CHARACTER(LEN=100) :: CCOMMENT  = '' !Comment (for MesoNH, non CF convention)
+type :: tfieldmetadata_base
+  CHARACTER(LEN=NMNHNAMELGTMAX)  :: CMNHNAME  = '' !Name of the field (for MesoNH, non CF convention)
+  CHARACTER(LEN=NSTDNAMELGTMAX)  :: CSTDNAME  = '' !Standard name (CF convention)
+  CHARACTER(LEN=NLONGNAMELGTMAX) :: CLONGNAME = '' !Long name (CF convention)
+  CHARACTER(LEN=NUNITLGTMAX)     :: CUNITS    = '' !Canonical units (CF convention)
+  CHARACTER(LEN=NCOMMENTLGTMAX)  :: CCOMMENT  = '' !Comment (for MesoNH, non CF convention)
   INTEGER            :: NGRID     = NGRIDUNKNOWN !Localization on the model grid
   INTEGER            :: NTYPE     = TYPEUNDEF !Datatype
   INTEGER            :: NDIMS     = 0  !Number of dimensions
@@ -207,13 +214,17 @@ type :: tfield_metadata_base
   INTEGER            :: NVALIDMAX  =  2147483647 !Maximum valid value for integer fields
   REAL               :: XVALIDMIN  = -1.E36 !Minimum valid value for real fields
   REAL               :: XVALIDMAX  =  1.E36 !Maximum valid value for real fields
-end type tfield_metadata_base
+end type tfieldmetadata_base
 
-!Structure describing the characteristics of a field
-TYPE, extends( tfield_metadata_base ) :: TFIELDDATA
+TYPE, extends( tfieldmetadata_base ) :: TFIELDMETADATA
   CHARACTER(LEN=2)   :: CDIR      = '' !Type of the data field (XX,XY,--...)
   CHARACTER(LEN=4)   :: CLBTYPE   = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV)
   LOGICAL            :: LTIMEDEP  = .FALSE. !Is the field time-dependent?
+END TYPE TFIELDMETADATA
+
+!Structure describing the characteristics of a field
+TYPE, EXTENDS( TFIELDMETADATA ) :: TFIELDDATA
+  INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated (default value must be negative)
   !
   TYPE(TFIELDPTR_C0D),DIMENSION(:),ALLOCATABLE :: TFIELD_C0D !Pointer to the character string fields (one per nested mesh)
   TYPE(TFIELDPTR_C1D),DIMENSION(:),ALLOCATABLE :: TFIELD_C1D !Pointer to the character string 1D fields (one per nested mesh)
@@ -238,8 +249,358 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA
   TYPE(TFIELDPTR_T1D),DIMENSION(:),ALLOCATABLE :: TFIELD_T1D !Pointer to the date/time 1D fields (one per nested mesh)
 END TYPE TFIELDDATA
 !
-integer, save :: NMODEL_ALLOCATED
+integer, save :: NFIELDS_USED = 0
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
-TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST
+TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST
+
+interface TFIELDMETADATA
+  module procedure :: Fill_tfieldmetadata
+  module procedure :: Fill_tfieldmetadata_from_tfielddata
+end interface TFIELDMETADATA
+
+interface TFIELDDATA
+  module procedure :: Fill_tfielddata
+end interface TFIELDDATA
+
+contains
+
+type(tfieldmetadata) function Fill_tfieldmetadata( cmnhname, cstdname, clongname, cunits, ccomment,                    &
+                                               ngrid, ntype, ndims, ndimlist,                                      &
+                                               nfillvalue, xfillvalue, nvalidmin, nvalidmax, xvalidmin, xvalidmax, &
+                                               cdir, clbtype, ltimedep ) result(tpfield)
+
+  use mode_msg
+
+  character(len=*),      optional, intent(in) :: cmnhname
+  character(len=*),      optional, intent(in) :: cstdname
+  character(len=*),      optional, intent(in) :: clongname
+  character(len=*),      optional, intent(in) :: cunits
+  character(len=*),      optional, intent(in) :: ccomment
+  integer,               optional, intent(in) :: ngrid
+  integer,                         intent(in) :: ntype
+  integer,               optional, intent(in) :: ndims
+  integer, dimension(:), optional, intent(in) :: ndimlist
+  integer,               optional, intent(in) :: nfillvalue
+  real,                  optional, intent(in) :: xfillvalue
+  integer,               optional, intent(in) :: nvalidmin
+  integer,               optional, intent(in) :: nvalidmax
+  real,                  optional, intent(in) :: xvalidmin
+  real,                  optional, intent(in) :: xvalidmax
+
+  character(len=*),      optional, intent(in) :: cdir
+  character(len=*),      optional, intent(in) :: clbtype
+  logical,               optional, intent(in) :: ltimedep
+
+  character(len=:), allocatable :: ymnhname
+
+  ! cmnhname
+  if ( Present( cmnhname ) ) then
+    tpfield%cmnhname = cmnhname
+    if ( Len_trim(cmnhname) > NMNHNAMELGTMAX )                                                               &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                               &
+                      'cmnhname was truncated to ' // Trim( tpfield%cmnhname ) // ' from ' // Trim( cmnhname ) )
+    ymnhname = Trim( cmnhname )
+  else
+    ymnhname = 'unknown mnhname'
+  end if
+
+  ! cstdname
+  if ( Present( cstdname ) ) then
+    tpfield%cstdname = cstdname
+    if ( Len_trim(cstdname) > NSTDNAMELGTMAX )                                                                 &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                                 &
+                      'cstdname was truncated to ' // Trim( tpfield%cstdname ) // ' from ' // Trim( cstdname ) &
+                      // ' for variable ' // Trim( ymnhname ) )
+  end if
+
+  ! clongname
+  if ( Present( clongname ) ) then
+    tpfield%clongname = clongname
+    if ( Len_trim(clongname) > NLONGNAMELGTMAX )                                                                  &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                                    &
+                      'clongname was truncated to ' // Trim( tpfield%clongname ) // ' from ' // Trim( clongname ) &
+                      // ' for variable ' // Trim( ymnhname ) )
+  end if
+
+  ! cunits
+  if ( Present( cunits ) ) then
+    tpfield%cunits = cunits
+    if ( Len_trim(cunits) > NUNITLGTMAX )                                                                &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                           &
+                      'cunits was truncated to ' // Trim( tpfield%cunits ) // ' from ' // Trim( cunits ) &
+                      // ' for variable ' // Trim( ymnhname ) )
+  end if
+
+  ! ccomment
+  if ( Present( ccomment ) ) then
+    tpfield%ccomment = ccomment
+    if ( Len_trim(ccomment) > NCOMMENTLGTMAX )                                                                 &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                                 &
+                      'ccomment was truncated to ' // Trim( tpfield%ccomment ) // ' from ' // Trim( ccomment ) )
+  end if
+
+  ! ngrid
+  if ( Present( ngrid ) ) then
+    if ( ngrid /= NGRIDUNKNOWN .and. ngrid < 0 .and. ngrid > 8 ) then
+      call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
+                      'invalid value of ngrid for variable ' // Trim( ymnhname ) )
+    else
+      tpfield%ngrid = ngrid
+    end if
+  end if
+
+  ! ntype
+  if ( All( ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) )    &
+    call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
+                    'invalid value of ntype for variable ' // Trim( ymnhname ) )
+  tpfield%ntype = ntype
+
+  ! ndims
+  if ( Present( ndims ) ) then
+    select case ( ntype )
+      case ( TYPECHAR )
+        if ( ndims < 0 .or. ndims > 1 )                                                                 &
+          call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
+                          // Trim( ymnhname ) // ' of type TYPECHAR' )
+      case ( TYPELOG )
+        if ( ndims < 0 .or. ndims > 1 )                                                                 &
+          call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
+                          // Trim( ymnhname ) // ' of type TYPELOG' )
+      case ( TYPEINT )
+        if ( ndims < 0 .or. ndims > 3 )                                                                 &
+          call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
+                          // Trim( ymnhname ) // ' of type TYPEINT' )
+      case ( TYPEREAL )
+        if ( ndims < 0 .or. ndims > 6 )                                                                 &
+          call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
+                          // Trim( ymnhname ) // ' of type TYPEREAL' )
+      case ( TYPEDATE )
+        if ( ndims < 0 .or. ndims > 1 )                                                                 &
+          call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
+                          // Trim( ymnhname ) // ' of type TYPEDATE' )
+      case default
+        call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
+                        'invalid value of ntype for variable ' // Trim( ymnhname ) )
+
+    end select
+    tpfield%ndims = ndims
+  end if
+
+  ! ndimlist
+  if ( Present( ndimlist ) ) then
+    if ( Size( ndimlist ) /= ndims ) &
+      call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'ndimlist size different of ndims for variable ' // Trim( ymnhname ) )
+
+    tpfield%ndimlist(1:ndims)  = ndimlist(:)
+    tpfield%ndimlist(ndims+1:) = NMNHDIM_UNUSED
+  else
+    !If ndimlist is not provided, it is possible to fill it if some information is available
+    if ( Present( cdir ) ) then
+      if ( cdir == 'XY' ) then
+        if ( ndims == 2 ) then
+          tpfield%ndimlist(1:2) = NMNHDIM_ARAKAWA(ngrid,1:2)
+        else if ( ndims == 3 ) then
+          tpfield%ndimlist(1:3) = NMNHDIM_ARAKAWA(ngrid,1:3)
+        else
+          call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) )
+        end if
+      else
+        call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) )
+      end if
+    else
+      call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) )
+    end if
+  end if
+  if ( Present( ltimedep ) ) then
+    if ( ltimedep ) then
+      if ( ndims == NMNHMAXDIMS )                                                                        &
+        call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                                           &
+                        'ltimedep=T not possible if ndims=NMNHMAXDIMS for variable ' // Trim( ymnhname ) )
+      !Set this dimension only if ndimlist already filled up or ndims = 0
+      if ( ndims == 0 ) then
+        tpfield%ndimlist( ndims + 1 ) = NMNHDIM_TIME
+      else if ( tpfield%ndimlist(ndims) /= NMNHDIM_UNKNOWN ) then
+        tpfield%ndimlist( ndims + 1 ) = NMNHDIM_TIME
+      end if
+    end if
+  end if
+
+  ! nfillvalue
+  if ( Present( nfillvalue ) ) then
+    if ( ntype /= TYPEINT )                                                                   &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                &
+                      'nfillvalue provided for the non-integer variable ' // Trim( ymnhname ) )
+    tpfield%nfillvalue = nfillvalue
+  end if
+
+  ! xfillvalue
+  if ( Present( xfillvalue ) ) then
+    if ( ntype /= TYPEREAL )                                                               &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                             &
+                      'xfillvalue provided for the non-real variable ' // Trim( ymnhname ) )
+    tpfield%xfillvalue = xfillvalue
+  end if
+
+  ! nvalidmin
+  if ( Present( nvalidmin ) ) then
+    if ( ntype /= TYPEINT )                                                                  &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                               &
+                      'nvalidmin provided for the non-integer variable ' // Trim( ymnhname ) )
+    tpfield%nvalidmin = nvalidmin
+  end if
+
+  ! nvalidmax
+  if ( Present( nvalidmax ) ) then
+    if ( ntype /= TYPEINT )                                                                  &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                               &
+                      'nvalidmax provided for the non-integer variable ' // Trim( ymnhname ) )
+    if ( Present( nvalidmin ) ) then
+      if ( nvalidmax < nvalidmin ) &
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( ymnhname ) )
+    end if
+    tpfield%nvalidmax = nvalidmax
+  end if
+
+  ! xvalidmin
+  if ( Present( xvalidmin ) ) then
+    if ( ntype /= TYPEREAL )                                                              &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                            &
+                      'xvalidmin provided for the non-real variable ' // Trim( ymnhname ) )
+    tpfield%xvalidmin = xvalidmin
+  end if
+
+  ! xvalidmax
+  if ( Present( xvalidmax ) ) then
+    if ( ntype /= TYPEREAL )                                                              &
+      call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                            &
+                      'xvalidmax provided for the non-real variable ' // Trim( ymnhname ) )
+    if ( Present( xvalidmin ) ) then
+      if ( xvalidmax < xvalidmin ) &
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( ymnhname ) )
+    end if
+    tpfield%xvalidmax = xvalidmax
+  end if
+
+  ! cdir
+  if ( Present( cdir ) ) then
+    if ( Any( cdir == [ '  ', '--', 'XX', 'XY', 'YY', 'ZZ' ] ) ) then
+      tpfield%cdir = cdir
+    else
+      call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                                             &
+                      'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( ymnhname ) )
+    end if
+  end if
+
+  ! clbtype
+  if ( Present( clbtype ) ) then
+    if ( Any( clbtype == [ 'NONE', 'LBX ', 'LBXU', 'LBY ', 'LBYV' ] ) ) then
+      tpfield%clbtype = clbtype
+    else
+      call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                                                   &
+                      'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( ymnhname ) )
+    end if
+  end if
+
+  ! ltimedep
+  if ( Present( ltimedep ) ) tpfield%ltimedep = ltimedep
+end function Fill_tfieldmetadata
+
+
+type(tfieldmetadata) function Fill_tfieldmetadata_from_tfielddata( tpfieldin ) result(tpfield)
+  type(tfielddata), intent(in) :: tpfieldin
+
+  tpfield%CMNHNAME =   tpfieldin%CMNHNAME
+  tpfield%CSTDNAME =   tpfieldin%CSTDNAME
+  tpfield%CLONGNAME =  tpfieldin%CLONGNAME
+  tpfield%CUNITS =     tpfieldin%CUNITS
+  tpfield%CCOMMENT =   tpfieldin%CCOMMENT
+  tpfield%NGRID =      tpfieldin%NGRID
+  tpfield%NTYPE =      tpfieldin%NTYPE
+  tpfield%NDIMS =      tpfieldin%NDIMS
+  tpfield%NDIMLIST =   tpfieldin%NDIMLIST
+  tpfield%NFILLVALUE = tpfieldin%NFILLVALUE
+  tpfield%XFILLVALUE = tpfieldin%XFILLVALUE
+  tpfield%NVALIDMIN =  tpfieldin%NVALIDMIN
+  tpfield%NVALIDMAX =  tpfieldin%NVALIDMAX
+  tpfield%XVALIDMIN =  tpfieldin%XVALIDMIN
+  tpfield%XVALIDMAX =  tpfieldin%XVALIDMAX
+  tpfield%CDIR =       tpfieldin%CDIR
+  tpfield%CLBTYPE =    tpfieldin%CLBTYPE
+  tpfield%LTIMEDEP =   tpfieldin%LTIMEDEP
+
+end function Fill_tfieldmetadata_from_tfielddata
+
+
+type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits, ccomment,                    &
+                                           ngrid, ntype, ndims, ndimlist,                                      &
+                                           nfillvalue, xfillvalue, nvalidmin, nvalidmax, xvalidmin, xvalidmax, &
+                                           cdir, clbtype, ltimedep ) result(tpfield)
+
+  use mode_msg
+
+  character(len=*),      optional, intent(in) :: cmnhname
+  character(len=*),      optional, intent(in) :: cstdname
+  character(len=*),      optional, intent(in) :: clongname
+  character(len=*),      optional, intent(in) :: cunits
+  character(len=*),      optional, intent(in) :: ccomment
+  integer,               optional, intent(in) :: ngrid
+  integer,                         intent(in) :: ntype
+  integer,               optional, intent(in) :: ndims
+  integer, dimension(:), optional, intent(in) :: ndimlist
+  integer,               optional, intent(in) :: nfillvalue
+  real,                  optional, intent(in) :: xfillvalue
+  integer,               optional, intent(in) :: nvalidmin
+  integer,               optional, intent(in) :: nvalidmax
+  real,                  optional, intent(in) :: xvalidmin
+  real,                  optional, intent(in) :: xvalidmax
+
+  character(len=*),      optional, intent(in) :: cdir
+  character(len=*),      optional, intent(in) :: clbtype
+  logical,               optional, intent(in) :: ltimedep
+
+
+  !Use the tfieldmetadata custom constructor and modify nmodelmax
+  !The data structures tfield_xyd are not set (null)
+  tpfield = tfielddata ( tfieldmetadata = tfieldmetadata( &
+                                 cmnhname   = cmnhname,   &
+                                 cstdname   = cstdname,   &
+                                 clongname  = clongname,  &
+                                 cunits     = cunits,     &
+                                 ccomment   = ccomment,   &
+                                 ngrid      = ngrid,      &
+                                 ntype      = ntype,      &
+                                 ndims      = ndims,      &
+                                 ndimlist   = ndimlist,   &
+                                 nfillvalue = nfillvalue, &
+                                 xfillvalue = xfillvalue, &
+                                 nvalidmin  = nvalidmin,  &
+                                 nvalidmax  = nvalidmax,  &
+                                 xvalidmin  = xvalidmin,  &
+                                 xvalidmax  = xvalidmax,  &
+                                 cdir       = cdir,       &
+                                 clbtype    = clbtype,    &
+                                 ltimedep   = ltimedep ) ,&
+! Set nmodelmax to 0 instead of -1 by default.
+! This value can therefore be used to determine if the field was initialized by calling this constructor.
+                         nmodelmax = 0,                   &
+                         tfield_c0d = null(),             &
+                         tfield_c1d = null(),             &
+                         tfield_l0d = null(),             &
+                         tfield_l1d = null(),             &
+                         tfield_n0d = null(),             &
+                         tfield_n1d = null(),             &
+                         tfield_n2d = null(),             &
+                         tfield_n3d = null(),             &
+                         tfield_x0d = null(),             &
+                         tfield_x1d = null(),             &
+                         tfield_x2d = null(),             &
+                         tfield_x3d = null(),             &
+                         tfield_x4d = null(),             &
+                         tfield_x5d = null(),             &
+                         tfield_x6d = null(),             &
+                         tfield_t0d = null(),             &
+                         tfield_t1d = null()              )
+
+end function Fill_tfielddata
 
 end module modd_field
diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 3d7da524d8fa664a82373c9459c3e2cdf358edca..d6c458c9125e34bc4578d4575d7df55e1f9b2c53 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -15,6 +15,8 @@
 !  P. Wautelet 19/06/2019: add Fieldlist_nmodel_resize subroutine + provide KMODEL to INI_FIELD_LIST when known
 !  P. Wautelet 23/01/2020: split in modd_field.f90 and mode_field.f90
 !  JL Redelsperger 03/2021: add variables for Ocean LES and auto-coupled version
+!  P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures + remove Fieldlist_nmodel_resize
+!  P. Wautelet 14/10/2021: dynamically allocate tfieldlist (+ reallocate if necessary)
 !  A. Costes      12/2021: add Blaze fire model variables
 !-----------------------------------------------------------------
 module mode_field
@@ -35,28 +37,39 @@ public :: Ini_field_list
 public :: Find_field_id_from_mnhname
 public :: Alloc_field_scalars
 public :: Fieldlist_goto_model
-public :: Fieldlist_nmodel_resize
 public :: Ini_field_scalars
 
+interface Goto_model_1field
+  module procedure :: Goto_model_1field_c0d
+  module procedure :: Goto_model_1field_c1d
+  module procedure :: Goto_model_1field_l0d
+  module procedure :: Goto_model_1field_l1d
+  module procedure :: Goto_model_1field_n0d
+  module procedure :: Goto_model_1field_n1d
+  module procedure :: Goto_model_1field_n2d
+  module procedure :: Goto_model_1field_n3d
+  module procedure :: Goto_model_1field_t0d
+  module procedure :: Goto_model_1field_t1d
+  module procedure :: Goto_model_1field_x0d
+  module procedure :: Goto_model_1field_x1d
+  module procedure :: Goto_model_1field_x2d
+  module procedure :: Goto_model_1field_x3d
+  module procedure :: Goto_model_1field_x4d
+  module procedure :: Goto_model_1field_x5d
+  module procedure :: Goto_model_1field_x6d
+end interface
+
+
 contains
 
-SUBROUTINE INI_FIELD_LIST(KMODEL)
+SUBROUTINE INI_FIELD_LIST()
 ! Modif
 !  J.Escobar 25/04/2018: missing def of FRC
 !------------------------------------------------
-USE MODD_CONF, ONLY: NMODEL
-!
-INTEGER, INTENT(IN), OPTIONAL :: KMODEL
-!
-INTEGER :: IDX, IMODEL
-CHARACTER(LEN=42) :: YMSG
+
+CHARACTER(LEN=64) :: YMSG
 CHARACTER(LEN=3)  :: YFIREDIMX, YFIREDIMY
-!
-!F90/95: TFIELDLIST(1) = TFIELDDATA('UT','x_wind','m s-1','XY','X_Y_Z_U component of wind',2)
-!F2003:
-!TFIELDLIST(1) = TFIELDDATA(CMNHNAME='UT',CSTDNAME='x_wind',CUNITS='m s-1',CDIR='XY',&
-!                           CCOMMENT='X_Y_Z_U component of wind',NGRID=2)
-!
+
 CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST','called')
 IF (LFIELDLIST_ISINIT) THEN
   CALL PRINT_MSG(NVERB_ERROR,'GEN','INI_FIELD_LIST','already called')
@@ -64,3741 +77,3359 @@ IF (LFIELDLIST_ISINIT) THEN
 END IF
 
 LFIELDLIST_ISINIT = .TRUE.
-!
-IF (PRESENT(KMODEL)) THEN
-  IMODEL = KMODEL
-ELSE
-  !NMODEL is not necessary known here => allocating for max allowed number of models
-  !WARNING: if known, the value could change after this subroutine (ie for a restart
-  !         with more models) because READ_DESFM_n is called before READ_EXSEG_n
-  !Structures can be resized with a call to Fieldlist_nmodel_resize
-  IMODEL = JPMODELMAX
-END IF
-!
-IF (IMODEL==0) CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST','allocating fields for zero models not allowed')
-if ( imodel > JPMODELMAX ) &
-  call Print_msg( NVERB_FATAL, 'GEN', 'INI_FIELD_LIST', 'allocating fields for more than JPMODELMAX models not allowed' )
-!
-WRITE(YMSG,'("allocating fields for up to ",I4," model(s)")') IMODEL
-CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST',YMSG)
-!
-NMODEL_ALLOCATED = IMODEL
-!
-IDX = 1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MNHVERSION'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH version'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MASDEV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH version (without bugfix)'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BUGFIX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH bugfix number'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BIBUSER'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: user binary library'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VERSION'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SURFEX version (without BUG)'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BUG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SURFEX bugfix number'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PROGRAM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH family: used program'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FILETYPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'type of this file'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MY_NAME'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'filename (no extension)'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DAD_NAME'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'filename of the dad file'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DXRATIO'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DXRATIO'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Resolution ratio between this mesh and its father in x-direction'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DYRATIO'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DYRATIO'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Resolution ratio between this mesh and its father in y-direction'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'XSIZE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'XSIZE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of model 1 grid points in x-direction in the model 2 physical domain'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'YSIZE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'YSIZE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of model 1 grid points in y-direction in the model 2 physical domain'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'XOR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'XOR'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Horizontal position of this mesh relative to its father'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'YOR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'YOR'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Vertical position of this mesh relative to its father'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'STORAGE_TYPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'STORAGE_TYPE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Storage type for the information written in the FM files'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'IMAX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'IMAX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'x-dimension of the physical domain'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'JMAX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'JMAX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'y-dimension of the physical domain'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'KMAX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'KMAX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'z-dimension of the physical domain'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'JPHEXT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'JPHEXT'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of horizontal external points on each side'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RPK'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RPK'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Projection parameter for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LONORI'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LONORI'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Longitude of the point of coordinates x=0, y=0 for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LATORI'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LATORI'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Latitude of the point of coordinates x=0, y=0 for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LONOR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LONOR'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Longitude of 1st mass point'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LATOR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LATOR'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Latitude of 1st mass point'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'THINSHELL'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'THINSHELL'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for thinshell approximation'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LAT0'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LAT0'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Reference latitude for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LON0'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LON0'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Reference longitude for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BETA'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'BETA'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Rotation angle for conformal projection'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'XHAT'
-!TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = 'projection_x_coordinate'
-TFIELDLIST(IDX)%CLONGNAME  = 'XHAT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XX'
-TFIELDLIST(IDX)%CCOMMENT   = 'Position x in the conformal or cartesian plane'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'YHAT'
-!TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = 'projection_y_coordinate'
-TFIELDLIST(IDX)%CLONGNAME  = 'YHAT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'YY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Position y in the conformal or cartesian plane'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZHAT'
+
+Allocate( tfieldlist(NMAXFIELDINIT) )
+NMAXFIELDS = NMAXFIELDINIT
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'MNHVERSION',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'MesoNH version', &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = '',               &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(                  &
+  CMNHNAME   = 'MASDEV',                          &
+  CSTDNAME   = '',                                &
+  CLONGNAME  = 'MesoNH version (without bugfix)', &
+  CUNITS     = '',                                &
+  CDIR       = '--',                              &
+  CCOMMENT   = '',                                &
+  NGRID      = 0,                                 &
+  NTYPE      = TYPEINT,                           &
+  NDIMS      = 0,                                 &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(       &
+  CMNHNAME   = 'BUGFIX',               &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = 'MesoNH bugfix number', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = '',                     &
+  NGRID      = 0,                      &
+  NTYPE      = TYPEINT,                &
+  NDIMS      = 0,                      &
+  LTIMEDEP   = .FALSE.                 ) )
+
+call Add_field2list( TFIELDDATA(              &
+  CMNHNAME   = 'BIBUSER',                     &
+  CSTDNAME   = '',                            &
+  CLONGNAME  = 'MesoNH: user binary library', &
+  CUNITS     = '',                            &
+  CDIR       = '--',                          &
+  CCOMMENT   = '',                            &
+  NGRID      = 0,                             &
+  NTYPE      = TYPECHAR,                      &
+  NDIMS      = 0,                             &
+  LTIMEDEP   = .FALSE.                        ) )
+
+call Add_field2list( TFIELDDATA(               &
+  CMNHNAME   = 'VERSION',                      &
+  CSTDNAME   = '',                             &
+  CLONGNAME  = 'SURFEX version (without BUG)', &
+  CUNITS     = '',                             &
+  CDIR       = '--',                           &
+  CCOMMENT   = '',                             &
+  NGRID      = 0,                              &
+  NTYPE      = TYPEINT,                        &
+  NDIMS      = 0,                              &
+  LTIMEDEP   = .FALSE.                         ) )
+
+call Add_field2list( TFIELDDATA(       &
+  CMNHNAME   = 'BUG',                  &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = 'SURFEX bugfix number', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = '',                     &
+  NGRID      = 0,                      &
+  NTYPE      = TYPEINT,                &
+  NDIMS      = 0,                      &
+  LTIMEDEP   = .FALSE.                 ) )
+
+call Add_field2list( TFIELDDATA(              &
+  CMNHNAME   = 'PROGRAM',                     &
+  CSTDNAME   = '',                            &
+  CLONGNAME  = 'MesoNH family: used program', &
+  CUNITS     = '',                            &
+  CDIR       = '--',                          &
+  CCOMMENT   = '',                            &
+  NGRID      = 0,                             &
+  NTYPE      = TYPECHAR,                      &
+  NDIMS      = 0,                             &
+  LTIMEDEP   = .FALSE.                        ) )
+
+call Add_field2list( TFIELDDATA(    &
+  CMNHNAME   = 'FILETYPE',          &
+  CSTDNAME   = '',                  &
+  CLONGNAME  = 'type of this file', &
+  CUNITS     = '',                  &
+  CDIR       = '--',                &
+  CCOMMENT   = '',                  &
+  NGRID      = 0,                   &
+  NTYPE      = TYPECHAR,            &
+  NDIMS      = 0,                   &
+  LTIMEDEP   = .FALSE.              ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'MY_NAME',                 &
+  CSTDNAME   = '',                        &
+  CLONGNAME  = 'filename (no extension)', &
+  CUNITS     = '',                        &
+  CDIR       = '--',                      &
+  CCOMMENT   = '',                        &
+  NGRID      = 0,                         &
+  NTYPE      = TYPECHAR,                  &
+  NDIMS      = 0,                         &
+  LTIMEDEP   = .FALSE.                    ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'DAD_NAME',                 &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = 'filename of the dad file', &
+  CUNITS     = '',                         &
+  CDIR       = '--',                       &
+  CCOMMENT   = '',                         &
+  NGRID      = 0,                          &
+  NTYPE      = TYPECHAR,                   &
+  NDIMS      = 0,                          &
+  LTIMEDEP   = .FALSE.                     ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DXRATIO',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DXRATIO',        &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Resolution ratio between this mesh and its father in x-direction', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DYRATIO',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DYRATIO',        &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Resolution ratio between this mesh and its father in y-direction', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XSIZE',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'XSIZE',          &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of model 1 grid points in x-direction in the model 2 physical domain', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YSIZE',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'YSIZE',          &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of model 1 grid points in y-direction in the model 2 physical domain', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XOR',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'XOR',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Horizontal position of this mesh relative to its father', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YOR',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'YOR',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Vertical position of this mesh relative to its father', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'STORAGE_TYPE',   &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'STORAGE_TYPE',   &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Storage type for the information written in the FM files', &
+  NGRID      = 0,                &
+  NTYPE      = TYPECHAR,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'IMAX',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'IMAX',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'x-dimension of the physical domain', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'JMAX',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'JMAX',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'y-dimension of the physical domain', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'KMAX',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'KMAX',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'z-dimension of the physical domain', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'JPHEXT',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'JPHEXT',         &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of horizontal external points on each side', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RPK',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RPK',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Projection parameter for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LONORI',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LONORI',         &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Longitude of the point of coordinates x=0, y=0 for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LATORI',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LATORI',         &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Latitude of the point of coordinates x=0, y=0 for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LONOR',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LONOR',          &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Longitude of 1st mass point', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LATOR',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LATOR',          &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Latitude of 1st mass point', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'THINSHELL',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'THINSHELL',      &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for thinshell approximation', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LAT0',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LAT0',           &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Reference latitude for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LON0',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LON0',           &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Reference longitude for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'BETA',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'BETA',           &
+  CUNITS     = 'degree',         &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Rotation angle for conformal projection', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHAT',           &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHAT',           &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHAT',           &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHAT',           &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHATM',          &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHATM',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass points', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHATM',          &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHATM',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass points', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ZHAT',           &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ZHAT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'ZZ'
-TFIELDLIST(IDX)%CCOMMENT   = 'Height level without orography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZTOP'
-TFIELDLIST(IDX)%CSTDNAME   = 'altitude_at_top_of_atmosphere_model'
-TFIELDLIST(IDX)%CLONGNAME  = 'ZTOP'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Height of top level'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DXHAT'
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ZHAT',           &
+  CUNITS     = 'm',              &
+  CDIR       = 'ZZ',             &
+  CCOMMENT   = 'Height level without orography', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ZHATM',          &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DXHAT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XX'
-TFIELDLIST(IDX)%CCOMMENT   = 'Horizontal stretching in x'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DYHAT'
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ZHATM',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'ZZ',             &
+  CCOMMENT   = 'Height level without orography at mass point', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HAT_BOUND', &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HAT_BOUND', &
+  CUNITS     = 'm',              &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Boundaries of domain in the conformal or cartesian plane at u and v points', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(  &
+  CMNHNAME   = 'HATM_BOUND', &
+  CSTDNAME   = '',                &
+  CLONGNAME  = 'HATM_BOUND', &
+  CUNITS     = 'm',               &
+  CDIR       = '--',              &
+  CCOMMENT   = 'Boundaries of domain in the conformal or cartesian plane at mass points', &
+  NGRID      = 0,                 &
+  NTYPE      = TYPEREAL,          &
+  NDIMS      = 1,                 &
+  LTIMEDEP   = .FALSE.            ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'ZTOP',                &
+  CSTDNAME   = 'altitude_at_top_of_atmosphere_model', &
+  CLONGNAME  = 'ZTOP',                &
+  CUNITS     = 'm',                   &
+  CDIR       = '--',                  &
+  CCOMMENT   = 'Height of top level', &
+  NGRID      = 4,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 0,                     &
+  LTIMEDEP   = .FALSE.                ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DXHAT',          &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DYHAT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'YY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Horizontal stretching in y'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ALT'
-TFIELDLIST(IDX)%CSTDNAME   = 'altitude'
-TFIELDLIST(IDX)%CLONGNAME  = 'ALT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ALTitude'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIRCOSXW'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIRCOSXW'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X director cosinus of the normal to the ground surface'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIRCOSYW'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIRCOSYW'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Y director cosinus of the normal to the ground surface'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIRCOSZW'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIRCOSZW'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Z director cosinus of the normal to the ground surface'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'COSSLOPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'COSSLOPE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'cosinus of the angle between i and the slope vector'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SINSLOPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SINSLOPE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'sinus of the angle between i and the slope vector'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MAP'
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DXHAT',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Horizontal stretching in x', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DYHAT',          &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MAP'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Map factor'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'latitude'
-TFIELDLIST(IDX)%CSTDNAME   = 'latitude'
-TFIELDLIST(IDX)%CLONGNAME  = 'latitude'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_north'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_latitude at mass point'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'longitude'
-TFIELDLIST(IDX)%CSTDNAME   = 'longitude'
-TFIELDLIST(IDX)%CLONGNAME  = 'longitude'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_east'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_longitude at mass point'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'latitude_u'
-TFIELDLIST(IDX)%CSTDNAME   = 'latitude_at_u_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'latitude at u location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_north'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_latitude at u point'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'longitude_u'
-TFIELDLIST(IDX)%CSTDNAME   = 'longitude_at_u_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'longitude at u location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_east'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_longitude at u point'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'latitude_v'
-TFIELDLIST(IDX)%CSTDNAME   = 'latitude_at_v_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'latitude at v location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_north'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_latitude at v point'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'longitude_v'
-TFIELDLIST(IDX)%CSTDNAME   = 'longitude_at_v_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'longitude at v location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_east'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_longitude at v point'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'latitude_f'
-TFIELDLIST(IDX)%CSTDNAME   = 'latitude_at_f_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'latitude at f location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_north'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_latitude at f point'
-TFIELDLIST(IDX)%NGRID      = 5
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'longitude_f'
-TFIELDLIST(IDX)%CSTDNAME   = 'longitude_at_f_location'
-TFIELDLIST(IDX)%CLONGNAME  = 'longitude at f location'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_east'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_longitude at f point'
-TFIELDLIST(IDX)%NGRID      = 5
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LAT'
-! TFIELDLIST(IDX)%CSTDNAME   = 'latitude'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LAT'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_north'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_latitude'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LON'
-! TFIELDLIST(IDX)%CSTDNAME   = 'longitude'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LON'
-TFIELDLIST(IDX)%CUNITS     = 'degrees_east'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_longitude'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZS'
-TFIELDLIST(IDX)%CSTDNAME   = 'surface_altitude'
-TFIELDLIST(IDX)%CLONGNAME  = 'ZS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'orography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZWS'
-TFIELDLIST(IDX)%CSTDNAME   = 'sea_surface_wave_significant_height'
-TFIELDLIST(IDX)%CLONGNAME  = 'ZWS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'sea wave height'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZSMT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ZSMT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'smooth orography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SLEVE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SLEVE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for SLEVE coordinate'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LEN1'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LEN1'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Decay scale for smooth topography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LEN2'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LEN2'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Decay scale for small-scale topography deviation'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTMOD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTMOD'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of model beginning'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTCUR'
-TFIELDLIST(IDX)%CSTDNAME   = 'time'
-TFIELDLIST(IDX)%CLONGNAME  = 'DTCUR'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Current time and date'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTRAD_FULL'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTRAD_FULL'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of last full radiation call'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTRAD_CLLY'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTRAD_CLLY'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of last radiation call for only cloudy verticals'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTDCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTDCONV'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of the last deep convection call'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTEXP'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTEXP'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of experiment beginning'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTSEG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTSEG'
-TFIELDLIST(IDX)%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Time and date of segment beginning'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEDATE
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'L1D'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'L1D'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for 1D model version'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'L2D'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'L2D'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for 2D model version'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PACK'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PACK'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical to compress 1D or 2D FM files'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CARTESIAN'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CARTESIAN'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for cartesian geometry'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBOUSS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBOUSS'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for Boussinesq approximation'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LOCEAN'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LOCEAN'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for Ocean MesoNH'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LCOUPLES'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LCOUPLES'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for coupling O-A LES'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SURF'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SURF'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Kind of surface processes parameterization'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPECHAR
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_C0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CPL_AROME'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CPL_AROME'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for AROME coupling file'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'COUPLING'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'COUPLING'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Logical for coupling file'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UT'
-TFIELDLIST(IDX)%CSTDNAME   = 'x_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'UT'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VT'
-TFIELDLIST(IDX)%CSTDNAME   = 'y_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'VT'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'WT'
-TFIELDLIST(IDX)%CSTDNAME   = 'upward_air_velocity'
-TFIELDLIST(IDX)%CLONGNAME  = 'WT'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_vertical wind'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'THT'
-TFIELDLIST(IDX)%CSTDNAME   = 'air_potential_temperature'
-TFIELDLIST(IDX)%CLONGNAME  = 'THT'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_potential temperature'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UM'
-TFIELDLIST(IDX)%CSTDNAME   = 'x_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'UM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VM'
-TFIELDLIST(IDX)%CSTDNAME   = 'y_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'VM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'WM'
-TFIELDLIST(IDX)%CSTDNAME   = 'upward_air_velocity'
-TFIELDLIST(IDX)%CLONGNAME  = 'WM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_vertical wind'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DUM'
-TFIELDLIST(IDX)%CSTDNAME   = 'x_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'DUM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DVM'
-TFIELDLIST(IDX)%CSTDNAME   = 'y_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'DVM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DWM'
-TFIELDLIST(IDX)%CSTDNAME   = 'upward_air_velocity'
-TFIELDLIST(IDX)%CLONGNAME  = 'DWM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_vertical wind'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TKET'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TKET'
-TFIELDLIST(IDX)%CUNITS     = 'm2 s-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Turbulent Kinetic Energy'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TKEMS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TKEMS'
-TFIELDLIST(IDX)%CUNITS     = 'm2 s-3'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Turbulent Kinetic Energy adv source'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PABST'
-TFIELDLIST(IDX)%CSTDNAME   = 'air_pressure'
-TFIELDLIST(IDX)%CLONGNAME  = 'PABST'
-TFIELDLIST(IDX)%CUNITS     = 'Pa'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ABSolute Pressure'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PHIT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PHIT'
-TFIELDLIST(IDX)%CUNITS     = 'Pa'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Reduced Pressure Oce/Shallow conv'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Moist variables (rho Rn)'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 4
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RVT'
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DYHAT',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Horizontal stretching in y', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ALT',            &
+  CSTDNAME   = 'altitude',       &
+  CLONGNAME  = 'ALT',            &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_ALTitude', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DIRCOSXW',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DIRCOSXW',       &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X director cosinus of the normal to the ground surface', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DIRCOSYW',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DIRCOSYW',       &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Y director cosinus of the normal to the ground surface', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DIRCOSZW',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DIRCOSZW',       &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Z director cosinus of the normal to the ground surface', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'COSSLOPE',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'COSSLOPE',       &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'cosinus of the angle between i and the slope vector', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SINSLOPE',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SINSLOPE',       &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'sinus of the angle between i and the slope vector', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'MAP',            &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = 'humidity_mixing_ratio'
-TFIELDLIST(IDX)%CLONGNAME  = 'RVT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Vapor mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RCT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RCT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Cloud mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RRT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RRT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Rain mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RIT'
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'MAP',            &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Map factor',     &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'latitude',       &
+  CSTDNAME   = 'latitude',       &
+  CLONGNAME  = 'latitude',       &
+  CUNITS     = 'degrees_north',  &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_latitude at mass point', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'longitude',      &
+  CSTDNAME   = 'longitude',      &
+  CLONGNAME  = 'longitude',      &
+  CUNITS     = 'degrees_east',   &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_longitude at mass point', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'latitude_u',              &
+  CSTDNAME   = 'latitude_at_u_location',  &
+  CLONGNAME  = 'latitude at u location',  &
+  CUNITS     = 'degrees_north',           &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_latitude at u point', &
+  NGRID      = 2,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 2,                         &
+  LTIMEDEP   = .FALSE.                    ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'longitude_u',              &
+  CSTDNAME   = 'longitude_at_u_location',  &
+  CLONGNAME  = 'longitude at u location',  &
+  CUNITS     = 'degrees_east',             &
+  CDIR       = 'XY',                       &
+  CCOMMENT   = 'X_Y_longitude at u point', &
+  NGRID      = 2,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 2,                          &
+  LTIMEDEP   = .FALSE.                     ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'latitude_v',              &
+  CSTDNAME   = 'latitude_at_v_location',  &
+  CLONGNAME  = 'latitude at v location',  &
+  CUNITS     = 'degrees_north',           &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_latitude at v point', &
+  NGRID      = 3,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 2,                         &
+  LTIMEDEP   = .FALSE.                    ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'longitude_v',              &
+  CSTDNAME   = 'longitude_at_v_location',  &
+  CLONGNAME  = 'longitude at v location',  &
+  CUNITS     = 'degrees_east',             &
+  CDIR       = 'XY',                       &
+  CCOMMENT   = 'X_Y_longitude at v point', &
+  NGRID      = 3,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 2,                          &
+  LTIMEDEP   = .FALSE.                     ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'latitude_f',              &
+  CSTDNAME   = 'latitude_at_f_location',  &
+  CLONGNAME  = 'latitude at f location',  &
+  CUNITS     = 'degrees_north',           &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_latitude at f point', &
+  NGRID      = 5,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 2,                         &
+  LTIMEDEP   = .FALSE.                    ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'longitude_f',              &
+  CSTDNAME   = 'longitude_at_f_location',  &
+  CLONGNAME  = 'longitude at f location',  &
+  CUNITS     = 'degrees_east',             &
+  CDIR       = 'XY',                       &
+  CCOMMENT   = 'X_Y_longitude at f point', &
+  NGRID      = 5,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 2,                          &
+  LTIMEDEP   = .FALSE.                     ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LAT',            &
+!   CSTDNAME   = 'latitude',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LAT',            &
+  CUNITS     = 'degrees_north',  &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_latitude',   &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LON',            &
+!   CSTDNAME   = 'longitude',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LON',            &
+  CUNITS     = 'degrees_east',   &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_longitude',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use XHAT_ll in I/O (use XHAT instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHAT_ll',        &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHAT_ll',        &
+  CUNITS     = 'm',              &
+!PW:BUG?: CDIR=XX => correct? variable is NOT distributed (same value on all processes) (see alse YHAT_ll...)
+!PW:BUG?: NGRID=2 => correct? variable is NOT distributed (same value on all processes)
+!PW:TODO?: create a new field to say if the variable is distributed? and how (X,Y,XY...)?
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane (all domain)', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use YHAT_ll in I/O (use YHAT instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHAT_ll',        &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHAT_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane (all domain)', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use XHATM_ll in I/O (use XHATM instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHATM_ll',        &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHATL_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass points (all domain)', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use YHATM_ll in I/O (use YHATM instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHATM_ll',        &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHATM_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass points (all domain)', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(   &
+  CMNHNAME   = 'ZS',               &
+  CSTDNAME   = 'surface_altitude', &
+  CLONGNAME  = 'ZS',               &
+  CUNITS     = 'm',                &
+  CDIR       = 'XY',               &
+  CCOMMENT   = 'orography',        &
+  NGRID      = 4,                  &
+  NTYPE      = TYPEREAL,           &
+  NDIMS      = 2,                  &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(  &
+  CMNHNAME   = 'ZWS',             &
+  CSTDNAME   = 'sea_surface_wave_significant_height', &
+  CLONGNAME  = 'ZWS',             &
+  CUNITS     = 'm',               &
+  CDIR       = 'XY',              &
+  CCOMMENT   = 'sea wave height', &
+  NGRID      = 4,                 &
+  NTYPE      = TYPEREAL,          &
+  NDIMS      = 2,                 &
+  LTIMEDEP   = .TRUE.             ) )
+
+call Add_field2list( TFIELDDATA(   &
+  CMNHNAME   = 'ZSMT',             &
+  CSTDNAME   = '',                 &
+  CLONGNAME  = 'ZSMT',             &
+  CUNITS     = 'm',                &
+  CDIR       = 'XY',               &
+  CCOMMENT   = 'smooth orography', &
+  NGRID      = 4,                  &
+  NTYPE      = TYPEREAL,           &
+  NDIMS      = 2,                  &
+  LTIMEDEP   = .FALSE.             ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SLEVE',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SLEVE',          &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for SLEVE coordinate', &
+  NGRID      = 4,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LEN1',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LEN1',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Decay scale for smooth topography', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LEN2',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LEN2',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Decay scale for small-scale topography deviation', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(                      &
+  CMNHNAME   = 'DTMOD',                               &
+  CSTDNAME   = '',                                    &
+  CLONGNAME  = 'DTMOD',                               &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+  CDIR       = '--',                                  &
+  CCOMMENT   = 'Time and date of model beginning',    &
+  NGRID      = 0,                                     &
+  NTYPE      = TYPEDATE,                              &
+  NDIMS      = 0,                                     &
+  LTIMEDEP   = .FALSE.                                ) )
+
+call Add_field2list( TFIELDDATA(                      &
+  CMNHNAME   = 'DTCUR',                               &
+  CSTDNAME   = 'time',                                &
+  CLONGNAME  = 'DTCUR',                               &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+  CDIR       = '--',                                  &
+  CCOMMENT   = 'Current time and date',               &
+  NGRID      = 0,                                     &
+  NTYPE      = TYPEDATE,                              &
+  NDIMS      = 0,                                     &
+  LTIMEDEP   = .FALSE.                                ) )
+
+call Add_field2list( TFIELDDATA(                            &
+  CMNHNAME   = 'DTRAD_FULL',                                &
+  CSTDNAME   = '',                                          &
+  CLONGNAME  = 'DTRAD_FULL',                                &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',       &
+  CDIR       = '--',                                        &
+  CCOMMENT   = 'Time and date of last full radiation call', &
+  NGRID      = 0,                                           &
+  NTYPE      = TYPEDATE,                                    &
+  NDIMS      = 0,                                           &
+  LTIMEDEP   = .FALSE.                                      ) )
+
+call Add_field2list( TFIELDDATA(                      &
+  CMNHNAME   = 'DTRAD_CLLY',                          &
+  CSTDNAME   = '',                                    &
+  CLONGNAME  = 'DTRAD_CLLY',                          &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+  CDIR       = '--',                                  &
+  CCOMMENT   = 'Time and date of last radiation call for only cloudy verticals', &
+  NGRID      = 0,                                     &
+  NTYPE      = TYPEDATE,                              &
+  NDIMS      = 0,                                     &
+  LTIMEDEP   = .FALSE.                                ) )
+
+call Add_field2list( TFIELDDATA(                                 &
+  CMNHNAME   = 'DTDCONV',                                        &
+  CSTDNAME   = '',                                               &
+  CLONGNAME  = 'DTDCONV',                                        &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',            &
+  CDIR       = '--',                                             &
+  CCOMMENT   = 'Time and date of the last deep convection call', &
+  NGRID      = 0,                                                &
+  NTYPE      = TYPEDATE,                                         &
+  NDIMS      = 0,                                                &
+  LTIMEDEP   = .FALSE.                                           ) )
+
+call Add_field2list( TFIELDDATA(                        &
+  CMNHNAME   = 'DTEXP',                                 &
+  CSTDNAME   = '',                                      &
+  CLONGNAME  = 'DTEXP',                                 &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',   &
+  CDIR       = '--',                                    &
+  CCOMMENT   = 'Time and date of experiment beginning', &
+  NGRID      = 0,                                       &
+  NTYPE      = TYPEDATE,                                &
+  NDIMS      = 0,                                       &
+  LTIMEDEP   = .FALSE.                                  ) )
+
+call Add_field2list( TFIELDDATA(                      &
+  CMNHNAME   = 'DTSEG',                               &
+  CSTDNAME   = '',                                    &
+  CLONGNAME  = 'DTSEG',                               &
+  CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+  CDIR       = '--',                                  &
+  CCOMMENT   = 'Time and date of segment beginning',  &
+  NGRID      = 0,                                     &
+  NTYPE      = TYPEDATE,                              &
+  NDIMS      = 0,                                     &
+  LTIMEDEP   = .FALSE.                                ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'L1D',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'L1D',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for 1D model version', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'L2D',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'L2D',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for 2D model version', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PACK',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PACK',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical to compress 1D or 2D FM files', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CARTESIAN',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CARTESIAN',      &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for cartesian geometry', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBOUSS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBOUSS',         &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for Boussinesq approximation', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LOCEAN',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LOCEAN',         &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for Ocean MesoNH', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LCOUPLES',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LCOUPLES',       &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for coupling O-A LES', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SURF',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SURF',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Kind of surface processes parameterization', &
+  NGRID      = 0,                &
+  NTYPE      = TYPECHAR,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CPL_AROME',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CPL_AROME',      &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for AROME coupling file', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'COUPLING',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'COUPLING',       &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Logical for coupling file', &
+  NGRID      = 0,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'UT',                        &
+  CSTDNAME   = 'x_wind',                    &
+  CLONGNAME  = 'UT',                        &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_U component of wind', &
+  NGRID      = 2,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'VT',                        &
+  CSTDNAME   = 'y_wind',                    &
+  CLONGNAME  = 'VT',                        &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_V component of wind', &
+  NGRID      = 3,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'WT',                  &
+  CSTDNAME   = 'upward_air_velocity', &
+  CLONGNAME  = 'WT',                  &
+  CUNITS     = 'm s-1',               &
+  CDIR       = 'XY',                  &
+  CCOMMENT   = 'X_Y_Z_vertical wind', &
+  NGRID      = 4,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 3,                     &
+  LTIMEDEP   = .TRUE.                 ) )
+
+call Add_field2list( TFIELDDATA(              &
+  CMNHNAME   = 'THT',                         &
+  CSTDNAME   = 'air_potential_temperature',   &
+  CLONGNAME  = 'THT',                         &
+  CUNITS     = 'K',                           &
+  CDIR       = 'XY',                          &
+  CCOMMENT   = 'X_Y_Z_potential temperature', &
+  NGRID      = 1,                             &
+  NTYPE      = TYPEREAL,                      &
+  NDIMS      = 3,                             &
+  LTIMEDEP   = .TRUE.                         ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'UM',                        &
+  CSTDNAME   = 'x_wind',                    &
+  CLONGNAME  = 'UM',                        &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_U component of wind', &
+  NGRID      = 2,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'VM',                        &
+  CSTDNAME   = 'y_wind',                    &
+  CLONGNAME  = 'VM',                        &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_V component of wind', &
+  NGRID      = 3,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'WM',                  &
+  CSTDNAME   = 'upward_air_velocity', &
+  CLONGNAME  = 'WM',                  &
+  CUNITS     = 'm s-1',               &
+  CDIR       = 'XY',                  &
+  CCOMMENT   = 'X_Y_Z_vertical wind', &
+  NGRID      = 4,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 3,                     &
+  LTIMEDEP   = .TRUE.                 ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'DUM',                       &
+  CSTDNAME   = 'x_wind',                    &
+  CLONGNAME  = 'DUM',                       &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_U component of wind', &
+  NGRID      = 2,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(            &
+  CMNHNAME   = 'DVM',                       &
+  CSTDNAME   = 'y_wind',                    &
+  CLONGNAME  = 'DVM',                       &
+  CUNITS     = 'm s-1',                     &
+  CDIR       = 'XY',                        &
+  CCOMMENT   = 'X_Y_Z_V component of wind', &
+  NGRID      = 3,                           &
+  NTYPE      = TYPEREAL,                    &
+  NDIMS      = 3,                           &
+  LTIMEDEP   = .TRUE.                       ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'DWM',                 &
+  CSTDNAME   = 'upward_air_velocity', &
+  CLONGNAME  = 'DWM',                 &
+  CUNITS     = 'm s-1',               &
+  CDIR       = 'XY',                  &
+  CCOMMENT   = 'X_Y_Z_vertical wind', &
+  NGRID      = 4,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 3,                     &
+  LTIMEDEP   = .TRUE.                 ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TKET',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TKET',           &
+  CUNITS     = 'm2 s-2',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Turbulent Kinetic Energy', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TKEMS',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TKEMS',          &
+  CUNITS     = 'm2 s-3',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Turbulent Kinetic Energy adv source', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'PABST',                   &
+  CSTDNAME   = 'air_pressure',            &
+  CLONGNAME  = 'PABST',                   &
+  CUNITS     = 'Pa',                      &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_Z_ABSolute Pressure', &
+  NGRID      = 1,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 3,                         &
+  LTIMEDEP   = .TRUE.                     ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PHIT',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PHIT',           &
+  CUNITS     = 'Pa',             &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Reduced Pressure Oce/Shallow conv', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RT',             &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RT',             &
+  CUNITS     = 'kg kg-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Moist variables (rho Rn)', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 4,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'RVT',                      &
 !TODO: check stdname
-TFIELDLIST(IDX)%CSTDNAME   = 'cloud_ice_mixing_ratio'
-TFIELDLIST(IDX)%CLONGNAME  = 'RIT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Ice mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RST'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RST'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Snow mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RGT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RGT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Graupel mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RHT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RHT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Hail mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-TFIELDLIST(IDX)%NDIMS      = 3
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SUPSATMAX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SUPSATMAX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Supersaturation'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NACT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NACT'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Nact'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SSPRO'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SSPRO'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Supersaturation'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NPRO'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NPRO'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Nact'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPAP'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPAP'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-2 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Precipitating Aerosol Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPAP'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPAP'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Precipitating Aerosol Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EFIELDU'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'EFIELDU'
-TFIELDLIST(IDX)%CUNITS     = 'V m-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_EFIELDU'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EFIELDV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'EFIELDV'
-TFIELDLIST(IDX)%CUNITS     = 'V m-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_EFIELDV'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EFIELDW'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'EFIELDW'
-TFIELDLIST(IDX)%CUNITS     = 'V m-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_EFIELDW'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NI_IAGGS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NI_IAGGS'
-TFIELDLIST(IDX)%CUNITS     = 'C m-3 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_NI_IAGGS'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NI_IDRYG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NI_IDRYG'
-TFIELDLIST(IDX)%CUNITS     = 'C m-3 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_NI_IDRYG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NI_SDRYG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NI_SDRYG'
-TFIELDLIST(IDX)%CUNITS     = 'C m-3 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_NI_SDRYG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INDUC_CG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INDUC_CG'
-TFIELDLIST(IDX)%CUNITS     = 'C m-3 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_INDUC_CG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TRIG_IC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TRIG_IC'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_FLASH_MAP_TRIG_IC'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'IMPACT_CG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'IMPACT_CG'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_FLASH_MAP_IMPACT_CG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'AREA_CG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'AREA_CG'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_FLASH_MAP_2DAREA_CG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'AREA_IC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'AREA_IC'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_FLASH_MAP_2DAREA_IC'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FLASH_3DCG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'FLASH_3DCG'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_FLASH_MAP_3DCG'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FLASH_3DIC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'FLASH_3DIC'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_FLASH_MAP_3DIC'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PHC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PHC'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'pH in cloud'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PHR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PHR'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'pH in rain'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSUM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LSUM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Large Scale U component'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSVM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LSVM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Large Scale V component'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSWM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LSWM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Large Scale vertical wind'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSTHM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LSTHM'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Large Scale potential Temperature'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSRVM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LSRVM'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Large Scale Vapor Mixing Ratio'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RIMX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RIMX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of points in the lateral absorbing layer in the x direction'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RIMY'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RIMY'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of points in the lateral absorbing layer in the y direction'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'HORELAX_UVWTH'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'HORELAX_UVWTH'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Switch to activate the HOrizontal RELAXation'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBXUM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBXUM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBXU'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBXUM'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBXVM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBXVM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBX'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBXVM'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBXWM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBXWM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBX'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBXWM'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBYUM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBYUM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBY'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBYUM'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBYVM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBYVM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBYV'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBYVM'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBYWM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBYWM'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBY'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBYWM'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBXTHM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBXTHM'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBX'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBXTHM'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBYTHM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBYTHM'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBY'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBYTHM'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'HORELAX_TKE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'HORELAX_TKE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Switch to activate the HOrizontal RELAXation'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPELOG
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBXTKEM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBXTKEM'
-TFIELDLIST(IDX)%CUNITS     = 'm2 s-2'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBX'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBXTKEM'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LBYTKEM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'LBYTKEM'
-TFIELDLIST(IDX)%CUNITS     = 'm2 s-2'
-! TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = 'LBY'
-TFIELDLIST(IDX)%CCOMMENT   = '2_Y_Z_LBYTKEM'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DRYMASST'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DRYMASST'
-TFIELDLIST(IDX)%CUNITS     = 'kg'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Total Dry Mass'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DRYMASSS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DRYMASSS'
-TFIELDLIST(IDX)%CUNITS     = 'kg'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Total Dry Mass Source'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BL_DEPTH'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'BL_DEPTH'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_BL_DEPTH'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SBL_DEPTH'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SBL_DEPTH'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_BL_SDEPTH'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'WTHVMF'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'WTHVMF'
-TFIELDLIST(IDX)%CUNITS     = 'm K s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_WTHVMF'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SRCT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SRCT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_normalized 2nd_order moment s_r_c/2Sigma_s2'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SIGS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SIGS'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Sigma_s from turbulence scheme'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RHOREFZ'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RHOREFZ'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-3'
-TFIELDLIST(IDX)%CDIR       = 'ZZ'
-TFIELDLIST(IDX)%CCOMMENT   = 'rhodz for reference state without orography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'THVREFZ'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'THVREFZ'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'ZZ'
-TFIELDLIST(IDX)%CCOMMENT   = 'thetavz for reference state without orography'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 1
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EXNTOP'
-TFIELDLIST(IDX)%CSTDNAME   = 'dimensionless_exner_function'
-TFIELDLIST(IDX)%CLONGNAME  = 'EXNTOP'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Exner function at model top'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-!
-IF (TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'US_PRES'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'US_PRES'
+  CSTDNAME   = 'humidity_mixing_ratio',    &
+  CLONGNAME  = 'RVT',                      &
+  CUNITS     = 'kg kg-1',                  &
+  CDIR       = 'XY',                       &
+  CCOMMENT   = 'X_Y_Z_Vapor mixing Ratio', &
+  NGRID      = 1,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 3,                          &
+  LTIMEDEP   = .TRUE.                      ) )
+
+call Add_field2list( TFIELDDATA(           &
+  CMNHNAME   = 'RCT',                      &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = 'RCT',                      &
+  CUNITS     = 'kg kg-1',                  &
+  CDIR       = 'XY',                       &
+  CCOMMENT   = 'X_Y_Z_Cloud mixing Ratio', &
+  NGRID      = 1,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 3,                          &
+  LTIMEDEP   = .TRUE.                      ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'RRT',                     &
+  CSTDNAME   = '',                        &
+  CLONGNAME  = 'RRT',                     &
+  CUNITS     = 'kg kg-1',                 &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_Z_Rain mixing Ratio', &
+  NGRID      = 1,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 3,                         &
+  LTIMEDEP   = .TRUE.                     ) )
+
+call Add_field2list( TFIELDDATA(         &
+  CMNHNAME   = 'RIT',                    &
+!TODO: check stdname
+  CSTDNAME   = 'cloud_ice_mixing_ratio', &
+  CLONGNAME  = 'RIT',                    &
+  CUNITS     = 'kg kg-1',                &
+  CDIR       = 'XY',                     &
+  CCOMMENT   = 'X_Y_Z_Ice mixing Ratio', &
+  NGRID      = 1,                        &
+  NTYPE      = TYPEREAL,                 &
+  NDIMS      = 3,                        &
+  LTIMEDEP   = .TRUE.                    ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'RST',                     &
+  CSTDNAME   = '',                        &
+  CLONGNAME  = 'RST',                     &
+  CUNITS     = 'kg kg-1',                 &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_Z_Snow mixing Ratio', &
+  NGRID      = 1,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 3,                         &
+  LTIMEDEP   = .TRUE.                     ) )
+
+call Add_field2list( TFIELDDATA(             &
+  CMNHNAME   = 'RGT',                        &
+  CSTDNAME   = '',                           &
+  CLONGNAME  = 'RGT',                        &
+  CUNITS     = 'kg kg-1',                    &
+  CDIR       = 'XY',                         &
+  CCOMMENT   = 'X_Y_Z_Graupel mixing Ratio', &
+  NGRID      = 1,                            &
+  NTYPE      = TYPEREAL,                     &
+  NDIMS      = 3,                            &
+  LTIMEDEP   = .TRUE.                        ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'RHT',                     &
+  CSTDNAME   = '',                        &
+  CLONGNAME  = 'RHT',                     &
+  CUNITS     = 'kg kg-1',                 &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_Z_Hail mixing Ratio', &
+  NGRID      = 1,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 3,                         &
+  LTIMEDEP   = .TRUE.                     ) )
+
+call Add_field2list( TFIELDDATA(        &
+  CMNHNAME   = 'SUPSATMAX',             &
+  CSTDNAME   = '',                      &
+  CLONGNAME  = 'SUPSATMAX',             &
+  CUNITS     = '',                      &
+  CDIR       = 'XY',                    &
+  CCOMMENT   = 'X_Y_Z_Supersaturation', &
+  NGRID      = 1,                       &
+  NTYPE      = TYPEREAL,                &
+  NDIMS      = 3,                       &
+  LTIMEDEP   = .TRUE.                   ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NACT',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NACT',           &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Nact',     &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SSPRO',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SSPRO',          &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Supersaturation', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NPRO',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NPRO',           &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_NPRO',     &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPAP',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPAP',          &
+  CUNITS     = 'kg m-2 s-1',     &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous Precipitating Aerosol Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPAP',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPAP',          &
+  CUNITS     = 'kg m-2',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated Precipitating Aerosol Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EFIELDU',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'EFIELDU',        &
+  CUNITS     = 'V m-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_EFIELDU',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EFIELDV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'EFIELDV',        &
+  CUNITS     = 'V m-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_EFIELDV',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EFIELDW',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'EFIELDW',        &
+  CUNITS     = 'V m-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_EFIELDW',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NI_IAGGS',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NI_IAGGS',       &
+  CUNITS     = 'C m-3 s-1',      &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_NI_IAGGS', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NI_IDRYG',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NI_IDRYG',       &
+  CUNITS     = 'C m-3 s-1',      &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_NI_IDRYG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NI_SDRYG',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NI_SDRYG',       &
+  CUNITS     = 'C m-3 s-1',      &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_NI_SDRYG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INDUC_CG',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INDUC_CG',       &
+  CUNITS     = 'C m-3 s-1',      &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_INDUC_CG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TRIG_IC',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TRIG_IC',        &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_FLASH_MAP_TRIG_IC', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'IMPACT_CG',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'IMPACT_CG',      &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_FLASH_MAP_IMPACT_CG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'AREA_CG',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'AREA_CG',        &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_FLASH_MAP_2DAREA_CG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'AREA_IC',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'AREA_IC',        &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_FLASH_MAP_2DAREA_IC', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FLASH_3DCG',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'FLASH_3DCG',     &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_FLASH_MAP_3DCG', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FLASH_3DIC',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'FLASH_3DIC',     &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_FLASH_MAP_3DIC', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PHC',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PHC',            &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'pH in cloud',    &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PHR',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PHR',            &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'pH in rain',     &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LSUM',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LSUM',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Large Scale U component', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LSVM',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LSVM',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Large Scale V component', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LSWM',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LSWM',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Large Scale vertical wind', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LSTHM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LSTHM',          &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Large Scale potential Temperature', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LSRVM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LSRVM',          &
+  CUNITS     = 'kg kg-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Large Scale Vapor Mixing Ratio', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RIMX',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RIMX',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of points in the lateral absorbing layer in the x direction', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RIMY',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RIMY',           &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of points in the lateral absorbing layer in the y direction', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HORELAX_UVWTH',  &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HORELAX_UVWTH',  &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Switch to activate the HOrizontal RELAXation', &
+  NGRID      = 1,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBXUM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBXUM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBXU',           &
+  CCOMMENT   = '2_Y_Z_LBXUM',    &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBXVM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBXVM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBX',            &
+  CCOMMENT   = '2_Y_Z_LBXVM',    &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBXWM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBXWM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBX',            &
+  CCOMMENT   = '2_Y_Z_LBXWM',    &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBYUM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBYUM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBY',            &
+  CCOMMENT   = '2_Y_Z_LBYUM',    &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBYVM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBYVM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBYV',           &
+  CCOMMENT   = '2_Y_Z_LBYVM',    &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBYWM',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBYWM',          &
+  CUNITS     = 'm s-1',          &
+!   CDIR       = ''
+  CLBTYPE    = 'LBY',            &
+  CCOMMENT   = '2_Y_Z_LBYWM',    &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBXTHM',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBXTHM',         &
+  CUNITS     = 'K',              &
+!   CDIR       = ''
+  CLBTYPE    = 'LBX',            &
+  CCOMMENT   = '2_Y_Z_LBXTHM',   &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBYTHM',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBYTHM',         &
+  CUNITS     = 'K',              &
+!   CDIR       = ''
+  CLBTYPE    = 'LBY',            &
+  CCOMMENT   = '2_Y_Z_LBYTHM',   &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HORELAX_TKE',    &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HORELAX_TKE',    &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Switch to activate the HOrizontal RELAXation', &
+  NGRID      = 1,                &
+  NTYPE      = TYPELOG,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBXTKEM',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBXTKEM',        &
+  CUNITS     = 'm2 s-2',         &
+!   CDIR       = ''
+  CLBTYPE    = 'LBX',            &
+  CCOMMENT   = '2_Y_Z_LBXTKEM',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'LBYTKEM',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'LBYTKEM',        &
+  CUNITS     = 'm2 s-2',         &
+!   CDIR       = ''
+  CLBTYPE    = 'LBY',            &
+  CCOMMENT   = '2_Y_Z_LBYTKEM',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DRYMASST',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DRYMASST',       &
+  CUNITS     = 'kg',             &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Total Dry Mass', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(        &
+  CMNHNAME   = 'DRYMASSS',              &
+  CSTDNAME   = '',                      &
+  CLONGNAME  = 'DRYMASSS',              &
+  CUNITS     = 'kg',                    &
+  CDIR       = '--',                    &
+  CCOMMENT   = 'Total Dry Mass Source', &
+  NGRID      = 0,                       &
+  NTYPE      = TYPEREAL,                &
+  NDIMS      = 0,                       &
+  LTIMEDEP   = .TRUE.                   ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'BL_DEPTH',       &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'BL_DEPTH',       &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_BL_DEPTH',   &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SBL_DEPTH',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SBL_DEPTH',      &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_BL_SDEPTH',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'WTHVMF',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'WTHVMF',         &
+  CUNITS     = 'm K s-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_WTHVMF',     &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SRCT',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SRCT',           &
+  CUNITS     = 'kg kg-2',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_normalized 2nd_order moment s_r_c/2Sigma_s2', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SIGS',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SIGS',           &
+  CUNITS     = 'kg kg-2',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Sigma_s from turbulence scheme', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RHOREFZ',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RHOREFZ',        &
+  CUNITS     = 'kg m-3',         &
+  CDIR       = 'ZZ',             &
+  CCOMMENT   = 'rhodz for reference state without orography', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'THVREFZ',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'THVREFZ',        &
+  CUNITS     = 'K',              &
+  CDIR       = 'ZZ',             &
+  CCOMMENT   = 'thetavz for reference state without orography', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EXNTOP',         &
+  CSTDNAME   = 'dimensionless_exner_function', &
+  CLONGNAME  = 'EXNTOP',         &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Exner function at model top', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+  IF (TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'US_PRES',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'US_PRES',        &
 !TODO: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_US_PRES'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VS_PRES'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VS_PRES'
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_US_PRES',  &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VS_PRES',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VS_PRES',        &
 !TODO: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_VS_PRES'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'WS_PRES'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'WS_PRES'
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_VS_PRES',  &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'WS_PRES',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'WS_PRES',        &
 !TODO: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_WS_PRES'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'THS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'THS_CLD'
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_WS_PRES',  &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'THS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'THS_CLD',        &
 !TODO: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_THS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Source of Moist variables'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 4
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RVS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RVS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RVS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RCS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RCS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RCS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RRS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RRS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RRS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RIS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RIS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RIS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RSS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RSS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RSS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RGS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RGS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RGS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RHS_CLD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RHS_CLD'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RHS_CLD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CLDFR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CLDFR'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_CLouD FRaction'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ICEFR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ICEFR'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ICE cloud FRaction'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CIT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CIT'
-TFIELDLIST(IDX)%CUNITS     = 'm-3'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Cloud Ice concentration'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RAINFR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RAINFR'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Rain FRaction'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_THS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RS_CLD',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RS_CLD',         &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Source of Moist variables', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 4,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RVS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RVS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RVS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RCS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RCS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RCS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RRS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RRS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RRS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RIS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RIS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RIS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RSS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RSS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RSS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RGS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RGS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RGS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RHS_CLD',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RHS_CLD',        &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RHS_CLD',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CLDFR',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CLDFR',          &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_CLouD FRaction', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ICEFR',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ICEFR',          &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_ICE cloud FRaction', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CIT',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CIT',            &
+  CUNITS     = 'm-3',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Cloud Ice concentration', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'RAINFR',              &
+  CSTDNAME   = '',                    &
+  CLONGNAME  = 'RAINFR',              &
+  CUNITS     = '1',                   &
+  CDIR       = 'XY',                  &
+  CCOMMENT   = 'X_Y_Z_Rain FRaction', &
+  NGRID      = 1,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 3,                     &
+  LTIMEDEP   = .TRUE.                 ) )
 !
 END IF ! CPROGRAM=MESONH .OR. DIAG .OR. LFICDF
 !
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RHODREF'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RHODREF'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-3'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Dry density for reference state with orography'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'THVREF'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'THVREF'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Thetav for reference state with orography'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RHODREF',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RHODREF',        &
+  CUNITS     = 'kg m-3',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Dry density for reference state with orography', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'THVREF',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'THVREF',         &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Thetav for reference state with orography', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
 !
 !
 IF (     TRIM(CPROGRAM) =='MESONH' .OR. TRIM(CPROGRAM) == 'DIAG'  &
     .OR. TRIM(CPROGRAM) == 'LFICDF'.OR. TRIM(CPROGRAM) == 'SPAWN' ) THEN
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTHRAD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTHRAD'
-TFIELDLIST(IDX)%CUNITS     = 'K s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_RADiative heating/cooling rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FLALWD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'FLALWD'
-TFIELDLIST(IDX)%CUNITS     = 'W m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Downward Long Waves on FLAT surface'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIRFLASWD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIRFLASWD'
-TFIELDLIST(IDX)%CUNITS     = 'W m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Short Waves on FLAT surface'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SCAFLASWD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SCAFLASWD'
-TFIELDLIST(IDX)%CUNITS     = 'W m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SCAttered Downward Short Waves on FLAT surface'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIRSRFSWD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIRSRFSWD'
-TFIELDLIST(IDX)%CUNITS     = 'W m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Short Waves'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CLEARCOL_TM1'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CLEARCOL_TM1'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'TRACE OF CLOUD'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ZENITH'
-TFIELDLIST(IDX)%CSTDNAME   = 'zenith_angle'
-TFIELDLIST(IDX)%CLONGNAME  = 'ZENITH'
-TFIELDLIST(IDX)%CUNITS     = 'rad'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ZENITH'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'AZIM'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'AZIM'
-TFIELDLIST(IDX)%CUNITS     = 'rad'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_AZIMuth'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DIR_ALB'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DIR_ALB'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect ALBedo'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SCA_ALB'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SCA_ALB'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SCAttered ALBedo'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EMIS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'EMIS'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_EMISsivity'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TSRAD'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TSRAD'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_RADiative Surface Temperature'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DTHRAD',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DTHRAD',         &
+  CUNITS     = 'K s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_RADiative heating/cooling rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FLALWD',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'FLALWD',         &
+  CUNITS     = 'W m-2',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Downward Long Waves on FLAT surface', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DIRFLASWD',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DIRFLASWD',      &
+  CUNITS     = 'W m-2',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_DIRect Downward Short Waves on FLAT surface', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SCAFLASWD',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SCAFLASWD',      &
+  CUNITS     = 'W m-2',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_SCAttered Downward Short Waves on FLAT surface', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DIRSRFSWD',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DIRSRFSWD',      &
+  CUNITS     = 'W m-2',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_DIRect Downward Short Waves', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CLEARCOL_TM1',   &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CLEARCOL_TM1',   &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'TRACE OF CLOUD', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ZENITH',         &
+  CSTDNAME   = 'zenith_angle',   &
+  CLONGNAME  = 'ZENITH',         &
+  CUNITS     = 'rad',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ZENITH',     &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'AZIM',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'AZIM',           &
+  CUNITS     = 'rad',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_AZIMuth',    &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(    &
+  CMNHNAME   = 'DIR_ALB',           &
+  CSTDNAME   = '',                  &
+  CLONGNAME  = 'DIR_ALB',           &
+  CUNITS     = '1',                 &
+  CDIR       = 'XY',                &
+  CCOMMENT   = 'X_Y_DIRect ALBedo', &
+  NGRID      = 1,                   &
+  NTYPE      = TYPEREAL,            &
+  NDIMS      = 3,                   &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], &
+  LTIMEDEP   = .TRUE.               ) )
+
+call Add_field2list( TFIELDDATA(       &
+  CMNHNAME   = 'SCA_ALB',              &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = 'SCA_ALB',              &
+  CUNITS     = '1',                    &
+  CDIR       = 'XY',                   &
+  CCOMMENT   = 'X_Y_SCAttered ALBedo', &
+  NGRID      = 1,                      &
+  NTYPE      = TYPEREAL,               &
+  NDIMS      = 3,                      &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], &
+  LTIMEDEP   = .TRUE.                  ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EMIS',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'EMIS',           &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_EMISsivity', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NLWB ], &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TSRAD',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TSRAD',          &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_RADiative Surface Temperature', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN
+
+IF (     TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG'  .OR. TRIM(CPROGRAM) == 'REAL' &
+    .OR. TRIM(CPROGRAM) == 'LFICDF' .OR. TRIM(CPROGRAM) == 'SPAWN'                               ) THEN
 !
 !
 ! Blaze fire model fields
 !
 ! get string of fire refinement ratio
-WRITE(YFIREDIMX, '(I3)') NREFINX
-WRITE(YFIREDIMY, '(I3)') NREFINY
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'LSPHI'
-TFIELDLIST(IDX)%CSTDNAME   = 'level_set_function'
-TFIELDLIST(IDX)%CLONGNAME  = 'LSPHI'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model level set function | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'BMAP'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_burning_map'
-TFIELDLIST(IDX)%CLONGNAME  = 'BMAP'
-TFIELDLIST(IDX)%CUNITS     = 's'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model burning map, i.e. arrival time matrix | &
-                              fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMASE'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_available_sensible_energy'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMASE'
-TFIELDLIST(IDX)%CUNITS     = 'kJ m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model available sensible energy of vegetation | &
-                              fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMAWC'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_available_water_content'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMAWC'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model available liquid water of vegetation | &
-                              fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMWINDU'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_filtered_wind_u'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMWINDU'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered u wind | &
-                              fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMWINDV'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_filtered_wind_v'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMWINDV'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered v wind &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMWINDW'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_filtered_wind_w'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMWINDW'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered w wind &
-                             | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMHWS'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_model_filtered_horizontal_wind_speed'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMHWS'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze filtered horizontal wind speed &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FIRERW'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_rate_of_spread'
-TFIELDLIST(IDX)%CLONGNAME  = 'FIRERW'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model rate of spread &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMR0'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_rate_of_spread_no_wind'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMR0'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model rate of spread without wind and slope &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMFLUXHDH'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_sensible_heat_flux'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMFLUXHDH'
-TFIELDLIST(IDX)%CUNITS     = 'W m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model sensible heat flux &
-                             | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMFLUXHDW'
-TFIELDLIST(IDX)%CSTDNAME   = 'fire_latent_heat_flux'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMFLUXHDW'
-TFIELDLIST(IDX)%CUNITS     = 'kg m-2 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model latent heat flux &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMGRADOROX'
-TFIELDLIST(IDX)%CSTDNAME   = 'orographic gradient on x direction on fire mesh'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMGRADOROX'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model orographic gradient on x direction on fire mesh &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FMGRADOROY'
-TFIELDLIST(IDX)%CSTDNAME   = 'orographic gradient on y direction on fire mesh'
-TFIELDLIST(IDX)%CLONGNAME  = 'FMGRADOROY'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_F Blaze fire model orographic gradient on y direction on fire mesh &
-                              | fire grid ('//YFIREDIMX//','//YFIREDIMY//')'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
+IF ( NREFINX > 999 .OR. NREFINY > 999 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_FIELD_LIST', 'NREFINX or NREFINY > 999' )
+WRITE( YFIREDIMX, '(I3)' ) NREFINX
+WRITE( YFIREDIMY, '(I3)' ) NREFINY
+
+call Add_field2list( TFIELDDATA(     &
+  CMNHNAME   = 'LSPHI',              &
+  CSTDNAME   = '',                   &
+  CLONGNAME  = 'level set function', &
+  CUNITS     = '',                   &
+  CDIR       = 'XY',                 &
+  CCOMMENT   = 'X_Y_F Blaze fire model level set function | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                    &
+  NTYPE      = TYPEREAL,             &
+  NDIMS      = 3,                    &
+  LTIMEDEP   = .TRUE.                ) )
+
+call Add_field2list( TFIELDDATA(   &
+  CMNHNAME   = 'BMAP',             &
+  CSTDNAME   = '',                 &
+  CLONGNAME  = 'fire burning map', &
+  CUNITS     = 's',                &
+  CDIR       = 'XY',               &
+  CCOMMENT   = 'X_Y_F Blaze fire model burning map, i.e. arrival time matrix | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                  &
+  NTYPE      = TYPEREAL,           &
+  NDIMS      = 3,                  &
+  LTIMEDEP   = .TRUE.              ) )
+
+call Add_field2list( TFIELDDATA(                       &
+  CMNHNAME   = 'FMASE',                                &
+  CSTDNAME   = '',                                     &
+  CLONGNAME  = 'fire model available sensible energy', &
+  CUNITS     = 'kJ m-2',                               &
+  CDIR       = 'XY',                                   &
+  CCOMMENT   = 'X_Y_F Blaze fire model available sensible energy of vegetation | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                                      &
+  NTYPE      = TYPEREAL,                               &
+  NDIMS      = 3,                                      &
+  LTIMEDEP   = .TRUE.                                 ) )
+
+call Add_field2list( TFIELDDATA(                     &
+  CMNHNAME   = 'FMAWC',                              &
+  CSTDNAME   = '',                                   &
+  CLONGNAME  = 'fire model available water content', &
+  CUNITS     = 'kg m-2',                             &
+  CDIR       = 'XY',                                 &
+  CCOMMENT   = 'X_Y_F Blaze fire model available liquid water of vegetation | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                                   &
+  NTYPE      = TYPEREAL,                            &
+  NDIMS      = 3,                                   &
+  LTIMEDEP   = .TRUE.                               ) )
+
+call Add_field2list( TFIELDDATA(             &
+  CMNHNAME   = 'FMWINDU',                    &
+  CSTDNAME   = '',                           &
+  CLONGNAME  = 'fire model filtered wind u', &
+  CUNITS     = 'm s-1',                      &
+  CDIR       = 'XY',                         &
+  CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered u wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                            &
+  NTYPE      = TYPEREAL,                     &
+  NDIMS      = 3,                            &
+  LTIMEDEP   = .TRUE.                        ) )
+
+call Add_field2list( TFIELDDATA(             &
+  CMNHNAME   = 'FMWINDV',                    &
+  CSTDNAME   = '',                           &
+  CLONGNAME  = 'fire model filtered wind v', &
+  CUNITS     = 'm s-1',                      &
+  CDIR       = 'XY',                         &
+  CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered v wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                            &
+  NTYPE      = TYPEREAL,                     &
+  NDIMS      = 3,                            &
+  LTIMEDEP   = .TRUE.                        ) )
+
+call Add_field2list( TFIELDDATA(             &
+  CMNHNAME   = 'FMWINDW',                    &
+  CSTDNAME   = '',                           &
+  CLONGNAME  = 'fire model filtered wind w', &
+  CUNITS     = 'm s-1',                      &
+  CDIR       = 'XY',                         &
+  CCOMMENT   = 'X_Y_F Blaze fire model EWAM filtered w wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                            &
+  NTYPE      = TYPEREAL,                     &
+  NDIMS      = 3,                            &
+  LTIMEDEP   = .TRUE.                        ) )
+
+call Add_field2list( TFIELDDATA(                            &
+  CMNHNAME   = 'FMHWS',                                     &
+  CSTDNAME   = '',                                          &
+  CLONGNAME  = 'fire model filtered horizontal wind speed', &
+  CUNITS     = 'm s-1',                                     &
+  CDIR       = 'XY',                                        &
+  CCOMMENT   = 'X_Y_F Blaze filtered horizontal wind speed | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                                           &
+  NTYPE      = TYPEREAL,                                    &
+  NDIMS      = 3,                                           &
+  LTIMEDEP   = .TRUE.                                       ) )
+
+call Add_field2list( TFIELDDATA(      &
+  CMNHNAME   = 'FIRERW',              &
+  CSTDNAME   = '',                    &
+  CLONGNAME  = 'fire rate of spread', &
+  CUNITS     = 'm s-1',               &
+  CDIR       = 'XY',                  &
+  CCOMMENT   = 'X_Y_F Blaze fire model rate of spread | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                     &
+  NTYPE      = TYPEREAL,              &
+  NDIMS      = 3,                     &
+  LTIMEDEP   = .TRUE.                 ) )
+
+call Add_field2list( TFIELDDATA(              &
+  CMNHNAME   = 'FMR0',                        &
+  CSTDNAME   = '',                            &
+  CLONGNAME  = 'fire rate of spread no wind', &
+  CUNITS     = 'm s-1',                       &
+  CDIR       = 'XY',                          &
+  CCOMMENT   = 'X_Y_F Blaze fire model rate of spread without wind and slope | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                             &
+  NTYPE      = TYPEREAL,                      &
+  NDIMS      = 3,                             &
+  LTIMEDEP   = .TRUE.                         ) )
+
+call Add_field2list( TFIELDDATA(          &
+  CMNHNAME   = 'FMFLUXHDH',               &
+  CSTDNAME   = '',                        &
+  CLONGNAME  = 'fire sensible heat flux', &
+  CUNITS     = 'W m-2',                   &
+  CDIR       = 'XY',                      &
+  CCOMMENT   = 'X_Y_F Blaze fire model sensible heat flux | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                         &
+  NTYPE      = TYPEREAL,                  &
+  NDIMS      = 3,                         &
+  LTIMEDEP   = .TRUE.                     ) )
+
+call Add_field2list( TFIELDDATA(        &
+  CMNHNAME   = 'FMFLUXHDW',             &
+  CSTDNAME   = '',                      &
+  CLONGNAME  = 'fire latent heat flux', &
+  CUNITS     = 'kg m-2 s-1',            &
+  CDIR       = 'XY',                    &
+  CCOMMENT   = 'X_Y_F Blaze fire model latent heat flux | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                       &
+  NTYPE      = TYPEREAL,                &
+  NDIMS      = 3,                       &
+  LTIMEDEP   = .TRUE.                   ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FMGRADOROX',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'orographic gradient on x direction on fire mesh', &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_F Blaze fire model orographic gradient on x direction on fire mesh | fire grid (' &
+                //YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FMGRADOROY',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'orographic gradient on y direction on fire mesh', &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_F Blaze fire model orographic gradient on y direction on fire mesh | fire grid (' &
+               //YFIREDIMX//','//YFIREDIMY//')', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
 !
 ! end of Blaze fields
 !
-END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN
+END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN .OR. REAL
 !
 !
 IF ( TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' ) THEN
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'COUNTCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'COUNTCONV'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_COUNTCONV'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DTHCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DTHCONV'
-TFIELDLIST(IDX)%CUNITS     = 'K s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_CONVective heating/cooling rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DRVCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DRVCONV'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_CONVective R_v tendency'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DRCCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DRCCONV'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_CONVective R_c tendency'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DRICONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DRICONV'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_CONVective R_i tendency'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRCONV'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CONVective instantaneous Precipitation Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PACCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PACCONV'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CONVective ACcumulated Precipitation rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRSCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRSCONV'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CONVective instantaneous Precipitation Rate for Snow'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DSVCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DSVCONV'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Tracer tendencies'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 4
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRLFLXCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRLFLXCONV'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Liquid Precipitation Convective Flux'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRSFLXCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRSFLXCONV'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Solid Precipitation Convective Flux'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UMFCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'UMFCONV'
-TFIELDLIST(IDX)%CUNITS     = 'kg s-1 m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Updraft Convective Mass Flux'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'DMFCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'DMFCONV'
-TFIELDLIST(IDX)%CUNITS     = 'kg s-1 m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Downdraft Convective Mass Flux'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MFCONV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MFCONV'
-TFIELDLIST(IDX)%CUNITS     = 'kg s-1 m-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Convective Mass Flux'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CAPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CAPE'
-TFIELDLIST(IDX)%CUNITS     = 'J kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Convective Available Potentiel Energy'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CLTOPCONV_LVL'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CLTOPCONV_LVL'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Convective cloud top level'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CLBASCONV_LVL'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CLBASCONV_LVL'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'Convective cloud base level'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'IC_RATE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'IC_RATE'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_IntraCloud lightning Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CG_RATE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CG_RATE'
-TFIELDLIST(IDX)%CUNITS     = 's-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CloudGround lightning Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'IC_TOTAL_NB'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'IC_TOTAL_NB'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_IntraCloud lightning Number'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'CG_TOTAL_NB'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'CG_TOTAL_NB'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CloudGround lightning Number'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'COUNTCONV',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'COUNTCONV',      &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_COUNTCONV',  &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DTHCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DTHCONV',        &
+  CUNITS     = 'K s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_CONVective heating/cooling rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DRVCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DRVCONV',        &
+  CUNITS     = 's-1',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_CONVective R_v tendency', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DRCCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DRCCONV',        &
+  CUNITS     = 's-1',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_CONVective R_c tendency', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DRICONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DRICONV',        &
+  CUNITS     = 's-1',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_CONVective R_i tendency', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRCONV',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRCONV',         &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_CONVective instantaneous Precipitation Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PACCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PACCONV',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_CONVective ACcumulated Precipitation rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRSCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRSCONV',        &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_CONVective instantaneous Precipitation Rate for Snow', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(    &
+  CMNHNAME   = 'DSVCONV',           &
+  CSTDNAME   = '',                  &
+  CLONGNAME  = 'DSVCONV',           &
+  CUNITS     = 's-1',               &
+  CDIR       = 'XY',                &
+  CCOMMENT   = 'Tracer tendencies', &
+  NGRID      = 1,                   &
+  NTYPE      = TYPEREAL,            &
+  NDIMS      = 4,                   &
+  LTIMEDEP   = .TRUE.               ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRLFLXCONV',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRLFLXCONV',     &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Liquid Precipitation Convective Flux', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRSFLXCONV',     &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRSFLXCONV',     &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Solid Precipitation Convective Flux', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'UMFCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'UMFCONV',        &
+  CUNITS     = 'kg s-1 m-2',     &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Updraft Convective Mass Flux', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'DMFCONV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'DMFCONV',        &
+  CUNITS     = 'kg s-1 m-2',     &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Downdraft Convective Mass Flux', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'MFCONV',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'MFCONV',         &
+  CUNITS     = 'kg s-1 m-2',     &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Convective Mass Flux', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CAPE',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CAPE',           &
+  CUNITS     = 'J kg-1',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Convective Available Potentiel Energy', &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CLTOPCONV_LVL',  &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CLTOPCONV_LVL',  &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Convective cloud top level', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CLBASCONV_LVL',  &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CLBASCONV_LVL',  &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'Convective cloud base level', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'IC_RATE',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'IC_RATE',        &
+  CUNITS     = 's-1',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_IntraCloud lightning Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CG_RATE',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CG_RATE',        &
+  CUNITS     = 's-1',            &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_CloudGround lightning Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'IC_TOTAL_NB',    &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'IC_TOTAL_NB',    &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_IntraCloud lightning Number', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'CG_TOTAL_NB',    &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'CG_TOTAL_NB',    &
+  CUNITS     = '1',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_CloudGround lightning Number', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
 !
 END IF !CPROGRAM/=PGD , NESPGD
 !
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SSO_ANIS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SSO_ANIS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SSO_ANISOTROPY'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SSO_SLOPE'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SSO_SLOPE'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SSO_SLOPE'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SSO_DIR'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SSO_DIR'
-TFIELDLIST(IDX)%CUNITS     = 'degree'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SSO_DIR'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'AVG_ZS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'AVG_ZS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_AVG_ZS'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SIL_ZS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SIL_ZS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SIL_ZS'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MAX_ZS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MAX_ZS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_MAX_ZS'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'MIN_ZS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'MIN_ZS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_MIN_ZS'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'SSO_STDEV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'SSO_STDEV'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SSO_STDEV'
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRC'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Cloud Precipitation Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRC'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Cloud Precipitation Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INDEP'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INDEP'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Cloud Deposition Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACDEP'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACDEP'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Cloud Deposition Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRR'
-TFIELDLIST(IDX)%CSTDNAME   = 'rainfall_rate'
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRR'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Precipitation Rain Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRR3D'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRR3D'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous 3D Rain Precipitation flux'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'EVAP3D'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'EVAP3D'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1 s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous 3D Rain Evaporation flux'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRR'
-TFIELDLIST(IDX)%CSTDNAME   = 'thickness_of_rainfall_amount'
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRR'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Precipitation Rain Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRS'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Snow Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRS'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Snow Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRG'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Graupel Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRG'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRG'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Graupel Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRH'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRH'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Hail Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRH'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRH'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Hail Rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'INPRT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'INPRT'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Total INstantaneaous PRecipitation rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
+call Add_field2list( TFIELDDATA(     &
+  CMNHNAME   = 'SSO_ANIS',           &
+  CSTDNAME   = '',                   &
+  CLONGNAME  = 'SSO_ANIS',           &
+  CUNITS     = 'm',                  &
+  CDIR       = 'XY',                 &
+  CCOMMENT   = 'X_Y_SSO_ANISOTROPY', &
+  NGRID      = 4,                    &
+  NTYPE      = TYPEREAL,             &
+  NDIMS      = 2,                    &
+  LTIMEDEP   = .FALSE.               ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SSO_SLOPE',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SSO_SLOPE',      &
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_SSO_SLOPE',  &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SSO_DIR',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SSO_DIR',        &
+  CUNITS     = 'degree',         &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_SSO_DIR',    &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'AVG_ZS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'AVG_ZS',         &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_AVG_ZS',     &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SIL_ZS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SIL_ZS',         &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_SIL_ZS',     &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'MAX_ZS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'MAX_ZS',         &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_MAX_ZS',     &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'MIN_ZS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'MIN_ZS',         &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_MIN_ZS',     &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'SSO_STDEV',      &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'SSO_STDEV',      &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_SSO_STDEV',  &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRC',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRC',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous Cloud Precipitation Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPRC',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPRC',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated Cloud Precipitation Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INDEP',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INDEP',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous Cloud Deposition Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACDEP',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACDEP',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated Cloud Deposition Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRR',          &
+  CSTDNAME   = 'rainfall_rate',  &
+  CLONGNAME  = 'INPRR',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous Precipitation Rain Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRR3D',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRR3D',        &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous 3D Rain Precipitation flux', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'EVAP3D',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'EVAP3D',         &
+  CUNITS     = 'kg kg-1 s-1',    &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous 3D Rain Evaporation flux', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA(                          &
+  CMNHNAME   = 'ACPRR',                                   &
+  CSTDNAME   = 'thickness_of_rainfall_amount',            &
+  CLONGNAME  = 'ACPRR',                                   &
+  CUNITS     = 'm',                                       &
+  CDIR       = 'XY',                                      &
+  CCOMMENT   = 'X_Y_ACcumulated Precipitation Rain Rate', &
+  NGRID      = 1,                                         &
+  NTYPE      = TYPEREAL,                                  &
+  NDIMS      = 2,                                         &
+  LTIMEDEP   = .TRUE.                                     ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRS',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRS',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous PRecipitation Snow Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPRS',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPRS',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated PRecipitation Snow Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRG',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRG',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous PRecipitation Graupel Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPRG',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPRG',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated PRecipitation Graupel Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRH',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRH',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_INstantaneous PRecipitation Hail Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPRH',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPRH',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_ACcumulated PRecipitation Hail Rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'INPRT',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'INPRT',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Total INstantaneaous PRecipitation rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
 !No permanent variable associated to this field
-!ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'ACPRT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'ACPRT'
-TFIELDLIST(IDX)%CUNITS     = 'm'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Total ACcumulated PRecipitation rate'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ACPRT',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'ACPRT',          &
+  CUNITS     = 'm',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Total ACcumulated PRecipitation rate', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .TRUE.            ) )
 !No permanent variable associated to this field
-!ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VT_FLX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VT_FLX'
-TFIELDLIST(IDX)%CUNITS     = 'K m s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'WT_FLX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'WT_FLX'
-TFIELDLIST(IDX)%CUNITS     = 'K m s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 4
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RTHS_EDDY_FLUX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RTHS_EDDY_FLUX'
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VT_FLX',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VT_FLX',         &
+  CUNITS     = 'K m s-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = '',               &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'WT_FLX',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'WT_FLX',         &
+  CUNITS     = 'K m s-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = '',               &
+  NGRID      = 4,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RTHS_EDDY_FLUX', &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RTHS_EDDY_FLUX', &
 !TODO PW: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VU_FLX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VU_FLX'
-TFIELDLIST(IDX)%CUNITS     = 'm s-2'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'RVS_EDDY_FLUX'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'RVS_EDDY_FLUX'
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = '',               &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VU_FLX',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VU_FLX',         &
+  CUNITS     = 'm s-2',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = '',               &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'RVS_EDDY_FLUX',  &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'RVS_EDDY_FLUX',  &
 !TODO PW: units?
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'FRC'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'FRC'
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Number of forcing profiles'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
+  CUNITS     = '',               &
+  CDIR       = 'XY',             &
+  CCOMMENT   = '',               &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .TRUE.            ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'FRC',            &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'FRC',            &
+  CUNITS     = '',               &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Number of forcing profiles', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
 !
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !
 IF (TRIM(CPROGRAM)=='REAL' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN
 !PW: not yet known: IF (LFILTERING) THEN
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UT15'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'UT15'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of Total wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VT15'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VT15'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of Total wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TEMPTOT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TEMPTOT'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_TOTal TEMPerature'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRESTOT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRESTOT'
-TFIELDLIST(IDX)%CUNITS     = 'Pa'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_TOTal PRESsure'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'HUMTOT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'HUMTOT'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_TOTal specific HUMidity'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UT16'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'UT16'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of Environmental wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VT16'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VT16'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of Environmental wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TEMPENV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TEMPENV'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ENVironmental TEMPerature'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRESENV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRESENV'
-TFIELDLIST(IDX)%CUNITS     = 'Pa'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ENVironmental PRESsure'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 2
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'HUMENV'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'HUMENV'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_ENVironmental specific HUMidity'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'UT17'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'UT17'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of Basic wind'
-TFIELDLIST(IDX)%NGRID      = 2
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VT17'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VT17'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of Basic wind'
-TFIELDLIST(IDX)%NGRID      = 3
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'TEMPBAS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'TEMPBAS'
-TFIELDLIST(IDX)%CUNITS     = 'K'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_BASic TEMPerature'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'PRESBAS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'PRESBAS'
-TFIELDLIST(IDX)%CUNITS     = 'Pa'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_BASic PRESsure'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'HUMBAS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'HUMBAS'
-TFIELDLIST(IDX)%CUNITS     = 'kg kg-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_BASic specific HUMidity'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
-!
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'VTDIS'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'VTDIS'
-TFIELDLIST(IDX)%CUNITS     = 'm s-1'
-TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Total disturbance tangential wind'
-TFIELDLIST(IDX)%NGRID      = 1
-TFIELDLIST(IDX)%NTYPE      = TYPEREAL
-TFIELDLIST(IDX)%NDIMS      = 3
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
-IDX = IDX+1
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'UT15',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'UT15',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_U component of Total wind', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VT15',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VT15',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_V component of Total wind', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TEMPTOT',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TEMPTOT',        &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_TOTal TEMPerature', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRESTOT',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRESTOT',        &
+  CUNITS     = 'Pa',             &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_TOTal PRESsure', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HUMTOT',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HUMTOT',         &
+  CUNITS     = 'kg kg-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_TOTal specific HUMidity', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'UT16',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'UT16',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_U component of Environmental wind', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VT16',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VT16',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_V component of Environmental wind', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TEMPENV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TEMPENV',        &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_ENVironmental TEMPerature', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRESENV',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRESENV',        &
+  CUNITS     = 'Pa',             &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_ENVironmental PRESsure', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 2,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HUMENV',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HUMENV',         &
+  CUNITS     = 'kg kg-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_ENVironmental specific HUMidity', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'UT17',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'UT17',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_U component of Basic wind', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VT17',           &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VT17',           &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_V component of Basic wind', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'TEMPBAS',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'TEMPBAS',        &
+  CUNITS     = 'K',              &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_BASic TEMPerature', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'PRESBAS',        &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'PRESBAS',        &
+  CUNITS     = 'Pa',             &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_BASic PRESsure', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'HUMBAS',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'HUMBAS',         &
+  CUNITS     = 'kg kg-1',        &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_BASic specific HUMidity', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'VTDIS',          &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'VTDIS',          &
+  CUNITS     = 'm s-1',          &
+  CDIR       = 'XY',             &
+  CCOMMENT   = 'X_Y_Z_Total disturbance tangential wind', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 3,                &
+  LTIMEDEP   = .FALSE.           ) )
 !
 !END IF !LFILTERING
 END IF !CPROGRAM==REAL .OR. LFICDF
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NFRCLT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NFRCLT'
-TFIELDLIST(IDX)%CUNITS     = '1'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'number of sea surface forcings + 1'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = 'NINFRT'
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = 'NINFRT'
-TFIELDLIST(IDX)%CUNITS     = 's'
-TFIELDLIST(IDX)%CDIR       = '--'
-TFIELDLIST(IDX)%CCOMMENT   = 'Interval in seconds between forcings'
-TFIELDLIST(IDX)%NGRID      = 0
-TFIELDLIST(IDX)%NTYPE      = TYPEINT
-TFIELDLIST(IDX)%NDIMS      = 0
-TFIELDLIST(IDX)%LTIMEDEP   = .FALSE.
-IDX = IDX+1
-!
-!
-WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') IDX-1,MAXFIELDS
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NFRCLT',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NFRCLT',         &
+  CUNITS     = '1',              &
+  CDIR       = '--',             &
+  CCOMMENT   = 'number of sea surface forcings + 1', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'NINFRT',         &
+  CSTDNAME   = '',               &
+  CLONGNAME  = 'NINFRT',         &
+  CUNITS     = 's',              &
+  CDIR       = '--',             &
+  CCOMMENT   = 'Interval in seconds between forcings', &
+  NGRID      = 0,                &
+  NTYPE      = TYPEINT,          &
+  NDIMS      = 0,                &
+  LTIMEDEP   = .FALSE.           ) )
+!
+!
+WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') nfields_used-1,NMAXFIELDS
 CALL PRINT_MSG(NVERB_INFO,'GEN','INI_FIELD_LIST',TRIM(YMSG))
 !
 #if 0
 !
-IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
-TFIELDLIST(IDX)%CMNHNAME   = ''
-TFIELDLIST(IDX)%CSTDNAME   = ''
-TFIELDLIST(IDX)%CLONGNAME  = ''
-TFIELDLIST(IDX)%CUNITS     = ''
-TFIELDLIST(IDX)%CDIR       = ''
-TFIELDLIST(IDX)%CLBTYPE    = ''
-TFIELDLIST(IDX)%CCOMMENT   = ''
-TFIELDLIST(IDX)%NGRID      =
-TFIELDLIST(IDX)%NTYPE      =
-TFIELDLIST(IDX)%NDIMS      =
-TFIELDLIST(IDX)%LTIMEDEP   =
-ALLOCATE(TFIELDLIST(IDX)%TFIELD_xxxD(IMODEL))
-IDX = IDX+1
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = '',               &
+  CSTDNAME   = '',               &
+  CLONGNAME  = '',               &
+  CUNITS     = '',               &
+  CDIR       = '',               &
+  CLBTYPE    = '',               &
+  CCOMMENT   = '',               &
+  NGRID      = ,                 &
+  NTYPE      = ,                 &
+  NDIMS      = ,                 &
+  LTIMEDEP   = ,                 ) )
 #endif
 !
-CONTAINS
-SUBROUTINE ERR_INI_FIELD_LIST()
-  WRITE(YMSG,'( "IDX>MAXFIELDS (",I5,")" )') MAXFIELDS
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',TRIM(YMSG))
-END SUBROUTINE ERR_INI_FIELD_LIST
-!
 END SUBROUTINE INI_FIELD_LIST
 !
 SUBROUTINE FIND_FIELD_ID_FROM_MNHNAME(HMNHNAME,KID,KRESP,ONOWARNING)
 !
 CHARACTER(LEN=*),            INTENT(IN) :: HMNHNAME !Name of the field to find
 INTEGER,                     INTENT(OUT):: KID      !Index of the field
-INTEGER,                     INTENT(OUT):: KRESP    !Return-code
+INTEGER,                     INTENT(OUT):: KRESP    !Return-code 
 LOGICAL, OPTIONAL,           INTENT(IN) :: ONOWARNING !If true, do not print warning
 !
 INTEGER :: IDX,JI
@@ -3828,14 +3459,12 @@ END IF
 !
 DO
   ICOUNT = ICOUNT + 1
-  IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)=='') THEN !Last entry
-    IDX = 1
-  ELSE IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)==TRIM(HMNHNAME)) THEN
+  IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)==TRIM(HMNHNAME)) THEN
     KID = IDX
     EXIT
   ELSE
     IDX = IDX + 1
-    IF (IDX>MAXFIELDS) IDX = 1
+    IF ( IDX > nfields_used ) IDX = 1
   END IF
   IF (IDX == IFIRSTGUESS) EXIT !All entries have been tested
 END DO
@@ -3849,8 +3478,8 @@ IF (KID==0) THEN
     CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIND_FIELD_ID_FROM_MNHNAME','field '//TRIM(HMNHNAME)//' not known (not unexpected)')
   END IF
 ELSE
-  IFIRSTGUESS = IDX+1
-  IF (IFIRSTGUESS>MAXFIELDS) IFIRSTGUESS = 1
+  IFIRSTGUESS = IDX + 1
+  IF ( IFIRSTGUESS > nfields_used ) IFIRSTGUESS = 1
   WRITE(YMSG,'( "field ",A16," found after ",I4," attempt(s)" )') TRIM(HMNHNAME),ICOUNT
   CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIND_FIELD_ID_FROM_MNHNAME',TRIM(YMSG))
 END IF
@@ -3915,1472 +3544,1643 @@ END IF
 IF (.NOT.ASSOCIATED(XZTOP)) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XZTOP was not associated')
   ALLOCATE(XZTOP)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XZTOP
+  call Goto_model_1field( 'ZTOP', 1, 1, XZTOP )
 END IF
 !
 IF (.NOT.ASSOCIATED(LSLEVE)) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LSLEVE was not associated')
   ALLOCATE(LSLEVE)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('SLEVE',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LSLEVE
+  call Goto_model_1field( 'SLEVE', 1, 1, LSLEVE )
 END IF
 !
 IF (.NOT.ASSOCIATED(XLEN1)) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN1 was not associated')
   ALLOCATE(XLEN1)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('LEN1',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XLEN1
+  call Goto_model_1field( 'LEN1', 1, 1, XLEN1 )
 END IF
 !
 IF (.NOT.ASSOCIATED(XLEN2)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN2 was not associated')
-  ALLOCATE(XLEN2)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('LEN2',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XLEN2
-END IF
-!
-IF (.NOT.ASSOCIATED(TDTMOD)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTMOD was not associated')
-  ALLOCATE(TDTMOD)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTMOD',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTMOD
-END IF
-!
-IF (.NOT.ASSOCIATED(TDTCUR)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTCUR was not associated')
-  ALLOCATE(TDTCUR)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTCUR',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTCUR
-END IF
-!
-IF (.NOT.ASSOCIATED(TDTRAD_FULL)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_FULL was not associated')
-  ALLOCATE(TDTRAD_FULL)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_FULL',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTRAD_FULL
-END IF
-!
-IF (.NOT.ASSOCIATED(TDTRAD_CLONLY)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_CLONLY was not associated')
-  ALLOCATE(TDTRAD_CLONLY)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_CLLY',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTRAD_CLONLY
-END IF
-!
-IF (.NOT.ASSOCIATED(TDTDCONV)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTDCONV was not associated')
-  ALLOCATE(TDTDCONV)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTDCONV',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTDCONV
-END IF
-!
-IF (.NOT.ASSOCIATED(CSURF)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' CSURF was not associated')
-  ALLOCATE(CHARACTER(LEN=4) :: CSURF)
-  CSURF = ''
-END IF
-CALL FIND_FIELD_ID_FROM_MNHNAME('SURF',IID,IRESP)
-TFIELDLIST(IID)%TFIELD_C0D(1)%DATA=>CSURF
-!
-IF (.NOT.ASSOCIATED(XDRYMASST)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASST was not associated')
-  ALLOCATE(XDRYMASST)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASST',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASST
-END IF
-!
-IF (.NOT.ASSOCIATED(XDRYMASSS)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASSS was not associated')
-  ALLOCATE(XDRYMASSS)
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP)
-  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASSS
-END IF
-!
-IF (.NOT.ASSOCIATED(NRIMX)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMX was not associated')
-  ALLOCATE(NRIMX)
-END IF
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('RIMX',IID,IRESP)
-TFIELDLIST(IID)%TFIELD_N0D(1)%DATA=>NRIMX
-IF (.NOT.ASSOCIATED(NRIMY)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMY was not associated')
-  ALLOCATE(NRIMY)
-END IF
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('RIMY',IID,IRESP)
-TFIELDLIST(IID)%TFIELD_N0D(1)%DATA=>NRIMY
-!
-IF (.NOT.ASSOCIATED(LHORELAX_UVWTH)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_UVWTH was not associated')
-  ALLOCATE(LHORELAX_UVWTH)
-END IF
-CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_UVWTH',IID,IRESP)
-TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LHORELAX_UVWTH
-!
-IF (.NOT.ASSOCIATED(LHORELAX_TKE)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_TKE was not associated')
-  ALLOCATE(LHORELAX_TKE)
-END IF
-CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_TKE',IID,IRESP)
-TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LHORELAX_TKE
-!
-END SUBROUTINE INI_FIELD_SCALARS
-!
-!
-SUBROUTINE FIELDLIST_GOTO_MODEL(KFROM, KTO)
-!
-USE MODD_REF
-!
-USE MODD_ADV_n
-USE MODD_CONF_n
-USE MODD_DEEP_CONVECTION_n
-USE MODD_DEF_EDDY_FLUX_n
-USE MODD_DEF_EDDYUV_FLUX_n
-USE MODD_DYN_n
-USE MODD_ELEC_n
-USE MODD_FIELD_n
-USE MODD_GR_FIELD_n
-USE MODD_GRID_n
-USE MODD_HURR_FIELD_n
-USE MODD_LIMA_PRECIP_SCAVENGING_n
-USE MODD_LSFIELD_n
-USE MODD_OCEANH
-USE MODD_PARAM_n
-USE MODD_PAST_FIELD_n
-USE MODD_CH_PH_n
-USE MODD_PRECIP_n
-USE MODD_RADIATIONS_n
-USE MODD_REF_n
-USE MODD_TIME_n
-USE MODD_TURB_n
-!
-INTEGER, INTENT(IN) :: KFROM, KTO
-!
-!LOGICAL,SAVE :: GFIRST_CALL=.TRUE.
-INTEGER :: IID,IID2,IRESP
-CHARACTER(LEN=64) :: YMSG
-!
-WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO
-CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',TRIM(YMSG))
-!
-! IF (GFIRST_CALL) THEN
-!   !This is necessary because the first time this subroutine is called
-!   !the TFIELDLIST is not yet initialized.
-!   !The use of this subroutine is not useful the first timebecause the
-!   !data for the fields has not yet been allocated.
-!   GFIRST_CALL = .FALSE.
-!   RETURN
-! END IF
-!
-IF (.NOT.LFIELDLIST_ISINIT) THEN
-  CALL PRINT_MSG(NVERB_WARNING,'GEN','FIELDLIST_GOTO_MODEL','TFIELDLIST not yet initialized')
-  RETURN
-END IF
-!
-if (kfrom > nmodel_allocated .or. kto > nmodel_allocated ) &
-  call Print_msg( NVERB_FATAL, 'GEN', 'FIELDLIST_GOTO_MODEL', 'kfrom or kto > nmodel_allocated' )
-!
-! Initialize some pointers
-!
-!PW: TODO: check if still necessary as XRHODREFZ and XTHVREFZ are now initialiazed in ini_modeln even for KMI/=1 (29/01/2019)
-IF (KFROM == KTO) THEN
-  IF ( CPROGRAM/='NESPGD' .AND. CPROGRAM/='PGD' ) THEN
-    IF (.NOT.ALLOCATED(XRHODREFZ)) CALL PRINT_MSG(NVERB_FATAL,'GEN','FIELDLIST_GOTO_MODEL','XRHODREFZ not yet allocated')
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHOREFZ',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA=>XRHODREFZ
-    !
-    IF (.NOT.ALLOCATED(XTHVREFZ)) CALL PRINT_MSG(NVERB_FATAL,'GEN','FIELDLIST_GOTO_MODEL','XTHVREFZ not yet allocated')
-    CALL FIND_FIELD_ID_FROM_MNHNAME('THVREFZ',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA=>XTHVREFZ
-  END IF
-END IF
-!
-!
-!
-!
-! Save current state for allocated arrays
-!
-!
-!
-!
-!
-! MODD_FIELD_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZWS
-CALL FIND_FIELD_ID_FROM_MNHNAME('UT',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUT
-CALL FIND_FIELD_ID_FROM_MNHNAME('VT',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVT
-CALL FIND_FIELD_ID_FROM_MNHNAME('WT',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWT
-CALL FIND_FIELD_ID_FROM_MNHNAME('THT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTHT
-CALL FIND_FIELD_ID_FROM_MNHNAME('TKET', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTKET
-CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPABST
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHIT
-CALL FIND_FIELD_ID_FROM_MNHNAME('RT',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XRT
-!
-IF (ASSOCIATED(XRT)) THEN
-  IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RVT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RCT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RRT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RIT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RST',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RST)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RGT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
-  END IF
-ELSE
-  IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RST',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL()
-  END IF
-
-END IF
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSUPSAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('NACT',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNACT
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSSPRO
-CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNPRO
-CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSRCT
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSIGS
-!
-IF (CPROGRAM == 'MESONH') THEN
-  !
-  CALL FIND_FIELD_ID_FROM_MNHNAME('US_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRUS_PRES
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VS_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRVS_PRES
-  CALL FIND_FIELD_ID_FROM_MNHNAME('WS_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRWS_PRES
-  CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTHS_CLD
-  !
-  CALL FIND_FIELD_ID_FROM_MNHNAME('RS_CLD',IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XRRS_CLD
-  !
-  IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RVT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RCT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RRT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RIT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RST)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RGT)
-  END IF
-  IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
-  END IF
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR
-  CALL FIND_FIELD_ID_FROM_MNHNAME('ICEFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XICEFR
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CIT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCIT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRAINFR
-  !
-END IF
-!
-! MODD_PAST_FIELD_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('UM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUM
-CALL FIND_FIELD_ID_FROM_MNHNAME('VM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVM
-CALL FIND_FIELD_ID_FROM_MNHNAME('WM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWM
-CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDUM
-CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDVM
-CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDWM
-!
-! MODD_LIMA_PRECIP_SCAVENGING_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPAP',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPAP
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPAP',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPAP
-!
-! MODD_ELEC_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDU',IID,IRESP);  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDU
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDV',IID,IRESP);  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDV
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDW',IID,IRESP);  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDW
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_IAGGS
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_IDRYG
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_SDRYG
-CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XIND_RATE
-!
-! MODD_CH_PH_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHC
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHR
-!
-! MODD_LSFIELD_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSUM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSVM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSWM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSTHM
-IF (LUSERV) THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSRVM
-END IF
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXUM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXVM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXWM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYUM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYVM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYWM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXTHM
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYTHM
-!
-! MODD_DYN_n variables
-!
-!***NONE***
-!
-! MODD_ADV_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('TKEMS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTKEMS
-!
-! MODD_GRID_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZS',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZS
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZSMT
-CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XXHAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XYHAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XZHAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X0D(KFROM)%DATA => XZTOP
-CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDXHAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDYHAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('ALT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XZZ
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSXW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSXW
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSYW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSYW
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSZW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSZW
-CALL FIND_FIELD_ID_FROM_MNHNAME('COSSLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCOSSLOPE
-CALL FIND_FIELD_ID_FROM_MNHNAME('SINSLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSINSLOPE
-CALL FIND_FIELD_ID_FROM_MNHNAME('MAP',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMAP
-CALL FIND_FIELD_ID_FROM_MNHNAME('LAT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XLAT
-CALL FIND_FIELD_ID_FROM_MNHNAME('LON',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XLON
-!
-! MODD_TIME_n variables
-!
-!***NONE***
-!
-! MODD_PARAM_n variables
-!
-!***NONE***
-!
-! MODD_TURB_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('BL_DEPTH', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XBL_DEPTH
-CALL FIND_FIELD_ID_FROM_MNHNAME('SBL_DEPTH',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSBL_DEPTH
-CALL FIND_FIELD_ID_FROM_MNHNAME('WTHVMF',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWTHVMF
-!
-! MODD_REF_n variables
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('RHODREF',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRHODREF
-CALL FIND_FIELD_ID_FROM_MNHNAME('THVREF', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTHVREF
-!
-! MODD_RADIATIONS_n variables
-!
-IF (CPROGRAM=='MESONH') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHRAD',      IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHRAD
-  CALL FIND_FIELD_ID_FROM_MNHNAME('FLALWD',      IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XFLALWD
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIRFLASWD',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIRFLASWD
-  CALL FIND_FIELD_ID_FROM_MNHNAME('SCAFLASWD',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSCAFLASWD
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIRSRFSWD',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIRSRFSWD
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLEARCOL_TM1',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLEARCOL_TM1
-  CALL FIND_FIELD_ID_FROM_MNHNAME('ZENITH',      IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZENITH
-  CALL FIND_FIELD_ID_FROM_MNHNAME('AZIM',        IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XAZIM
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIR_ALB',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIR_ALB
-  CALL FIND_FIELD_ID_FROM_MNHNAME('SCA_ALB',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSCA_ALB
-  CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',        IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEMIS
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TSRAD',       IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XTSRAD
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN2 was not associated')
+  ALLOCATE(XLEN2)
+  call Goto_model_1field( 'LEN2', 1, 1, XLEN2 )
 END IF
 !
-! MODD_DEEP_CONVECTION_n variables
+IF (.NOT.ASSOCIATED(TDTMOD)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTMOD was not associated')
+  ALLOCATE(TDTMOD)
+  call Goto_model_1field( 'DTMOD', 1, 1, TDTMOD )
+END IF
 !
-IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCOUNTCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRVCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRCCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRICONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPACCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRSCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DSVCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XDSVCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRLFLXCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPRLFLXCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSFLXCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPRSFLXCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UMFCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUMFCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DMFCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDMFCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('MFCONV',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XMFCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CAPE',       IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCAPE
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLTOPCONV_LVL',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLTOPCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV_LVL',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLBASCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_RATE
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_RATE
-  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_TOTAL_NUMBER
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_TOTAL_NUMBER
+IF (.NOT.ASSOCIATED(TDTCUR)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTCUR was not associated')
+  ALLOCATE(TDTCUR)
+  call Goto_model_1field( 'DTCUR', 1, 1, TDTCUR )
 END IF
 !
-! MODD_GR_FIELD_n variables
+IF (.NOT.ASSOCIATED(TDTRAD_FULL)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_FULL was not associated')
+  ALLOCATE(TDTRAD_FULL)
+  call Goto_model_1field( 'DTRAD_FULL', 1, 1, TDTRAD_FULL )
+END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_ANIS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_ANISOTROPY
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_SLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_SLOPE
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_DIR',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_DIRECTION
-CALL FIND_FIELD_ID_FROM_MNHNAME('AVG_ZS',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XAVG_ZS
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIL_ZS',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSIL_ZS
-CALL FIND_FIELD_ID_FROM_MNHNAME('MAX_ZS',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMAX_ZS
-CALL FIND_FIELD_ID_FROM_MNHNAME('MIN_ZS',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMIN_ZS
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_STDEV
+IF (.NOT.ASSOCIATED(TDTRAD_CLONLY)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_CLONLY was not associated')
+  ALLOCATE(TDTRAD_CLONLY)
+  call Goto_model_1field( 'DTRAD_CLLY', 1, 1, TDTRAD_CLONLY )
+END IF
 !
-! MODD_PRECIP_n variables
+IF (.NOT.ASSOCIATED(TDTDCONV)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTDCONV was not associated')
+  ALLOCATE(TDTDCONV)
+  call Goto_model_1field( 'DTDCONV', 1, 1, TDTDCONV )
+END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRC
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRC
-CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINDEP
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACDEP
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRR
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XINPRR3D
-CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEVAP3D
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRR
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRS
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRS
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRG
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRG
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRH
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRH
+IF (.NOT.ASSOCIATED(CSURF)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' CSURF was not associated')
+  ALLOCATE(CHARACTER(LEN=4) :: CSURF)
+  CSURF = ''
+  call Goto_model_1field( 'SURF', 1, 1, CSURF )
+END IF
 !
-! MODD_DEF_EDDY_FLUX_n variables
+IF (.NOT.ASSOCIATED(XDRYMASST)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASST was not associated')
+  ALLOCATE(XDRYMASST)
+  call Goto_model_1field( 'DRYMASST', 1, 1, XDRYMASST )
+END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('VT_FLX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA         => XVTH_FLUX_M
-CALL FIND_FIELD_ID_FROM_MNHNAME('WT_FLX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA         => XWTH_FLUX_M
-CALL FIND_FIELD_ID_FROM_MNHNAME('RTHS_EDDY_FLUX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTHS_EDDY_FLUX
+IF (.NOT.ASSOCIATED(XDRYMASSS)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASSS was not associated')
+  ALLOCATE(XDRYMASSS)
+  call Goto_model_1field( 'DRYMASSS', 1, 1, XDRYMASSS )
+END IF
 !
-! MODD_DEF_EDDYUV_FLUX_n variables
+IF (.NOT.ASSOCIATED(NRIMX)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMX was not associated')
+  ALLOCATE(NRIMX)
+  call Goto_model_1field( 'RIMX', 1, 1, NRIMX )
+END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('VU_FLX',IID,IRESP);        TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVU_FLUX_M
-CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_EDDY_FLUX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRVS_EDDY_FLUX
+IF (.NOT.ASSOCIATED(NRIMY)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMY was not associated')
+  ALLOCATE(NRIMY)
+  call Goto_model_1field( 'RIMY', 1, 1, NRIMY )
+END IF
 !
-! MODD_HURR_FIELD_n variables
+IF (.NOT.ASSOCIATED(LHORELAX_UVWTH)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_UVWTH was not associated')
+  ALLOCATE(LHORELAX_UVWTH)
+  call Goto_model_1field( 'HORELAX_UVWTH', 1, 1, LHORELAX_UVWTH )
+END IF
 !
-IF (CPROGRAM=='REAL') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT15',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUTOT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT15',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVTOT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPTOT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTTOT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESTOT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPTOT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMTOT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQTOT
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT16',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUENV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT16',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVENV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPENV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTENV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESENV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPENV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMENV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQENV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT17',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUBASIC
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT17',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVBASIC
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPBAS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTBASIC
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESBAS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPBASIC
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMBAS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQBASIC
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VTDIS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVTDIS
+IF (.NOT.ASSOCIATED(LHORELAX_TKE)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_TKE was not associated')
+  ALLOCATE(LHORELAX_TKE)
+  call Goto_model_1field( 'HORELAX_TKE', 1, 1, LHORELAX_TKE )
 END IF
 !
-! MODD_FIRE variables
+END SUBROUTINE INI_FIELD_SCALARS
 !
-IF (CPROGRAM=='MESONH') THEN
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSPHI',      IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSPHI
-CALL FIND_FIELD_ID_FROM_MNHNAME('BMAP',       IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XBMAP
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMRFA',      IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMRFA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWF0',      IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWF0
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMR0',       IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMR0
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMR00',      IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMR00
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMIGNITION', IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMIGNITION
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMFUELTYPE', IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFUELTYPE
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FIRETAU',    IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFIRETAU
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMH', IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XFLUXPARAMH
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMW', IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XFLUXPARAMW
-CALL FIND_FIELD_ID_FROM_MNHNAME('FIRERW',     IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFIRERW
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMASE',      IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMASE
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMAWC',      IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMAWC
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWALKIG',   IID,IRESP);
-!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWALKIG
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDH',  IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFLUXHDH
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDW',  IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFLUXHDW
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMHWS',      IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMHWS
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDU',    IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDU
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDV',    IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDV
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDW',    IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDW
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROX',    IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMGRADOROX
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROY',    IID,IRESP);
-IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMGRADOROY
-END IF
 !
+SUBROUTINE FIELDLIST_GOTO_MODEL(KFROM, KTO)
 !
+USE MODD_REF
 !
+USE MODD_ADV_n
+USE MODD_CONF_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DEF_EDDY_FLUX_n
+USE MODD_DEF_EDDYUV_FLUX_n
+USE MODD_DYN_n
+USE MODD_ELEC_n
+USE MODD_FIELD_n
+USE MODD_GR_FIELD_n
+USE MODD_GRID_n
+USE MODD_HURR_FIELD_n
+USE MODD_LIMA_PRECIP_SCAVENGING_n
+USE MODD_LSFIELD_n
+USE MODD_OCEANH
+USE MODD_PARAM_n
+USE MODD_PAST_FIELD_n
+USE MODD_CH_PH_n
+USE MODD_PRECIP_n
+USE MODD_RADIATIONS_n
+USE MODD_REF_n
+USE MODD_TIME_n
+USE MODD_TURB_n
 !
-! Current model is set to model KTO
+INTEGER, INTENT(IN) :: KFROM, KTO
 !
+!LOGICAL,SAVE :: GFIRST_CALL=.TRUE.
+INTEGER :: IID,IID2,IRESP
+CHARACTER(LEN=64) :: YMSG
 !
+WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO
+CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',TRIM(YMSG))
 !
+! IF (GFIRST_CALL) THEN
+!   !This is necessary because the first time this subroutine is called
+!   !the TFIELDLIST is not yet initialized.
+!   !The use of this subroutine is not useful the first timebecause the
+!   !data for the fields has not yet been allocated.
+!   GFIRST_CALL = .FALSE.
+!   RETURN
+! END IF
 !
-IF( KFROM/=KTO) THEN
+IF (.NOT.LFIELDLIST_ISINIT) THEN
+  CALL PRINT_MSG(NVERB_WARNING,'GEN','FIELDLIST_GOTO_MODEL','TFIELDLIST not yet initialized')
+  RETURN
+END IF
 !
 ! MODD_FIELD_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS',  IID,IRESP); XZWS   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('UT',   IID,IRESP); XUT    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('VT',   IID,IRESP); XVT    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('WT',   IID,IRESP); XWT    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('THT',  IID,IRESP); XTHT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('TKET', IID,IRESP); XTKET  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP); XPABST => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHIT', IID,IRESP); XPHIT  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('RT',   IID,IRESP); XRT    => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA
-!
-IF (ASSOCIATED(XRT)) THEN
-  IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT)
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT)
-  END IF
-ELSE
-  IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
-  IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL()
-  END IF
+call Goto_model_1field( 'ZWS',   kfrom, kto, xzws   )
+call Goto_model_1field( 'UT',    kfrom, kto, xut    )
+call Goto_model_1field( 'VT',    kfrom, kto, xvt    )
+call Goto_model_1field( 'WT',    kfrom, kto, xwt    )
+call Goto_model_1field( 'THT',   kfrom, kto, xtht   )
+call Goto_model_1field( 'TKET',  kfrom, kto, xtket  )
+call Goto_model_1field( 'PABST', kfrom, kto, xpabst )
+call Goto_model_1field( 'PHIT',  kfrom, kto, xphit  )
+call Goto_model_1field( 'RT',    kfrom, kto, xrt    )
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME( 'RT', IID2, IRESP )
+
+IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RVT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RVT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RCT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RCT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RRT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RRT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RIT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RIT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RST', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RST)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RGT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RGT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT)
+END IF
+IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RHT', IID, IRESP )
+  call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+  if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
+  if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+  TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA   => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT)
 END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); XSUPSAT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('NACT',     IID,IRESP); XNACT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO',    IID,IRESP); XSSPRO  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO',     IID,IRESP); XNPRO   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',     IID,IRESP); XSRCT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',     IID,IRESP); XSIGS   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'SUPSATMAX', kfrom, kto, XSUPSAT )
+call Goto_model_1field( 'NACT',      kfrom, kto, XNACT   )
+call Goto_model_1field( 'SSPRO',     kfrom, kto, XSSPRO  )
+call Goto_model_1field( 'NPRO',      kfrom, kto, XNPRO   )
+call Goto_model_1field( 'SRCT',      kfrom, kto, XSRCT   )
+call Goto_model_1field( 'SIGS',      kfrom, kto, XSIGS   )
 !
 IF (CPROGRAM == 'MESONH') THEN
+  call Goto_model_1field( 'US_PRES', kfrom, kto, XRUS_PRES )
+  call Goto_model_1field( 'VS_PRES', kfrom, kto, XRVS_PRES )
+  call Goto_model_1field( 'WS_PRES', kfrom, kto, XRWS_PRES )
+  call Goto_model_1field( 'THS_CLD', kfrom, kto, XRTHS_CLD )
+
+  call Goto_model_1field( 'RS_CLD', kfrom, kto, XRRS_CLD )
   !
-  CALL FIND_FIELD_ID_FROM_MNHNAME('RS_CLD',IID,IRESP); XRRS_CLD => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA
-  !
-  IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT)
+  CALL FIND_FIELD_ID_FROM_MNHNAME( 'RS_CLD', IID2, IRESP )
+
+  IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RVT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT)
+  IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RCT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT)
+  IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RRT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT)
+  IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RIT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RST>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST)
+  IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RST)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT)
+  IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RGT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT)
   END IF
-  IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN
-    CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID2,IRESP)
-    TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT)
+  IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID,IRESP)
+    call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+    if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
+    if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) &
+    TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT)
   END IF
-  !
-  CALL FIND_FIELD_ID_FROM_MNHNAME('US_PRES',IID,IRESP); XRUS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VS_PRES',IID,IRESP); XRVS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('WS_PRES',IID,IRESP); XRWS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); XRTHS_CLD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',  IID,IRESP); XCLDFR    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('ICEFR',  IID,IRESP); XICEFR    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CIT',    IID,IRESP); XCIT      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR',  IID,IRESP); XRAINFR   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+
+  call Goto_model_1field( 'CLDFR',  kfrom, kto, XCLDFR  )
+  call Goto_model_1field( 'ICEFR',  kfrom, kto, XICEFR  )
+  call Goto_model_1field( 'CIT',    kfrom, kto, XCIT    )
+  call Goto_model_1field( 'RAINFR', kfrom, kto, XRAINFR )
 END IF
 !
 ! MODD_PAST_FIELD_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('UM', IID,IRESP); XUM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('VM', IID,IRESP); XVM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('WM', IID,IRESP); XWM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); XDUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); XDVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); XDWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'UM',  kfrom, kto, XUM  )
+call Goto_model_1field( 'VM',  kfrom, kto, XVM  )
+call Goto_model_1field( 'WM',  kfrom, kto, XWM  )
+call Goto_model_1field( 'DUM', kfrom, kto, XDUM )
+call Goto_model_1field( 'DVM', kfrom, kto, XDVM )
+call Goto_model_1field( 'DWM', kfrom, kto, XDWM )
 !
 ! MODD_LIMA_PRECIP_SCAVENGING_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPAP',IID,IRESP); XINPAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPAP',IID,IRESP); XACPAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+call Goto_model_1field( 'INPAP', kfrom, kto, XINPAP )
+call Goto_model_1field( 'ACPAP', kfrom, kto, XACPAP )
 !
 ! MODD_ELEC_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDU',IID,IRESP);  XEFIELDU  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDV',IID,IRESP);  XEFIELDV  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDW',IID,IRESP);  XEFIELDW  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP); XNI_IAGGS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP); XNI_IDRYG => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP); XNI_SDRYG => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP); XIND_RATE => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'EFIELDU',  kfrom, kto, XEFIELDU  )
+call Goto_model_1field( 'EFIELDV',  kfrom, kto, XEFIELDV  )
+call Goto_model_1field( 'EFIELDW',  kfrom, kto, XEFIELDW  )
+call Goto_model_1field( 'NI_IAGGS', kfrom, kto, XNI_IAGGS )
+call Goto_model_1field( 'NI_IDRYG', kfrom, kto, XNI_IDRYG )
+call Goto_model_1field( 'NI_SDRYG', kfrom, kto, XNI_SDRYG )
+call Goto_model_1field( 'INDUC_CG', kfrom, kto, XIND_RATE )
 !
 ! MODD_CH_PH_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); XPHC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); XPHR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'PHC', kfrom, kto, XPHC )
+call Goto_model_1field( 'PHR', kfrom, kto, XPHR )
 !
 ! MODD_LSFIELD_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); XLSUM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSVM', IID,IRESP); XLSVM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSWM', IID,IRESP); XLSWM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSTHM',IID,IRESP); XLSTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'LSUM',  kfrom, kto, XLSUM  )
+call Goto_model_1field( 'LSVM',  kfrom, kto, XLSVM  )
+call Goto_model_1field( 'LSWM',  kfrom, kto, XLSWM  )
+call Goto_model_1field( 'LSTHM', kfrom, kto, XLSTHM )
 IF (LUSERV) THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP); XLSRVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-END IF
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXUM', IID,IRESP); XLBXUM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXVM', IID,IRESP); XLBXVM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXWM', IID,IRESP); XLBXWM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYUM', IID,IRESP); XLBYUM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYVM', IID,IRESP); XLBYVM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYWM', IID,IRESP); XLBYWM  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBXTHM',IID,IRESP); XLBXTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LBYTHM',IID,IRESP); XLBYTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASST',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
-END IF
-XDRYMASST => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
+  call Goto_model_1field( 'LSRVM', kfrom, kto, XLSRVM )
 END IF
-XDRYMASSS => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
+call Goto_model_1field( 'LBXUM',  kfrom, kto, XLBXUM  )
+call Goto_model_1field( 'LBXVM',  kfrom, kto, XLBXVM  )
+call Goto_model_1field( 'LBXWM',  kfrom, kto, XLBXWM  )
+call Goto_model_1field( 'LBYUM',  kfrom, kto, XLBYUM  )
+call Goto_model_1field( 'LBYVM',  kfrom, kto, XLBYVM  )
+call Goto_model_1field( 'LBYWM',  kfrom, kto, XLBYWM  )
+call Goto_model_1field( 'LBXTHM', kfrom, kto, XLBXTHM )
+call Goto_model_1field( 'LBYTHM', kfrom, kto, XLBYTHM )
+
+call Goto_model_1field( 'DRYMASST', kfrom, kto, XDRYMASST )
+call Goto_model_1field( 'DRYMASSS', kfrom, kto, XDRYMASSS )
 !
 ! MODD_DYN_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('RIMX',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)
-END IF
-NRIMX => TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('RIMY',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)
-END IF
-NRIMY => TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_UVWTH',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)
-END IF
-LHORELAX_UVWTH => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_TKE',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)
-END IF
-LHORELAX_TKE => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA
+call Goto_model_1field( 'RIMX', kfrom, kto, NRIMX )
+call Goto_model_1field( 'RIMY', kfrom, kto, NRIMY )
+call Goto_model_1field( 'HORELAX_UVWTH', kfrom, kto, LHORELAX_UVWTH )
+call Goto_model_1field( 'HORELAX_TKE',   kfrom, kto, LHORELAX_TKE   )
 !
 ! MODD_ADV_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('TKEMS',IID,IRESP); XRTKEMS=>TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'TKEMS', kfrom, kto, XRTKEMS  )
 !
 ! MODD_GRID_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZS',   IID,IRESP); XZS    => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); XZSMT  => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); XXHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); XYHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); XZHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
-END IF
-XZTOP  => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); XDXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); XDYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('SLEVE',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)
-END IF
-LSLEVE => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('LEN1',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
-END IF
-XLEN1 => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('LEN2',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
-END IF
-XLEN2 => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('ALT',     IID,IRESP); XZZ       => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSXW',IID,IRESP); XDIRCOSXW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSYW',IID,IRESP); XDIRCOSYW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSZW',IID,IRESP); XDIRCOSZW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('COSSLOPE',IID,IRESP); XCOSSLOPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SINSLOPE',IID,IRESP); XSINSLOPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('MAP',  IID,IRESP); XMAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LAT',  IID,IRESP); XLAT => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('LON',  IID,IRESP); XLON => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+call Goto_model_1field( 'ZS'  ,  kfrom, kto, XZS    )
+call Goto_model_1field( 'ZSMT',  kfrom, kto, XZSMT  )
+call Goto_model_1field( 'XHAT',  kfrom, kto, XXHAT  )
+call Goto_model_1field( 'YHAT',  kfrom, kto, XYHAT  )
+call Goto_model_1field( 'XHATM', kfrom, kto, XXHATM )
+call Goto_model_1field( 'YHATM', kfrom, kto, XYHATM )
+call Goto_model_1field( 'ZHAT',  kfrom, kto, XZHAT  )
+call Goto_model_1field( 'ZHATM', kfrom, kto, XZHATM )
+call Goto_model_1field( 'HAT_BOUND',  kfrom, kto, XHAT_BOUND  )
+call Goto_model_1field( 'HATM_BOUND', kfrom, kto, XHATM_BOUND )
+call Goto_model_1field( 'ZTOP',  kfrom, kto, XZTOP  )
+call Goto_model_1field( 'DXHAT', kfrom, kto, XDXHAT )
+call Goto_model_1field( 'DYHAT', kfrom, kto, XDYHAT )
+call Goto_model_1field( 'SLEVE', kfrom, kto, LSLEVE )
+call Goto_model_1field( 'LEN1',  kfrom, kto, XLEN1  )
+call Goto_model_1field( 'LEN2',  kfrom, kto, XLEN2  )
+call Goto_model_1field( 'ALT',   kfrom, kto, XZZ    )
+call Goto_model_1field( 'DIRCOSXW', kfrom, kto, XDIRCOSXW )
+call Goto_model_1field( 'DIRCOSYW', kfrom, kto, XDIRCOSYW )
+call Goto_model_1field( 'DIRCOSZW', kfrom, kto, XDIRCOSZW )
+call Goto_model_1field( 'COSSLOPE', kfrom, kto, XCOSSLOPE )
+call Goto_model_1field( 'SINSLOPE', kfrom, kto, XSINSLOPE )
+call Goto_model_1field( 'MAP',      kfrom, kto, XMAP )
+call Goto_model_1field( 'LAT',      kfrom, kto, XLAT )
+call Goto_model_1field( 'LON',      kfrom, kto, XLON )
+call Goto_model_1field( 'XHAT_ll',  kfrom, kto, XXHAT_ll  )
+call Goto_model_1field( 'YHAT_ll',  kfrom, kto, XYHAT_ll  )
+call Goto_model_1field( 'XHATM_ll', kfrom, kto, XXHATM_ll )
+call Goto_model_1field( 'YHATM_ll', kfrom, kto, XYHATM_ll )
 !
 ! MODD_TIME_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('DTMOD',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)
-END IF
-TDTMOD => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DTCUR',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)
-END IF
-TDTCUR => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_FULL',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)
-END IF
-TDTRAD_FULL => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_CLLY',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)
-END IF
-TDTRAD_CLONLY => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA
-!
-CALL FIND_FIELD_ID_FROM_MNHNAME('DTDCONV',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)
-END IF
-TDTDCONV => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA
+call Goto_model_1field( 'DTMOD',      kfrom, kto, TDTMOD        )
+call Goto_model_1field( 'DTCUR',      kfrom, kto, TDTCUR        )
+call Goto_model_1field( 'DTRAD_FULL', kfrom, kto, TDTRAD_FULL   )
+call Goto_model_1field( 'DTRAD_CLLY', kfrom, kto, TDTRAD_CLONLY )
+call Goto_model_1field( 'DTDCONV',    kfrom, kto, TDTDCONV      )
 !
 ! MODD_PARAM_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SURF',IID,IRESP)
-IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA)) THEN
-  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
-                 'TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
-  ALLOCATE(CHARACTER(LEN=4) :: TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA)
-  TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA=''
-END IF
-CSURF => TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA
+call Goto_model_1field( 'SURF', kfrom, kto, CSURF )
 !
 ! MODD_TURB_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('BL_DEPTH', IID,IRESP); XBL_DEPTH  => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SBL_DEPTH',IID,IRESP); XSBL_DEPTH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('WTHVMF',   IID,IRESP); XWTHVMF    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'BL_DEPTH',  kfrom, kto, XBL_DEPTH  )
+call Goto_model_1field( 'SBL_DEPTH', kfrom, kto, XSBL_DEPTH )
+call Goto_model_1field( 'WTHVMF',    kfrom, kto, XWTHVMF    )
 !
 ! MODD_REF_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('RHODREF',IID,IRESP); XRHODREF => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('THVREF', IID,IRESP); XTHVREF  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'RHODREF', kfrom, kto, XRHODREF )
+call Goto_model_1field( 'THVREF',  kfrom, kto, XTHVREF  )
 !
 ! MODD_RADIATIONS_n variables
 !
 IF (CPROGRAM=='MESONH') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHRAD',      IID,IRESP); XDTHRAD       => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('FLALWD',      IID,IRESP); XFLALWD       => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIRFLASWD',   IID,IRESP); XDIRFLASWD    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('SCAFLASWD',   IID,IRESP); XSCAFLASWD    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIRSRFSWD',   IID,IRESP); XDIRSRFSWD    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLEARCOL_TM1',IID,IRESP); NCLEARCOL_TM1 => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('ZENITH',      IID,IRESP); XZENITH       => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('AZIM',        IID,IRESP); XAZIM         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DIR_ALB',     IID,IRESP); XDIR_ALB      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('SCA_ALB',     IID,IRESP); XSCA_ALB      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',        IID,IRESP); XEMIS         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TSRAD',       IID,IRESP); XTSRAD        => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  call Goto_model_1field( 'DTHRAD',       kfrom, kto, XDTHRAD       )
+  call Goto_model_1field( 'FLALWD',       kfrom, kto, XFLALWD       )
+  call Goto_model_1field( 'DIRFLASWD',    kfrom, kto, XDIRFLASWD    )
+  call Goto_model_1field( 'SCAFLASWD',    kfrom, kto, XSCAFLASWD    )
+  call Goto_model_1field( 'DIRSRFSWD',    kfrom, kto, XDIRSRFSWD    )
+  call Goto_model_1field( 'CLEARCOL_TM1', kfrom, kto, NCLEARCOL_TM1 )
+  call Goto_model_1field( 'ZENITH',       kfrom, kto, XZENITH       )
+  call Goto_model_1field( 'AZIM',         kfrom, kto, XAZIM         )
+  call Goto_model_1field( 'DIR_ALB',      kfrom, kto, XDIR_ALB      )
+  call Goto_model_1field( 'SCA_ALB',      kfrom, kto, XSCA_ALB      )
+  call Goto_model_1field( 'EMIS',         kfrom, kto, XEMIS         )
+  call Goto_model_1field( 'TSRAD',        kfrom, kto, XTSRAD        )
+END IF
+!
+! MODD_FIRE variables
+!
+IF (     TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG'  .OR. TRIM(CPROGRAM) == 'REAL' &
+    .OR. TRIM(CPROGRAM) == 'LFICDF' .OR. TRIM(CPROGRAM) == 'SPAWN'                               ) THEN
+  call Goto_model_1field( 'LSPHI', kfrom, kto, XLSPHI )
+  call Goto_model_1field( 'BMAP', kfrom, kto, XBMAP )
+  call Goto_model_1field( 'FMASE', kfrom, kto, XFMASE )
+  call Goto_model_1field( 'FMAWC', kfrom, kto, XFMAWC )
+  call Goto_model_1field( 'FMWINDU', kfrom, kto, XFMWINDU )
+  call Goto_model_1field( 'FMWINDV', kfrom, kto, XFMWINDV )
+  call Goto_model_1field( 'FMWINDW', kfrom, kto, XFMWINDW )
+  call Goto_model_1field( 'FMHWS', kfrom, kto, XFMHWS )
+  call Goto_model_1field( 'FIRERW', kfrom, kto, XFIRERW )
+  call Goto_model_1field( 'FMR0', kfrom, kto, XFMR0 )
+  call Goto_model_1field( 'FMFLUXHDH', kfrom, kto, XFMFLUXHDH )
+  call Goto_model_1field( 'FMFLUXHDW', kfrom, kto, XFMFLUXHDW )
+  call Goto_model_1field( 'FMGRADOROX', kfrom, kto, XFMGRADOROX )
+  call Goto_model_1field( 'FMGRADOROY', kfrom, kto, XFMGRADOROY )
 END IF
 !
 ! MODD_DEEP_CONVECTION_n variables
 !
 IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',  IID,IRESP); NCOUNTCONV       => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',    IID,IRESP); XDTHCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',    IID,IRESP); XDRVCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',    IID,IRESP); XDRCCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',    IID,IRESP); XDRICONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',     IID,IRESP); XPRCONV          => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',    IID,IRESP); XPACCONV         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',    IID,IRESP); XPRSCONV         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DSVCONV',    IID,IRESP); XDSVCONV         => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRLFLXCONV', IID,IRESP); XPRLFLXCONV      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSFLXCONV', IID,IRESP); XPRSFLXCONV      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UMFCONV',    IID,IRESP); XUMFCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DMFCONV',    IID,IRESP); XDMFCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('MFCONV',     IID,IRESP); XMFCONV          => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CAPE',       IID,IRESP); XCAPE            => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLTOPCONV_LVL',IID,IRESP); NCLTOPCONV     => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV_LVL',IID,IRESP); NCLBASCONV     => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE',    IID,IRESP); XIC_RATE         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE',    IID,IRESP); XCG_RATE         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); XIC_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); XCG_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  call Goto_model_1field( 'COUNTCONV',     kfrom, kto, NCOUNTCONV       )
+  call Goto_model_1field( 'DTHCONV',       kfrom, kto, XDTHCONV         )
+  call Goto_model_1field( 'DRVCONV',       kfrom, kto, XDRVCONV         )
+  call Goto_model_1field( 'DRCCONV',       kfrom, kto, XDRCCONV         )
+  call Goto_model_1field( 'DRICONV',       kfrom, kto, XDRICONV         )
+  call Goto_model_1field( 'PRCONV',        kfrom, kto, XPRCONV          )
+  call Goto_model_1field( 'PACCONV',       kfrom, kto, XPACCONV         )
+  call Goto_model_1field( 'PRSCONV',       kfrom, kto, XPRSCONV         )
+  call Goto_model_1field( 'DSVCONV',       kfrom, kto, XDSVCONV         )
+  call Goto_model_1field( 'PRLFLXCONV',    kfrom, kto, XPRLFLXCONV      )
+  call Goto_model_1field( 'PRSFLXCONV',    kfrom, kto, XPRSFLXCONV      )
+  call Goto_model_1field( 'UMFCONV',       kfrom, kto, XUMFCONV         )
+  call Goto_model_1field( 'DMFCONV',       kfrom, kto, XDMFCONV         )
+  call Goto_model_1field( 'MFCONV',        kfrom, kto, XMFCONV          )
+  call Goto_model_1field( 'CAPE',          kfrom, kto, XCAPE            )
+  call Goto_model_1field( 'CLTOPCONV_LVL', kfrom, kto, NCLTOPCONV       )
+  call Goto_model_1field( 'CLBASCONV_LVL', kfrom, kto, NCLBASCONV       )
+  call Goto_model_1field( 'IC_RATE',       kfrom, kto, XIC_RATE         )
+  call Goto_model_1field( 'CG_RATE',       kfrom, kto, XCG_RATE         )
+  call Goto_model_1field( 'IC_TOTAL_NB',   kfrom, kto, XIC_TOTAL_NUMBER )
+  call Goto_model_1field( 'CG_TOTAL_NB',   kfrom, kto, XCG_TOTAL_NUMBER )
 END IF
 !
 ! MODD_GR_FIELD_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_ANIS', IID,IRESP); XSSO_ANISOTROPY => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_SLOPE',IID,IRESP); XSSO_SLOPE      => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_DIR',  IID,IRESP); XSSO_DIRECTION  => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('AVG_ZS',   IID,IRESP); XAVG_ZS         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIL_ZS',   IID,IRESP); XSIL_ZS         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('MAX_ZS',   IID,IRESP); XMAX_ZS         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('MIN_ZS',   IID,IRESP); XMIN_ZS         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); XSSO_STDEV      => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+call Goto_model_1field( 'SSO_ANIS',  kfrom, kto, XSSO_ANISOTROPY )
+call Goto_model_1field( 'SSO_SLOPE', kfrom, kto, XSSO_SLOPE      )
+call Goto_model_1field( 'SSO_DIR',   kfrom, kto, XSSO_DIRECTION  )
+call Goto_model_1field( 'AVG_ZS',    kfrom, kto, XAVG_ZS         )
+call Goto_model_1field( 'SIL_ZS',    kfrom, kto, XSIL_ZS         )
+call Goto_model_1field( 'MAX_ZS',    kfrom, kto, XMAX_ZS         )
+call Goto_model_1field( 'MIN_ZS',    kfrom, kto, XMIN_ZS         )
+call Goto_model_1field( 'SSO_STDEV', kfrom, kto, XSSO_STDEV      )
 !
 ! MODD_PRECIP_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',  IID,IRESP); XINPRC   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',  IID,IRESP); XACPRC   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',  IID,IRESP); XINDEP   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',  IID,IRESP); XACDEP   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',  IID,IRESP); XINPRR   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); XINPRR3D => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); XEVAP3D  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',  IID,IRESP); XACPRR   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',  IID,IRESP); XINPRS   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',  IID,IRESP); XACPRS   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',  IID,IRESP); XINPRG   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',  IID,IRESP); XACPRG   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',  IID,IRESP); XINPRH   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',  IID,IRESP); XACPRH   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-!
+call Goto_model_1field( 'INPRC',   kfrom, kto, XINPRC   )
+call Goto_model_1field( 'ACPRC',   kfrom, kto, XACPRC   )
+call Goto_model_1field( 'INDEP',   kfrom, kto, XINDEP   )
+call Goto_model_1field( 'ACDEP',   kfrom, kto, XACDEP   )
+call Goto_model_1field( 'INPRR',   kfrom, kto, XINPRR   )
+call Goto_model_1field( 'INPRR3D', kfrom, kto, XINPRR3D )
+call Goto_model_1field( 'EVAP3D',  kfrom, kto, XEVAP3D  )
+call Goto_model_1field( 'ACPRR',   kfrom, kto, XACPRR   )
+call Goto_model_1field( 'INPRS',   kfrom, kto, XINPRS   )
+call Goto_model_1field( 'ACPRS',   kfrom, kto, XACPRS   )
+call Goto_model_1field( 'INPRG',   kfrom, kto, XINPRG   )
+call Goto_model_1field( 'ACPRG',   kfrom, kto, XACPRG   )
+call Goto_model_1field( 'INPRH',   kfrom, kto, XINPRH   )
+call Goto_model_1field( 'ACPRH',   kfrom, kto, XACPRH   )
 !
 ! MODD_DEF_EDDY_FLUX_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('VT_FLX',        IID,IRESP); XVTH_FLUX_M     => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('WT_FLX',        IID,IRESP); XWTH_FLUX_M     => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('RTHS_EDDY_FLUX',IID,IRESP); XRTHS_EDDY_FLUX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+call Goto_model_1field( 'VT_FLX',         kfrom, kto, XVTH_FLUX_M      )
+call Goto_model_1field( 'WT_FLX',         kfrom, kto, XWTH_FLUX_M      )
+call Goto_model_1field( 'RTHS_EDDY_FLUX', kfrom, kto, XRTHS_EDDY_FLUX  )
 !
 ! MODD_DEF_EDDYUV_FLUX_n variables
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('VU_FLX',       IID,IRESP); XVU_FLUX_M     => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_EDDY_FLUX',IID,IRESP); XRVS_EDDY_FLUX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!
+call Goto_model_1field( 'VU_FLX',        kfrom, kto, XVU_FLUX_M     )
+call Goto_model_1field( 'RVS_EDDY_FLUX', kfrom, kto, XRVS_EDDY_FLUX )
 !
 ! MODD_HURR_FIELD_n variables
 !
 IF (CPROGRAM=='REAL') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT15',   IID,IRESP); XUTOT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT15',   IID,IRESP); XVTOT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPTOT',IID,IRESP); XTTOT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESTOT',IID,IRESP); XPTOT   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMTOT', IID,IRESP); XQTOT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT16',   IID,IRESP); XUENV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT16',   IID,IRESP); XVENV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPENV',IID,IRESP); XTENV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESENV',IID,IRESP); XPENV   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMENV', IID,IRESP); XQENV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('UT17',   IID,IRESP); XUBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VT17',   IID,IRESP); XVBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPBAS',IID,IRESP); XTBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRESBAS',IID,IRESP); XPBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('HUMBAS', IID,IRESP); XQBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('VTDIS',  IID,IRESP); XVTDIS  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-END IF
-!
-!
-! MODD_FIRE variables
-!
-IF (CPROGRAM=='MESONH') THEN
-CALL FIND_FIELD_ID_FROM_MNHNAME('LSPHI',         IID,IRESP); XLSPHI      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('BMAP',          IID,IRESP); XBMAP       => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMRFA',         IID,IRESP); XFMRFA      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWF0',         IID,IRESP); XFMWF0      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMR0',          IID,IRESP); XFMR0       => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMR00',         IID,IRESP); XFMR00      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMIGNITION',    IID,IRESP); XFMIGNITION => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMFUELTYPE',    IID,IRESP); XFMFUELTYPE => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FIRETAU',       IID,IRESP); XFIRETAU    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMH',    IID,IRESP); XFLUXPARAMH => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMW',    IID,IRESP); XFLUXPARAMW => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FIRERW',        IID,IRESP); XFIRERW     => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMASE',         IID,IRESP); XFMASE      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMAWC',         IID,IRESP); XFMAWC      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWALKIG',      IID,IRESP); XFMWALKIG   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDH',     IID,IRESP); XFMFLUXHDH  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDW',     IID,IRESP); XFMFLUXHDW  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMHWS',         IID,IRESP); XFMHWS      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDU',       IID,IRESP); XFMWINDU    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDV',       IID,IRESP); XFMWINDV    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDW',       IID,IRESP); XFMWINDW    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROX',    IID,IRESP); XFMGRADOROX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROY',    IID,IRESP); XFMGRADOROY => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  call Goto_model_1field( 'UT15',    kfrom, kto, XUTOT   )
+  call Goto_model_1field( 'VT15',    kfrom, kto, XVTOT   )
+  call Goto_model_1field( 'TEMPTOT', kfrom, kto, XTTOT   )
+  call Goto_model_1field( 'PRESTOT', kfrom, kto, XPTOT   )
+  call Goto_model_1field( 'HUMTOT',  kfrom, kto, XQTOT   )
+  call Goto_model_1field( 'UT16',    kfrom, kto, XUENV   )
+  call Goto_model_1field( 'VT16',    kfrom, kto, XVENV   )
+  call Goto_model_1field( 'TEMPENV', kfrom, kto, XTENV   )
+  call Goto_model_1field( 'PRESENV', kfrom, kto, XPENV   )
+  call Goto_model_1field( 'HUMENV',  kfrom, kto, XQENV   )
+  call Goto_model_1field( 'UT17',    kfrom, kto, XUBASIC )
+  call Goto_model_1field( 'VT17',    kfrom, kto, XVBASIC )
+  call Goto_model_1field( 'TEMPBAS', kfrom, kto, XTBASIC )
+  call Goto_model_1field( 'PRESBAS', kfrom, kto, XPBASIC )
+  call Goto_model_1field( 'HUMBAS',  kfrom, kto, XQBASIC )
+  call Goto_model_1field( 'VTDIS',   kfrom, kto, XVTDIS  )
 END IF
 !
-!
-END IF !KFROM/=KTO
-!
 END SUBROUTINE FIELDLIST_GOTO_MODEL
 
 
-subroutine Fieldlist_nmodel_resize( kmodelnew )
+subroutine Add_field2list( tpfield )
+
+implicit none
+
+type(tfielddata) :: tpfield
+
+character(len=64) :: ymsg
+type(tfielddata), allocatable, dimension(:) :: tzfieldlistnew
+
+!Check if tfieldlist big enough and enlarge it if necessary
+if ( nfields_used >= NMAXFIELDS ) then
+  Allocate( tzfieldlistnew(nmaxfields + nmaxfieldstep) )
+  tzfieldlistnew(1 : nmaxfields) = tfieldlist(1 : nmaxfields)
+  call Move_alloc( from = tzfieldlistnew, to = tfieldlist )
+  nmaxfields = nmaxfields + nmaxfieldstep
+  Write( ymsg, '( "nmaxfields increased from ", i5, " to ", i5 )') nmaxfields - nmaxfieldstep, nmaxfields
+  call Print_msg( NVERB_DEBUG, 'GEN', 'Add_field2list', Trim( ymsg ) )
+end if
+
+nfields_used = nfields_used + 1
+
+tfieldlist(nfields_used) = tpfield
+
+end subroutine Add_field2list
+
+
+subroutine Goto_model_1field_c0d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),          intent(in)    :: hname
+integer,                   intent(in)    :: kfrom
+integer,                   intent(in)    :: kto
+character(len=*), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_c0d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_c0d(kfrom)%data => pdata
+if ( kfrom /= kto ) then
+  if ( .not. Associated( tfieldlist(iid)%tfield_c0d(kto)%data ) ) then
+    Allocate( character(len=Len(pdata)) :: tfieldlist(iid)%tfield_c0d(kto)%data )
+    tfieldlist(iid)%tfield_c0d(kto)%data(:) = ''
+  end if
+  pdata => tfieldlist(iid)%tfield_c0d(kto)%data
+end if
+
+end subroutine Goto_model_1field_c0d
+
+
+subroutine Goto_model_1field_c1d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                        intent(in)    :: hname
+integer,                                 intent(in)    :: kfrom
+integer,                                 intent(in)    :: kto
+character(len=*), dimension(:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+integer :: ji
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_c1d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_c1d(kfrom)%data => pdata
+if ( kfrom /= kto ) then
+  if ( .not. Associated( tfieldlist(iid)%tfield_c1d(kto)%data ) ) then
+    Allocate( character(len=Len(pdata)) :: tfieldlist(iid)%tfield_c1d(kto)%data(Size(pdata)) )
+    do ji = 1, Size(pdata)
+      tfieldlist(iid)%tfield_c1d(kto)%data(ji) = ''
+    end do
+  end if
+  pdata => tfieldlist(iid)%tfield_c1d(kto)%data
+end if
+
+end subroutine Goto_model_1field_c1d
+
+
+subroutine Goto_model_1field_l0d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),          intent(in)    :: hname
+integer,                   intent(in)    :: kfrom
+integer,                   intent(in)    :: kto
+logical,          pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_l0d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_l0d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_l0d(kto)%data
+
+end subroutine Goto_model_1field_l0d
+
+
+subroutine Goto_model_1field_l1d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),               intent(in)    :: hname
+integer,                        intent(in)    :: kfrom
+integer,                        intent(in)    :: kto
+logical, dimension(:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_l1d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_l1d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_l1d(kto)%data
+
+end subroutine Goto_model_1field_l1d
+
+
+subroutine Goto_model_1field_n0d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),          intent(in)    :: hname
+integer,                   intent(in)    :: kfrom
+integer,                   intent(in)    :: kto
+integer,          pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_n0d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_n0d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n0d(kto)%data
+
+end subroutine Goto_model_1field_n0d
+
+
+subroutine Goto_model_1field_n1d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),               intent(in)    :: hname
+integer,                        intent(in)    :: kfrom
+integer,                        intent(in)    :: kto
+integer, dimension(:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_n1d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_n1d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n1d(kto)%data
+
+end subroutine Goto_model_1field_n1d
+
+
+subroutine Goto_model_1field_n2d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                 intent(in)    :: hname
+integer,                          intent(in)    :: kfrom
+integer,                          intent(in)    :: kto
+integer, dimension(:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_n2d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_n2d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n2d(kto)%data
+
+end subroutine Goto_model_1field_n2d
+
+
+subroutine Goto_model_1field_n3d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                   intent(in)    :: hname
+integer,                            intent(in)    :: kfrom
+integer,                            intent(in)    :: kto
+integer, dimension(:,:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_n3d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_n3d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n3d(kto)%data
+
+end subroutine Goto_model_1field_n3d
+
+
+subroutine Goto_model_1field_t0d( hname, kfrom, kto, pdata )
+
+use modd_type_date, only: date_time
+
+implicit none
+
+character(len=*),          intent(in)    :: hname
+integer,                   intent(in)    :: kfrom
+integer,                   intent(in)    :: kto
+type(date_time),  pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_t0d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_t0d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_t0d(kto)%data
+
+end subroutine Goto_model_1field_t0d
+
+
+subroutine Goto_model_1field_t1d( hname, kfrom, kto, pdata )
+
+use modd_type_date, only: date_time
+
+implicit none
+
+character(len=*),                       intent(in)    :: hname
+integer,                                intent(in)    :: kfrom
+integer,                                intent(in)    :: kto
+type(date_time), dimension(:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_t1d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_t1d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_t1d(kto)%data
+
+end subroutine Goto_model_1field_t1d
+
+
+subroutine Goto_model_1field_x0d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),          intent(in)    :: hname
+integer,                   intent(in)    :: kfrom
+integer,                   intent(in)    :: kto
+real,             pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x0d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x0d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x0d(kto)%data
+
+end subroutine Goto_model_1field_x0d
+
+
+subroutine Goto_model_1field_x1d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),               intent(in)    :: hname
+integer,                        intent(in)    :: kfrom
+integer,                        intent(in)    :: kto
+real,    dimension(:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x1d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x1d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x1d(kto)%data
+
+end subroutine Goto_model_1field_x1d
+
+
+subroutine Goto_model_1field_x2d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                 intent(in)    :: hname
+integer,                          intent(in)    :: kfrom
+integer,                          intent(in)    :: kto
+real,    dimension(:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x2d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x2d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x2d(kto)%data
+
+end subroutine Goto_model_1field_x2d
+
+
+subroutine Goto_model_1field_x3d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                   intent(in)    :: hname
+integer,                            intent(in)    :: kfrom
+integer,                            intent(in)    :: kto
+real,    dimension(:,:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data
+
+end subroutine Goto_model_1field_x3d
+
+
+subroutine Goto_model_1field_x4d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                     intent(in)    :: hname
+integer,                              intent(in)    :: kfrom
+integer,                              intent(in)    :: kto
+real,    dimension(:,:,:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x4d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x4d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x4d(kto)%data
+
+end subroutine Goto_model_1field_x4d
+
+
+subroutine Goto_model_1field_x5d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                       intent(in)    :: hname
+integer,                                intent(in)    :: kfrom
+integer,                                intent(in)    :: kto
+real,    dimension(:,:,:,:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x5d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x5d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x5d(kto)%data
+
+end subroutine Goto_model_1field_x5d
+
+
+subroutine Goto_model_1field_x6d( hname, kfrom, kto, pdata )
+
+implicit none
+
+character(len=*),                         intent(in)    :: hname
+integer,                                  intent(in)    :: kfrom
+integer,                                  intent(in)    :: kto
+real,    dimension(:,:,:,:,:,:), pointer, intent(inout) :: pdata
+
+integer :: iid
+integer :: iresp
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+call Extend_1field_x6d( tfieldlist(iid), Max( kfrom, kto ) )
+
+tfieldlist(iid)%tfield_x6d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x6d(kto)%data
+
+end subroutine Goto_model_1field_x6d
+
+
+subroutine Extend_1field_c0d( tpfield, ksize )
 
 implicit none
 
-integer, intent(in) :: kmodelnew
-
-character(len=10) :: ymsg
-integer           :: imodelmax
-integer           :: ji, jj
-type(tfieldptr_c0d), dimension(:), allocatable :: tfield_save_c0d
-type(tfieldptr_c1d), dimension(:), allocatable :: tfield_save_c1d
-type(tfieldptr_l0d), dimension(:), allocatable :: tfield_save_l0d
-type(tfieldptr_l1d), dimension(:), allocatable :: tfield_save_l1d
-type(tfieldptr_n0d), dimension(:), allocatable :: tfield_save_n0d
-type(tfieldptr_n1d), dimension(:), allocatable :: tfield_save_n1d
-type(tfieldptr_n2d), dimension(:), allocatable :: tfield_save_n2d
-type(tfieldptr_n3d), dimension(:), allocatable :: tfield_save_n3d
-type(tfieldptr_x0d), dimension(:), allocatable :: tfield_save_x0d
-type(tfieldptr_x1d), dimension(:), allocatable :: tfield_save_x1d
-type(tfieldptr_x2d), dimension(:), allocatable :: tfield_save_x2d
-type(tfieldptr_x3d), dimension(:), allocatable :: tfield_save_x3d
-type(tfieldptr_x4d), dimension(:), allocatable :: tfield_save_x4d
-type(tfieldptr_x5d), dimension(:), allocatable :: tfield_save_x5d
-type(tfieldptr_x6d), dimension(:), allocatable :: tfield_save_x6d
-type(tfieldptr_t0d), dimension(:), allocatable :: tfield_save_t0d
-
-write( ymsg, '( i4,"->",i4 )') nmodel_allocated, kmodelnew
-call Print_msg( NVERB_DEBUG, 'GEN', 'Fieldlist_nmodel_resize', trim( ymsg ) )
-
-!Nothing to do
-if ( kmodelnew == nmodel_allocated ) return
-
-imodelmax = max( kmodelnew, nmodel_allocated )
-
-allocate( tfield_save_c0d( imodelmax ) )
-allocate( tfield_save_c1d( imodelmax ) )
-allocate( tfield_save_l0d( imodelmax ) )
-allocate( tfield_save_l1d( imodelmax ) )
-allocate( tfield_save_n0d( imodelmax ) )
-allocate( tfield_save_n1d( imodelmax ) )
-allocate( tfield_save_n2d( imodelmax ) )
-allocate( tfield_save_n3d( imodelmax ) )
-allocate( tfield_save_x0d( imodelmax ) )
-allocate( tfield_save_x1d( imodelmax ) )
-allocate( tfield_save_x2d( imodelmax ) )
-allocate( tfield_save_x3d( imodelmax ) )
-allocate( tfield_save_x4d( imodelmax ) )
-allocate( tfield_save_x5d( imodelmax ) )
-allocate( tfield_save_x6d( imodelmax ) )
-allocate( tfield_save_t0d( imodelmax ) )
-
-do ji = 1, imodelmax
-  tfield_save_c0d(ji)%data => null()
-  tfield_save_c1d(ji)%data => null()
-  tfield_save_l0d(ji)%data => null()
-  tfield_save_l1d(ji)%data => null()
-  tfield_save_n0d(ji)%data => null()
-  tfield_save_n1d(ji)%data => null()
-  tfield_save_n2d(ji)%data => null()
-  tfield_save_n3d(ji)%data => null()
-  tfield_save_x0d(ji)%data => null()
-  tfield_save_x1d(ji)%data => null()
-  tfield_save_x2d(ji)%data => null()
-  tfield_save_x3d(ji)%data => null()
-  tfield_save_x4d(ji)%data => null()
-  tfield_save_x5d(ji)%data => null()
-  tfield_save_x6d(ji)%data => null()
-  tfield_save_t0d(ji)%data => null()
-end do
-
-do ji = 1, size( tfieldlist )
-  if ( allocated( tfieldlist(ji)%tfield_c0d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_c0d(jj)%data => tfieldlist(ji)%tfield_c0d(jj)%data
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_c0d), dimension(:), allocatable :: tzfield_c0d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_c0d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_c0d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_c0d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_c0d )
-    allocate(   tfieldlist(ji)%tfield_c0d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_c0d(jj)%data => tfield_save_c0d(jj)%data
-      tfield_save_c0d(jj)%data => null()
+  else
+    Allocate( tzfield_c0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_c0d)
+      tzfield_c0d(ji)%data => tpfield%tfield_c0d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_c0d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_c0d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_c0d) + 1, ksize
+      tzfield_c0d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_c0d, to = tpfield%tfield_c0d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_c0d
+
+
+subroutine Extend_1field_c1d( tpfield, ksize )
+
+implicit none
 
-  if ( allocated( tfieldlist(ji)%tfield_c1d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_c1d(jj)%data => tfieldlist(ji)%tfield_c1d(jj)%data
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_c1d), dimension(:), allocatable :: tzfield_c1d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_c1d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_c1d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_c1d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_c1d )
-    allocate(   tfieldlist(ji)%tfield_c1d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_c1d(jj)%data => tfield_save_c1d(jj)%data
-      tfield_save_c1d(jj)%data => null()
+  else
+    Allocate( tzfield_c1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_c1d)
+      tzfield_c1d(ji)%data => tpfield%tfield_c1d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_c1d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_c1d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_c1d) + 1, ksize
+      tzfield_c1d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_c1d, to = tpfield%tfield_c1d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_c1d
+
+
+subroutine Extend_1field_l0d( tpfield, ksize )
+
+implicit none
 
-  if ( allocated( tfieldlist(ji)%tfield_l0d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_l0d(jj)%data => tfieldlist(ji)%tfield_l0d(jj)%data
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_l0d), dimension(:), allocatable :: tzfield_l0d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_l0d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_l0d(ksize) )
+    do ji = 1, ksize
+      ! tpfield%tfield_l0d(ji)%data => null()
+      Allocate( tpfield%tfield_l0d(ji)%data )
+      tpfield%tfield_l0d(ji)%data = .false.
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_l0d )
-    allocate(   tfieldlist(ji)%tfield_l0d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_l0d(jj)%data => tfield_save_l0d(jj)%data
-      tfield_save_l0d(jj)%data => null()
+  else
+    Allocate( tzfield_l0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_l0d)
+      tzfield_l0d(ji)%data => tpfield%tfield_l0d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_l0d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_l0d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_l0d) + 1, ksize
+      ! tzfield_l0d(ji)%data => null()
+      Allocate( tzfield_l0d(ji)%data )
+      tzfield_l0d(ji)%data = .false.
     end do
+    call Move_alloc( from = tzfield_l0d, to = tpfield%tfield_l0d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_l0d
+
+
+subroutine Extend_1field_l1d( tpfield, ksize )
+
+implicit none
 
-  if ( allocated( tfieldlist(ji)%tfield_l1d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_l1d(jj)%data => tfieldlist(ji)%tfield_l1d(jj)%data
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_l1d), dimension(:), allocatable :: tzfield_l1d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_l1d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_l1d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_l1d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_l1d )
-    allocate(   tfieldlist(ji)%tfield_l1d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_l1d(jj)%data => tfield_save_l1d(jj)%data
-      tfield_save_l1d(jj)%data => null()
+  else
+    Allocate( tzfield_l1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_l1d)
+      tzfield_l1d(ji)%data => tpfield%tfield_l1d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_l1d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_l1d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_l1d) + 1, ksize
+      tzfield_l1d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_l1d, to = tpfield%tfield_l1d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_l1d
+
+
+subroutine Extend_1field_n0d( tpfield, ksize )
+
+use modd_parameters, only: NUNDEF
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_n0d), dimension(:), allocatable :: tzfield_n0d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_n0d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_n0d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_n0d(jj)%data => tfieldlist(ji)%tfield_n0d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_n0d(ksize) )
+    do ji = 1, ksize
+      ! tpfield%tfield_n0d(ji)%data => null()
+      Allocate( tpfield%tfield_n0d(ji)%data )
+      tpfield%tfield_n0d(ji)%data = NUNDEF
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_n0d )
-    allocate(   tfieldlist(ji)%tfield_n0d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_n0d(jj)%data => tfield_save_n0d(jj)%data
-      tfield_save_n0d(jj)%data => null()
+  else
+    Allocate( tzfield_n0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n0d)
+      tzfield_n0d(ji)%data => tpfield%tfield_n0d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_n0d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_n0d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_n0d) + 1, ksize
+      ! tzfield_n0d(ji)%data => null()
+      Allocate( tzfield_n0d(ji)%data )
+      tzfield_n0d(ji)%data = NUNDEF
     end do
+    call Move_alloc( from = tzfield_n0d, to = tpfield%tfield_n0d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_n0d
+
+
+subroutine Extend_1field_n1d( tpfield, ksize )
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_n1d), dimension(:), allocatable :: tzfield_n1d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_n1d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_n1d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_n1d(jj)%data => tfieldlist(ji)%tfield_n1d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_n1d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_n1d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_n1d )
-    allocate(   tfieldlist(ji)%tfield_n1d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_n1d(jj)%data => tfield_save_n1d(jj)%data
-      tfield_save_n1d(jj)%data => null()
+  else
+    Allocate( tzfield_n1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n1d)
+      tzfield_n1d(ji)%data => tpfield%tfield_n1d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_n1d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_n1d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_n1d) + 1, ksize
+      tzfield_n1d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_n1d, to = tpfield%tfield_n1d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_n1d
+
+
+subroutine Extend_1field_n2d( tpfield, ksize )
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_n2d), dimension(:), allocatable :: tzfield_n2d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_n2d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_n2d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_n2d(jj)%data => tfieldlist(ji)%tfield_n2d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_n2d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_n2d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_n2d )
-    allocate(   tfieldlist(ji)%tfield_n2d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_n2d(jj)%data => tfield_save_n2d(jj)%data
-      tfield_save_n2d(jj)%data => null()
+  else
+    Allocate( tzfield_n2d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n2d)
+      tzfield_n2d(ji)%data => tpfield%tfield_n2d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_n2d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_n2d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_n2d) + 1, ksize
+      tzfield_n2d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_n2d, to = tpfield%tfield_n2d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_n2d
+
+
+subroutine Extend_1field_n3d( tpfield, ksize )
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_n3d), dimension(:), allocatable :: tzfield_n3d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_n3d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_n3d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_n3d(jj)%data => tfieldlist(ji)%tfield_n3d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_n3d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_n3d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_n3d )
-    allocate(   tfieldlist(ji)%tfield_n3d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_n3d(jj)%data => tfield_save_n3d(jj)%data
-      tfield_save_n3d(jj)%data => null()
+  else
+    Allocate( tzfield_n3d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n3d)
+      tzfield_n3d(ji)%data => tpfield%tfield_n3d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_n3d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_n3d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_n3d) + 1, ksize
+      tzfield_n3d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_n3d, to = tpfield%tfield_n3d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_n3d
+
+
+subroutine Extend_1field_t0d( tpfield, ksize )
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_t0d), dimension(:), allocatable :: tzfield_t0d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_t0d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_x0d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x0d(jj)%data => tfieldlist(ji)%tfield_x0d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_t0d(ksize) )
+    do ji = 1, ksize
+      ! tpfield%tfield_t0d(ji)%data => null()
+      Allocate( tpfield%tfield_t0d(ji)%data )
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x0d )
-    allocate(   tfieldlist(ji)%tfield_x0d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x0d(jj)%data => tfield_save_x0d(jj)%data
-      tfield_save_x0d(jj)%data => null()
+  else
+    Allocate( tzfield_t0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_t0d)
+      tzfield_t0d(ji)%data => tpfield%tfield_t0d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x0d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x0d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_t0d) + 1, ksize
+      ! tzfield_t0d(ji)%data => null()
+      Allocate( tzfield_t0d(ji)%data )
     end do
+    call Move_alloc( from = tzfield_t0d, to = tpfield%tfield_t0d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_t0d
+
+
+subroutine Extend_1field_t1d( tpfield, ksize )
+
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_t1d), dimension(:), allocatable :: tzfield_t1d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_t1d )
+end if
 
-  if ( allocated( tfieldlist(ji)%tfield_x1d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x1d(jj)%data => tfieldlist(ji)%tfield_x1d(jj)%data
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_t1d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_t1d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x1d )
-    allocate(   tfieldlist(ji)%tfield_x1d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x1d(jj)%data => tfield_save_x1d(jj)%data
-      tfield_save_x1d(jj)%data => null()
+  else
+    Allocate( tzfield_t1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_t1d)
+      tzfield_t1d(ji)%data => tpfield%tfield_t1d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x1d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x1d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_t1d) + 1, ksize
+      tzfield_t1d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_t1d, to = tpfield%tfield_t1d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_t1d
+
+
+subroutine Extend_1field_x0d( tpfield, ksize )
+
+use modd_parameters, only: XUNDEF
 
-  if ( allocated( tfieldlist(ji)%tfield_x2d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x2d(jj)%data => tfieldlist(ji)%tfield_x2d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x0d), dimension(:), allocatable :: tzfield_x0d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x0d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x0d(ksize) )
+    do ji = 1, ksize
+      ! tpfield%tfield_x0d(ji)%data => null()
+      Allocate( tpfield%tfield_x0d(ji)%data )
+      tpfield%tfield_x0d(ji)%data = XUNDEF
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x2d )
-    allocate(   tfieldlist(ji)%tfield_x2d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x2d(jj)%data => tfield_save_x2d(jj)%data
-      tfield_save_x2d(jj)%data => null()
+  else
+    Allocate( tzfield_x0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x0d)
+      tzfield_x0d(ji)%data => tpfield%tfield_x0d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x2d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x2d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x0d) + 1, ksize
+      ! tzfield_x0d(ji)%data => null()
+      Allocate( tzfield_x0d(ji)%data )
+      tzfield_x0d(ji)%data = XUNDEF
     end do
+    call Move_alloc( from = tzfield_x0d, to = tpfield%tfield_x0d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x0d
+
+
+subroutine Extend_1field_x1d( tpfield, ksize )
 
-  if ( allocated( tfieldlist(ji)%tfield_x3d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x3d(jj)%data => tfieldlist(ji)%tfield_x3d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x1d), dimension(:), allocatable :: tzfield_x1d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x1d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x1d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x1d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x3d )
-    allocate(   tfieldlist(ji)%tfield_x3d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x3d(jj)%data => tfield_save_x3d(jj)%data
-      tfield_save_x3d(jj)%data => null()
+  else
+    Allocate( tzfield_x1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x1d)
+      tzfield_x1d(ji)%data => tpfield%tfield_x1d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x3d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x3d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x1d) + 1, ksize
+      tzfield_x1d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_x1d, to = tpfield%tfield_x1d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x1d
+
+
+subroutine Extend_1field_x2d( tpfield, ksize )
 
-  if ( allocated( tfieldlist(ji)%tfield_x4d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x4d(jj)%data => tfieldlist(ji)%tfield_x4d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x2d), dimension(:), allocatable :: tzfield_x2d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x2d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x2d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x2d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x4d )
-    allocate(   tfieldlist(ji)%tfield_x4d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x4d(jj)%data => tfield_save_x4d(jj)%data
-      tfield_save_x4d(jj)%data => null()
+  else
+    Allocate( tzfield_x2d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x2d)
+      tzfield_x2d(ji)%data => tpfield%tfield_x2d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x4d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x4d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x2d) + 1, ksize
+      tzfield_x2d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_x2d, to = tpfield%tfield_x2d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x2d
+
+
+subroutine Extend_1field_x3d( tpfield, ksize )
 
-  if ( allocated( tfieldlist(ji)%tfield_x5d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x5d(jj)%data => tfieldlist(ji)%tfield_x5d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x3d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x3d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x3d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x5d )
-    allocate(   tfieldlist(ji)%tfield_x5d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x5d(jj)%data => tfield_save_x5d(jj)%data
-      tfield_save_x5d(jj)%data => null()
+  else
+    Allocate( tzfield_x3d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x3d)
+      tzfield_x3d(ji)%data => tpfield%tfield_x3d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x5d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x5d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x3d) + 1, ksize
+      tzfield_x3d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_x3d, to = tpfield%tfield_x3d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x3d
+
+
+subroutine Extend_1field_x4d( tpfield, ksize )
 
-  if ( allocated( tfieldlist(ji)%tfield_x6d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_x6d(jj)%data => tfieldlist(ji)%tfield_x6d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x4d), dimension(:), allocatable :: tzfield_x4d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x4d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x4d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x4d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_x6d )
-    allocate(   tfieldlist(ji)%tfield_x6d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_x6d(jj)%data => tfield_save_x6d(jj)%data
-      tfield_save_x6d(jj)%data => null()
+  else
+    Allocate( tzfield_x4d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x4d)
+      tzfield_x4d(ji)%data => tpfield%tfield_x4d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_x6d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_x6d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x4d) + 1, ksize
+      tzfield_x4d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_x4d, to = tpfield%tfield_x4d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x4d
+
+
+subroutine Extend_1field_x5d( tpfield, ksize )
 
-  if ( allocated( tfieldlist(ji)%tfield_t0d ) ) then
-    !Save existing pointers to temporary structure
-    do jj = 1, nmodel_allocated
-      tfield_save_t0d(jj)%data => tfieldlist(ji)%tfield_t0d(jj)%data
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x5d), dimension(:), allocatable :: tzfield_x5d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x5d )
+end if
+
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x5d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x5d(ji)%data => null()
     end do
-    !Reallocate
-    deallocate( tfieldlist(ji)%tfield_t0d )
-    allocate(   tfieldlist(ji)%tfield_t0d(kmodelnew) )
-    !Restore pointers
-    do jj = 1, kmodelnew
-      tfieldlist(ji)%tfield_t0d(jj)%data => tfield_save_t0d(jj)%data
-      tfield_save_t0d(jj)%data => null()
+  else
+    Allocate( tzfield_x5d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x5d)
+      tzfield_x5d(ji)%data => tpfield%tfield_x5d(ji)%data
     end do
-    !Check no used pointers if nmodel is decreazed
-    do jj = kmodelnew + 1, nmodel_allocated
-      if ( associated(tfield_save_t0d(jj)%data ) ) then
-        call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' )
-        tfield_save_t0d(jj)%data => null()
-      end if
+    do ji = Size( tpfield%tfield_x5d) + 1, ksize
+      tzfield_x5d(ji)%data => null()
     end do
+    call Move_alloc( from = tzfield_x5d, to = tpfield%tfield_x5d )
   end if
+  tpfield%nmodelmax = ksize
+end if
+
+end subroutine Extend_1field_x5d
+
+
+subroutine Extend_1field_x6d( tpfield, ksize )
 
-end do
+implicit none
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
+
+integer :: ji
+type(tfieldptr_x6d), dimension(:), allocatable :: tzfield_x6d
+
+if ( tpfield%nmodelmax < 0 ) then
+  !nmodelmax is < 0 if the allocation of the field has been done by hand
+  !(not using a constructor, default value of nmodelmax)
+  !The correct value of nmodelmax is hence computed here
+  tpfield%nmodelmax = Size( tpfield%tfield_x6d )
+end if
 
-nmodel_allocated = kmodelnew
+if ( ksize > tpfield%nmodelmax ) then
+  if ( tpfield%nmodelmax == 0 ) then
+    Allocate( tpfield%tfield_x6d(ksize) )
+    do ji = 1, ksize
+      tpfield%tfield_x6d(ji)%data => null()
+    end do
+  else
+    Allocate( tzfield_x6d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x6d)
+      tzfield_x6d(ji)%data => tpfield%tfield_x6d(ji)%data
+    end do
+    do ji = Size( tpfield%tfield_x6d) + 1, ksize
+      tzfield_x6d(ji)%data => null()
+    end do
+    call Move_alloc( from = tzfield_x6d, to = tpfield%tfield_x6d )
+  end if
+  tpfield%nmodelmax = ksize
+end if
 
-end subroutine Fieldlist_nmodel_resize
+end subroutine Extend_1field_x6d
 
 end module mode_field
diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
index 15bb499d2ca93f21606dbcee61087753ef7c4230..f0eb696c9f4b2049de9afd5db3a7581f3966fbef 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
@@ -114,8 +114,8 @@ end subroutine IO_Format_read_select
 
 
 SUBROUTINE IO_Field_metadata_bcast(TPFILE,TPFIELD)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
 !
 INTEGER :: IERR
 !
@@ -159,10 +159,10 @@ SUBROUTINE IO_Field_read_byfield_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 USE MODD_IO,        ONLY: ISP,GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD   ! data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+REAL,                  INTENT(INOUT) :: PFIELD   ! data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -238,13 +238,13 @@ USE MODD_STRUCTURE_ll, ONLY: ZONE_ll
 USE MODE_SCATTER_ll
 USE MODE_ALLOCBUFFER_ll
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
-INTEGER,OPTIONAL, INTENT(IN)    :: KIMAX_ll
-INTEGER,OPTIONAL, INTENT(IN)    :: KJMAX_ll
-TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:), INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
+INTEGER, OPTIONAL,     INTENT(IN)    :: KIMAX_ll
+INTEGER, OPTIONAL,     INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING  ! splitting of the domain
 !
 INTEGER                      :: IERR
 REAL,DIMENSION(:),POINTER    :: ZFIELDP
@@ -349,13 +349,13 @@ USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODE_ll         , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll
 #endif
 !
-TYPE(TFILEDATA),           INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),          INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,         INTENT(OUT)   :: KRESP    ! return-code
-INTEGER, OPTIONAL,         INTENT(IN)    :: KIMAX_ll
-INTEGER, OPTIONAL,         INTENT(IN)    :: KJMAX_ll
-TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),           INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
+INTEGER, OPTIONAL,               INTENT(IN)    :: KIMAX_ll
+INTEGER, OPTIONAL,               INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING  ! splitting of the domain
 !
 INTEGER                      :: IERR
 real                             :: zfieldp0d
@@ -367,7 +367,7 @@ INTEGER                      :: IRESP
 INTEGER                      :: IHEXTOT
 REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2
 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22
-type(tfielddata)                 :: tzfield
+class(tfieldmetadata),allocatable :: tzfield
 #ifdef MNH_GA
 REAL,DIMENSION(:,:),POINTER  :: ZFIELD_GA
 TYPE(LIST_ll)      ,POINTER  :: TZFIELD_ll
@@ -389,8 +389,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     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
@@ -400,7 +400,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp0d, iresp )
         pfield(:, :) = Spread( Spread( zfieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -410,8 +409,8 @@ IF (IRESP==0) THEN
         pfield(:, :) = Spread( Spread( pfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       endif
     else if ( 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
@@ -422,7 +421,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp1d, iresp )
         pfield(:, :) = Spread( pfield(:, jphext + 1), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -558,10 +556,10 @@ USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname
 USE MODE_MNH_TIMING,       ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),TARGET,      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),            INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,           INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA), TARGET,       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),         INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
 !
 TYPE TX_2DP
    REAL,DIMENSION(:,:), POINTER :: X
@@ -588,7 +586,7 @@ CHARACTER(LEN=2)                      :: YDIR
 CHARACTER(LEN=4)                      :: YK
 CHARACTER(LEN=NMNHNAMELGTMAX+4)       :: YRECZSLICE
 CHARACTER(LEN=4)                      :: YSUFFIX
-type(tfielddata)                      :: tzfield
+class(tfieldmetadata), allocatable    :: tzfield
 TYPE(TFILEDATA),POINTER               :: TZFILE
 TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP
 #ifdef MNH_GA
@@ -615,8 +613,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC  .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
     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)
@@ -629,7 +627,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), &
                                   dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -640,8 +637,8 @@ IF (IRESP==0) THEN
                                   dim = 2, ncopies = ihextot )
       endif
     else if ( 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)
@@ -653,7 +650,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp2d, iresp )
         pfield(:, :, :) = Spread( pfield(:, jphext + 1, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -717,6 +713,7 @@ IF (IRESP==0) THEN
     ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size
     GALLOC_ll = .TRUE.
     IRESP_ISP=0
+    Allocate( tzfield, mold = tpfield )
     DO JKK=1,SIZE(PFIELD,3) ! IKU_ll
       IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ)
       TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE
@@ -783,6 +780,7 @@ IF (IRESP==0) THEN
       JK_MAX=MIN(SIZE(PFIELD,3),JK+INB_PROC_REAL-1)
       !
       INB_REQ=0
+      Allocate( tzfield, mold = tpfield )
       DO JKK=JK,JK_MAX
         IF (TPFILE%NSUBFILES_IOZ .GT. 1 ) THEN
           IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ)
@@ -947,10 +945,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),               INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),              INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                  INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),            INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                          :: IERR
 real, dimension(:,:),    pointer  :: zfieldp2d
@@ -960,7 +958,7 @@ LOGICAL                          :: GALLOC
 logical                          :: glfi, gnc4
 INTEGER                          :: IRESP
 INTEGER                          :: IHEXTOT
-type(tfielddata)                 :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X4',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -976,8 +974,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     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)
@@ -991,7 +989,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :), dim = 1, ncopies = ihextot ), &
                                      dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1002,8 +999,8 @@ IF (IRESP==0) THEN
                                      dim = 2, ncopies = ihextot )
       endif
     else if ( 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)
@@ -1016,7 +1013,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp3d, iresp )
         pfield(:, :, :, :) = Spread( pfield(:, jphext + 1, :, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1106,10 +1102,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),                 INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                            :: IERR
 real, dimension(:,:,:),    pointer  :: zfieldp3d
@@ -1119,7 +1115,7 @@ LOGICAL                            :: GALLOC
 logical                            :: glfi, gnc4
 INTEGER                            :: IRESP
 INTEGER                            :: IHEXTOT
-type(tfielddata)                   :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X5',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1135,8 +1131,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     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)
@@ -1151,7 +1147,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :, :), dim = 1, ncopies = ihextot ), &
                                         dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1162,8 +1157,8 @@ IF (IRESP==0) THEN
                                         dim = 2, ncopies = ihextot )
       endif
     else if ( 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)
@@ -1177,7 +1172,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp4d, iresp )
         pfield(:, :, :, :, :) = Spread( pfield(:, jphext + 1, :, :, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1266,10 +1260,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                   INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                  INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                         INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),                   INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                       INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                              :: IERR
 REAL,DIMENSION(:,:,:,:,:,:),POINTER  :: ZFIELDP
@@ -1356,10 +1350,10 @@ SUBROUTINE IO_Field_read_byfield_N0(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP,GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-INTEGER,          INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+INTEGER,               INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1427,10 +1421,10 @@ USE MODD_IO, ONLY: ISP, GSMONOPROC
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1518,10 +1512,10 @@ USE MODD_TIMEZ,         ONLY: TIMEZ
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),              INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),             INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:),TARGET,INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER, OPTIONAL,            INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),           INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:), TARGET, INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                         :: IERR
 integer                          :: ifieldp0d
@@ -1531,7 +1525,7 @@ LOGICAL                         :: GALLOC
 logical                         :: glfi, gnc4
 INTEGER                         :: IRESP
 INTEGER                         :: IHEXTOT
-type(tfielddata)                :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1547,8 +1541,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 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
@@ -1558,7 +1552,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp0d, iresp )
         kfield(:, :) = Spread( Spread( ifieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1568,8 +1561,8 @@ IF (IRESP==0) THEN
         kfield(:, :) = Spread( Spread( kfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       endif
     else if ( 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
@@ -1580,7 +1573,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp1d, iresp )
         kfield(:, :) = Spread( kfield(:, jphext + 1), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1672,10 +1664,10 @@ USE MODD_TIMEZ,         ONLY: TIMEZ
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),               INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER, OPTIONAL,              INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                   INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),             INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                           :: IERR
 integer, dimension(:),     pointer :: ifieldp1d
@@ -1685,7 +1677,7 @@ LOGICAL                           :: GALLOC
 logical                           :: glfi, gnc4
 INTEGER                           :: IRESP
 INTEGER                           :: IHEXTOT
-type(tfielddata)                  :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N3',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1701,8 +1693,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 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)
@@ -1715,7 +1707,6 @@ IF (IRESP==0) THEN
         kfield(:, :, :) = Spread( Spread( kfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), &
                                   dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1726,8 +1717,8 @@ IF (IRESP==0) THEN
                                   dim = 2, ncopies = ihextot )
       endif
     else if ( 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)
@@ -1739,7 +1730,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp2d, iresp )
         kfield(:, :, :) = Spread( kfield(:, jphext + 1, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1825,10 +1815,10 @@ SUBROUTINE IO_Field_read_byfield_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-LOGICAL,          INTENT(INOUT) :: OFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+LOGICAL,               INTENT(INOUT) :: OFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1893,10 +1883,10 @@ SUBROUTINE IO_Field_read_byfield_L1(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD   ! array containing the data field
-INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1961,10 +1951,10 @@ SUBROUTINE IO_Field_read_byfield_C0(TPFILE,TPFIELD,HFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),      INTENT(INOUT) :: HFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -2032,10 +2022,10 @@ SUBROUTINE IO_Field_read_byfield_T0(TPFILE,TPFIELD,TPDATA,KRESP)
 use modd_io,        only: ISP, GSMONOPROC
 use modd_type_date, only: DATE_TIME
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+TYPE(DATE_TIME),       INTENT(INOUT) :: TPDATA   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -2118,12 +2108,12 @@ USE MODE_DISTRIB_lb
 USE MODE_MNH_TIMING,    ONLY: SECOND_MNH2
 USE MODE_TOOLS_ll,      ONLY: GET_GLOBALDIMS_ll
 !
-TYPE(TFILEDATA),               INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),              INTENT(INOUT) :: TPFIELD
-INTEGER,                       INTENT(IN)    :: KL3D    ! size of the LB array in FM
-INTEGER,                       INTENT(IN)    :: KRIM    ! size of the LB area
-REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT) :: PLB     ! array containing the LB field
-INTEGER,OPTIONAL,              INTENT(OUT)   :: KRESP   ! return-code
+TYPE(TFILEDATA),                  INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),            INTENT(INOUT) :: TPFIELD
+INTEGER,                          INTENT(IN)    :: KL3D    ! size of the LB array in FM
+INTEGER,                          INTENT(IN)    :: KRIM    ! size of the LB area
+REAL,   DIMENSION(:,:,:) ,TARGET, INTENT(INOUT) :: PLB     ! array containing the LB field
+INTEGER,OPTIONAL,                 INTENT(OUT)   :: KRESP   ! return-code
 !
 !*      0.2   Declarations of local variables
 !
@@ -2147,7 +2137,7 @@ real, dimension(:,:),  pointer           :: ZTX2DP
 REAL,DIMENSION(:,:,:), POINTER           :: TX3DP
 REAL(kind=MNHTIME), DIMENSION(2)         :: ZT0, ZT1, ZT2, ZT3
 REAL(kind=MNHTIME), DIMENSION(2)         :: ZT11, ZT22
-type(tfielddata)                         :: tzfield
+class(tfieldmetadata), allocatable       :: tzfield
 TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:)    :: T_TX3DP
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_lb','reading '//TRIM(TPFIELD%CMNHNAME))
@@ -2175,8 +2165,8 @@ IF (IRESP==0) THEN
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
       ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3)))
       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)
@@ -2188,7 +2178,6 @@ IF (IRESP==0) THEN
           if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ZTX2DP, iresp )
           Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
         else
-          tzfield = tpfield
           if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
           TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:)
           if ( gnc4 ) call IO_Field_read_nc4( tpfile, tzfield, tx3dp, iresp )
diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90
index 6ed3a03c255e7690965e101065a6892fee7c1d7c..663059f07193f44eb708c9ee48604c4460cddd2c 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_file.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_file.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2022 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.
@@ -39,6 +39,7 @@
 !  P. Wautelet 05/09/2019: disable IO_Coordvar_write_nc4 for Z-split files
 !  P. Wautelet 01/10/2020: bugfix: add missing initializations for IRESP
 !  P. Wautelet 19/08/2022: bugfix: IO_File_check_format_exist: broadcast cformat if changed
+!  P. Wautelet 13/01/2023: IO_File_close: add optional dummy argument TPDTMODELN to force written model time
 !-----------------------------------------------------------------
 module mode_io_file
 
@@ -492,10 +493,11 @@ END FUNCTION SUFFIX
 END SUBROUTINE IO_File_doopen
 
 
-recursive SUBROUTINE IO_File_close(TPFILE,KRESP,HPROGRAM_ORIG)
+recursive SUBROUTINE IO_File_close( TPFILE, KRESP, HPROGRAM_ORIG, TPDTMODELN )
 !
 use modd_conf,             only: cprogram
 use modd_io,               only: nnullunit
+use modd_type_date,        only: date_time
 
 use mode_io_file_lfi,      only: IO_File_close_lfi
 #ifdef MNH_IOCDF4
@@ -507,7 +509,7 @@ use mode_io_manage_struct, only: IO_File_find_byname
 TYPE(TFILEDATA),            INTENT(INOUT) :: TPFILE ! File structure
 INTEGER,          OPTIONAL, INTENT(OUT)   :: KRESP  ! Return code
 CHARACTER(LEN=*), OPTIONAL, INTENT(IN)    :: HPROGRAM_ORIG !To emulate a file coming from this program
-!
+TYPE(DATE_TIME),  OPTIONAL, INTENT(IN)    :: TPDTMODELN    !Time of model (to force model date written in file)
 character(len=256)      :: yioerrmsg
 INTEGER                 :: IRESP, JI
 TYPE(TFILEDATA),POINTER :: TZFILE_DES
@@ -565,7 +567,7 @@ SELECT CASE(TPFILE%CTYPE)
 #ifdef MNH_IOCDF4
     !Write coordinates variables in NetCDF file
     IF (TPFILE%CMODE == 'WRITE' .AND. (TPFILE%CFORMAT=='NETCDF4' .OR. TPFILE%CFORMAT=='LFICDF4')) THEN
-      CALL IO_Coordvar_write_nc4(TPFILE,HPROGRAM_ORIG=HPROGRAM_ORIG)
+      CALL IO_Coordvar_write_nc4( TPFILE, HPROGRAM_ORIG = HPROGRAM_ORIG, TPDTMODELN = TPDTMODELN )
     END IF
 #endif
 
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 60cf44de04d57ca5056621b06c3fda899d42bdb5..3174a29479d4e91b6db75697d80a5e850237eeb2 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2016-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2016-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.
@@ -20,7 +20,8 @@
 !  S. Donnier  28/02/2020: type STREAM needed for use of ECOCLIMAP SG
 !  P. Wautelet 08/01/2021: allow output files with empty variable list (useful if IO_Field_user_write is not empty)
 !  P. Wautelet 18/03/2022: minor bugfix in ISTEP_MAX computation + adapt diagnostics messages
-                           (change verbosity level and remove some unnecessary warnings)
+!                          (change verbosity level and remove some unnecessary warnings)
+!  P. Wautelet 13/01/2023: set NMODEL field for backup and output files
 !-----------------------------------------------------------------
 MODULE MODE_IO_MANAGE_STRUCT
 !
@@ -213,8 +214,8 @@ DO IMI = 1, NMODEL
   ALLOCATE(OUT_MODEL(IMI)%TBACKUPN(IBAK_NUMB))
   ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(IOUT_NUMB))
   !
-  CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IBAK_STEP,"MNHBACKUP",OUT_MODEL(IMI)%TBACKUPN)
-  CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IOUT_STEP,"MNHOUTPUT",OUT_MODEL(IMI)%TOUTPUTN)
+  CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IBAK_STEP,"MNHBACKUP",OUT_MODEL(IMI)%TBACKUPN,IMI)
+  CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IOUT_STEP,"MNHOUTPUT",OUT_MODEL(IMI)%TOUTPUTN,IMI)
   !
   !* Find dad output number
   !
@@ -521,7 +522,7 @@ SUBROUTINE SORT_ENTRIES(KNUMB,KSTEPS)
 END SUBROUTINE SORT_ENTRIES
 !
 !#########################################################################
-SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
+SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN,KMI)
 !#########################################################################
   !
   USE MODD_CONFZ, ONLY: NB_PROCIO_W
@@ -530,6 +531,7 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
   INTEGER,DIMENSION(:),              INTENT(IN)    :: KSTEPS
   CHARACTER(LEN=*),                  INTENT(IN)    :: HFILETYPE
   TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(IN)    :: TPBAKOUTN
+  INTEGER,                           INTENT(IN)    :: KMI ! Model number
   !
   CHARACTER (LEN=3) :: YNUMBER          ! Character string for the file number
   INTEGER :: JI
@@ -601,6 +603,8 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
           CALL PRINT_MSG(NVERB_FATAL,'IO','POPULATE_STRUCT','unknown backup/output fileformat')
         ENDIF
         !
+        TPBAKOUTN(IPOS)%TFILE%NMODEL = KMI
+        !
         !Create file structures if Z-split files
         IF (NB_PROCIO_W>1) THEN
           TPBAKOUTN(IPOS)%TFILE%NSUBFILES_IOZ = NB_PROCIO_W
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
index f98999c1ea643987e3825b791b28d30d41a151fa..66aab0cef714eb2a2df0802e5d4585e040d8727e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 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.
@@ -13,7 +13,7 @@
 !-----------------------------------------------------------------
 module mode_io_read_lfi
 !
-use modd_field,      only: tfielddata
+use modd_field,      only: tfieldmetadata_base
 USE MODD_IO
 USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
 use modd_precision,  only: LFIINT, MNHINT64, MNHREAL32, MNHREAL64
@@ -50,10 +50,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL,                       INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -89,10 +89,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:),         INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -123,10 +123,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,            INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:),       INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -157,10 +157,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,              INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -191,10 +191,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:),   INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -225,10 +225,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                  INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL ,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -259,10 +259,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),              INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base),   INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                      INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -293,10 +293,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-INTEGER,         INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER,                    INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -327,10 +327,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:),      INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -361,10 +361,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),      INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,               INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:),    INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -395,10 +395,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:,:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,                 INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:,:),  INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -429,10 +429,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-LOGICAL,         INTENT(INOUT) :: OFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+LOGICAL,                    INTENT(INOUT) :: OFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -476,10 +476,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD  ! array containing the data field
-INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:),      INTENT(INOUT) :: OFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -531,10 +531,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),           INTENT(INOUT) :: HFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -581,10 +581,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME),INTENT(INOUT) :: TPDATA  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME),           INTENT(INOUT) :: TPDATA  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -592,7 +592,7 @@ INTEGER(KIND=LFIINT)                            :: IRESP, ITOTAL
 INTEGER                                         :: ILENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 LOGICAL                                         :: GGOOD
-TYPE(TFIELDDATA)                                :: TZFIELD
+TYPE(tfieldmetadata_base)                       :: TZFIELD
 INTEGER, DIMENSION(3)                           :: ITDATE    ! date array
 REAL,DIMENSION(1)                               :: ZTIME
 !
@@ -649,7 +649,7 @@ SUBROUTINE IO_Field_read_check_lfi(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD
 USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN
 !
 TYPE(TFILEDATA),                                INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                               INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata_base),                     INTENT(INOUT) :: TPFIELD
 INTEGER,                                        INTENT(IN)    :: KLENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(OUT)   :: KWORK
 INTEGER(KIND=LFIINT),                           INTENT(OUT)   :: KTOTAL
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index a257e66b8cdd31e21396959c0d72217ae4a3a615..8c68aeaf9138cd9e6b8c606d9c392ca1cbee87c3 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -1,4 +1,4 @@
-!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.
@@ -17,7 +17,7 @@
 #ifdef MNH_IOCDF4
 module mode_io_read_nc4
 
-use modd_field,        only: tfielddata
+use modd_field,        only: tfieldmetadata, tfieldmetadata_base
 use modd_io,           only: tfiledata
 use modd_precision,    only: CDFINT
 
@@ -53,11 +53,11 @@ SUBROUTINE IO_Field_attr_read_check_nc4(TPFILE,TPFIELD,KVARID,KRESP,HCALENDAR)
 !
 USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN
 !
-TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-INTEGER(KIND=CDFINT),     INTENT(IN)    :: KVARID
-INTEGER,                  INTENT(OUT)   :: KRESP  ! return-code
-CHARACTER(LEN=*),OPTIONAL,INTENT(IN)    :: HCALENDAR
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER(KIND=CDFINT),       INTENT(IN)    :: KVARID
+INTEGER,                    INTENT(OUT)   :: KRESP  ! return-code
+CHARACTER(LEN=*), OPTIONAL, INTENT(IN)    :: HCALENDAR
 !
 INTEGER                      :: IERRLEVEL
 INTEGER                      :: IGRID
@@ -204,10 +204,20 @@ IF (istatus == NF90_NOERR) THEN
   istatus = NF90_GET_ATT(INCID, KVARID, 'units', YVALUE)
   IF (TRIM(YVALUE)/=TRIM(TPFIELD%CUNITS)) THEN
     IF(.NOT.PRESENT(HCALENDAR)) THEN
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// &
-                     ': expected UNITS ('//TRIM(TPFIELD%CUNITS)//                           &
-                     ') is different than found ('//TRIM(YVALUE)//') in file for field '//TRIM(TPFIELD%CMNHNAME))
-      KRESP = -111 !Used later to broadcast modified metadata
+      if ( Trim( tpfield%cunits ) == 'ppv' .and. Trim( yvalue ) == 'ppp' ) then
+        ! 'ppp' (non-existing unit) was used in old Meso-NH files (before 5.5.1 version) instead of 'ppv'
+        CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// &
+                       ': expected UNITS    found in file for field '//TRIM(TPFIELD%CMNHNAME))
+      else if ( Trim( tpfield%cunits ) == 'ppb' .and. Trim( yvalue ) == 'ppbv' ) then
+        ! 'ppbv' was used in old Meso-NH files (before 5.5.1 version). It is strictly equivalent to 'ppb'
+        CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// &
+                       ': expected UNITS    found in file for field '//TRIM(TPFIELD%CMNHNAME))
+      else
+        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// &
+                       ': expected UNITS ('//TRIM(TPFIELD%CUNITS)//                           &
+                       ') is different than found ('//TRIM(YVALUE)//') in file for field '//TRIM(TPFIELD%CMNHNAME))
+        KRESP = -111 !Used later to broadcast modified metadata
+      end if
     ELSE
       CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// &
                      ': UNITS found in file for field '//TRIM(TPFIELD%CMNHNAME)//' (will be analysed later)')
@@ -260,10 +270,10 @@ END SUBROUTINE IO_Field_attr_read_check_nc4
 
 
 SUBROUTINE IO_Field_read_nc4_X0(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL,                  INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -315,10 +325,10 @@ END SUBROUTINE IO_Field_read_nc4_X0
 
 
 SUBROUTINE IO_Field_read_nc4_X1(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:),    INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -382,10 +392,10 @@ END SUBROUTINE IO_Field_read_nc4_X1
 
 
 SUBROUTINE IO_Field_read_nc4_X2(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD
-INTEGER,            INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:),  INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -464,10 +474,10 @@ END SUBROUTINE IO_Field_read_nc4_X2
 
 
 SUBROUTINE IO_Field_read_nc4_X3(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD
-INTEGER,              INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata),  INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD
+INTEGER,                INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -536,7 +546,7 @@ END SUBROUTINE IO_Field_read_nc4_X3
 
 SUBROUTINE IO_Field_read_nc4_X4(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),  INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                INTENT(OUT)   :: KRESP  ! return-code
 
@@ -610,7 +620,7 @@ END SUBROUTINE IO_Field_read_nc4_X4
 
 SUBROUTINE IO_Field_read_nc4_X5(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),    INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                  INTENT(OUT)   :: KRESP  ! return-code
 
@@ -687,7 +697,7 @@ END SUBROUTINE IO_Field_read_nc4_X5
 
 SUBROUTINE IO_Field_read_nc4_X6(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),      INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                    INTENT(OUT)   :: KRESP  ! return-code
 
@@ -765,10 +775,10 @@ END SUBROUTINE IO_Field_read_nc4_X6
 
 
 SUBROUTINE IO_Field_read_nc4_N0(TPFILE, TPFIELD, KFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-INTEGER,          INTENT(INOUT) :: KFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+INTEGER,               INTENT(INOUT) :: KFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -822,7 +832,7 @@ END SUBROUTINE IO_Field_read_nc4_N0
 
 SUBROUTINE IO_Field_read_nc4_N1(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),   INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:),   INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
@@ -890,7 +900,7 @@ END SUBROUTINE IO_Field_read_nc4_N1
 
 SUBROUTINE IO_Field_read_nc4_N2(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),   INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
@@ -972,7 +982,7 @@ END SUBROUTINE IO_Field_read_nc4_N2
 
 SUBROUTINE IO_Field_read_nc4_N3(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),           INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),          INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),     INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD
 INTEGER,                   INTENT(OUT)   :: KRESP  ! return-code
 
@@ -1042,10 +1052,10 @@ KRESP = IRESP
 END SUBROUTINE IO_Field_read_nc4_N3
 
 SUBROUTINE IO_Field_read_nc4_L0(TPFILE, TPFIELD, OFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-LOGICAL,          INTENT(INOUT) :: OFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+LOGICAL,               INTENT(INOUT) :: OFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -1112,10 +1122,10 @@ END SUBROUTINE IO_Field_read_nc4_L0
 
 
 SUBROUTINE IO_Field_read_nc4_L1(TPFILE, TPFIELD, OFIELD, KRESP)
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD
-INTEGER,             INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -1199,10 +1209,10 @@ END SUBROUTINE IO_Field_read_nc4_L1
 
 
 SUBROUTINE IO_Field_read_nc4_C0(TPFILE, TPFIELD, HFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),      INTENT(INOUT) :: HFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -1268,10 +1278,10 @@ USE MODD_TYPE_DATE
 !
 USE MODE_DATETIME
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME),      INTENT(INOUT) :: TPDATA
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)         :: istatus
 INTEGER(KIND=CDFINT)         :: INCID
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
index 42236655f7c00e3db69c6574f122cc343db0ff7e..7346177c4e2f279187f3fff07a14278abe835127 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 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.
@@ -103,7 +103,7 @@ contains
 subroutine IO_Mnhversion_get(tpfile)
 !Compare MNHVERSION of file with current version and store it in file metadata
   use modd_conf,          only: nmnhversion
-  use modd_field,         only: tfielddata, TYPEINT
+  use modd_field,         only: tfieldmetadata, TYPEINT
 
   use mode_io_field_read, only: IO_Field_read
 
@@ -113,7 +113,7 @@ subroutine IO_Mnhversion_get(tpfile)
   integer :: imasdev,ibugfix
   integer :: iresp
   integer,dimension(3)    :: imnhversion
-  type(tfielddata)        :: tzfield
+  type(tfieldmetadata)    :: tzfield
 
   call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','called for '//trim(tpfile%cname))
 
@@ -123,16 +123,17 @@ subroutine IO_Mnhversion_get(tpfile)
   if ( .not. associated( tpfile%tmainfile ) ) then
     imnhversion(:) = 0
     !use tzfield because tfieldlist could be not initialised
-    tzfield%cmnhname   = 'MNHVERSION'
-    tzfield%cstdname   = ''
-    tzfield%clongname  = 'MesoNH version'
-    tzfield%cunits     = ''
-    tzfield%cdir       = '--'
-    tzfield%ccomment   = ''
-    tzfield%ngrid      = 0
-    tzfield%ntype      = TYPEINT
-    tzfield%ndims      = 1
-    tzfield%ltimedep   = .false.
+    tzfield = tfieldmetadata(        &
+      cmnhname   = 'MNHVERSION',     &
+      cstdname   = '',               &
+      clongname  = 'MesoNH version', &
+      cunits     = '',               &
+      cdir       = '--',             &
+      ccomment   = '',               &
+      ngrid      = 0,                &
+      ntype      = TYPEINT,          &
+      ndims      = 1,                &
+      ltimedep   = .false.           )
     call IO_Field_read(tpfile,tzfield,imnhversion,iresp)
     if (iresp/=0) then
       tzfield%cmnhname   = 'MASDEV'
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index b436b0d18cf7763e6d5cdfc213050d36ec6cfec5..cca90579e8ec98c90038b827ceccaa9cd5bddf56 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -24,7 +24,7 @@
 #ifdef MNH_IOCDF4
 module mode_io_tools_nc4
 
-use modd_field,     only: tfielddata
+use modd_field,     only: tfieldmetadata
 use modd_io,        only: tfiledata
 use modd_netcdf,    only: tdimnc, tdimsnc
 use modd_precision, only: CDFINT
@@ -85,7 +85,7 @@ USE MODD_FIELD, ONLY: NMNHDIM_ARAKAWA, TYPECHAR
 !
 !Used by LFI2CDF
 TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),                INTENT(IN)  :: TPFIELD
 INTEGER,                              INTENT(IN)  :: KLEN
 TYPE(tdimnc),DIMENSION(:),            INTENT(OUT) :: TPDIMS
 INTEGER,                              INTENT(OUT) :: KRESP
@@ -276,11 +276,11 @@ use modd_les_n,         only: nles_times, nspectra_ni, nspectra_nj
 use modd_nsv,           only: nsv
 USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT
 use modd_param_n,       only: crad
-use modd_profiler_n,    only: numbprofiler, tprofiler
+use modd_profiler_n,    only: lprofiler, tprofilers_time
 use modd_radiations_n,  only: nlwb_mnh, nswb_mnh
 use modd_series,        only: lseries
 use modd_series_n,      only: nsnbstept
-use modd_station_n,     only: numbstat, tstation
+use modd_station_n,     only: lstation, tstations_time
 
 TYPE(TFILEDATA),INTENT(INOUT)        :: TPFILE
 CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program
@@ -420,14 +420,14 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then
   if ( nspectra_k > 0 ) call IO_Add_dim_nc4( tpfile, NMNHDIM_SPECTRA_LEVEL, 'nspectra_level', nspectra_k )
 
   !Dimension for the number of profiler times
-  if ( numbprofiler > 0 ) then
-    iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 1
+  if ( lprofiler ) then
+    iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofilers_time%xtstep ) + 1
     call IO_Add_dim_nc4( tpfile, NMNHDIM_PROFILER_TIME, 'time_profiler', iprof )
   end if
 
   !Dimension for the number of station times
-  if ( numbstat > 0 ) then
-    istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1
+  if ( lstation ) then
+    istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstations_time%xtstep ) + 1
     call IO_Add_dim_nc4( tpfile, NMNHDIM_STATION_TIME, 'time_station', istation )
   end if
 
@@ -515,7 +515,7 @@ use modd_field,  only: NMNHDIM_UNKNOWN, NMNHDIM_ONE, NMNHDIM_COMPLEX,
                        NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, NMNHDIM_ARAKAWA
 
 TYPE(TFILEDATA),                              INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),                             INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),                        INTENT(IN)  :: TPFIELD
 INTEGER(KIND=CDFINT),DIMENSION(:),            INTENT(IN)  :: KSHAPE
 INTEGER(KIND=CDFINT),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
index 430f06ccfed1c5d64d8daeec50f95164be6d1ed7..588ac539b516d2093b296b3d97b9d3312302d30f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
@@ -14,7 +14,7 @@
 !-----------------------------------------------------------------
 module mode_io_write_lfi
 !
-use modd_field,      only: tfielddata
+use modd_field,      only: tfieldmetadata_base
 USE MODD_IO
 USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
 use modd_precision,  only: LFIINT, MNHINT64, MNHREAL64
@@ -53,7 +53,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,                  INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -92,7 +92,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:),     INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -137,7 +137,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files)
@@ -203,7 +203,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:),   INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -248,7 +248,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),          INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),         INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),  INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                  INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -293,7 +293,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),          INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),         INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                  INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -338,7 +338,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),            INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),           INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                    INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -383,7 +383,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,                 INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -422,7 +422,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:),    INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -467,7 +467,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -512,7 +512,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -558,7 +558,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -604,7 +604,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 LOGICAL,                 INTENT(IN) :: OFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -651,7 +651,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 LOGICAL,DIMENSION(:),    INTENT(IN) :: OFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -706,7 +706,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),        INTENT(IN) :: HFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -764,7 +764,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME),        INTENT(IN) :: TPDATA ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -772,14 +772,14 @@ INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
 INTEGER                                         :: ILENG
 INTEGER(kind=LFIINT)                            :: IRESP, ITOTAL
-TYPE(TFIELDDATA)                                :: TZFIELD
+CLASS(tfieldmetadata_base), ALLOCATABLE         :: TZFIELD
 INTEGER, DIMENSION(3)                           :: ITDATE    ! date array
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 CHARACTER(LEN=LEN_HREC)                         :: YRECFM
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_lfi_T0','writing '//TRIM(TPFIELD%CMNHNAME))
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Write date
 !
@@ -840,7 +840,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),                INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA ! array containing the data field
 INTEGER,                        INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -849,7 +849,7 @@ INTEGER,                        INTENT(OUT):: KRESP  ! return-code if problems a
 INTEGER                                         :: ILENG, IPOS
 INTEGER                                         :: JI
 INTEGER(kind=LFIINT)                            :: IRESP, ITOTAL
-TYPE(TFIELDDATA)                                :: TZFIELD
+CLASS(tfieldmetadata_base), ALLOCATABLE         :: TZFIELD
 INTEGER, DIMENSION(:), ALLOCATABLE              :: ITDATE    ! date array
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 CHARACTER(LEN=LEN_HREC)                         :: YRECFM
@@ -866,7 +866,7 @@ END IF
 !
 ALLOCATE( ITDATE( ILENG ) )
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Write date
 !
@@ -924,7 +924,7 @@ END SUBROUTINE IO_Field_write_lfi_T1
 !
 SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP)
 !
-TYPE(TFIELDDATA),                               INTENT(IN)    :: TPFIELD
+CLASS(tfieldmetadata_base),                     INTENT(IN)    :: TPFIELD
 INTEGER,                                        INTENT(IN)    :: KLENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK
 INTEGER(kind=LFIINT),                           INTENT(OUT)   :: KTOTAL
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 10ed5d33ba1b1993d9e3baad7c9c3a87f3f4a1c2..f91733cddbe8dd78fce9e7f7af08cc3648080449 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2022 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.
@@ -29,12 +29,14 @@
 !                          IO_Field_partial_write_nc4_N3 and IO_Field_partial_write_nc4_N4 subroutines
 !  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
 !  P. Wautelet 22/03/2022: correct time_les_avg and time_les_avg_bounds coordinates
+!  P. Wautelet    06/2022: reorganize flyers
 !  P. Wautelet 21/06/2022: bugfix: time_budget was not computed correctly (tdtexp -> tdtseg)
+!  P. Wautelet 13/01/2023: IO_Coordvar_write_nc4: add optional dummy argument TPDTMODELN to force written model time
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
 
-use modd_field,        only: tfielddata
+use modd_field,        only: tfieldmetadata
 use modd_io,           only: gsmonoproc, tfiledata
 use modd_parameters,   only: NMNHNAMELGTMAX
 use modd_precision,    only: CDFINT, MNHINT_NF90, MNHREAL32, MNHREAL_MPI, MNHREAL_NF90
@@ -91,7 +93,7 @@ use mode_tools_ll,   only: Get_globaldims_ll
 use NETCDF,          only: NF90_FLOAT
 
 type(tfiledata),       intent(in) :: tpfile
-type(tfielddata),      intent(in) :: tpfield
+class(tfieldmetadata), intent(in) :: tpfield
 integer,               intent(in) :: knblocks
 
 character(len=len(tpfield%cmnhname))  :: yvarname
@@ -185,7 +187,7 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE
 use modd_field,  only: NMNHDIM_ARAKAWA, TYPEINT, TYPEREAL
 !
 TYPE(TFILEDATA),                              INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),                             INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),                        INTENT(IN) :: TPFIELD
 INTEGER(KIND=CDFINT),                         INTENT(IN) :: KVARID
 LOGICAL,                                      INTENT(IN) :: OEXISTED !True if variable was already defined
 INTEGER(KIND=CDFINT), DIMENSION(:), OPTIONAL, INTENT(IN) :: KSHAPE
@@ -381,7 +383,7 @@ use modd_field,     only: NMNHDIM_TIME, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TY
 use modd_precision, only: MNHINT_NF90, MNHREAL_NF90
 
 type(tfiledata),       intent(in)            :: tpfile
-type(tfielddata),      intent(in)            :: tpfield
+class(tfieldmetadata), intent(in)            :: tpfield
 integer, dimension(:), intent(in),  optional :: kshape
 character(len=*),      intent(in),  optional :: hcalendar
 logical,               intent(in),  optional :: oiscoord   ! Is a coordinate variable (->do not write coordinates attribute)
@@ -533,7 +535,7 @@ end subroutine IO_Field_create_nc4
 SUBROUTINE IO_Field_write_nc4_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,                  INTENT(IN) :: PFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -556,7 +558,7 @@ END SUBROUTINE IO_Field_write_nc4_X0
 SUBROUTINE IO_Field_write_nc4_X1(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:),     INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -582,19 +584,19 @@ END SUBROUTINE IO_Field_write_nc4_X1
 SUBROUTINE IO_Field_write_nc4_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE,OISCOORD)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files)
 INTEGER,OPTIONAL,      INTENT(IN) :: KZFILE     ! Number of the Z-level split file
 LOGICAL,OPTIONAL,      INTENT(IN) :: OISCOORD   ! Is a coordinate variable (->do not write coordinates attribute)
 !
-INTEGER(KIND=CDFINT)      :: istatus
-CHARACTER(LEN=4)          :: YSUFFIX
-INTEGER(KIND=CDFINT)      :: IVARID
-logical                   :: gisempty
-TYPE(TFIELDDATA), pointer :: TZFIELD
-TYPE(TFILEDATA),  POINTER :: TZFILE
+CHARACTER(LEN=4)               :: YSUFFIX
+INTEGER(KIND=CDFINT)           :: istatus
+INTEGER(KIND=CDFINT)           :: IVARID
+logical                        :: gisempty
+CLASS(TFIELDMETADATA), pointer :: TZFIELD
+TYPE(TFILEDATA),       POINTER :: TZFILE
 !
 KRESP = 0
 !
@@ -618,7 +620,7 @@ END SUBROUTINE IO_Field_write_nc4_X2
 SUBROUTINE IO_Field_write_nc4_X3(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -644,7 +646,7 @@ END SUBROUTINE IO_Field_write_nc4_X3
 SUBROUTINE IO_Field_write_nc4_X4(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -670,7 +672,7 @@ END SUBROUTINE IO_Field_write_nc4_X4
 SUBROUTINE IO_Field_write_nc4_X5(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -696,7 +698,7 @@ END SUBROUTINE IO_Field_write_nc4_X5
 SUBROUTINE IO_Field_write_nc4_X6(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),       INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                     INTENT(OUT):: KRESP
 !
@@ -731,7 +733,7 @@ USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
 #endif
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER,               INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -781,7 +783,7 @@ USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
 #endif
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -807,7 +809,7 @@ END SUBROUTINE IO_Field_write_nc4_N1
 SUBROUTINE IO_Field_write_nc4_N2(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -833,7 +835,7 @@ END SUBROUTINE IO_Field_write_nc4_N2
 SUBROUTINE IO_Field_write_nc4_N3(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,  INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),   INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP
 !
@@ -859,7 +861,7 @@ END SUBROUTINE IO_Field_write_nc4_N3
 SUBROUTINE IO_Field_write_nc4_N4(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,    INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -885,7 +887,7 @@ END SUBROUTINE IO_Field_write_nc4_N4
 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 LOGICAL,               INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -916,7 +918,7 @@ END SUBROUTINE IO_Field_write_nc4_L0
 SUBROUTINE IO_Field_write_nc4_L1(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -950,7 +952,7 @@ END SUBROUTINE IO_Field_write_nc4_L1
 SUBROUTINE IO_Field_write_nc4_C0(TPFILE,TPFIELD,HFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),      INTENT(IN) :: HFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -988,7 +990,7 @@ SUBROUTINE IO_Field_write_nc4_C1(TPFILE,TPFIELD,HFIELD,KRESP)
 !    J.Escobar : 25/04/2018 : missing 'IF ALLOCATED(IVDIMSTMP)' DEALLOCATE
 !----------------------------------------------------------------
 TYPE(TFILEDATA),              INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),             INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),        INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),DIMENSION(:),INTENT(IN)  :: HFIELD
 INTEGER,                      INTENT(OUT) :: KRESP
 !
@@ -1025,22 +1027,22 @@ USE MODD_TYPE_DATE
 USE MODE_DATETIME
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME),      INTENT(IN) :: TPDATA
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT) :: istatus
-INTEGER(KIND=CDFINT) :: IVARID
-TYPE(TFIELDDATA)     :: TZFIELD
-CHARACTER(LEN=40)    :: YUNITS
-REAL                 :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)      :: TZREF
+CHARACTER(LEN=40)                  :: YUNITS
+INTEGER(KIND=CDFINT)               :: istatus
+INTEGER(KIND=CDFINT)               :: IVARID
+REAL                               :: ZDELTATIME !Distance in seconds since reference date and time
+CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD
+TYPE(DATE_TIME)                    :: TZREF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
 KRESP = 0
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
@@ -1079,24 +1081,24 @@ USE MODD_TYPE_DATE
 USE MODE_DATETIME
 !
 TYPE(TFILEDATA),                INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),          INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA
 INTEGER,                        INTENT(OUT):: KRESP
 !
-CHARACTER(LEN=40)               :: YUNITS
-INTEGER                         :: JI
-INTEGER(KIND=CDFINT)            :: istatus
-INTEGER(KIND=CDFINT)            :: IVARID
-logical                         :: gisempty
-REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)                 :: TZREF
-TYPE(TFIELDDATA)                :: TZFIELD
+CHARACTER(LEN=40)                  :: YUNITS
+INTEGER                            :: JI
+INTEGER(KIND=CDFINT)               :: istatus
+INTEGER(KIND=CDFINT)               :: IVARID
+logical                            :: gisempty
+REAL, DIMENSION(:),    ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time
+CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD
+TYPE(DATE_TIME)                    :: TZREF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
 KRESP = 0
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
@@ -1136,7 +1138,7 @@ END SUBROUTINE IO_Field_write_nc4_T1
 subroutine IO_Field_partial_write_nc4_X1( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                intent(in)  :: tpfile
-type(tfielddata),               intent(in)  :: tpfield
+class(tfieldmetadata),          intent(in)  :: tpfield
 real,             dimension(:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(1), intent(in)  :: koffset
 integer,                        intent(out) :: kresp
@@ -1173,20 +1175,20 @@ end subroutine IO_Field_partial_write_nc4_X1
 subroutine IO_Field_partial_write_nc4_X2( tpfile, tpfield, pfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                  intent(in)  :: tpfile
-type(tfielddata),                 intent(in)  :: tpfield
+class(tfieldmetadata),            intent(in)  :: tpfield
 real,             dimension(:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(2),   intent(in)  :: koffset
 integer,                          intent(out) :: kresp
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(2) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(2) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1219,7 +1221,7 @@ end subroutine IO_Field_partial_write_nc4_X2
 subroutine IO_Field_partial_write_nc4_X3( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                    intent(in)  :: tpfile
-type(tfielddata),                   intent(in)  :: tpfield
+class(tfieldmetadata),              intent(in)  :: tpfield
 real,             dimension(:,:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(3),     intent(in)  :: koffset
 integer,                            intent(out) :: kresp
@@ -1256,7 +1258,7 @@ end subroutine IO_Field_partial_write_nc4_X3
 subroutine IO_Field_partial_write_nc4_X4( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                      intent(in)  :: tpfile
-type(tfielddata),                     intent(in)  :: tpfield
+class(tfieldmetadata),                intent(in)  :: tpfield
 real,             dimension(:,:,:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(4),       intent(in)  :: koffset
 integer,                              intent(out) :: kresp
@@ -1293,20 +1295,20 @@ end subroutine IO_Field_partial_write_nc4_X4
 subroutine IO_Field_partial_write_nc4_N2( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                  intent(in)  :: tpfile
-type(tfielddata),                 intent(in)  :: tpfield
+class(tfieldmetadata),            intent(in)  :: tpfield
 integer,          dimension(:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(2),   intent(in)  :: koffset
 integer,                          intent(out) :: kresp
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(2) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(2) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1339,20 +1341,20 @@ end subroutine IO_Field_partial_write_nc4_N2
 subroutine IO_Field_partial_write_nc4_N3( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                    intent(in)  :: tpfile
-type(tfielddata),                   intent(in)  :: tpfield
+class(tfieldmetadata),              intent(in)  :: tpfield
 integer,          dimension(:,:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(3),     intent(in)  :: koffset
 integer,                            intent(out) :: kresp
 integer,                  optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                  optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(3) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(3) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1385,20 +1387,20 @@ end subroutine IO_Field_partial_write_nc4_N3
 subroutine IO_Field_partial_write_nc4_N4( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                      intent(in)  :: tpfile
-type(tfielddata),                     intent(in)  :: tpfield
+class(tfieldmetadata),                intent(in)  :: tpfield
 integer,          dimension(:,:,:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(4),       intent(in)  :: koffset
 integer,                              intent(out) :: kresp
 integer,                    optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                    optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(4) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(4) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1428,7 +1430,7 @@ if ( Present( kvertlevel ) ) deallocate( tzfield )
 end subroutine IO_Field_partial_write_nc4_N4
 
 
-subroutine IO_Coordvar_write_nc4( tpfile, hprogram_orig )
+subroutine IO_Coordvar_write_nc4( tpfile, hprogram_orig, tpdtmodeln )
 use modd_aircraft_balloon
 use modd_budget,     only: cbutype, lbu_icp, lbu_jcp, lbu_kcp, nbuih, nbuil, nbujh, nbujl, nbukh, nbukl, nbukmax, &
                            nbustep, nbutotwrite
@@ -1449,7 +1451,7 @@ use modd_field,      only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, N
                            NMNHDIM_PROFILER_TIME, NMNHDIM_STATION_TIME,                                    &
                            tfieldlist
 use modd_grid,       only: xlatori, xlonori
-use modd_grid_n,     only: lsleve, xxhat, xyhat, xzhat
+use modd_grid_n,     only: lsleve, xxhat, xxhatm, xyhat, xyhatm, xzhat, xzhatm, xxhat_ll, xyhat_ll, xxhatm_ll, xyhatm_ll
 use modd_les,        only: cles_level_type, cspectra_level_type, nlesn_iinf, nlesn_isup, nlesn_jinf, nlesn_jsup, &
                            nles_k, nles_levels, nspectra_k, nspectra_levels,                                     &
                            xles_altitudes, xspectra_altitudes
@@ -1457,10 +1459,10 @@ use modd_les_n,      only: nles_dtcount, nles_mean_end, nles_mean_start, nles_me
                            nles_times, nspectra_ni, nspectra_nj, tles_dates, xles_times
 use modd_netcdf,     only: tdimnc
 use modd_parameters, only: jphext, JPVEXT
-use modd_profiler_n, only: numbprofiler, tprofiler
+use modd_profiler_n, only: lprofiler, tprofilers_time
 use modd_series,     only: lseries
 use modd_series_n,   only: nsnbstept, tpsdates
-use modd_station_n,  only: numbstat, tstation
+use modd_station_n,  only: lstation, tstations_time
 use modd_time,       only: tdtseg
 use modd_time_n,     only: tdtcur
 use modd_type_date,  only: date_time
@@ -1471,10 +1473,11 @@ use mode_nest_ll,    only: Get_model_number_ll, Go_tomodel_ll
 
 type(tfiledata),            intent(in) :: tpfile
 character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file coming from this program
+type(date_time),  optional, intent(in) :: tpdtmodeln    !Time of model (to force model date written in file)
 
 character(len=:),                         allocatable :: ystdnameprefix
 character(len=:),                         allocatable :: yprogram
-integer                                               :: iiu, iju, iku
+integer                                               :: iiu, iju
 integer                                               :: id, iid, iresp
 integer                                               :: imi
 integer                                               :: ji
@@ -1485,7 +1488,7 @@ logical                                               :: gchangemodel
 logical                                               :: gdealloc
 logical,                         pointer              :: gsleve
 real,            dimension(:),   pointer              :: zxhat, zyhat, zzhat
-real,            dimension(:),            allocatable :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space
+real,            dimension(:),   pointer              :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space
 real,            dimension(:),            allocatable :: zles_levels
 real,            dimension(:),            allocatable :: zspectra_levels
 real,            dimension(:,:), pointer              :: zlat, zlon
@@ -1493,9 +1496,9 @@ type(tdimnc),                    pointer              :: tzdim_ni, tzdim_nj, tzd
 type(date_time), dimension(:),            allocatable :: tzdates
 type(date_time), dimension(:,:),          allocatable :: tzdates_bound
 
+real, dimension(:),   pointer :: zxhat_glob,  zyhat_glob
+real, dimension(:),   pointer :: zxhatm_glob, zyhatm_glob
 !These variables are save: they are populated once for the master Z-split file and freed after the last file has been written
-real, dimension(:),   pointer, save :: zxhat_glob  => null(), zyhat_glob  => null()
-real, dimension(:),   pointer, save :: zxhatm_glob => null(), zyhatm_glob => null()
 real, dimension(:,:), pointer, save :: zlatm_glob  => null(), zlonm_glob  => null()
 real, dimension(:,:), pointer, save :: zlatu_glob  => null(), zlonu_glob  => null()
 real, dimension(:,:), pointer, save :: zlatv_glob  => null(), zlonv_glob  => null()
@@ -1504,9 +1507,16 @@ real, dimension(:,:), pointer, save :: zlatf_glob  => null(), zlonf_glob  => nul
 
 call Print_msg( NVERB_DEBUG, 'IO', 'IO_Coordvar_write_nc4', 'called for ' // Trim( tpfile%cname ) )
 
-zxhat => null()
-zyhat => null()
-zzhat => null()
+zxhat  => null()
+zyhat  => null()
+zzhat  => null()
+zxhatm => null()
+zyhatm => null()
+zzhatm => null()
+zxhat_glob  => null()
+zyhat_glob  => null()
+zxhatm_glob => null()
+zyhatm_glob => null()
 
 gchangemodel = .false.
 
@@ -1526,8 +1536,22 @@ if ( tpfile%nmodel > 0 ) then
   zxhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
   call Find_field_id_from_mnhname( 'YHAT', iid, iresp )
   zyhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'XHATM', iid, iresp )
+  zxhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'YHATM', iid, iresp )
+  zyhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
   call Find_field_id_from_mnhname( 'ZHAT', iid, iresp )
   zzhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'ZHATM', iid, iresp )
+  zzhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'XHAT_ll', iid, iresp )
+  zxhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'YHAT_ll', iid, iresp )
+  zyhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'XHATM_ll', iid, iresp )
+  zxhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'YHATM_ll', iid, iresp )
+  zyhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
   call Find_field_id_from_mnhname( 'SLEVE', iid, iresp )
   gsleve => tfieldlist(iid)%tfield_l0d(tpfile%nmodel)%data
 
@@ -1537,21 +1561,21 @@ if ( tpfile%nmodel > 0 ) then
     gchangemodel = .true.
   end if
 else
-  zxhat => xxhat
-  zyhat => xyhat
-  zzhat => xzhat
+  zxhat  => xxhat
+  zyhat  => xyhat
+  zzhat  => xzhat
+  zxhatm => xxhatm
+  zyhatm => xyhatm
+  zzhatm => xzhatm
+  zxhat_glob  => xxhat_ll
+  zyhat_glob  => xyhat_ll
+  zxhatm_glob => xxhatm_ll
+  zyhatm_glob => xyhatm_ll
   gsleve => lsleve
 end if
 
 iiu = Size( zxhat )
 iju = Size( zyhat )
-Allocate( zxhatm(iiu), zyhatm(iju) )
-!zxhatm(iiu) and zyhatm(iju) are correct only on some processes
-!but it is OK due to the way Gather_xxfield is done
-zxhatm(1 : iiu - 1) = 0.5 * ( zxhat(1 : iiu - 1) + zxhat(2 : iiu) )
-zxhatm(iiu)         = 2. * zxhat(iiu) - zxhatm(iiu - 1)
-zyhatm(1 : iju - 1) = 0.5 * ( zyhat(1 : iju - 1) + zyhat(2 : iju) )
-zyhatm(iju)         = 2. * zyhat(iju) - zyhatm(iju - 1)
 
 if ( lcartesian ) then
   ystdnameprefix = 'plane'
@@ -1575,14 +1599,6 @@ else
   tzdim_nj_v => Null()
 end if
 
-!If the file is a Z-split subfile, coordinates are already collected
-if ( .not. Associated( tpfile%tmainfile ) ) then
-  call Gather_hor_coord1d( 'X', zxhat,  zxhat_glob  )
-  call Gather_hor_coord1d( 'X', zxhatm, zxhatm_glob )
-  call Gather_hor_coord1d( 'Y', zyhat,  zyhat_glob  )
-  call Gather_hor_coord1d( 'Y', zyhatm, zyhatm_glob )
-end if
-
 call Write_hor_coord1d( tzdim_ni,   'x-dimension of the grid', &
                         trim(ystdnameprefix)//'_x_coordinate',               'X', 0.,   jphext, jphext, zxhatm_glob )
 call Write_hor_coord1d( tzdim_nj,   'y-dimension of the grid', &
@@ -1596,7 +1612,6 @@ call Write_hor_coord1d( tzdim_ni_v, 'x-dimension of the grid at v location', &
 call Write_hor_coord1d( tzdim_nj_v, 'y-dimension of the grid at v location', &
                         trim(ystdnameprefix)//'_y_coordinate_at_v_location', 'Y', -0.5, jphext, 0,      zyhat_glob  )
 
-!The z?hat*_glob were allocated in Gather_hor_coord1d calls
 !Deallocate only if it is a non Z-split file or the last Z-split subfile
 gdealloc = .false.
 if ( Associated( tpfile%tmainfile ) ) then
@@ -1633,17 +1648,10 @@ if ( .not. lcartesian ) then
   if ( gdealloc ) Deallocate( zlatm_glob, zlonm_glob, zlatu_glob, zlonu_glob, zlatv_glob, zlonv_glob, zlatf_glob, zlonf_glob )
 end if
 
-Deallocate( zxhatm, zyhatm )
-
 if ( tpfile%lmaster ) then !vertical coordinates in the transformed space are the same on all processes
   if ( Trim( yprogram ) /= 'PGD' .and. Trim( yprogram ) /= 'NESPGD' .and. Trim( yprogram ) /= 'ZOOMPG' &
       .and. .not. ( Trim( yprogram ) == 'REAL' .and. cstorage_type == 'SU') ) then !condition to detect prep_surfex
 
-    iku = Size( zzhat )
-    Allocate( zzhatm(iku) )
-    zzhatm(1 : iku - 1) = 0.5 * ( zzhat(2 : iku) + zzhat(1 : iku - 1) )
-    zzhatm(iku)         = 2.* zzhat(iku) - zzhatm(iku - 1)
-
     call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_LEVEL),  'position z in the transformed space',              '', &
                           'altitude',                0.,  JPVEXT, JPVEXT, ZZHATM )
     call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_LEVEL_W),'position z in the transformed space at w location','', &
@@ -1655,8 +1663,13 @@ END IF
 if ( tpfile%lmaster ) then !time scale is the same on all processes
   if ( Trim( yprogram ) /= 'PGD' .and. Trim( yprogram ) /= 'NESPGD' .and. Trim( yprogram ) /= 'ZOOMPG' &
       .and. .not. ( Trim( yprogram ) == 'REAL' .and. cstorage_type == 'SU' ) ) then !condition to detect prep_surfex
-    if ( tpfile%ctype /= 'MNHDIACHRONIC' .and. Associated( tdtcur ) ) &
-      call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tdtcur ] )
+    if ( tpfile%ctype /= 'MNHDIACHRONIC' ) then
+      if ( Present( tpdtmodeln ) ) then
+        call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tpdtmodeln ] )
+      else if ( Associated( tdtcur ) ) then
+        call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tdtcur ] )
+      end if
+    end if
   end if
 end if
 
@@ -1836,12 +1849,12 @@ if ( tpfile%lmaster ) then
     end if
 
     !Coordinates for the number of profiler times
-    if ( numbprofiler > 0 ) &
-      call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates )
+    if ( lprofiler ) &
+      call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofilers_time%tpdates )
 
     !Coordinates for the number of station times
-    if ( numbstat > 0 ) &
-      call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_STATION_TIME), 'time axis for stations', tstation%tpdates )
+    if ( lstation ) &
+      call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_STATION_TIME), 'time axis for stations', tstations_time%tpdates )
 
     !Dimension for the number of series times
     if ( lseries .and. nsnbstept > 0 ) then
@@ -1855,59 +1868,37 @@ if ( tpfile%lmaster ) then
     end if
 
     if ( lflyer ) then
-      call Write_flyer_time_coord( tballoon1 )
-      call Write_flyer_time_coord( tballoon2 )
-      call Write_flyer_time_coord( tballoon3 )
-      call Write_flyer_time_coord( tballoon4 )
-      call Write_flyer_time_coord( tballoon5 )
-      call Write_flyer_time_coord( tballoon6 )
-      call Write_flyer_time_coord( tballoon7 )
-      call Write_flyer_time_coord( tballoon8 )
-      call Write_flyer_time_coord( tballoon9 )
-
-      call Write_flyer_time_coord( taircraft1 )
-      call Write_flyer_time_coord( taircraft2 )
-      call Write_flyer_time_coord( taircraft3 )
-      call Write_flyer_time_coord( taircraft4 )
-      call Write_flyer_time_coord( taircraft5 )
-      call Write_flyer_time_coord( taircraft6 )
-      call Write_flyer_time_coord( taircraft7 )
-      call Write_flyer_time_coord( taircraft8 )
-      call Write_flyer_time_coord( taircraft9 )
-      call Write_flyer_time_coord( taircraft10 )
-      call Write_flyer_time_coord( taircraft11 )
-      call Write_flyer_time_coord( taircraft12 )
-      call Write_flyer_time_coord( taircraft13 )
-      call Write_flyer_time_coord( taircraft14 )
-      call Write_flyer_time_coord( taircraft15 )
-      call Write_flyer_time_coord( taircraft16 )
-      call Write_flyer_time_coord( taircraft17 )
-      call Write_flyer_time_coord( taircraft18 )
-      call Write_flyer_time_coord( taircraft19 )
-      call Write_flyer_time_coord( taircraft20 )
-      call Write_flyer_time_coord( taircraft21 )
-      call Write_flyer_time_coord( taircraft22 )
-      call Write_flyer_time_coord( taircraft23 )
-      call Write_flyer_time_coord( taircraft24 )
-      call Write_flyer_time_coord( taircraft25 )
-      call Write_flyer_time_coord( taircraft26 )
-      call Write_flyer_time_coord( taircraft27 )
-      call Write_flyer_time_coord( taircraft28 )
-      call Write_flyer_time_coord( taircraft29 )
-      call Write_flyer_time_coord( taircraft30 )
+      ! Remark: to work flyer data must be on the file master rank
+      ! This is currently ensured in WRITE_AIRCRAFT_BALLOON subroutine
+      do ji = 1, nballoons
+        if ( associated( tballoons(ji)%tballoon ) ) then
+          call Write_flyer_time_coord( tballoons(ji)%tballoon )
+        else
+          call Print_msg( NVERB_ERROR, 'IO', 'IO_Coordvar_write_nc4','tballoon not associated' )
+        end if
+      end do
+
+      do ji = 1, naircrafts
+        if ( associated( taircrafts(ji)%taircraft ) ) then
+          call Write_flyer_time_coord( taircrafts(ji)%taircraft )
+        else
+          call Print_msg( NVERB_ERROR, 'IO', 'IO_Coordvar_write_nc4','taircraft not associated' )
+        end if
+      end do
     end if
 
   end if !MNHDIACHRONIC
 
 end if
 
-if ( gdealloc ) deallocate( zxhat_glob, zxhatm_glob, zyhat_glob, zyhatm_glob )
 
 if ( gchangemodel ) call Go_tomodel_ll( imi, iresp )
 
 
 contains
 
+#if 0
+!Not used anymore
 subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob )
   use mode_allocbuffer_ll, only: Allocbuffer_ll
   use mode_gather_ll,      only: Gather_xxfield
@@ -1951,7 +1942,9 @@ subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob )
   !PW: TODO: broadcast only to subfile writers
   if ( tpfile%nsubfiles_ioz > 0 ) &
     call MPI_BCAST( pcoords_glob, size( pcoords_glob ), MNHREAL_MPI, tpfile%nmaster_rank - 1,  tpfile%nmpicomm, ierr )
+
 end subroutine Gather_hor_coord1d
+#endif
 
 
 subroutine Gather_hor_coord2d( px, py, plat_glob, plon_glob )
@@ -2290,11 +2283,11 @@ subroutine Write_flyer_time_coord( tpflyer )
   use modd_aircraft_balloon
   use modd_parameters,       only: NBUNAMELGTMAX, XUNDEF
 
+  use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get
   use mode_io_tools_nc4,     only: IO_Mnhname_clean
 
-  use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
-  type(flyer), intent(in) :: tpflyer
+  class(tflyerdata), intent(in) :: tpflyer
 
   character(len=NBUNAMELGTMAX) :: ytype
   character(len=NBUNAMELGTMAX) :: ytype_clean
@@ -2305,7 +2298,7 @@ subroutine Write_flyer_time_coord( tpflyer )
   type(tdimnc),        pointer :: tzdim
 
   !Do it only if correct model level and has really flown
-  if ( tpflyer%nmodel == imi .and. Count( tpflyer%x /= XUNDEF) > 1 ) then
+  if ( tpflyer%nmodel == imi .and. Count( tpflyer%xx /= XUNDEF) > 1 ) then
     Allocate( tzdim )
 
     istatus = NF90_INQ_NCID( tpfile%nncid, 'Flyers', icatid )
@@ -2322,16 +2315,16 @@ subroutine Write_flyer_time_coord( tpflyer )
                       Trim( tpfile%cname ) // ': group ' // Trim( ytype_clean ) // ' not found' )
     end if
 
-    istatus = NF90_INQ_NCID( isubcatid, Trim( tpflyer%title ), incid )
+    istatus = NF90_INQ_NCID( isubcatid, Trim( tpflyer%ctitle ), incid )
     if ( istatus /= NF90_NOERR ) then
       call Print_msg( NVERB_ERROR, 'IO', 'Write_flyer_time_coord', &
-                      Trim( tpfile%cname ) // ': group '// Trim( tpflyer%title ) // ' not found' )
+                      Trim( tpfile%cname ) // ': group '// Trim( tpflyer%ctitle ) // ' not found' )
     end if
 
     istatus = NF90_INQ_DIMID( incid, 'time_flyer', idimid )
     if ( istatus /= NF90_NOERR ) then
       call Print_msg( NVERB_ERROR, 'IO', 'Write_flyer_time_coord', &
-                      Trim( tpfile%cname ) // ': group ' // Trim( tpflyer%title ) // ' time_flyer dimension not found' )
+                      Trim( tpfile%cname ) // ': group ' // Trim( tpflyer%ctitle ) // ' time_flyer dimension not found' )
     end if
 
     tzdim%cname = 'time_flyer'
@@ -2339,7 +2332,7 @@ subroutine Write_flyer_time_coord( tpflyer )
     tzdim%nid = idimid
 
     !Remark: incid is used in Write_time_coord
-    call Write_time_coord( tzdim, 'time axis for flyer', tpflyer%tpdates )
+    call Write_time_coord( tzdim, 'time axis for flyer', tpflyer%tflyer_time%tpdates )
 
     Deallocate( tzdim )
 
@@ -2363,7 +2356,7 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Header_write_nc4','called for file '//TRIM(TPFILE%CNAME))
 !
 IF (TPFILE%LMASTER)  THEN
-  ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.7 COMODO-1.4')
+  ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.10 COMODO-1.4')
   IF (ISTATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_FILE_WRITE_HEADER','NF90_PUT_ATT','Conventions')
 
 #if (MNH_REAL == 8)
@@ -2463,8 +2456,8 @@ END SUBROUTINE IO_History_append_nc4
 
 subroutine IO_Select_split_file( tpfile, tpfield, tpfileout, tpfieldout, kvertlevel, kzfile )
 type(tfiledata),  target,         intent(in)  :: tpfile
-type(tfielddata), target,         intent(in)  :: tpfield
-type(tfielddata), pointer,        intent(out) :: tpfieldout
+class(tfieldmetadata), target,    intent(in)  :: tpfield
+class(tfieldmetadata), pointer,   intent(out) :: tpfieldout
 type(tfiledata),  pointer,        intent(out) :: tpfileout
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
@@ -2478,9 +2471,8 @@ if ( Present( kvertlevel ) ) then
 
   Write( ysuffix, '( i4.4 )' ) kvertlevel
   tpfileout => tpfile%tfiles_ioz(kzfile)%tfile
-  !Copy the values of tpfield to the pointer tpfieldout (new tfielddata)
-  Allocate( tpfieldout )
-  tpfieldout = tpfield
+  !Copy the values of tpfield to the pointer tpfieldout
+  Allocate( tpfieldout, source = tpfield )
   tpfieldout%cmnhname  = Trim( tpfieldout%cmnhname ) // ysuffix
   if ( Len_trim( tpfieldout%cstdname  ) > 0 )  tpfieldout%cstdname  = Trim( tpfieldout%cstdname  ) // '_at_level_' // ysuffix
   if ( Len_trim( tpfieldout%clongname ) > 0 )  tpfieldout%clongname = Trim( tpfieldout%clongname ) // ' at level ' // ysuffix
diff --git a/src/LIB/SURCOUCHE/src/mode_msg.f90 b/src/LIB/SURCOUCHE/src/mode_msg.f90
index 80d2f6677cf7209871081707050fbf5b14de918a..ac78920fae6da2b112c7c296f9a9d30829c4b6e6 100644
--- a/src/LIB/SURCOUCHE/src/mode_msg.f90
+++ b/src/LIB/SURCOUCHE/src/mode_msg.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2017-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2017-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.
@@ -12,6 +12,7 @@
 !  P. Wautelet 17/01/2020: add 'BUD' category for Print_msg
 !  P. Wautelet 08/04/2020: add multiline Print_msg
 !  P. Wautelet 01/07/2021: add counters for the number of prints + subroutine Msg_stats
+!  P. Wautelet 01/07/2022: add olocal optional argument to force Print_msg on current process
 !-----------------------------------------------------------------
 module mode_msg
 
@@ -37,22 +38,24 @@ end interface Print_msg
 
 contains
 
-subroutine Print_msg_1line( kverb, hdomain, hsubr, hmsg )
-  integer,          intent(in) :: kverb   !Verbosity level
-  character(len=*), intent(in) :: hdomain !Domain/category of message
-  character(len=*), intent(in) :: hsubr   !Subroutine/function name
-  character(len=*), intent(in) :: hmsg    !Message
+subroutine Print_msg_1line( kverb, hdomain, hsubr, hmsg, olocal )
+  integer,           intent(in) :: kverb   !Verbosity level
+  character(len=*),  intent(in) :: hdomain !Domain/category of message
+  character(len=*),  intent(in) :: hsubr   !Subroutine/function name
+  character(len=*),  intent(in) :: hmsg    !Message
+  logical, optional, intent(in) :: olocal  !true to force print on this process (if verbosity level is high enough)
 
-  call Print_msg_multi( kverb, hdomain, hsubr, [hmsg] )
+  call Print_msg_multi( kverb, hdomain, hsubr, [hmsg], olocal )
 
 end subroutine Print_msg_1line
 
 
-subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr )
+subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr, olocal )
 
-  integer,          intent(in) :: kverb   !Verbosity level
-  character(len=*), intent(in) :: hdomain !Domain/category of message
-  character(len=*), intent(in) :: hsubr   !Subroutine/function name
+  integer,           intent(in) :: kverb   !Verbosity level
+  character(len=*),  intent(in) :: hdomain !Domain/category of message
+  character(len=*),  intent(in) :: hsubr   !Subroutine/function name
+  logical, optional, intent(in) :: olocal  !true to force print on this process (if verbosity level is high enough)
 
   integer :: ilines
 
@@ -71,7 +74,7 @@ subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr )
 end subroutine Print_msg_multi_cmnhmsg
 
 
-subroutine Print_msg_multi( KVERB, HDOMAIN, HSUBR, HMSG )
+subroutine Print_msg_multi( KVERB, HDOMAIN, HSUBR, HMSG, OLOCAL )
 !
 USE ISO_FORTRAN_ENV, ONLY: ERROR_UNIT, OUTPUT_UNIT
 !
@@ -87,6 +90,7 @@ INTEGER,                        INTENT(IN) :: KVERB   !Verbosity level
 CHARACTER(LEN=*),               INTENT(IN) :: HDOMAIN !Domain/category of message
 CHARACTER(LEN=*),               INTENT(IN) :: HSUBR   !Subroutine/function name
 CHARACTER(LEN=*), dimension(:), INTENT(IN) :: HMSG    !Message
+LOGICAL, OPTIONAL,              INTENT(IN) :: OLOCAL  !true to force print on this process (if verbosity level is high enough)
 !
 character(len=2)  :: ysz
 CHARACTER(LEN=2)  :: YPRC
@@ -98,12 +102,19 @@ INTEGER :: IERR, IMAXVERB,IABORTLEVEL
 INTEGER :: ILU
 integer :: ji
 integer :: ilines
+logical :: glocal
 LOGICAL :: GWRITE_OUTLST,GWRITE_STDOUT
-!
+
+if ( present( olocal ) ) then
+  glocal = olocal
+else
+  glocal = .false.
+end if
+
 !Determine if the process will write
 GWRITE_OUTLST = .FALSE.
 GWRITE_STDOUT = .FALSE.
-IF (IP == 1 .OR. LVERB_ALLPRC) THEN
+IF ( IP == 1 .OR. LVERB_ALLPRC .OR. GLOCAL ) THEN
   IF (LVERB_OUTLST) GWRITE_OUTLST = .TRUE.
   IF (LVERB_STDOUT) GWRITE_STDOUT = .TRUE.
 END IF
@@ -178,7 +189,7 @@ else
   ysz = 'I4'
 end if
 
-if ( lverb_allprc ) then
+if ( lverb_allprc .or. glocal ) then
   if ( nproc < 10 ) then
     yprc = 'I1'
   else if ( nproc < 100 ) then
@@ -222,9 +233,9 @@ if ( lverb_allprc ) then
 else
   if ( gwrite_stdout ) then
     if ( ilines == 1 ) then
-        Write( unit = output_unit, fmt = "(a9,a30,a)" ) ypre, ysubr, Trim( hmsg(1) )
+        Write( unit = output_unit, fmt = "('0: ',a9,a30,a)" ) ypre, ysubr, Trim( hmsg(1) )
     else
-      yformat = '(a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)'
+      yformat = '("0: ",a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)'
       do ji = 1, ilines
         Write(unit = output_unit, fmt = yformat ) ypre, ysubr, ji, ilines, Trim( hmsg(ji) )
       end do
@@ -232,9 +243,9 @@ else
   end if
   if ( gwrite_outlst ) then
     if ( ilines == 1 ) then
-        Write( unit = ilu, fmt = "(a9,a30,a)") ypre, ysubr, Trim( hmsg(1) )
+        Write( unit = ilu, fmt = "('0: ',a9,a30,a)") ypre, ysubr, Trim( hmsg(1) )
     else
-      yformat = '(a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)'
+      yformat = '("0: ",a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)'
       do ji = 1, ilines
         Write( unit = ilu, fmt = yformat) ypre, ysubr, ji, ilines, Trim( hmsg(ji) )
       end do
diff --git a/src/LIB/hdf5-1.12.0.tar.gz b/src/LIB/hdf5-1.12.0.tar.gz
deleted file mode 100644
index b61a243e0a1baa69da1ba494a00809af9cc32f4e..0000000000000000000000000000000000000000
--- a/src/LIB/hdf5-1.12.0.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a62dcb276658cb78e6795dd29bf926ed7a9bc4edf6e77025cd2c689a8f97c17a
-size 12580850
diff --git a/src/LIB/hdf5-1.14.0.tar.gz b/src/LIB/hdf5-1.14.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..14467a66342048527655995b2cd28292bcbc3272
--- /dev/null
+++ b/src/LIB/hdf5-1.14.0.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a571cc83efda62e1a51a0a912dd916d01895801c5025af91669484a1575a6ef4
+size 19285771
diff --git a/src/LIB/libaec-0.3.4.tar.gz b/src/LIB/libaec-0.3.4.tar.gz
deleted file mode 100644
index f35f3df1af288e0354f300788a86d57583a287fd..0000000000000000000000000000000000000000
--- a/src/LIB/libaec-0.3.4.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:62af371b50b9ee93fa1d0d038809f3b1ab4dc4b75c182982fcdcd90c1847666b
-size 1495364
diff --git a/src/LIB/libaec-v1.0.6.tar.gz b/src/LIB/libaec-v1.0.6.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..9a4e3c40caa0cf72438f7e54e9cee4bfeda4ab90
--- /dev/null
+++ b/src/LIB/libaec-v1.0.6.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2675d26b24a081cdaaa48e0d085632e568e3f85f843f62b91fc51e1b3f5fe93f
+size 2777547
diff --git a/src/LIB/netcdf-c-4.7.4.tar.gz b/src/LIB/netcdf-c-4.7.4.tar.gz
deleted file mode 100644
index e0062fbd761c0bb1ac3ef87e0e39e01339371ff9..0000000000000000000000000000000000000000
--- a/src/LIB/netcdf-c-4.7.4.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:99930ad7b3c4c1a8e8831fb061cb02b2170fc8e5ccaeda733bd99c3b9d31666b
-size 19711158
diff --git a/src/LIB/netcdf-c-4.9.0.tar.gz b/src/LIB/netcdf-c-4.9.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..6ee47e081789963c760d947169817a78c299d41b
--- /dev/null
+++ b/src/LIB/netcdf-c-4.9.0.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c956022b79c08e5e14eee8df51b13c28e6121c2b7e7faadc21b375949400b49
+size 7103958
diff --git a/src/LIB/netcdf-fortran-4.5.3.tar.gz b/src/LIB/netcdf-fortran-4.5.3.tar.gz
deleted file mode 100644
index 8533eec91cf5a04b7a03244a9ff06aef193b0f55..0000000000000000000000000000000000000000
--- a/src/LIB/netcdf-fortran-4.5.3.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c6da30c2fe7e4e614c1dff4124e857afbd45355c6798353eccfa60c0702b495a
-size 1805683
diff --git a/src/LIB/netcdf-fortran-4.6.0.tar.gz b/src/LIB/netcdf-fortran-4.6.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..acc4addf308e9f42bfcaeac1876fa79edb2342c9
--- /dev/null
+++ b/src/LIB/netcdf-fortran-4.6.0.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:198bff6534cc85a121adc9e12f1c4bc53406c403bda331775a1291509e7b2f23
+size 1110214
diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index cd93fe4fa34499fe46eb5fc4ca5ce4ab810cf196..a0ef0da8c88e61797c558e314337d6380a7bc402 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.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.
@@ -47,7 +47,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT , PSVT
                                                   ! Variables at t
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHVREF   ! Virtual Temperature
                                           ! of the reference state
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS, PRTKES
 REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS
@@ -152,7 +153,7 @@ use modd_budget,     only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc,
 USE MODD_CST
 USE MODD_CTURB,          ONLY: XTKEMIN
 USE MODD_CONF,           ONLY: LNEUTRAL,NHALO,L1D, L2D
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IBM_PARAM_n,    ONLY: LIBM,XIBM_LS,XIBM_EPSI
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LUNIT_n,        ONLY: TLUOUT
@@ -212,7 +213,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT , PSVT
                                                   ! Variables at t
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHVREF   ! Virtual Temperature
                                           ! of the reference state
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS, PRTKES
 REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS
@@ -275,11 +277,11 @@ TYPE(LIST_ll), POINTER      :: TZFIELDS0_ll ! list of fields to exchange
 TYPE(LIST_ll), POINTER      :: TZFIELDS1_ll ! list of fields to exchange
 !
 !
-INTEGER             :: IRESP        ! Return code of FM routines
-INTEGER             :: ILUOUT       ! logical unit
-INTEGER             :: ISPLIT_PPM   ! temporal time splitting 
-INTEGER             :: IIB, IIE, IJB, IJE,IKB,IKE
-TYPE(TFIELDDATA) :: TZFIELD
+INTEGER              :: IRESP        ! Return code of FM routines
+INTEGER              :: ILUOUT       ! logical unit
+INTEGER              :: ISPLIT_PPM   ! temporal time splitting
+INTEGER              :: IIB, IIE, IJB, IJE,IKB,IKE
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       0.     INITIALIZATION                        
@@ -366,54 +368,58 @@ END IF
 !* prints in the file the 3D Courant numbers (one should flag this)
 !
 IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN
-    TZFIELD%CMNHNAME   = 'CFLU'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CFLU'
-    TZFIELD%CUNITS     = '1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CFLU'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLU',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLU',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLU', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU)
 !
   IF (.NOT. L2D) THEN
-    TZFIELD%CMNHNAME   = 'CFLV'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CFLV'
-    TZFIELD%CUNITS     = '1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CFLV'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLV',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLV',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLV', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV)
   END IF
 !
-    TZFIELD%CMNHNAME   = 'CFLW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CFLW'
-    TZFIELD%CUNITS     = '1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CFLW'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLW',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLW',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLW', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW)
 !
-    TZFIELD%CMNHNAME   = 'CFL'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CFL'
-    TZFIELD%CUNITS     = '1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CFL'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(   &
+      CMNHNAME   = 'CFL',       &
+      CSTDNAME   = '',          &
+      CLONGNAME  = 'CFL',       &
+      CUNITS     = '1',         &
+      CDIR       = 'XY',        &
+      CCOMMENT   = 'X_Y_Z_CFL', &
+      NGRID      = 1,           &
+      NTYPE      = TYPEREAL,    &
+      NDIMS      = 3,           &
+      LTIMEDEP   = .TRUE.       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFL)
 END IF
 !
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 64a497958d0296f788ea7d87e77af64a9a9c0485..8b05aa48032b66a32222133ae26f430c29a4cb53 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -30,8 +30,9 @@ REAL,                     INTENT(IN)    :: PTSTEP
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT
                                                   ! Variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ               
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS , PRVS, PRWS
                                                   ! Sources terms 
@@ -132,7 +133,8 @@ REAL,                     INTENT(IN)    :: PTSTEP
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT
                                                   ! Variables at t
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ               
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS , PRVS, PRWS
                                                   ! Sources terms 
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index 62787ea599d91b6def85a40a70d94cb1b97a3fd3..ac9c7f56df21e90c201e660395348ec8392b4335 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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.
@@ -30,7 +30,8 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUM, PVM, PWM
                                                   ! Variables at t-dt
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDUM, PDVM, PDWM
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT, PRHODJ
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS , PRVS  , PRWS
                                                   ! Sources terms 
@@ -125,7 +126,8 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUM, PVM, PWM
                                                   ! Variables at t-dt
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDUM, PDVM, PDWM
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT, PRHODJ
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ,PDZX,PDZY
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS , PRVS  , PRWS
                                                   ! Sources terms 
diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90
index 97faca64cb603b8b904a8512a07a01a45f85f619..22d5f69a9b8e052d1f28a46fe8a2d524a9e5913c 100644
--- a/src/MNH/aer_monitorn.f90
+++ b/src/MNH/aer_monitorn.f90
@@ -1,4 +1,4 @@
-!ORILAM_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2008-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
@@ -214,7 +214,7 @@ IF (LDUST.AND.LSEDIMDUST) THEN
                   XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), &
                   XPABST(IIB:IIE,IJB:IJE,IKB:IKE), &
                   XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1),    &
-                  ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppp (concentration)
+                  ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppv (concentration)
 !
 DO JSV = NSV_DSTBEG, NSV_DSTEND
     XRSVS(IIB:IIE,IJB:IJE,IKB:IKE,JSV) = ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,JSV-NSV_DSTBEG+1)  *&
@@ -240,7 +240,7 @@ IF ((LSALT).AND.(LSEDIMSALT)) THEN
                   XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), &
                   XPABST(IIB:IIE,IJB:IJE,IKB:IKE), &
                   XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1),    &
-                  ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:))  !ppp (concentration)
+                  ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:))  !ppv (concentration)
 ! -- JORIS DEBUG --
 
 DO JSV = NSV_SLTBEG, NSV_SLTEND
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index ef6648cd6972e9caf618a7fa101eca6d44f82d66..3f7e8384f0663de5a2d13fca6f276ec1ca15e7ea 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -1,119 +1,65 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
+! Author: Valery Masson (Meteo-France)
+!     Original 15/05/2000
+! Modifications:
+!  P. Lacarrere   03/2008: add 3D fluxes
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet    06/2022: reorganize flyers
+!-----------------------------------------------------------------
 !      #####################
-MODULE MODI_AIRCRAFT_BALLOON
+MODULE MODE_AIRCRAFT_BALLOON
 !      #####################
-!
-INTERFACE
-!
-      SUBROUTINE AIRCRAFT_BALLOON(PTSTEP,                               &
-                                  PXHAT, PYHAT, PZ,                     &
-                                  PMAP, PLONOR, PLATOR,                 &
-                                  PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
-                                  PTS, PRHODREF, PCIT, PSEA)
-!
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
-REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
-REAL,                     INTENT(IN)     :: PLATOR ! origine latitude
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
-REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
-REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
-! ++ OC
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
-REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA
-! -- OC
-!
-!-------------------------------------------------------------------------------
-!
-END SUBROUTINE AIRCRAFT_BALLOON
-!
-SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE )
-  USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER
 
-  TYPE(FLYER),      INTENT(IN)  :: TPFLYER
-  CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE
-END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET
+USE MODE_MSG
 
-END INTERFACE
-!
-END MODULE MODI_AIRCRAFT_BALLOON
-!
-!     ###################################################################
-      SUBROUTINE AIRCRAFT_BALLOON(PTSTEP,                               &
-                                  PXHAT, PYHAT, PZ,                     &
-                                  PMAP, PLONOR, PLATOR,                 &
-                                  PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
-                                  PTS, PRHODREF, PCIT,  PSEA)
-!     ###################################################################
-!
-!
-!!****  *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts
-!!
-!!    PURPOSE
-!!    -------
-!
-!
-!!**  METHOD
-!!    ------
-!!    
-!!  
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      Valery Masson             * Meteo-France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 15/05/2000
-!!
-!!              March, 2008 (P.Lacarrere) Add 3D fluxes
-!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: AIRCRAFT_BALLOON
+
+PUBLIC :: AIRCRAFT_BALLOON_LONGTYPE_GET
+
+PUBLIC :: FLYER_RECV_AND_ALLOCATE, FLYER_SEND
+
+INTEGER, PARAMETER :: NTAG_NCUR = 145
+INTEGER, PARAMETER :: NTAG_PACK = 245
+
+INTEGER, PARAMETER :: NMODEL_FIX = 1
+INTEGER, PARAMETER :: NMODEL_MOB = 2
+
+INTEGER, PARAMETER :: NTYPE_AIRCRA = 0
+INTEGER, PARAMETER :: NTYPE_CVBALL = 1
+INTEGER, PARAMETER :: NTYPE_ISODEN = 2
+INTEGER, PARAMETER :: NTYPE_RADIOS = 4
+
+
+CONTAINS
 !
+!     #################################################################
+      SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, PZ,                         &
+                                  PMAP, PLONOR, PLATOR,               &
+                                  PU, PV, PW, PP, PTH, PR, PSV, PTKE, &
+                                  PTS, PRHODREF, PCIT, PSEA           )
+!     #################################################################
+! *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts
+
 USE MODD_AIRCRAFT_BALLOON
-!
 USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
-USE MODI_AIRCRAFT_BALLOON_EVOL
-!
-USE MODE_ll
-!
-!
+
+USE MODE_AIRCRAFT_BALLOON_EVOL,      ONLY: AIRCRAFT_BALLOON_EVOL
+
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 !
 REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
 REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
@@ -129,249 +75,797 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
-REAL, DIMENSION(:,:),INTENT(IN) :: PSEA
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
 !       0.2  declaration of local variables
 !
-!
+INTEGER                      :: JI
+LOGICAL, SAVE                :: GFIRSTCALL = .TRUE.
 !----------------------------------------------------------------------------
-IF(.NOT. ALLOCATED(XTHW_FLUX)) &
-ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
-IF(.NOT. ALLOCATED(XRCW_FLUX)) &
-ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
-IF(.NOT. ALLOCATED(XSVW_FLUX)) &
-ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
-!
-IF (TBALLOON1%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON1, PSEA                                            )
-ENDIF
-IF (TBALLOON2%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON2, PSEA                                            )
-ENDIF
-IF (TBALLOON3%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON3, PSEA                                            )
-ENDIF
-IF (TBALLOON4%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON4, PSEA                                            )
-ENDIF
-IF (TBALLOON5%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON5, PSEA                                            )
-ENDIF
-IF (TBALLOON6%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON6, PSEA                                            )
-ENDIF
-IF (TBALLOON7%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON7, PSEA                                            )
-ENDIF
-IF (TBALLOON8%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON8, PSEA                                            )
-ENDIF
-IF (TBALLOON9%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TBALLOON9, PSEA                                            )
-ENDIF
-!
-IF (TAIRCRAFT1%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT1, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT2%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT2, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT3%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT3, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT4%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT4, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT5%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT5, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT6%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT6, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT7%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT7, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT8%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT8, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT9%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT9, PSEA                                           )
-ENDIF
-IF (TAIRCRAFT10%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT10, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT11%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT11, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT12%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT12, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT13%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT13, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT14%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT14, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT15%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT15, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT16%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT16, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT17%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT17, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT18%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT18, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT19%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT19, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT20%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT20, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT21%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT21, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT22%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT22, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT23%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT23, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT24%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT24, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT25%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT25, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT26%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT26, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT27%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT27, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT28%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT28, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT29%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT29, PSEA                                          )
-ENDIF
-IF (TAIRCRAFT30%NMODEL /= 0) THEN
-CALL AIRCRAFT_BALLOON_EVOL(PTSTEP,  PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,           &
-                           PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,   &
-                           TAIRCRAFT30, PSEA                                          )
-ENDIF
+
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'AIRCRAFT_BALLOON', 'called' )
+
+IF(.NOT. ALLOCATED(XTHW_FLUX)) ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
+IF(.NOT. ALLOCATED(XRCW_FLUX)) ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
+IF(.NOT. ALLOCATED(XSVW_FLUX)) ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
+
+IF ( NBALLOONS > 0 ) THEN
+  IF ( GFIRSTCALL ) CALL BALLOONS_INIT_POSITIONS()
+  NRANKCUR_BALLOON(:) = NRANKNXT_BALLOON(:)
+  NRANKNXT_BALLOON(:) = 0
+
+  DO JI = 1, NBALLOONS
+    IF ( ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) THEN
+      CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                                   &
+                                  PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,            &
+                                  TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI), NRANKNXT_BALLOON(JI), &
+                                  PSEA )
+    END IF
+  END DO
+
+  CALL BALLOONS_MOVE_TO_NEW_RANKS()
+
+END IF
 !
+IF ( NAIRCRAFTS > 0 ) THEN
+  IF ( GFIRSTCALL ) CALL AIRCRAFTS_INIT_POSITIONS()
+  NRANKCUR_AIRCRAFT(:) = NRANKNXT_AIRCRAFT(:)
+  NRANKNXT_AIRCRAFT(:) = 0
+
+  DO JI = 1, NAIRCRAFTS
+    IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) THEN
+      CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                                       &
+                                  PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT,                &
+                                  TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI), NRANKNXT_AIRCRAFT(JI), &
+                                  PSEA )
+    END IF
+  END DO
+
+  CALL AIRCRAFTS_MOVE_TO_NEW_RANKS()
+END IF
+
+GFIRSTCALL = .FALSE.
+
+CONTAINS
+
 !----------------------------------------------------------------------------
-!
-END SUBROUTINE AIRCRAFT_BALLOON
+SUBROUTINE AIRCRAFTS_INIT_POSITIONS()
+
+USE MODD_DYN_n,                      ONLY: DYN_MODEL
+USE MODD_IO,                         ONLY: ISP
+USE MODD_TIME_n,                     ONLY: TDTCUR
+
+USE MODE_AIRCRAFT_BALLOON_EVOL,      ONLY: AIRCRAFT_COMPUTE_POSITION, FLYER_GET_RANK_MODEL_ISCRASHED
+USE MODE_DATETIME
+
+INTEGER                      :: IMODEL
+REAL                         :: ZDELTATIME
+TYPE(DATE_TIME)              :: TZDATE
+TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT
 
+! Set next rank to 0 (necessary for MPI_ALLREDUCE)
+NRANKNXT_AIRCRAFT(:) = 0
 
+IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
+  DO JI = 1, NAIRCRAFTS
+    IF ( .NOT. ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) &
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'aircraft structure not associated' )
+
+    ! Compute position at take-off (or at first timestep in flight)
+    TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT
+
+    ! Determine moment of the first positioning
+    ! This is done at first call of this subroutine and therefore not necessarily on the correct model
+    IF ( TDTCUR < TZAIRCRAFT%TLAUNCH ) THEN
+      ! Moment is the first timestep since launch date
+      ZDELTATIME = TZAIRCRAFT%TLAUNCH - TDTCUR + 1.E-8
+      IF ( TZAIRCRAFT%CMODEL == 'FIX' ) THEN
+        IMODEL = TZAIRCRAFT%NMODEL
+      ELSE ! 'MOB'
+        IMODEL = 1
+      END IF
+      TZDATE = TDTCUR + INT( ZDELTATIME / DYN_MODEL(IMODEL)%XTSTEP ) * DYN_MODEL(IMODEL)%XTSTEP
+    ELSE IF ( TDTCUR > TZAIRCRAFT%TLAND ) THEN
+      ! Nothing to do
+      ! Aircraft will never be in flight in this run. Data will remain on the initial process.
+    ELSE
+      ! Aircraft is already in flight at the beginning of the run
+      TZDATE = TDTCUR
+    END IF
+
+    CALL AIRCRAFT_COMPUTE_POSITION( TZDATE, TZAIRCRAFT )
+
+    ! Get rank of the process where the aircraft is at this moment and the model number
+    CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZAIRCRAFT )
+
+    NRANKNXT_AIRCRAFT(JI) = TZAIRCRAFT%NRANK_CUR
+  END DO
+END IF
+
+CALL AIRCRAFTS_MOVE_TO_NEW_RANKS()
+
+END SUBROUTINE AIRCRAFTS_INIT_POSITIONS
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE AIRCRAFTS_MOVE_TO_NEW_RANKS()
+
+USE MODD_IO,                         ONLY: ISP
+USE MODD_MPIF
+USE MODD_PRECISION,                  ONLY: MNHINT_MPI
+USE MODD_VAR_ll,                     ONLY: NMNH_COMM_WORLD
+
+INTEGER :: IERR
+
+CALL MPI_ALLREDUCE( MPI_IN_PLACE, NRANKNXT_AIRCRAFT, NAIRCRAFTS, MNHINT_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR )
+DO JI = 1, NAIRCRAFTS
+  IF ( NRANKNXT_AIRCRAFT(JI) /= NRANKCUR_AIRCRAFT(JI) ) THEN
+    IF ( ISP == NRANKCUR_AIRCRAFT(JI) ) THEN
+      CALL FLYER_SEND_AND_DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKNXT_AIRCRAFT(JI) )
+      DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+    ELSE IF ( ISP == NRANKNXT_AIRCRAFT(JI) ) THEN
+      IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) &
+        call Print_msg( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'aircraft already associated' )
+      ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+      CALL FLYER_RECV_AND_ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI) )
+    END IF
+  END IF
+END DO
+
+END SUBROUTINE AIRCRAFTS_MOVE_TO_NEW_RANKS
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOONS_INIT_POSITIONS()
+
+USE MODD_IO,                         ONLY: ISP
+
+USE MODE_AIRCRAFT_BALLOON_EVOL,      ONLY: FLYER_GET_RANK_MODEL_ISCRASHED
+
+TYPE(TBALLOONDATA),  POINTER :: TZBALLOON
+
+! Set next rank to 0 (necessary for MPI_ALLREDUCE)
+NRANKNXT_BALLOON(:) = 0
+
+IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
+  DO JI = 1, NBALLOONS
+    IF ( .NOT. ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) &
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'balloon structure not associated' )
+
+    TZBALLOON => TBALLOONS(JI)%TBALLOON
+
+    ! Initialize model number (and rank)
+    ! This is not done in initialisation phase because some data is not yet available at this early stage
+    ! (XXHAT_ll of all models are needed by FIND_PROCESS_AND_MODEL_FROM_XY_POS)
+    IF ( .NOT. TZBALLOON%LPOSITION_INIT ) THEN
+      TZBALLOON%LPOSITION_INIT = .TRUE.
+      ! Get rank of the process where the balloon is and the model number
+      IF ( TZBALLOON%LFLY ) THEN
+        ! In this case, we are in a restart and the balloon position was read in the restart file
+        CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON )
+      ELSE
+        CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH )
+      END IF
+      IF ( TZBALLOON%LCRASH ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON', 'balloon ' // TRIM( TZBALLOON%CTITLE ) &
+                        // ': launch coordinates are outside of horizontal physical domain' )
+      END IF
+    ELSE
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON', 'balloon ' // TRIM( TZBALLOON%CTITLE ) &
+                      // ': position has already been initialized' )
+    END IF
+
+    NRANKNXT_BALLOON(JI) = TZBALLOON%NRANK_CUR
+  END DO
+END IF
+
+CALL BALLOONS_MOVE_TO_NEW_RANKS()
+
+END SUBROUTINE BALLOONS_INIT_POSITIONS
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS()
+
+USE MODD_IO,                         ONLY: ISP
+USE MODD_MPIF
+USE MODD_PRECISION,                  ONLY: MNHINT_MPI
+USE MODD_VAR_ll,                     ONLY: NMNH_COMM_WORLD
+
+INTEGER :: IERR
+
+CALL MPI_ALLREDUCE( MPI_IN_PLACE, NRANKNXT_BALLOON, NBALLOONS, MNHINT_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR )
+
+DO JI = 1, NBALLOONS
+  IF ( NRANKNXT_BALLOON(JI) /= NRANKCUR_BALLOON(JI) ) THEN
+    IF ( ISP == NRANKCUR_BALLOON(JI) ) THEN
+      CALL FLYER_SEND_AND_DEALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKNXT_BALLOON(JI) )
+      DEALLOCATE( TBALLOONS(JI)%TBALLOON )
+    ELSE IF ( ISP == NRANKNXT_BALLOON(JI) ) THEN
+      ALLOCATE( TBALLOONS(JI)%TBALLOON )
+      CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) )
+    END IF
+  END IF
+END DO
+
+END SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS
+!----------------------------------------------------------------------------
+END SUBROUTINE AIRCRAFT_BALLOON
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
 SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE )
-USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER
+USE MODD_AIRCRAFT_BALLOON, ONLY: taircraftdata, tballoondata, TFLYERDATA
 
-USE MODE_MSG
+IMPLICIT NONE
 
-TYPE(FLYER),      INTENT(IN)  :: TPFLYER
-CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE
+CLASS(TFLYERDATA), INTENT(IN)  :: TPFLYER
+CHARACTER(LEN=*),  INTENT(OUT) :: HLONGTYPE
 
 character(len=:), allocatable :: ytype
 
-if ( Trim( TPFLYER%TYPE ) == 'AIRCRA' ) then
-  ytype = 'Aircrafts'
-else if ( Trim( TPFLYER%TYPE ) == 'RADIOS' ) then
-  ytype = 'Radiosonde_balloons'
-else if ( Trim( TPFLYER%TYPE ) == 'ISODEN' ) then
-  ytype = 'Isodensity_balloons'
-else if ( Trim( TPFLYER%TYPE ) == 'CVBALL' ) then
-  ytype = 'Constant_volume_balloons'
-else
-  call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown category for flyer ' // Trim( tpflyer%title ) )
-  ytype = 'Unknown'
-end if
+select type ( tpflyer )
+  class is ( taircraftdata )
+    ytype = 'Aircrafts'
+
+  class is ( tballoondata )
+    if ( Trim( TPFLYER%CTYPE ) == 'RADIOS' ) then
+      ytype = 'Radiosonde_balloons'
+    else if ( Trim( TPFLYER%CTYPE ) == 'ISODEN' ) then
+      ytype = 'Isodensity_balloons'
+    else if ( Trim( TPFLYER%CTYPE ) == 'CVBALL' ) then
+      ytype = 'Constant_volume_balloons'
+    else
+      call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown category for flyer ' // Trim( tpflyer%ctitle ) )
+      ytype = 'Unknown'
+    end if
+
+  class default
+    call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown class for flyer ' // Trim( tpflyer%ctitle ) )
+    ytype = 'Unknown'
+
+end select
 
 if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) &
   call Print_msg( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', &
-                  'HLONGTYPE truncated for flyer ' // Trim( tpflyer%title ) )
+                  'HLONGTYPE truncated for flyer ' // Trim( tpflyer%ctitle ) )
 HLONGTYPE = Trim( ytype )
 
 END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+
+SUBROUTINE FLYER_SEND( TPFLYER, KTO )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TBALLOONDATA, TFLYERDATA
+USE MODD_CONF_n,           ONLY: NRR
+USE MODD_DIM_n,            ONLY: NKMAX
+USE MODD_IO,               ONLY: ISP
+USE MODD_MPIF
+USE MODD_NSV,              ONLY: NSV
+USE MODD_PARAMETERS,       ONLY: JPVEXT
+USE MODD_PARAM_n,          ONLY: CCLOUD
+USE MODD_PRECISION,        ONLY: MNHINT_MPI, MNHREAL_MPI
+USE MODD_VAR_LL,           ONLY: NMNH_COMM_WORLD
+
+USE MODE_DATETIME
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+INTEGER,           INTENT(IN)    :: KTO     ! Process to which to send flyer data
+
+CHARACTER(LEN=10) :: YFROM, YTO
+INTEGER :: IERR
+INTEGER :: IKU       ! number of vertical levels
+INTEGER :: IPACKSIZE ! Size of the ZPACK buffer
+INTEGER :: IPOS      ! Position in the ZPACK buffer
+INTEGER :: IPOSAIR
+INTEGER :: ISTORE_CUR
+INTEGER :: JI
+INTEGER, DIMENSION(3)              :: ISTORES
+REAL,    DIMENSION(:), ALLOCATABLE :: ZPACK        ! Buffer to store raw data of a profiler (used for MPI communication)
+
+WRITE( YFROM, '( I10 )' ) ISP
+WRITE( YTO,   '( I10 )' ) KTO
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_SEND', 'send flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), &
+                OLOCAL = .TRUE. )
+
+IKU = NKMAX + 2 * JPVEXT
+
+ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR
+
+! Prepare data to send
+
+! Determine size of data to send
+! Characters, integers and logicals will be converted to reals. CMODEL and CTYPE will be coded by 1 real
+IPACKSIZE = 15 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) )
+IF (  CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    IPACKSIZE = IPACKSIZE + 6 + TPFLYER%NPOS * 6
+
+  CLASS IS ( TBALLOONDATA )
+    IPACKSIZE = IPACKSIZE + 15
+END SELECT
+
+! Communication is in 2 phases:
+! 1) first send the ISTORE dimension (optimisation: only what has already been written = N_CUR)
+! 2) send data
+ISTORES(1) = ISTORE_CUR                 ! Number of currently used store positions
+ISTORES(2) = SIZE( TPFLYER%NMODELHIST ) ! Total number of store positions
+ISTORES(3) = IPACKSIZE
+CALL MPI_SEND( ISTORES, 3, MNHINT_MPI, KTO-1, NTAG_NCUR, NMNH_COMM_WORLD, IERR )
+
+ALLOCATE( ZPACK(IPACKSIZE) )
+
+! Fill buffer / pack data
+IPOS = 1
+IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+  ZPACK(IPOS) = NMODEL_FIX
+ELSE
+  ZPACK(IPOS) = NMODEL_MOB
+END IF
+IPOS = IPOS + 1
+
+ZPACK(IPOS) = TPFLYER%NMODEL; IPOS = IPOS + 1
+ZPACK(IPOS) = TPFLYER%NID;    IPOS = IPOS + 1
+
+SELECT CASE( TPFLYER%CTYPE )
+  CASE( 'AIRCRA' )
+    ZPACK(IPOS) = NTYPE_AIRCRA
+  CASE( 'CVBALL' )
+    ZPACK(IPOS) = NTYPE_CVBALL
+  CASE( 'ISODEN' )
+    ZPACK(IPOS) = NTYPE_ISODEN
+  CASE( 'RADIOS' )
+    ZPACK(IPOS) = NTYPE_RADIOS
+  CASE DEFAULT
+    CALL PRINT_MSG( NVERB_FATAL, 'FLYER_SEND', 'invalid CTYPE for flyer' )
+END SELECT
+IPOS = IPOS + 1
+
+! Convert title characters to integers
+DO JI = 1, LEN(TPFLYER%CTITLE)
+  ZPACK(IPOS) = ICHAR( TPFLYER%CTITLE(JI:JI) )
+  IPOS = IPOS + 1
+END DO
+
+ZPACK(IPOS) = TPFLYER%TLAUNCH - TPREFERENCE_DATE; IPOS = IPOS + 1
+IF ( TPFLYER%LCRASH ) THEN
+  ZPACK(IPOS) = 1.d0
+ELSE
+  ZPACK(IPOS) = 0.d0
+END IF
+IPOS = IPOS + 1
+
+ZPACK(IPOS) = TPFLYER%NCRASH; IPOS = IPOS + 1
+
+IF ( TPFLYER%LFLY ) THEN
+  ZPACK(IPOS) = 1.d0
+ELSE
+  ZPACK(IPOS) = 0.d0
+END IF
+IPOS = IPOS + 1
+
+IF ( TPFLYER%LSTORE ) THEN
+  ZPACK(IPOS) = 1.d0
+ELSE
+  ZPACK(IPOS) = 0.d0
+END IF
+IPOS = IPOS + 1
+
+ZPACK(IPOS) = TPFLYER%TFLYER_TIME%N_CUR;  IPOS = IPOS + 1
+ZPACK(IPOS) = TPFLYER%TFLYER_TIME%XTSTEP; IPOS = IPOS + 1
+DO JI = 1, ISTORE_CUR
+  ZPACK(IPOS) = TPFLYER%TFLYER_TIME%TPDATES(JI) - TPREFERENCE_DATE; IPOS = IPOS + 1
+END DO
+
+ZPACK(IPOS) = TPFLYER%XX_CUR; IPOS = IPOS + 1
+ZPACK(IPOS) = TPFLYER%XY_CUR; IPOS = IPOS + 1
+ZPACK(IPOS) = TPFLYER%XZ_CUR; IPOS = IPOS + 1
+
+ZPACK(IPOS) = TPFLYER%NRANK_CUR; IPOS = IPOS + 1
+
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%NMODELHIST(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR
+
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XX(1:ISTORE_CUR)        ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XY(1:ISTORE_CUR)        ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZ(1:ISTORE_CUR)        ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XLAT(1:ISTORE_CUR)      ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XLON(1:ISTORE_CUR)      ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZON(1:ISTORE_CUR)      ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XMER(1:ISTORE_CUR)      ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XW(1:ISTORE_CUR)        ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XP(1:ISTORE_CUR)        ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTKE(1:ISTORE_CUR)      ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTKE_DISS(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTH(1:ISTORE_CUR)       ; IPOS = IPOS + ISTORE_CUR
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*NRR-1) = RESHAPE( TPFLYER%XR(1:ISTORE_CUR,1:NRR), [ISTORE_CUR*NRR] )   ; IPOS = IPOS + ISTORE_CUR * NRR
+ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1) = RESHAPE( TPFLYER%XSV(1:ISTORE_CUR,1:NSV), [ISTORE_CUR*NSV] )  ; IPOS = IPOS + ISTORE_CUR * NSV
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XRTZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU*NRR-1) = RESHAPE( TPFLYER%XRZ(1:ISTORE_CUR,1:IKU,1:NRR), [ISTORE_CUR*IKU*NRR] )
+IPOS = IPOS + ISTORE_CUR * IKU * NRR
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XFFZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XIWCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ); IPOS = IPOS + ISTORE_CUR * IKU
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XLWCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ); IPOS = IPOS + ISTORE_CUR * IKU
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCIZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU
+IF ( CCLOUD == 'LIMA' ) THEN
+  ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU
+  ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU
+END IF
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRARE(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRARE_ATT(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] )
+IPOS = IPOS + ISTORE_CUR * IKU
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XWZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU
+ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XZZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU
+
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZS(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTSRAD(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR
+
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTHW_FLUX(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR
+ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XRCW_FLUX(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR
+
+ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1) = RESHAPE( TPFLYER%XSVW_FLUX(1:ISTORE_CUR,1:NSV), [ISTORE_CUR*NSV] )
+IPOS = IPOS + ISTORE_CUR * NSV
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    IF ( TPFLYER%LTOOKOFF ) THEN
+      ZPACK(IPOS) = 1.d0
+    ELSE
+      ZPACK(IPOS) = 0.d0
+    END IF
+    IPOS = IPOS + 1
+
+    IF ( TPFLYER%LALTDEF ) THEN
+      ZPACK(IPOS) = 1.d0
+    ELSE
+      ZPACK(IPOS) = 0.d0
+    END IF
+    IPOS = IPOS + 1
+
+    ZPACK(IPOS) = TPFLYER%NPOS;    IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%NPOSCUR; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XP_CUR; IPOS = IPOS + 1
+
+    IPOSAIR = TPFLYER%NPOS
+
+    ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSLAT(1:IPOSAIR)  ; IPOS = IPOS + IPOSAIR
+    ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSLON(1:IPOSAIR)  ; IPOS = IPOS + IPOSAIR
+    ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSX(1:IPOSAIR)    ; IPOS = IPOS + IPOSAIR
+    ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSY(1:IPOSAIR)    ; IPOS = IPOS + IPOSAIR
+    IF ( TPFLYER%LALTDEF ) THEN
+      ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSP(1:IPOSAIR)  ; IPOS = IPOS + IPOSAIR
+    ELSE
+      ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSZ(1:IPOSAIR)  ; IPOS = IPOS + IPOSAIR
+    ENDIF
+    ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSTIME(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR
+
+    ZPACK(IPOS) = TPFLYER%TLAND - TPREFERENCE_DATE; IPOS = IPOS + 1
+
+  CLASS IS ( TBALLOONDATA )
+    IF ( TPFLYER%LPOSITION_INIT ) THEN
+      ZPACK(IPOS) = 1.d0
+    ELSE
+      ZPACK(IPOS) = 0.d0
+    END IF
+    IPOS = IPOS + 1
+
+    ZPACK(IPOS) = TPFLYER%XLATLAUNCH ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XLONLAUNCH ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XXLAUNCH   ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XYLAUNCH   ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XALTLAUNCH ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XWASCENT   ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XRHO       ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XPRES      ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XDIAMETER  ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XAERODRAG  ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XINDDRAG   ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XVOLUME    ; IPOS = IPOS + 1
+    ZPACK(IPOS) = TPFLYER%XMASS      ; IPOS = IPOS + 1
+
+    ZPACK(IPOS) = TPFLYER%TPOS_CUR - TPREFERENCE_DATE; IPOS = IPOS + 1
+
+END SELECT
+
+IF ( IPOS-1 /= IPACKSIZE ) &
+  call Print_msg( NVERB_WARNING, 'IO', 'FLYER_SEND', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. )
+
+! Send packed data
+CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, KTO-1, NTAG_PACK, NMNH_COMM_WORLD, IERR )
+
+END SUBROUTINE FLYER_SEND
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_SEND_AND_DEALLOCATE( TPFLYER, KTO )
+
+USE MODD_AIRCRAFT_BALLOON,     ONLY: TFLYERDATA
+USE MODD_IO,               ONLY: ISP
+
+USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+INTEGER,           INTENT(IN)    :: KTO     ! Process to which to send flyer data
+
+CHARACTER(LEN=10) :: YFROM, YTO
+
+WRITE( YFROM, '( I10 )' ) ISP
+WRITE( YTO,   '( I10 )' ) KTO
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_SEND_AND_DEALLOCATE', &
+                'send flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. )
+
+CALL FLYER_SEND( TPFLYER, KTO )
+
+! Free flyer data (dynamically allocated), scalar data has to be freed outside this subroutine
+CALL DEALLOCATE_FLYER( TPFLYER )
+
+END SUBROUTINE FLYER_SEND_AND_DEALLOCATE
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_RECV_AND_ALLOCATE( TPFLYER, KFROM )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TBALLOONDATA, TFLYERDATA
+USE MODD_CONF_n,           ONLY: NRR
+USE MODD_DIM_n,            ONLY: NKMAX
+USE MODD_IO,               ONLY: ISP
+USE MODD_MPIF
+USE MODD_NSV,              ONLY: NSV
+USE MODD_PARAMETERS,       ONLY: JPVEXT
+USE MODD_PARAM_n,          ONLY: CCLOUD
+USE MODD_PRECISION,        ONLY: MNHINT_MPI, MNHREAL_MPI
+USE MODD_VAR_LL,           ONLY: NMNH_COMM_WORLD
+
+USE MODE_DATETIME
+USE MODE_INI_AIRCRAFT_BALLOON, ONLY: ALLOCATE_FLYER
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+INTEGER,           INTENT(IN)    :: KFROM   ! Process from which to receive flyer data
+
+CHARACTER(LEN=10) :: YFROM, YTO
+INTEGER :: IERR
+INTEGER :: IKU       ! number of vertical levels
+INTEGER :: IPOSAIR
+INTEGER :: ISTORE_CUR
+INTEGER :: ISTORE_TOT
+INTEGER :: IPACKSIZE ! Size of the ZPACK buffer
+INTEGER :: IPOS      ! Position in the ZPACK buffer
+INTEGER :: JI
+INTEGER, DIMENSION(3)              :: ISTORES
+REAL,    DIMENSION(:), ALLOCATABLE :: ZPACK        ! Buffer to store raw data of a profiler (used for MPI communication)
+
+WRITE( YFROM, '( I10 )' ) KFROM
+WRITE( YTO,   '( I10 )' ) ISP
+! CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_RECV_AND_ALLOCATE', &
+!                 'receive flyer (name not yet known): '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. )
+
+IKU = NKMAX + 2 * JPVEXT
+
+! Receive data (useful dimensions)
+CALL MPI_RECV( ISTORES, 3, MNHINT_MPI, KFROM-1, NTAG_NCUR, NMNH_COMM_WORLD, MPI_STATUS_IGNORE, IERR )
+
+ISTORE_CUR = ISTORES(1)
+ISTORE_TOT = ISTORES(2)
+IPACKSIZE  = ISTORES(3)
+
+! Allocate receive buffer
+ALLOCATE( ZPACK(IPACKSIZE) )
+
+! Receive packed data
+CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, KFROM-1, NTAG_PACK, NMNH_COMM_WORLD, MPI_STATUS_IGNORE, IERR )
+
+! Allocation of flyer must be done only once number of stores is known
+CALL ALLOCATE_FLYER( TPFLYER, ISTORE_TOT )
+
+! Unpack data
+IPOS = 1
+
+IF ( NINT( ZPACK(IPOS) ) == NMODEL_FIX ) THEN
+  TPFLYER%CMODEL = 'FIX'
+ELSE
+  TPFLYER%CMODEL = 'MOB'
+END IF
+IPOS = IPOS + 1
+
+TPFLYER%NMODEL = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+TPFLYER%NID    = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+
+SELECT CASE( NINT( ZPACK(IPOS) ) )
+  CASE(NTYPE_AIRCRA )
+    TPFLYER%CTYPE = 'AIRCRA'
+  CASE( NTYPE_CVBALL )
+    TPFLYER%CTYPE = 'CVBALL'
+  CASE( NTYPE_ISODEN )
+    TPFLYER%CTYPE = 'ISODEN'
+  CASE( NTYPE_RADIOS )
+    TPFLYER%CTYPE = 'RADIOS'
+  CASE DEFAULT
+    CALL PRINT_MSG( NVERB_FATAL, 'FLYER_RECV_AND_ALLOCATE', 'invalid CTYPE for flyer' )
+END SELECT
+IPOS = IPOS + 1
+
+! Convert integers to characters for title
+DO JI = 1, LEN(TPFLYER%CTITLE)
+  TPFLYER%CTITLE(JI:JI) = ACHAR( NINT( ZPACK(IPOS) ) )
+  IPOS = IPOS + 1
+END DO
+
+! Print full message only now (flyer title was not yet known)
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_RECV_AND_ALLOCATE', &
+                'receive flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. )
+
+TPFLYER%TLAUNCH = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1
+
+IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+  TPFLYER%LCRASH = .FALSE.
+ELSE
+  TPFLYER%LCRASH = .TRUE.
+END IF
+IPOS = IPOS + 1
+
+TPFLYER%NCRASH = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+
+IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+  TPFLYER%LFLY = .FALSE.
+ELSE
+  TPFLYER%LFLY = .TRUE.
+END IF
+IPOS = IPOS + 1
+
+IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+  TPFLYER%LSTORE = .FALSE.
+ELSE
+  TPFLYER%LSTORE = .TRUE.
+END IF
+IPOS = IPOS + 1
+
+TPFLYER%TFLYER_TIME%N_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+TPFLYER%TFLYER_TIME%XTSTEP = ZPACK(IPOS); IPOS = IPOS + 1
+
+DO JI = 1, ISTORE_CUR
+  TPFLYER%TFLYER_TIME%TPDATES(JI) = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1
+END DO
+
+TPFLYER%XX_CUR = ZPACK(IPOS); IPOS = IPOS + 1
+TPFLYER%XY_CUR = ZPACK(IPOS); IPOS = IPOS + 1
+TPFLYER%XZ_CUR = ZPACK(IPOS); IPOS = IPOS + 1
+
+TPFLYER%NRANK_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+
+TPFLYER%NMODELHIST(1:ISTORE_CUR) = NINT( ZPACK(IPOS:IPOS+ISTORE_CUR-1) ) ; IPOS = IPOS + ISTORE_CUR
+
+TPFLYER%XX(1:ISTORE_CUR)        = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XY(1:ISTORE_CUR)        = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XZ(1:ISTORE_CUR)        = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XLAT(1:ISTORE_CUR)      = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XLON(1:ISTORE_CUR)      = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XZON(1:ISTORE_CUR)      = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XMER(1:ISTORE_CUR)      = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XW(1:ISTORE_CUR)        = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XP(1:ISTORE_CUR)        = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XTKE(1:ISTORE_CUR)      = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XTKE_DISS(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XTH(1:ISTORE_CUR)       = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+
+TPFLYER%XR(1:ISTORE_CUR,1:NRR)   = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NRR-1), [ISTORE_CUR,NRR] ) ;  IPOS = IPOS + ISTORE_CUR * NRR
+TPFLYER%XSV(1:ISTORE_CUR,1:NSV)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1), [ISTORE_CUR,NSV] ) ;  IPOS = IPOS + ISTORE_CUR * NSV
+TPFLYER%XRTZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+
+TPFLYER%XRZ(1:ISTORE_CUR,1:IKU,1:NRR) = RESHAPE( ZPACK(IPOS:IPOS+(ISTORE_CUR*IKU*NRR)-1), [ISTORE_CUR,IKU,NRR] )
+IPOS = IPOS + ISTORE_CUR * IKU * NRR
+
+TPFLYER%XFFZ(1:ISTORE_CUR,1:IKU)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+TPFLYER%XIWCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+TPFLYER%XLWCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+TPFLYER%XCIZ(1:ISTORE_CUR,1:IKU)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+IF ( CCLOUD == 'LIMA' ) THEN
+  TPFLYER%XCCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] );  IPOS = IPOS + ISTORE_CUR * IKU
+  TPFLYER%XCRZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] );  IPOS = IPOS + ISTORE_CUR * IKU
+END IF
+TPFLYER%XCRARE(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] );  IPOS = IPOS + ISTORE_CUR * IKU
+
+TPFLYER%XCRARE_ATT(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] )
+IPOS = IPOS + ISTORE_CUR * IKU
+
+TPFLYER%XWZ(1:ISTORE_CUR,1:IKU)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+TPFLYER%XZZ(1:ISTORE_CUR,1:IKU)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ;  IPOS = IPOS + ISTORE_CUR * IKU
+
+TPFLYER%XZS(1:ISTORE_CUR)    = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XTSRAD(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+
+TPFLYER%XTHW_FLUX(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+TPFLYER%XRCW_FLUX(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR
+
+TPFLYER%XSVW_FLUX(1:ISTORE_CUR,1:NSV)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1), [ISTORE_CUR,NSV] )
+IPOS = IPOS + ISTORE_CUR * NSV
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+      TPFLYER%LTOOKOFF = .FALSE.
+    ELSE
+      TPFLYER%LTOOKOFF = .TRUE.
+    END IF
+    IPOS = IPOS + 1
+
+    IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+      TPFLYER%LALTDEF = .FALSE.
+    ELSE
+      TPFLYER%LALTDEF = .TRUE.
+    END IF
+    IPOS = IPOS + 1
+
+    TPFLYER%NPOS    = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+    TPFLYER%NPOSCUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+
+    TPFLYER%XP_CUR  = ZPACK(IPOS);         IPOS = IPOS + 1
+
+    IPOSAIR = TPFLYER%NPOS
+
+    ALLOCATE( TPFLYER%XPOSLAT(IPOSAIR) )
+    ALLOCATE( TPFLYER%XPOSLON(IPOSAIR) )
+    ALLOCATE( TPFLYER%XPOSX(IPOSAIR) )
+    ALLOCATE( TPFLYER%XPOSY(IPOSAIR) )
+    IF ( TPFLYER%LALTDEF ) THEN
+      ALLOCATE( TPFLYER%XPOSP(IPOSAIR) )
+    ELSE
+      ALLOCATE( TPFLYER%XPOSZ(IPOSAIR) )
+    END IF
+    ALLOCATE( TPFLYER%XPOSTIME(IPOSAIR) )
+
+    TPFLYER%XPOSLAT(1:IPOSAIR)  = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    TPFLYER%XPOSLON(1:IPOSAIR)  = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    TPFLYER%XPOSX(1:IPOSAIR)    = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    TPFLYER%XPOSY(1:IPOSAIR)    = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    IF ( TPFLYER%LALTDEF ) THEN
+      TPFLYER%XPOSP(1:IPOSAIR)  = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    ELSE
+      TPFLYER%XPOSZ(1:IPOSAIR)  = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+    END IF
+    TPFLYER%XPOSTIME(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR
+
+    TPFLYER%TLAND = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1
+
+  CLASS IS ( TBALLOONDATA )
+    IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN
+      TPFLYER%LPOSITION_INIT = .FALSE.
+    ELSE
+      TPFLYER%LPOSITION_INIT = .TRUE.
+    END IF
+    IPOS = IPOS + 1
+
+    TPFLYER%XLATLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XLONLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XXLAUNCH   = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XYLAUNCH   = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XALTLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XWASCENT   = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XRHO       = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XPRES      = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XDIAMETER  = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XAERODRAG  = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XINDDRAG   = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XVOLUME    = ZPACK(IPOS); IPOS = IPOS + 1
+    TPFLYER%XMASS      = ZPACK(IPOS); IPOS = IPOS + 1
+
+    TPFLYER%TPOS_CUR = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1
+
+END SELECT
+
+IF ( IPOS-1 /= IPACKSIZE ) &
+  call Print_msg( NVERB_WARNING, 'IO', 'FLYER_RECV_AND_ALLOCATE', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
+
+END SUBROUTINE FLYER_RECV_AND_ALLOCATE
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+
+END MODULE MODE_AIRCRAFT_BALLOON
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 452113c95439e64ed6de56aec3ca1d3d1aa3bebe..21552784ad055e87fbce0afc5a2994ef7e9e44fe 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -1,62 +1,58 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
+! Author: Valery Masson (Meteo-France *)
+!     Original 15/05/2000
+! Modifications:
+!  G. Jaubert  19/04/2001: add CVBALL type
+!  P. Lacarrere   03/2008: add 3D fluxes
+!  M. Leriche  12/12/2008: move ZTDIST out from if.not.(tpflyer%fly)
+!  V. Masson   15/12/2008: correct do while aircraft move
+!  O. Caumont     03/2013: add radar reflectivities
+!  C. Lac         04/2014: allow RARE calculation only if CCLOUD=ICE3
+!  O. Caumont     05/2014: modify RARE for hydrometeors containing ice + add bright band calculation for RARE
+!  C. Lac 02/2015: correction to prevent aircraft crash
+!  O. Nuissier/F. Duffourg 07/2015: add microphysics diagnostic for aircraft, ballon and profiler
+!  G. Delautier   10/2016: LIMA
+!  P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 01/10/2020: bugfix: initialize GSTORE
+!  P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL
+!                                    -PCIT was used if CCLOUD/=ICEx (not allocated)
+!                                    -PSEA was always used even if not allocated (CSURF/=EXTE)
+!                                    -do not use PMAP if cartesian domain
+!  P. Wautelet    06/2022: reorganize flyers
+!-----------------------------------------------------------------
 !      ##########################
-MODULE MODI_AIRCRAFT_BALLOON_EVOL
+MODULE MODE_AIRCRAFT_BALLOON_EVOL
 !      ##########################
-!
-INTERFACE
-!
-      SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP,               &
-                       PXHAT, PYHAT, PZ,                     &
-                       PMAP, PLONOR, PLATOR,                 &
-                       PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
-                       PTS, PRHODREF, PCIT,TPFLYER, PSEA     )
-!
-USE MODD_AIRCRAFT_BALLOON
-!
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
-REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
-REAL,                     INTENT(IN)     :: PLATOR ! origine latitude
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
-REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
-REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
-!
-TYPE(FLYER),              INTENT(INOUT)  :: TPFLYER! balloon/aircraft
-REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN)     :: PSEA
-!
-!-------------------------------------------------------------------------------
-!
-END SUBROUTINE AIRCRAFT_BALLOON_EVOL
-!
-END INTERFACE
-!
-END MODULE MODI_AIRCRAFT_BALLOON_EVOL
-!
+
+USE MODE_MSG
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: AIRCRAFT_BALLOON_EVOL
+
+PUBLIC :: AIRCRAFT_COMPUTE_POSITION
+
+PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED
+
+CONTAINS
 !     ########################################################
       SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP,               &
-                       PXHAT, PYHAT, PZ,                     &
-                       PMAP, PLONOR, PLATOR,                 &
+                       PZ, PMAP, PLONOR, PLATOR,             &
                        PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
-                       PTS, PRHODREF, PCIT,TPFLYER, PSEA     )
+                       PTS, PRHODREF, PCIT, TPFLYER,         &
+                       KRANK_CUR, KRANK_NXT, PSEA            )
 !     ########################################################
 !
 !
-!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores 
+!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores
 !!                                balloons/aircrafts in the model
 !!
 !!    PURPOSE
@@ -65,7 +61,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !
 !!**  METHOD
 !!    ------
-!!    
+!!
 !! 1) All the balloons are tested. If the current balloon is
 !!     a) in the current model
 !!     b) not crashed
@@ -86,10 +82,10 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !!    a) iso-density balloons are advected following horizontal wind.
 !!          the slope of the iso-density surfaces is neglected.
 !!    b) radio-sounding balloons are advected according to all wind velocities.
-!!          the vertical ascent speed is added to the vertical wind speed.  
+!!          the vertical ascent speed is added to the vertical wind speed.
 !!    c) Constant Volume balloons are advected according to all wind velocities.
 !!          the vertical ascent speed is computed using the balloon equation
-!!  
+!!
 !!
 !!    EXTERNAL
 !!    --------
@@ -100,87 +96,19 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !!    REFERENCE
 !!    ---------
 !!
-!!    AUTHOR
-!!    ------
-!!      Valery Masson             * Meteo-France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 15/05/2000
-!!     Apr,19, 2001 (G.Jaubert) add CVBALL type
-!!     March, 2008 (P.Lacarrere) Add 3D fluxes
-!!     Dec,12, 2008 (M. Leriche) move ZTDIST out from if.not.(tpflyer%fly)
-!!     Dec,15, 2008 (V. Masson) correct do while aircraft move
-!!     March, 2013 (O.Caumont) add radar reflectivities
-!!     April, 2014 (C.Lac) allow RARE calculation only if CCLOUD=ICE3
-!!     May, 2014 (O.Caumont) modify RARE for hydrometeors containing ice
-!!                           add bright band calculation for RARE
-!!     Feb, 2015 (C.Lac) Correction to prevent aircraft crash 
-!!     July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
-!!                                      aircraft, ballon and profiler
-!!      October, 2016 (G.DELAUTIER) LIMA
-!!     March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!  P. Wautelet 01/10/2020: bugfix: initialize GSTORE
-!  P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL
-!                                    -PCIT was used if CCLOUD/=ICEx (not allocated)
-!                                    -PSEA was always used even if not allocated (CSURF/=EXTE)
-!                                    -do not use PMAP if cartesian domain
-!
 !! --------------------------------------------------------------------------
-!       
+!
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF
-USE MODD_CST
-USE MODD_DIAG_IN_RUN
-USE MODD_GRID
-USE MODD_LUNIT_n,          ONLY: TLUOUT
-USE MODD_NESTING
-USE MODD_NSV,              ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC
-USE MODD_PARAMETERS
-USE MODD_PARAM_LIMA,       ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,&
-                                 XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,&
-                                 XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC,LSNOW_T_L=>LSNOW_T
-USE MODD_PARAM_LIMA_COLD,  ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,&
-                                 XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,&
-                                 XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XNS_L=>XNS,        &
-                                 XLBDAS_MAX,XLBDAS_MIN
-USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,&
-                                 XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG
-USE MODD_PARAM_LIMA_WARM,  ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,&
-                                 XBC_L=>XBC,XAC_L=>XAC
-USE MODD_PARAM_n,          ONLY: CCLOUD, CSURF
-USE MODD_PARAM_ICE,        ONLY: LSNOW_T_I=>LSNOW_T
-USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,&
-                                 XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,&
-                                 XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,&
-                                 XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,&
-                                 XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,&
-                                 XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,&
-                                 XLBS_I=>XLBS,XCCS_I=>XCCS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XNS_I=>XNS,&
-                                 XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,&
-                                 XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,&
-                                 XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,&
-                                 XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,&
-                                 XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA
-USE MODD_REF_n,            ONLY: XRHODREF
-USE MODD_TIME,             only: tdtexp
-USE MODD_TIME_n,           only: tdtcur
-USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
+USE MODD_CST,              ONLY: XCPD, XLVTT
+USE MODD_IO,               ONLY: ISP
+USE MODD_TIME_n,           ONLY: TDTCUR
+USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY: XRCW_FLUX, XSVW_FLUX, XTHW_FLUX
 !
 USE MODE_DATETIME
-USE MODE_FGAU,             ONLY: GAULAG
-USE MODE_FSCATTER,         ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG
-USE MODE_GRIDPROJ
-USE MODE_ll
-USE MODE_MSG
-!
-USE MODI_GAMMA,            ONLY: GAMMA
-USE MODI_WATER_SUM
+USE MODE_NEST_ll,          ONLY: GET_MODEL_NUMBER_ll
 !
 IMPLICIT NONE
 !
@@ -189,8 +117,6 @@ IMPLICIT NONE
 !
 !
 REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
 REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
@@ -207,8 +133,10 @@ REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
 !
-TYPE(FLYER),              INTENT(INOUT)  :: TPFLYER! balloon/aircraft
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
+CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER ! balloon/aircraft
+INTEGER,                  INTENT(IN)     :: KRANK_CUR
+INTEGER,                  INTENT(OUT)    :: KRANK_NXT
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
@@ -216,1280 +144,1212 @@ REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
 !
 !
 INTEGER :: IMI        ! model index
-REAL    :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0
-!
-INTEGER :: IIB        ! current processor domain sizes
-INTEGER :: IJB
-INTEGER :: IIE
-INTEGER :: IJE
-INTEGER :: IIU
-INTEGER :: IJU
-INTEGER :: IKB
+INTEGER :: IKB        ! vertical domain sizes
 INTEGER :: IKE
 INTEGER :: IKU
 !
-INTEGER :: JK         ! loop index
-!
-REAL, DIMENSION(SIZE(PXHAT))        :: ZXHATM ! mass point coordinates
-REAL, DIMENSION(SIZE(PYHAT))        :: ZYHATM ! mass point coordinates
-!
 REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZM    ! mass point coordinates
 REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZU    ! U points z coordinates
 REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZV    ! V points z coordinates
 REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZWM    ! mass point wind
 !
-REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHV   ! virtual potential temperature
-REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTV    ! virtual temperature
-REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTEMP  ! temperature
 REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZEXN   ! Exner function
 REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRHO   ! air density
 REAL                                :: ZFLYER_EXN ! balloon/aircraft Exner func.
-REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHW_FLUX  !       
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHW_FLUX  !
 REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRCW_FLUX  !
-REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4))    :: ZSVW_FLUX
+REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4)) :: ZSVW_FLUX
 !
-REAL    :: ZTDIST   ! time until launch (sec)
 LOGICAL :: GLAUNCH  ! launch/takeoff is effective at this time-step (if true)
 LOGICAL :: GSTORE   ! storage occurs at this time step
-!
-INTEGER :: II       ! mass balloon position (x index)
-INTEGER :: IJ       ! mass balloon position (y index)
-INTEGER :: IU       ! U flux point balloon position (x index)
-INTEGER :: IV       ! V flux point balloon position (y index)
-INTEGER :: IDU      ! difference between IU and II
-INTEGER :: IDV      ! difference between IV and IJ
-!
-INTEGER :: IK00     ! balloon position for II  , IJ
-INTEGER :: IK01     ! balloon position for II  , IJ+1
-INTEGER :: IK10     ! balloon position for II+1, IJ
-INTEGER :: IK11     ! balloon position for II+1, IJ+1
-INTEGER :: IU00     ! balloon position for IU  , IJ
-INTEGER :: IU01     ! balloon position for IU  , IJ+1
-INTEGER :: IU10     ! balloon position for IU+1, IJ
-INTEGER :: IU11     ! balloon position for IU+1, IJ+1
-INTEGER :: IV00     ! balloon position for II  , IV
-INTEGER :: IV01     ! balloon position for II  , IV+1
-INTEGER :: IV10     ! balloon position for II+1, IV
-INTEGER :: IV11     ! balloon position for II+1, IV+1
+LOGICAL :: GOWNER_CUR ! The process is the current owner of the flyer
+!
+INTEGER :: II_M     ! mass balloon position (x index)
+INTEGER :: IJ_M     ! mass balloon position (y index)
+INTEGER :: II_U     ! U flux point balloon position (x index)
+INTEGER :: IJ_V     ! V flux point balloon position (y index)
+!
+INTEGER :: IK00     ! balloon position for II_M  , IJ_M
+INTEGER :: IK01     ! balloon position for II_M  , IJ_M+1
+INTEGER :: IK10     ! balloon position for II_M+1, IJ_M
+INTEGER :: IK11     ! balloon position for II_M+1, IJ_M+1
+INTEGER :: IU00     ! balloon position for II_U  , IJ_M
+INTEGER :: IU01     ! balloon position for II_U  , IJ_M+1
+INTEGER :: IU10     ! balloon position for II_U+1, IJ_M
+INTEGER :: IU11     ! balloon position for II_U+1, IJ_M+1
+INTEGER :: IV00     ! balloon position for II_M  , IJ_V
+INTEGER :: IV01     ! balloon position for II_M  , IJ_V+1
+INTEGER :: IV10     ! balloon position for II_M+1, IJ_V
+INTEGER :: IV11     ! balloon position for II_M+1, IJ_V+1
 !
 REAL :: ZXCOEF      ! X direction interpolation coefficient
 REAL :: ZUCOEF      ! X direction interpolation coefficient (for U)
 REAL :: ZYCOEF      ! Y direction interpolation coefficient
 REAL :: ZVCOEF      ! Y direction interpolation coefficient (for V)
 !
-REAL :: ZZCOEF00    ! Z direction interpolation coefficient for II  , IJ
-REAL :: ZZCOEF01    ! Z direction interpolation coefficient for II  , IJ+1
-REAL :: ZZCOEF10    ! Z direction interpolation coefficient for II+1, IJ
-REAL :: ZZCOEF11    ! Z direction interpolation coefficient for II+1, IJ+1
-REAL :: ZUCOEF00    ! Z direction interpolation coefficient for IU  , IJ
-REAL :: ZUCOEF01    ! Z direction interpolation coefficient for IU  , IJ+1
-REAL :: ZUCOEF10    ! Z direction interpolation coefficient for IU+1, IJ
-REAL :: ZUCOEF11    ! Z direction interpolation coefficient for IU+1, IJ+1
-REAL :: ZVCOEF00    ! Z direction interpolation coefficient for II  , IV
-REAL :: ZVCOEF01    ! Z direction interpolation coefficient for II  , IV+1
-REAL :: ZVCOEF10    ! Z direction interpolation coefficient for II+1, IV
-REAL :: ZVCOEF11    ! Z direction interpolation coefficient for II+1, IV+1
-!
-INTEGER :: IN       ! time index
-INTEGER :: JLOOP,JLOOP2    ! loop counter
-!
-REAL    :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
-REAL    :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
-REAL    :: ZW_BAL   ! vertical   wind speed at balloon location (along z)
-REAL    :: ZMAP     ! map factor at balloon location
-REAL    :: ZGAM     ! rotation between meso-nh base and spherical lat-lon base.
-INTEGER :: IL       ! flight segment index
-REAL    :: ZSEG_FRAC! fraction of flight in the current segment
-REAL    :: ZRO_BAL  ! air density at balloon location
-!
-INTEGER :: IINFO_ll ! return code
-INTEGER :: ILUOUT   ! logical unit
-INTEGER :: IRESP    ! return code
-!
-! specific to cloud radar
-REAL, DIMENSION(SIZE(PR,3))    :: ZTEMPZ! vertical profile of temperature
-REAL, DIMENSION(SIZE(PR,3))    :: ZRHODREFZ ! vertical profile of dry air density of the reference state
-REAL, DIMENSION(SIZE(PR,3))    :: ZCIT     ! pristine ice concentration
-REAL, DIMENSION(SIZE(PR,3))    :: ZCCI,ZCCR,ZCCC     ! ICE,RAIN CLOUD concentration (LIMA)
-REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3))    :: ZR   
-REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ  ! vertical profile of hydrometeor mixing ratios
-REAL                           :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZNS,ZRHOHYD   ! generic microphysical parameters
-INTEGER                        :: JJ    ! loop counter for quadrature
-COMPLEX                        :: QMW,QMI,QM,QB,QEPSIW,QEPSWI   ! dielectric parameter
-REAL                           :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters
-REAL,DIMENSION(:),ALLOCATABLE  :: ZAELOC,ZZMZ ! temporary arrays
-INTEGER                        :: JPTS_GAULAG=7 ! number of points for Gauss-Laguerre quadrature
-REAL                           :: ZLBDA   ! slope distribution parameter
-REAL                           :: ZN   ! number concentration
-REAL                           :: ZFRAC_ICE  ! ice water fraction
-REAL                           :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point
-REAL                           :: ZFW ! liquid fraction
-REAL                           :: ZFPW ! weight for mixed-phase reflectivity
-REAL,DIMENSION(:),ALLOCATABLE  :: ZX,ZW ! Gauss-Laguerre points and weights
-REAL,DIMENSION(:),ALLOCATABLE  :: ZRTMIN ! local values for XRTMIN
-LOGICAL                        :: GCALC
-!----------------------------------------------------------------------------
-!
-!*      1.   PRELIMINARIES
-!            -------------
-!
-IF(.NOT. ALLOCATED(XTHW_FLUX)) &
-ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
-IF(.NOT. ALLOCATED(XRCW_FLUX)) &
-ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
-IF(.NOT. ALLOCATED(XSVW_FLUX)) &
-ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
-ILUOUT = TLUOUT%NLU
-!
-ZR = 0.
-GSTORE = .FALSE.
-!
-!*      1.0  initialization of processor test
-!            --------------------------------
-!
-ZTHIS_PROC=0.
-!
-!
-!*      1.1  test on the model
-!            -----------------
-!
-CALL GET_MODEL_NUMBER_ll  (IMI)
-!
-!
-IF (TPFLYER%MODEL  /= 'FIX' .AND. COUNT(NDAD(:) == IMI) /= 0 &
-   .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) &
-   .AND. TPFLYER%X_CUR /= XUNDEF .AND. TPFLYER%Y_CUR /= XUNDEF &
-   .AND.  TPFLYER%FLY .AND. .NOT. TPFLYER%CRASH &
-   .AND. CPROGRAM == 'MESONH' ) THEN
-  CALL FLYER_CHANGE_MODEL(IMI)
-ENDIF
-!
-IF ( TPFLYER%NMODEL /= IMI ) RETURN
-!
+REAL :: ZZCOEF00    ! Z direction interpolation coefficient for II_M  , IJ_M
+REAL :: ZZCOEF01    ! Z direction interpolation coefficient for II_M  , IJ_M+1
+REAL :: ZZCOEF10    ! Z direction interpolation coefficient for II_M+1, IJ_M
+REAL :: ZZCOEF11    ! Z direction interpolation coefficient for II_M+1, IJ_M+1
+REAL :: ZUCOEF00    ! Z direction interpolation coefficient for II_U  , IJ_M
+REAL :: ZUCOEF01    ! Z direction interpolation coefficient for II_U  , IJ_M+1
+REAL :: ZUCOEF10    ! Z direction interpolation coefficient for II_U+1, IJ_M
+REAL :: ZUCOEF11    ! Z direction interpolation coefficient for II_U+1, IJ_M+1
+REAL :: ZVCOEF00    ! Z direction interpolation coefficient for II_M  , IJ_V
+REAL :: ZVCOEF01    ! Z direction interpolation coefficient for II_M  , IJ_V+1
+REAL :: ZVCOEF10    ! Z direction interpolation coefficient for II_M+1, IJ_V
+REAL :: ZVCOEF11    ! Z direction interpolation coefficient for II_M+1, IJ_V+1
+!
+INTEGER :: ISTORE          ! time index for storage
+!
+REAL    :: ZTSTEP
+TYPE(DATE_TIME) :: TZNEXT ! Time for next position
 !----------------------------------------------------------------------------
-!
-!*      2.   PRELIMINARIES-2
-!            -------------
-!
-!*      2.1  Indices
-!            -------
-!
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKB =   1   + JPVEXT
-IKE = SIZE(PZ,3) - JPVEXT
 IKU = SIZE(PZ,3)
-!
-!
-!*      2.2  Interpolations of model variables to mass points
-!            ------------------------------------------------
-!
-IIU=SIZE(PXHAT)
-IJU=SIZE(PYHAT)
-!
-ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU  )
-ZXHATM(  IIU  )=1.5*PXHAT(  IIU  )-0.5*PXHAT(  IIU-1)
-!
-ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU  )
-ZYHATM(  IJU  )=1.5*PYHAT(  IJU  )-0.5*PYHAT(  IJU-1)
-!----------------------------------------------------------------------------
-!
-!*      2.3  Compute time until launch by comparison of dates and times
-!            ----------------------------------------------------------
-!
-CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST)
-!
-!*      3.   LAUNCH
-!            ------
-!
-GLAUNCH     = .FALSE.
-!
-!
-IF (.NOT. TPFLYER%FLY) THEN
-!
-!
-!*      3.1  comparison of dates and times
-!            -----------------------------
-!
-!  CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST)
-!
-!*      3.2  launch/takeoff is effective
-!            ---------------------------
-!
-  IF (ZTDIST >= - PTSTEP ) THEN
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
-!
-!*     3.2.1 Determination of flight segment
-!            -------------------------------
-!
-      TPFLYER%SEGCURN = 1
-      IL = TPFLYER%SEGCURN
-      !
-      TPFLYER%SEGCURT = ZTDIST
-      !
-      DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG)
-        TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
-        IL = TPFLYER%SEGCURN
-        TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
-        IF (IL>TPFLYER%SEG) EXIT
-      END DO
-      !
-      !* end of flight
-      !
-      IF (IL > TPFLYER%SEG) THEN
-        TPFLYER%FLY=.FALSE.
-      ELSE
-        TPFLYER%FLY = .TRUE.
-        GLAUNCH     = .TRUE.
-        TPFLYER%CRASH=.FALSE.
-        IF (ZTDIST <= PTSTEP ) THEN
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-          WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the   ', &
-                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                 &
-                      TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-        ENDIF
-      ENDIF
-    ELSE IF (ZTDIST <= PTSTEP ) THEN
-      TPFLYER%FLY = .TRUE.
-      GLAUNCH     = .TRUE.
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-      WRITE(ILUOUT,*) 'Balloon  ',TPFLYER%TITLE,' is launched the ', &
-                    TDTCUR%nday,'/',TDTCUR%nmonth,'/',               &
-                    TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-    END IF
-!
-!*      3.3  Initial horizontal positions
-!            ----------------------------
-!
-    IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
-      TPFLYER%X_CUR = TPFLYER%XLAUNCH
-      TPFLYER%Y_CUR = TPFLYER%YLAUNCH
+
+CALL GET_MODEL_NUMBER_ll(IMI)
+
+! Set initial value for KRANK_NXT
+! It needs to be 0 on all processes except the one where it is when this subroutine is called
+! If the flyer flies to an other process, KRANK_NXT will be set accordingly by the current owner
+IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+  GOWNER_CUR = .TRUE. ! This variable is set and used because NRANK_CUR could change in this subroutine
+  KRANK_NXT = ISP
+ELSE
+  GOWNER_CUR = .FALSE.
+  KRANK_NXT = 0
+END IF
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    ! Take-off?
+    TAKEOFF: IF ( .NOT. TPFLYER%LTOOKOFF ) THEN
+      ! Do the take-off positioning only once
+      ! (on model 1 for 'MOB', if aircraft is on an other model, data will be available on the right one anyway)
+      IF (      ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1              ) &
+           .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN
+        ! Is the aircraft in flight ?
+        IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
+          TPFLYER%LFLY     = .TRUE.
+          TPFLYER%LTOOKOFF = .TRUE.
+        END IF
+      END IF
+    END IF TAKEOFF
+
+    !Do we have to store aircraft data?
+    IF ( IMI == TPFLYER%NMODEL ) CALL FLYER_CHECK_STORESTEP( TPFLYER )
+
+    ! For aircrafts, data has only to be computed at store moments
+    ISTORE = TPFLYER%TFLYER_TIME%N_CUR
+    IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN
+      ! Check if it is the right moment to store data
+      IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+        ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+          CALL FLYER_INTERP_TO_MASSPOINTS()
+
+          ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
+          ZRHO(:,:,:) = FLYER_COMPUTE_RHO( )
+
+          ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+          ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+          ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:)
+
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+          ! Compute coefficents for vertical interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_VER( )
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+
+          CALL FLYER_RECORD_DATA( )
+        END IF ISOWNERAIR
+
+        ! Store has been done
+        TPFLYER%LSTORE = .FALSE.
+      END IF
     END IF
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
-!
-!
-!*       3.3.2 Determination of initial position
-!              -----------------------------
-!
-      IF (TPFLYER%FLY) THEN
-        ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
-        !
-        TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGX(IL+1)
-        TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGY(IL+1)
+
+    ! Compute next position if the previous store has just been done (right moment on right model)
+    IF ( IMI == TPFLYER%NMODEL .AND. ISTORE > 0 ) THEN
+      ! This condition may only be tested if ISTORE > 0
+      IF (ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+        ! Next store moment
+        TZNEXT = TDTCUR + TPFLYER%TFLYER_TIME%XTSTEP
+
+        ! Is the aircraft in flight ?
+        IF ( TZNEXT >= TPFLYER%TLAUNCH .AND. TZNEXT <= TPFLYER%TLAND ) THEN
+          TPFLYER%LFLY = .TRUE.
+          ! Force LTOOKOFF to prevent to do it again (at a next timestep)
+          TPFLYER%LTOOKOFF = .TRUE.
+
+          ! Compute next position
+          CALL AIRCRAFT_COMPUTE_POSITION( TZNEXT, TPFLYER )
+
+          ! Get rank of the process where the aircraft is and the model number
+          CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
+        ELSE
+          TPFLYER%LFLY = .FALSE.
+        END IF
       END IF
-!
     END IF
-  END IF
-END IF
-!
-!*      3.4  instant of storage
-!            ------------------
-!
-IF ( TPFLYER%T_CUR == XUNDEF ) TPFLYER%T_CUR = TPFLYER%STEP - PTSTEP
-!
-TPFLYER%T_CUR = TPFLYER%T_CUR + PTSTEP
-!
-IF ( TPFLYER%T_CUR >= TPFLYER%STEP - 1.E-10 ) THEN
-  GSTORE = .TRUE.
-  TPFLYER%T_CUR = TPFLYER%T_CUR - TPFLYER%STEP
-  TPFLYER%N_CUR = TPFLYER%N_CUR + 1
-END IF
-!
-IF (GSTORE) THEN
-  IN = TPFLYER%N_CUR
-#if 0
-  tpflyer%tpdates(in)%nyear  = tdtexp%nyear
-  tpflyer%tpdates(in)%nmonth = tdtexp%nmonth
-  tpflyer%tpdates(in)%nday   = tdtexp%nday
-  tpflyer%tpdates(in)%xtime  = tdtexp%xtime + ( in - 1 ) * tpflyer%step
-#else
-  tpflyer%tpdates(in) = tdtcur
-#endif
-END IF
-!
-IF ( TPFLYER%FLY) THEN
-!
+
+    IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR
+
+  CLASS IS ( TBALLOONDATA)
+    GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch)
+
+    ! Launch?
+    LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN
+      ! Check if it is launchtime
+      LAUNCHTIME: IF ( ( TDTCUR - TPFLYER%TLAUNCH ) >= -1.e-10 ) THEN
+        TPFLYER%LFLY = .TRUE.
+        GLAUNCH = .TRUE.
+
+        TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
+        TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
+        TPFLYER%TPOS_CUR = TDTCUR
+      END IF LAUNCHTIME
+    END IF LAUNCH
+
+    ! Check if it is time to store data. This has also to be checked if the balloon
+    ! is not yet launched or is crashed (data is also written in these cases, but with default values)
+    IF ( TPFLYER%NMODEL == IMI .AND. &
+          ( .NOT. TPFLYER%LFLY .OR. TPFLYER%LCRASH .OR. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) ) THEN
+      !Do we have to store balloon data?
+      CALL FLYER_CHECK_STORESTEP( TPFLYER )
+    END IF
+
+    ! In flight
+    INFLIGHTONMODEL: IF ( TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI &
+                          .AND. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) THEN
+      ISOWNERBAL: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+        CALL FLYER_INTERP_TO_MASSPOINTS()
+
+        ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
+        ZRHO(:,:,:) = FLYER_COMPUTE_RHO( )
+
+        ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+        ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+        ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:)
+
+        ! Compute coefficents for horizontal interpolations
+        CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+
+        IF ( GLAUNCH ) CALL BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPFLYER )
+
+        ! Compute coefficents for vertical interpolations
+        CALL FLYER_COMPUTE_INTERP_COEFF_VER( )
+
+        CRASH_VERT: IF ( TPFLYER%LCRASH ) THEN
+          TPFLYER%LFLY = .FALSE.
+          WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                                's (too low or too high)' )" )                                        &
+                 TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+          CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+        ELSE CRASH_VERT
+          !No vertical crash
+
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+
+          ! Check if it is the right moment to store data
+          IF ( TPFLYER%LSTORE ) THEN
+            ISTORE = TPFLYER%TFLYER_TIME%N_CUR
+            IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+              CALL FLYER_RECORD_DATA( )
+            END IF
+          END IF
+
+          ! Compute next horizontal position (balloon advection)
+          CALL BALLOON_ADVECTION_HOR( TPFLYER )
+
+          ! Compute next vertical position (balloon advection)
+          CALL BALLOON_ADVECTION_VER( TPFLYER )
+
+          TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP
+        END IF CRASH_VERT !end of no vertical crash branch
+      END IF ISOWNERBAL
+    END IF INFLIGHTONMODEL
+
+    IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR
+END SELECT
+
+CONTAINS
+
 !----------------------------------------------------------------------------
-!
-!*      4.   FLYER POSITION
-!            --------------
-!
-!*      4.1  X position
-!            ----------
-!
-  IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR )
-  II=COUNT( ZXHATM(:)<=TPFLYER%X_CUR )
-!
-  IF (IU<IIB   .AND. LWEST_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN 
-      TPFLYER%CRASH=.TRUE.
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON )
+
+USE MODD_CST, ONLY: XCPD, XP00, XRD
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+SELECT CASE ( TPBALLOON%CTYPE )
+  !
+  ! Iso-density balloon
+  !
+  CASE ( 'ISODEN' )
+    IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN
+      IK00 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,2,:)), 1)
+      ZZCOEF00 = (TPBALLOON%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
+      ZZCOEF01 = (TPBALLOON%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
+      ZZCOEF10 = (TPBALLOON%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
+      ZZCOEF11 = (TPBALLOON%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
+      TPBALLOON%XRHO = FLYER_INTERP(ZRHO)
+    ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN
+      ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD)
+      IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
+      IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
+      IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
+      IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
+      ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
+      ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
+      ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
+      ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
+      TPBALLOON%XRHO = FLYER_INTERP(ZRHO)
     ELSE
-      II=IIB
-      IU=IIB
+      CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPBALLOON%CTITLE) // ' )'
+      CMNHMSG(2) = 'neither initial ALTITUDE or PRESsure is given'
+      CMNHMSG(3) = 'Check your INI_BALLOON routine'
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
     END IF
-  END IF
-  IF (IU>IIE     .AND. LEAST_ll())  THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
+  !
+  ! Radiosounding balloon
+  !
+  CASE ( 'RADIOS' )
+    TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+  !
+  ! Constant Volume Balloon
+  !
+  CASE ( 'CVBALL' )
+    IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN
+      IK00 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,2,:)), 1)
+      IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
+        TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+      ELSE
+        ZZCOEF00 = (TPBALLOON%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
+        ZZCOEF01 = (TPBALLOON%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
+        ZZCOEF10 = (TPBALLOON%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
+        ZZCOEF11 = (TPBALLOON%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
+        TPBALLOON%XRHO = FLYER_INTERP(ZRHO)
+        TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM)
+      END IF
+    ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN
+      ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD)
+      IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
+      IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
+      IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
+      IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
+      IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
+        TPBALLOON%XZ_CUR = ZZM(1,1,IKB)
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+      ELSE
+        ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
+        ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
+        ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
+        ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
+        TPBALLOON%XRHO = FLYER_INTERP(ZRHO)
+        TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM)
+      END IF
     ELSE
-      II=IIE
-      IU=IIE
+      TPBALLOON%XRHO = TPBALLOON%XMASS / TPBALLOON%XVOLUME
+      IK00 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(2,2,:)), 1)
+      IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
+        TPBALLOON%XZ_CUR = ZZM(1,1,IKB)
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+      ELSE
+        ZZCOEF00 = (TPBALLOON%XRHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00))
+        ZZCOEF01 = (TPBALLOON%XRHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01))
+        ZZCOEF10 = (TPBALLOON%XRHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10))
+        ZZCOEF11 = (TPBALLOON%XRHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11))
+        TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM)
+      END IF
     END IF
-  END IF
-!
-!
-!*      4.2  Y position
-!            ----------
-!
-  IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR )
-  IJ=COUNT( ZYHATM(:)<=TPFLYER%Y_CUR )
-!
-  IF (IV<IJB   .AND. LSOUTH_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
+END SELECT
+
+END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+USE MODD_CONF,             ONLY: LCARTESIAN
+USE MODD_NESTING,          ONLY: NDAD, NDTRATIO
+USE MODD_TIME,             only: TDTSEG
+USE MODD_TIME_n,           ONLY: TDTCUR
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+INTEGER :: IMODEL
+INTEGER :: IMODEL_OLD
+REAL    :: ZX_OLD, ZY_OLD
+REAL    :: ZDELTATIME
+REAL    :: ZDIVTMP
+REAL    :: ZMAP     ! map factor at balloon location
+REAL    :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
+REAL    :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
+
+ZTSTEP = PTSTEP
+
+ZU_BAL = FLYER_INTERP_U(PU)
+ZV_BAL = FLYER_INTERP_V(PV)
+if ( .not. lcartesian ) then
+  ZMAP = FLYER_INTERP_2D(PMAP)
+else
+  ZMAP = 1.
+end if
+!
+ZX_OLD = TPBALLOON%XX_CUR
+ZY_OLD = TPBALLOON%XY_CUR
+
+TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
+
+! Compute rank and model for next position
+! This is done here because we need to check if there is a change of model (for 'MOB' balloons)
+! because position has to be adapted to the timestep of a coarser model (if necessary)
+IMODEL_OLD = TPBALLOON%NMODEL
+
+! Get rank of the process where the balloon is and the model number
+CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON )
+
+IF ( TPBALLOON%LCRASH ) THEN
+  WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                      's (out of the horizontal boundaries)' )" ) &
+    TRIM( TPBALLOON%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+  CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+END IF
+
+IF ( TPBALLOON%NMODEL /= IMODEL_OLD .AND. .NOT. TPBALLOON%LCRASH ) THEN
+  ! Balloon has changed of model
+  IF ( NDAD(TPBALLOON%NMODEL ) == IMODEL_OLD ) THEN
+    ! Nothing special to do when going to child model
+  ELSE IF ( TPBALLOON%NMODEL == NDAD(IMODEL_OLD) ) THEN
+    ! Balloon go to parent model
+    ! Recompute position to be compatible with parent timestep
+    ! Parent timestep could be bigger (factor NDTRATIO) and therefore next position is not the one computed just before
+
+    ! Determine step compatible with parent model at next parent timestep
+    ZDELTATIME = TDTCUR - TDTSEG
+    ZDIVTMP = ZDELTATIME / ( PTSTEP * NDTRATIO(IMODEL_OLD) )
+    IF ( ABS( ZDIVTMP - NINT( ZDIVTMP ) ) < 1E-6 * PTSTEP * NDTRATIO(IMODEL_OLD) ) THEN
+      ! Current time is a multiple of parent timestep => next position is parent timestep
+      ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD)
     ELSE
-      IJ=IJB
-      IV=IJB
+      ! Current time is not a multiple of parent timestep
+      ! Next position must be a multiple of parent timestep
+      ! NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) corresponds to the number
+      ! of child timesteps to go to the next parent timestep
+      ! We skip one timestep (+NDTRATIO(IMODEL_OLD)) because it has already been computed for the parent model
+      ZTSTEP = ZTSTEP * ( NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) + NDTRATIO(IMODEL_OLD) )
+
+      ! Detect if we need to skip a store (if time of next position is after time of next store)
+      ! This can happen when a ballon goes to its parent model
+      IF ( TDTCUR + ZTSTEP > TPBALLOON%TFLYER_TIME%TPDATES(TPBALLOON%TFLYER_TIME%N_CUR) + TPBALLOON%TFLYER_TIME%XTSTEP + 1e-6 ) THEN
+        !Force a dummy store (nothing is computed, therefore default/initial values will be stored)
+        TPBALLOON%LSTORE = .TRUE.
+
+        TPBALLOON%TFLYER_TIME%N_CUR = TPBALLOON%TFLYER_TIME%N_CUR + 1
+        ISTORE = TPBALLOON%TFLYER_TIME%N_CUR
+
+        !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value
+        TPBALLOON%TFLYER_TIME%TPDATES(ISTORE) = TPBALLOON%TFLYER_TIME%TPDATES(ISTORE-1) + TPBALLOON%TFLYER_TIME%XTSTEP
+
+        WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) &
+               TRIM( TPBALLOON%CTITLE ),                                                                             &
+               TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NDAY,  TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NMONTH,              &
+               TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%XTIME
+        CMNHMSG(2) = 'due to change of model (child to its parent)'
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+      END IF
     END IF
-  END IF
-  IF (IV>IJE     .AND. LNORTH_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
-    ELSE
-      IJ=IJE
-      IV=IJE
+
+    ! Compute new horizontal position
+    TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+    TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
+
+    ! Get rank of the process where the balloon is and the model number
+    ! Model number is now imposed
+    IMODEL = TPBALLOON%NMODEL
+    CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON, KMODEL = IMODEL )
+    IF ( TPBALLOON%LCRASH ) THEN
+      WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                         's (out of the horizontal boundaries)' )" ) &
+        TRIM( TPBALLOON%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
     END IF
+  ELSE
+    ! Special case not-managed (different dads, change of several models in 1 step (going to grand parent/grand children)...)
+    ! This situation should be very infrequent => reasonable risk, error on the trajectory should be relatively small in most cases
+    CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPBALLOON%CTITLE
+    CMNHMSG(2) = 'its trajectory might be wrong'
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
   END IF
-!
-!
-!*      4.3  Position of balloon according to processors
-!            -------------------------------------------
-!
-  IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1.
-!
-!
-!*      4.4  Computations only on correct processor
-!            --------------------------------------
-!
+END IF
+
+END SUBROUTINE BALLOON_ADVECTION_HOR
 !----------------------------------------------------------------------------
-  IF (ZTHIS_PROC>0. .AND. .NOT. TPFLYER%CRASH) THEN
 !----------------------------------------------------------------------------
-!
-!*      4.5  Interpolations of model variables to mass points
-!            ------------------------------------------------
-!
+SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON )
 
-    ZZM(:,:,1:IKU-1)=0.5 *PZ(II  :II+1,IJ  :IJ+1,1:IKU-1)+0.5 *PZ(II  :II+1,IJ  :IJ+1,2:IKU  )
-    ZZM(:,:,  IKU  )=1.5 *PZ(II  :II+1,IJ  :IJ+1,  IKU-1)-0.5 *PZ(II  :II+1,IJ  :IJ+1,  IKU-2)
-!
-    IDU = IU - II
-    ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II-1:IDU+II,  IJ  :IJ+1,1:IKU-1)+0.25*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,2:IKU  ) &
-                  +0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,1:IKU-1)+0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,2:IKU  )
-    ZZU(:,:,  IKU  )=0.75*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,  IKU-1)-0.25*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,  IKU-2) &
-                  +0.75*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,  IKU-1)-0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,  IKU-2)
-
-    IDV = IV - IJ 
-    ZZV(:,:,1:IKU-1)=0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,1:IKU-1)+0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,2:IKU  ) &
-                  +0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,1:IKU-1)+0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,2:IKU  )
-    ZZV(:,:,  IKU  )=0.75*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,  IKU-1)-0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,  IKU-2) &
-                  +0.75*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,  IKU-1)-0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,  IKU-2)
-!
-!
-    ZWM(:,:,1:IKU-1)=0.5*PW(II:II+1,IJ:IJ+1,1:IKU-1)+0.5*PW(II:II+1,IJ:IJ+1,2:IKU  )
-    ZWM(:,:,  IKU  )=1.5*PW(II:II+1,IJ:IJ+1,  IKU-1)-0.5*PW(II:II+1,IJ:IJ+1,  IKU-2)
-!
-!----------------------------------------------------------------------------
-!
-!*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
-!            ----------------------------------
-!
-!
-!*      5.1  Density
-!            -------
-!
-    ZEXN(:,:,:    ) = (PP(II:II+1,IJ:IJ+1,:)/XP00)**(XRD/XCPD)
-    DO JK=IKB-1,1,-1
-      ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK+1) - 0.5 * ZEXN(:,:,JK+2)
-    END DO
-    DO JK=IKE+1,IKU
-      ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK-1) - 0.5 * ZEXN(:,:,JK-2)
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+USE MODD_CST,              ONLY: XG
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+INTEGER :: JK ! loop index
+REAL    :: ZRO_BAL  ! air density at balloon location
+REAL    :: ZW_BAL   ! vertical   wind speed at balloon location (along z)
+
+IF ( TPBALLOON%CTYPE == 'RADIOS' ) THEN
+  ZW_BAL = FLYER_INTERP(ZWM)
+  TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * ZTSTEP
+END IF
+
+IF ( TPBALLOON%CTYPE == 'CVBALL' ) THEN
+  ZW_BAL = FLYER_INTERP(ZWM)
+  ZRO_BAL = FLYER_INTERP(ZRHO)
+  ! calculation with a time step of 1 second or less
+  IF (INT(ZTSTEP) .GT. 1 ) THEN
+    DO JK=1,INT(ZTSTEP)
+      TPBALLOON%XWASCENT = TPBALLOON%XWASCENT &
+        -  ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * 1. * &
+           ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) &
+              + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * &
+                TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) &
+            )
+      TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * 1.
     END DO
-    !
-    IF (TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL' &
-        .OR. TPFLYER%TYPE=='AIRCRA' ) THEN
-      ZTHV(:,:,:) = PTH(II:II+1,IJ:IJ+1,:)
-      IF (SIZE(PR,4)>0)                                                     &
-      ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV/XRD*PR(II:II+1,IJ:IJ+1,:,1) )  &
-                                / ( 1. + WATER_SUM(PR(II:II+1,IJ:IJ+1,:,:)) )
-      !
-      ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
-      ZRHO(:,:,:) = PP(II:II+1,IJ:IJ+1,:) / (XRD*ZTV(:,:,:))
-      DO JK=IKB-1,1,-1
-        ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK+1) - 0.5 * ZRHO(:,:,JK+2)
-      END DO
-      DO JK=IKE+1,IKU
-        ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK-1) - 0.5 * ZRHO(:,:,JK-2)
-      END DO
-     ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II:II+1,IJ:IJ+1,:)
-     ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II:II+1,IJ:IJ+1,:)
-     ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II:II+1,IJ:IJ+1,:,:)
-    END IF
+  END IF
+  IF (ZTSTEP .GT. INT(ZTSTEP)) THEN
+    TPBALLOON%XWASCENT = TPBALLOON%XWASCENT &
+      -  ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * &
+         ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) &
+            + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * &
+              TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) &
+          )
+    TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * (ZTSTEP-INT(ZTSTEP))
+  END IF
+END IF
 
-!
-!*      5.2  Initial vertical positions
-!            --------------------------
-!
-    IF (GLAUNCH) THEN
-!
-!*      5.2.1 Iso-density balloon
-!
-      IF (TPFLYER%TYPE=='ISODEN') THEN
-        ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
-        ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-        ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
-        ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-        IF ( TPFLYER%ALT /= XUNDEF ) THEN
-          IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1)
-          IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1)
-          IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1)
-          IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1)
-          ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
-          ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
-          ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
-          ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
-          TPFLYER%RHO = FLYER_INTERP(ZRHO)
-        ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN
-          ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD)
-          IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
-          IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
-          IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
-          IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
-          ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
-          ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
-          ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
-          ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
-          TPFLYER%RHO = FLYER_INTERP(ZRHO)
-        ELSE
-          WRITE(ILUOUT,*) 'Error in balloon initial position (balloon ',TPFLYER%TITLE,' )'
-          WRITE(ILUOUT,*) 'neither initial ALTITUDE or PRESsure is given'
-          WRITE(ILUOUT,*) 'Check your INI_BALLOON routine'
-!callabortstop
-          CALL PRINT_MSG(NVERB_FATAL,'GEN','AIRCRAFT_BALLOON_EVOL','')
-        END IF
-      END IF
-!
-!*      5.2.2 Radiosounding balloon
-!
-      IF (TPFLYER%TYPE=='RADIOS') THEN
-        TPFLYER%Z_CUR = TPFLYER%ALT
-        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) )
-        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
-        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
-        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
-      END IF
+END SUBROUTINE BALLOON_ADVECTION_VER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_INTERP_TO_MASSPOINTS()
 
-!*      5.2.3 Aircraft
-!
-      IF (TPFLYER%TYPE=='AIRCRA') THEN
-       IF (TPFLYER%ALTDEF) THEN
-         TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
-       ELSE 
-         TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGZ(IL +1 )
-       END IF
-      END IF
-!
-!*      5.2.4 Constant Volume Balloon
-!
-      IF (TPFLYER%TYPE=='CVBALL') THEN
-        ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
-        ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-        ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
-        ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-        IF ( TPFLYER%ALT /= XUNDEF ) THEN
-          IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1)
-          IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1)
-          IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1)
-          IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1)
-          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
-            TPFLYER%Z_CUR = TPFLYER%ALT
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
-          ELSE
-            ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
-            ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
-            ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
-            ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
-            TPFLYER%RHO = FLYER_INTERP(ZRHO)
-            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
-          END IF
-        ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN
-          ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD)
-          IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
-          IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
-          IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
-          IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
-          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
-            TPFLYER%Z_CUR = ZZM(1,1,IKB)
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
-          ELSE
-            ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
-            ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
-            ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
-            ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
-            TPFLYER%RHO = FLYER_INTERP(ZRHO)
-            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
-          END IF
-        ELSE
-          TPFLYER%RHO = TPFLYER%MASS / TPFLYER%VOLUME
-          IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1)
-          IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1)
-          IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1)
-          IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1)
-          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
-            TPFLYER%Z_CUR = ZZM(1,1,IKB)
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
-            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
-          ELSE
-            ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00))
-            ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01))
-            ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10))
-            ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11))
-            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
-          END IF
-        END IF
-      END IF
+USE MODD_GRID_n,     ONLY: XXHAT, XXHATM, XYHAT, XYHATM
+USE MODD_PARAMETERS, ONLY: JPVEXT
+
+IMPLICIT NONE
+
+INTEGER :: IDU      ! difference between II_U and II_M
+INTEGER :: IDV      ! difference between IJ_V and IJ_M
+
+! Indices
+IKB =   1   + JPVEXT
+IKE = SIZE(PZ,3) - JPVEXT
+
+! Interpolations of model variables to mass points
+! ------------------------------------------------
+
+! X position
+II_U = COUNT( XXHAT (:) <= TPFLYER%XX_CUR )
+II_M = COUNT( XXHATM(:) <= TPFLYER%XX_CUR )
+
+! Y position
+IJ_V=COUNT( XYHAT (:)<=TPFLYER%XY_CUR )
+IJ_M=COUNT( XYHATM(:)<=TPFLYER%XY_CUR )
+ZZM(:,:,1:IKU-1)=0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,1:IKU-1)+0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,2:IKU  )
+ZZM(:,:,  IKU  )=1.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,  IKU-1)-0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,  IKU-2)
+
+IDU = II_U - II_M
+ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II_M-1:IDU+II_M,  IJ_M  :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,2:IKU  ) &
+                +0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,2:IKU  )
+ZZU(:,:,  IKU  )=0.75*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,  IKU-1)-0.25*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,  IKU-2) &
+                +0.75*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,  IKU-1)-0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,  IKU-2)
+
+IDV = IJ_V - IJ_M
+ZZV(:,:,1:IKU-1)=0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,1:IKU-1)+0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,2:IKU  ) &
+                +0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,1:IKU-1)+0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,2:IKU  )
+ZZV(:,:,  IKU  )=0.75*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,  IKU-1)-0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,  IKU-2) &
+                +0.75*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,  IKU-1)-0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,  IKU-2)
+
+ZWM(:,:,1:IKU-1)=0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,1:IKU-1)+0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,2:IKU  )
+ZWM(:,:,  IKU  )=1.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,  IKU-1)-0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,  IKU-2)
+
+END SUBROUTINE FLYER_INTERP_TO_MASSPOINTS
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+PURE FUNCTION FLYER_COMPUTE_EXNER( ) RESULT( PEXN )
+
+USE MODD_CST, ONLY: XCPD, XP00, XRD
+
+IMPLICIT NONE
+
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PEXN
+
+INTEGER :: JK
+
+PEXN(:,:,:) = ( PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / XP00) ** ( XRD / XCPD )
+DO JK = IKB-1, 1, -1
+  PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK+1) - 0.5 * PEXN(:,:,JK+2)
+END DO
+DO JK = IKE+1, IKU
+  PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK-1) - 0.5 * PEXN(:,:,JK-2)
+END DO
+
+END FUNCTION FLYER_COMPUTE_EXNER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO )
+
+USE MODD_CST, ONLY: XRD, XRV
+
+USE MODI_WATER_SUM
+
+IMPLICIT NONE
+
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PRHO
+
+INTEGER                          :: JK
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHV ! virtual potential temperature
+
+ZTHV(:,:,:) = PTH(II_M:II_M+1, IJ_M:IJ_M+1, :)
+IF ( SIZE( PR, 4 ) > 0 )                                                              &
+  ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV / XRD * PR(II_M:II_M+1, IJ_M:IJ_M+1, :, 1) ) &
+                            / ( 1. + WATER_SUM( PR(II_M:II_M+1, IJ_M:IJ_M+1, :, :)) )
+!
+PRHO(:,:,:) = PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / ( XRD * ZTHV(:,:,:) * ZEXN(:,:,:) )
+DO JK = IKB-1, 1, -1
+  PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK+1) - 0.5 * PRHO(:,:,JK+2)
+END DO
+DO JK = IKE+1, IKU
+  PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK-1) - 0.5 * PRHO(:,:,JK-2)
+END DO
+
+END FUNCTION FLYER_COMPUTE_RHO
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+! Compute coefficents for horizontal interpolations (1st stage)
+
+USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM
+
+IMPLICIT NONE
+
+! Interpolation coefficient for X
+ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
+ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
+
+! Interpolation coefficient for y
+ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
+ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
+
+! Interpolation coefficient for X (for U)
+ZUCOEF = (TPFLYER%XX_CUR - XXHAT(II_U)) / (XXHAT(II_U+1) - XXHAT(II_U))
+ZUCOEF = MAX(0.,MIN(ZUCOEF,1.))
+
+! Interpolation coefficient for y (for V)
+ZVCOEF = (TPFLYER%XY_CUR - XYHAT(IJ_V)) / (XYHAT(IJ_V+1) - XYHAT(IJ_V))
+ZVCOEF = MAX(0.,MIN(ZVCOEF,1.))
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER( )
+! Compute coefficent for vertical interpolations
+
+USE MODD_CST,    ONLY: XCPD, XP00, XRD
+USE MODD_TIME_n, ONLY: TDTCUR
+
+IMPLICIT NONE
+
+! Find indices surrounding the vertical box where the flyer is
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    IF ( TPFLYER%LALTDEF ) THEN
+      ZFLYER_EXN = (TPFLYER%XP_CUR/XP00)**(XRD/XCPD)
+      IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
+      IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
+      IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
+      IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
+    ELSE
+      IK00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1)
     END IF
-!
-!
-!
-!*      5.3  Vertical position
-!            -----------------
-!
-    IF (TPFLYER%TYPE=='ISODEN') THEN
-      IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1)
-      IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1)
-      IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1)
-      IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1)
-    ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN
-      IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1)
-      IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1)
-      IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1)
-      IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1)
-    ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN
-            IF (TPFLYER%ALTDEF) THEN
-              ZFLYER_EXN = (TPFLYER%P_CUR/XP00)**(XRD/XCPD)
-              IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
-              IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
-              IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
-              IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
-            ELSE
-              IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1)
-              IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1)
-              IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1)
-              IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1)
-            END IF
+
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      IK00 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(2,2,:)), 1)
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
+      IK00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,1,:)), 1)
+      IK01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,2,:)), 1)
+      IK10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,1,:)), 1)
+      IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1)
     END IF
-    IK00 = MAX ( IK00, IKB )
-    IK01 = MAX ( IK01, IKB )
-    IK10 = MAX ( IK10, IKB )
-    IK11 = MAX ( IK11, IKB )
-!
-!
-!*      5.4  Crash of the balloon
-!            --------------------
-!
-!
-    IF (IK00 <  IKB .OR. IK01 <  IKB .OR. IK10 <  IKB .OR. IK11 <  IKB .OR. &
-        IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
-      TPFLYER%CRASH=.TRUE.
+
+END SELECT
+
+! Do not allow crash on the ground: set position on the ground if too low
+IF ( ANY( [ IK00, IK01, IK10, IK11 ] < IKB ) ) THEN
+  !Minimum altitude is on the ground at IKB (no crash if too low)
+  IK00 = MAX ( IK00, IKB )
+  IK01 = MAX ( IK01, IKB )
+  IK10 = MAX ( IK10, IKB )
+  IK11 = MAX ( IK11, IKB )
+
+  CMNHMSG(1) = 'flyer ' // TRIM( TPFLYER%CTITLE ) // ' is near the ground'
+  WRITE( CMNHMSG(2), "( 'at ', I2, '/', I2, '/', I4, ' ', F18.12, 's' )" ) &
+         TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+  CALL PRINT_MSG( NVERB_INFO, 'GEN', 'FLYER_COMPUTE_INTERP_COEFF_VER', OLOCAL = .TRUE. )
+END IF
+
+! ! Check if the flyer crashed vertically (lower bound)
+! IF (IK00 <  IKB .OR. IK01 <  IKB .OR. IK10 <  IKB .OR. IK11 <  IKB ) THEN
+!   TPFLYER%LCRASH = .TRUE.
+!   TPFLYER%NCRASH = NCRASH_OUT_LOW
+! END IF
+
+! Check if the flyer crashed vertically (higher bound)
+IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
+  TPFLYER%LCRASH = .TRUE.
+  TPFLYER%NCRASH = NCRASH_OUT_HIGH
+END IF
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%LCRASH ) RETURN
+END SELECT
+
+! Interpolation coefficients for the 4 suroundings verticals
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    IF ( TPFLYER%LALTDEF ) THEN
+      ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00) )
+      ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01) )
+      ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10) )
+      ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11) )
+      TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
+    ELSE
+      ZZCOEF00 = (TPFLYER%XZ_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
+      ZZCOEF01 = (TPFLYER%XZ_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
+      ZZCOEF10 = (TPFLYER%XZ_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
+      ZZCOEF11 = (TPFLYER%XZ_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
+      TPFLYER%XP_CUR = FLYER_INTERP(PP)
     END IF
-!
-  END IF
-!
-!
-  IF (TPFLYER%CRASH) THEN
-    TPFLYER%FLY = .FALSE.
-    IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH ) THEN
-      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flew out of the domain the ', &
-                    TDTCUR%nday,'/',TDTCUR%nmonth,'/',                          &
-                    TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
-    ELSE IF (TPFLYER%TYPE /= 'AIRCRA') THEN
-      WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' crashed the ',                 &
-                    TDTCUR%nday,'/',TDTCUR%nmonth,'/',                          &
-                    TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
+
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      ZZCOEF00 = (TPFLYER%XRHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00) )
+      ZZCOEF01 = (TPFLYER%XRHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01) )
+      ZZCOEF10 = (TPFLYER%XRHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10) )
+      ZZCOEF11 = (TPFLYER%XRHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11) )
+      TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
+      ZZCOEF00 = (TPFLYER%XZ_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
+      ZZCOEF01 = (TPFLYER%XZ_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
+      ZZCOEF10 = (TPFLYER%XZ_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
+      ZZCOEF11 = (TPFLYER%XZ_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
     END IF
-  ELSE
-    IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flies  in leg',TPFLYER%SEGCURN ,' the ',  &
-        TDTCUR%nday,'/',TDTCUR%nmonth,'/',      &
-        TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-    ENDIF
-!
+
+END SELECT
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER
 !----------------------------------------------------------------------------
-    IF (ZTHIS_PROC>0.) THEN
 !----------------------------------------------------------------------------
-!
-!*      6.   INITIALIZATIONS FOR INTERPOLATIONS
-!            ----------------------------------
-!
-!*      6.1  Interpolation coefficient for X
-!            -------------------------------
-!
-      ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
-      ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-!
-!
-!*      6.2  Interpolation coefficient for y
-!            -------------------------------
-!
-      ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
-      ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-!
-!
-!*      6.3  Interpolation coefficients for the 4 suroundings verticals
-!            ----------------------------------------------------------
-!
-      IF (TPFLYER%TYPE=='ISODEN') THEN
-        ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00) )
-        ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01) )
-        ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10) )
-        ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11) )
-        TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
-      ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN
-        ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
-        ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
-        ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
-        ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
-      ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN
-              IF (TPFLYER%ALTDEF) THEN
-        ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00) )
-        ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01) )
-        ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10) )
-        ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11) )
-        TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
-                      ELSE
-        ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
-        ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
-        ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
-        ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
-        TPFLYER%P_CUR = FLYER_INTERP(PP)
-              END IF
-      END IF
-!
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+! Compute coefficents for horizontal interpolations (2nd stage)
+! This stage must be done after FLYER_COMPUTE_INTERP_COEFF_VER because we should need XZ_CUR computed in it
+
+IMPLICIT NONE
+
+! Interpolation coefficients for the 4 suroundings verticals (for U)
+IU00 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(1,1,:)), 1)
+IU01 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(1,2,:)), 1)
+IU10 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(2,1,:)), 1)
+IU11 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(2,2,:)), 1)
+ZUCOEF00 = (TPFLYER%XZ_CUR - ZZU(1,1,IU00)) / ( ZZU(1,1,IU00+1) - ZZU(1,1,IU00) )
+ZUCOEF01 = (TPFLYER%XZ_CUR - ZZU(1,2,IU01)) / ( ZZU(1,2,IU01+1) - ZZU(1,2,IU01) )
+ZUCOEF10 = (TPFLYER%XZ_CUR - ZZU(2,1,IU10)) / ( ZZU(2,1,IU10+1) - ZZU(2,1,IU10) )
+ZUCOEF11 = (TPFLYER%XZ_CUR - ZZU(2,2,IU11)) / ( ZZU(2,2,IU11+1) - ZZU(2,2,IU11) )
+
+! Interpolation coefficients for the 4 suroundings verticals (for V)
+IV00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(1,1,:)), 1)
+IV01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(1,2,:)), 1)
+IV10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(2,1,:)), 1)
+IV11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(2,2,:)), 1)
+ZVCOEF00 = (TPFLYER%XZ_CUR - ZZV(1,1,IV00)) / ( ZZV(1,1,IV00+1) - ZZV(1,1,IV00) )
+ZVCOEF01 = (TPFLYER%XZ_CUR - ZZV(1,2,IV01)) / ( ZZV(1,2,IV01+1) - ZZV(1,2,IV01) )
+ZVCOEF10 = (TPFLYER%XZ_CUR - ZZV(2,1,IV10)) / ( ZZV(2,1,IV10+1) - ZZV(2,1,IV10) )
+ZVCOEF11 = (TPFLYER%XZ_CUR - ZZV(2,2,IV11)) / ( ZZV(2,2,IV11+1) - ZZV(2,2,IV11) )
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2
 !----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_RECORD_DATA( )
+
+USE MODD_CST,              ONLY: XCPD, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XTT
+USE MODD_DIAG_IN_RUN,      ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS
+USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
+USE MODD_NSV,              ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI
+USE MODD_PARAMETERS,       ONLY: JPVEXT
+USE MODD_PARAM_ICE,        ONLY: LSNOW_T_I => LSNOW_T
+USE MODD_PARAM_LIMA,       ONLY: LSNOW_T_L => LSNOW_T,                                                       &
+                                 XALPHAR_L => XALPHAR, XNUR_L => XNUR, XALPHAS_L => XALPHAS, XNUS_L => XNUS, &
+                                 XALPHAG_L => XALPHAG, XNUG_L => XNUG, XALPHAI_L => XALPHAI, XNUI_L => XNUI, &
+                                 XRTMIN_L => XRTMIN, XALPHAC_L => XALPHAC, XNUC_L => XNUC
+USE MODD_PARAM_LIMA_COLD,  ONLY: XAI_L => XAI, XBI_L => XBI, XLBEXS_L => XLBEXS,XLBS_L => XLBS,XCCS_L => XCCS,    &
+                                 XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS, XLBDAS_MAX, XLBDAS_MIN, XNS_L => XNS
+USE MODD_PARAM_LIMA_MIXED, ONLY: XLBEXG_L => XLBEXG, XLBG_L => XLBG, XCCG_L => XCCG, XAG_L => XAG, XBG_L => XBG, XCXG_L => XCXG
+USE MODD_PARAM_LIMA_WARM,  ONLY: XAC_L => XAC, XAR_L => XAR, XBC_L => XBC, XBR_L => XBR
+USE MODD_PARAM_n,          ONLY: CCLOUD, CSURF
+USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I => XLBEXR,                   &
+                                 XLBR_I => XLBR, XCCR_I => XCCR, XBR_I => XBR, XAR_I => XAR,                 &
+                                 XALPHAC_I => XALPHAC, XNUC_I => XNUC, XBC_I => XBC, XAC_I => XAC,           &
+                                 XALPHAC2_I => XALPHAC2, XNUC2_I => XNUC2,                                   &
+                                 XALPHAS_I => XALPHAS, XNUS_I => XNUS, XLBEXS_I => XLBEXS,                   &
+                                 XLBS_I => XLBS, XCCS_I => XCCS, XAS_I => XAS, XBS_I => XBS, XCXS_I => XCXS, &
+                                 XALPHAG_I => XALPHAG, XNUG_I => XNUG, XLBEXG_I => XLBEXG,                   &
+                                 XLBG_I => XLBG, XCCG_I => XCCG, XAG_I => XAG, XBG_I => XBG, XCXG_I => XCXG, &
+                                 XALPHAI_I => XALPHAI, XNUI_I => XNUI, XLBEXI_I => XLBEXI,                   &
+                                 XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI,                                 &
+                                 XNS_I => XNS, XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA
+
+USE MODE_FGAU,             ONLY: GAULAG
+USE MODE_FSCATTER,         ONLY: BHMIE, MOMG, MG, QEPSI, QEPSW
+USE MODE_GRIDPROJ,         ONLY: SM_LATLON
+
+USE MODI_GAMMA,            ONLY: GAMMA
+
+IMPLICIT NONE
+
+INTEGER, PARAMETER :: JPTS_GAULAG = 7 ! number of points for Gauss-Laguerre quadrature
+
+INTEGER                        :: JK         ! loop index
+INTEGER                        :: JLOOP    ! loop counter
+REAL, DIMENSION(SIZE(PR,3))    :: ZTEMPZ! vertical profile of temperature
+REAL, DIMENSION(SIZE(PR,3))    :: ZRHODREFZ ! vertical profile of dry air density of the reference state
+REAL, DIMENSION(SIZE(PR,3))    :: ZCIT     ! pristine ice concentration
+REAL, DIMENSION(SIZE(PR,3))    :: ZCCI,ZCCR,ZCCC     ! ICE,RAIN CLOUD concentration (LIMA)
+REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3))    :: ZR
+REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ  ! vertical profile of hydrometeor mixing ratios
+REAL                           :: ZA, ZB, ZCC, ZCX, ZALPHA, ZNS, ZNU, ZLB, ZLBEX, ZRHOHYD   ! generic microphysical parameters
+INTEGER                        :: JJ    ! loop counter for quadrature
+COMPLEX                        :: QMW,QMI,QM,QEPSIW,QEPSWI   ! dielectric parameter
+REAL                           :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters
+REAL,DIMENSION(:),ALLOCATABLE  :: ZAELOC,ZZMZ ! temporary arrays
+REAL                           :: ZLBDA   ! slope distribution parameter
+REAL                           :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point
+REAL                           :: ZFW ! liquid fraction
+REAL                           :: ZFPW ! weight for mixed-phase reflectivity
+REAL                           :: ZN   ! number concentration
+REAL,DIMENSION(:),ALLOCATABLE  :: ZX,ZW ! Gauss-Laguerre points and weights
+REAL,DIMENSION(:),ALLOCATABLE  :: ZRTMIN ! local values for XRTMIN
+LOGICAL                        :: GCALC
+REAL                           :: ZGAM     ! rotation between meso-nh base and spherical lat-lon base.
+REAL                           :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
+REAL                           :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
+
+TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
+
+TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR
+TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR
+TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR
 !
-!*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-!            ---------------------------------------------
-!
-!*      7.1  Interpolation coefficient for X (for U)
-!            -------------------------------
-!
-      ZUCOEF = (TPFLYER%X_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU))
-      ZUCOEF = MAX(0.,MIN(ZUCOEF,1.))
-!
-!
-!*      7.2  Interpolation coefficient for y (for V)
-!            -------------------------------
-!
-      ZVCOEF = (TPFLYER%Y_CUR - PYHAT(IV)) / (PYHAT(IV+1) - PYHAT(IV))
-      ZVCOEF = MAX(0.,MIN(ZVCOEF,1.))
-!
-!
-!*      7.3  Interpolation coefficients for the 4 suroundings verticals (for U)
-!            ----------------------------------------------------------
-!
-      IU00 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,1,:)), 1)
-      IU01 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,2,:)), 1)
-      IU10 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,1,:)), 1)
-      IU11 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,2,:)), 1)
-      ZUCOEF00 = (TPFLYER%Z_CUR - ZZU(1,1,IU00)) / ( ZZU(1,1,IU00+1) - ZZU(1,1,IU00) )
-      ZUCOEF01 = (TPFLYER%Z_CUR - ZZU(1,2,IU01)) / ( ZZU(1,2,IU01+1) - ZZU(1,2,IU01) )
-      ZUCOEF10 = (TPFLYER%Z_CUR - ZZU(2,1,IU10)) / ( ZZU(2,1,IU10+1) - ZZU(2,1,IU10) )
-      ZUCOEF11 = (TPFLYER%Z_CUR - ZZU(2,2,IU11)) / ( ZZU(2,2,IU11+1) - ZZU(2,2,IU11) )
+CALL SM_LATLON(PLATOR,PLONOR,          &
+            TPFLYER%XX_CUR, TPFLYER%XY_CUR,       &
+            TPFLYER%XLAT(ISTORE), TPFLYER%XLON(ISTORE)  )
 !
+ZU_BAL = FLYER_INTERP_U(PU)
+ZV_BAL = FLYER_INTERP_V(PV)
+ZGAM   = (XRPK * (TPFLYER%XLON(ISTORE) - XLON0) - XBETA)*(XPI/180.)
+TPFLYER%XZON (ISTORE) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
+TPFLYER%XMER (ISTORE) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
 !
-!*      7.4  Interpolation coefficients for the 4 suroundings verticals (for V)
-!            ----------------------------------------------------------
+TPFLYER%XW   (ISTORE) = FLYER_INTERP(ZWM)
+TPFLYER%XTH  (ISTORE) = FLYER_INTERP(PTH)
 !
+ZFLYER_EXN = FLYER_INTERP(ZEXN)
+TPFLYER%XP   (ISTORE) = XP00 * ZFLYER_EXN**(XCPD/XRD)
 
-      IV00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,1,:)), 1)
-      IV01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,2,:)), 1)
-      IV10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,1,:)), 1)
-      IV11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,2,:)), 1)
-      ZVCOEF00 = (TPFLYER%Z_CUR - ZZV(1,1,IV00)) / ( ZZV(1,1,IV00+1) - ZZV(1,1,IV00) )
-      ZVCOEF01 = (TPFLYER%Z_CUR - ZZV(1,2,IV01)) / ( ZZV(1,2,IV01+1) - ZZV(1,2,IV01) )
-      ZVCOEF10 = (TPFLYER%Z_CUR - ZZV(2,1,IV10)) / ( ZZV(2,1,IV10+1) - ZZV(2,1,IV10) )
-      ZVCOEF11 = (TPFLYER%Z_CUR - ZZV(2,2,IV11)) / ( ZZV(2,2,IV11+1) - ZZV(2,2,IV11) )
-!
-!----------------------------------------------------------------------------
-!
-!*      8.   DATA RECORDING
-!            --------------
-!
-      IF ( GSTORE ) THEN
-        TPFLYER%X   (IN) = TPFLYER%X_CUR
-        TPFLYER%Y   (IN) = TPFLYER%Y_CUR
-        TPFLYER%Z   (IN) = TPFLYER%Z_CUR
-        !
-        CALL SM_LATLON(PLATOR,PLONOR,          &
-                     TPFLYER%X_CUR, TPFLYER%Y_CUR,       &
-                     TPFLYER%YLAT(IN), TPFLYER%XLON(IN)  )
-        !
-        ZU_BAL = FLYER_INTERP_U(PU)
-        ZV_BAL = FLYER_INTERP_V(PV)
-        ZGAM   = (XRPK * (TPFLYER%XLON(IN) - XLON0) - XBETA)*(XPI/180.)
-        TPFLYER%ZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
-        TPFLYER%MER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
-        !
-        TPFLYER%W   (IN) = FLYER_INTERP(ZWM)
-        TPFLYER%TH  (IN) = FLYER_INTERP(PTH)
-        !
-        ZFLYER_EXN = FLYER_INTERP(ZEXN)
-        TPFLYER%P   (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD)
-        !
-        DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%R   (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP))
-          IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP)
-        END DO
-        DO JLOOP=1,SIZE(PSV,4)
-          TPFLYER%SV  (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP))
-        END DO
-        TPFLYER%RTZ  (IN,:) = FLYER_INTERPZ(ZR(:,:,:))
-        DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%RZ  (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
-        END DO
-        ! Fin Modifs ON
-        TPFLYER%FFZ  (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2))
-        IF (CCLOUD=="LIMA") THEN                                  
-          TPFLYER%CIZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))  
-          TPFLYER%CCZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))  
-          TPFLYER%CRZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))  
-        ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
-          TPFLYER%CIZ  (IN,:) = FLYER_INTERPZ(PCIT(:,:,:))
-        ENDIF             
-        ! initialization CRARE and CRARE_ATT + LWC and IWC
-        TPFLYER%CRARE(IN,:) = 0.
-        TPFLYER%CRARE_ATT(IN,:) = 0.
-        TPFLYER%LWCZ  (IN,:) = 0.
-        TPFLYER%IWCZ  (IN,:) = 0.
-      IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
-       TPFLYER%LWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
-       TPFLYER%IWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:))
-       ZTEMPZ(:)=FLYER_INTERPZ(PTH(II:II+1,IJ:IJ+1,:) * ZEXN(:,:,:))
-        ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:))
-        IF (CCLOUD=="LIMA") THEN
-          ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
-          ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
-          ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
-        ELSE
-          ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:))
-        ENDIF
-        DO JLOOP=3,6
-          ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP))
-        END DO
-        if ( csurf == 'EXTE' ) then
-          DO JK=1,IKU
-            ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:))       ! becomes cloud mixing ratio over sea
-            ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:)))  ! becomes cloud mixing ratio over land
-          END DO
-        else
-          !if csurf/='EXTE', psea is not allocated
-          DO JK=1,IKU
-            ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2))
-            ZRZ(JK,7) = 0.
-          END DO
-        end if
-        ALLOCATE(ZAELOC(IKU))
-        !
-        ZAELOC(:)=0.
-        ! initialization of quadrature points and weights
-        ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG))
-        CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters
-        ! initialize minimum values
-        ALLOCATE(ZRTMIN(SIZE(PR,4)+1))
-        IF (CCLOUD == 'LIMA') THEN
-          ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea
-          ZRTMIN(3)=XRTMIN_L(3)
-          ZRTMIN(4)=XRTMIN_L(4)
-          ZRTMIN(5)=1E-10
-          ZRTMIN(6)=XRTMIN_L(6)
-          ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land
-        ELSE
-          ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea
-          ZRTMIN(3)=XRTMIN_I(3)
-          ZRTMIN(4)=XRTMIN_I(4)
-          ZRTMIN(5)=1E-10
-          ZRTMIN(6)=XRTMIN_I(6)
-          ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land
-        ENDIF
-        ! compute cloud radar reflectivity from vertical profiles of temperature and mixing ratios
-        DO JK=1,IKU
-          QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
-          QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
-          DO JLOOP=2,7
+ZR(:,:,:) = 0.
+DO JLOOP=1,SIZE(PR,4)
+  TPFLYER%XR   (ISTORE,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP))
+  IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP)
+END DO
+DO JLOOP=1,SIZE(PSV,4)
+  TPFLYER%XSV  (ISTORE,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP))
+END DO
+TPFLYER%XRTZ  (ISTORE,:) = FLYER_INTERPZ(ZR(:,:,:))
+DO JLOOP=1,SIZE(PR,4)
+  TPFLYER%XRZ  (ISTORE,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
+END DO
+
+TPFLYER%XFFZ  (ISTORE,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2))
+
+IF (CCLOUD=="LIMA") THEN
+  TPFLYER%XCIZ  (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
+  TPFLYER%XCCZ  (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
+  TPFLYER%XCRZ  (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
+ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
+  TPFLYER%XCIZ  (ISTORE,:) = FLYER_INTERPZ(PCIT(:,:,:))
+END IF
+! initialization CRARE and CRARE_ATT + LWC and IWC
+TPFLYER%XCRARE(ISTORE,:) = 0.
+TPFLYER%XCRARE_ATT(ISTORE,:) = 0.
+TPFLYER%XLWCZ  (ISTORE,:) = 0.
+TPFLYER%XIWCZ  (ISTORE,:) = 0.
+IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
+  TPFLYER%XLWCZ  (ISTORE,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
+  TPFLYER%XIWCZ  (ISTORE,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:))
+  ZTEMPZ(:)=FLYER_INTERPZ(PTH(II_M:II_M+1,IJ_M:IJ_M+1,:) * ZEXN(:,:,:))
+  ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:))
+  IF (CCLOUD=="LIMA") THEN
+    ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
+    ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
+    ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
+  ELSE
+    ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:))
+  ENDIF
+  DO JLOOP=3,6
+    ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP))
+  END DO
+  if ( csurf == 'EXTE' ) then
+    DO JK=1,IKU
+      ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:))       ! becomes cloud mixing ratio over sea
+      ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:)))  ! becomes cloud mixing ratio over land
+    END DO
+  else
+    !if csurf/='EXTE', psea is not allocated
+    DO JK=1,IKU
+      ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2))
+      ZRZ(JK,7) = 0.
+    END DO
+  end if
+  ALLOCATE(ZAELOC(IKU))
+  !
+  ZAELOC(:)=0.
+  ! initialization of quadrature points and weights
+  ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG))
+  CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters
+  ! initialize minimum values
+  ALLOCATE(ZRTMIN(SIZE(PR,4)+1))
+  IF (CCLOUD == 'LIMA') THEN
+    ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea
+    ZRTMIN(3)=XRTMIN_L(3)
+    ZRTMIN(4)=XRTMIN_L(4)
+    ZRTMIN(5)=1E-10
+    ZRTMIN(6)=XRTMIN_L(6)
+    ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land
+  ELSE
+    ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea
+    ZRTMIN(3)=XRTMIN_I(3)
+    ZRTMIN(4)=XRTMIN_I(4)
+    ZRTMIN(5)=1E-10
+    ZRTMIN(6)=XRTMIN_I(6)
+    ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land
+  ENDIF
+  ! compute cloud radar reflectivity from vertical profiles of temperature and mixing ratios
+#if 0
+  DO JK=1,IKU
+    QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
+    QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
+    DO JLOOP=2,7
+      IF (CCLOUD == 'LIMA') THEN
+        GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.&
+              (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND. JLOOP.NE.7).OR.ZCCC(JK)>0.))
+      ELSE
+        GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.))
+      ENDIF
+      IF(GCALC) THEN
+        SELECT CASE(JLOOP)
+          CASE(2) ! cloud water over sea
             IF (CCLOUD == 'LIMA') THEN
-              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.&
-                    (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND. JLOOP.NE.7).OR.ZCCC(JK)>0.))
+              ZA=XAC_L
+              ZB=XBC_L
+              ZCC=ZCCC(JK)*ZRHODREFZ(JK)
+              ZCX=0.
+              ZALPHA=XALPHAC_L
+              ZNU=XNUC_L
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
             ELSE
-              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.))
+              ZA=XAC_I
+              ZB=XBC_I
+              ZCC=XCONC_SEA
+              ZCX=0.
+              ZALPHA=XALPHAC2_I
+              ZNU=XNUC2_I
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
             ENDIF
-            IF(GCALC) THEN
-              SELECT CASE(JLOOP)
-                CASE(2) ! cloud water over sea
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAC_L
-                    ZB=XBC_L
-                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAC_L
-                    ZNU=XNUC_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAC_I
-                    ZB=XBC_I
-                    ZCC=XCONC_SEA
-                    ZCX=0.
-                    ZALPHA=XALPHAC2_I
-                    ZNU=XNUC2_I
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ENDIF
-                CASE(3) ! rain water
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAR_L
-                    ZB=XBR_L
-                    ZCC=ZCCR(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAR_L
-                    ZNU=XNUR_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAR_I
-                    ZB=XBR_I
-                    ZCC=XCCR_I
-                    ZCX=-1.
-                    ZALPHA=XALPHAR_I
-                    ZNU=XNUR_I
-                    ZLB=XLBR_I
-                    ZLBEX=XLBEXR_I
-                  ENDIF
-                CASE(4) ! pristine ice
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAI_L
-                    ZB=XBI_L
-                    ZCC=ZCCI(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAI_L
-                    ZNU=XNUI_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI
-                    ZFW=0
-                  ELSE
-                    ZA=XAI_I
-                    ZB=XBI_I
-                    ZCC=ZCIT(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAI_I
-                    ZNU=XNUI_I
-                    ZLBEX=XLBEXI_I
-                    ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI
-                    ZFW=0
-                  ENDIF                          
-                CASE(5) ! snow
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAS_L
-                    ZB=XBS_L
-                    ZCC=XCCS_L
-                    ZCX=XCXS_L
-                    ZALPHA=XALPHAS_L
-                    ZNU=XNUS_L
-                    ZNS=XNS_L
-                    ZLB=XLBS_L
-                    ZLBEX=XLBEXS_L
-                    ZFW=0
-                  ELSE
-                    ZA=XAS_I
-                    ZB=XBS_I
-                    ZCC=XCCS_I
-                    ZCX=XCXS_I
-                    ZALPHA=XALPHAS_I
-                    ZNU=XNUS_I
-                    ZNS=XNS_I
-                    ZLB=XLBS_I
-                    ZLBEX=XLBEXS_I
-                    ZFW=0
-                  ENDIF
-                CASE(6) ! graupel
-                  !If temperature between -10 and 10°C and Mr and Mg over min threshold: melting graupel
-                  ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel (Fw=0)    
-                  IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 &
-                    .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN
-                    ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP))
-                  ELSE
-                    ZFW=0
-                  ENDIF
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAG_L
-                    ZB=XBG_L
-                    ZCC=XCCG_L
-                    ZCX=XCXG_L
-                    ZALPHA=XALPHAG_L
-                    ZNU=XNUG_L
-                    ZLB=XLBG_L
-                    ZLBEX=XLBEXG_L
-                  ELSE
-                    ZA=XAG_I
-                    ZB=XBG_I
-                    ZCC=XCCG_I
-                    ZCX=XCXG_I
-                    ZALPHA=XALPHAG_I
-                    ZNU=XNUG_I
-                    ZLB=XLBG_I
-                    ZLBEX=XLBEXG_I
-                  ENDIF                          
-                CASE(7) ! cloud water over land
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAC_L
-                    ZB=XBC_L
-                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAC_L
-                    ZNU=XNUC_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAC_I
-                    ZB=XBC_I
-                    ZCC=XCONC_LAND
-                    ZCX=0.
-                    ZALPHA=XALPHAC_I
-                    ZNU=XNUC_I
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ENDIF
-              END SELECT
-              IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. &
-                                     (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN
-                 IF (ZTEMPZ(JK)>-10.) THEN
-                    ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
-                 ELSE
-                    ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
-                 END IF
-                 ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB
-              ELSE
-                 ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
-                 ZN=ZCC*ZLBDA**ZCX
-              END IF
-              ZREFLOC=0.
-              ZAETMP=0.
-              DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature
-                ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA
-                SELECT CASE(JLOOP)
-                  CASE(2,3,7)
-                    QM=QMW
-                  CASE(4,5,6)
-                    ! pristine ice, snow, dry graupel
-                    ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW)
-                    QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW))
-                    
-                    ! water inclusions in ice in air
-                    QEPSWI=MG(QMW**2,QM**2,ZFW)
-                    ! ice in air inclusions in water
-                    QEPSIW=MG(QM**2,QMW**2,1.-ZFW)
-                  
-                    !MG weighted rule (Matrosov 2008)
-                    IF(ZFW .LT. 0.37) THEN
-                      ZFPW=0
-                    ELSE IF(ZFW .GT. 0.63) THEN
-                      ZFPW=1
-                    ELSE
-                      ZFPW=(ZFW-0.37)/(0.63-0.37)
-                    ENDIF  
-                    QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW)
-                END SELECT
-                CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK)
-                ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
-                ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
-              END DO
-              ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93)
-              ZAETMP=ZAETMP  *           XPI    *ZN/(4.*GAMMA(ZNU))
-              TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC
-              ZAELOC(JK)=ZAELOC(JK)+ZAETMP
-            END IF
-
-          END DO
-
-        END DO
-
-        ! apply attenuation
-        ALLOCATE(ZZMZ(IKU))
-        ZZMZ(:)=FLYER_INTERPZ(ZZM(:,:,:))
-        ! nadir
-        ZAETOT=1.
-        DO JK=COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1,-1
-          IF(JK.EQ.COUNT(TPFLYER%Z_CUR >= ZZMZ(:))) THEN
-            IF(TPFLYER%Z_CUR<=ZZMZ(JK)+.5*(ZZMZ(JK+1)-ZZMZ(JK))) THEN
-              ! only attenuation from ZAELOC(JK)
-              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(TPFLYER%Z_CUR-ZZMZ(JK))))
+          CASE(3) ! rain water
+            IF (CCLOUD == 'LIMA') THEN
+              ZA=XAR_L
+              ZB=XBR_L
+              ZCC=ZCCR(JK)*ZRHODREFZ(JK)
+              ZCX=0.
+              ZALPHA=XALPHAR_L
+              ZNU=XNUR_L
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
             ELSE
-              ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
-              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK+1)*(TPFLYER%Z_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) &
-                +ZAELOC(JK)*.5*(ZZMZ(JK+1)-ZZMZ(JK))))
-            END IF
-          ELSE
-            ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
-            ZAETOT=ZAETOT*EXP(-(ZAELOC(JK+1)+ZAELOC(JK))*(ZZMZ(JK+1)-ZZMZ(JK)))
-          END IF
-          TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
-        END DO
-        ! zenith
-        ZAETOT=1.
-        DO JK = MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1,IKU
-          IF ( JK .EQ. (MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1) ) THEN        
-            IF(TPFLYER%Z_CUR>=ZZMZ(JK)-.5*(ZZMZ(JK)-ZZMZ(JK-1))) THEN
-              ! only attenuation from ZAELOC(JK)
-              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(ZZMZ(JK)-TPFLYER%Z_CUR)))
+              ZA=XAR_I
+              ZB=XBR_I
+              ZCC=XCCR_I
+              ZCX=-1.
+              ZALPHA=XALPHAR_I
+              ZNU=XNUR_I
+              ZLB=XLBR_I
+              ZLBEX=XLBEXR_I
+            ENDIF
+          CASE(4) ! pristine ice
+            IF (CCLOUD == 'LIMA') THEN
+              ZA=XAI_L
+              ZB=XBI_L
+              ZCC=ZCCI(JK)*ZRHODREFZ(JK)
+              ZCX=0.
+              ZALPHA=XALPHAI_L
+              ZNU=XNUI_L
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI
+              ZFW=0
             ELSE
-              ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
-              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK-1)*(.5*(ZZMZ(JK)+ZZMZ(JK-1))-TPFLYER%Z_CUR) &
-                +ZAELOC(JK)*.5*(ZZMZ(JK)-ZZMZ(JK-1))))
-            END IF
+              ZA=XAI_I
+              ZB=XBI_I
+              ZCC=ZCIT(JK)
+              ZCX=0.
+              ZALPHA=XALPHAI_I
+              ZNU=XNUI_I
+              ZLBEX=XLBEXI_I
+              ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI
+              ZFW=0
+            ENDIF
+          CASE(5) ! snow
+            IF (CCLOUD == 'LIMA') THEN
+              ZA=XAS_L
+              ZB=XBS_L
+              ZCC=XCCS_L
+              ZCX=XCXS_L
+              ZALPHA=XALPHAS_L
+              ZNU=XNUS_L
+              ZNS=XNS_L
+              ZLB=XLBS_L
+              ZLBEX=XLBEXS_L
+              ZFW=0
+            ELSE
+              ZA=XAS_I
+              ZB=XBS_I
+              ZCC=XCCS_I
+              ZCX=XCXS_I
+              ZALPHA=XALPHAS_I
+              ZNU=XNUS_I
+              ZNS=XNS_I
+              ZLB=XLBS_I
+              ZLBEX=XLBEXS_I
+              ZFW=0
+            ENDIF
+          CASE(6) ! graupel
+            !If temperature between -10 and 10°C and Mr and Mg over min threshold: melting graupel
+            ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel (Fw=0)
+            IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 &
+              .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN
+              ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP))
+            ELSE
+              ZFW=0
+            ENDIF
+            IF (CCLOUD == 'LIMA') THEN
+              ZA=XAG_L
+              ZB=XBG_L
+              ZCC=XCCG_L
+              ZCX=XCXG_L
+              ZALPHA=XALPHAG_L
+              ZNU=XNUG_L
+              ZLB=XLBG_L
+              ZLBEX=XLBEXG_L
+            ELSE
+              ZA=XAG_I
+              ZB=XBG_I
+              ZCC=XCCG_I
+              ZCX=XCXG_I
+              ZALPHA=XALPHAG_I
+              ZNU=XNUG_I
+              ZLB=XLBG_I
+              ZLBEX=XLBEXG_I
+            ENDIF
+          CASE(7) ! cloud water over land
+            IF (CCLOUD == 'LIMA') THEN
+              ZA=XAC_L
+              ZB=XBC_L
+              ZCC=ZCCC(JK)*ZRHODREFZ(JK)
+              ZCX=0.
+              ZALPHA=XALPHAC_L
+              ZNU=XNUC_L
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+            ELSE
+              ZA=XAC_I
+              ZB=XBC_I
+              ZCC=XCONC_LAND
+              ZCX=0.
+              ZALPHA=XALPHAC_I
+              ZNU=XNUC_I
+              ZLBEX=1.0/(ZCX-ZB)
+              ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+            ENDIF
+        END SELECT
+        ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
+        IF ( JLOOP ==  5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L) .OR. &
+                                 (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN
+            ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
           ELSE
-            ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
-            ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1)))
+            ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
           END IF
-          TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
-        END DO
-        TPFLYER%ZZ  (IN,:) = ZZMZ(:)
-        DEALLOCATE(ZZMZ,ZAELOC)
-        ! m^3 → mm^6/m^3 → dBZ
-        WHERE(TPFLYER%CRARE(IN,:)>0)
-          TPFLYER%CRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE(IN,:))
-        ELSEWHERE
-          TPFLYER%CRARE(IN,:)=XUNDEF
-        END WHERE
-        WHERE(TPFLYER%CRARE_ATT(IN,:)>0)
-          TPFLYER%CRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE_ATT(IN,:))
-        ELSEWHERE
-          TPFLYER%CRARE_ATT(IN,:)=XUNDEF
-        END WHERE
-        DEALLOCATE(ZX,ZW,ZRTMIN)
-      END IF ! end LOOP ICE3
-        ! vertical wind
-        TPFLYER%WZ  (IN,:) = FLYER_INTERPZ(ZWM(:,:,:))
-        IF (SIZE(PTKE)>0) TPFLYER%TKE  (IN)    = FLYER_INTERP(PTKE)
-        IF (SIZE(PTS) >0) TPFLYER%TSRAD(IN)    = FLYER_INTERP_2D(PTS)
-        IF (LDIAG_IN_RUN) TPFLYER%TKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS)
-        TPFLYER%ZS(IN)  = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT))
-        TPFLYER%THW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX)
-        TPFLYER%RCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX)
-        DO JLOOP=1,SIZE(PSV,4)
-         TPFLYER%SVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
-        END DO
-      END IF
-!
-!----------------------------------------------------------------------------
-!
-!*      9.   BALLOON ADVECTION
-!            -----------------
-!
-      IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
-        ZU_BAL = FLYER_INTERP_U(PU)
-        ZV_BAL = FLYER_INTERP_V(PV)
-        if ( .not. lcartesian ) then
-          ZMAP = FLYER_INTERP_2D(PMAP)
-        else
-          ZMAP = 1.
-        end if
-        !
-        TPFLYER%X_CUR = TPFLYER%X_CUR   +   ZU_BAL * PTSTEP * ZMAP
-        TPFLYER%Y_CUR = TPFLYER%Y_CUR   +   ZV_BAL * PTSTEP * ZMAP
-      END IF
-      !
-      IF (TPFLYER%TYPE=='RADIOS') THEN
-        ZW_BAL = FLYER_INTERP(ZWM)
-        TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * PTSTEP
-      END IF
-      !
-      IF (TPFLYER%TYPE=='CVBALL') THEN
-        ZW_BAL = FLYER_INTERP(ZWM)
-        ZRO_BAL = FLYER_INTERP(ZRHO)
-        ! calculation with a time step of 1 second or less
-        IF (INT(PTSTEP) .GT. 1 ) THEN
-          DO JK=1,INT(PTSTEP)
-            TPFLYER%WASCENT = TPFLYER%WASCENT &
-              -  ( 1. / (1. + TPFLYER%INDDRAG ) ) * 1. * &
-                 ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) &
-                    + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * &
-                      TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) &
-                  )
-            TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * 1.
-          END DO
-        END IF
-        IF (PTSTEP .GT. INT(PTSTEP)) THEN
-            TPFLYER%WASCENT = TPFLYER%WASCENT &
-              -  ( 1. / (1. + TPFLYER%INDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * &
-                 ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) &
-                    + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * &
-                      TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) &
-                  )
-            TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * (PTSTEP-INT(PTSTEP))
+          ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB
+        ELSE
+          ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
+          ZN=ZCC*ZLBDA**ZCX
         END IF
+        ZREFLOC=0.
+        ZAETMP=0.
+        DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature
+          ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA
+          SELECT CASE(JLOOP)
+            CASE(2,3,7)
+              QM=QMW
+            CASE(4,5,6)
+              ! pristine ice, snow, dry graupel
+              ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW)
+              QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW))
+
+              ! water inclusions in ice in air
+              QEPSWI=MG(QMW**2,QM**2,ZFW)
+              ! ice in air inclusions in water
+              QEPSIW=MG(QM**2,QMW**2,1.-ZFW)
+
+              !MG weighted rule (Matrosov 2008)
+              IF(ZFW .LT. 0.37) THEN
+                ZFPW=0
+              ELSE IF(ZFW .GT. 0.63) THEN
+                ZFPW=1
+              ELSE
+                ZFPW=(ZFW-0.37)/(0.63-0.37)
+              ENDIF
+              QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW)
+          END SELECT
+          CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK)
+          ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
+          ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
+        END DO
+        ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93)
+        ZAETMP=ZAETMP  *           XPI    *ZN/(4.*GAMMA(ZNU))
+        TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)+ZREFLOC
+        ZAELOC(JK)=ZAELOC(JK)+ZAETMP
       END IF
-!
-!----------------------------------------------------------------------------
-  END IF
-!----------------------------------------------------------------------------
-!
-!*     10.   AIRCRAFT MOVE (computations done on all processors, to limit exchanges)
-!            -------------
-!
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
-!
-!
-!*     10.1  Determination of flight segment
-!            -------------------------------
-!
-      IL = TPFLYER%SEGCURN
-      !
-      TPFLYER%SEGCURT = TPFLYER%SEGCURT + PTSTEP
-      !
-       DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL))
-         TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
-         IL = TPFLYER%SEGCURN
-         TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
-         IF (IL>TPFLYER%SEG) EXIT
-      END DO 
-!      DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG)
-!        TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
-!        IL = TPFLYER%SEGCURN
-!        TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
-!      END DO
-      !
-      !* end of flight
-      !
-      IF (IL > TPFLYER%SEG) TPFLYER%FLY=.FALSE.
-!
-!
-!*     10.2  Determination of new position
-!            -----------------------------
-!
-      IF (TPFLYER%FLY) THEN
-        ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
-        !
-        TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGX(IL+1)
-        TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGY(IL+1)
-          IF (TPFLYER%ALTDEF) THEN
-             TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
-          ELSE
-             TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL  ) &
-                      +     ZSEG_FRAC  * TPFLYER%SEGZ(IL+1) 
-          END IF
+    END DO
+  END DO
+#endif
+
+  ! apply attenuation
+  ALLOCATE(ZZMZ(IKU))
+  ZZMZ(:)=FLYER_INTERPZ(ZZM(:,:,:))
+  ! nadir
+  ZAETOT=1.
+  DO JK=COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1,-1
+    IF(JK.EQ.COUNT(TPFLYER%XZ_CUR >= ZZMZ(:))) THEN
+      IF(TPFLYER%XZ_CUR<=ZZMZ(JK)+.5*(ZZMZ(JK+1)-ZZMZ(JK))) THEN
+        ! only attenuation from ZAELOC(JK)
+        ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(TPFLYER%XZ_CUR-ZZMZ(JK))))
+      ELSE
+        ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
+        ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK+1)*(TPFLYER%XZ_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) &
+          +ZAELOC(JK)*.5*(ZZMZ(JK+1)-ZZMZ(JK))))
       END IF
-    !
+    ELSE
+      ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
+      ZAETOT=ZAETOT*EXP(-(ZAELOC(JK+1)+ZAELOC(JK))*(ZZMZ(JK+1)-ZZMZ(JK)))
     END IF
-  !
-  END IF
-! 
-END IF
-!
-!----------------------------------------------------------------------------
-!
-!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
-!            ------------------------------------------
-!
-!*     11.1  current position
-!            ----------------
-!
-CALL DISTRIBUTE_FLYER_L(TPFLYER%FLY)
-CALL DISTRIBUTE_FLYER_L(TPFLYER%CRASH)
-CALL DISTRIBUTE_FLYER(TPFLYER%X_CUR)
-CALL DISTRIBUTE_FLYER(TPFLYER%Y_CUR)
-IF (TPFLYER%TYPE=='CVBALL') THEN
-  CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
-  CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT)
-ELSE
-  IF (TPFLYER%TYPE=='RADIOS') CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
-  IF (TPFLYER%TYPE=='AIRCRA') THEN
-     IF (TPFLYER%ALTDEF) THEN
-        CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR)
-     ELSE
-        CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
-     ENDIF
-  END IF
-  IF (TPFLYER%TYPE=='ISODEN' ) CALL DISTRIBUTE_FLYER(TPFLYER%RHO)
-END IF
-!
-!*     11.2  data stored
-!            -----------
-!
-IF ( GSTORE ) THEN
-  CALL DISTRIBUTE_FLYER(TPFLYER%X   (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%Y   (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%Z   (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XLON(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%YLAT(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%ZON (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%MER (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%W   (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%P   (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%TH  (IN))
-  DO JLOOP=1,SIZE(PR,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%R   (IN,JLOOP))
-  END DO
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%SV  (IN,JLOOP))
+    TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
   END DO
-  DO JLOOP=1,IKU              
-    CALL DISTRIBUTE_FLYER(TPFLYER%RTZ (IN,JLOOP))
-    DO JLOOP2=1,SIZE(PR,4)
-      CALL DISTRIBUTE_FLYER(TPFLYER%RZ (IN,JLOOP,JLOOP2))
-    ENDDO
-    CALL DISTRIBUTE_FLYER(TPFLYER%FFZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%CIZ (IN,JLOOP))
-    IF (CCLOUD== 'LIMA' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%CRZ (IN,JLOOP))
-      CALL DISTRIBUTE_FLYER(TPFLYER%CCZ (IN,JLOOP))      
-    ENDIF
-    CALL DISTRIBUTE_FLYER(TPFLYER%IWCZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%LWCZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%CRARE (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%CRARE_ATT (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%WZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%ZZ (IN,JLOOP))
-  END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%TKE  (IN))
-  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%TSRAD(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%ZS  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%THW_FLUX(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%RCW_FLUX(IN))
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%SVW_FLUX(IN,JLOOP))
+  ! zenith
+  ZAETOT=1.
+  DO JK = MAX(COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1)+1,IKU
+    IF ( JK .EQ. (MAX(COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1)+1) ) THEN
+      IF(TPFLYER%XZ_CUR>=ZZMZ(JK)-.5*(ZZMZ(JK)-ZZMZ(JK-1))) THEN
+        ! only attenuation from ZAELOC(JK)
+        ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(ZZMZ(JK)-TPFLYER%XZ_CUR)))
+      ELSE
+        ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
+        ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK-1)*(.5*(ZZMZ(JK)+ZZMZ(JK-1))-TPFLYER%XZ_CUR) &
+          +ZAELOC(JK)*.5*(ZZMZ(JK)-ZZMZ(JK-1))))
+      END IF
+    ELSE
+      ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
+      ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1)))
+    END IF
+    TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
   END DO
-END IF
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
+
+  TPFLYER%XZZ  (ISTORE,:) = ZZMZ(:)
+  DEALLOCATE(ZZMZ,ZAELOC)
+  ! m^3 → mm^6/m^3 → dBZ
+  WHERE(TPFLYER%XCRARE(ISTORE,:)>0)
+    TPFLYER%XCRARE(ISTORE,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(ISTORE,:))
+  ELSEWHERE
+    TPFLYER%XCRARE(ISTORE,:)=XUNDEF
+  END WHERE
+  WHERE(TPFLYER%XCRARE_ATT(ISTORE,:)>0)
+    TPFLYER%XCRARE_ATT(ISTORE,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(ISTORE,:))
+  ELSEWHERE
+    TPFLYER%XCRARE_ATT(ISTORE,:)=XUNDEF
+  END WHERE
+  DEALLOCATE(ZX,ZW,ZRTMIN)
+END IF ! end LOOP ICE3
+! vertical wind
+TPFLYER%XWZ  (ISTORE,:) = FLYER_INTERPZ(ZWM(:,:,:))
+IF (SIZE(PTKE)>0) TPFLYER%XTKE  (ISTORE)    = FLYER_INTERP(PTKE)
+IF (SIZE(PTS) >0) TPFLYER%XTSRAD(ISTORE)    = FLYER_INTERP_2D(PTS)
+IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(ISTORE) = FLYER_INTERP(XCURRENT_TKE_DISS)
+TPFLYER%XZS(ISTORE)  = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT))
+TPFLYER%XTHW_FLUX(ISTORE) = FLYER_INTERP(ZTHW_FLUX)
+TPFLYER%XRCW_FLUX(ISTORE) = FLYER_INTERP(ZRCW_FLUX)
+DO JLOOP=1,SIZE(PSV,4)
+TPFLYER%XSVW_FLUX(ISTORE,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
+END DO
+
+END SUBROUTINE FLYER_RECORD_DATA
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 FUNCTION FLYER_INTERP(PA) RESULT(PB)
@@ -1503,8 +1363,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=II
-  JJ=IJ
+  JI=II_M
+  JJ=IJ_M
 END IF
 !
 PB = (1.- ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF00) * PA(JI  ,JJ  ,IK00) + ZZCOEF00 * PA(JI  ,JJ  ,IK00+1)) &
@@ -1514,6 +1374,7 @@ PB = (1.- ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF00) * PA(JI  ,JJ  ,IK00) + ZZCOEF0
 !
 END FUNCTION FLYER_INTERP
 !----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
 FUNCTION FLYER_INTERPZ(PA) RESULT(PB)
 !
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
@@ -1525,8 +1386,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=II
-  JJ=IJ
+  JI=II_M
+  JJ=IJ_M
 END IF
 !
 !
@@ -1536,10 +1397,10 @@ DO JK=1,SIZE(PA,3)
    PB(JK) = (1.-ZYCOEF) * (1.-ZXCOEF) *  PA(JI,JJ,JK) + &
         (1.-ZYCOEF) * (ZXCOEF) *  PA(JI+1,JJ,JK)  + &
         (ZYCOEF) * (1.-ZXCOEF) *  PA(JI,JJ+1,JK)  + &
-        (ZYCOEF) * (ZXCOEF) *  PA(JI+1,JJ+1,JK) 
+        (ZYCOEF) * (ZXCOEF) *  PA(JI+1,JJ+1,JK)
  ELSE
-   PB(JK) = XUNDEF 
- END IF    
+   PB(JK) = XUNDEF
+ END IF
 END DO
 !
 END FUNCTION FLYER_INTERPZ
@@ -1555,8 +1416,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=IU
-  JJ=IJ
+  JI=II_U
+  JJ=IJ_M
 END IF
 !
 PB = (1.- ZYCOEF) * (1.-ZUCOEF) * ( (1.-ZUCOEF00) * PA(JI  ,JJ  ,IU00) + ZUCOEF00 * PA(JI  ,JJ  ,IU00+1)) &
@@ -1578,8 +1439,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=II
-  JJ=IV
+  JI=II_M
+  JJ=IJ_V
 END IF
 !
 PB = (1.- ZVCOEF) * (1.-ZXCOEF) * ( (1.-ZVCOEF00) * PA(JI  ,JJ  ,IV00) + ZVCOEF00 * PA(JI  ,JJ  ,IV00+1)) &
@@ -1601,8 +1462,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=II
-  JJ=IJ
+  JI=II_M
+  JJ=IJ_M
 END IF
 !
 PB = (1.- ZYCOEF) * (1.-ZXCOEF) * PA(JI  ,JJ  ) &
@@ -1612,132 +1473,140 @@ PB = (1.- ZYCOEF) * (1.-ZXCOEF) * PA(JI  ,JJ  ) &
 !
 END FUNCTION FLYER_INTERP_2D
 !----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_FLYER(PA)
-!
-REAL, INTENT(INOUT) :: PA
-!
-PA = PA * ZTHIS_PROC
-CALL REDUCESUM_ll(PA,IINFO_ll)
-!
-END SUBROUTINE DISTRIBUTE_FLYER
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_FLYER_N(KA)
-!
-INTEGER, INTENT(INOUT) :: KA
-REAL                   :: ZA
-!
-ZA=KA
-!
-ZA = ZA * ZTHIS_PROC
-CALL REDUCESUM_ll(ZA,IINFO_ll)
-!
-IF (NINT(ZA)/=0) KA=NINT(ZA)
-!
-END SUBROUTINE DISTRIBUTE_FLYER_N
+
+END SUBROUTINE AIRCRAFT_BALLOON_EVOL
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_FLYER_L(OA)
-!
-LOGICAL, INTENT(INOUT) :: OA
-REAL                   :: ZA
-!
-ZA=0.
-IF (OA) ZA=1.
-!
-CALL REDUCESUM_ll(ZA,IINFO_ll)
-!
-IF (ZA==0.) THEN
-  OA=.FALSE.
+SUBROUTINE AIRCRAFT_COMPUTE_POSITION( TPDATE, TPAIRCRAFT )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
+
+USE MODE_DATETIME
+USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
+
+IMPLICIT NONE
+
+TYPE(DATE_TIME),      INTENT(IN)    :: TPDATE
+CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT !aircraft
+
+INTEGER :: IL        ! flight segment index
+REAL    :: ZTDIST    ! time since launch (sec)
+REAL    :: ZSEG_FRAC ! fraction of flight in the current segment
+
+! Find the flight segment
+ZTDIST = TPDATE - TPAIRCRAFT%TLAUNCH
+IL = TPAIRCRAFT%NPOSCUR
+DO WHILE ( ZTDIST > TPAIRCRAFT%XPOSTIME(IL+1) )
+  IL = IL + 1
+  IF ( IL > TPAIRCRAFT%NPOS-1 ) THEN
+    !Security (should not happen)
+    IL = TPAIRCRAFT%NPOS-1
+    EXIT
+  END IF
+END DO
+TPAIRCRAFT%NPOSCUR = IL
+
+! Compute the current position
+ZSEG_FRAC = ( ZTDIST - TPAIRCRAFT%XPOSTIME(IL) ) / ( TPAIRCRAFT%XPOSTIME(IL+1) - TPAIRCRAFT%XPOSTIME(IL) )
+
+TPAIRCRAFT%XX_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSX(IL  ) &
+               +     ZSEG_FRAC  * TPAIRCRAFT%XPOSX(IL+1)
+TPAIRCRAFT%XY_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSY(IL  ) &
+               +     ZSEG_FRAC  * TPAIRCRAFT%XPOSY(IL+1)
+
+IF (TPAIRCRAFT%LALTDEF) THEN
+  TPAIRCRAFT%XP_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSP(IL  ) &
+                 +     ZSEG_FRAC  * TPAIRCRAFT%XPOSP(IL+1)
 ELSE
-  OA=.TRUE.
+  TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) &
+                 +     ZSEG_FRAC  * TPAIRCRAFT%XPOSZ(IL +1)
 END IF
-!
-END SUBROUTINE DISTRIBUTE_FLYER_L
+
+END SUBROUTINE AIRCRAFT_COMPUTE_POSITION
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE FLYER_CHANGE_MODEL(IMI)
-!
-INTEGER, INTENT(IN) :: IMI ! model index
-!
-INTEGER :: IMK      ! kid model index
-INTEGER :: IMODEL   ! TPFLYER model index at the beginning of the subroutine
-INTEGER :: IU       ! U flux point balloon position (x index)
-INTEGER :: IV       ! V flux point balloon position (y index)
-INTEGER :: IU_ABS   ! U flux point balloon  position (in the model)
-INTEGER :: IV_ABS   ! V flux point balloon position (in the model)
-INTEGER :: IXOR     ! Origin's coordinates of the extended 2 way subdomain
-INTEGER :: IYOR     ! Origin's coordinates of the extended 2 way subdomain
-INTEGER :: IIB      ! current processor domain sizes
-INTEGER :: IJB
-INTEGER :: IIE
-INTEGER :: IJE
-!
-!
-IMODEL=TPFLYER%NMODEL
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR )
-IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR )
-ZTHIS_PROC=0.
-IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1.
-IF (ZTHIS_PROC .EQ. 1) THEN
-  CALL GET_OR_LL('B',IXOR,IYOR)
-  IU_ABS=IU + IXOR - 1
-  IV_ABS=IV + IYOR - 1 
-  !
-  IF (TPFLYER%NMODEL == IMI) THEN
-    !
-    ! go to the kid model if the flyer location is inside
-    ! ------------------
-    !
-    DO IMK=IMI+1,NMODEL
-      IF (NDAD(IMK) == IMI .AND. &
-         IU_ABS>=NXOR_ALL(IMK)  .AND. IU_ABS<=NXEND_ALL(IMK)  .AND. &
-         IV_ABS>=NYOR_ALL(IMK)  .AND. IV_ABS<=NYEND_ALL(IMK) ) THEN
-        TPFLYER%NMODEL = IMK
-        !
-      END IF
-    END DO
-    !
+SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX, PY, KMODEL )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: NCRASH_NO, NCRASH_OUT_HORIZ, TFLYERDATA
+
+USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft
+REAL,    OPTIONAL, INTENT(IN)    :: PX      ! X position (if not provided, takes current flyer position)
+REAL,    OPTIONAL, INTENT(IN)    :: PY      ! Y position (if not provided, takes current flyer position)
+INTEGER, OPTIONAL, INTENT(IN)    :: KMODEL  ! if provided, model number is imposed (if not 0)
+
+INTEGER :: IMODEL
+INTEGER :: IRANK
+REAL    :: ZX, ZY
+
+IF ( PRESENT( KMODEL ) ) THEN
+  IMODEL = KMODEL
+ELSE
+  IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+    IMODEL = TPFLYER%NMODEL
   ELSE
-    !
-    ! come from the kid model if the flyer location is outside
-    ! ------------------
-    !
-    IMK = TPFLYER%NMODEL
-    IF (IU_ABS<NXOR_ALL(IMK)  .OR. IU_ABS>NXEND_ALL(IMK)  .OR. &
-         IV_ABS<NYOR_ALL(IMK)  .OR. IV_ABS>NYEND_ALL(IMK) ) THEN
-        TPFLYER%NMODEL = IMI
-        !
-    END IF
+    IMODEL = 0
   END IF
 END IF
-!
-! send the information to all the processors
-! ----------------------------------------
-!
-CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
-ZTHIS_PROC=0.
-!
-! print if the model changes
-!---------------------------------
-IF (TPFLYER%NMODEL /= IMODEL) THEN
-   IF (NDAD(IMODEL) == TPFLYER%NMODEL) THEN
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-      WRITE(ILUOUT,*) TPFLYER%TITLE,' comes from model ',IMODEL,' in  model ',&
-             TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-   ELSE
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-      WRITE(ILUOUT,*) TPFLYER%TITLE,' goes from model ',IMODEL,' to  model ',&
-             TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-   ENDIF
-ENDIF
-!
-!
-END SUBROUTINE FLYER_CHANGE_MODEL
+
+IF ( PRESENT( PX ) ) THEN
+  ZX = PX
+ELSE
+  ZX = TPFLYER%XX_CUR
+END IF
+
+IF ( PRESENT( PY ) ) THEN
+  ZY = PY
+ELSE
+  ZY = TPFLYER%XY_CUR
+END IF
+
+CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL )
+
+IF ( IRANK < 1 ) THEN
+  ! Flyer is outside of horizontal domain
+  ! TPFLYER%NMODEL !Do not change to keep a valid value
+  TPFLYER%LCRASH    = .TRUE.
+  TPFLYER%NCRASH    = NCRASH_OUT_HORIZ
+  TPFLYER%LFLY      = .FALSE.
+ELSE
+  TPFLYER%NMODEL    = IMODEL
+  TPFLYER%LCRASH    = .FALSE.
+  TPFLYER%NCRASH    = NCRASH_NO
+  !TPFLYER%LFLY      = !Do not touch LFLY (flyer could be in flight or not)
+  TPFLYER%NRANK_CUR = IRANK
+END IF
+
+END SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-END SUBROUTINE AIRCRAFT_BALLOON_EVOL
+SUBROUTINE FLYER_CHECK_STORESTEP( TPFLYER )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA
+
+USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INSTANT
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft
+
+INTEGER :: ISTORE
+
+!Remark: TPFLYER%TFLYER_TIME%N_CUR and %TPDATES are updated in STATPROF_INSTANT
+CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE )
+
+IF ( ISTORE < 1 ) THEN
+  !No profiler storage at this time step
+  TPFLYER%LSTORE = .FALSE.
+ELSE
+  TPFLYER%LSTORE = .TRUE.
+END IF
+
+END SUBROUTINE FLYER_CHECK_STORESTEP
+!----------------------------------------------------------------------------
+
+END MODULE MODE_AIRCRAFT_BALLOON_EVOL
diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90
index e9eda58c83d726d4d3b27d595189f32abf9aadfd..c949ca4ebf02ce76697e879545f78ad7a8cd8e18 100644
--- a/src/MNH/call_rttov11.f90
+++ b/src/MNH/call_rttov11.f90
@@ -93,7 +93,7 @@ USE MODD_CST
 USE MODD_PARAMETERS
 USE MODD_GRID_n
 USE MODD_IO, ONLY: TFILEDATA
-USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL
+USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_LUNIT_n
 USE MODD_DEEP_CONVECTION_n
 USE MODD_REF_n
@@ -266,7 +266,7 @@ integer (kind=jpim), parameter :: fin = 10
 character (len=256) :: outstring
 ! -----------------------------------------------------------------------------
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       0.     ARRAYS BOUNDS INITIALIZATION
@@ -585,22 +585,17 @@ DO JSAT=1,IJSAT ! loop over sensors
       YEND=YTWO//YCHAN
     END IF
 
-!    IF (INRAD==1) THEN
-!    TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'rad'
-!    TZFIELD%CUNITS     = 'mw/cm-1/ster/sq.m'
-!    TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' rad'
-!    ELSE
-    TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT'
-!    ENDIF
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
+      CUNITS     = 'K',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 2,                                  &
+      LTIMEDEP   = .TRUE.                              )
 !    PRINT *,'YRECFM='//TRIM(TZFIELD%CMNHNAME)
     CALL IO_Field_write(TPFILE,TZFIELD,ZBT(:,:,JCH))
   END DO
diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90
index 97ccf20af2a1a608ad00478b2f05046572cef425..90526ac29577602f548b302c12173cfe7b98298c 100644
--- a/src/MNH/call_rttov13.f90
+++ b/src/MNH/call_rttov13.f90
@@ -90,7 +90,7 @@ USE MODD_CST
 USE MODD_PARAMETERS
 USE MODD_GRID_n
 USE MODD_IO, ONLY: TFILEDATA
-USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL
+USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_LUNIT_n
 USE MODD_LBC_n
 USE MODD_DEEP_CONVECTION_n
@@ -262,8 +262,9 @@ real    (kind=jprb) :: zenangle
 integer (kind=jpim), parameter :: fin = 10
 character (len=256) :: outstring
 ! -----------------------------------------------------------------------------
+CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       0.     ARRAYS BOUNDS INITIALIZATION
@@ -696,21 +697,25 @@ DO JSAT=1,IJSAT ! loop over sensors
     thermal = coefs%coef%ss_val_chn(ichan) < 2
 !   solar   = coefs%coef%ss_val_chn(ichan) > 0
     IF (thermal) THEN
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
-      TZFIELD%CUNITS     = 'K'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' brightness temperature'
+      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
+      YUNITS     = 'K'
+      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' brightness temperature'
     ELSE
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'refl'
-      TZFIELD%CUNITS     = '-'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor'
+      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'refl'
+      YUNITS     = '-'
+      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor'
     END IF
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                      &
+      CMNHNAME   = TRIM( YMNHNAME ),               &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = 'MesoNH: ' // TRIM( YMNHNAME ), &
+      CUNITS     = TRIM( YUNITS ),                 &
+      CDIR       = 'XY',                           &
+      CCOMMENT   = TRIM( YCOMMENT ),               &
+      NGRID      = 1,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 2,                              &
+      LTIMEDEP   = .TRUE.                          )
 !   ZOUT(:,:,JCH) = ZOUT(:,:,JCH) *ZCOSZEN(:,:)
     CALL IO_Field_write(TPFILE,TZFIELD,ZOUT(:,:,JCH))
   END DO
diff --git a/src/MNH/call_rttov8.f90 b/src/MNH/call_rttov8.f90
index 946021f408ea475fedeb5baeea3d2576a05df475..ab370816e9fbd8998e73ed1420898793511151f9 100644
--- a/src/MNH/call_rttov8.f90
+++ b/src/MNH/call_rttov8.f90
@@ -90,6 +90,7 @@ SUBROUTINE CALL_RTTOV8(KDLON, KFLEV, KSTATM, PEMIS, PTSRAD, PSTATM,     &
 !!              ------------
 !!
 USE MODD_CST
+USE MODD_FIELD,          only: TFIELDMETADATA
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_PARAMETERS
 USE MODD_GRID_n
@@ -686,7 +687,8 @@ REAL(Kind=jprb), PARAMETER :: q_mixratio_to_ppmv  = 1.60771704e+6_JPRB
 REAL(Kind=jprb), PARAMETER :: o3_mixratio_to_ppmv = 6.03504e+5_JPRB
 INTEGER(Kind=jpim) :: alloc_status(40)
 
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT
+TYPE(TFIELDMETADATA) :: TZFIELD
 
 ! - End of header --------------------------------------------------------
 !!!----------------------------------------------------------------------------
@@ -1567,16 +1569,17 @@ DO JSAT=1,IJSAT ! loop over sensors
 !    DO JK1=1,LEN_TRIM(inst_name(KRTTOVINFO(3,JSAT)))
 !      YINST(JK1:JK1)=CHAR(ICHAR(YINST(JK1:JK1))-32)
 !    END DO
-    TZFIELD%CMNHNAME   = TRIM(YINST)//'_ANGL'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'degree'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = TRIM(YINST)//' ANGLE'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(            &
+      CMNHNAME   = TRIM(YINST)//'_ANGL', &
+      CSTDNAME   = '',                   &
+      CLONGNAME  = TRIM(YINST)//'_ANGL', &
+      CUNITS     = 'degree',             &
+      CDIR       = 'XY',                 &
+      CCOMMENT   = TRIM(YINST)//' ANGLE' &
+      NGRID      = 1,                    &
+      NTYPE      = TYPEREAL,             &
+      NDIMS      = 2,                    &
+      LTIMEDEP   = .TRUE.                )
     PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT
     CALL IO_Field_write(TPFILE,TZFIELD,ZANTMP)
   END IF
@@ -1619,36 +1622,41 @@ DO JSAT=1,IJSAT ! loop over sensors
       YEND=YTWO//YCHAN
     END IF
     IF (INRAD==1) THEN
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'rad'
-      TZFIELD%CUNITS     = 'mw/cm-1/ster/sq.m'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' rad'
+      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'rad'
+      YUNITS     = 'mw/cm-1/ster/sq.m'
+      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' rad'
     ELSE
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
-      TZFIELD%CUNITS     = 'K'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT'
+      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
+      YUNITS     = 'K'
+      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT'
     ENDIF
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(        &
+      CMNHNAME   = TRIM( YMNHNAME ), &
+      CSTDNAME   = '',               &
+      CLONGNAME  = TRIM( YMNHNAME ), &
+      CUNITS     = TRIM( YUNITS ),   &
+      CDIR       = 'XY',             &
+      CCOMMENT   = TRIM( YCOMMENT ), &
+      NGRID      = 1,                &
+      NTYPE      = TYPEREAL,         &
+      NDIMS      = 2,                &
+      LTIMEDEP   = .TRUE.            )
     PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
          MINVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF), &
          MAXVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF)
     CALL IO_Field_write(TPFILE,TZFIELD,ZTBTMP(:,:,JCH))
     IF (KRTTOVINFO(3,JSAT) == 4.AND. JCH==3 ) THEN ! AMSU-B
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_UTH'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'percent'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_UTH'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 2
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(          &
+        CMNHNAME   = TRIM(YBEG)//'_UTH', &
+        CSTDNAME   = '',                 &
+        CLONGNAME  = TRIM(YBEG)//'_UTH', &
+        CUNITS     = 'percent',          &
+        CDIR       = 'XY',               &
+        CCOMMENT   = TRIM(YBEG)//'_UTH', &
+        NGRID      = 1,                  &
+        NTYPE      = TYPEREAL,           &
+        NDIMS      = 2,                  &
+        LTIMEDEP   = .TRUE.              )
 ! UTH computation from Buehler and John JGR 2005
       ZZH= 833000. ! (m) nominal altitude of the satellite
       zdeg_to_rad = XPI / 180.0
@@ -1720,31 +1728,33 @@ DO JSAT=1,IJSAT ! loop over sensors
         END DO
       END DO
       !
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'K K-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JATEMP'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 2
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                              &
+        CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
+        CSTDNAME   = '',                                     &
+        CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
+        CUNITS     = 'K K-1',                                &
+        CDIR       = 'XY',                                   &
+        CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JATEMP', &
+        NGRID      = 1,                                      &
+        NTYPE      = TYPEREAL,                               &
+        NDIMS      = 2,                                      &
+        LTIMEDEP   = .TRUE.                                  )
       PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
            MINVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF), &
            MAXVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF)
       CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPK(:,:,:))
       !
-      TZFIELD%CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'K'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JAWVAP'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 2
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                              &
+        CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
+        CSTDNAME   = '',                                     &
+        CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
+        CUNITS     = 'K',                                    &
+        CDIR       = 'XY',                                   &
+        CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JAWVAP', &
+        NGRID      = 1,                                      &
+        NTYPE      = TYPEREAL,                               &
+        NDIMS      = 2,                                      &
+        LTIMEDEP   = .TRUE.                                  )
       WHERE (ZWVAPK(:,:,:) /= XUNDEF) &
            ZWVAPK(:,:,:)=ZWVAPK(:,:,:)*(-0.1*PRT(:,:,:,1))
       PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
diff --git a/src/MNH/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90
index 99b0f876602db0bfca18dd5da3d16547cd8670a4..505f3acfae89b18fac882c45bc4a2fe83b953ac0 100644
--- a/src/MNH/ch_aer_reallfin.f90
+++ b/src/MNH/ch_aer_reallfin.f90
@@ -1,13 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 chimie 2006/06/16 13:28:57
-!-----------------------------------------------------------------
 !!   ########################
      MODULE MODI_CH_AER_REALLFI_n
 !!   ########################
@@ -155,8 +150,8 @@ IF (LINITPM) THEN
 !ZVALOC=2.304978E-9 ! value in kg/m3 (escompte values)
 !ZVALBC=1.E-9  ! value in kg/m3 (default values)
 !ZVALOC=2.E-9 ! value in kg/m3  (default values)
-!ZVALBC= ZVALBC *24.47 / 12. ! conversion into ppp 
-!ZVALOC= ZVALOC *24.47 / 12. ! conversion into ppp
+!ZVALBC= ZVALBC *24.47 / 12. ! conversion into ppv
+!ZVALOC= ZVALOC *24.47 / 12. ! conversion into ppv
 !ZCOEFAEROBC=ZVALBC/ZSUMAEROCO
 !ZCOEFAEROOC=ZVALOC/ZSUMAEROCO
 
@@ -317,7 +312,7 @@ DO JN=1,JPMODE
 !
 ENDDO
 !
-!conversion into ppp
+!conversion into ppv
 DO JJ=1,NSV_AER
   PSV(:,:,:,JJ) =  PSV(:,:,:,JJ) /  (ZDEN2MOL*PRHODREF(:,:,:)) 
 ENDDO
diff --git a/src/MNH/ch_convect_scavenging.f90 b/src/MNH/ch_convect_scavenging.f90
index a0bfccfd63a1dac9b3f8404c9819fd294e5d777c..dd8a5591799129525c4416e7f90d405a808732d2 100644
--- a/src/MNH/ch_convect_scavenging.f90
+++ b/src/MNH/ch_convect_scavenging.f90
@@ -1,7 +1,8 @@
-!MNH_LIC Copyright 1994-2014 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 MODI_CH_CONVECT_SCAVENGING
 !     ######################
@@ -340,7 +341,7 @@ ENDDO
 !
 GCHFIRSTCALL = .FALSE.
 !
-!               Convert KH from mol/l/atm in ppp/ppp
+!               Convert KH from mol/l/atm in ppv/ppv
 !               ------------------------------------
 DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND
  ZKHC(:,:,JKAQ) = ZKH(:,:,JKAQ)*0.08205*ZT(:,:)*ZLWCC(:,:)
@@ -368,7 +369,7 @@ DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND
 ENDDO
 !
 !
-!          Convert KHI from cm3(air)/cm3(ice) in ppp/ppp
+!          Convert KHI from cm3(air)/cm3(ice) in ppv/ppv
 !          ---------------------------------------------    
 DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND
  IF (CNAMES(JKAQ-NSV_CHEMBEG+1)=='HNO3') THEN 
diff --git a/src/MNH/ch_emission_flux0d.f90 b/src/MNH/ch_emission_flux0d.f90
index 540a03306b94eb4c9c1501f269d4d09e6e87a004..74b84f6d413745e5707a5cfb811f65be0bf56e5a 100644
--- a/src/MNH/ch_emission_flux0d.f90
+++ b/src/MNH/ch_emission_flux0d.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -13,7 +13,7 @@ USE MODD_CH_M9_n,      ONLY: NEQ
 IMPLICIT NONE
 REAL,                 INTENT(IN)  :: PTIME      ! time of simulation in sec UTC
                                                 ! (counting from midnight)
-REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX      ! emission flux in ppp*m/s
+REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX      ! emission flux in ppv*m/s
 CHARACTER(len=*),     INTENT(IN)  :: HINPUTFILE ! name of the input file
 INTEGER,              INTENT(IN)  :: KLUOUT     ! output listing channel
 INTEGER,              INTENT(IN)  :: KVERB      ! verbosity level
@@ -55,10 +55,10 @@ END MODULE MODI_CH_EMISSION_FLUX0D
 !!    where the unit identifier [MIX|CON|MOL] indicates whether
 !!    the flux is given as 
 !!    CON: molecules/cm2/s 
-!!    MIX: ppp*m/s
+!!    MIX: ppv*m/s
 !!    MOL: microMol/m2/day
 !!    (assuming standard pressure and temperature in the conversion)
-!!    The returned flux is given in ppp*m/s, that is standard MesoNH
+!!    The returned flux is given in ppv*m/s, that is standard MesoNH
 !!    units so that no conversion is to be applied when introducing 
 !!    the emission flux in the 3-D model.
 !!
@@ -96,7 +96,7 @@ IMPLICIT NONE
 
 REAL,                 INTENT(IN)  :: PTIME      ! time of simulation in sec UTC
                                                 ! (counting from midnight)
-REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX      ! emission flux in ppp*m/s
+REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX      ! emission flux in ppv*m/s
 CHARACTER(len=*),     INTENT(IN)  :: HINPUTFILE ! name of the input file
 INTEGER,              INTENT(IN)  :: KLUOUT     ! output listing channel
 INTEGER,              INTENT(IN)  :: KVERB      ! verbosity level
@@ -207,13 +207,13 @@ IF (LSFIRSTCALL) THEN
 !
 ! determine the conversion factor
   SELECT CASE (YUNIT)
-  CASE ('MIX') ! flux given ppp*m/s, no conversion required
+  CASE ('MIX') ! flux given ppv*m/s, no conversion required
     ZCONVERSION = 1.0
   CASE ('CON') ! flux given in molecules/cm2/s
-               ! where 1 molecule/cm2/s = (224.14/6.022136E23) ppp*m/s
+               ! where 1 molecule/cm2/s = (224.14/6.022136E23) ppv*m/s
     ZCONVERSION = (224.14/6.022136E23)
   CASE ('MOL') ! flux given in microMol/m2/day
-               ! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppp*m/s
+               ! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppv*m/s
     ZCONVERSION = (22.414/86.400)*1E-12
   CASE DEFAULT
     call Print_msg( NVERB_FATAL, 'GEN', 'CH_EMISSION_FLUX0D', 'unknow conversion factor: '//trim(YUNIT) )
diff --git a/src/MNH/ch_field_valuen.f90 b/src/MNH/ch_field_valuen.f90
index 0693c28a24b13c14162aebc939e5b5d80508adcc..0dcd5670a826ecff442ae53b74afb07366a5f13c 100644
--- a/src/MNH/ch_field_valuen.f90
+++ b/src/MNH/ch_field_valuen.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -228,7 +228,7 @@ firstcall: IF (GSFIRSTCALL) THEN
   CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "NORMINIT", TZFILE, KLUOUT, KVERB)
   ICHANNEL = TZFILE%NLU
 !
-! read units for initial data (may be "CON" for molec./cm3 or "MIX" for ppp)
+! read units for initial data (may be "CON" for molec./cm3 or "MIX" for ppv)
   READ(ICHANNEL,"(A)") HUNIT
   IF (HUNIT .EQ. "CON") THEN
     IF (KVERB >= 5) THEN
diff --git a/src/MNH/ch_model0d.f90 b/src/MNH/ch_model0d.f90
index c2b4fb45727db9663e58f0c26b1a9bf6a853f702..26ff9fe185dc6ffae01f86a2ff48f17528fefe27 100644
--- a/src/MNH/ch_model0d.f90
+++ b/src/MNH/ch_model0d.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -309,10 +309,10 @@ IF (NVERB >= 5) THEN
   END IF
 END IF
 ! 
-ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppp to molec.cm-3
+ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppv to molec.cm-3
 ZNEWCONC(1,:) = ZCONC(1,:)
 IF (LORILAM) THEN
-ZAERO(1,:) = ZAERO(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppp to molec.cm-3
+ZAERO(1,:) = ZAERO(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppv to molec.cm-3
 ZNEWAERO(1,:) = ZAERO(1,:)  
 END IF
 !*       1.5  initialize data for jvalues
@@ -468,7 +468,7 @@ IF (LORILAM) THEN
    XDP(:,:) = 2.E-6 * ZRG0(:,:)
 END IF
 
-  ! ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) !convert ppp to  molec.cm-3
+  ! ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) !convert ppv to  molec.cm-3
 
    CALL CH_SET_RATES(XTSIMUL,ZCONC,TZM,1,6,NVERB,1,NEQ)
    TZK%MODELLEVEL = 1
@@ -501,10 +501,10 @@ CALL CH_UPDATE_JVALUES(6, ZZENITH, ZRT,              &
   write_to_disk : IF (XTSIMUL >= XTNEXTOUT) THEN
 
     ZCONC(1,:) = ZCONC(1,:)*1.E9 / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppb
-    IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp
+    IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv
     CALL CH_OUTPUT(ZCONC,ZAERO, ZMI, TZM, 1, 1)
     ZCONC(1,:) = ZCONC(1,:)*1.E-9 * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert  ppb to molec.cm-3
-    IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert  ppp to molec.cm-3
+    IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert  ppv to molec.cm-3
 
     XTNEXTOUT = XTSIMUL + XDTOUT
   ENDIF write_to_disk
@@ -559,8 +559,8 @@ ENDDO time_loop
 !*       4.1  write final result to disk (restart file)
 !
 ! convert molec.cm-3 to ppb
-ZCONC(1,:) = ZCONC(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp
-IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp
+ZCONC(1,:) = ZCONC(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv
+IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv
 CALL CH_WRITE_CHEM(ZCONC(1,:), ZAERO(1,:), ZRHODREF(:,1,1), COUTFILE)
 !
 !*       4.2  finish
diff --git a/src/MNH/ch_monitorn.f90 b/src/MNH/ch_monitorn.f90
index eb8db26c60d91dfa3c2354d326b3cb6039346b8a..b225ac270ce8058284c1c08224e26e2484159e55 100644
--- a/src/MNH/ch_monitorn.f90
+++ b/src/MNH/ch_monitorn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -628,7 +628,7 @@ IF (LORILAM) THEN
 !
 END IF
 !
-!*       1.4 compute conversion factor ppp/m3 --> molec/cm3
+!*       1.4 compute conversion factor ppv/m3 --> molec/cm3
 !
 ZDEN2MOL = 1E-6 * XAVOGADRO / XMD
 !
@@ -947,7 +947,7 @@ DO JL=1,ISVECNMASK
     IF (SIZE(XRT,4) .GE. 2) ZRC(JM+1) = XRT(JI, JJ, JK, 2)
     !Molar mass (kg/kg)
     ZMI(JM+1,:)     = XMI(JI, JJ, JK, :)
-    !Moments (ppp)
+    !Moments (ppv)
     ZM(JM+1,:)      = XM3D(JI,JJ,JK,:)
     ZLNSIG(JM+1,:)   = LOG(XSIG3D(JI,JJ,JK,:))
     ZRG(JM+1,:)    =  XRG3D(JI,JJ,JK,:)  
diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90
index bd3ed06dfc5da4908161c7f07ede175eaa09849e..29a166440fe35c34c029548a5874883605945ddc 100644
--- a/src/MNH/ch_read_chem.f90
+++ b/src/MNH/ch_read_chem.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -147,7 +147,7 @@ ELSE
     END IF
   END DO
 
-!Conversion ppb to ppp
+!Conversion ppb to ppv
  PCONC(:) =  PCONC(:) * 1E-9
 IF (LORILAM) THEN
   DO JI = 1, SIZE(PAERO,1)
@@ -165,7 +165,7 @@ IF (LORILAM) THEN
                       ' /= '//trim(YVARNAME) )
     END IF
   END DO
-!Conversion  microgram/m3 to ppp
+!Conversion  microgram/m3 to ppv
 ZMD    = 28.9644E-3
 ! Constants initialization
 ZMI(:) = 250.
diff --git a/src/MNH/ch_surface0d.f90 b/src/MNH/ch_surface0d.f90
index ce3bab6c4e23a9647273ec2e612fc1a38aaef8f8..8247ae0b790b360aac9a4f193e840a98555dc4fa 100644
--- a/src/MNH/ch_surface0d.f90
+++ b/src/MNH/ch_surface0d.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -132,8 +132,8 @@ CALL CH_EMISSION_FLUX0D(PTSIMUL, ZEMIS, "CHCONTROL1.nam", 6, NVERB)
 ! convert m2 to cm2, days to seconds and Mole to molecules
 ! ZEMIS(1:KEQ) = (6.022136E23/1E4/86400.)*ZEMIS(1:KEQ)
 !
-! convert ppp*m/s to molecules/cm2/s
-! based on 1 ppp*m/s = (Na/Vmol)*m/s = (6.022136E23/22.414E-3) molecules/m2/s
+! convert ppv*m/s to molecules/cm2/s
+! based on 1 ppv*m/s = (Na/Vmol)*m/s = (6.022136E23/22.414E-3) molecules/m2/s
 ZEMIS(1:KEQ) = (6.022136E23/224.14)*ZEMIS(1:KEQ)
 !
 !*    2.   CALCULATE DEPOSITION FLUXES WITH WESLEY 
@@ -153,7 +153,7 @@ ZSVT(1,1,1,:) = PCONC(:) ! scalar variables at t
 !                      ZHU_PATCH,ZPSN_PATCH)
 !UPG
 !
-! results in  ZSFSV(1,1,:) ! flux of scalar variables (ppp*m/s)
+! results in  ZSFSV(1,1,:) ! flux of scalar variables (ppv*m/s)
 ! but we do not use them here, we rather take the deposition velocity 
 ! directly from the module (variable XVDEPT)
 !
diff --git a/src/MNH/ch_write_chem.f90 b/src/MNH/ch_write_chem.f90
index ecc8a4b1e26915317b1cb535695e4bdba29b041b..a3c05fd66d24c713d242f84c5063527fc42bcecd 100644
--- a/src/MNH/ch_write_chem.f90
+++ b/src/MNH/ch_write_chem.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -93,10 +93,10 @@ OPEN(NEWUNIT =  ILU,        &
      STATUS  = 'UNKNOWN'    )
 !
 DO JI = 1, NEQ
-  WRITE(UNIT=ILU,FMT='(3A,E20.8)') "'", CNAMES(JI), "' ", PCONC(JI)*1.E9 ! convert ppp to ppb
+  WRITE(UNIT=ILU,FMT='(3A,E20.8)') "'", CNAMES(JI), "' ", PCONC(JI)*1.E9 ! convert ppv to ppb
 ENDDO
 IF (LORILAM) THEN
-!Conversion  ppp to microgram/m3
+!Conversion  ppv to microgram/m3
 ZMD    = 28.9644E-3
 ! Constants initialization
 ZMI(:) = 250.
diff --git a/src/MNH/compare_dad.f90 b/src/MNH/compare_dad.f90
index fe145cee49c3dc81433344f9e26cebddcc46f57c..983eb5188da425017d880f728576aac6e0ece1e5 100644
--- a/src/MNH/compare_dad.f90
+++ b/src/MNH/compare_dad.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2004-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2004-2021 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.
@@ -66,7 +66,7 @@ END MODULE MODI_COMPARE_DAD
 !
 !
 USE MODD_CONF
-use modd_field,            only: tfielddata, tfieldlist
+use modd_field,            only: tfieldmetadata, tfieldlist
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LUNIT_n,          ONLY: TLUOUT
 USE MODD_PARAMETERS,       ONLY: JPHEXT, JPVEXT, NMNHNAMELGTMAX
@@ -109,7 +109,7 @@ INTEGER             :: IIMAX_1,IJMAX_1,IKMAX_1
 INTEGER             :: IIMAX_2,IJMAX_2,IKMAX_2
 !
 REAL :: ZLATORI, ZLONORI, ZXHATM, ZYHATM
-TYPE(TFIELDDATA)        :: TZFIELD
+TYPE(TFIELDMETADATA)    :: TZFIELD
 TYPE(TFILEDATA),POINTER :: TZDADINIFILE => NULL()
 TYPE(TFILEDATA),POINTER :: TZDADSPAFILE => NULL()
 !-------------------------------------------------------------------------------
@@ -170,12 +170,12 @@ IF (.NOT.LCARTESIAN) THEN
   !
   IF (TZDADINIFILE%NMNHVERSION(1)<4 .OR. (TZDADINIFILE%NMNHVERSION(1)==4 .AND. TZDADINIFILE%NMNHVERSION(2)<=5) ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LONOR'
     CALL IO_Field_read(TZDADINIFILE,TZFIELD,ZLONORI_1)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LATOR'
     CALL IO_Field_read(TZDADINIFILE,TZFIELD,ZLATORI_1)
     !
@@ -226,12 +226,12 @@ IF (.NOT.LCARTESIAN) THEN
   !
   IF (TZDADSPAFILE%NMNHVERSION(1)<4 .OR. (TZDADSPAFILE%NMNHVERSION(1)==4 .AND. TZDADSPAFILE%NMNHVERSION(2)<=5)) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LONOR'
     CALL IO_Field_read(TZDADSPAFILE,TZFIELD,ZLONORI_2)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LATOR'
     CALL IO_Field_read(TZDADSPAFILE,TZFIELD,ZLATORI_2)
     !
diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90
index 692fb3a1e0d1b8c90710f2d086f5bd37565c2962..727b230ffd52a9b7afa1b20d5748bc45e34876b4 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 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.
@@ -65,7 +65,7 @@ END MODULE MODI_COMPUTE_R00
 !
 USE MODD_CONF
 USE MODD_GRID_n
-use modd_field,            only: tfielddata, TYPEREAL
+use modd_field,            only: tfieldmetadata, TYPEREAL
 USE MODD_FIELD_n
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LUNIT_n
@@ -106,6 +106,7 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZRV0          ! same fields
        ! for Rv as for the coordinates of the origin
 REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZWORK1,ZWORK2,ZWORK3       
 TYPE(DATE_TIME)                    :: TDTCUR_START
+CHARACTER(LEN=NMNHNAMELGTMAX)      :: YMNHNAME
 CHARACTER(LEN=24)                  :: YDATE 
 INTEGER                            :: IHOUR, IMINUTE
 REAL                               :: ZSECOND, ZREMAIN
@@ -113,7 +114,7 @@ LOGICAL                            :: GSTART
 INTEGER                            :: INBR_START
 REAL                               :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
 INTEGER, DIMENSION(100)            :: NBRFILES 
-TYPE(TFIELDDATA)                   :: TZFIELD
+TYPE(TFIELDMETADATA)               :: TZFIELD
 TYPE(TFILEDATA),POINTER            :: TZTRACFILE
 !
 !-------------------------------------------------------------------------------
@@ -275,43 +276,49 @@ DO JFILECUR=1,NFILES
 !
   IF (GSTART) THEN
     PRINT *,'INBR_START',INBR_START,' NBRFILES(JFILECUR)',NBRFILES(JFILECUR)
-    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'X0',INBR_START
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'km'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    WRITE(YMNHNAME,'(A2,I2.2)')'X0',INBR_START
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = TRIM( YMNHNAME ),                &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = TRIM( YMNHNAME ),                &
+      CUNITS     = 'km',                            &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,ZX00(:,:,:))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Y0',INBR_START
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'km'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    WRITE(YMNHNAME,'(A2,I2.2)')'Y0',INBR_START
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = TRIM( YMNHNAME ),                &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = TRIM(TZFIELD%CMNHNAME),          &
+      CUNITS     = 'km',                            &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,ZY00(:,:,:))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Z0',INBR_START
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'km'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    WRITE(YMNHNAME,'(A2,I2.2)')'Z0',INBR_START
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = TRIM( YMNHNAME ),                &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = TRIM( YMNHNAME ),                &
+      CUNITS     = 'km',                            &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,ZZ00(:,:,:))
   END IF
 !
@@ -330,56 +337,60 @@ DO JFILECUR=1,NFILES
 !
   IF (GSTART) THEN
     !
-    WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'TH0',INBR_START
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    WRITE(YMNHNAME,'(A3,I2.2)')'TH0',INBR_START
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = TRIM( YMNHNAME ),                &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = TRIM( YMNHNAME ),                &
+      CUNITS     = 'K',                             &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK1(:,:,:))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'RV0',INBR_START
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'g kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    WRITE(YMNHNAME,'(A3,I2.2)')'RV0',INBR_START
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = TRIM( YMNHNAME ),                &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = TRIM( YMNHNAME ),                &
+      CUNITS     = 'g kg-1',                        &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2(:,:,:))
   ENDIF
 !*       4.4   compute the origin of the particules using one more segment
 !
   IF (JFILECUR /= NFILES) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = '' !Unknown comment
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    TZFIELD%CMNHNAME   = 'LGXT'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD = TFIELDMETADATA(&
+      CMNHNAME   = 'LGXT',   &
+      CSTDNAME   = '',       &
+      CLONGNAME  = 'LGXT',   &
+      CUNITS     = 'm',      &
+      CDIR       = 'XY',     &
+      CCOMMENT   = '',       &
+      NGRID      = 1,        &
+      NTYPE      = TYPEREAL, &
+      NDIMS      = 3,        &
+      LTIMEDEP   = .TRUE.    )
     CALL IO_Field_read(TZTRACFILE,TZFIELD,ZX0)
     ZX0(:,:,:)=ZX0(:,:,:)*1.E-3   ! ZX0 in km
     !
     TZFIELD%CMNHNAME   = 'LGYT'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CLONGNAME  = 'LGYT'
     CALL IO_Field_read(TZTRACFILE,TZFIELD,ZY0)
     ZY0(:,:,:)=ZY0(:,:,:)*1.E-3   ! ZY0 in km
     !
     TZFIELD%CMNHNAME   = 'LGZT'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CLONGNAME  = 'LGZT'
     CALL IO_Field_read(TZTRACFILE,TZFIELD,ZZ0)
     ZZ0(:,:,:)=ZZ0(:,:,:)*1.E-3   ! ZZ0 in km
     !
diff --git a/src/MNH/conjgrad.f90 b/src/MNH/conjgrad.f90
index 9adf9ed36ed2cb0a64ca545ba5c9c378d35b5224..63c3cad9e3f9c5f890deb642eccb0e2c44cb3eb2 100644
--- a/src/MNH/conjgrad.f90
+++ b/src/MNH/conjgrad.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 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.
@@ -23,12 +23,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
@@ -149,12 +149,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
diff --git a/src/MNH/conresol.f90 b/src/MNH/conresol.f90
index c0e103e9a6b06282ccc14e37f90535404b147340..8b33d0dcc715d728dd404fa279ed51cd1cb6a0e2 100644
--- a/src/MNH/conresol.f90
+++ b/src/MNH/conresol.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 solver 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ####################
       MODULE MODI_CONRESOL
 !     ####################
@@ -23,12 +18,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual pot. temp. at time t
@@ -149,12 +144,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual pot. temp. at time t
diff --git a/src/MNH/conresolz.f90 b/src/MNH/conresolz.f90
index 3624bb2eb58b095c96245e1894b2ad8f4f9c71e8..358b78ea7c1b2b06f9b371d1c0c62e46c1f49828 100644
--- a/src/MNH/conresolz.f90
+++ b/src/MNH/conresolz.f90
@@ -1,14 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
-!-----------------------------------------------------------------
-!-----------------------------------------------------------------
 !     ####################
       MODULE MODI_CONRESOLZ
 !     ####################
@@ -26,12 +20,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual pot. temp. at time t
@@ -160,12 +154,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual pot. temp. at time t
diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90
index c890435f523160d94c0da938e847bf36c21b1da6..44e3b3333227f5cfc3605c79930d60885a1c9422 100644
--- a/src/MNH/contrav.f90
+++ b/src/MNH/contrav.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.
@@ -21,8 +21,8 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PRWT       ! Cartesian comp along z
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDXX       ! Metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDYY       ! Metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZZ       ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZX       ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZY       ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZY     ! Metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT      ! Contrav comp along x-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRVCT      ! Contrav comp along y-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRWCT      ! Contrav comp along z-bar
@@ -127,8 +127,8 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PRWT     ! Cartesian comp along z
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDXX     ! Metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDYY     ! Metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZZ     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZX     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZY     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZY     ! Metric coefficients
 !
 !
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT    ! Contrav comp along x-bar
diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index ade773022d23c3b0a5a10956b158429b0fde831d..a6f463fda595639df6763d46b1cc1fda568d3f66 100644
--- a/src/MNH/default_desfmn.f90
+++ b/src/MNH/default_desfmn.f90
@@ -1,4 +1,4 @@
-!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.
@@ -221,7 +221,8 @@ END MODULE MODI_DEFAULT_DESFM_n
 !  Q. Rodier      07/2021: modify XPOND=1
 !  A. Costes      12/2021: Blaze fire model
 !  C. Barthe      03/2022: add CIBU and RDSF options in LIMA
-!  Delbeke/Vie    03/2022 : KHKO option in LIMA
+!  Delbeke/Vie    03/2022: KHKO option in LIMA
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -273,6 +274,7 @@ USE MODD_EOL_MAIN
 USE MODD_EOL_ADNR
 USE MODD_EOL_ALM
 USE MODD_EOL_SHARED_IO
+USE MODD_ALLPROFILER_n
 USE MODD_ALLSTATION_n
 !
 !
@@ -599,7 +601,21 @@ LTIPLOSSG         = .TRUE.
 LTECOUTPTS        = .FALSE.
 !
 !------------------------------------------------------------------------------
-!*      10.e   SET DEFAULT VALUES FOR MODD_ALLSTATION_n :
+!*      10.e   SET DEFAULT VALUES FOR MODD_ALLPROFILER_n :
+!             ----------------------------------
+!
+NNUMB_PROF    = 0
+XSTEP_PROF    = 60.0
+XX_PROF(:)    = XUNDEF
+XY_PROF(:)    = XUNDEF
+XZ_PROF(:)    = XUNDEF
+XLAT_PROF(:)  = XUNDEF
+XLON_PROF(:)  = XUNDEF
+CNAME_PROF(:) = ''
+CFILE_PROF    = 'NO_INPUT_CSV'
+! LDIAG_SURFRAD = .TRUE.
+!------------------------------------------------------------------------------
+!*      10.f   SET DEFAULT VALUES FOR MODD_ALLSTATION_n :
 !             ----------------------------------
 !
 NNUMB_STAT    = 0
@@ -610,7 +626,6 @@ XZ_STAT(:)    = XUNDEF
 XLAT_STAT(:)  = XUNDEF
 XLON_STAT(:)  = XUNDEF
 CNAME_STAT(:) = ''
-CTYPE_STAT(:) = ''
 CFILE_STAT    = 'NO_INPUT_CSV'
 LDIAG_SURFRAD = .TRUE.
 !
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 4bfd2dc5e8e8453068b95e8dc0ae6f41c16faa3e..abc7599766929e2d08e88a4f57f17d12cca8032b 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -91,7 +91,7 @@
 !  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
 !  P. Wautelet 11/02/2019: added missing use of MODI_CH_MONITOR_n
 !  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
-!  P. Wautelet 26/07/2019: bug correction: deallocate of zsea and ztown done too early
+!  P. Wautelet 26/07/2019: bug correction: deallocate of zsea done too early
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 06/07/2021: use FINALIZE_MNH
 !-------------------------------------------------------------------------------
@@ -141,6 +141,7 @@ USE MODD_TIME_n
 USE MODD_TURB_n
 USE MODD_VAR_ll
 !
+USE MODE_AIRCRAFT_BALLOON
 USE MODE_DATETIME
 USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
 USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
@@ -156,9 +157,9 @@ USE MODE_MODELN_HANDLER
 USE MODE_MSG
 USE MODE_POS
 USE MODE_TIME
+USE MODE_WRITE_AIRCRAFT_BALLOON
 use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n
 !
-USE MODI_AIRCRAFT_BALLOON
 USE MODI_CH_MONITOR_n
 USE MODI_COMPUTE_R00
 USE MODI_DIAG_SURF_ATM_N
@@ -166,7 +167,6 @@ USE MODI_INIT_MNH
 USE MODI_MNHGET_SURF_PARAM_n
 USE MODI_PHYS_PARAM_n
 USE MODI_VERSION
-USE MODI_WRITE_AIRCRAFT_BALLOON
 USE MODI_WRITE_DIAG_SURF_ATM_N
 USE MODI_WRITE_LFIFM1_FOR_DIAG
 USE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
@@ -205,7 +205,7 @@ LOGICAL:: GCLOUD_ONLY          ! conditionnal radiation computations for
                                 !      the only cloudy columns
 !
 INTEGER :: IIU, IJU, IKU
-REAL, DIMENSION(:,:),ALLOCATABLE          :: ZSEA,ZTOWN
+REAL, DIMENSION(:,:),ALLOCATABLE          :: ZSEA
 REAL, DIMENSION(:,:,:,:),ALLOCATABLE          :: ZWETDEPAER
 !
 TYPE(TFILEDATA),POINTER :: TZDIACFILE => NULL()
@@ -547,21 +547,17 @@ IF ( LAIRCRAFT_BALLOON ) THEN
   TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON
 !
   ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
-  ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
   ZSEA(:,:) = 0.
-  ZTOWN(:,:)= 0.
-  CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
-  DO ISTEPBAL=1,NTIME_AIRCRAFT_BALLOON,INT(XSTEP_AIRCRAFT_BALLOON)
-    CALL AIRCRAFT_BALLOON(XSTEP_AIRCRAFT_BALLOON,                &
-                      XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, &
-                      XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT,    &
-                      XTKET, XTSRAD, XRHODREF,XCIT,ZSEA)
+  CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:))
+  DO ISTEPBAL = 1, NTIME_AIRCRAFT_BALLOON, INT(XSTEP_AIRCRAFT_BALLOON)
+    CALL AIRCRAFT_BALLOON( XSTEP_AIRCRAFT_BALLOON, XZZ, XMAP, XLONORI, XLATORI, XUT, XVT, XWT, &
+                           XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, XRHODREF, XCIT, ZSEA        )
 
     TXDTBAL%xtime = TXDTBAL%xtime + XSTEP_AIRCRAFT_BALLOON
     CALL DATETIME_CORRECTDATE(TXDTBAL)
     TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON
-  ENDDO
-  DEALLOCATE (ZSEA,ZTOWN)
+  END DO
+  DEALLOCATE (ZSEA)
 !
   TDTCUR = TPDTCUR_SAVE
 !
diff --git a/src/MNH/eddy_fluxn.f90 b/src/MNH/eddy_fluxn.f90
index ed52def268d0ea872591a158078514d3fef3316e..dc20500dcd9390c6bd54a6847fbdf54ea661b953 100644
--- a/src/MNH/eddy_fluxn.f90
+++ b/src/MNH/eddy_fluxn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2004-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2004-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.
@@ -302,8 +302,8 @@ DO JJ=IJB,IJE
       !
         ZKYY(JI,JJ,JK) =  &
             (ZA0(JI) * XG*ZNDW(JI,JJ)/(ZTHM_W(JI,JJ)*(ZCORIOZ(JI,JJ,JK)**2)) ) &
-            * (ZDW(JI,JJ)**2) * (EXP(-0.5*(XZHAT(JK)+XZHAT(JK+1))/ZDW(JI,JJ))) &
-            * ZADTDXW(JI,JJ)   
+            * ZDW(JI,JJ)**2 * EXP( - XZHATM(JK) / ZDW(JI,JJ) ) &
+            * ZADTDXW(JI,JJ)
       ENDDO       
       !
     ! CASE WHERE NO INSTABILITY IS DETECTED
@@ -323,8 +323,7 @@ ENDDO
 
 !
 DO JK=IKB,IKE
-   ZVTH_FLUX(:,:,JK) = - 0.5 * ZKYY(:,:,JK)*ZDTHM_DY(:,:,JK) * &
-                    (1-EXP(-0.5*(XZHAT(JK)+XZHAT(JK+1))/ZDELTAZ))
+   ZVTH_FLUX(:,:,JK) = - 0.5 * ZKYY(:,:,JK) * ZDTHM_DY(:,:,JK) * ( 1 - EXP( -XZHATM(JK) / ZDELTAZ ) )
 END DO
 !
 !       2.1 Smoothing in equatorial region
diff --git a/src/MNH/effic_aero.f90 b/src/MNH/effic_aero.f90
index 83d65305711a97c472c6a3ab67421cdafcada72d..f3d053a49b031a07ac83cfb2cd67df1d61ac28f9 100644
--- a/src/MNH/effic_aero.f90
+++ b/src/MNH/effic_aero.f90
@@ -1,12 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ##############################
      MODULE MODI_EFFIC_AERO
 !!   ##############################
@@ -18,8 +14,8 @@ SUBROUTINE EFFIC_AERO(  &
      ,PRHODREF          & !I [kg/m3] air density
      ,PPABST            & !I [Pa] pressure
      ,PURR              & !I
-     ,PSVT              & !I [scalar variable, ppp] sea salt concentration
-     ,PEFFIC_AER            & !O [scalar variable, ppp] sea salt concentration
+     ,PSVT              & !I [scalar variable, ppv] sea salt concentration
+     ,PEFFIC_AER            & !O [scalar variable, ppv] sea salt concentration
      )
 
 IMPLICIT NONE
diff --git a/src/MNH/effic_dust.f90 b/src/MNH/effic_dust.f90
index 0f3755fcf9f3d27f7d219137691897cf66791fe6..a3ba0109e44279f6aada99142daacc728700b440 100644
--- a/src/MNH/effic_dust.f90
+++ b/src/MNH/effic_dust.f90
@@ -1,12 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2011-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ##############################
      MODULE MODI_EFFIC_DUST
 !!   ##############################
@@ -18,8 +14,8 @@ SUBROUTINE EFFIC_DUST(  &
      ,PRHODREF          & !I [kg/m3] air density
      ,PPABST            & !I [Pa] pressure
      ,PURR              & !I
-     ,PSVT              & !I [scalar variable, ppp] sea salt concentration
-     ,PEFFIC            & !O [scalar variable, ppp] sea salt concentration
+     ,PSVT              & !I [scalar variable, ppv] sea salt concentration
+     ,PEFFIC            & !O [scalar variable, ppv] sea salt concentration
      )
 
 IMPLICIT NONE
diff --git a/src/MNH/effic_salt.f90 b/src/MNH/effic_salt.f90
index a2636789606306e49d88e71ac4d74e2d72ef3c1a..6b7f152d2c77e9597673960ba903055bde499ebb 100644
--- a/src/MNH/effic_salt.f90
+++ b/src/MNH/effic_salt.f90
@@ -1,12 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2017-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ##############################
      MODULE MODI_EFFIC_SALT
 !!   ##############################
@@ -18,8 +14,8 @@ SUBROUTINE EFFIC_SALT(  &
      ,PRHODREF          & !I [kg/m3] air density
      ,PPABST            & !I [Pa] pressure
      ,PURR              & !I
-     ,PSVT              & !I [scalar variable, ppp] sea salt concentration
-     ,PEFFIC            & !O [scalar variable, ppp] sea salt concentration
+     ,PSVT              & !I [scalar variable, ppv] sea salt concentration
+     ,PEFFIC            & !O [scalar variable, ppv] sea salt concentration
      )
 
 IMPLICIT NONE
diff --git a/src/MNH/eol_maths.f90 b/src/MNH/eol_maths.f90
index bda3aa6949d919d1616eb68b28bef118ab7802fd..81e2a0a885d7012caff260547722e3829d0e7aee 100644
--- a/src/MNH/eol_maths.f90
+++ b/src/MNH/eol_maths.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2018-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.
@@ -283,7 +283,7 @@ END FUNCTION INTERP_SPLCUB
 !#########################################################
 FUNCTION INTERP_LIN8NB(PPOS, KI, KJ, KK, PVAR, PZH)
 !
-USE MODD_GRID_n, ONLY: XXHAT,XYHAT
+USE MODD_GRID_n, ONLY: XDXHAT, XXHATM, XDYHAT, XYHATM
 !
 REAL                               :: INTERP_LIN8NB  ! Return
 REAL, DIMENSION(3),     INTENT(IN) :: PPOS           ! Position where we want to evaluate
@@ -309,7 +309,7 @@ REAL     :: ZUX                           ! Interpolated variable (VAR) in Z pla
 !
 ! FINDING 8 NEIGHBOORS 
 ! -- X axis
-IF (PPOS(1) <= 0.5*(XXHAT(KI)+XXHAT(KI+1))) THEN
+IF (PPOS(1) <= XXHATM(KI)) THEN
  IIP = KI - 1
  IIN = KI
 ELSE   
@@ -317,7 +317,7 @@ ELSE
  IIN = KI + 1
 END IF
 ! -- Y axis
-IF (PPOS(2) <= 0.5*((XYHAT(KJ)+XYHAT(KJ+1)))) THEN
+IF (PPOS(2) <= XYHATM(KJ)) THEN
  IJP = KJ - 1
  IJN = KJ
 ELSE   
@@ -336,7 +336,7 @@ END IF
 ! INTERPOLATION 
 ! -- Along X
 ! -- -- Alpha
-ZALPHAX = (PPOS(1) -  0.5*(XXHAT(IIP)+XXHAT(IIN))) / (XXHAT(IIN) - XXHAT(IIP))
+ZALPHAX = (PPOS(1) -  XXHATM(IIP)) / XDXHAT(IIP)
 !!PRINT*, "ZALPHAX = ", ZALPHAX
 ! -- -- -- Wind
 ! -- -- Interpolated variable in temporary plane X
@@ -353,7 +353,7 @@ ZHXPN = (1-ZALPHAX)*PZH(IIP,IJP,IKN) + ZALPHAX*PZH(IIN,IJP,IKN)
 !
 ! -- Along Y
 ! -- -- Alpha
-ZALPHAY = (PPOS(2) -  0.5*(XYHAT(IJP)+XYHAT(IJN))) / (XYHAT(IJN) - XYHAT(IJP))
+ZALPHAY = (PPOS(2) -  XYHATM(IJP)) / XDYHAT(IJP)
 !PRINT*, "ZALPHAY = ", ZALPHAY
 ! -- -- Interpolated variable in temporary plane Y
 ! -- -- -- Wind
diff --git a/src/MNH/extract_vortex.f90 b/src/MNH/extract_vortex.f90
index df1bb103b63398cd752ce8f6d5b2dbc5adeda879..311fcecd19f99b461609155dfd3ae1df6ee84159 100644
--- a/src/MNH/extract_vortex.f90
+++ b/src/MNH/extract_vortex.f90
@@ -1,12 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-!-----------------------------------------------------------------
 !     ##########################
       MODULE MODI_EXTRACT_VORTEX
 !     ##########################
@@ -102,7 +98,7 @@ END MODULE MODI_EXTRACT_VORTEX
 USE MODD_CST, ONLY: XPI
 USE MODD_PARAMETERS, ONLY: XUNDEF
 USE MODD_DIM_n,      ONLY: NIMAX,NJMAX
-USE MODD_GRID_n,     ONLY: XXHAT,XYHAT
+USE MODD_GRID_n,     ONLY: XDXHAT, XXHAT, XDYHAT, XYHAT
 USE MODE_ll
 !
 IMPLICIT NONE
@@ -142,8 +138,8 @@ IPHI=SIZE(PR0,1)
 !
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 !
-ZDELTAX = XXHAT(3) - XXHAT(2)
-ZDELTAY = XYHAT(3) - XYHAT(2)
+ZDELTAX = XDXHAT(2)
+ZDELTAY = XDYHAT(2)
 ZDELTAR = MAX(ZDELTAX,ZDELTAY)
 ZDPHI = 2.*XPI / IPHI
 !
diff --git a/src/MNH/finalize_mnh.f90 b/src/MNH/finalize_mnh.f90
index faabb9972201b09d35d1020b56ef477597ee9150..e6000a55b3020e7a78f0a77daebb793e6a8ec6ef 100644
--- a/src/MNH/finalize_mnh.f90
+++ b/src/MNH/finalize_mnh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2021-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.
@@ -6,7 +6,7 @@
 ! Author:
 !  P. Wautelet 06/07/2021
 ! Modifications:
-!
+!  P. Wautelet 13/01/2023: fix for LCHECK
 !-----------------------------------------------------------------
 MODULE MODE_FINALIZE_MNH
 
@@ -53,17 +53,14 @@ SUBROUTINE FINALIZE_MNH
     END IF
   END DO
 
+  IF ( LCHECK ) CALL MPPDB_BARRIER()
+
   !Finalize the parallel libraries
-  IF ( LCHECK ) THEN
-    CALL MPPDB_BARRIER()
-  ELSE
-    CALL END_PARA_ll( IRESP )
+  CALL END_PARA_ll( IRESP )
+
 #ifdef CPLOASIS
-    IF ( LOASIS ) THEN
-      CALL SFX_OASIS_END()
-    END IF
+  IF ( LOASIS ) CALL SFX_OASIS_END()
 #endif
-  END IF
 
   !Free SURFEX structures if necessary
   CALL SURFEX_DEALLO_LIST()
diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90
index 8ae281d266727272811789065a02bce9cad1ec3c..14265cba17427a97b008a4ae1fef61a785116e5b 100644
--- a/src/MNH/flash_geom_elec.f90
+++ b/src/MNH/flash_geom_elec.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2010-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.
@@ -101,6 +101,7 @@ END MODULE MODI_FLASH_GEOM_ELEC_n
 !  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
 !  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
 !  P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8)
+!  P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead)
 !-------------------------------------------------------------------------------
 !
 !*      0.      DECLARATIONS
@@ -119,7 +120,7 @@ USE MODD_ELEC_PARAM,     ONLY: XFQLIGHTR, XEXQLIGHTR, &
                                XFQLIGHTH, XEXQLIGHTH, &
                                XFQLIGHTC
 USE MODD_GRID,           ONLY: XLATORI,XLONORI
-USE MODD_GRID_n,         ONLY: XXHAT, XYHAT, XZHAT
+USE MODD_GRID_n,         ONLY: XXHATM, XYHATM, XZHAT
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LMA_SIMULATOR
 USE MODD_METRICS_n,      ONLY: XDXX, XDYY, XDZZ ! in linox_production
@@ -352,8 +353,6 @@ INBFTS_MAX = ANINT(1000 * PTSTEP / 60)
 !
 IF (GEFIRSTCALL) THEN
   GEFIRSTCALL = .FALSE.
-  ALLOCATE (ZXMASS(SIZE(XXHAT)))
-  ALLOCATE (ZYMASS(SIZE(XYHAT)))
   ALLOCATE (ZZMASS(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)))
   ALLOCATE (ZPRES_COEF(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)))
   IF(LLMA) THEN
@@ -379,8 +378,6 @@ IF (GEFIRSTCALL) THEN
   ALLOCATE (ZSNEUT_POS(NFLASH_WRITE))
   ALLOCATE (ZSNEUT_NEG(NFLASH_WRITE))
 !
-  ZXMASS(IIB:IIE) = 0.5 * (XXHAT(IIB:IIE) + XXHAT(IIB+1:IIE+1))
-  ZYMASS(IJB:IJE) = 0.5 * (XYHAT(IJB:IJE) + XYHAT(IJB+1:IJE+1))
   ZZMASS = MZF(PZZ)
   ZPRES_COEF = EXP(ZZMASS/8400.)
   ZSCOORD_SEG(:,:,:) = 0.0
@@ -588,9 +585,8 @@ DEALLOCATE (ZEMAX)
 IF (INB_CELL .GE. 1) THEN
 !
 ! mean mesh size
-  ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 +                            &
-               (SUM(XZHAT(2:SIZE(PRT,3)) - XZHAT(1:SIZE(PRT,3)-1)) / &
-               (SIZE(PRT,3)-1.))**2)**0.5
+  ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 +                                       &
+                ( ( XZHAT(UBOUND(XZHAT,1)) - XZHAT(1) ) / (SIZE(PRT,3)-1.) )**2 )**0.5
 ! chaque proc calcule son propre zmean_grid
 ! mais cette valeur peut etre differente sur chaque proc (ex: relief)
 ! laisse tel quel pour le moment
@@ -913,8 +909,8 @@ ENDIF
             DO IJ = IJB, IJE
               DO IK = IKB, IKE
                 IF (GPROP(II,IJ,IK,IL)) THEN
-                  ZDIST(II,IJ,IK) = ((ZXMASS(II) - ZCOORD_TRIG(1,IL))**2 + &
-                                     (ZYMASS(IJ) - ZCOORD_TRIG(2,IL))**2 + &
+                  ZDIST(II,IJ,IK) = ((XXHATM(II) - ZCOORD_TRIG(1,IL))**2 + &
+                                     (XYHATM(IJ) - ZCOORD_TRIG(2,IL))**2 + &
                                      (ZZMASS(II,IJ,IK) - ZCOORD_TRIG(3,IL))**2)**0.5
                 END IF
               END DO
@@ -1664,8 +1660,8 @@ DO IL = 1, INB_CELL
           ISEG_GLOB(2,IL) = IJ_TRIG_GLOB
           ISEG_GLOB(3,IL) = IK_TRIG
 !
-          ZCOORD_TRIG(1,IL) = ZXMASS(II_TRIG_LOC)
-          ZCOORD_TRIG(2,IL) = ZYMASS(IJ_TRIG_LOC)
+          ZCOORD_TRIG(1,IL) = XXHATM(II_TRIG_LOC)
+          ZCOORD_TRIG(2,IL) = XYHATM(IJ_TRIG_LOC)
           ZCOORD_TRIG(3,IL) = ZZMASS(II_TRIG_LOC, IJ_TRIG_LOC, IK_TRIG)
 !
           ZCOORD_SEG(1:3,IL) = ZCOORD_TRIG(1:3,IL)
@@ -1767,8 +1763,8 @@ IF (IPROC .EQ. IPROC_TRIG(IL)) THEN
     ISEG_GLOB(IIDECAL+2,IL) = IJBL_LOC + IYOR - 1
     ISEG_GLOB(IIDECAL+3,IL) = IKBL
 !
-    ZCOORD_SEG(IIDECAL+1,IL) = ZXMASS(IIBL_LOC)
-    ZCOORD_SEG(IIDECAL+2,IL) = ZYMASS(IJBL_LOC)
+    ZCOORD_SEG(IIDECAL+1,IL) = XXHATM(IIBL_LOC)
+    ZCOORD_SEG(IIDECAL+2,IL) = XYHATM(IJBL_LOC)
     ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL)
 !
     INBSEG(IL) = INBSEG(IL) + 1
@@ -2239,8 +2235,8 @@ IF (INB_SEG_AFT .GT. INB_SEG_BEF) THEN
           ISEG_GLOB(IIDECALB+2,IL) = IJ + IYOR - 1
           ISEG_GLOB(IIDECALB+3,IL) = IK
 !
-          ZCOORD_SEG(IIDECALB+1,IL) = ZXMASS(II)
-          ZCOORD_SEG(IIDECALB+2,IL) = ZYMASS(IJ)
+          ZCOORD_SEG(IIDECALB+1,IL) = XXHATM(II)
+          ZCOORD_SEG(IIDECALB+2,IL) = XYHATM(IJ)
           ZCOORD_SEG(IIDECALB+3,IL) = ZZMASS(II,IJ,IK)
           INBSEG(IL) = INBSEG(IL) + 1
         END IF
diff --git a/src/MNH/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90
index 50496da72b87d003764faf82a65a856daf128c84..572dd91d8489b8e2ea4e8bb4738cbf1b0750e60f 100644
--- a/src/MNH/free_atm_profile.f90
+++ b/src/MNH/free_atm_profile.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1997-2021 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.
@@ -93,7 +93,7 @@ END MODULE MODI_FREE_ATM_PROFILE
 !              ------------
 !
 USE MODD_CONF
-use modd_field,          only: tfielddata, TYPEINT, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEINT, TYPEREAL
 USE MODD_GRID_n
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LUNIT,          ONLY: TLUOUT0
@@ -163,7 +163,7 @@ REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) &
                                       :: Z3D ! field to be recorded
 REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) &
                                       :: ZZMASS ! MESO-NH output mass grid
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 ILUOUT0 = TLUOUT0%NLU
@@ -468,32 +468,33 @@ IF (CPROGRAM == 'DIAG  ' ) THEN
       Z2D(JI,JJ) = PZMASS_MX(JI,JJ,IK_BL_TOP(JI,JJ)) - PZS_LS(JI,JJ)
     END DO
   END DO
-  TZFIELD%CMNHNAME   = 'HBLTOP'
-  TZFIELD%CSTDNAME   = 'atmosphere_boundary_layer_thickness'
-  TZFIELD%CLONGNAME  = 'HBLTOP'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'Height of Boundary Layer TOP'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                             &
+    CMNHNAME   = 'HBLTOP',                              &
+    CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
+    CLONGNAME  = 'HBLTOP',                              &
+    CUNITS     = 'm',                                   &
+    CDIR       = 'XY',                                  &
+    CCOMMENT   = 'Height of Boundary Layer TOP',        &
+    NGRID      = 4,                                     &
+    NTYPE      = TYPEREAL,                              &
+    NDIMS      = 2,                                     &
+    LTIMEDEP   = .TRUE.                                 )
   CALL IO_Field_write(TPFILE,TZFIELD,Z2D)
 !
 !*      11.2  Writing of level of boundary layer top
 !             --------------------------------------
 !
-  Z2D(:,:) = IK_BL_TOP(:,:)
-  TZFIELD%CMNHNAME   = 'KBLTOP'
-  TZFIELD%CSTDNAME   = 'model_level_number_at_top_of_atmosphere_boundary_layer'
-  TZFIELD%CLONGNAME  = 'KBLTOP'
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'Index of Boundary Layer TOP'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                                &
+    CMNHNAME   = 'KBLTOP',                                                 &
+    CSTDNAME   = 'model_level_number_at_top_of_atmosphere_boundary_layer', &
+    CLONGNAME  = 'KBLTOP',                                                 &
+    CUNITS     = '1',                                                      &
+    CDIR       = 'XY',                                                     &
+    CCOMMENT   = 'Index of Boundary Layer TOP',                            &
+    NGRID      = 4,                                                        &
+    NTYPE      = TYPEINT,                                                  &
+    NDIMS      = 2,                                                        &
+    LTIMEDEP   = .TRUE.                                                    )
   CALL IO_Field_write(TPFILE,TZFIELD,IK_BL_TOP)
 END IF
 !
@@ -502,19 +503,18 @@ IF (CPROGRAM /= 'DIAG  ' .AND. CPROGRAM /= 'IDEAL ' ) THEN
 !*      11.3  Writing of free atmosphere gradient
 !             -----------------------------------
 !
-  Z2D(:,:)=ZFREE_GR(:,:)
-!
-  TZFIELD%CMNHNAME   = 'FREE_ATM_GR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'FREE_ATM_GR'
-  TZFIELD%CUNITS     = 'K m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'Free atmosphere gradient'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,Z2D)
+  TZFIELD = TFIELDMETADATA(                  &
+    CMNHNAME   = 'FREE_ATM_GR',              &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'FREE_ATM_GR',              &
+    CUNITS     = 'K m-1',                    &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'Free atmosphere gradient', &
+    NGRID      = 4,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 2,                          &
+    LTIMEDEP   = .TRUE.                      )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZFREE_GR(:,:))
 !
 !*      11.4  Writing of free atmosphere 3D profiles
 !             --------------------------------------
@@ -525,16 +525,17 @@ IF (CPROGRAM /= 'DIAG  ' .AND. CPROGRAM /= 'IDEAL ' ) THEN
   CALL COEF_VER_INTERP_LIN(PZ_FREE(:,:,:),ZZMASS(:,:,:),OLEUG=.TRUE.)
   Z3D(:,:,:)=VER_INTERP_LIN(PF_FREE(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
 !
-  TZFIELD%CMNHNAME   = 'THV_FREE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'THV_FREE'
-  TZFIELD%CUNITS     = 'K'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_THV_FREE'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(        &
+    CMNHNAME   = 'THV_FREE',       &
+    CSTDNAME   = '',               &
+    CLONGNAME  = 'THV_FREE',       &
+    CUNITS     = 'K',              &
+    CDIR       = 'XY',             &
+    CCOMMENT   = 'X_Y_Z_THV_FREE', &
+    NGRID      = 4,                &
+    NTYPE      = TYPEREAL,         &
+    NDIMS      = 3,                &
+    LTIMEDEP   = .TRUE.            )
   CALL IO_Field_write(TPFILE,TZFIELD,Z3D)
 !
 END IF
diff --git a/src/MNH/fun.f90 b/src/MNH/fun.f90
index 46db8b201c4b7d5352b188bf5489b2e580bdbeb1..85100a77b32e488091f384ee9a23a96cdc145666 100644
--- a/src/MNH/fun.f90
+++ b/src/MNH/fun.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2017 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.
@@ -88,7 +88,6 @@ END MODULE MODI_FUN
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -110,7 +109,6 @@ INTEGER :: JJ ,JK  ! Loop index
 INTEGER :: IINFO_ll, IJU_ll  ! parallel variables
 REAL    :: ZWIDTHY ! Width of the jet along the y direction
 REAL    :: ZWIDTHZ ! Width of the jet along the z direction
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll
 !
 !-------------------------------------------------------------------------------
 !
@@ -120,18 +118,15 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll
 IJU_ll=NJMAX_ll+2*JPHEXT
 IJ0=IJU_ll/2
 IK0=KKU/2
-ALLOCATE(ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll)
-ZWIDTHY =ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0)
+ZWIDTHY =XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0)
 ZWIDTHZ =PZHAT(IK0+KKU/5)-PZHAT(IK0)
 DO JJ = 1,KJU-1
   DO JK = 1,KKU
-    FUNUYZ(JJ,JK) = 1./COSH(                                    &
-     (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5-ZYHAT_ll(IJ0))/ZWIDTHY) **2 &
-    +((  PZHAT(JK)                 -   PZHAT(IK0))/ZWIDTHZ) **2 )
+    FUNUYZ(JJ,JK) = 1./COSH(                   &
+     (( XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTHY) **2 &
+    +(( PZHAT(JK) -   PZHAT(IK0))/ZWIDTHZ) **2 )
   END DO
 END DO
-DEALLOCATE(ZYHAT_ll)
 FUNUYZ(KJU,:)=2.*FUNUYZ(KJU-1,:)-FUNUYZ(KJU-2,:) !simple extrapolation  
                                                  !for the last point
 !
@@ -189,7 +184,6 @@ END FUNCTION FUNUYZ
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
-USE MODE_GATHER_ll
 !
 !
 IMPLICIT NONE
@@ -206,18 +200,15 @@ INTEGER :: IJ0      ! Jet center
 INTEGER :: JJ       ! Loop index
 INTEGER :: IINFO_ll, IJU_ll  ! parallel variables
 REAL    :: ZWIDTH   ! Width of the jet
-REAL, DIMENSION(:), ALLOCATABLE ::  ZYHAT_ll
 !-------------------------------------------------------------------------------
 !
 !*	 1.     COMPUTE FUNUY
 !	        -------------
 IJU_ll=NJMAX_ll+2*JPHEXT
 IJ0=IJU_ll/2
-ALLOCATE(ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll)
-ZWIDTH=ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0)
+ZWIDTH=XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0)
 DO JJ = 1,KJU-1
- FUNUY(JJ) = 1./COSH(((XYHAT(JJ)+XYHAT(JJ+1))*0.5-ZYHAT_ll(IJ0))/ZWIDTH)
+ FUNUY(JJ) = 1./COSH((XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTH)
 END DO
 FUNUY(KJU)=2.*FUNUY(KJU-1)-FUNUY(KJU-2) !simple extrapolation for the last point
 !
@@ -276,7 +267,6 @@ END FUNCTION FUNUY
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -298,7 +288,6 @@ INTEGER :: JI,JK     ! Loop index
 INTEGER :: IINFO_ll, IIU_ll  ! parallel variables
 REAL    :: ZWIDTHX ! Width of the jet along the x direction
 REAL    :: ZWIDTHZ ! Width of the jet along the z direction
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 !
 !-------------------------------------------------------------------------------
 !
@@ -308,15 +297,13 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 IIU_ll=NIMAX_ll+2*JPHEXT
 II0=IIU_ll/2
 IK0=KKU/2
-ALLOCATE(ZXHAT_ll(IIU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll)
-ZWIDTHX=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0)
+ZWIDTHX=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0)
 ZWIDTHZ=PZHAT(IK0+KKU/5)-PZHAT(IK0)
 DO JI = 1,KIU-1
   DO JK = 1,KKU
-    FUNVXZ(JI,JK) = 1./COSH(                                   &
-     (( (XXHAT(JI)+XXHAT(JI+1))*0.5-ZXHAT_ll(II0))/ZWIDTHX)**2 &
-    +((  PZHAT (JK)                 - PZHAT (IK0))/ZWIDTHZ)**2 )
+    FUNVXZ(JI,JK) = 1./COSH(                  &
+     (( XXHATM(JI)-XXHAT_ll(II0))/ZWIDTHX)**2 &
+    +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 )
   END DO
 END DO
 FUNVXZ(KIU,:)=2.*FUNVXZ(KIU-1,:)-FUNVXZ(KIU-2,:) !simple extrapolation for the last point
@@ -372,7 +359,6 @@ END FUNCTION FUNVXZ
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -392,20 +378,16 @@ INTEGER :: II0   ! Jet center
 INTEGER :: JI    ! Loop index
 INTEGER :: IINFO_ll, IIU_ll  ! parallel variables
 REAL    :: ZWIDTH ! Width of the jet
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 !-------------------------------------------------------------------------------
 !
 !*	 1.     COMPUTE FUNUY
 !	        -------------
 IIU_ll=NIMAX_ll+2*JPHEXT
 II0=IIU_ll/2
-ALLOCATE(ZXHAT_ll(IIU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll)
-ZWIDTH=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0)
+ZWIDTH=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0)
 DO JI = 1,KIU
- FUNVX(JI)=1./COSH(((XXHAT(JI)+XXHAT(JI))*0.5-ZXHAT_ll(II0))/ZWIDTH)
+ FUNVX(JI)=1./COSH((XXHATM(JI)-XXHAT_ll(II0))/ZWIDTH)
 END DO
-DEALLOCATE(ZXHAT_ll)
 !-------------------------------------------------------------------------------
 !
 END FUNCTION FUNVX
diff --git a/src/MNH/gdiv.f90 b/src/MNH/gdiv.f90
index b22065908c6e897d61706999fd1374582060f1d4..dc77dde5587474069b58d20d7149910d26b76358 100644
--- a/src/MNH/gdiv.f90
+++ b/src/MNH/gdiv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -16,12 +16,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type
 ! 
-                                                 ! Metric coefficients:       
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:       
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
                                                  ! Field components
 REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PU        ! along x             
@@ -113,12 +113,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type
 ! 
-                                                 ! Metric coefficients:       
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:       
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
                                                  ! Field components
 REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PU        ! along x             
diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index 831cb2028c3c0ea54da0090bb1329b014437bb4c..33dbefdf202038d77207019c0f4e123e696225a9 100644
--- a/src/MNH/goto_model_wrapper.f90
+++ b/src/MNH/goto_model_wrapper.f90
@@ -1,4 +1,4 @@
-!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.
@@ -18,6 +18,7 @@
 !                  11/2019 C.Lac correction in the drag formula and application to building in addition to tree
 !  F. Auguste     02/21: add IBM
 !  T. Nagel       02/21: add turbulence recycling
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-----------------------------------------------------------------
 MODULE MODI_GOTO_MODEL_WRAPPER
 
@@ -34,6 +35,7 @@ SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST)
 ! all USE modd*_n modules
 USE MODD_ADVFRC_n
 USE MODD_ADV_n
+USE MODD_ALLPROFILER_n
 USE MODD_ALLSTATION_n
 USE MODD_BIKHARDT_n
 USE MODD_BLANK_n
@@ -60,6 +62,7 @@ USE MODD_DRAGBLDG_n
 USE MODD_DUMMY_GR_FIELD_n
 USE MODD_DYN_n
 USE MODD_DYNZD_n
+USE MODD_ELEC_n
 USE MODD_FIELD_n
 #ifdef MNH_FOREFIRE
 USE MODD_FOREFIRE_n
@@ -88,7 +91,6 @@ USE MODD_PARAM_ECRAD_n
 USE MODD_PASPOL_n
 USE MODD_PAST_FIELD_n
 USE MODD_PRECIP_n
-USE MODD_ELEC_n
 USE MODD_PROFILER_n
 USE MODD_RADIATIONS_n
 USE MODD_RBK90_Global_n
@@ -107,8 +109,6 @@ USE MODD_SUB_ELEC_n
 USE MODD_SUB_MODEL_n
 USE MODD_SUB_PASPOL_n
 USE MODD_SUB_PHYS_PARAM_n
-USE MODD_SUB_PROFILER_n
-USE MODD_SUB_STATION_n
 USE MODD_TIMEZ
 USE MODD_TURB_n
 !
@@ -190,21 +190,20 @@ CALL FOREFIRE_GOTO_MODEL(KFROM, KTO)
 #endif
 !CALL PRECIP_GOTO_MODEL(KFROM, KTO)
 CALL ELEC_GOTO_MODEL(KFROM, KTO)
-CALL PROFILER_GOTO_MODEL(KFROM, KTO)
 CALL RADIATIONS_GOTO_MODEL(KFROM, KTO)
 CALL SHADOWS_GOTO_MODEL(KFROM, KTO)
 CALL REF_GOTO_MODEL(KFROM, KTO)
 CALL FRC_GOTO_MODEL(KFROM, KTO)
 CALL SECPGD_FIELD_GOTO_MODEL(KFROM, KTO)
 CALL SERIES_GOTO_MODEL(KFROM, KTO)
+CALL PROFILER_GOTO_MODEL(KFROM, KTO)
 CALL STATION_GOTO_MODEL(KFROM, KTO)
+CALL ALLPROFILER_GOTO_MODEL(KFROM, KTO)
 CALL ALLSTATION_GOTO_MODEL(KFROM, KTO)
 CALL SUB_CH_FIELD_VALUE_GOTO_MODEL(KFROM, KTO)
 CALL SUB_CH_MONITOR_GOTO_MODEL(KFROM, KTO)
 CALL SUB_MODEL_GOTO_MODEL(KFROM, KTO)
 CALL SUB_PHYS_PARAM_GOTO_MODEL(KFROM, KTO)
-CALL SUB_PROFILER_GOTO_MODEL(KFROM, KTO)
-CALL SUB_STATION_GOTO_MODEL(KFROM, KTO)
 CALL SUB_PASPOL_GOTO_MODEL(KFROM, KTO)
 CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO)
 !CALL TIME_GOTO_MODEL(KFROM, KTO)
diff --git a/src/MNH/gps_zenith.f90 b/src/MNH/gps_zenith.f90
index a11a074d6f511b7909c55934712aa9294cd0a3c2..5fe9cd741b0508c9b21133516957926682ae0942 100644
--- a/src/MNH/gps_zenith.f90
+++ b/src/MNH/gps_zenith.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2004-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.
@@ -66,8 +66,8 @@ END MODULE MODI_GPS_ZENITH
 !!    -------------
 !!      Original    18/11/04
 !!      Modified    4/12/2007
-!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 31/08/2022: use XXHATM and XYHATM (remove ZXHATM and ZYHATM local variables)
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -120,7 +120,6 @@ INTEGER :: JI,JJ,JK               ! Loop variables of control
 INTEGER :: IIU,IJU,IKU      ! Loop variables of model 
 INTEGER :: ILUOUT0, IRESP   ! file unit and return code for output
 INTEGER :: JL               !
-REAL,  DIMENSION(:),ALLOCATABLE         :: ZXHATM,ZYHATM   ! mass-point positions 
 REAL,  DIMENSION(:,:,:),ALLOCATABLE     :: ZZHATM   ! mass level altitude  
 !-------- Physical parameters for the integration ----------------------------
 REAL, DIMENSION(:,:,:),ALLOCATABLE ::  ZE              !  Partial pressure of water vapor
@@ -166,8 +165,6 @@ IKU = SIZE (PTEMP,3)
 IKB = JPVEXT + 1
 IKE = IKU - JPVEXT
 !
-ALLOCATE(ZXHATM(IIU))
-ALLOCATE(ZYHATM(IJU))
 ALLOCATE(ZZHATM(IIU,IJU,IKU))
 ALLOCATE(ZE(IIU,IJU,IKU))
 ALLOCATE(ZTV(IIU,IJU,IKU))
@@ -203,10 +200,6 @@ ZRDSRV=XRD/XRV
 !              ------------------- 
 !
 ! 
-ZXHATM(1:IIU-1) = 0.5*(XXHAT(1:IIU-1)+XXHAT(2:IIU))
-ZXHATM(IIU)     = 2.*XXHAT(IIU)-ZXHATM(IIU-1)
-ZYHATM(1:IJU-1) = 0.5*(XYHAT(1:IJU-1)+XYHAT(2:IJU))
-ZYHATM(IJU)     = 2.*XYHAT(IJU)-ZYHATM(IJU-1)  
 ZZHATM(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
 ZZHATM(:,:,IKU)    = 2.*XZZ(:,:,IKU) -ZZHATM(:,:,IKU-1)
 ! 
@@ -304,7 +297,7 @@ IF (ISTATIONS >0 ) THEN
     CALL SM_XYHAT(XLATORI,XLONORI,   &
        XLAT_GPS(JL),XLON_GPS(JL),ZXHAT_GPS(JL),ZYHAT_GPS(JL))
 !
-    II(JL)=COUNT(ZXHATM(:)<=ZXHAT_GPS(JL))
+    II(JL)=COUNT(XXHATM(:)<=ZXHAT_GPS(JL))
     IX=COUNT(XXHAT(:)<=ZXHAT_GPS(JL))
     IF (IX<IIB .AND. LWEST_ll()) THEN
      ! station outside the MESO-NH domain 
@@ -314,7 +307,7 @@ IF (ISTATIONS >0 ) THEN
      ! station outside the MESO-NH domain 
       GSTATION(JL)=.FALSE.
     ENDIF
-    IJ(JL)=COUNT(ZYHATM(:)<=ZYHAT_GPS(JL))
+    IJ(JL)=COUNT(XYHATM(:)<=ZYHAT_GPS(JL))
     IY=COUNT(XYHAT(:)<=ZYHAT_GPS(JL))
     IF (IY<IJB .AND. LSOUTH_ll()) THEN
      ! stations outside MESO-NH domain 
@@ -337,7 +330,7 @@ IF (ISTATIONS >0 ) THEN
       II1=II(JL)
       IJ1=IJ(JL)
 !     interpolate Z at station position and check that the difference between model relief and station altitude is weaker than XDIFORO
-      CALL INTERPOL_STATION(XZZ(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZZ_STA(:,JL))
+      CALL INTERPOL_STATION(XZZ(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZZ_STA(:,JL))
       IF ( ABS( ZZ_STA(IKB,JL)-XZS_GPS(JL)) > XDIFFORO ) THEN
         WRITE(IFGRI,*) 'NO DATA, Difference between the model orography and the GPS station height too large for ',CNAM_GPS(JL)
         GSTATION(JL)=.FALSE.
@@ -347,10 +340,10 @@ IF (ISTATIONS >0 ) THEN
 !        6.3 Interpolate to the station positions 
 !
 ! interpolate model variables to obs point
-      CALL INTERPOL_STATION(PPABSM(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZP_STA(:))
-      CALL INTERPOL_STATION(ZE(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZE_STA(:))
-      CALL INTERPOL_STATION(PTEMP(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZT_STA(:))
-      CALL INTERPOL_STATION(ZTV(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZTV_STA(:))
+      CALL INTERPOL_STATION(PPABSM(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZP_STA(:))
+      CALL INTERPOL_STATION(ZE(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZE_STA(:))
+      CALL INTERPOL_STATION(PTEMP(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZT_STA(:))
+      CALL INTERPOL_STATION(ZTV(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZTV_STA(:))
 !  
 !            6.3.1 For stations above model orography
 !  
@@ -386,7 +379,7 @@ IF (ISTATIONS >0 ) THEN
              /(XRD* 0.5 *(ZTV_STAT+ZTV_STA(IKB))))
         
 ! assume constant rvn for Vapor pressure
-        CALL INTERPOL_STATION( PRM(:,:,IKB),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
+        CALL INTERPOL_STATION( PRM(:,:,IKB),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
              ZYHAT_GPS(JL),ZRV_STAT)
         ZEM_STAT =  ZPM_STAT *  ZRV_STAT  / ( ZRDSRV + ZRV_STAT )
 ! add contribution below the model orography        
@@ -408,11 +401,11 @@ IF (ISTATIONS >0 ) THEN
 !
 !            6.3.4 Add external  contribution for ZHD
 !
-      CALL INTERPOL_STATION( ZPTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
+      CALL INTERPOL_STATION( ZPTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
            ZYHAT_GPS(JL),ZPTOP_STAT)
-      CALL INTERPOL_STATION( ZGTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
+      CALL INTERPOL_STATION( ZGTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
            ZYHAT_GPS(JL),ZGTOP_STAT)
-      CALL INTERPOL_STATION( ZTEMPTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
+      CALL INTERPOL_STATION( ZTEMPTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), &
            ZYHAT_GPS(JL),ZTEMPTOP_STAT)
       ZGPS_ZHD(JL)=ZGPS_ZHD(JL)+ ( 1.E-6 * ZK1 * ZPTOP_STAT * XRD * ( 1. + 2. * XRD * ZTEMPTOP_STAT &
            / ( ( XRADIUS + ZZ_STA(IKE+1,JL) ) * ZGTOP_STAT )  +  2. * ( XRD * ZTEMPTOP_STAT &
@@ -435,8 +428,6 @@ IF (ISTATIONS >0 ) THEN
   CALL IO_File_close(TZFILE,IRESP)
   PRINT *,'File ',TRIM(HFGRI),' closed, IRESP= ',IRESP
 !
-  DEALLOCATE(ZXHATM)
-  DEALLOCATE(ZYHATM)
   DEALLOCATE(ZGPS_ZTD)
   DEALLOCATE(ZGPS_ZHD)
   DEALLOCATE(ZGPS_ZWD)
diff --git a/src/MNH/gps_zenith_grid.f90 b/src/MNH/gps_zenith_grid.f90
index 86b72414fd58c1ab1ec065bc60a2e8c1f585e3b0..f3859e62cffe105ca97de8c6c8418eaa08348d98 100644
--- a/src/MNH/gps_zenith_grid.f90
+++ b/src/MNH/gps_zenith_grid.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2004-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !##########################################
@@ -66,8 +66,8 @@ END MODULE MODI_GPS_ZENITH_GRID
 !!      Modified    4/12/2007
 !!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
 !!                                      aircraft, ballon and profiler
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 31/08/2022: remove ZXHATM and ZYHATM (unused variables)
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -107,7 +107,6 @@ INTEGER :: IJB,IJE          ! Loop limits for coordinate Y
 INTEGER :: IKB,IKE          ! Loop limits for coordinate Z
 INTEGER :: JK               ! Loop variables of control
 INTEGER :: IIU,IJU,IKU      ! Loop variables of model 
-REAL,  DIMENSION(:),ALLOCATABLE         :: ZXHATM,ZYHATM   ! mass-point positions 
 REAL,  DIMENSION(:,:,:),ALLOCATABLE     :: ZZHATM   ! mass level altitude  
 !-------- Physical parameters for the integration ----------------------------
 REAL, DIMENSION(:,:,:),ALLOCATABLE ::  ZE              !  Partial pressure of water vapor
@@ -135,8 +134,6 @@ IKU = SIZE (PTEMP,3)
 IKB = JPVEXT + 1
 IKE = IKU - JPVEXT
 !
-ALLOCATE(ZXHATM(IIU))
-ALLOCATE(ZYHATM(IJU))
 ALLOCATE(ZZHATM(IIU,IJU,IKU))
 ALLOCATE(ZE(IIU,IJU,IKU))
 ALLOCATE(ZTV(IIU,IJU,IKU))
@@ -172,10 +169,6 @@ ZRDSRV=XRD/XRV
 !              ------------------- 
 !
 ! 
-ZXHATM(1:IIU-1) = 0.5*(XXHAT(1:IIU-1)+XXHAT(2:IIU))
-ZXHATM(IIU)     = 2.*XXHAT(IIU)-ZXHATM(IIU-1)
-ZYHATM(1:IJU-1) = 0.5*(XYHAT(1:IJU-1)+XYHAT(2:IJU))
-ZYHATM(IJU)     = 2.*XYHAT(IJU)-ZYHATM(IJU-1)  
 ZZHATM(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
 ZZHATM(:,:,IKU)    = 2.*XZZ(:,:,IKU) -ZZHATM(:,:,IKU-1)
 ! 
diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 1db438c04bbd617fd654f288b3d62c54ede6cdeb..d50a7fbe5070d883c6d3e2b80935680fa43cfe24 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -12,17 +12,17 @@ INTERFACE
       SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, &
                                  PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE )
 !
-USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 !* surface fluxes
 !  --------------
 !
-USE MODD_IO,      ONLY: TFILEDATA
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_IO,       ONLY: TFILEDATA
 !
 TYPE(DIMPHYEX_t),     INTENT(IN)   :: D
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor           (m/s*kg/kg)
 REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar                (m/s*kg/kg)
-                                           ! flux of chemical var.                 (ppp.m/s)
+                                           ! flux of chemical var.                 (ppv.m/s)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2                   (m/s*kg/kg)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU  ! surface fluxes of horizontal   
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV  ! momentum in x and y directions        (m2/s2)
@@ -43,10 +43,10 @@ END INTERFACE
 !
 END MODULE MODI_GROUND_PARAM_n
 !
-!     ######################################################################
-      SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, &
+!     ###############################################################################
+      SUBROUTINE GROUND_PARAM_n( D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV,        &
                                  PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE )
-!     #######################################################################
+!     ###############################################################################
 !
 !
 !!****  *GROUND_PARAM*  
@@ -117,8 +117,11 @@ END MODULE MODI_GROUND_PARAM_n
 !!     (V. Vionnet)           18/07/2017 add coupling for blowing snow module 
 !!     (Bielli S.) 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
-!  P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation
 !  A. Costes      12/2021: Blaze Fire model
+!  P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation
+!  P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI
+!  P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX
+!  P. Wautelet 21/10/2022: bugfix: communicate halo values between processes for OUT variables
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -139,20 +142,19 @@ USE MODD_BUDGET,  ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH,TBUDGETS
 USE MODE_BUDGET,  ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END
 USE MODD_CST,        ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO
 USE MODD_DIMPHYEX,   ONLY : DIMPHYEX_t
-USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF
+USE MODD_PARAMETERS, ONLY : JPVEXT
 USE MODD_DYN_n,      ONLY : XTSTEP
 USE MODD_CH_MNHC_n,  ONLY : LUSECHEM
-USE MODD_CH_M9_n,   ONLY : CNAMES
-USE MODD_FIELD_n,    ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS,&
-XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,&
-XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,&
-XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, &
-XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY
+USE MODD_FIELD_n,    ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, &
+                            XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,&
+                            XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,&
+                            XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, &
+                            XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY
 USE MODD_METRICS_n,  ONLY : XDXX, XDYY, XDZZ
 USE MODD_DIM_n,      ONLY : NKMAX
 USE MODD_GRID_n,     ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, &
                             XCOSSLOPE, XSINSLOPE, XZS
-USE MODD_REF_n,      ONLY : XRHODREF,XRHODJ,XEXNREF
+USE MODD_REF_n,      ONLY : XEXNREF, XRHODREF, XRHODJ
 USE MODD_CONF_n,     ONLY : NRR
 USE MODD_PARAM_n,    ONLY : CDCONV,CCLOUD, CRAD
 USE MODD_PRECIP_n,   ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH
@@ -176,9 +178,10 @@ USE MODD_CSTS_DUST,  ONLY : XMOLARWEIGHT_DUST
 USE MODD_CSTS_SALT,  ONLY : XMOLARWEIGHT_SALT
 USE MODD_CH_FLX_n, ONLY : XCHFLX
 USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG
+USE MODD_SURF_PAR,   ONLY: XUNDEF_SFX => XUNDEF
 !
 USE MODI_NORMAL_INTERPOL
-USE MODE_ROTATE_WIND, ONLY : ROTATE_WIND
+USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND
 USE MODI_SHUMAN
 USE MODI_MNHGET_SURF_PARAM_n
 USE MODI_COUPLING_SURF_ATM_n
@@ -221,7 +224,7 @@ TYPE(DIMPHYEX_t),     INTENT(IN)   :: D
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor           (m/s*kg/kg)
 REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar                (m/s*kg/kg)
-                                           ! flux of chemical var.                 (ppp.m/s)
+                                           ! flux of chemical var.                 (ppv.m/s)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2                   (m/s*kg/kg)
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU  ! surface fluxes of horizontal   
 REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV  ! momentum in x and y directions        (m2/s2)
@@ -375,6 +378,7 @@ TYPE(LIST_ll), POINTER            :: TZFIELDSURF_ll    ! list of fields to excha
 INTEGER                           :: IINFO_ll       ! return code of parallel routine
 !
 !
+CHARACTER(LEN=6) :: YJSV
 CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables
                                                         ! sent to SURFEX
 !                                                        
@@ -401,16 +405,16 @@ IKE=IKU-JPVEXT
 !
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 !
-PSFTH    = XUNDEF
-PSFRV    = XUNDEF
-PSFSV    = XUNDEF
-PSFCO2   = XUNDEF
-PSFU     = XUNDEF
-PSFV     = XUNDEF
-PDIR_ALB = XUNDEF
-PSCA_ALB = XUNDEF
-PEMIS    = XUNDEF
-PTSRAD   = XUNDEF
+PSFTH    = XUNDEF_SFX
+PSFRV    = XUNDEF_SFX
+PSFSV    = XUNDEF_SFX
+PSFCO2   = XUNDEF_SFX
+PSFU     = XUNDEF_SFX
+PSFV     = XUNDEF_SFX
+PDIR_ALB = XUNDEF_SFX
+PSCA_ALB = XUNDEF_SFX
+PEMIS    = XUNDEF_SFX
+PTSRAD   = XUNDEF_SFX
 !
 !
 !-------------------------------------------------------------------------------
@@ -456,11 +460,11 @@ END IF
 !        1.3    Rotate the wind
 !               ---------------
 !
-CALL ROTATE_WIND(D,XUT,XVT,XWT,           &
-     XDIRCOSXW, XDIRCOSYW, XDIRCOSZW,   &
-     XCOSSLOPE,XSINSLOPE,               &
-     XDXX,XDYY,XDZZ,                    &
-     ZUA,ZVA                            )
+CALL ROTATE_WIND( D, XUT, XVT, XWT,                &
+                  XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, &
+                  XCOSSLOPE, XSINSLOPE,            &
+                  XDXX, XDYY, XDZZ,                &
+                  ZUA, ZVA                         )
 
 !
 !        1.4    zonal and meridian components of the wind parallel to the slope
@@ -695,7 +699,7 @@ FF_TIME = FF_TIME + XTSTEP
 PSFU(:,:) = 0.
 PSFV(:,:) = 0.
 !
-WHERE (ZSFU(:,:)/=XUNDEF .AND. ZWIND(:,:)>0.)
+WHERE (ZSFU(:,:)/=XUNDEF_SFX .AND. ZWIND(:,:)>0.)
   PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB)
   PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB)
 END WHERE
@@ -770,13 +774,9 @@ IF (LBLAZE) THEN
     !*       2.1.7  Test halo size
     !               --------------
     IF (NHALO < 2 .AND. NFIRE_WENO_ORDER == 3) THEN
-      WRITE(ILUOUT,'(A/A)') 'ERROR BLAZE-FIRE : WENO3 fire gradient calculation needs NHALO >= 2'
-      !callabortstop
-      CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','')
-    ELSEIF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN
-      WRITE(ILUOUT,'(A/A)') 'ERROR : WENO5 fire gradient calculation needs NHALO >= 3'
-      !callabortstop
-      CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','')
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO3 fire gradient calculation needs NHALO >= 2' )
+    ELSE IF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO5 fire gradient calculation needs NHALO >= 3' )
     END IF
     !
   END IF
@@ -878,7 +878,7 @@ IF(NSV .GT. 0) THEN
    END DO
 END IF
 !
-!* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1)
+!* conversion from chemistry flux (molec/m2/s) to (ppv.m.s-1)
 !
 IF (LUSECHEM) THEN
    DO JSV=NSV_CHEMBEG,NSV_CHEMEND
@@ -889,7 +889,7 @@ ELSE
   PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0.
 END IF
 !
-!* conversion from dust flux (kg/m2/s) to (ppp.m.s-1)
+!* conversion from dust flux (kg/m2/s) to (ppv.m.s-1)
 !
 IF (LDUST) THEN
   DO JSV=NSV_DSTBEG,NSV_DSTEND
@@ -899,7 +899,7 @@ ELSE
   PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0.
 END IF
 !
-!* conversion from sea salt flux (kg/m2/s) to (ppp.m.s-1)
+!* conversion from sea salt flux (kg/m2/s) to (ppv.m.s-1)
 !
 IF (LSALT) THEN
   DO JSV=NSV_SLTBEG,NSV_SLTEND
@@ -909,7 +909,7 @@ ELSE
   PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0.
 END IF
 !
-!* conversion from aerosol flux (molec/m2/s) to (ppp.m.s-1)
+!* conversion from aerosol flux (molec/m2/s) to (ppv.m.s-1)
 !
 IF (LORILAM) THEN
   DO JSV=NSV_AERBEG,NSV_AEREND
@@ -938,6 +938,32 @@ END IF
 !
 PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB)
 !
+!  Communicate halo values
+!
+NULLIFY(TZFIELDSURF_ll)
+!The commented communications are done in PHYS_PARAM_n
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFTH,  'GROUND_PARAM_n::PSFTH'  )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFRV,  'GROUND_PARAM_n::PSFRV'  )
+! DO JSV = 1, NSV
+!   WRITE( YJSV, '( I6.6 )' ) JSV
+!   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFSV(:,:,JSV), 'GROUND_PARAM_n::PSFSV'//YJSV )
+! END DO
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFCO2, 'GROUND_PARAM_n::PSFCO2' )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFU,   'GROUND_PARAM_n::PSFU'   )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFV,   'GROUND_PARAM_n::PSFV'   )
+DO JLAYER = 1, SIZE( PDIR_ALB, 3 )
+  WRITE( YJSV, '( I6.6 )' ) JLAYER
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PDIR_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PDIR_ALB'//YJSV )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSCA_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PSCA_ALB'//YJSV )
+END DO
+DO JLAYER = 1, SIZE( PEMIS, 3 )
+  WRITE( YJSV, '( I6.6 )' ) JLAYER
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PEMIS(:,:,JLAYER), 'GROUND_PARAM_n::PEMIS'//YJSV )
+END DO
+CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PTSRAD, 'GROUND_PARAM_n::PTSRAD'  )
+
+CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDSURF_ll)
 !
 !*  Diagnostics
 !   -----------
@@ -970,11 +996,14 @@ IF (LDIAG_IN_RUN) THEN
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN,     'GROUND_PARAM_n::XCURRENT_RN'     )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H,      'GROUND_PARAM_n::XCURRENT_H'      )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE,     'GROUND_PARAM_n::XCURRENT_LE'     )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI,    'GROUND_PARAM_n::XCURRENT_LEI'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX,  'GROUND_PARAM_n::XCURRENT_GFLUX'  )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD,    'GROUND_PARAM_n::XCURRENT_SWD'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU,    'GROUND_PARAM_n::XCURRENT_SWU'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD,    'GROUND_PARAM_n::XCURRENT_LWD'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU,    'GROUND_PARAM_n::XCURRENT_LWU'    )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR,  'GROUND_PARAM_n::XCURRENT_SWDIR'  )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M,    'GROUND_PARAM_n::XCURRENT_T2M'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M,    'GROUND_PARAM_n::XCURRENT_Q2M'    )
   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M,   'GROUND_PARAM_n::XCURRENT_HU2M'   )
@@ -1141,12 +1170,12 @@ ISHAPE_2 = (/KDIM1,KDIM2/)
 !
 ! Arguments in call to surface:
 !
-ZSFTH = XUNDEF
-ZSFTQ = XUNDEF
-IF (NSV>0) ZSFTS = XUNDEF
-ZSFCO2 = XUNDEF
-ZSFU = XUNDEF
-ZSFV = XUNDEF
+ZSFTH = XUNDEF_SFX
+ZSFTQ = XUNDEF_SFX
+IF (NSV>0) ZSFTS = XUNDEF_SFX
+ZSFCO2 = XUNDEF_SFX
+ZSFU = XUNDEF_SFX
+ZSFV = XUNDEF_SFX
 !
 ZSFTH   (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_SFTH(:),       ISHAPE_2)
 ZSFTQ   (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_SFTQ(:),       ISHAPE_2)
@@ -1177,7 +1206,7 @@ IF (LDIAG_IN_RUN) THEN
   XCURRENT_HU2M    (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_HU2M(:),   ISHAPE_2)
   XCURRENT_ZON10M  (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_ZON10M(:), ISHAPE_2)
   XCURRENT_MER10M  (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_MER10M(:), ISHAPE_2)
-  XCURRENT_ZWS  (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_ZWS(:), ISHAPE_2)
+  XCURRENT_ZWS     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_ZWS(:),    ISHAPE_2)
 ENDIF
 !
 DO JLAYER=1,SIZE(PDIR_ALB,3)
diff --git a/src/MNH/ibm_affectp.f90 b/src/MNH/ibm_affectp.f90
index b0c998744f7971f296e01b421b8f959ed890136d..4f6bd44514015955aa2c20885d9f2535b20a898e 100644
--- a/src/MNH/ibm_affectp.f90
+++ b/src/MNH/ibm_affectp.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -121,7 +121,7 @@ SUBROUTINE IBM_AFFECTP(PVAR,KIBM_LAYER,PRADIUS,PPOWERS,&
   USE MODD_RADIATIONS_n
   USE MODD_DYN_n
   USE MODD_FIELD_n
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT
+  USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT
   !
   IMPLICIT NONE
   !
@@ -225,7 +225,7 @@ SUBROUTINE IBM_AFFECTP(PVAR,KIBM_LAYER,PRADIUS,PPOWERS,&
         DO JN = 1,3
            !
            Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_P(JM,JMM,1  ,JN,:)
-           Z_DELTA_IMAG      = ((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))**0.5       
+           Z_DELTA_IMAG      = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5
            I_INDEX_CORN(:)   = NIBM_IMAGE_P(JM,JMM,1,1,JN,:)
            IF (I_INDEX_CORN(1)==0.AND.JN==2) ZIBM_HALO=0.
            IF (I_INDEX_CORN(2)==0.AND.JN==2) ZIBM_HALO=0.
diff --git a/src/MNH/ibm_affectv.f90 b/src/MNH/ibm_affectv.f90
index 74df9a13dcc052c86357bf674ab178fff8dcfae7..fee54c3e094d852b8eba6a7df25ce569c094b4f3 100644
--- a/src/MNH/ibm_affectv.f90
+++ b/src/MNH/ibm_affectv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -129,7 +129,7 @@ SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,&
   USE MODD_IBM_PARAM_n
   USE MODD_FIELD_n
   USE MODD_PARAM_n, ONLY: CTURB
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ
+  USE MODD_GRID_n,  ONLY: XDXHAT, XDYHAT
   USE MODD_VAR_ll,  ONLY: IP
   USE MODD_LBC_n
   USE MODD_REF_n, ONLY: XRHODJ,XRHODREF
@@ -290,7 +290,7 @@ SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,&
         DO JN = 1,3
            !
            Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_V(JM,JMM,JH  ,JN,:)
-           Z_DELTA_IMAG      = ((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))**0.5
+           Z_DELTA_IMAG      = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5
            !
            DO JLL=1,3
               I_INDEX_CORN(:)       = NIBM_IMAGE_V(JM,JMM,JH,JLL,JN,:)
diff --git a/src/MNH/ibm_balance.f90 b/src/MNH/ibm_balance.f90
index 2256cd097bc547fd789da11f5fc85507a808242d..e1ed43c51bd559873d0e4adb640a49a9c68c9d66 100644
--- a/src/MNH/ibm_balance.f90
+++ b/src/MNH/ibm_balance.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -57,6 +57,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
   !    MODIFICATIONS
   !    -------------
   !      Original         01/01/2019
+  !  P. Wautelet 31/08/2022: use XDXHAT and XDYHAT instead of XXHAT and XYHAT
   !
   !------------------------------------------------------------------------------
   !       
@@ -69,7 +70,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
   ! declaration
   USE MODD_CST, ONLY: XPI
   USE MODD_IBM_PARAM_n
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ 
+  USE MODD_GRID_n,     ONLY: XDXHAT, XDYHAT, XZZ
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
   USE MODD_LBC_n
   USE MODD_REF_n
@@ -140,7 +141,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 2
               JI2 = JI
               ZIBM_FLUX(JI2,JJ,JK,JL-1) = 0.
-              ZDEL = SQRT((XYHAT(JJ+1)-XYHAT(JJ))*0.5*(XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)))
+              ZDEL = SQRT( XDYHAT(JJ) * 0.5 * (XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)) )
               ZPH1 = PPHI(JI2 ,JJ  ,JK  ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRUS(JI2,JJ ,JK )
@@ -206,7 +207,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 2
               JI2 = JI+1
               ZIBM_FLUX(JI2,JJ,JK,JL-1) = 0.
-              ZDEL = SQRT((XYHAT(JJ+1)-XYHAT(JJ))*0.5*(XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)))
+              ZDEL = SQRT( XDYHAT(JJ) * 0.5 * (XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)) )
               ZPH1 = PPHI(JI2  ,JJ  ,JK  ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRUS(JI2,JJ ,JK )
@@ -270,7 +271,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 3 
               JJ2 = JJ
               ZIBM_FLUX(JI,JJ2,JK,JL-1) = 0.
-              ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*0.5*(XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)))
+              ZDEL = SQRT( XDXHAT(JI) * 0.5 * (XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)) )
               ZPH1 = PPHI(JI  ,JJ2  ,JK  ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRVS(JI ,JJ2,JK )
@@ -335,7 +336,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 3 
               JJ2 = JJ+1
               ZIBM_FLUX(JI,JJ2,JK,JL-1) = 0.
-              ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*0.5*(XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)))
+              ZDEL = SQRT( XDXHAT(JI) * 0.5 * (XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)) )
               ZPH1 = PPHI(JI  ,JJ2  ,JK  ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRVS(JI ,JJ2,JK )
@@ -401,7 +402,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 4 
               JK2 = JK
               ZIBM_FLUX(JI,JJ,JK2,JL-1) = 0.
-              ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))
+              ZDEL = SQRT( XDXHAT(JI) * XDYHAT(JJ) )
               ZPH1 = PPHI(JI  ,JJ  ,JK2 ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRWS(JI ,JJ ,JK2)
@@ -467,7 +468,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL)
               JL = 4 
               JK2 = JK+1
               ZIBM_FLUX(JI,JJ,JK2,JL-1) = 0.
-              ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))
+              ZDEL = SQRT( XDXHAT(JI) * XDYHAT(JJ) )
               ZPH1 = PPHI(JI  ,JJ  ,JK2 ,JL)
               ZSIG1 = max(0.,-ZPH1/abs(ZPH1))
               ZVIT1 = ZSIG1*PRWS(JI ,JJ ,JK2)
diff --git a/src/MNH/ibm_detect.f90 b/src/MNH/ibm_detect.f90
index ca4530964ff6f617309a5df187c9c689cbf73d53..b88a80445aad736413f45e64431eae8f3a3c3db1 100644
--- a/src/MNH/ibm_detect.f90
+++ b/src/MNH/ibm_detect.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -75,7 +75,6 @@ SUBROUTINE IBM_DETECT(PPHI)
   ! declaration
   USE MODD_IBM_PARAM_n
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ
   USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ,XDZX,XDZY
   USE MODD_LBC_n
   USE MODD_CONF, ONLY: NHALO
diff --git a/src/MNH/ibm_generls.f90 b/src/MNH/ibm_generls.f90
index a129d210930de85d7ade5ed783ce6c57c7714ad7..1b768365207207d3f7c07875bc3c44ccdfb61a0d 100644
--- a/src/MNH/ibm_generls.f90
+++ b/src/MNH/ibm_generls.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2021-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.
@@ -76,7 +76,6 @@ SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,P
   USE MODD_IBM_LSF
   USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT,XUNDEF
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ
   USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ
   USE MODD_VAR_ll, ONLY: IP
   USE MODD_CST, ONLY: XMNH_EPSILON 
diff --git a/src/MNH/ibm_idealee.f90 b/src/MNH/ibm_idealee.f90
index e08be780d96d538d079536dc127c04074e860dd8..1c2d6449fec35679e66e1b036ac9773fddce7504 100644
--- a/src/MNH/ibm_idealee.f90
+++ b/src/MNH/ibm_idealee.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -69,7 +69,6 @@ SUBROUTINE IBM_IDEALEE(KNUMB_OBS,PIBM_XYZ,PPHI)
   ! declaration
   USE MODD_IBM_PARAM_n
   USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
   !
   ! interface
diff --git a/src/MNH/ibm_idealrp.f90 b/src/MNH/ibm_idealrp.f90
index a67bb5fd2a5095ed294c0ec9a67bc547dc0e0273..3c2a0c77dcb2425eeb27901e538e5eeaad87af6b 100644
--- a/src/MNH/ibm_idealrp.f90
+++ b/src/MNH/ibm_idealrp.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -68,12 +68,11 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   USE MODE_POS
   USE MODE_ll
   USE MODE_IO
-  USE MODE_GATHER_ll
   !
   ! declaration
   USE MODD_IBM_PARAM_n
   USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ
+  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT, XXHAT_ll, XYHAT_ll, XZZ
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
   !
   ! interface
@@ -105,7 +104,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   REAL, ALLOCATABLE                   :: ZDIST_SUR6,ZDIST_REF0                            
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATM,ZYHATM,ZZHATM                      ! mesh location (mass nodes)
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATC,ZYHATC,ZZHATC                      ! mesh location (cell nodes)
-  REAL, DIMENSION(:)    , ALLOCATABLE :: ZXHAT_ll,ZYHAT_ll
   CHARACTER(LEN=1)                    :: YPOS
   INTEGER                             :: NRESP
   !
@@ -140,14 +138,10 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   !     ----------------
   ! 
   CALL GET_GLOBALDIMS_ll(IIU_ll,IJU_ll)
-  ALLOCATE(ZXHAT_ll(IIU_ll+ 2 * JPHEXT))
-  ALLOCATE(ZYHAT_ll(IJU_ll+ 2 * JPHEXT))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP)
   ZDELTX = abs((PIBM_XYZ(KNUMB_OBS,1)-PIBM_XYZ(KNUMB_OBS,2))/ & 
-       ((ZXHAT_ll(IIU_ll+2)-ZXHAT_ll(2))/(IIU_ll*1.)))
+       ((XXHAT_ll(IIU_ll+2)-XXHAT_ll(2))/(IIU_ll*1.)))
   ZDELTY = abs((PIBM_XYZ(KNUMB_OBS,3)-PIBM_XYZ(KNUMB_OBS,4))/ & 
-       ((ZYHAT_ll(IJU_ll+2)-ZYHAT_ll(2))/(IJU_ll*1.)))  
+       ((XYHAT_ll(IJU_ll+2)-XYHAT_ll(2))/(IJU_ll*1.)))
   ZDELTZ = abs((PIBM_XYZ(KNUMB_OBS,5)-PIBM_XYZ(KNUMB_OBS,6))/ &
        ((XZHAT(IKU)-XZHAT(2))/(IKU*1.-2.)))
   !      
@@ -301,7 +295,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   !     -----------------------
   !
   DEALLOCATE(ZXHATC,ZYHATC,ZZHATC)
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
   DEALLOCATE(ZTEST_XMIN,ZTEST_XMAX,ZTEST_YMIN,ZTEST_YMAX,ZTEST_ZMIN,ZTEST_ZMAX)
   DEALLOCATE(ZPOSI_XYZ0,ZPOSI_XYZ1,ZPOSI_XYZ2)
   DEALLOCATE(ZDIST_SUR0,ZDIST_SUR1,ZDIST_SUR2,ZDIST_SUR3,ZDIST_SUR4,ZDIST_SUR5,ZDIST_SUR6,ZDIST_REF0)
diff --git a/src/MNH/ibm_init_ls.f90 b/src/MNH/ibm_init_ls.f90
index 2d881e1fd564803d1d7f786993fa5efc2fe14042..bdfbff5ad10d7304d4ad3efa355e280305fc8250 100644
--- a/src/MNH/ibm_init_ls.f90
+++ b/src/MNH/ibm_init_ls.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -70,7 +70,7 @@ SUBROUTINE IBM_INIT_LS(PPHI)
   USE MODD_IBM_PARAM_n, ONLY: XIBM_EPSI,XIBM_IEPS
   USE MODD_IBM_LSF, ONLY: LIBM_LSF,CIBM_TYPE,NIBM_SMOOTH,XIBM_SMOOTH
   USE MODD_VAR_ll, ONLY: IP
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ
+  USE MODD_GRID_n,      ONLY: XZZ
   USE MODD_PARAMETERS, ONLY: XUNDEF,JPHEXT,JPVEXT
   !
   ! interface
diff --git a/src/MNH/ibm_smooth_ls.f90 b/src/MNH/ibm_smooth_ls.f90
index 96144123454422ed14e94f1ae592098171937ca9..7e06c354df84832fcb6a2ffaf27490fecd3d71b2 100644
--- a/src/MNH/ibm_smooth_ls.f90
+++ b/src/MNH/ibm_smooth_ls.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -74,7 +74,7 @@ SUBROUTINE IBM_SMOOTH_LS(KIBM_SMOOTH,PIBM_SMOOTH,PPHI)
   USE MODD_IBM_PARAM_n    
   USE MODD_IBM_LSF   
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT   
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ 
+  USE MODD_GRID_n,      ONLY: XDXHAT, XDYHAT
   USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ,XDZX,XDZY
   USE MODD_ARGSLIST_ll, ONLY: LIST_ll
   USE MODD_VAR_ll, ONLY: IP
@@ -131,8 +131,8 @@ SUBROUTINE IBM_SMOOTH_LS(KIBM_SMOOTH,PIBM_SMOOTH,PPHI)
   !
   IKE = IKU - JPVEXT
   IKB =   1 + JPVEXT
-  ZREF =(1.e-2)*((XXHAT(IIB+1)-XXHAT(IIB))*(XYHAT(IJB+1)-XYHAT(IJB)))**0.5
-  ZREF3=((XXHAT(IIB+1)-XXHAT(IIB))*(XYHAT(IJB+1)-XYHAT(IJB)))**0.5
+  ZREF =(1.e-2)*( XDXHAT(IIB) * XDYHAT(IJB) )**0.5
+  ZREF3=        ( XDXHAT(IIB) * XDYHAT(IJB) )**0.5
   !
   ! Boundary symmetry
   !
diff --git a/src/MNH/ibm_volume.f90 b/src/MNH/ibm_volume.f90
index af4012a42b9cba352d527c22179f6de698ff59dc..ec734278ffa65c8cff5eef79aa8247ebe816a099 100644
--- a/src/MNH/ibm_volume.f90
+++ b/src/MNH/ibm_volume.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -66,7 +66,6 @@ SUBROUTINE IBM_VOLUME(PPHI,PVOL)
   !
   ! declaration
   USE MODD_IBM_PARAM_n        
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ 
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
   USE MODD_LBC_n
   USE MODD_LUNIT_n, ONLY: TLUOUT
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index 2df9363014ca83596f600d3a8d27b7bf60d4f77d..331df58cf9ea2e50738f7fdbc9bcaf73816c0bd3 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -1,8 +1,20 @@
-!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
+MODULE MODE_INI_AIRCRAFT
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: INI_AIRCRAFT
+
+INTEGER, PARAMETER :: NMAXLINELGT = 256
+
+CONTAINS
+
 !     #######################
       SUBROUTINE INI_AIRCRAFT
 !     #######################
@@ -41,9 +53,9 @@
 !!
 !!  6) the (SEG  ) duration of flight in the segments, in the flight order (sec.)
 !!
-!!  6bis) TAIRCRAFT%ALTDEF : flag to define the mode of initialisation of
-!!        aircraft altitude TRUE for pressure (corresponding to %SEGP)
-!!        or FALSE for Z (corresponding to %SEGZ)
+!!  6bis) TAIRCRAFT%LALTDEF : flag to define the mode of initialisation of
+!!        aircraft altitude TRUE for pressure (corresponding to %XSEGP)
+!!        or FALSE for Z (corresponding to %XSEGZ)
 !!
 !!  7) the (SEG+1) latitudes of the segments ends, in the flight order
 !!     first point is take-off
@@ -51,7 +63,7 @@
 !!
 !!  8) the (SEG+1) longitudes of the segments ends, in the flight order
 !!
-!!  9) the (SEG+1) pressure (%SEGP) or Z (%SEGZ) of the segments ends, in the flight order
+!!  9) the (SEG+1) pressure (%XSEGP) or Z (%XSEGZ) of the segments ends, in the flight order
 !!
 !!
 !!
@@ -62,8 +74,8 @@
 !!  9) the time step for data storage.
 !!    default is 60s
 !!
-!! 10) the name or title describing the balloon (8 characters)
-!!     default is the balloon type (6 characters) + the balloon numbers (2 characters)
+!! 10) the name or title describing the aircraft (8 characters)
+!!     default is the aircraft type (6 characters) + the aircraft numbers (2 characters)
 !!
 !!
 !!    EXTERNAL
@@ -83,2044 +95,168 @@
 !!    -------------
 !!     Original 15/05/2000
 !!             Sept2009, A. Boilley add initialisation of aircraft altitude by Z
-!!
-!!
-!! --------------------------------------------------------------------------
-!       
+!  P. Wautelet    06/2022: reorganize flyers
+!  P. Wautelet 19/08/2022: provide aircraft characteristics in namelist and CSV file instead of hardcoded
+! --------------------------------------------------------------------------
+!
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-!
-!
-IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 1
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT1%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT1%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT1%TYPE               = 'AIRCRA'
-!
-!* aircraft flight name
-!
-TAIRCRAFT1%TITLE             = 'DIMO19A'  
-!
-!* time step for storage
-!
-TAIRCRAFT1%STEP              = 60. 
-!
-!* take-off date and time
-!
-TAIRCRAFT1%LAUNCH%nyear  =  2007
-TAIRCRAFT1%LAUNCH%nmonth =    04
-TAIRCRAFT1%LAUNCH%nday   =    19
-TAIRCRAFT1%LAUNCH%xtime  = 32280.
-!
-!* number of flight segments
-!
-TAIRCRAFT1%SEG                = 168 
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT1%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT1%SEGTIME(TAIRCRAFT1%SEG  ))
-ALLOCATE(TAIRCRAFT1%SEGLAT (TAIRCRAFT1%SEG+1))
-ALLOCATE(TAIRCRAFT1%SEGLON (TAIRCRAFT1%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT1%SEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60 /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT1%SEGLAT  = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,&
- 44.39339, 44.38749, 44.37916, 44.37464, 44.37021,&
- 44.37045, 44.37059, 44.37443, 44.37222, 44.35214,&
- 44.36092, 44.38175, 44.40122, 44.41992, 44.43539,&
- 44.45071, 44.46737, 44.48038, 44.47368, 44.46140,&
- 44.45519, 44.46365, 44.46959, 44.47475, 44.48028,&
- 44.47210, 44.46509, 44.46825, 44.47021, 44.48252,&
- 44.50106, 44.52266, 44.54233, 44.55776, 44.56624,&
- 44.57126, 44.57083, 44.57098, 44.57155, 44.56524,&
- 44.56006, 44.56914, 44.57413, 44.57368, 44.56907,&
- 44.56207, 44.55547, 44.54991, 44.54553, 44.54143,&
- 44.53734, 44.53293, 44.52783, 44.52403, 44.52920,&
- 44.54065, 44.54570, 44.54875, 44.55127, 44.55372,&
- 44.56859, 44.58518, 44.56456, 44.53939, 44.54009,&
- 44.56265, 44.58650, 44.60879, 44.61819, 44.61754,&
- 44.61660, 44.62217, 44.61920, 44.61041, 44.60369,&
- 44.60041, 44.60191, 44.60322, 44.58885, 44.56374,&
- 44.54355, 44.52951, 44.50729, 44.48498, 44.46095,&
- 44.43832, 44.42894, 44.41980, 44.40837, 44.38897,&
- 44.36689, 44.35023, 44.33820, 44.33409, 44.33662,&
- 44.33859, 44.33223, 44.32123, 44.32175, 44.32951,&
- 44.33953, 44.35040, 44.36167, 44.37196, 44.37869,&
- 44.38493, 44.39208, 44.40101, 44.40943, 44.42089,&
- 44.44113, 44.46887, 44.49583, 44.51708, 44.53618,&
- 44.54475, 44.55005, 44.55511, 44.56009, 44.56446,&
- 44.56590, 44.56728, 44.56972, 44.57093, 44.57225,&
- 44.57260, 44.57197, 44.57016, 44.56544, 44.55235,&
- 44.53552, 44.54387, 44.55054, 44.56146, 44.56070,&
- 44.54054, 44.52130, 44.50292, 44.48638, 44.47290,&
- 44.45529, 44.43734, 44.41889, 44.39770, 44.37671,&
- 44.35838, 44.35707, 44.36639, 44.37534, 44.37753,&
- 44.37753, 44.37986, 44.38700, 44.39457, 44.39753,&
- 44.40017, 44.40076, 44.39730, 44.39181, 44.39756,&
- 44.39935, 44.39868, 44.39727, 44.39696 /)
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT1%SEGLON   = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,&
- 0.60107, 0.56909, 0.53738, 0.50474, 0.47315,&
- 0.44092, 0.40665, 0.37725, 0.35171, 0.33016,&
- 0.31340, 0.29638, 0.27594, 0.25293, 0.22663,&
- 0.19920, 0.17395, 0.15872, 0.17700, 0.19870,&
- 0.21796, 0.20584, 0.18416, 0.16200, 0.16042,&
- 0.18704, 0.20952, 0.19838, 0.17702, 0.15936,&
- 0.13843, 0.11309, 0.08309, 0.04845, 0.00948,&
--0.03097,-0.07187,-0.11372,-0.15500,-0.19571,&
--0.23476,-0.26490,-0.29027,-0.31521,-0.33867,&
--0.36085,-0.38222,-0.40476,-0.42847,-0.45149,&
--0.47413,-0.49675,-0.51926,-0.54853,-0.58352,&
--0.61936,-0.65967,-0.70151,-0.74369,-0.78626,&
--0.82035,-0.82679,-0.81080,-0.80093,-0.81855,&
--0.83421,-0.84543,-0.85947,-0.88928,-0.92270,&
--0.95642,-0.98774,-1.01802,-1.05282,-1.08807,&
--1.12390,-1.15847,-1.19287,-1.22142,-1.24147,&
--1.26289,-1.28825,-1.28869,-1.27067,-1.25984,&
--1.25447,-1.22868,-1.19892,-1.16909,-1.14878,&
--1.13185,-1.10636,-1.07398,-1.03438,-1.00077,&
--0.97309,-0.94428,-0.91011,-0.87900,-0.85405,&
--0.83235,-0.81217,-0.79231,-0.77125,-0.74612,&
--0.71985,-0.69334,-0.66698,-0.64049,-0.61627,&
--0.59738,-0.58007,-0.55652,-0.52248,-0.48603,&
--0.44405,-0.39964,-0.35780,-0.32620,-0.29894,&
--0.27061,-0.24144,-0.21229,-0.18267,-0.15256,&
--0.12223,-0.09116,-0.05346,-0.00969, 0.03348,&
- 0.07270, 0.07334, 0.03393, 0.00021, 0.01935,&
- 0.05295, 0.08646, 0.11585, 0.14321, 0.17288,&
- 0.20083, 0.22825, 0.25199, 0.27166, 0.29386,&
- 0.31926, 0.35232, 0.38587, 0.41831, 0.45384,&
- 0.49099, 0.52731, 0.56261, 0.59614, 0.63308,&
- 0.67001, 0.70471, 0.73740, 0.76830, 0.76841,&
- 0.75848, 0.76209, 0.76315, 0.76335  /) 
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT1%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT1%SEGP   (TAIRCRAFT1%SEG+1))
-  TAIRCRAFT1%SEGP    = 100. * (/1003.6, 990.8, 988.1, 988.5, 989.3,&
- 988.9, 989.6, 989.9, 990.3, 989.2,&
- 990.8, 993.9, 987.7, 987.2, 992.0,&
- 995.2, 993.9, 994.0, 994.3, 993.9,&
- 993.9, 992.6, 981.6, 968.0, 954.6,&
- 942.5, 929.8, 917.8, 904.2, 891.8,&
- 879.5, 867.9, 857.0, 846.5, 840.0,&
- 844.9, 857.8, 873.5, 889.7, 905.3,&
- 921.5, 937.8, 953.9, 963.7, 978.8,&
- 993.0, 984.1, 970.4, 955.6, 943.1,&
- 930.3, 916.8, 904.4, 891.6, 878.6,&
- 866.2, 854.3, 846.2, 851.2, 863.0,&
- 878.3, 895.0, 912.3, 929.7, 944.7,&
- 959.2, 967.2, 977.6, 981.9, 981.1,&
- 982.1, 981.9, 984.4, 984.2, 983.6,&
- 982.1, 978.6, 980.5, 982.1, 983.1,&
- 984.2, 984.5, 983.6, 996.0,1003.8,&
-1004.2,1001.4,1000.5,1002.3,1005.9,&
-1000.9, 992.8, 989.7, 987.1, 985.1,&
- 984.3, 982.4, 986.7, 999.1, 994.8,&
- 984.1, 985.1, 997.0, 988.2, 975.0,&
- 963.0, 949.0, 937.4, 925.3, 912.6,&
- 898.8, 886.1, 873.6, 860.8, 848.3,&
- 850.2, 863.4, 880.2, 898.0, 916.3,&
- 932.8, 949.7, 959.7, 947.5, 933.3,&
- 920.8, 907.4, 894.0, 881.4, 869.0,&
- 858.0, 848.9, 852.2, 863.2, 880.0,&
- 895.3, 909.6, 926.1, 942.0, 958.6,&
- 977.3, 993.0, 995.6, 995.0, 993.0,&
- 996.2, 995.1, 994.2, 993.4, 993.6,&
- 992.0, 991.3, 993.2, 991.6, 993.1,&
- 992.7, 992.0, 992.0, 989.4, 991.2,&
- 989.5, 981.8, 977.8, 983.3,1001.9,&
-1007.0,1006.8,1006.8, 1006.8 /)
-ELSE
-  ALLOCATE(TAIRCRAFT1%SEGZ   (TAIRCRAFT1%SEG+1))
-TAIRCRAFT1%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000  /)        
-ENDIF
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 2
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT2%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT2%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT2%TYPE               = 'AIRCRA'
+USE MODD_CONF,             ONLY: NMODEL_NEST => NMODEL
+USE MODD_PARAMETERS,       ONLY: XNEGUNDEF
 
-!* aircraft flight name
-!
-TAIRCRAFT2%TITLE             = 'DIMO19B'  
-!
-!* time step for storage
-!
-TAIRCRAFT2%STEP             = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFT2%LAUNCH%nyear  =  2007
-TAIRCRAFT2%LAUNCH%nmonth =    04
-TAIRCRAFT2%LAUNCH%nday   =    19
-TAIRCRAFT2%LAUNCH%xtime  = 48060.
-!
-!* number of flight segments
-!
-TAIRCRAFT2%SEG                = 198 
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT2%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT2%SEGTIME(TAIRCRAFT2%SEG  ))
-ALLOCATE(TAIRCRAFT2%SEGLAT (TAIRCRAFT2%SEG+1))
-ALLOCATE(TAIRCRAFT2%SEGLON (TAIRCRAFT2%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT2%SEGTIME     = (/60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60  /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT2%SEGLAT      = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,&
- 44.39843, 44.39619, 44.39141, 44.38353, 44.37732,&
- 44.37508, 44.37609, 44.37377, 44.36764, 44.36083,&
- 44.35442, 44.37187, 44.39327, 44.41394, 44.43280,&
- 44.44887, 44.46759, 44.47026, 44.45759, 44.46716,&
- 44.48098, 44.49223, 44.48031, 44.46436, 44.46050,&
- 44.46611, 44.47339, 44.47535, 44.46444, 44.46467,&
- 44.47678, 44.49333, 44.50428, 44.51275, 44.52244,&
- 44.53453, 44.54696, 44.55673, 44.56092, 44.56132,&
- 44.56116, 44.56225, 44.56290, 44.56055, 44.55233,&
- 44.54409, 44.53433, 44.52137, 44.50897, 44.49627,&
- 44.48420, 44.47599, 44.46897, 44.46110, 44.45206,&
- 44.44454, 44.43702, 44.42862, 44.41992, 44.40707,&
- 44.38769, 44.36858, 44.34945, 44.32974, 44.30938,&
- 44.28888, 44.26943, 44.27339, 44.29464, 44.32345,&
- 44.35428, 44.38620, 44.41810, 44.43924, 44.42371,&
- 44.40729, 44.39663, 44.39174, 44.38035, 44.35685,&
- 44.35082, 44.37277, 44.37210, 44.37059, 44.37076,&
- 44.36948, 44.35924, 44.34744, 44.34207, 44.33859,&
- 44.33485, 44.32219, 44.30517, 44.28314, 44.25674,&
- 44.23110, 44.20517, 44.18849, 44.18723, 44.18804,&
- 44.18820, 44.18341, 44.16808, 44.14988, 44.12651,&
- 44.09887, 44.10007, 44.13022, 44.15963, 44.16313,&
- 44.14156, 44.11520, 44.08806, 44.06374, 44.05124,&
- 44.04458, 44.04106, 44.04035, 44.04010, 44.03897,&
- 44.03530, 44.03939, 44.05114, 44.06269, 44.07460,&
- 44.08650, 44.09131, 44.08050, 44.09213, 44.10666,&
- 44.12659, 44.14738, 44.16590, 44.18314, 44.19906,&
- 44.21885, 44.24219, 44.26652, 44.29116, 44.31433,&
- 44.33735, 44.36057, 44.37947, 44.39634, 44.41202,&
- 44.42718, 44.44310, 44.45702, 44.46577, 44.47367,&
- 44.47522, 44.48508, 44.49589, 44.50652, 44.51467,&
- 44.52342, 44.53589, 44.54841, 44.55751, 44.55326,&
- 44.54398, 44.53334, 44.52054, 44.50654, 44.49421,&
- 44.48487, 44.47112, 44.45230, 44.43285, 44.41224,&
- 44.39065, 44.36929, 44.35484, 44.35927, 44.36936,&
- 44.37609, 44.37666, 44.37590, 44.38037, 44.38779,&
- 44.39413, 44.39740, 44.40002, 44.40032, 44.39755,&
- 44.39226, 44.39494, 44.39910, 44.39862, 44.39719,&
- 44.39691, 44.39692, 44.39689, 44.39694   /)
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT2%SEGLON      = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,&
- 0.64082, 0.60831, 0.57717, 0.54697, 0.51578,&
- 0.48245, 0.45056, 0.41783, 0.38851, 0.36046,&
- 0.32828, 0.30353, 0.28176, 0.25886, 0.23647,&
- 0.21031, 0.18783, 0.19138, 0.20574, 0.19556,&
- 0.17902, 0.17207, 0.18561, 0.20057, 0.21096,&
- 0.19209, 0.17406, 0.18880, 0.21157, 0.20492,&
- 0.17724, 0.14803, 0.11416, 0.07884, 0.04294,&
- 0.00754,-0.02836,-0.06645,-0.10613,-0.14594,&
--0.18382,-0.21191,-0.23806,-0.26153,-0.28229,&
--0.30235,-0.32461,-0.35502,-0.38888,-0.42649,&
--0.46658,-0.49951,-0.52354,-0.54620,-0.56911,&
--0.59210,-0.61530,-0.63781,-0.66103,-0.68000,&
--0.68664,-0.68859,-0.68904,-0.68633,-0.68257,&
--0.67785,-0.67856,-0.68504,-0.67421,-0.65909,&
--0.64292,-0.62468,-0.60554,-0.60962,-0.64284,&
--0.68049,-0.72153,-0.76308,-0.79993,-0.82295,&
--0.80244,-0.79925,-0.83586,-0.87284,-0.90717,&
--0.93954,-0.96673,-0.99345,-1.02688,-1.06013,&
--1.09311,-1.12010,-1.14430,-1.15772,-1.15729,&
--1.15461,-1.15633,-1.17298,-1.19786,-1.22215,&
--1.24575,-1.26738,-1.27606,-1.27726,-1.28392,&
--1.29406,-1.29028,-1.29255,-1.28781,-1.27630,&
--1.29478,-1.30461,-1.31179,-1.30894,-1.28378,&
--1.25748,-1.23181,-1.20656,-1.17989,-1.15381,&
--1.12789,-1.10402,-1.08189,-1.05854,-1.03571,&
--1.01321,-0.98957,-0.98981,-0.98826,-0.96629,&
--0.94082,-0.91032,-0.87556,-0.83647,-0.79522,&
--0.75987,-0.73047,-0.70212,-0.67419,-0.64559,&
--0.61580,-0.58662,-0.56599,-0.55283,-0.53912,&
--0.52493,-0.51192,-0.49392,-0.47041,-0.45111,&
--0.43705,-0.41091,-0.38491,-0.35776,-0.32809,&
--0.29403,-0.25181,-0.20625,-0.15899,-0.11076,&
--0.06454,-0.01989, 0.02357, 0.06550, 0.10835,&
- 0.15086, 0.18573, 0.21197, 0.23662, 0.25944,&
- 0.28144, 0.30338, 0.32757, 0.35913, 0.39246,&
- 0.42650, 0.46119, 0.49538, 0.52941, 0.56250,&
- 0.59510, 0.63037, 0.66574, 0.69774, 0.72973,&
- 0.75999, 0.77280, 0.75992, 0.76224, 0.76317,&
- 0.76352, 0.76357, 0.76358, 0.76349 /)
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT2%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT2%SEGP   (TAIRCRAFT2%SEG+1))
-TAIRCRAFT2%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,&
- 987.9, 989.1, 990.2, 989.3, 988.6,&
- 989.8, 989.6, 991.0, 986.1, 980.7,&
- 986.5, 991.9, 991.5, 993.0, 992.1,&
- 991.3, 991.8, 982.3, 972.0, 960.0,&
- 950.5, 938.4, 924.8, 911.7, 899.5,&
- 886.9, 876.2, 864.0, 849.9, 843.7,&
- 852.1, 861.8, 871.3, 880.8, 891.3,&
- 901.5, 913.5, 926.8, 940.6, 952.3,&
- 952.9, 938.6, 921.6, 907.2, 898.2,&
- 884.6, 880.2, 892.0, 902.0, 916.1,&
- 931.1, 926.4, 909.7, 897.0, 891.0,&
- 880.8, 868.3, 861.0, 851.4, 842.2,&
- 833.7, 823.2, 809.5, 799.0, 789.0,&
- 778.7, 768.7, 759.3, 761.1, 774.5,&
- 789.5, 809.8, 829.7, 841.2, 856.2,&
- 871.5, 886.9, 904.8, 923.0, 937.5,&
- 952.0, 965.7, 980.8, 985.2, 988.0,&
- 987.3, 985.8, 986.6, 989.8, 990.7,&
- 991.4, 990.5, 989.1, 988.2, 988.0,&
- 984.7, 985.0, 977.8, 964.8, 952.8,&
- 941.3, 929.7, 918.2, 909.4, 915.3,&
- 928.5, 943.0, 961.3, 978.0, 989.2,&
- 992.9, 994.5, 994.4, 987.9, 974.2,&
- 960.6, 946.6, 933.5, 920.8, 908.2,&
- 895.7, 883.6, 872.7, 861.4, 850.0,&
- 837.7, 825.8, 814.0, 803.1, 796.9,&
- 803.0, 812.6, 824.4, 841.8, 859.3,&
- 876.9, 893.8, 910.1, 928.2, 942.5,&
- 962.5, 978.7, 964.3, 951.7, 937.5,&
- 921.1, 906.0, 891.0, 879.2, 862.9,&
- 847.7, 836.1, 826.2, 814.5, 802.0,&
- 806.3, 820.0, 836.0, 853.4, 870.7,&
- 889.7, 909.7, 929.1, 950.2, 971.8,&
- 988.8, 993.3, 992.3, 991.9, 991.4,&
- 992.0, 991.7, 988.2, 986.2, 989.9,&
- 990.5, 991.2, 989.3, 988.5, 988.2,&
- 986.8, 986.4, 987.0, 981.0, 975.5,&
- 975.8, 993.9,1004.1,1004.1,1004.1,&
-1004.1,1004.1,1004.1,1004.1 /)
-ELSE
-  ALLOCATE(TAIRCRAFT2%SEGZ   (TAIRCRAFT2%SEG+1))
-  TAIRCRAFT2%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000  /)
-ENDIF
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 3
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT3%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT3%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT3%TYPE               = 'AIRCRA'
+USE MODE_MSG
 
-!* aircraft flight name
-!
-TAIRCRAFT3%TITLE             = 'SAAL19A'
-!
-!* time step for storage
-!
-TAIRCRAFT3%STEP             = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFT3%LAUNCH%nyear  =  2007
-TAIRCRAFT3%LAUNCH%nmonth =    04
-TAIRCRAFT3%LAUNCH%nday   =    19
-TAIRCRAFT3%LAUNCH%xtime  = 45369
-!
-!* number of flight segments
-!
-TAIRCRAFT3%SEG                = 39
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT3%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT3%SEGTIME(TAIRCRAFT3%SEG  ))
-ALLOCATE(TAIRCRAFT3%SEGLAT (TAIRCRAFT3%SEG+1))
-ALLOCATE(TAIRCRAFT3%SEGLON (TAIRCRAFT3%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT3%SEGTIME = (/   15,   16,   16,   18,   17,   17,&
-   22,   25,   19,   19,   22,   27,&
-   28,   27,   29,   32,   30,   24,&
-  169,   18,   15,   18,   17,   16,&
-   16,   14,   14,   18,   17,   15,&
-   14,   14,   19,   20,   16,   15,&
-   14,   16,   21 /)
-                                  
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT3%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,&
- 44.14843, 44.14437, 44.14127, 44.14574, 44.14858,&
- 44.14655, 44.14130, 44.14384, 44.14738, 44.14158,&
- 44.14245, 44.14607, 44.14023, 44.14227, 44.15136,&
- 44.14792, 44.14352, 44.13874, 44.13904, 44.14350,&
- 44.14701, 44.14614, 44.14223, 44.14001, 44.14320,&
- 44.14671, 44.14661, 44.14324, 44.14091, 44.14492,&
- 44.14721, 44.14510, 44.14152, 44.14219, 44.14698 /)
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT3%SEGLON   = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,&
- 0.95576, 0.95421, 0.96105, 0.96593, 0.96076,&
- 0.95485, 0.95618, 0.96341, 0.95769, 0.95681,&
- 0.96585, 0.96073, 0.96158, 0.97041, 0.96299,&
- 0.95662, 0.95481, 0.95871, 0.96586, 0.96804,&
- 0.96407, 0.95952, 0.95957, 0.96608, 0.97088,&
- 0.96825, 0.96292, 0.96078, 0.96622, 0.96953,&
- 0.96476, 0.96053, 0.96218, 0.96765, 0.96600 /)
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT3%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT3%SEGP   (TAIRCRAFT3%SEG+1))
-TAIRCRAFT3%SEGP    = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,&
- 964.3, 958.4, 952.9, 947.5, 942.8,&
- 936.5, 930.8, 925.6, 919.8, 914.6,&
- 909.2, 903.6, 898.0, 893.0, 881.8,&
- 887.3, 892.5, 897.8, 903.1, 908.6,&
- 914.1, 919.2, 924.9, 929.5, 935.2,&
- 940.4, 946.6, 951.8, 957.8, 963.1,&
- 969.1, 974.1, 980.0, 986.0, 993.0 /)
-ELSE
-  ALLOCATE(TAIRCRAFT3%SEGZ   (TAIRCRAFT3%SEG+1))
-  TAIRCRAFT3%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000  /)
-ENDIF
- 
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 4
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT4%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT4%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT4%TYPE               = 'AIRCRA'
+USE MODN_AIRCRAFTS
 
-!* aircraft flight name
-!
-TAIRCRAFT4%TITLE             = 'SAAL19B'
-!
-!* time step for storage
-!
-TAIRCRAFT4%STEP             = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFT4%LAUNCH%nyear  =  2007
-TAIRCRAFT4%LAUNCH%nmonth =    04
-TAIRCRAFT4%LAUNCH%nday   =    19
-TAIRCRAFT4%LAUNCH%xtime  = 60392.
-!
-!* number of flight segments
-!
-TAIRCRAFT4%SEG                = 39
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT4%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT4%SEGTIME(TAIRCRAFT4%SEG  ))
-ALLOCATE(TAIRCRAFT4%SEGLAT (TAIRCRAFT4%SEG+1))
-ALLOCATE(TAIRCRAFT4%SEGLON (TAIRCRAFT4%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT4%SEGTIME = (/ 36,   18,   18,   21,   24,   23,&
-   20,   20,   25,   27,   21,   25,&
-   27,   23,   21,   23,   25,   21,&
-   27,  190,   17,   17,   18,   17,&
-   18,   17,   15,   18,   22,   17,&
-   16,   18,   22,   22,   19,   20,&
-   21,   23,   22  /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT4%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,&
- 44.13749, 44.13853, 44.14373, 44.14530, 44.13921,&
- 44.13773, 44.14285, 44.13974, 44.13622, 44.14093,&
- 44.14375, 44.13868, 44.13771, 44.14272, 44.14156,&
- 44.14130, 44.14335, 44.14031, 44.13480, 44.13150,&
- 44.13157, 44.13507, 44.13921, 44.14201, 44.13823,&
- 44.13479, 44.13668, 44.14132, 44.14112, 44.13621,&
- 44.13775, 44.14254, 44.14194, 44.13669, 44.13837 /)
-                       !
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT4%SEGLON  = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,&
- 0.94730, 0.95518, 0.95559, 0.94882, 0.94656,&
- 0.95488, 0.95463, 0.94889, 0.95589, 0.95988,&
- 0.95389, 0.95076, 0.95834, 0.95888, 0.95095,&
- 0.95897, 0.95259, 0.94684, 0.94743, 0.95294,&
- 0.96042, 0.96527, 0.96527, 0.95949, 0.95413,&
- 0.95842, 0.96350, 0.96231, 0.95483, 0.95597,&
- 0.96187, 0.96037, 0.95264, 0.95278, 0.95857 /)
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT4%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT4%SEGP   (TAIRCRAFT4%SEG+1))
-TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,&
- 962.8, 957.7, 952.1, 946.3, 940.5,&
- 935.3, 930.4, 924.0, 918.9, 913.4,&
- 907.8, 902.8, 897.1, 892.2, 886.3,&
- 881.6, 886.6, 891.9, 897.0, 902.3,&
- 907.9, 912.8, 918.3, 924.0, 929.0,&
- 934.6, 940.3, 946.0, 951.4, 956.5,&
- 962.8, 968.1, 973.7, 979.3, 984.9 /)
- ELSE
-  ALLOCATE(TAIRCRAFT4%SEGZ   (TAIRCRAFT4%SEG+1))
-  TAIRCRAFT4%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000/)
-ENDIF
+IMPLICIT NONE
 
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 5
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT5%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT5%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT5%TYPE               = 'AIRCRA'
+INTEGER :: JI
+TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT
 
-!* aircraft flight name
-!
-TAIRCRAFT5%TITLE             = 'SAIB19A'
-!
-!* time step for storage
-!
-TAIRCRAFT5%STEP             = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFT5%LAUNCH%nyear  =  2007
-TAIRCRAFT5%LAUNCH%nmonth =    04
-TAIRCRAFT5%LAUNCH%nday   =    19
-TAIRCRAFT5%LAUNCH%xtime  = 43380.
-!
-!* number of flight segments
-!
-TAIRCRAFT5%SEG                = 176
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT5%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT5%SEGTIME(TAIRCRAFT5%SEG  ))
-ALLOCATE(TAIRCRAFT5%SEGLAT (TAIRCRAFT5%SEG+1))
-ALLOCATE(TAIRCRAFT5%SEGLON (TAIRCRAFT5%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT5%SEGTIME = (/  28,   28,   29,   29,   29,   28,&
-   28,   28,   29,   26,   28,   27,&
-   28,   27,   28,   27,   25,   27,&
-   27,   26,   24,   25,   26,   26,&
-   24,   25,   27,   27,   25,   27,&
-   27,   28,   27,   28,   27,   27,&
-   28,   28,   27,   28,   28,   28,&
-   28,   28,   28,   27,   28,   26,&
-   27,   27,   27,   26,   25,   25,&
-   27,   27,   26,   25,   28,   28,&
-   28,   27,   29,   27,   27,   28,&
-   29,   27,   27,   27,   27,   26,&
-   26,   26,   26,   25,   26,   26,&
-   26,   27,   26,   25,   26,   25,&
-   26,   25,   25,   25,   26,   25,&
-   24,   25,   25,   25,   25,   24,&
-   26,   26,   25,   25,   25,   26,&
-   24,   23,   23,   24,   25,   22,&
-   21,   24,   25,   24,   24,   24,&
-   24,   24,   26,   26,   24,   26,&
-   26,   25,   25,   27,   25,   25,&
-   25,   25,   24,   24,   25,   24,&
-   25,   24,   24,   24,   24,   25,&
-   24,   24,   23,   25,   25,   24,&
-   23,   25,   27,   26,   24,   25,&
-   27,   27,   26,   26,   26,   25,&
-   25,   26,   25,   25,   25,   25,&
-   25,   26,   26,   25,   25,   25,&
-   26,   26,   25,   25,   25,   25,&
-   25,   25  /) 
+!Treat aircraft data read in namelist
+DO JI = 1, NAIRCRAFTS
+    ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+    TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT
 
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT5%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,&
- 44.38420, 44.38336, 44.38248, 44.38151, 44.38046,&
- 44.37942, 44.37835, 44.37729, 44.37630, 44.37530,&
- 44.37407, 44.37156, 44.36766, 44.36184, 44.35421,&
- 44.34673, 44.33986, 44.33271, 44.32536, 44.31800,&
- 44.31084, 44.30350, 44.29764, 44.29618, 44.29837,&
- 44.30431, 44.31233, 44.32061, 44.32872, 44.33691,&
- 44.34478, 44.35284, 44.36091, 44.36894, 44.37666,&
- 44.38478, 44.39273, 44.40079, 44.40907, 44.41711,&
- 44.42513, 44.43278, 44.44096, 44.44872, 44.45604,&
- 44.46205, 44.46722, 44.47121, 44.47528, 44.47961,&
- 44.48401, 44.48833, 44.49243, 44.49633, 44.50052,&
- 44.50473, 44.50888, 44.51291, 44.51712, 44.52108,&
- 44.52521, 44.52945, 44.53390, 44.53808, 44.54208,&
- 44.54610, 44.55014, 44.55407, 44.55854, 44.56353,&
- 44.56913, 44.57520, 44.58130, 44.58722, 44.59335,&
- 44.59960, 44.60600, 44.61232, 44.61881, 44.62519,&
- 44.63163, 44.63794, 44.64420, 44.65037, 44.65659,&
- 44.66282, 44.66911, 44.67549, 44.68206, 44.68845,&
- 44.69469, 44.70078, 44.70619, 44.70841, 44.70754,&
- 44.70336, 44.69652, 44.68935, 44.68254, 44.67577,&
- 44.66869, 44.66101, 44.65345, 44.64679, 44.64044,&
- 44.63337, 44.62587, 44.61864, 44.61169, 44.60483,&
- 44.59803, 44.59103, 44.58360, 44.57622, 44.56934,&
- 44.56229, 44.55523, 44.54845, 44.54173, 44.53448,&
- 44.52751, 44.52062, 44.51361, 44.50655, 44.49974,&
- 44.49290, 44.48547, 44.47823, 44.47103, 44.46391,&
- 44.45718, 44.45013, 44.44316, 44.43579, 44.42883,&
- 44.42169, 44.41486, 44.40771, 44.40028, 44.39341,&
- 44.38669, 44.37949, 44.37202, 44.36499, 44.35838,&
- 44.35147, 44.34417, 44.33688, 44.32985, 44.32279,&
- 44.31593, 44.30918, 44.30215, 44.29464, 44.28732,&
- 44.27999, 44.27291, 44.26616, 44.25944, 44.25235,&
- 44.24517, 44.23800, 44.23081, 44.22393, 44.21662,&
- 44.20946, 44.20266, 44.19582, 44.18895, 44.18196,&
- 44.17498, 44.16789  /)
+    TZAIRCRAFT%NID = JI
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT5%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,&
- 0.54813, 0.53613, 0.52410, 0.51125, 0.49815,&
- 0.48593, 0.47312, 0.46084, 0.44829, 0.43635,&
- 0.42374, 0.41321, 0.40397, 0.39536, 0.38761,&
- 0.37986, 0.37280, 0.36554, 0.35794, 0.35061,&
- 0.34350, 0.33612, 0.32785, 0.32066, 0.31451,&
- 0.30861, 0.30376, 0.29840, 0.29296, 0.28726,&
- 0.28162, 0.27583, 0.26994, 0.26423, 0.25891,&
- 0.25323, 0.24778, 0.24212, 0.23624, 0.23064,&
- 0.22502, 0.21967, 0.21392, 0.20841, 0.20143,&
- 0.19328, 0.18381, 0.17339, 0.16261, 0.15162,&
- 0.14002, 0.12849, 0.11740, 0.10678, 0.09554,&
- 0.08426, 0.07307, 0.06239, 0.05099, 0.04032,&
- 0.02923, 0.01810, 0.00646,-0.00451,-0.01539,&
--0.02655,-0.03777,-0.04874,-0.05951,-0.06992,&
--0.08001,-0.08912,-0.09831,-0.10747,-0.11645,&
--0.12552,-0.13428,-0.14260,-0.15142,-0.16039,&
--0.16949,-0.17857,-0.18770,-0.19650,-0.20544,&
--0.21419,-0.22292,-0.23212,-0.24134,-0.25051,&
--0.25963,-0.26837,-0.27772,-0.28662,-0.29513,&
--0.30338,-0.31122,-0.31934,-0.32710,-0.33460,&
--0.34242,-0.35080,-0.35914,-0.36639,-0.37351,&
--0.38158,-0.38999,-0.39802,-0.40577,-0.41337,&
--0.42071,-0.42825,-0.43635,-0.44428,-0.45168,&
--0.45980,-0.46756,-0.47507,-0.48266,-0.49060,&
--0.49836,-0.50612,-0.51447,-0.52244,-0.53007,&
--0.53764,-0.54520,-0.55282,-0.56051,-0.56820,&
--0.57580,-0.58375,-0.59147,-0.59952,-0.60706,&
--0.61472,-0.62227,-0.63041,-0.63860,-0.64631,&
--0.65352,-0.66121,-0.66938,-0.67724,-0.68459,&
--0.69224,-0.70005,-0.70780,-0.71548,-0.72306,&
--0.73052,-0.73777,-0.74522,-0.75335,-0.76142,&
--0.76949,-0.77717,-0.78452,-0.79186,-0.79943,&
--0.80743,-0.81530,-0.82307,-0.83074,-0.83852,&
--0.84620,-0.85372,-0.86115,-0.86912,-0.87743,&
--0.88529,-0.89333  /)
-!
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT5%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT5%SEGP   (TAIRCRAFT5%SEG+1))
-TAIRCRAFT5%SEGP  = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,&
- 999.3, 999.9,1000.4,1000.7,1000.6,&
-1000.8,1000.8,1000.6,1000.5,1000.1,&
- 999.7, 999.2, 999.2, 999.6,1000.5,&
-1001.4,1001.6,1001.7,1001.6,1001.7,&
-1001.9,1002.1,1001.9,1001.8,1001.7,&
-1001.6,1001.7,1001.5,1001.2,1000.9,&
-1000.7,1001.1,1001.5,1001.5,1001.5,&
-1001.5,1001.5,1001.9,1002.2,1002.5,&
-1002.7,1002.4,1001.9,1002.0,1001.9,&
-1002.1,1002.7,1002.6,1002.7,1003.0,&
-1003.2,1003.2,1003.3,1003.3,1003.2,&
-1003.3,1003.4,1003.5,1003.0,1002.0,&
-1000.8, 999.2, 998.3, 998.4, 998.3,&
- 998.9, 999.5,1000.4,1001.9,1002.8,&
-1003.3,1003.1,1001.2, 998.9, 996.9,&
- 995.1, 994.9, 995.4, 995.5, 996.1,&
- 996.5, 996.7, 996.8, 996.5, 996.2,&
- 996.3, 997.2, 997.8, 998.6, 998.8,&
- 997.9, 997.7, 996.8, 995.6, 994.7,&
- 994.1, 993.8, 994.1, 995.1, 996.4,&
- 999.0,1001.4,1002.9,1003.4,1002.7,&
-1002.2,1001.8,1001.5,1001.2,1000.5,&
-1000.0, 999.6, 998.4, 997.8, 997.3,&
- 996.4, 996.5, 996.9, 996.9, 997.0,&
- 997.1, 996.7, 996.9, 997.1, 997.2,&
- 997.2, 997.0, 996.6, 996.0, 995.4,&
- 994.9, 995.3, 996.0, 996.8, 997.4,&
- 997.5, 997.6, 997.8, 998.0, 998.2,&
- 998.3, 998.5, 998.6, 998.6, 998.6,&
- 998.3, 998.0, 998.1, 998.2, 998.1,&
- 997.9, 997.9, 997.5, 997.9, 998.4,&
- 998.2, 997.4, 996.7, 996.1, 995.5,&
- 996.0, 996.3, 996.2, 996.3, 996.0,&
- 995.4, 995.4, 995.3, 994.8, 994.5,&
- 994.1, 994.4  /)
- ELSE
-  ALLOCATE(TAIRCRAFT5%SEGZ   (TAIRCRAFT5%SEG+1))
-  TAIRCRAFT5%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000/)
-ENDIF
-!
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 6
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT6%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT6%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT6%TYPE               = 'AIRCRA'
+  IF ( CTITLE(JI) == '' ) THEN
+    WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
 
-!* aircraft flight name
-!
-TAIRCRAFT6%TITLE             = 'SAIB19B'
-!
-!* time step for storage
-!
-TAIRCRAFT6%STEP             = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFT6%LAUNCH%nyear  =  2007
-TAIRCRAFT6%LAUNCH%nmonth =    04
-TAIRCRAFT6%LAUNCH%nday   =    19
-TAIRCRAFT6%LAUNCH%xtime  = 55992.
-!
-!* number of flight segments
-!
-TAIRCRAFT6%SEG                = 179
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT6%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT6%SEGTIME(TAIRCRAFT6%SEG  ))
-ALLOCATE(TAIRCRAFT6%SEGLAT (TAIRCRAFT6%SEG+1))
-ALLOCATE(TAIRCRAFT6%SEGLON (TAIRCRAFT6%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT6%SEGTIME = (/ 27,   25,   26,   25,   25,   25,&
-   25,   27,   28,   25,   26,   25,&
-   26,   26,   26,   26,   25,   27,&
-   27,   27,   27,   28,   28,   25,&
-   27,   28,   27,   27,   26,   26,&
-   26,   27,   26,   25,   25,   27,&
-   27,   25,   26,   27,   27,   26,&
-   27,   26,   26,   25,   26,   24,&
-   25,   25,   25,   26,   27,   27,&
-   27,   29,   29,   29,   29,   29,&
-   29,   28,   29,   29,   27,   28,&
-   28,   28,   26,   28,   26,   26,&
-   25,   25,   28,   27,   26,   26,&
-   29,   28,   26,   26,   27,   26,&
-   26,   25,   26,   24,   25,   25,&
-   26,   24,   25,   25,   27,   25,&
-   26,   26,   26,   24,   24,   24,&
-   24,   25,   25,   24,   25,   25,&
-   25,   25,   24,   24,   24,   24,&
-   23,   23,   24,   24,   24,   24,&
-   27,   26,   25,   25,   26,   26,&
-   24,   24,   25,   26,   25,   26,&
-   26,   25,   26,   26,   27,   24,&
-   25,   24,   25,   24,   26,   24,&
-   24,   23,   24,   24,   23,   24,&
-   25,   25,   24,   25,   28,   28,&
-   26,   26,   28,   28,   28,   26,&
-   27,   27,   27,   27,   26,   24,&
-   24,   27,   28,   27,   26,   28,&
-   29,   29,   28,   27,   28   /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT6%SEGLAT = (/  44.14614, 44.14841, 44.15199, 44.15888, 44.16587,&
- 44.17280, 44.17953, 44.18641, 44.19343, 44.20074,&
- 44.20752, 44.21445, 44.22139, 44.22865, 44.23605,&
- 44.24331, 44.25045, 44.25722, 44.26426, 44.27113,&
- 44.27801, 44.28496, 44.29233, 44.29944, 44.30612,&
- 44.31311, 44.32038, 44.32756, 44.33466, 44.34155,&
- 44.34851, 44.35557, 44.36279, 44.36982, 44.37671,&
- 44.38379, 44.39117, 44.39831, 44.40499, 44.41186,&
- 44.41907, 44.42637, 44.43340, 44.44051, 44.44749,&
- 44.45439, 44.46129, 44.46847, 44.47526, 44.48238,&
- 44.48966, 44.49706, 44.50420, 44.51117, 44.51802,&
- 44.52483, 44.53217, 44.53939, 44.54629, 44.55308,&
- 44.56001, 44.56696, 44.57396, 44.58110, 44.58836,&
- 44.59549, 44.60253, 44.60947, 44.61647, 44.62329,&
- 44.63051, 44.63757, 44.64473, 44.65168, 44.65879,&
- 44.66629, 44.67335, 44.68004, 44.68665, 44.69401,&
- 44.70118, 44.70651, 44.70872, 44.70757, 44.70296,&
- 44.69641, 44.69022, 44.68403, 44.67814, 44.67201,&
- 44.66553, 44.65876, 44.65247, 44.64606, 44.63975,&
- 44.63345, 44.62765, 44.62149, 44.61525, 44.60889,&
- 44.60281, 44.59667, 44.59043, 44.58400, 44.57706,&
- 44.57080, 44.56535, 44.56024, 44.55582, 44.55158,&
- 44.54727, 44.54317, 44.53909, 44.53488, 44.53082,&
- 44.52674, 44.52256, 44.51820, 44.51381, 44.50985,&
- 44.50597, 44.50180, 44.49769, 44.49378, 44.48980,&
- 44.48562, 44.48126, 44.47710, 44.47292, 44.46873,&
- 44.46366, 44.45784, 44.45107, 44.44347, 44.43597,&
- 44.42798, 44.41978, 44.41116, 44.40333, 44.39528,&
- 44.38766, 44.37943, 44.37150, 44.36297, 44.35491,&
- 44.34703, 44.33932, 44.33142, 44.32336, 44.31518,&
- 44.30685, 44.29949, 44.29657, 44.29762, 44.30213,&
- 44.30973, 44.31706, 44.32385, 44.33065, 44.33810,&
- 44.34583, 44.35311, 44.35997, 44.36612, 44.37085,&
- 44.37429, 44.37605, 44.37683, 44.37769, 44.37856,&
- 44.37956, 44.38060, 44.38176, 44.38285, 44.38399,&
- 44.38503, 44.38596, 44.38687, 44.38787, 44.38900   /)
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT6%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,&
--0.88708,-0.87983,-0.87229,-0.86452,-0.85654,&
--0.84914,-0.84153,-0.83408,-0.82634,-0.81846,&
--0.81096,-0.80323,-0.79569,-0.78779,-0.78020,&
--0.77269,-0.76506,-0.75705,-0.74908,-0.74182,&
--0.73428,-0.72632,-0.71835,-0.71057,-0.70309,&
--0.69558,-0.68793,-0.67997,-0.67218,-0.66448,&
--0.65671,-0.64853,-0.64067,-0.63340,-0.62590,&
--0.61814,-0.61023,-0.60250,-0.59460,-0.58691,&
--0.57916,-0.57164,-0.56390,-0.55623,-0.54843,&
--0.54024,-0.53200,-0.52405,-0.51616,-0.50871,&
--0.50122,-0.49331,-0.48550,-0.47785,-0.47037,&
--0.46268,-0.45501,-0.44730,-0.43928,-0.43133,&
--0.42366,-0.41596,-0.40833,-0.40054,-0.39299,&
--0.38491,-0.37715,-0.36912,-0.36132,-0.35336,&
--0.34495,-0.33715,-0.32974,-0.32263,-0.31464,&
--0.30671,-0.29859,-0.29010,-0.28099,-0.27146,&
--0.26236,-0.25343,-0.24444,-0.23594,-0.22713,&
--0.21787,-0.20837,-0.19956,-0.19056,-0.18158,&
--0.17232,-0.16387,-0.15482,-0.14565,-0.13627,&
--0.12737,-0.11867,-0.10967,-0.10052,-0.09125,&
--0.08213,-0.07306,-0.06374,-0.05342,-0.04236,&
--0.03127,-0.02006,-0.00892, 0.00231, 0.01348,&
- 0.02438, 0.03579, 0.04783, 0.05932, 0.07014,&
- 0.08075, 0.09185, 0.10281, 0.11332, 0.12413,&
- 0.13581, 0.14777, 0.15852, 0.16945, 0.18071,&
- 0.19117, 0.19969, 0.20670, 0.21238, 0.21771,&
- 0.22343, 0.22936, 0.23526, 0.24051, 0.24602,&
- 0.25125, 0.25706, 0.26283, 0.26897, 0.27450,&
- 0.27996, 0.28523, 0.29072, 0.29630, 0.30192,&
- 0.30769, 0.31455, 0.32105, 0.32751, 0.33412,&
- 0.34105, 0.34838, 0.35544, 0.36269, 0.37056,&
- 0.37841, 0.38584, 0.39290, 0.40050, 0.40952,&
- 0.42039, 0.43293, 0.44570, 0.45767, 0.46948,&
- 0.48277, 0.49606, 0.50844, 0.52011, 0.53235,&
- 0.54491, 0.55738, 0.56943, 0.58104, 0.59369   /)
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT6%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT6%SEGP   (TAIRCRAFT6%SEG+1))
-TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,&
- 993.5, 993.2, 993.5, 993.8, 994.1,&
- 994.4, 994.3, 994.3, 994.7, 995.4,&
- 996.0, 996.2, 996.3, 996.1, 996.0,&
- 996.3, 996.5, 996.9, 997.2, 997.1,&
- 996.9, 996.5, 996.2, 995.9, 995.7,&
- 996.0, 996.3, 996.6, 996.3, 995.8,&
- 995.5, 995.3, 995.6, 996.0, 996.1,&
- 996.0, 995.7, 995.4, 994.8, 994.3,&
- 993.8, 993.7, 994.0, 994.6, 995.4,&
- 996.0, 996.4, 996.3, 996.0, 995.6,&
- 995.7, 995.7, 995.5, 995.1, 994.4,&
- 994.1, 994.1, 994.7, 995.6, 996.4,&
- 997.3, 997.8, 998.3, 998.8, 999.1,&
- 999.4, 999.9,1000.5,1000.7,1000.7,&
- 998.7, 996.2, 994.5, 993.0, 992.1,&
- 991.9, 991.3, 991.7, 992.9, 994.4,&
- 996.1, 996.5, 996.5, 996.3, 995.5,&
- 995.0, 994.7, 994.4, 994.7, 995.2,&
- 995.1, 995.1, 995.0, 994.7, 994.7,&
- 994.9, 996.0, 997.9,1000.2,1001.6,&
-1001.7,1001.6,1000.6, 999.7, 999.2,&
- 998.1, 997.5, 997.3, 997.1, 997.2,&
- 998.2, 999.6,1001.1,1002.2,1002.5,&
-1002.2,1001.6,1000.7,1000.3,1000.3,&
-1000.9,1001.2,1001.2,1001.2,1001.2,&
-1001.3,1001.2,1000.8,1000.3,1000.2,&
-1000.3,1000.3,1000.1, 999.5, 999.0,&
- 998.7, 998.9, 999.3, 999.7, 999.4,&
- 999.1, 999.0, 999.1, 999.4, 999.8,&
- 999.7, 999.5, 999.5, 999.3, 999.4,&
- 999.6, 999.2, 999.1, 998.9, 999.2,&
- 999.1, 997.6, 995.9, 993.8, 993.9,&
- 995.9, 998.5,1000.3,1000.3, 999.8,&
- 999.2, 999.2, 999.2, 998.9, 998.4,&
- 997.7, 997.1, 996.8, 996.9, 996.9  /)
- ELSE
-  ALLOCATE(TAIRCRAFT6%SEGZ   (TAIRCRAFT6%SEG+1))
-  TAIRCRAFT6%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000/)
-ENDIF 
-!
-!----------------------------------------------------------------------------
-!
-!
-!*      1.   Aircraft number 7
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT7%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT7%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT7%TYPE               = 'AIRCRA'
+    WRITE( CMNHMSG(1), FMT = '( A, I4 )' ) 'no title given to aircraft number ', JI
+    CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. )
+  END IF
+  TZAIRCRAFT%CTITLE = CTITLE(JI)
 
-!* aircraft flight name
-!
-TAIRCRAFT7%TITLE             = 'TEST_19'
-!
-!* time step for storage
-!
-TAIRCRAFT7%STEP             = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFT7%LAUNCH%nyear  =  2007
-TAIRCRAFT7%LAUNCH%nmonth =    04
-TAIRCRAFT7%LAUNCH%nday   =    19
-TAIRCRAFT7%LAUNCH%xtime  = 43500.
-!
-!* number of flight segments
-!
-TAIRCRAFT7%SEG                = 207
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT7%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT7%SEGTIME(TAIRCRAFT7%SEG  ))
-ALLOCATE(TAIRCRAFT7%SEGLAT (TAIRCRAFT7%SEG+1))
-ALLOCATE(TAIRCRAFT7%SEGLON (TAIRCRAFT7%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT7%SEGTIME = (/  60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60   /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT7%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,&
- 44.39968, 44.39728, 44.39430, 44.38775, 44.37997,&
- 44.37950, 44.37838, 44.37529, 44.37039, 44.36210,&
- 44.35464, 44.35734, 44.37871, 44.39900, 44.41864,&
- 44.43725, 44.45386, 44.47003, 44.46820, 44.45811,&
- 44.45985, 44.46222, 44.46051, 44.46002, 44.45410,&
- 44.45975, 44.47224, 44.47135, 44.46426, 44.45526,&
- 44.46369, 44.47345, 44.46559, 44.45538, 44.45041,&
- 44.46748, 44.48145, 44.47324, 44.46117, 44.44701,&
- 44.44997, 44.46807, 44.45757, 44.44071, 44.42192,&
- 44.40289, 44.38488, 44.37393, 44.37344, 44.37088,&
- 44.36299, 44.35352, 44.34610, 44.33741, 44.32894,&
- 44.31848, 44.30638, 44.29298, 44.27971, 44.26787,&
- 44.25647, 44.24665, 44.23900, 44.22917, 44.21672,&
- 44.19966, 44.18185, 44.16143, 44.13686, 44.11018,&
- 44.08245, 44.05611, 44.02972, 44.00337, 43.97543,&
- 43.95425, 43.93530, 43.91688, 43.89820, 43.89794,&
- 43.90448, 43.89443, 43.88575, 43.89544, 43.88125,&
- 43.86386, 43.84576, 43.82589, 43.80077, 43.77257,&
- 43.74412, 43.71677, 43.68738, 43.66478, 43.64512,&
- 43.62552, 43.60215, 43.57453, 43.54651, 43.53933,&
- 43.55306, 43.55063, 43.53804, 43.51799, 43.50221,&
- 43.49417, 43.48755, 43.47693, 43.49463, 43.50888,&
- 43.50379, 43.50031, 43.49714, 43.49295, 43.49863,&
- 43.49608, 43.49501, 43.49749, 43.49974, 43.50075,&
- 43.49405, 43.50050, 43.49775, 43.49594, 43.49643,&
- 43.50822, 43.50382, 43.50991, 43.52896, 43.54368,&
- 43.55908, 43.57917, 43.60249, 43.62374, 43.64322,&
- 43.66040, 43.67597, 43.69279, 43.70851, 43.72461,&
- 43.74143, 43.75779, 43.77426, 43.78883, 43.79931,&
- 43.80790, 43.81579, 43.82380, 43.83291, 43.84372,&
- 43.85303, 43.86217, 43.88168, 43.90765, 43.93423,&
- 43.96127, 43.98647, 44.01170, 44.03636, 44.06083,&
- 44.08646, 44.11225, 44.14076, 44.17071, 44.19719,&
- 44.21831, 44.23741, 44.25411, 44.27110, 44.28888,&
- 44.30671, 44.32461, 44.34815, 44.37325, 44.39767,&
- 44.42061, 44.44169, 44.46152, 44.47074, 44.45727,&
- 44.43958, 44.42007, 44.39913, 44.37827, 44.35861,&
- 44.35638, 44.36462, 44.37381, 44.37712, 44.37536,&
- 44.37818, 44.38461, 44.39189, 44.39652, 44.39914,&
- 44.40121, 44.40203, 44.39652, 44.39471, 44.39916,&
- 44.39881, 44.39729, 44.39691  /)
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT7%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,&
- 0.65673, 0.62503, 0.59412, 0.56233, 0.53107,&
- 0.49721, 0.46349, 0.42894, 0.39615, 0.36775,&
- 0.33793, 0.31306, 0.29383, 0.27389, 0.25332,&
- 0.23140, 0.20708, 0.18262, 0.17709, 0.21017,&
- 0.21474, 0.19069, 0.17648, 0.20138, 0.21735,&
- 0.19951, 0.17939, 0.17254, 0.19597, 0.20679,&
- 0.18859, 0.16933, 0.18100, 0.20277, 0.20151,&
- 0.18677, 0.16844, 0.17247, 0.19390, 0.20819,&
- 0.19313, 0.17751, 0.18731, 0.22092, 0.25382,&
- 0.28665, 0.31971, 0.35579, 0.39647, 0.43670,&
- 0.47425, 0.51124, 0.54954, 0.58589, 0.62272,&
- 0.65835, 0.69445, 0.73129, 0.76894, 0.80747,&
- 0.84420, 0.87763, 0.90635, 0.93263, 0.95459,&
- 0.96752, 0.97875, 0.98687, 0.99324, 1.00175,&
- 1.01255, 1.02736, 1.04544, 1.06499, 1.08133,&
- 1.09566, 1.10337, 1.10589, 1.11465, 1.11536,&
- 1.09801, 1.10959, 1.12537, 1.10483, 1.09250,&
- 1.08639, 1.08207, 1.07332, 1.07099, 1.07469,&
- 1.08320, 1.09204, 1.09917, 1.09423, 1.08928,&
- 1.09411, 1.09942, 1.10542, 1.10965, 1.11664,&
- 1.10273, 1.10214, 1.12355, 1.14198, 1.17426,&
- 1.21045, 1.24596, 1.25826, 1.23903, 1.21688,&
- 1.21076, 1.22802, 1.23724, 1.24997, 1.22659,&
- 1.23320, 1.25366, 1.23586, 1.22311, 1.24557,&
- 1.25389, 1.23238, 1.23489, 1.25729, 1.24318,&
- 1.21789, 1.21871, 1.23147, 1.20099, 1.16261,&
- 1.12235, 1.08708, 1.05529, 1.02243, 0.98749,&
- 0.95092, 0.91402, 0.87811, 0.84299, 0.80903,&
- 0.77736, 0.74608, 0.71246, 0.68481, 0.66264,&
- 0.64021, 0.61586, 0.59159, 0.56775, 0.54377,&
- 0.51834, 0.49118, 0.46814, 0.45393, 0.44101,&
- 0.42851, 0.41123, 0.39411, 0.37522, 0.35616,&
- 0.34073, 0.32621, 0.31966, 0.31567, 0.31382,&
- 0.30921, 0.30321, 0.29381, 0.28282, 0.27351,&
- 0.28011, 0.29911, 0.31552, 0.29847, 0.27458,&
- 0.25111, 0.22390, 0.19587, 0.17712, 0.20126,&
- 0.22675, 0.25187, 0.27302, 0.29474, 0.31660,&
- 0.34470, 0.37879, 0.41402, 0.44972, 0.48289,&
- 0.51708, 0.55105, 0.58388, 0.61897, 0.65420,&
- 0.68930, 0.72537, 0.76175, 0.77456, 0.75960,&
- 0.76160, 0.76318, 0.76337  /)
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT7%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT7%SEGP   (TAIRCRAFT7%SEG+1))
-TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,&
- 994.3, 995.5, 996.0, 994.8, 995.3,&
- 996.3, 997.7, 997.7, 994.8, 988.4,&
- 993.4, 999.0, 999.4, 999.8,1000.0,&
- 999.6, 999.6, 999.0,1004.0,1006.1,&
- 994.3, 982.4, 970.9, 959.8, 949.9,&
- 941.0, 930.8, 921.5, 912.1, 902.6,&
- 893.6, 884.2, 875.5, 866.6, 857.9,&
- 849.3, 839.5, 829.7, 820.1, 811.1,&
- 803.1, 801.1, 809.7, 819.5, 830.7,&
- 842.1, 851.2, 859.0, 868.3, 877.2,&
- 885.5, 893.1, 900.8, 907.4, 914.0,&
- 923.0, 933.3, 946.2, 959.3, 972.0,&
- 979.4, 976.9, 964.5, 952.8, 941.4,&
- 929.5, 921.1, 920.5, 924.1, 934.8,&
- 943.9, 955.0, 966.2, 981.6, 992.9,&
- 979.6, 966.2, 954.1, 956.0, 963.3,&
- 969.2, 980.9, 981.8, 977.0, 962.5,&
- 948.5, 936.0, 933.5, 939.9, 949.7,&
- 958.2, 965.0, 978.3, 968.7, 956.7,&
- 948.0, 952.6, 964.2, 970.2, 968.3,&
- 968.8, 977.2, 969.8, 971.4, 976.6,&
- 979.5, 981.2, 981.2, 984.3, 972.3,&
- 960.2, 948.7, 938.2, 929.8, 920.7,&
- 911.0, 899.9, 889.6, 879.4, 868.8,&
- 857.8, 847.7, 838.2, 827.8, 818.0,&
- 807.5, 802.2, 801.8, 810.8, 821.9,&
- 835.8, 848.8, 861.7, 874.2, 887.1,&
- 898.9, 911.0, 922.9, 933.6, 943.9,&
- 954.7, 967.1, 983.3, 973.8, 961.5,&
- 950.8, 939.5, 927.4, 915.9, 904.9,&
- 893.7, 886.8, 891.5, 898.0, 905.7,&
- 913.6, 919.8, 926.5, 935.1, 944.1,&
- 954.5, 965.2, 978.6, 992.7, 984.7,&
- 972.1, 959.6, 948.7, 937.5, 926.5,&
- 917.2, 914.4, 924.3, 940.1, 955.8,&
- 971.7, 984.4, 997.4,1000.3,1000.6,&
-1000.7, 999.6,1000.2, 999.4, 997.7,&
- 992.5, 995.8, 999.1, 999.4, 997.4,&
- 997.8, 996.9, 995.8, 996.1, 996.2,&
- 993.5, 994.8, 995.2, 999.8,1012.4,&
-1012.4,1012.4,1012.4   /)
- ELSE
-  ALLOCATE(TAIRCRAFT7%SEGZ   (TAIRCRAFT7%SEG+1))
-  TAIRCRAFT7%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000/)
-ENDIF
-!
-!----------------------------------------------------------------------------
-!
-!
-!
-!*      1.   Aircraft number 8
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT8%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT8%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT8%TYPE               = 'AIRCRA'
+  IF ( CMODEL(JI) == 'FIX' ) THEN
+    IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
+      CMNHMSG(1) = 'invalid NMODEL aircraft ' // TRIM( CTITLE(JI) )
+      CMNHMSG(2) = 'NMODEL must be between 1 and the last nested model number'
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. )
+      NMODEL(JI) = 1
+    END IF
+  ELSE IF ( CMODEL(JI) == 'MOB' ) THEN
+    IF ( NMODEL(JI) /= 0 .AND. NMODEL(JI) /= 1 ) THEN
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT', &
+                      'NMODEL is set to 1 at start for a CMODEL="MOB" aircraft (aircraft ' // TRIM( CTITLE(JI) ) // ')', &
+                      OLOCAL = .TRUE. )
+    END IF
+    IF ( NMODEL_NEST == 1 ) CMODEL(JI) = 'FIX' ! If only one model, FIX and MOB are the same
+    NMODEL(JI) = 1
+  ELSE
+    CMNHMSG(1) = 'invalid CMODEL (' // TRIM( CMODEL(JI) ) // ') for aircraft ' // TRIM( CTITLE(JI) )
+    CMNHMSG(2) = 'CMODEL must be FIX or MOB (default="FIX")'
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. )
+    CMODEL(JI) = 'FIX'
+    NMODEL(JI) = 1
+  END IF
+  TZAIRCRAFT%CMODEL = CMODEL(JI)
+  TZAIRCRAFT%NMODEL = NMODEL(JI)
 
-!* aircraft flight name
-!
-TAIRCRAFT8%TITLE             = 'DIMO22B'
-!
-!* time step for storage
-!
-TAIRCRAFT8%STEP             = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFT8%LAUNCH%nyear  =  2007
-TAIRCRAFT8%LAUNCH%nmonth =    04
-TAIRCRAFT8%LAUNCH%nday   =    22
-TAIRCRAFT8%LAUNCH%xtime  = 45720.
-!
-!* number of flight segments
-!
-TAIRCRAFT8%SEG                =  210
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT8%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT8%SEGTIME(TAIRCRAFT8%SEG  ))
-ALLOCATE(TAIRCRAFT8%SEGLAT (TAIRCRAFT8%SEG+1))
-ALLOCATE(TAIRCRAFT8%SEGLON (TAIRCRAFT8%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT8%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60   /)
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT8%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,&
- 44.39547, 44.38932, 44.38114, 44.37649, 44.37682,&
- 44.37604, 44.37314, 44.36610, 44.35869, 44.35126,&
- 44.36888, 44.38902, 44.41019, 44.43016, 44.44711,&
- 44.46309, 44.46567, 44.46411, 44.46376, 44.46685,&
- 44.45785, 44.46202, 44.46796, 44.45953, 44.46578,&
- 44.45835, 44.45396, 44.46302, 44.46765, 44.45875,&
- 44.46523, 44.47145, 44.46173, 44.46061, 44.47287,&
- 44.47889, 44.46331, 44.46504, 44.47908, 44.48783,&
- 44.47358, 44.46026, 44.47212, 44.47249, 44.45646,&
- 44.43659, 44.41697, 44.40199, 44.38879, 44.37329,&
- 44.35638, 44.33957, 44.32298, 44.31241, 44.30906,&
- 44.30746, 44.30375, 44.29695, 44.28690, 44.27741,&
- 44.26870, 44.25519, 44.23423, 44.21513, 44.19742,&
- 44.18321, 44.16521, 44.13944, 44.11380, 44.09166,&
- 44.07140, 44.05157, 44.03142, 44.01214, 43.99344,&
- 43.97188, 43.94739, 43.92061, 43.89076, 43.87434,&
- 43.89083, 43.89292, 43.87508, 43.85464, 43.83516,&
- 43.81576, 43.79388, 43.76739, 43.76922, 43.77542,&
- 43.74814, 43.71925, 43.69068, 43.66563, 43.64503,&
- 43.62444, 43.60469, 43.58496, 43.56237, 43.54501,&
- 43.55352, 43.55457, 43.54557, 43.54903, 43.54089,&
- 43.52829, 43.51990, 43.51346, 43.50497, 43.49425,&
- 43.49525, 43.49562, 43.50077, 43.49815, 43.49617,&
- 43.49845, 43.49810, 43.49390, 43.49866, 43.50523,&
- 43.49673, 43.49247, 43.49800, 43.50190, 43.49003,&
- 43.48993, 43.50083, 43.50555, 43.48778, 43.48823,&
- 43.48480, 43.47242, 43.47737, 43.49374, 43.50835,&
- 43.52650, 43.54671, 43.56923, 43.58943, 43.61022,&
- 43.63331, 43.65439, 43.67176, 43.68666, 43.70027,&
- 43.71413, 43.72785, 43.74148, 43.75517, 43.76971,&
- 43.78253, 43.79616, 43.80787, 43.81857, 43.82942,&
- 43.83995, 43.84981, 43.85823, 43.86486, 43.87613,&
- 43.89896, 43.92984, 43.96011, 43.98988, 44.01919,&
- 44.04820, 44.07634, 44.10430, 44.13180, 44.15935,&
- 44.18754, 44.21629, 44.24437, 44.27247, 44.30043,&
- 44.32868, 44.35654, 44.38023, 44.40228, 44.42240,&
- 44.44159, 44.45799, 44.47140, 44.45998, 44.44209,&
- 44.42257, 44.40038, 44.37905, 44.36011, 44.35666,&
- 44.36594, 44.37397, 44.37687, 44.37565, 44.37784,&
- 44.38400, 44.39171, 44.39634, 44.39880, 44.40099,&
- 44.40118, 44.39848, 44.39311, 44.39245, 44.39898,&
- 44.39910  /)
+  TZAIRCRAFT%CTYPE = CTYPE(JI)
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT8%SEGLON = (/  0.75057, 0.72578, 0.69760, 0.66704, 0.63457,&
- 0.60222, 0.56878, 0.53642, 0.50398, 0.47225,&
- 0.43953, 0.40789, 0.38031, 0.35008, 0.32169,&
- 0.30147, 0.28060, 0.26058, 0.23973, 0.21616,&
- 0.19367, 0.18236, 0.18502, 0.20778, 0.20656,&
- 0.18370, 0.18703, 0.20372, 0.19130, 0.19682,&
- 0.19357, 0.18506, 0.20504, 0.20853, 0.18918,&
- 0.19966, 0.21438, 0.19613, 0.18009, 0.19803,&
- 0.20224, 0.19336, 0.18564, 0.20677, 0.20731,&
- 0.19554, 0.18745, 0.19135, 0.20223, 0.20453,&
- 0.22417, 0.25282, 0.28740, 0.32278, 0.35850,&
- 0.39281, 0.42680, 0.46075, 0.49942, 0.54027,&
- 0.58128, 0.62144, 0.66096, 0.69920, 0.73827,&
- 0.77681, 0.81271, 0.84190, 0.87282, 0.90619,&
- 0.94117, 0.96868, 0.99038, 1.01055, 1.02558,&
- 1.03116, 1.03574, 1.04032, 1.04706, 1.05803,&
- 1.07306, 1.09104, 1.11081, 1.12296, 1.13651,&
- 1.12012, 1.09442, 1.08149, 1.08005, 1.08059,&
- 1.08087, 1.08126, 1.08118, 1.05870, 1.07019,&
- 1.08092, 1.08959, 1.09857, 1.10259, 1.10139,&
- 1.10055, 1.10282, 1.10878, 1.11744, 1.10495,&
- 1.06783, 1.08647, 1.12371, 1.11720, 1.09692,&
- 1.11863, 1.14779, 1.17939, 1.21196, 1.24465,&
- 1.25333, 1.22210, 1.20875, 1.23017, 1.24679,&
- 1.22657, 1.23285, 1.25139, 1.23305, 1.21876,&
- 1.23712, 1.25495, 1.23643, 1.22729, 1.24422,&
- 1.25601, 1.23404, 1.23452, 1.23818, 1.22150,&
- 1.21730, 1.22441, 1.19372, 1.16127, 1.12640,&
- 1.09446, 1.06388, 1.03469, 1.00273, 0.97325,&
- 0.94589, 0.91633, 0.88300, 0.84659, 0.80979,&
- 0.77679, 0.75144, 0.72825, 0.70681, 0.68546,&
- 0.66167, 0.63855, 0.61353, 0.58770, 0.56178,&
- 0.53561, 0.50932, 0.48310, 0.45312, 0.41403,&
- 0.38316, 0.37315, 0.37027, 0.36942, 0.36485,&
- 0.35752, 0.34676, 0.33433, 0.32168, 0.31139,&
- 0.30504, 0.30198, 0.30551, 0.31093, 0.31540,&
- 0.32043, 0.31453, 0.29134, 0.26964, 0.24912,&
- 0.22493, 0.20110, 0.18452, 0.19842, 0.22297,&
- 0.24828, 0.27199, 0.29414, 0.31429, 0.34416,&
- 0.37748, 0.41231, 0.44685, 0.47991, 0.51294,&
- 0.54640, 0.58024, 0.61466, 0.65004, 0.68542,&
- 0.72044, 0.75565, 0.76069, 0.77374, 0.76079,&
- 0.76013  /)
+  IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', &
+                        'problem with TLAUNCH (not set or incorrect values) for aircraft ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
+  TZAIRCRAFT%TLAUNCH  = TLAUNCH(JI)
 
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFT8%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT8%SEGP   (TAIRCRAFT8%SEG+1))
-TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,&
- 994.3, 995.3, 996.2, 997.4, 996.8,&
- 997.5, 996.0, 989.7, 990.8, 996.2,&
- 999.0, 997.8, 998.4, 999.0, 999.8,&
- 996.0, 985.6, 978.0, 967.9, 959.6,&
- 952.6, 943.8, 934.8, 924.6, 916.9,&
- 907.5, 898.5, 888.8, 879.9, 870.9,&
- 861.3, 852.3, 843.9, 834.5, 825.4,&
- 816.3, 806.4, 797.4, 788.2, 779.6,&
- 770.6, 762.0, 753.3, 745.0, 741.1,&
- 743.1, 748.3, 754.5, 761.4, 768.9,&
- 777.1, 785.5, 794.8, 806.6, 817.8,&
- 829.3, 840.3, 851.4, 862.4, 873.6,&
- 885.4, 896.8, 911.7, 924.7, 933.7,&
- 946.4, 959.8, 973.2, 981.3, 973.2,&
- 957.9, 945.9, 935.4, 923.1, 913.1,&
- 914.1, 923.5, 939.6, 958.2, 970.2,&
- 975.1, 968.2, 954.8, 939.1, 928.3,&
- 917.1, 915.8, 922.7, 933.0, 943.4,&
- 957.9, 970.0, 977.2, 967.0, 955.4,&
- 940.6, 927.1, 916.1, 918.5, 926.5,&
- 940.9, 954.7, 965.0, 972.7, 964.7,&
- 960.1, 959.0, 959.5, 966.5, 973.6,&
- 977.4, 970.8, 960.0, 948.2, 937.7,&
- 929.8, 920.2, 908.4, 899.6, 888.0,&
- 877.9, 866.9, 855.7, 846.6, 836.1,&
- 825.1, 813.8, 805.6, 795.1, 784.2,&
- 775.1, 769.6, 773.5, 780.9, 790.2,&
- 799.0, 812.7, 823.0, 832.8, 843.1,&
- 854.7, 862.0, 873.0, 885.9, 895.8,&
- 895.4, 884.4, 871.9, 864.3, 854.8,&
- 844.0, 833.2, 824.1, 814.2, 805.5,&
- 796.0, 786.3, 777.5, 776.5, 789.1,&
- 803.2, 814.9, 826.4, 834.9, 842.7,&
- 850.2, 861.0, 870.4, 880.3, 891.1,&
- 902.5, 914.6, 927.2, 936.1, 946.8,&
- 961.5, 974.1, 988.2, 993.4, 996.2,&
- 998.3, 995.0, 995.7, 996.1, 995.0,&
- 992.5, 995.4, 996.3, 993.9, 988.9,&
- 992.2, 995.8, 996.7, 995.3, 995.0,&
- 995.6, 995.8, 995.6, 995.4, 994.3,&
- 995.1, 995.0, 986.7, 992.4,1009.3,&
-1010.1  /)
- ELSE
-  ALLOCATE(TAIRCRAFT8%SEGZ   (TAIRCRAFT8%SEG+1))
-  TAIRCRAFT8%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000/)
-ENDIF 
-!
-!
-!*      1.   Aircraft number 9
-!            -----------------
-!
-!* model number
-!
-TAIRCRAFT9%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFT9%MODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFT9%TYPE               = 'AIRCRA'
+  IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', &
+                    'data storage frequency not provided for aircraft ' // TRIM( CTITLE(JI) ) // ' => set to 60s', OLOCAL = .TRUE. )
+    XTSTEP(JI) = 60.
+  ELSE IF ( XTSTEP(JI) <=0. ) THEN
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'invalid data storage frequency for aircraft ' // TRIM( CTITLE(JI) ), &
+                    OLOCAL = .TRUE. )
+    XTSTEP(JI) = 60.
+  END IF
+  TZAIRCRAFT%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
-!* aircraft flight name
-!
-TAIRCRAFT9%TITLE             = 'DIMO23A'
-!
-!* time step for storage
-!
-TAIRCRAFT9%STEP             = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFT9%LAUNCH%nyear  =  2007
-TAIRCRAFT9%LAUNCH%nmonth =    04
-TAIRCRAFT9%LAUNCH%nday   =    23
-TAIRCRAFT9%LAUNCH%xtime  = 28080.
-!
-!* number of flight segments
-!
-TAIRCRAFT9%SEG                =   217
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFT9%ALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFT9%SEGTIME(TAIRCRAFT9%SEG  ))
-ALLOCATE(TAIRCRAFT9%SEGLAT (TAIRCRAFT9%SEG+1))
-ALLOCATE(TAIRCRAFT9%SEGLON (TAIRCRAFT9%SEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFT9%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60 /)
+  IF ( NPOS(JI) < 2 ) THEN
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ), &
+                    OLOCAL = .TRUE. )
+  END IF
+  TZAIRCRAFT%NPOS = NPOS(JI)
 
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT9%SEGLAT = (/  44.39751, 44.39753, 44.39752, 44.39853, 44.40034,&
- 44.39319, 44.38918, 44.39412, 44.40370, 44.40138,&
- 44.39750, 44.39613, 44.39272, 44.38845, 44.38440,&
- 44.38014, 44.37677, 44.37483, 44.36861, 44.35633,&
- 44.33758, 44.31741, 44.29690, 44.27804, 44.28492,&
- 44.30878, 44.33297, 44.35655, 44.37919, 44.40120,&
- 44.42312, 44.44432, 44.46236, 44.47801, 44.46757,&
- 44.46157, 44.45602, 44.45566, 44.47449, 44.47193,&
- 44.45598, 44.45165, 44.47066, 44.47028, 44.45764,&
- 44.45697, 44.47308, 44.46318, 44.45201, 44.46706,&
- 44.47951, 44.46693, 44.45556, 44.46823, 44.46949,&
- 44.47851, 44.49455, 44.51153, 44.52774, 44.54366,&
- 44.55714, 44.56864, 44.57811, 44.58390, 44.58479,&
- 44.58010, 44.57385, 44.56768, 44.56246, 44.55190,&
- 44.53340, 44.50838, 44.49894, 44.48327, 44.46686,&
- 44.45235, 44.43776, 44.42406, 44.40974, 44.39455,&
- 44.37895, 44.36464, 44.35046, 44.33591, 44.32117,&
- 44.30449, 44.28671, 44.26956, 44.25473, 44.23844,&
- 44.22230, 44.20516, 44.18263, 44.15639, 44.13418,&
- 44.13223, 44.13549, 44.13856, 44.14149, 44.14458,&
- 44.14644, 44.15412, 44.16261, 44.16914, 44.17509,&
- 44.18020, 44.18150, 44.17193, 44.17974, 44.18504,&
- 44.18683, 44.16630, 44.14618, 44.16061, 44.17979,&
- 44.19216, 44.18184, 44.16803, 44.15456, 44.16727,&
- 44.18122, 44.17483, 44.17399, 44.17022, 44.16534,&
- 44.16835, 44.16535, 44.16013, 44.16126, 44.15846,&
- 44.14933, 44.14374, 44.15137, 44.16848, 44.17712,&
- 44.19348, 44.22233, 44.25237, 44.28189, 44.31303,&
- 44.34515, 44.37181, 44.38475, 44.38428, 44.38017,&
- 44.37486, 44.37286, 44.37742, 44.38493, 44.39367,&
- 44.39152, 44.38350, 44.38046, 44.38063, 44.38652,&
- 44.39793, 44.41131, 44.42400, 44.43619, 44.44731,&
- 44.45933, 44.47095, 44.47776, 44.48403, 44.49192,&
- 44.50044, 44.51020, 44.52095, 44.53370, 44.54737,&
- 44.55783, 44.56727, 44.57504, 44.58094, 44.58412,&
- 44.58225, 44.57236, 44.55879, 44.54496, 44.53045,&
- 44.51564, 44.50161, 44.48671, 44.47298, 44.45754,&
- 44.44110, 44.42419, 44.40608, 44.38719, 44.36785,&
- 44.35673, 44.36123, 44.37101, 44.37533, 44.37696,&
- 44.37613, 44.38058, 44.38785, 44.39397, 44.39713,&
- 44.39959, 44.40136, 44.40122, 44.39871, 44.39061,&
- 44.39359, 44.39652, 44.38966, 44.39608, 44.39569,&
- 44.39465, 44.40496, 44.40415, 44.39887, 44.39713,&
- 44.39695, 44.39696, 44.39696 /)
+  TZAIRCRAFT%LALTDEF = LALTDEF(JI)
 
+  IF ( CFILE(JI) == '' ) &
+    CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'name of CSV file with trajectory not provided for aircraft ' &
+                    // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFT9%SEGLON = (/  0.76306, 0.76307, 0.76305, 0.76269, 0.74580,&
- 0.74072, 0.76103, 0.77639, 0.75449, 0.71425,&
- 0.68316, 0.65249, 0.61874, 0.58328, 0.55006,&
- 0.51760, 0.48441, 0.45139, 0.42065, 0.39305,&
- 0.37216, 0.35714, 0.34286, 0.32602, 0.30618,&
- 0.29573, 0.28531, 0.27413, 0.26043, 0.24570,&
- 0.23012, 0.21237, 0.18837, 0.17083, 0.18349,&
- 0.20509, 0.19600, 0.19825, 0.19492, 0.20130,&
- 0.19254, 0.19556, 0.19605, 0.20768, 0.19070,&
- 0.19338, 0.19937, 0.20087, 0.19005, 0.19651,&
- 0.20863, 0.20360, 0.19309, 0.19990, 0.20947,&
- 0.18161, 0.14867, 0.11569, 0.08135, 0.04598,&
- 0.00878,-0.03075,-0.07182,-0.11374,-0.15676,&
--0.19923,-0.24111,-0.28194,-0.32286,-0.36105,&
--0.38799,-0.39993,-0.43095,-0.44520,-0.45588,&
--0.47157,-0.48673,-0.50422,-0.52201,-0.53820,&
--0.55361,-0.57117,-0.58856,-0.60501,-0.62178,&
--0.63509,-0.64631,-0.65933,-0.67844,-0.69380,&
--0.70676,-0.71683,-0.72233,-0.72811,-0.74429,&
--0.78257,-0.82472,-0.86568,-0.90634,-0.94853,&
--0.99312,-1.03733,-1.08136,-1.12497,-1.16729,&
--1.20861,-1.24852,-1.24317,-1.24128,-1.26618,&
--1.29450,-1.30808,-1.30763,-1.30267,-1.29873,&
--1.29013,-1.29921,-1.31215,-1.31578,-1.31067,&
--1.30216,-1.30826,-1.32260,-1.30085,-1.30780,&
--1.32801,-1.30845,-1.29379,-1.31837,-1.32354,&
--1.30182,-1.31707,-1.34122,-1.33728,-1.29928,&
--1.26473,-1.24858,-1.23360,-1.21667,-1.20075,&
--1.19259,-1.17065,-1.13473,-1.09576,-1.05647,&
--1.01627,-0.97416,-0.93471,-0.90394,-0.87912,&
--0.85150,-0.82113,-0.79423,-0.76751,-0.74274,&
--0.72071,-0.70026,-0.67875,-0.65563,-0.63129,&
--0.60738,-0.58319,-0.55662,-0.52999,-0.50503,&
--0.48014,-0.45503,-0.42987,-0.40221,-0.36724,&
--0.32885,-0.28896,-0.24699,-0.20322,-0.15936,&
--0.11700,-0.07826,-0.04194,-0.00601, 0.02865,&
- 0.06331, 0.09933, 0.13591, 0.17155, 0.20078,&
- 0.22495, 0.24723, 0.26669, 0.28571, 0.30512,&
- 0.33057, 0.36230, 0.39468, 0.42872, 0.46249,&
- 0.49528, 0.52814, 0.56066, 0.59247, 0.62509,&
- 0.65765, 0.68978, 0.72237, 0.75668, 0.77236,&
- 0.75175, 0.76499, 0.76381, 0.74495, 0.76561,&
- 0.78717, 0.76713, 0.74758, 0.76078, 0.76316,&
- 0.76337, 0.76334, 0.76336  /)
+  ! Allocate trajectory data
+  ALLOCATE( TZAIRCRAFT%XPOSTIME(TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSTIME(:) = XNEGUNDEF
+  ALLOCATE( TZAIRCRAFT%XPOSLAT (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLAT(:)  = XNEGUNDEF
+  ALLOCATE( TZAIRCRAFT%XPOSLON (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLON(:)  = XNEGUNDEF
+  IF ( TZAIRCRAFT%LALTDEF ) THEN
+    ALLOCATE( TZAIRCRAFT%XPOSP (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSP(:)    = XNEGUNDEF
+  ELSE
+    ALLOCATE( TZAIRCRAFT%XPOSZ (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSZ(:)    = XNEGUNDEF
+  END IF
 
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
+  ! Read CSV data (trajectory)
+  CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) )
 
-IF (TAIRCRAFT9%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT9%SEGP   (TAIRCRAFT9%SEG+1))
-TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
- 987.8, 972.7, 959.2, 957.2, 978.1,&
- 993.8, 993.5, 992.9, 995.5, 997.4,&
- 997.7, 998.5, 998.3, 996.8, 997.7,&
-1000.1, 999.3, 998.7, 997.4, 996.2,&
- 998.3,1000.0, 999.9, 999.1, 998.6,&
- 998.5, 998.0, 999.2, 999.1,1009.5,&
-1003.4, 990.2, 978.4, 967.1, 956.2,&
- 945.9, 934.6, 924.2, 912.3, 901.3,&
- 889.8, 878.6, 866.9, 855.7, 844.9,&
- 834.2, 823.0, 812.0, 801.4, 800.1,&
- 806.9, 815.5, 824.4, 834.5, 845.2,&
- 856.3, 870.2, 884.9, 898.2, 913.0,&
- 927.0, 940.6, 953.4, 966.2, 979.8,&
- 992.8,1004.2,1006.7, 993.2, 982.3,&
- 972.7, 962.0, 950.9, 940.8, 928.6,&
- 917.0, 906.2, 895.3, 884.4, 874.0,&
- 864.1, 854.4, 844.5, 834.4, 823.4,&
- 812.3, 803.1, 806.5, 815.1, 824.1,&
- 836.3, 845.1, 854.7, 866.7, 884.2,&
- 903.2, 921.4, 938.5, 953.8, 969.2,&
- 986.8,1000.3,1007.3, 995.3, 983.3,&
- 986.5,1005.5,1005.5, 994.9, 985.4,&
- 973.9, 964.7, 954.5, 945.0, 935.2,&
- 924.2, 913.1, 902.7, 891.8, 881.8,&
- 871.0, 860.2, 850.3, 839.9, 830.3,&
- 820.3, 809.5, 801.3, 802.9, 813.4,&
- 825.9, 839.4, 855.4, 874.2, 894.0,&
- 909.5, 925.8, 940.5, 955.0, 969.2,&
- 983.7,1000.0,1008.1,1000.5, 988.9,&
- 982.3, 972.7, 960.7, 951.3, 939.8,&
- 929.0, 915.4, 904.9, 895.4, 884.3,&
- 873.4, 863.1, 852.1, 840.5, 829.5,&
- 819.2, 809.6, 800.6, 801.4, 809.6,&
- 818.1, 829.6, 840.8, 854.8, 868.4,&
- 882.0, 894.2, 908.1, 922.9, 937.5,&
- 950.9, 967.8, 987.5,1003.2,1005.1,&
-1003.5,1003.3,1002.4,1002.3,1002.0,&
- 995.6, 995.5, 998.5, 999.5,1000.3,&
-1000.6, 999.6, 998.8, 999.2, 998.0,&
- 997.3, 995.4, 995.1, 998.1, 988.4,&
- 976.2, 965.3, 956.4, 945.6, 947.8,&
- 965.9, 985.1,1003.1,1013.9,1013.9,&
-1013.9,1013.9,1013.9  /)
- ELSE
-  ALLOCATE(TAIRCRAFT9%SEGZ   (TAIRCRAFT9%SEG+1))
-  TAIRCRAFT9%SEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000/)
-ENDIF
+END DO
+
+IF ( NAIRCRAFTS > 0 ) CALL AIRCRAFTS_NML_DEALLOCATE()
 !
 !----------------------------------------------------------------------------
 !
 !
 END SUBROUTINE INI_AIRCRAFT
+
+
+SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA
+
+USE MODE_DATETIME
+USE MODE_MSG
+
+IMPLICIT NONE
+
+TYPE(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT
+CHARACTER(LEN=*),    INTENT(IN)    :: HFILE !Name of the CSV file with the aircraft trajectory
+
+CHARACTER(LEN=NMAXLINELGT) :: YSTRING
+INTEGER                    :: ILU      ! logical unit of the file
+INTEGER                    :: JI
+REAL                       :: ZLAT, ZLON, ZALT
+REAL                       :: ZTIME
+
+! Open file
+OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' )
+
+READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it)
+
+DO JI = 1, TPAIRCRAFT%NPOS
+  ! Read aircraft position
+  READ( ILU, END = 101, FMT = '(A)' ) YSTRING
+
+  READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT
+
+  TPAIRCRAFT%XPOSTIME(JI) = ZTIME
+  TPAIRCRAFT%XPOSLAT(JI)  = ZLAT
+  TPAIRCRAFT%XPOSLON(JI)  = ZLON
+  IF ( TPAIRCRAFT%LALTDEF ) THEN
+    TPAIRCRAFT%XPOSP(JI)  = ZALT * 100. ! *100 to convert from hPa to Pa
+  ELSE
+    TPAIRCRAFT%XPOSZ(JI)  = ZALT
+  END IF
+END DO
+
+101 CONTINUE
+
+CLOSE( ILU )
+
+IF ( JI < TPAIRCRAFT%NPOS ) &
+  CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ), OLOCAL = .TRUE. )
+
+TPAIRCRAFT%TLAND = TPAIRCRAFT%TLAUNCH + TPAIRCRAFT%XPOSTIME(TPAIRCRAFT%NPOS)
+
+END SUBROUTINE AIRCRAFT_CSV_READ
+
+END MODULE MODE_INI_AIRCRAFT
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index cdb990bb73ae06e3440e85858b68161bc9806c92..48f7b1e22d81e0dde1c15933169240920de14843 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -1,51 +1,33 @@
-!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
 ! Modifications:
 !  P. Wautelet 01/10/2020: bugfix: DEFAULT_FLYER: add missing default values
+!  P. Wautelet    06/2022: reorganize flyers
+!  P. Wautelet 25/08/2022: write balloon positions in netCDF4 files inside HDF5 groups
 !-----------------------------------------------------------------
 
-!      #########################
-MODULE MODI_INI_AIRCRAFT_BALLOON
-!      #########################
-!
-INTERFACE
-!
-      SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE,                    &
-                                      PTSTEP, TPDTSEG, PSEGLEN,     &
-                                      KRR, KSV, KKU, OUSETKE,       &
-                                      PLATOR, PLONOR                )
-!
-USE MODD_IO, ONLY: TFILEDATA
-USE MODD_TYPE_DATE
-!
-TYPE(TFILEDATA),    INTENT(IN) :: TPINIFILE !Initial file
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-TYPE(DATE_TIME),    INTENT(IN) :: TPDTSEG ! segment date and time
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-INTEGER,            INTENT(IN) :: KKU     ! number of vertical levels 
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
-REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
-REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
-!
-!-------------------------------------------------------------------------------
-!
-END SUBROUTINE INI_AIRCRAFT_BALLOON
-!
-END INTERFACE
-!
-END MODULE MODI_INI_AIRCRAFT_BALLOON
-!
-!     ###############################################################
-      SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE,                    &
-                                      PTSTEP, TPDTSEG, PSEGLEN,     &
-                                      KRR, KSV, KKU, OUSETKE,       &
-                                      PLATOR, PLONOR                )
-!     ###############################################################
+!###############################
+MODULE MODE_INI_AIRCRAFT_BALLOON
+!###############################
+
+USE MODE_MSG
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: ALLOCATE_FLYER, DEALLOCATE_FLYER
+
+PUBLIC :: INI_AIRCRAFT_BALLOON
+
+CONTAINS
+
+!     ############################################################
+      SUBROUTINE INI_AIRCRAFT_BALLOON( TPINIFILE, PLATOR, PLONOR )
+!     ############################################################
 !
 !
 !!****  *INI_AIRCRAFT_BALLOON* -
@@ -86,36 +68,24 @@ END MODULE MODI_INI_AIRCRAFT_BALLOON
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF
-USE MODD_DIAG_FLAG
-USE MODD_DYN_n
-use modd_field,      only: tfielddata, TYPEREAL
-USE MODD_GRID
-USE MODD_IO,         ONLY: TFILEDATA
-USE MODD_LUNIT_n,    ONLY: TLUOUT
-USE MODD_PARAM_n,    ONLY: CCLOUD
-USE MODD_PARAMETERS
+USE MODD_CONF,       ONLY: CPROGRAM
+USE MODD_DIAG_FLAG,  ONLY: LAIRCRAFT_BALLOON, NTIME_AIRCRAFT_BALLOON, &
+                           XALT_BALLOON, XLAT_BALLOON, XLON_BALLOON, XSTEP_AIRCRAFT_BALLOON
+USE MODD_DYN_n,      ONLY: DYN_MODEL
+USE MODD_IO,         ONLY: ISP, TFILEDATA
+USE MODD_PARAMETERS, ONLY: NUNDEF
 !
-USE MODE_GRIDPROJ
-USE MODE_ll
-USE MODE_MODELN_HANDLER
-USE MODE_MSG
+USE MODE_GRIDPROJ,       ONLY: SM_XYHAT
+USE MODE_INI_AIRCRAFT,   ONLY: INI_AIRCRAFT
+USE MODE_INI_BALLOON,    ONLY: INI_BALLOON
+USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX
 !
-USE MODI_INI_BALLOON
-USE MODI_INI_AIRCRAFT
 !
 IMPLICIT NONE
 !
 !*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),    INTENT(IN) :: TPINIFILE !Initial file
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-TYPE(DATE_TIME),    INTENT(IN) :: TPDTSEG ! segment date and time
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-INTEGER,            INTENT(IN) :: KKU     ! number of vertical levels 
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
 REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
 REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
 !
@@ -124,16 +94,11 @@ REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
 !       0.2  declaration of local variables
 !
 INTEGER :: IMI    ! current model index
-INTEGER :: ISTORE ! number of storage instants
-INTEGER :: ILUOUT ! logical unit
-INTEGER :: IRESP  ! return code
-INTEGER :: JSEG   ! loop counter
-TYPE(TFIELDDATA) :: TZFIELD
+INTEGER :: JI
 !
 !----------------------------------------------------------------------------
 !
 IMI=GET_CURRENT_MODEL_INDEX()
-ILUOUT = TLUOUT%NLU
 !----------------------------------------------------------------------------
 !
 !*      1.   Default values
@@ -142,517 +107,581 @@ ILUOUT = TLUOUT%NLU
 IF ( CPROGRAM == 'DIAG  ') THEN
   IF ( .NOT. LAIRCRAFT_BALLOON ) RETURN
   IF (NTIME_AIRCRAFT_BALLOON == NUNDEF .OR. XSTEP_AIRCRAFT_BALLOON == XUNDEF) THEN
-    WRITE(ILUOUT,*) "NTIME_AIRCRAFT_BALLOON and/or  XSTEP_AIRCRAFT_BALLOON not initialized in DIAG "
-    WRITE(ILUOUT,*) "No calculations for Balloons and Aircraft"
+    CMNHMSG(1) = "NTIME_AIRCRAFT_BALLOON and/or XSTEP_AIRCRAFT_BALLOON not initialized in DIAG "
+    CMNHMSG(2) = "No calculations for Balloons and Aircraft"
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT_BALLOON' )
+
     LAIRCRAFT_BALLOON=.FALSE.
     RETURN
   ENDIF
 ENDIF
-!
-!
-IF ( IMI == 1 ) THEN
-  LFLYER=.FALSE.
-!
-  CALL DEFAULT_FLYER(TBALLOON1)
-  CALL DEFAULT_FLYER(TBALLOON2)
-  CALL DEFAULT_FLYER(TBALLOON3)
-  CALL DEFAULT_FLYER(TBALLOON4)
-  CALL DEFAULT_FLYER(TBALLOON5)
-  CALL DEFAULT_FLYER(TBALLOON6)
-  CALL DEFAULT_FLYER(TBALLOON7)
-  CALL DEFAULT_FLYER(TBALLOON8)
-  CALL DEFAULT_FLYER(TBALLOON9)
-!
-  CALL DEFAULT_FLYER(TAIRCRAFT1)
-  CALL DEFAULT_FLYER(TAIRCRAFT2)
-  CALL DEFAULT_FLYER(TAIRCRAFT3)
-  CALL DEFAULT_FLYER(TAIRCRAFT4)
-  CALL DEFAULT_FLYER(TAIRCRAFT5)
-  CALL DEFAULT_FLYER(TAIRCRAFT6)
-  CALL DEFAULT_FLYER(TAIRCRAFT7)
-  CALL DEFAULT_FLYER(TAIRCRAFT8)
-  CALL DEFAULT_FLYER(TAIRCRAFT9)
-  CALL DEFAULT_FLYER(TAIRCRAFT10)
-  CALL DEFAULT_FLYER(TAIRCRAFT11)
-  CALL DEFAULT_FLYER(TAIRCRAFT12)
-  CALL DEFAULT_FLYER(TAIRCRAFT13)
-  CALL DEFAULT_FLYER(TAIRCRAFT14)
-  CALL DEFAULT_FLYER(TAIRCRAFT15)
-  CALL DEFAULT_FLYER(TAIRCRAFT16)
-  CALL DEFAULT_FLYER(TAIRCRAFT17)
-  CALL DEFAULT_FLYER(TAIRCRAFT18)
-  CALL DEFAULT_FLYER(TAIRCRAFT19)
-  CALL DEFAULT_FLYER(TAIRCRAFT20)
-  CALL DEFAULT_FLYER(TAIRCRAFT21)
-  CALL DEFAULT_FLYER(TAIRCRAFT22)
-  CALL DEFAULT_FLYER(TAIRCRAFT23)
-  CALL DEFAULT_FLYER(TAIRCRAFT24)
-  CALL DEFAULT_FLYER(TAIRCRAFT25)
-  CALL DEFAULT_FLYER(TAIRCRAFT26)
-  CALL DEFAULT_FLYER(TAIRCRAFT27)
-  CALL DEFAULT_FLYER(TAIRCRAFT28)
-  CALL DEFAULT_FLYER(TAIRCRAFT29)
-  CALL DEFAULT_FLYER(TAIRCRAFT30)
-END IF
+
+IF ( NAIRCRAFTS > 0 .OR. NBALLOONS > 0 ) LFLYER = .TRUE.
 !
 !----------------------------------------------------------------------------
 !
 !*      2.   Balloon initialization
 !            ----------------------
-IF (IMI == 1) CALL INI_BALLOON
-!
-CALL INI_LAUNCH(1,TBALLOON1)
-CALL INI_LAUNCH(2,TBALLOON2)
-CALL INI_LAUNCH(3,TBALLOON3)
-CALL INI_LAUNCH(4,TBALLOON4)
-CALL INI_LAUNCH(5,TBALLOON5)
-CALL INI_LAUNCH(6,TBALLOON6)
-CALL INI_LAUNCH(7,TBALLOON7)
-CALL INI_LAUNCH(8,TBALLOON8)
-CALL INI_LAUNCH(9,TBALLOON9)
+IF ( IMI == 1 ) THEN
+  ALLOCATE( NRANKCUR_BALLOON (NBALLOONS) ); NRANKCUR_BALLOON = NFLYER_DEFAULT_RANK
+  ALLOCATE( NRANKNXT_BALLOON (NBALLOONS) ); NRANKNXT_BALLOON = NFLYER_DEFAULT_RANK
+
+  ALLOCATE( TBALLOONS(NBALLOONS) )
+END IF
+
+! Flyers are at first only initialized on 1 process. Data will be transfered later on the right processes
+IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
+  IF ( IMI == 1 ) CALL INI_BALLOON
+
+  DO JI = 1, NBALLOONS
+    CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON )
+  END DO
+END IF
 !
 !----------------------------------------------------------------------------
 !
 !*      3.   Aircraft initialization
 !            -----------------------
 !
-IF (IMI == 1) CALL INI_AIRCRAFT
-!
-CALL INI_FLIGHT(1,TAIRCRAFT1)
-CALL INI_FLIGHT(2,TAIRCRAFT2)
-CALL INI_FLIGHT(3,TAIRCRAFT3)
-CALL INI_FLIGHT(4,TAIRCRAFT4)
-CALL INI_FLIGHT(5,TAIRCRAFT5)
-CALL INI_FLIGHT(6,TAIRCRAFT6)
-CALL INI_FLIGHT(7,TAIRCRAFT7)
-CALL INI_FLIGHT(8,TAIRCRAFT8)
-CALL INI_FLIGHT(9,TAIRCRAFT9)
-CALL INI_FLIGHT(10,TAIRCRAFT10)
-CALL INI_FLIGHT(11,TAIRCRAFT11)
-CALL INI_FLIGHT(12,TAIRCRAFT12)
-CALL INI_FLIGHT(13,TAIRCRAFT13)
-CALL INI_FLIGHT(14,TAIRCRAFT14)
-CALL INI_FLIGHT(15,TAIRCRAFT15)
-CALL INI_FLIGHT(16,TAIRCRAFT16)
-CALL INI_FLIGHT(17,TAIRCRAFT17)
-CALL INI_FLIGHT(18,TAIRCRAFT18)
-CALL INI_FLIGHT(19,TAIRCRAFT19)
-CALL INI_FLIGHT(20,TAIRCRAFT20)
-CALL INI_FLIGHT(21,TAIRCRAFT21)
-CALL INI_FLIGHT(22,TAIRCRAFT22)
-CALL INI_FLIGHT(23,TAIRCRAFT23)
-CALL INI_FLIGHT(24,TAIRCRAFT24)
-CALL INI_FLIGHT(25,TAIRCRAFT25)
-CALL INI_FLIGHT(26,TAIRCRAFT26)
-CALL INI_FLIGHT(27,TAIRCRAFT27)
-CALL INI_FLIGHT(28,TAIRCRAFT28)
-CALL INI_FLIGHT(29,TAIRCRAFT29)
-CALL INI_FLIGHT(30,TAIRCRAFT30)
+IF ( IMI == 1 ) THEN
+  ALLOCATE( NRANKCUR_AIRCRAFT(NAIRCRAFTS) ); NRANKCUR_AIRCRAFT = NFLYER_DEFAULT_RANK
+  ALLOCATE( NRANKNXT_AIRCRAFT(NAIRCRAFTS) ); NRANKNXT_AIRCRAFT = NFLYER_DEFAULT_RANK
+
+  ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
+END IF
+
+! Flyers are at first only initialized on 1 process. Data will be transfered later on the right processes
+IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
+  IF ( IMI == 1 ) CALL INI_AIRCRAFT
+
+  DO JI = 1, NAIRCRAFTS
+    CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT )
+  END DO
+END IF
 !
 !----------------------------------------------------------------------------
 !
 !*      4.   Allocations of storage arrays
 !            -----------------------------
 !
-IF (.NOT. LFLYER) RETURN
-!
-CALL ALLOCATE_FLYER(TBALLOON1)
-CALL ALLOCATE_FLYER(TBALLOON2)
-CALL ALLOCATE_FLYER(TBALLOON3)
-CALL ALLOCATE_FLYER(TBALLOON4)
-CALL ALLOCATE_FLYER(TBALLOON5)
-CALL ALLOCATE_FLYER(TBALLOON6)
-CALL ALLOCATE_FLYER(TBALLOON7)
-CALL ALLOCATE_FLYER(TBALLOON8)
-CALL ALLOCATE_FLYER(TBALLOON9)
-!
-CALL ALLOCATE_FLYER(TAIRCRAFT1)
-CALL ALLOCATE_FLYER(TAIRCRAFT2)
-CALL ALLOCATE_FLYER(TAIRCRAFT3)
-CALL ALLOCATE_FLYER(TAIRCRAFT4)
-CALL ALLOCATE_FLYER(TAIRCRAFT5)
-CALL ALLOCATE_FLYER(TAIRCRAFT6)
-CALL ALLOCATE_FLYER(TAIRCRAFT7)
-CALL ALLOCATE_FLYER(TAIRCRAFT8)
-CALL ALLOCATE_FLYER(TAIRCRAFT9)
-CALL ALLOCATE_FLYER(TAIRCRAFT10)
-CALL ALLOCATE_FLYER(TAIRCRAFT11)
-CALL ALLOCATE_FLYER(TAIRCRAFT12)
-CALL ALLOCATE_FLYER(TAIRCRAFT13)
-CALL ALLOCATE_FLYER(TAIRCRAFT14)
-CALL ALLOCATE_FLYER(TAIRCRAFT15)
-CALL ALLOCATE_FLYER(TAIRCRAFT16)
-CALL ALLOCATE_FLYER(TAIRCRAFT17)
-CALL ALLOCATE_FLYER(TAIRCRAFT18)
-CALL ALLOCATE_FLYER(TAIRCRAFT19)
-CALL ALLOCATE_FLYER(TAIRCRAFT20)
-CALL ALLOCATE_FLYER(TAIRCRAFT21)
-CALL ALLOCATE_FLYER(TAIRCRAFT22)
-CALL ALLOCATE_FLYER(TAIRCRAFT23)
-CALL ALLOCATE_FLYER(TAIRCRAFT24)
-CALL ALLOCATE_FLYER(TAIRCRAFT25)
-CALL ALLOCATE_FLYER(TAIRCRAFT26)
-CALL ALLOCATE_FLYER(TAIRCRAFT27)
-CALL ALLOCATE_FLYER(TAIRCRAFT28)
-CALL ALLOCATE_FLYER(TAIRCRAFT29)
-CALL ALLOCATE_FLYER(TAIRCRAFT30)
+IF ( IMI == 1 .AND. ISP == NFLYER_DEFAULT_RANK ) THEN
+  DO JI = 1, NBALLOONS
+    CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
+  END DO
+
+  DO JI = 1, NAIRCRAFTS
+    CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT )
+  END DO
+END IF
 !
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
 CONTAINS
 !
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_FLYER(TPFLYER)
-!
-TYPE(FLYER), INTENT(OUT) :: TPFLYER
-!
-!
-TPFLYER%NMODEL = 0
-TPFLYER%MODEL = 'FIX'
-TPFLYER%TYPE   = '      '
-TPFLYER%TITLE  = '        '
-TPFLYER%LAUNCH = TPDTSEG
-TPFLYER%CRASH  = .FALSE.
-TPFLYER%FLY    = .FALSE.
-!
-TPFLYER%T_CUR  = XUNDEF
-TPFLYER%N_CUR  = 0
-TPFLYER%STEP   = 60.     ! s
-!
-TPFLYER%LAT     = XUNDEF
-TPFLYER%LON     = XUNDEF
-TPFLYER%XLAUNCH = XUNDEF! X coordinate of launch
-TPFLYER%YLAUNCH = XUNDEF! Y coordinate of launch
-TPFLYER%ALT     = XUNDEF
-TPFLYER%WASCENT = 5.     ! m/s
-TPFLYER%RHO     = XUNDEF
-TPFLYER%PRES    = XUNDEF
-TPFLYER%DIAMETER= XUNDEF
-TPFLYER%AERODRAG= XUNDEF
-TPFLYER%INDDRAG = XUNDEF
-TPFLYER%VOLUME  = XUNDEF
-TPFLYER%MASS    = XUNDEF
-!
-TPFLYER%SEG     = 0
-TPFLYER%SEGCURN = 1
-TPFLYER%SEGCURT = 0.
-!
-TPFLYER%ALTDEF   = .FALSE.
-!
-TPFLYER%X_CUR   = XUNDEF
-TPFLYER%Y_CUR   = XUNDEF
-TPFLYER%Z_CUR   = XUNDEF
-TPFLYER%P_CUR   = XUNDEF
-!
-END SUBROUTINE DEFAULT_FLYER
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE ALLOCATE_FLYER(TPFLYER)
-!
-!
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
-!
-IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
-IF (IMI /= TPFLYER%NMODEL .AND. .NOT. (IMI==1 .AND. TPFLYER%NMODEL==0) ) RETURN
-!
-IF ( CPROGRAM == 'DIAG  ' ) THEN
-  ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%STEP ) + 1
-ELSE
-  ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1
-ENDIF
-!
-IF (TPFLYER%NMODEL == 0) ISTORE=0
-IF (TPFLYER%NMODEL > 0) THEN
-  WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%TITLE,' nmodel=',TPFLYER%NMODEL
-ENDIF
-!
-!
-allocate( tpflyer%tpdates(istore) )
-ALLOCATE(TPFLYER%X   (ISTORE))
-ALLOCATE(TPFLYER%Y   (ISTORE))
-ALLOCATE(TPFLYER%Z   (ISTORE))
-ALLOCATE(TPFLYER%XLON(ISTORE))
-ALLOCATE(TPFLYER%YLAT(ISTORE))
-ALLOCATE(TPFLYER%ZON (ISTORE))
-ALLOCATE(TPFLYER%MER (ISTORE))
-ALLOCATE(TPFLYER%W   (ISTORE))
-ALLOCATE(TPFLYER%P   (ISTORE))
-ALLOCATE(TPFLYER%TH  (ISTORE))
-ALLOCATE(TPFLYER%R   (ISTORE,KRR))
-ALLOCATE(TPFLYER%SV  (ISTORE,KSV))
-ALLOCATE(TPFLYER%RTZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%RZ (ISTORE,KKU,KRR))
-ALLOCATE(TPFLYER%FFZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%IWCZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%LWCZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%CIZ (ISTORE,KKU))
-IF (CCLOUD=='LIMA') THEN
-  ALLOCATE(TPFLYER%CCZ  (ISTORE,KKU))
-  ALLOCATE(TPFLYER%CRZ  (ISTORE,KKU))
-ENDIF
-ALLOCATE(TPFLYER%CRARE(ISTORE,KKU))
-ALLOCATE(TPFLYER%CRARE_ATT(ISTORE,KKU))
-ALLOCATE(TPFLYER%WZ(ISTORE,KKU))
-ALLOCATE(TPFLYER%ZZ(ISTORE,KKU))
-IF (OUSETKE) THEN
-  ALLOCATE(TPFLYER%TKE (ISTORE))
-ELSE
-  ALLOCATE(TPFLYER%TKE (0))
-END IF
-ALLOCATE(TPFLYER%TKE_DISS(ISTORE))
-ALLOCATE(TPFLYER%TSRAD (ISTORE))
-ALLOCATE(TPFLYER%ZS  (ISTORE))
-!
-ALLOCATE(TPFLYER%THW_FLUX  (ISTORE))
-ALLOCATE(TPFLYER%RCW_FLUX  (ISTORE))
-ALLOCATE(TPFLYER%SVW_FLUX  (ISTORE,KSV))
-!
-TPFLYER%X        = XUNDEF
-TPFLYER%Y        = XUNDEF
-TPFLYER%Z        = XUNDEF
-TPFLYER%XLON     = XUNDEF
-TPFLYER%YLAT     = XUNDEF
-TPFLYER%ZON      = XUNDEF
-TPFLYER%MER      = XUNDEF
-TPFLYER%W        = XUNDEF
-TPFLYER%P        = XUNDEF
-TPFLYER%TH       = XUNDEF
-TPFLYER%R        = XUNDEF
-TPFLYER%SV       = XUNDEF
-TPFLYER%RTZ      = XUNDEF
-TPFLYER%RZ       = XUNDEF
-TPFLYER%FFZ      = XUNDEF
-TPFLYER%CIZ      = XUNDEF
-IF (CCLOUD=='LIMA') THEN
-  TPFLYER%CRZ      = XUNDEF
-  TPFLYER%CCZ      = XUNDEF
-ENDIF
-TPFLYER%IWCZ     = XUNDEF
-TPFLYER%LWCZ     = XUNDEF
-XLAM_CRAD        = 3.154E-3 ! (in m) <=> 95.04 GHz = Rasta cloud radar frequency
-TPFLYER%CRARE    = XUNDEF
-TPFLYER%CRARE_ATT= XUNDEF
-TPFLYER%WZ= XUNDEF
-TPFLYER%ZZ= XUNDEF
-TPFLYER%TKE      = XUNDEF
-TPFLYER%TSRAD    = XUNDEF
-TPFLYER%ZS       = XUNDEF
-TPFLYER%TKE_DISS = XUNDEF
-!
-TPFLYER%THW_FLUX        = XUNDEF
-TPFLYER%RCW_FLUX        = XUNDEF
-TPFLYER%SVW_FLUX        = XUNDEF
-END SUBROUTINE ALLOCATE_FLYER
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
 SUBROUTINE INI_LAUNCH(KNBR,TPFLYER)
-!
+
+#ifdef MNH_IOCDF4
+USE NETCDF,             ONLY: NF90_INQ_NCID, NF90_NOERR
+#endif
+
+use modd_field,         only: tfieldmetadata, TYPEREAL
+USE MODD_IO,            ONLY: GSMONOPROC, ISP, TFILEDATA
+#ifdef MNH_IOCDF4
+USE MODD_PRECISION,     ONLY: CDFINT
+#endif
+USE MODD_TIME_n,        ONLY: TDTCUR
+
 use MODE_IO_FIELD_READ, only: IO_Field_read
-!
-INTEGER,     INTENT(IN)    :: KNBR
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
-!
-!
-!
-!*      0.2  declaration of local variables
-!
+
+INTEGER,             INTENT(IN)    :: KNBR
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
+
+#ifdef MNH_IOCDF4
+INTEGER(KIND=CDFINT) :: IGROUPID
+INTEGER(KIND=CDFINT) :: ISTATUS
+#endif
+INTEGER :: IMODEL
+INTEGER :: IRESP  ! return code
+LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC
+LOGICAL :: GREAD ! True if balloon position was read in synchronous file
 REAL :: ZLAT ! latitude of the balloon
 REAL :: ZLON ! longitude of the balloon
-!
-IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
-IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
+#ifdef MNH_IOCDF4
+TYPE(TFILEDATA) :: TZFILE
+#endif
+TYPE(TFIELDMETADATA) :: TZFIELD
+
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
-!
-LFLYER=.TRUE.
-!
-IF (TPFLYER%TITLE=='          ') THEN
-  WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR
-END IF
-!
+
+GREAD = .FALSE.
+
+! Save GSMONOPROC value
+OMONOPROC_SAVE = GSMONOPROC
+! Force GSMONOPROC to true to allow IO_Field_read on only 1 process! (not very clean hack)
+GSMONOPROC = .TRUE.
+
+CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH )
+
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
-  ! read the current location in the FM_FILE
-  !
-  TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'degree'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP)
-  !
-  IF ( IRESP /= 0 ) THEN
-    WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE
+  ! Read the current location in the synchronous file
+
+  IF ( TPINIFILE%CFORMAT == 'LFI'                                                             &
+       .OR. ( TPINIFILE%CFORMAT == 'NETCDF4' .AND.                                            &
+              (        TPINIFILE%NMNHVERSION(1) < 5                                           &
+                .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) ) ) THEN
+    ! Read in LFI file or in old format if netCDF (MesoNH < 5.6)
+    TZFIELD = TFIELDMETADATA(                   &
+      CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LAT', &
+      CSTDNAME   = '',                          &
+      CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LAT', &
+      CUNITS     = 'degree',                    &
+      CDIR       = '--',                        &
+      CCOMMENT   = '',                          &
+      NGRID      = 0,                           &
+      NTYPE      = TYPEREAL,                    &
+      NDIMS      = 0,                           &
+      LTIMEDEP   = .TRUE.                       )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP)
+
+    IF ( IRESP == 0 ) THEN
+      GREAD = .TRUE.
+
+      TZFIELD = TFIELDMETADATA(                   &
+        CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LON', &
+        CSTDNAME   = '',                          &
+        CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LON', &
+        CUNITS     = 'degree',                    &
+        CDIR       = '--',                        &
+        CCOMMENT   = '',                          &
+        NGRID      = 0,                           &
+        NTYPE      = TYPEREAL,                    &
+        NDIMS      = 0,                           &
+        LTIMEDEP   = .TRUE.                       )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON)
+
+      TZFIELD = TFIELDMETADATA(                   &
+        CMNHNAME   = TRIM(TPFLYER%CTITLE)//'ALT', &
+        CSTDNAME   = '',                          &
+        CLONGNAME  = TRIM(TPFLYER%CTITLE)//'ALT', &
+        CUNITS     = 'm',                         &
+        CDIR       = '--',                        &
+        CCOMMENT   = '',                          &
+        NGRID      = 0,                           &
+        NTYPE      = TYPEREAL,                    &
+        NDIMS      = 0,                           &
+        LTIMEDEP   = .TRUE.                       )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XZ_CUR)
+
+      TZFIELD = TFIELDMETADATA(                       &
+        CMNHNAME   = TRIM(TPFLYER%CTITLE)//'WASCENT', &
+        CSTDNAME   = '',                              &
+        CLONGNAME  = TRIM(TPFLYER%CTITLE)//'WASCENT', &
+        CUNITS     = 'm s-1',                         &
+        CDIR       = '--',                            &
+        CCOMMENT   = '',                              &
+        NGRID      = 0,                               &
+        NTYPE      = TYPEREAL,                        &
+        NDIMS      = 0,                               &
+        LTIMEDEP   = .TRUE.                           )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XWASCENT)
+
+      TZFIELD = TFIELDMETADATA(                   &
+        CMNHNAME   = TRIM(TPFLYER%CTITLE)//'RHO', &
+        CSTDNAME   = '',                          &
+        CLONGNAME  = TRIM(TPFLYER%CTITLE)//'RHO', &
+        CUNITS     = 'kg m-3',                    &
+        CDIR       = '--',                        &
+        CCOMMENT   = '',                          &
+        NGRID      = 0,                           &
+        NTYPE      = TYPEREAL,                    &
+        NDIMS      = 0,                           &
+        LTIMEDEP   = .TRUE.                       )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XRHO)
+    END IF
+#ifdef MNH_IOCDF4
   ELSE
-    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'degree'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON)
-    !
-    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%Z_CUR)
-    !
-    TPFLYER%P_CUR   = XUNDEF
-    !
-    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT)
-    !
-    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg m-3'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO)
-    !
-    CALL SM_XYHAT(PLATOR,PLONOR,&
-              ZLAT,ZLON,        &
-              TPFLYER%X_CUR, TPFLYER%Y_CUR )
-    TPFLYER%FLY = .TRUE.
-    WRITE(ILUOUT,*) &
-    "INI_LAUCH: Current location read in FM file for ",TPFLYER%TITLE
-    IF (TPFLYER%TYPE== 'CVBALL') THEN
-      WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR," Wasc=",TPFLYER%WASCENT
-    ELSE IF (TPFLYER%TYPE== 'ISODEN') THEN
-      WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO
+    ! Read in netCDF file (new structure since MesoNH 5.6)
+    IF ( ISP /= TPINIFILE%NMASTER_RANK )  CALL PRINT_MSG( NVERB_ERROR, 'IO', 'INI_LAUNCH', 'process is not the file master process')
+
+    ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID )
+
+    IF ( ISTATUS == NF90_NOERR ) THEN
+      GREAD = .TRUE.
+
+      TZFILE = TPINIFILE
+      TZFILE%NNCID = IGROUPID
+
+      TZFIELD = TFIELDMETADATA(  &
+        CMNHNAME   = 'LAT',      &
+        CSTDNAME   = '',         &
+        CLONGNAME  = 'LAT',      &
+        CUNITS     = 'degree',   &
+        CDIR       = '--',       &
+        CCOMMENT   = 'latitude', &
+        NGRID      = 0,          &
+        NTYPE      = TYPEREAL,   &
+        NDIMS      = 0,          &
+        LTIMEDEP   = .TRUE.      )
+      CALL IO_Field_read(TZFILE,TZFIELD,ZLAT)
+
+      TZFIELD = TFIELDMETADATA(   &
+        CMNHNAME   = 'LON',       &
+        CSTDNAME   = '',          &
+        CLONGNAME  = 'LON',       &
+        CUNITS     = 'degree',    &
+        CDIR       = '--',        &
+        CCOMMENT   = 'longitude', &
+        NGRID      = 0,           &
+        NTYPE      = TYPEREAL,    &
+        NDIMS      = 0,           &
+        LTIMEDEP   = .TRUE.       )
+      CALL IO_Field_read(TZFILE,TZFIELD,ZLON)
+
+      TZFIELD = TFIELDMETADATA(  &
+        CMNHNAME   = 'ALT',      &
+        CSTDNAME   = '',         &
+        CLONGNAME  = 'ALT',      &
+        CUNITS     = 'm',        &
+        CDIR       = '--',       &
+        CCOMMENT   = 'altitude', &
+        NGRID      = 0,          &
+        NTYPE      = TYPEREAL,   &
+        NDIMS      = 0,          &
+        LTIMEDEP   = .TRUE.      )
+      CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XZ_CUR)
+
+      TZFIELD = TFIELDMETADATA(               &
+        CMNHNAME   = 'WASCENT',               &
+        CSTDNAME   = '',                      &
+        CLONGNAME  = 'WASCENT',               &
+        CUNITS     = 'm s-1',                 &
+        CDIR       = '--',                    &
+        CCOMMENT   = 'ascent vertical speed', &
+        NGRID      = 0,                       &
+        NTYPE      = TYPEREAL,                &
+        NDIMS      = 0,                       &
+        LTIMEDEP   = .TRUE.                   )
+      CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XWASCENT)
+
+      TZFIELD = TFIELDMETADATA(     &
+        CMNHNAME   = 'RHO',         &
+        CSTDNAME   = '',            &
+        CLONGNAME  = 'RHO',         &
+        CUNITS     = 'kg m-3',      &
+        CDIR       = '--',          &
+        CCOMMENT   = 'air density', &
+        NGRID      = 0,             &
+        NTYPE      = TYPEREAL,      &
+        NDIMS      = 0,             &
+        LTIMEDEP   = .TRUE.         )
+      CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XRHO)
     END IF
-    !
-    TPFLYER%STEP  = MAX ( PTSTEP, TPFLYER%STEP )
+#endif
+  END IF
+
+  IF ( GREAD ) THEN
+    CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR )
+
+    TPFLYER%LFLY = .TRUE.
+    TPFLYER%TPOS_CUR = TDTCUR
+
+    CMNHMSG(1) = 'current location read from synchronous file for ' // TRIM( TPFLYER%CTITLE )
+    IF (TPFLYER%CTYPE== 'CVBALL') THEN
+      WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON
+      WRITE( CMNHMSG(3), * ) " Alt=", TPFLYER%XZ_CUR, " Wasc=", TPFLYER%XWASCENT
+    ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN
+      WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO
+    END IF
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' )
+  ELSE
+    ! The position is not found, data is not in the synchronous file
+    ! Use the position given in namelist
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH', 'initial location taken from namelist for ' // TRIM( TPFLYER%CTITLE ) )
+  END IF
+
+  ! Correct timestep if necessary
+  ! This has to be done at first pass (when IMI=1) to have the correct value as soon as possible
+  ! If 'MOB', set balloon store timestep to be at least the timestep of the coarser model (IMI=1) (with higher timestep)
+  ! as the balloon can fly on any model
+  ! If 'FIX', set balloon store timestep to be at least the timestep of its model
+  ! It should also need to be a multiple of the model timestep
+  IF ( IMI == 1 ) THEN
+    IF ( TPFLYER%CMODEL == 'MOB' ) THEN
+      IMODEL = 1
+    ELSE
+      IMODEL = TPFLYER%NMODEL
+    END IF
+
+    CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER )
   END IF
   !
-ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
+ELSE IF ( CPROGRAM == 'DIAG  ' ) THEN
   IF ( LAIRCRAFT_BALLOON ) THEN
     ! read the current location in MODD_DIAG_FLAG
     !
     ZLAT=XLAT_BALLOON(KNBR)
     ZLON=XLON_BALLOON(KNBR)
-    TPFLYER%Z_CUR=XALT_BALLOON(KNBR)
-    IF (TPFLYER%Z_CUR /= XUNDEF .AND. ZLAT /= XUNDEF .AND. ZLON /= XUNDEF ) THEN
-      CALL SM_XYHAT(PLATOR,PLONOR,       &
-              ZLAT,ZLON,        &
-              TPFLYER%X_CUR, TPFLYER%Y_CUR )
-      TPFLYER%FLY = .TRUE.
-      WRITE(ILUOUT,*) &
-      "INI_LAUCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE
-      WRITE(ILUOUT,*) &
-            " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR
+    TPFLYER%XZ_CUR=XALT_BALLOON(KNBR)
+    IF (TPFLYER%XZ_CUR /= XUNDEF .AND. ZLAT /= XUNDEF .AND. ZLON /= XUNDEF ) THEN
+      CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR )
+      TPFLYER%LFLY = .TRUE.
+      CMNHMSG(1) = 'current location read from MODD_DIAG_FLAG for ' // TRIM( TPFLYER%CTITLE )
+      WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON," Alt=",TPFLYER%XZ_CUR
+      CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' )
     END IF
     !
-    TPFLYER%STEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%STEP )
+    CALL FLYER_TIMESTEP_CORRECT( XSTEP_AIRCRAFT_BALLOON, TPFLYER )
   END IF
 END IF
-!
-IF (TPFLYER%LAT==XUNDEF .OR.TPFLYER%LON==XUNDEF) THEN
-  WRITE(ILUOUT,*) 'Error in balloon initial position (balloon number ',KNBR,' )'
-  WRITE(ILUOUT,*) 'either LATitude or LONgitude is not given'
-  WRITE(ILUOUT,*) 'TPBALLOON%LAT=',TPFLYER%LAT
-  WRITE(ILUOUT,*) 'TPBALLOON%LON=',TPFLYER%LON
-  WRITE(ILUOUT,*) 'Check your INI_BALLOON routine'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','')
-END IF
-!
-CALL SM_XYHAT(PLATOR,PLONOR,       &
-              TPFLYER%LAT, TPFLYER%LON,        &
-              TPFLYER%XLAUNCH, TPFLYER%YLAUNCH )
-!
+
+! Restore correct value of GSMONOPROC
+GSMONOPROC = OMONOPROC_SAVE
+
 END SUBROUTINE INI_LAUNCH
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 SUBROUTINE INI_FLIGHT(KNBR,TPFLYER)
-!
-INTEGER,     INTENT(IN)    :: KNBR
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
-!
-IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
-IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
+
+INTEGER,              INTENT(IN)    :: KNBR
+CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER
+
+INTEGER :: IMODEL
+INTEGER :: JSEG   ! loop counter
+
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
-!
-LFLYER=.TRUE.
-!
-TPFLYER%STEP  = MAX ( PTSTEP, TPFLYER%STEP )
-!
-IF (TPFLYER%SEG==0) THEN
-  WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )'
-  WRITE(ILUOUT,*) 'There is ZERO flight segment defined.'
-  WRITE(ILUOUT,*) 'TPAIRCRAFT%SEG=',TPFLYER%SEG
-  WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FLIGHT','')
-END IF
-!
-IF ( ANY(TPFLYER%SEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%SEGLON(:)==XUNDEF) ) THEN
-  WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )'
-  WRITE(ILUOUT,*) 'either LATitude or LONgitude segment'
-  WRITE(ILUOUT,*) 'definiton is not complete.'
-  WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGLAT=',TPFLYER%SEGLAT
-  WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGLON=',TPFLYER%SEGLON
-  WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','')
+
+! Correct timestep if necessary
+! This has to be done at first pass (when IMI=1) to have the correct value as soon as possible
+! If 'MOB', set balloon store timestep to be at least the timestep of the coarser model (IMI=1) (with higher timestep)
+! as the balloon can fly on any model
+! If 'FIX', set balloon store timestep to be at least the timestep of its model
+! It should also need to be a multiple of the model timestep
+IF ( IMI == 1 ) THEN
+  IF ( TPFLYER%CMODEL == 'MOB' ) THEN
+    IMODEL = 1
+  ELSE
+    IMODEL = TPFLYER%NMODEL
+  END IF
+
+  CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER )
 END IF
-!
-ALLOCATE(TPFLYER%SEGX(TPFLYER%SEG+1))
-ALLOCATE(TPFLYER%SEGY(TPFLYER%SEG+1))
-!
-DO JSEG=1,TPFLYER%SEG+1
-  CALL SM_XYHAT(PLATOR,PLONOR,                              &
-                TPFLYER%SEGLAT(JSEG), TPFLYER%SEGLON(JSEG), &
-                TPFLYER%SEGX(JSEG),   TPFLYER%SEGY(JSEG)    )
+
+ALLOCATE(TPFLYER%XPOSX(TPFLYER%NPOS))
+ALLOCATE(TPFLYER%XPOSY(TPFLYER%NPOS))
+
+DO JSEG = 1, TPFLYER%NPOS
+  CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XPOSLAT(JSEG), TPFLYER%XPOSLON(JSEG), TPFLYER%XPOSX(JSEG), TPFLYER%XPOSY(JSEG) )
 END DO
-!
-IF ( ANY(TPFLYER%SEGTIME(:)==XUNDEF) ) THEN
-  WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )'
-  WRITE(ILUOUT,*) 'definiton of segment duration is not complete.'
-  WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGTIME=',TPFLYER%SEGTIME
-  WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','')
+
+END SUBROUTINE INI_FLIGHT
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_TIMESTEP_CORRECT( PTSTEP_MODEL, TPFLYER )
+! Timestep is set to a multiple of the PTSTEP_MODEL value
+REAL,              INTENT(IN)    :: PTSTEP_MODEL
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+
+REAL :: ZTSTEP_OLD
+
+ZTSTEP_OLD = TPFLYER%TFLYER_TIME%XTSTEP
+
+TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP_MODEL, TPFLYER%TFLYER_TIME%XTSTEP )
+TPFLYER%TFLYER_TIME%XTSTEP = NINT( TPFLYER%TFLYER_TIME%XTSTEP / PTSTEP_MODEL ) * PTSTEP_MODEL
+
+IF ( ABS( TPFLYER%TFLYER_TIME%XTSTEP - ZTSTEP_OLD ) > 1E-6 ) THEN
+  WRITE( CMNHMSG(1), '( "Timestep for flyer ", A, " is set to ", EN12.3, " (instead of ", EN12.3, ")" )' ) &
+         TPFLYER%CTITLE, TPFLYER%TFLYER_TIME%XTSTEP, ZTSTEP_OLD
+  CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_LAUNCH' )
 END IF
+
+END SUBROUTINE FLYER_TIMESTEP_CORRECT
+!----------------------------------------------------------------------------
+
+!----------------------------------------------------------------------------
 !
-!
-IF (TPFLYER%TITLE=='          ') THEN
-  WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR
+END SUBROUTINE INI_AIRCRAFT_BALLOON
+
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE ALLOCATE_FLYER( TPFLYER, KSTORE )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA
+USE MODD_CONF,             ONLY: CPROGRAM
+USE MODD_CONF_n,           ONLY: NRR
+USE MODD_DIAG_FLAG,        ONLY: NTIME_AIRCRAFT_BALLOON
+USE MODD_DIM_n,            ONLY: NKMAX
+USE MODD_DYN,              ONLY: XSEGLEN
+USE MODD_DYN_n,            ONLY: DYN_MODEL
+USE MODD_NSV,              ONLY: NSV
+USE MODD_PARAMETERS,       ONLY: JPVEXT, NNEGUNDEF, XUNDEF
+USE MODD_PARAM_n,          ONLY: CCLOUD, CTURB
+USE MODD_SURF_PAR,         ONLY: XUNDEF_SFX => XUNDEF
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+INTEGER, OPTIONAL, INTENT(IN)    :: KSTORE
+
+INTEGER :: IKU    ! number of vertical levels
+INTEGER :: ISTORE ! number of storage instants
+
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'ALLOCATE_FLYER', 'flyer: ' // TRIM(TPFLYER%CTITLE), OLOCAL = .TRUE. )
+
+IKU = NKMAX + 2 * JPVEXT
+
+IF ( PRESENT( KSTORE ) ) THEN
+  ISTORE = KSTORE
+ELSE
+  IF ( CPROGRAM == 'DIAG  ' ) THEN
+    ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%TFLYER_TIME%XTSTEP ) + 1
+  ELSE
+    ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1
+  ENDIF
 END IF
 !
-END SUBROUTINE INI_FLIGHT
+ALLOCATE( TPFLYER%TFLYER_TIME%TPDATES(ISTORE) )
+ALLOCATE( TPFLYER%NMODELHIST(ISTORE) )
+ALLOCATE( TPFLYER%XX   (ISTORE) )
+ALLOCATE( TPFLYER%XY   (ISTORE) )
+ALLOCATE( TPFLYER%XZ   (ISTORE) )
+ALLOCATE( TPFLYER%XLON (ISTORE) )
+ALLOCATE( TPFLYER%XLAT (ISTORE) )
+ALLOCATE( TPFLYER%XZON (ISTORE) )
+ALLOCATE( TPFLYER%XMER (ISTORE) )
+ALLOCATE( TPFLYER%XW   (ISTORE) )
+ALLOCATE( TPFLYER%XP   (ISTORE) )
+ALLOCATE( TPFLYER%XTH  (ISTORE) )
+ALLOCATE( TPFLYER%XR   (ISTORE, NRR) )
+ALLOCATE( TPFLYER%XSV  (ISTORE, NSV) )
+ALLOCATE( TPFLYER%XRTZ (ISTORE, IKU) )
+ALLOCATE( TPFLYER%XRZ  (ISTORE, IKU, NRR) )
+ALLOCATE( TPFLYER%XFFZ (ISTORE, IKU) )
+ALLOCATE( TPFLYER%XIWCZ(ISTORE, IKU) )
+ALLOCATE( TPFLYER%XLWCZ(ISTORE, IKU) )
+ALLOCATE( TPFLYER%XCIZ (ISTORE, IKU) )
+IF ( CCLOUD == 'LIMA' ) THEN
+  ALLOCATE( TPFLYER%XCCZ(ISTORE, IKU) )
+  ALLOCATE( TPFLYER%XCRZ(ISTORE, IKU) )
+ELSE
+  ALLOCATE( TPFLYER%XCCZ(0, 0) )
+  ALLOCATE( TPFLYER%XCRZ(0, 0) )
+ENDIF
+ALLOCATE( TPFLYER%XCRARE    (ISTORE, IKU) )
+ALLOCATE( TPFLYER%XCRARE_ATT(ISTORE, IKU) )
+ALLOCATE( TPFLYER%XWZ       (ISTORE, IKU) )
+ALLOCATE( TPFLYER%XZZ       (ISTORE, IKU) )
+IF ( CTURB == 'TKEL' ) THEN
+  ALLOCATE( TPFLYER%XTKE(ISTORE) )
+ELSE
+  ALLOCATE( TPFLYER%XTKE(0) )
+END IF
+ALLOCATE( TPFLYER%XTKE_DISS(ISTORE) )
+ALLOCATE( TPFLYER%XTSRAD   (ISTORE) )
+ALLOCATE( TPFLYER%XZS      (ISTORE) )
+
+ALLOCATE( TPFLYER%XTHW_FLUX(ISTORE) )
+ALLOCATE( TPFLYER%XRCW_FLUX(ISTORE) )
+ALLOCATE( TPFLYER%XSVW_FLUX(ISTORE, NSV) )
+
+TPFLYER%NMODELHIST = NNEGUNDEF
+TPFLYER%XX    = XUNDEF
+TPFLYER%XY    = XUNDEF
+TPFLYER%XZ    = XUNDEF
+TPFLYER%XLON  = XUNDEF
+TPFLYER%XLAT  = XUNDEF
+TPFLYER%XZON  = XUNDEF
+TPFLYER%XMER  = XUNDEF
+TPFLYER%XW    = XUNDEF
+TPFLYER%XP    = XUNDEF
+TPFLYER%XTH   = XUNDEF
+TPFLYER%XR    = XUNDEF
+TPFLYER%XSV   = XUNDEF
+TPFLYER%XRTZ  = XUNDEF
+TPFLYER%XRZ   = XUNDEF
+TPFLYER%XFFZ  = XUNDEF
+TPFLYER%XIWCZ = XUNDEF
+TPFLYER%XLWCZ = XUNDEF
+TPFLYER%XCIZ  = XUNDEF
+TPFLYER%XCCZ  = XUNDEF
+TPFLYER%XCRZ  = XUNDEF
+TPFLYER%XCRARE     = XUNDEF
+TPFLYER%XCRARE_ATT = XUNDEF
+TPFLYER%XWZ        = XUNDEF
+TPFLYER%XZZ        = XUNDEF
+TPFLYER%XTKE       = XUNDEF
+TPFLYER%XTKE_DISS  = XUNDEF
+TPFLYER%XTSRAD     = XUNDEF_SFX
+TPFLYER%XZS        = XUNDEF
+
+TPFLYER%XTHW_FLUX = XUNDEF
+TPFLYER%XRCW_FLUX = XUNDEF
+TPFLYER%XSVW_FLUX = XUNDEF
+
+END SUBROUTINE ALLOCATE_FLYER
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-!
-END SUBROUTINE INI_AIRCRAFT_BALLOON
+SUBROUTINE DEALLOCATE_FLYER( TPFLYER )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TFLYERDATA
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
+
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'DEALLOCATE_FLYER', 'flyer: ' // TRIM(TPFLYER%CTITLE), OLOCAL = .TRUE. )
+
+DEALLOCATE( TPFLYER%TFLYER_TIME%TPDATES )
+DEALLOCATE( TPFLYER%NMODELHIST )
+DEALLOCATE( TPFLYER%XX         )
+DEALLOCATE( TPFLYER%XY         )
+DEALLOCATE( TPFLYER%XZ         )
+DEALLOCATE( TPFLYER%XLON       )
+DEALLOCATE( TPFLYER%XLAT       )
+DEALLOCATE( TPFLYER%XZON       )
+DEALLOCATE( TPFLYER%XMER       )
+DEALLOCATE( TPFLYER%XW         )
+DEALLOCATE( TPFLYER%XP         )
+DEALLOCATE( TPFLYER%XTH        )
+DEALLOCATE( TPFLYER%XR         )
+DEALLOCATE( TPFLYER%XSV        )
+DEALLOCATE( TPFLYER%XRTZ       )
+DEALLOCATE( TPFLYER%XRZ        )
+DEALLOCATE( TPFLYER%XFFZ       )
+DEALLOCATE( TPFLYER%XIWCZ      )
+DEALLOCATE( TPFLYER%XLWCZ      )
+DEALLOCATE( TPFLYER%XCIZ       )
+DEALLOCATE( TPFLYER%XCCZ       )
+DEALLOCATE( TPFLYER%XCRZ       )
+DEALLOCATE( TPFLYER%XCRARE     )
+DEALLOCATE( TPFLYER%XCRARE_ATT )
+DEALLOCATE( TPFLYER%XWZ        )
+DEALLOCATE( TPFLYER%XZZ        )
+DEALLOCATE( TPFLYER%XTKE       )
+DEALLOCATE( TPFLYER%XTKE_DISS  )
+DEALLOCATE( TPFLYER%XTSRAD     )
+DEALLOCATE( TPFLYER%XZS        )
+
+DEALLOCATE( TPFLYER%XTHW_FLUX )
+DEALLOCATE( TPFLYER%XRCW_FLUX )
+DEALLOCATE( TPFLYER%XSVW_FLUX )
+
+SELECT TYPE( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    DEALLOCATE( TPFLYER%XPOSLAT  )
+    DEALLOCATE( TPFLYER%XPOSLON  )
+    DEALLOCATE( TPFLYER%XPOSX    )
+    DEALLOCATE( TPFLYER%XPOSY    )
+    IF ( TPFLYER%LALTDEF ) THEN
+      DEALLOCATE( TPFLYER%XPOSP  )
+    ELSE
+      DEALLOCATE( TPFLYER%XPOSZ  )
+    END IF
+    DEALLOCATE( TPFLYER%XPOSTIME )
+END SELECT
+
+END SUBROUTINE DEALLOCATE_FLYER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+
+END MODULE MODE_INI_AIRCRAFT_BALLOON
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 71e935021ef69f07716cc6491b7613de82328b4f..342eb5abfe3a76cc51e44df83376f90a728f3b7f 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -1,8 +1,18 @@
-!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
+MODULE MODE_INI_BALLOON
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: INI_BALLOON
+
+CONTAINS
+
 !     ######################
       SUBROUTINE INI_BALLOON
 !     ######################
@@ -18,7 +28,7 @@
 !!    ------
 !!    
 !!    For constant volume Balloon, horizontal advection using horizontal wind
-!!        vertical spped of the balloon calculated using the balloon equation
+!!        vertical speed of the balloon calculated using the balloon equation
 !!        (Koffi et AL 2000, JAS vol 57 P.2007-2021)
 !!
 !!   Must be defined (for each balloon):
@@ -93,414 +103,284 @@
 !!    -------------
 !!     Original 15/05/2000
 !!              Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models
-!!
+!  P. Wautelet 13/07/2022: give balloons characteristics in namelist instead of hardcoded
 !! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CST
-!
-!
+USE MODD_CONF,             ONLY: NMODEL_NEST => NMODEL
+USE MODD_CST,              ONLY: XPI
+USE MODD_PARAMETERS,       ONLY: XNEGUNDEF, XUNDEF
+
+USE MODE_MSG
+
+USE MODN_BALLOONS
+
 IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Balloon number 1
-!            ----------------
-!
-!* model number
-!
-TBALLOON1%NMODEL             = 0
-TBALLOON1%MODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOON1%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON1%TITLE              = 'CVB1MOBI'
-!
-!* launching date and time
-!
-TBALLOON1%LAUNCH%nyear  =  1999
-TBALLOON1%LAUNCH%nmonth =    09
-TBALLOON1%LAUNCH%nday   =    19
-TBALLOON1%LAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON1%LAT                = 45.800
-TBALLOON1%LON                =  8.629
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOON1%ALT                =   3959.
-TBALLOON1%PRES               = 98450.
-!
-!* time step for data storage  (s)
-!
-TBALLOON1%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOON1%WASCENT            = 0.
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON1%AERODRAG           = 0.44
-TBALLOON1%INDDRAG           = 0.014
-TBALLOON1%VOLUME           = 3.040
-TBALLOON1%MASS           = 2.4516
-TBALLOON1%DIAMETER           = ((3.*TBALLOON1%VOLUME)/(4.*XPI))**(1./3.)
-!
-!----------------------------------------------------------------------------
-!
-!*      2.   Balloon number 2
-!            ----------------
-!
-!* model number
-!
-TBALLOON2%NMODEL             = 0
-TBALLOON2%MODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOON2%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON2%TITLE              = 'CVB2MOBI'
-!
-!* launching date and time
-!
-TBALLOON2%LAUNCH%nyear  =  1999
-TBALLOON2%LAUNCH%nmonth =    09
-TBALLOON2%LAUNCH%nday   =    19
-TBALLOON2%LAUNCH%xtime  = 39660.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON2%LAT                = 45.800
-TBALLOON2%LON                =  8.630
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOON2%ALT                =   3959.
-TBALLOON2%PRES               = 98490.
-!
-!* time step for data storage  (s)
-!
-TBALLOON2%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOON2%WASCENT            = 0.
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON2%AERODRAG           = 0.44
-TBALLOON2%INDDRAG           = 0.014
-TBALLOON2%VOLUME           = 3.040
-TBALLOON2%MASS           = 2.58087
-TBALLOON2%DIAMETER           = ((3.*TBALLOON2%VOLUME)/(4.*XPI))**(1./3.)
-!
-!-------------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-!*      3.   Balloon number 3
-!            ----------------
-!
-!* model number
-!
-TBALLOON3%NMODEL             = 0
-TBALLOON3%MODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOON3%TYPE               = 'RADIOS'
-!
-!* balloon name
-!
-TBALLOON3%TITLE              = 'RSMASE19'
-!
-!* launching date and time
-!
-TBALLOON3%LAUNCH%nyear  =  1999
-TBALLOON3%LAUNCH%nmonth =    09
-TBALLOON3%LAUNCH%nday   =    19
-TBALLOON3%LAUNCH%xtime  = 68400.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON3%LAT                = 46.810
-TBALLOON3%LON                =  9.39 
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOON3%ALT                =   865. 
-!TBALLOON3%PRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOON3%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOON3%WASCENT            = 4.85
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON3%AERODRAG           = 0.44
-TBALLOON3%INDDRAG           = 0.014
-TBALLOON3%VOLUME           = 3.040
-TBALLOON3%MASS           = 2.4516
-TBALLOON3%DIAMETER           = ((3.*TBALLOON3%VOLUME)/(4.*XPI))**(1./3.)
-!
-!
-!----------------------------------------------------------------------------
-!
-!*      4.   Balloon number 4
-!            ----------------
-!
-!* model number
-!
-TBALLOON4%NMODEL             = 0
-TBALLOON4%MODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOON4%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON4%TITLE              = 'CVB1ACVB'
-!
-!* launching date and time
-!
-TBALLOON4%LAUNCH%nyear  =  1999
-TBALLOON4%LAUNCH%nmonth =    09
-TBALLOON4%LAUNCH%nday   =    19
-TBALLOON4%LAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON4%LAT                = 45.922
-TBALLOON4%LON                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOON4%ALT                =   3959.
-!TBALLOON4%PRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOON4%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOON4%WASCENT            = 2.55
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON4%AERODRAG           = 0.44
-TBALLOON4%INDDRAG           = 0.014
-TBALLOON4%VOLUME           = 3.040
-TBALLOON4%MASS           = 2.4516
-TBALLOON4%DIAMETER           = ((3.*TBALLOON4%VOLUME)/(4.*XPI))**(1./3.)
-!
-!----------------------------------------------------------------------------
-!
-!*      5.   Balloon number 5
-!            ----------------
-!
-!* model number
-!
-TBALLOON5%NMODEL             = 0
-TBALLOON5%MODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOON5%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON5%TITLE              = 'CVB1DEPA'
-!
-!* launching date and time
-!
-TBALLOON5%LAUNCH%nyear  =  1999
-TBALLOON5%LAUNCH%nmonth =    09
-TBALLOON5%LAUNCH%nday   =    19
-TBALLOON5%LAUNCH%xtime  = 32435.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON5%LAT                = 45.800
-TBALLOON5%LON                =  8.630
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOON5%ALT                =    340.
-!TBALLOON5%PRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOON5%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOON5%WASCENT            = 2.55
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON5%AERODRAG           = 0.44
-TBALLOON5%INDDRAG           = 0.014
-TBALLOON5%VOLUME           = 3.040
-TBALLOON5%MASS           = 2.4516
-TBALLOON5%DIAMETER           = ((3.*TBALLOON5%VOLUME)/(4.*XPI))**(1./3.)
-!
-!----------------------------------------------------------------------------
-!
-!*      6.   Balloon number 6
-!            ----------------
-!
-!* model number
-!
-TBALLOON6%NMODEL             = 0
-TBALLOON6%MODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOON6%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON6%TITLE              = 'CVB1RCVB'
-!
-!* launching date and time
-!
-TBALLOON6%LAUNCH%nyear  =  1999
-TBALLOON6%LAUNCH%nmonth =    09
-TBALLOON6%LAUNCH%nday   =    19
-TBALLOON6%LAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON6%LAT                = 45.922
-TBALLOON6%LON                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOON6%ALT                =   3959.
-!TBALLOON6%PRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOON6%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOON6%WASCENT            = 2.55
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON6%AERODRAG           = 0.44
-TBALLOON6%INDDRAG           = 0.014
-TBALLOON6%VOLUME           = 3.040
-TBALLOON6%MASS           = 2.4516
-TBALLOON6%DIAMETER           = ((3.*TBALLOON6%VOLUME)/(4.*XPI))**(1./3.)
-!
-!----------------------------------------------------------------------------
-!
-!*      7.   Balloon number 7
-!            ----------------
-!
-!* model number
-!
-TBALLOON7%NMODEL             = 0
-TBALLOON7%MODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOON7%TYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOON7%TITLE              = 'CVB1PISO'
-!
-!* launching date and time
-!
-TBALLOON7%LAUNCH%nyear  =  1999
-TBALLOON7%LAUNCH%nmonth =    09
-TBALLOON7%LAUNCH%nday   =    19
-TBALLOON7%LAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOON7%LAT                = 45.922
-TBALLOON7%LON                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOON7%ALT                =   3959.
-TBALLOON7%PRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOON7%STEP               = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOON7%WASCENT            = 2.55
-!
-!* aerodynamic drag coefficient of the balloon (for 'CVBALL')
-!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL')
-!* volume of the balloon (m3) (for 'CVBALL')
-!* mass of the balloon (kg) (for 'CVBALL')
-!
-TBALLOON7%AERODRAG           = 0.44
-TBALLOON7%INDDRAG           = 0.014
-TBALLOON7%VOLUME           = 3.040
-TBALLOON7%MASS           = 2.4516
-TBALLOON7%DIAMETER           = ((3.*TBALLOON7%VOLUME)/(4.*XPI))**(1./3.)
-!
+
+INTEGER :: JI
+TYPE(TBALLOONDATA), POINTER :: TZBALLOON
+
+!Treat balloon data read in namelist
+DO JI = 1, NBALLOONS
+  ALLOCATE( TBALLOONS(JI)%TBALLOON )
+  TZBALLOON => TBALLOONS(JI)%TBALLOON
+
+  TZBALLOON%NID = JI
+
+  IF ( CTITLE(JI) == '' ) THEN
+    WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
+
+    WRITE( CMNHMSG(1), FMT = '( A, I4 )' ) 'no title given to balloon number ', JI
+    CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. )
+  END IF
+  TZBALLOON%CTITLE = CTITLE(JI)
+
+  IF ( CMODEL(JI) == 'FIX' ) THEN
+    IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
+      CMNHMSG(1) = 'invalid NMODEL balloon ' // TRIM( CTITLE(JI) )
+      CMNHMSG(2) = 'NMODEL must be between 1 and the last nested model number'
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. )
+      NMODEL(JI) = 1
+    END IF
+  ELSE IF ( CMODEL(JI) == 'MOB' ) THEN
+    IF ( NMODEL(JI) /= 0 .AND. NMODEL(JI) /= 1 ) THEN
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                      'NMODEL is set to 1 at start for a CMODEL="MOB" balloon (balloon ' // TRIM( CTITLE(JI) ) // ')', &
+                       OLOCAL = .TRUE.)
+    END IF
+    IF ( NMODEL_NEST == 1 ) CMODEL(JI) = 'FIX' ! If only one model, FIX and MOB are the same
+    ! NMODEL set temporarily to 1. Will be set to the launch model in INI_LAUNCH
+    NMODEL(JI) = 1
+  ELSE
+    CMNHMSG(1) = 'invalid CMODEL (' // TRIM( CMODEL(JI) ) // ') for balloon ' // TRIM( CTITLE(JI) )
+    CMNHMSG(2) = 'CMODEL must be FIX or MOB (default="FIX")'
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. )
+    CMODEL(JI) = 'FIX'
+    NMODEL(JI) = 1
+  END IF
+  TZBALLOON%CMODEL = CMODEL(JI)
+  TZBALLOON%NMODEL = NMODEL(JI)
+
+  TZBALLOON%CTYPE = CTYPE(JI)
+
+  IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
+                        'problem with TLAUNCH (not set or incorrect values) for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
+  TZBALLOON%TLAUNCH  = TLAUNCH(JI)
+
+  IF ( XLATLAUNCH(JI) == XUNDEF ) &
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ), &
+                    OLOCAL = .TRUE. )
+  TZBALLOON%XLATLAUNCH = XLATLAUNCH(JI)
+
+  IF ( XLONLAUNCH(JI) == XUNDEF ) &
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ), &
+                    OLOCAL = .TRUE. )
+  TZBALLOON%XLONLAUNCH = XLONLAUNCH(JI)
+
+  IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
+                    'data storage frequency not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 60s', OLOCAL = .TRUE. )
+    XTSTEP(JI) = 60.
+  ELSE IF ( XTSTEP(JI) <=0. ) THEN
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'invalid data storage frequency for balloon ' // TRIM( CTITLE(JI) ), &
+                    OLOCAL = .TRUE. )
+    XTSTEP(JI) = 60.
+  END IF
+  TZBALLOON%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+
+  SELECT CASE ( CTYPE(JI) )
+    CASE ( 'CVBALL' )
+      IF ( XALTLAUNCH(JI) == XNEGUNDEF .AND. XPRES(JI) == XNEGUNDEF ) THEN
+        CMNHMSG(1) = 'altitude or pressure at launch not provided for CVBALL balloon ' // TRIM( CTITLE(JI) )
+        CMNHMSG(2) = 'altitude with same air density than balloon will be used for the launch position'
+        CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON' , OLOCAL = .TRUE.)
+      END IF
+      IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
+                        'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), &
+                        OLOCAL = .TRUE. )
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
+      TZBALLOON%XPRES      = XPRES(JI)
+
+      IF ( XWASCENT(JI) == XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
+                        'initial vertical speed not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.' , &
+                        OLOCAL = .TRUE.)
+        XWASCENT(JI) = 0.
+      END IF
+      TZBALLOON%XWASCENT = XWASCENT(JI)
+
+
+      IF ( XAERODRAG(JI) == XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
+                        'aerodynamic drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) &
+                        // ' => set to 0.44', OLOCAL = .TRUE.)
+        XAERODRAG(JI) = 0.44
+      END IF
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
+
+      IF ( XINDDRAG(JI) == XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
+                        'induced drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.014', &
+                        OLOCAL = .TRUE.)
+        XINDDRAG(JI) = 0.014
+      END IF
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
+
+      IF ( XMASS(JI) == XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'mass not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), &
+                        OLOCAL = .TRUE. )
+      TZBALLOON%XMASS = XMASS(JI)
+
+      IF ( XDIAMETER(JI) <= 0. .AND. XVOLUME(JI) <= 0. ) &
+        CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', &
+                        'diameter or volume not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
+
+      IF ( XDIAMETER(JI) <= 0. ) THEN
+        TZBALLOON%XVOLUME          = XVOLUME(JI)
+        TZBALLOON%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
+      ELSE IF ( XVOLUME(JI) <= 0 ) THEN
+        TZBALLOON%XDIAMETER        = XDIAMETER(JI)
+        TZBALLOON%XVOLUME          = XPI / 6 * XDIAMETER(JI)**3
+      ELSE
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
+                        'diameter or volume (not both) must be provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), &
+                        OLOCAL = .TRUE. )
+      END IF
+
+
+    CASE ( 'ISODEN' )
+      IF ( XALTLAUNCH(JI) == XNEGUNDEF .AND. XPRES(JI) == XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', &
+                        'altitude or pressure at launch must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), &
+                        OLOCAL = .TRUE. )
+      IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
+                        'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), &
+                        OLOCAL = .TRUE.)
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
+      TZBALLOON%XPRES      = XPRES(JI)
+
+      IF ( XWASCENT(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'initial vertical speed is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', &
+                        OLOCAL = .TRUE. )
+        XWASCENT(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XWASCENT = XWASCENT(JI)
+
+
+      IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'aerodynamic drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', &
+                        OLOCAL = .TRUE. )
+        XAERODRAG(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
+
+      IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'induced drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' , &
+                        OLOCAL = .TRUE.)
+        XINDDRAG(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
+
+      IF ( XMASS(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'mass is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XMASS(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XMASS = XMASS(JI)
+
+      IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'diameter is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XDIAMETER(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XDIAMETER = XDIAMETER(JI)
+
+      IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'volume is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XVOLUME(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XVOLUME = XVOLUME(JI)
+
+
+    CASE ( 'RADIOS' )
+      IF ( XALTLAUNCH(JI) == XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', &
+                        'altitude of launch must be provided for radiosounding balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
+
+      IF ( XWASCENT(JI) == XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
+                        'initial vertical speed not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 5.', &
+                        OLOCAL = .TRUE. )
+        XWASCENT(JI) = 5.
+      END IF
+      TZBALLOON%XWASCENT = XWASCENT(JI)
+
+      IF ( XPRES(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                        &
+                        'initial pressure is not needed for radiosounding balloon ' &
+                        // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XPRES(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
+
+      IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                    &
+                        'aerodynamic drag coefficient is not needed for radiosounding balloon ' &
+                        // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XAERODRAG(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
+
+      IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                &
+                        'induced drag coefficient is not needed for radiosounding balloon ' &
+                        // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XINDDRAG(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
+
+      IF ( XMASS(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'mass is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XMASS(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XMASS = XMASS(JI)
+
+      IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'diameter is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', &
+                        OLOCAL = .TRUE. )
+        XDIAMETER(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XDIAMETER = XDIAMETER(JI)
+
+      IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
+                        'volume is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
+        XVOLUME(JI) = XNEGUNDEF
+      END IF
+      TZBALLOON%XVOLUME = XVOLUME(JI)
+
+
+    CASE DEFAULT
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'invalid balloon type (CTYPE=' &
+                      // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
+
+  END SELECT
+END DO
+
+IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE()
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_BALLOON
+
+END MODULE MODE_INI_BALLOON
diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index cb8c3f2ac8bc507d3f240492521a4f8128a122b9..5a5bdb22d11cb0768fbdcff20a15acde53194b1b 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -26,7 +26,7 @@ use modd_budget, only: nbudgets, tbudgets,
                        NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE,   &
                        NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, &
                        NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1
-use modd_nsv,    only: csvnames, nsv
+use modd_nsv,    only: nsv, tsvlist
 
 integer          :: ibudget
 integer          :: jsv
@@ -91,8 +91,8 @@ tbudgets(NBUDGET_RH)%nid      = NBUDGET_RH
 
 do jsv = 1, nsv
   ibudget = NBUDGET_SV1 - 1 + jsv
-  tbudgets(ibudget)%cname    = Trim( csvnames(jsv) )
-  tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( csvnames(jsv) )
+  tbudgets(ibudget)%cname    = Trim( tsvlist(jsv)%cmnhname )
+  tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( tsvlist(jsv)%cmnhname )
   tbudgets(ibudget)%nid      = ibudget
 end do
 
@@ -229,8 +229,7 @@ use modd_dyn_n,         only: xtstep, locean
 use modd_elec_descr,    only: linductive, lrelax2fw_ion
 use modd_field,         only: TYPEREAL
 use modd_fire,          only: lblaze
-use modd_nsv,           only: csvnames,                                                                            &
-                              nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end,      &
+use modd_nsv,           only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end,      &
                               nsv_chembeg, nsv_chemend, nsv_chicbeg, nsv_chicend, nsv_csbeg, nsv_csend,            &
                               nsv_dstbeg, nsv_dstend, nsv_dstdepbeg, nsv_dstdepend, nsv_elecbeg, nsv_elecend,      &
 #ifdef MNH_FOREFIRE
@@ -239,21 +238,21 @@ use modd_nsv,           only: csvnames,
                               nsv_lgbeg, nsv_lgend,                                                                &
                               nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, &
                               nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl,                             &
-                              nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_scavmass, nsv_lima_spro,             &
-                              nsv_lima_ns, nsv_lima_ng, nsv_lima_nh,                                               &
+                              nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh,        &
+                              nsv_lima_scavmass, nsv_lima_spro,                                                    &
                               nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend,                                      &
                               nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend,        &
-                              nsv_user
+                              nsv_user, tsvlist
 use modd_parameters,   only: jphext
 use modd_param_c2r2,   only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat
 use modd_param_ice,    only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm
 use modd_param_n,      only: cactccn, celec
-use modd_param_lima,   only: laero_mass_lima => laero_mass, lacti_lima => lacti, lcold_lima => lcold, ldepoc_lima => ldepoc, &
-                             lhail_lima => lhail, lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl,       &
-                             lptsplit,                                                                                       &
-                             lrain_lima => lrain, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi,             &
-                             lsnow_lima => lsnow, lspro_lima => lspro,  lwarm_lima => lwarm, lcibu, lrdsf,           &
-                             nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm
+use modd_param_lima,   only: laero_mass_lima => laero_mass, lacti_lima => lacti, lcibu, lcold_lima => lcold,             &
+                             ldepoc_lima => ldepoc, lhail_lima => lhail, lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, &
+                             lnucl_lima => lnucl, lptsplit,                                                              &
+                             lrain_lima => lrain, lrdsf, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi,  &
+                             lsnow_lima => lsnow, lspro_lima => lspro,  lwarm_lima => lwarm,                             &
+                             nmod_ccn, nmod_ifn, nmod_imm, nmom_i
 use modd_ref,          only: lcouples
 use modd_salt,         only: lsalt
 use modd_turb_n,       only: lsubg_cond
@@ -528,6 +527,7 @@ if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. &
   tburhodj%xdata(:, :, :) = 0.
 end if
 
+
 tzsource%ntype    = TYPEREAL
 tzsource%ndims    = 3
 
@@ -1030,6 +1030,12 @@ if ( lbu_rth ) then
   tzsource%cmnhname   = 'DCONV'
   tzsource%clongname  = 'KAFR convection'
   tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'BLAZE'
+  tzsource%clongname  = 'blaze fire model contribution'
+  tzsource%lavailable = lblaze
   call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
 
   tzsource%cmnhname   = 'VTURB'
@@ -1115,7 +1121,7 @@ if ( lbu_rth ) then
 
   tzsource%cmnhname   = 'HIN'
   tzsource%clongname  = 'heterogeneous ice nucleation'
-  tzsource%lavailable = hcloud(1:3) == 'ICE' .or. (hcloud == 'LIMA' .and. nmom_i == 1)
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1 )
   call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
 
   tzsource%cmnhname   = 'HIND'
@@ -1271,11 +1277,6 @@ if ( lbu_rth ) then
                         .and. celec == 'NONE'
   call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
 
-  tzsource%cmnhname   = 'BLAZE'
-  tzsource%clongname  = 'blaze fire model contribution'
-  tzsource%lavailable = lblaze
-  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
-
 
   call Sourcelist_sort_compact( tbudgets(NBUDGET_TH) )
 
@@ -1462,6 +1463,11 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then
   tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
   call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
 
+  tzsource%cmnhname   = 'BLAZE'
+  tzsource%clongname  = 'blaze fire model contribution'
+  tzsource%lavailable = lblaze
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
   tzsource%cmnhname   = 'VTURB'
   tzsource%clongname  = 'vertical turbulent diffusion'
   tzsource%lavailable = hturb == 'TKEL'
@@ -1599,10 +1605,6 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then
                         .and. celec == 'NONE'
   call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
 
-  tzsource%cmnhname   = 'BLAZE'
-  tzsource%clongname  = 'blaze fire model contribution'
-  tzsource%lavailable = lblaze
-  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
 
   call Sourcelist_sort_compact( tbudgets(NBUDGET_RV) )
 
@@ -2896,8 +2898,8 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then
 
   tzsource%cmnhname   = 'COHG'
   tzsource%clongname  = 'conversion from hail to graupel'
-  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (lhail_lima .and. lcold_lima &
-                                                             .and. lwarm_lima .and. lsnow_lima) )
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (       lhail_lima .and. lcold_lima   &
+                                                                 .and. lwarm_lima .and. lsnow_lima ) )
   call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
 
   tzsource%cmnhname   = 'HGCV'
@@ -2955,7 +2957,7 @@ SV_BUDGETS: do jsv = 1, ksv
 
     tbudgets(ibudget)%tsources(:)%ngroup = 0
 
-    tzsource%ccomment = 'Budget of scalar variable ' // csvnames(jsv)
+    tzsource%ccomment = 'Budget of scalar variable ' // tsvlist(jsv)%cmnhname
     tzsource%ngrid    = 1
 
     tzsource%cunits   = '1'
@@ -4336,7 +4338,7 @@ end subroutine Budget_source_add
 subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 )
   use modd_budget,     only: tbudgetdata
   use modd_field,      only: TYPEINT, TYPEREAL
-  use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX
+  use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX
 
   use mode_tools,  only: Quicksort
 
@@ -4347,9 +4349,9 @@ subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 )
 
   character(len=NMNHNAMELGTMAX)      :: ymnhname
   character(len=NSTDNAMELGTMAX)      :: ystdname
-  character(len=32)                  :: ylongname
-  character(len=40)                  :: yunits
-  character(len=100)                 :: ycomment
+  character(len=NLONGNAMELGTMAX)     :: ylongname
+  character(len=NUNITLGTMAX)         :: yunits
+  character(len=NCOMMENTLGTMAX)      :: ycomment
   integer                            :: ji, jj, jk
   integer                            :: isources ! Number of source terms in a budget
   integer                            :: inbgroups ! Number of budget groups
diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index f4747410b9019c4081bb7335cd217cd6b0fb68ea..187d2e82048740e383f3d188647a576010565b25 100644
--- a/src/MNH/ini_deep_convection.f90
+++ b/src/MNH/ini_deep_convection.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-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.
@@ -109,33 +109,23 @@ END MODULE MODI_INI_DEEP_CONVECTION
 !!                    for a correct restart this variable has to be writen in FM file
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
-!  P. Wautelet 14/02/2019: move UPCASE function to tools.f90
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES
-USE MODD_CH_M9_n,         ONLY: CNAMES
-USE MODD_CONVPAR
-USE MODD_DUST,            ONLY: CDUSTNAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-use modd_field,           only: tfielddata, tfieldlist, TYPEREAL
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
+use modd_field,           only: tfieldmetadata, tfieldlist, TYPEREAL
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_NSV,             ONLY: NSV, NSV_USER, NSV_CHEMBEG, NSV_CHEMEND, NSV_C2R2BEG, NSV_C2R2END, &
-                                NSV_LGBEG, NSV_LGEND, NSV_LNOXBEG, NSV_LNOXEND, &
-                                NSV_DSTBEG, NSV_DSTEND, NSV_AERBEG, NSV_AEREND, &
-                                NSV_SLTBEG, NSV_SLTEND, NSV_PPBEG, NSV_PPEND, &
-                                NSV_C1R3BEG, NSV_C1R3END, NSV_ELECBEG, NSV_ELECEND
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_SALT,            ONLY: CSALTNAMES
+USE MODD_NSV,             ONLY: NSV, NSV_USER, TSVLIST,                               &
+                                NSV_AERDEPBEG, NSV_CHICBEG, NSV_CSBEG, NSV_DSTDEPBEG, &
+                                NSV_LIMA_BEG, NSV_PPBEG, NSV_SLTDEPBEG, NSV_SNWBEG,   &
+                                NSV_AERDEPEND, NSV_CHICEND, NSV_CSEND, NSV_DSTDEPEND, &
+                                NSV_LIMA_END, NSV_PPEND, NSV_SLTDEPEND, NSV_SNWEND
 USE MODD_TIME
 !
 use mode_field,           only: Find_field_id_from_mnhname
 USE MODE_IO_FIELD_READ,   only: IO_Field_read
-USE MODE_TOOLS,           ONLY: UPCASE
 !
 IMPLICIT NONE
 !
@@ -180,10 +170,12 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG
 !*       0.2   declarations of local variables
 !
 !
-INTEGER          :: IID
-INTEGER          :: IRESP
-INTEGER          :: JSV     ! number of tracers
-TYPE(TFIELDDATA) :: TZFIELD
+INTEGER              :: IID
+INTEGER              :: IRESP
+INTEGER              :: JSV     ! number of tracers
+LOGICAL              :: GOLDFILEFORMAT
+LOGICAL              :: GREAD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -196,6 +188,10 @@ TYPE(TFIELDDATA) :: TZFIELD
 !*       2. INITIALIZE CONVECTIVE TENDENCIES
 !	        --------------------------------
 !
+!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
+                   .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
+
 PUMFCONV(:,:,:)  = 0.0
 PDMFCONV(:,:,:)  = 0.0
 PMFCONV(:,:,:)   = 0.0  ! warning, restart may be incorrect
@@ -233,19 +229,19 @@ ELSE
   CALL IO_Field_read(TPINIFILE,'DRICONV',  PDRICONV)
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PPRCONV)
   PPRCONV=PPRCONV/(1000.*3600.) ! conversion into m/s units
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PPRSCONV)
   PPRSCONV=PPRSCONV/(1000.*3600.) ! conversion into m/s units
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PPACCONV)
   PPACCONV=PPACCONV/1000.       ! conversion into m unit
@@ -258,83 +254,50 @@ ELSE
   END IF
 !
 !
- SELECT CASE(HGETSVCONV)
-  CASE('READ')
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 's-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+ GETSVCONV: SELECT CASE(HGETSVCONV)
+  CASE('READ') GETSVCONV
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'generic for ini_deep_convection', & !Temporary name to ease identification
+      CUNITS     = 's-1',         &
+      CDIR       = 'XY',          &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .TRUE.         )
     !
-    DO JSV = 1, NSV_USER
-      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
+    DO JSV = 1, NSV
+      GREAD = .TRUE.
+
+      IF ( GOLDFILEFORMAT ) THEN
+        IF ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+             ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND )      ) THEN
+          WRITE( TZFIELD%CMNHNAME, '( A7, I3.3 )' ) 'DSVCONV', JSV
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        ELSE IF ( ( JSV >= NSV_LIMA_BEG  .AND. JSV <= NSV_LIMA_END  ) .OR. &
+                  ( JSV >= NSV_CSBEG     .AND. JSV <= NSV_CSEND     ) .OR. &
+                  ( JSV >= NSV_CHICBEG   .AND. JSV <= NSV_CHICEND   ) .OR. &
+                  ( JSV >= NSV_AERDEPBEG .AND. JSV <= NSV_AERDEPEND ) .OR. &
+                  ( JSV >= NSV_DSTDEPBEG .AND. JSV <= NSV_DSTDEPEND ) .OR. &
+                  ( JSV >= NSV_SLTDEPBEG .AND. JSV <= NSV_SLTDEPEND ) .OR. &
+                  ( JSV >= NSV_SNWBEG    .AND. JSV <= NSV_SNWEND    )      ) THEN
+          PDSVCONV(:,:,:,JSV) = 0.0
+          GREAD = .FALSE. !This variable was not written in pre-5.6 files
+        ELSE
+          TZFIELD%CMNHNAME   = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+          TZFIELD%CLONGNAME  = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+        END IF
+      ELSE
+        TZFIELD%CMNHNAME   = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+        TZFIELD%CLONGNAME  = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+      END IF
+      WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' )'X_Y_Z_DSVCONV', JSV
+      IF ( GREAD ) CALL IO_Field_read( TPINIFILE, TZFIELD, PDSVCONV(:,:,:,JSV) )
     END DO
-    DO JSV = NSV_C2R2BEG, NSV_C2R2END
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_C1R3BEG, NSV_C1R3END
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_ELECBEG, NSV_ELECEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_AERBEG, NSV_AEREND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_LINOX'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_DSTBEG, NSV_DSTEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_SLTBEG, NSV_SLTEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_LGBEG, NSV_LGEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_PPBEG, NSV_PPEND
-      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
-    END DO
- END SELECT
+
+  CASE('INIT') GETSVCONV
+    PDSVCONV(:,:,:,:) = 0.0
+
+ END SELECT GETSVCONV
 !
 !
 END IF
diff --git a/src/MNH/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90
index d44800cdcd9db3fe83ddd67555e70ae68b186440..6f39e805a357747f41972243e967fbdbd58700e1 100644
--- a/src/MNH/ini_diag_in_run.f90
+++ b/src/MNH/ini_diag_in_run.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2003-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 profiler 2006/10/24 10:07:46
-!-----------------------------------------------------------------
 !      #########################
 MODULE MODI_INI_DIAG_IN_RUN
 !      #########################
@@ -61,18 +56,19 @@ END MODULE MODI_INI_DIAG_IN_RUN
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!     Original 11/2003
-!!                   02/2018 Q.Libois ECRAD
-!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
-!!
-!! --------------------------------------------------------------------------
-!       
+!     Original 11/2003
+!  Q. Libois      02/2018: ECRAD
+!  S. Bielli      02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX
+! --------------------------------------------------------------------------
+!
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_CONF, ONLY : CPROGRAM
-USE MODD_PARAMETERS, ONLY : XUNDEF
 USE MODD_DIAG_IN_RUN
+USE MODD_PARAMETERS, ONLY : XUNDEF
+USE MODD_SURF_PAR,   ONLY: XUNDEF_SFX => XUNDEF
 !
 IMPLICIT NONE
 !
@@ -118,27 +114,27 @@ IF (LDIAG_IN_RUN) THEN
   ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves
   !
   !
-  XCURRENT_RN    = XUNDEF
-  XCURRENT_H     = XUNDEF
-  XCURRENT_LE    = XUNDEF
-  XCURRENT_LEI   = XUNDEF  
-  XCURRENT_GFLUX = XUNDEF
+  XCURRENT_RN    = XUNDEF_SFX
+  XCURRENT_H     = XUNDEF_SFX
+  XCURRENT_LE    = XUNDEF_SFX
+  XCURRENT_LEI   = XUNDEF_SFX
+  XCURRENT_GFLUX = XUNDEF_SFX
   XCURRENT_LWD   = XUNDEF
   XCURRENT_LWU   = XUNDEF
   XCURRENT_SWD   = XUNDEF
   XCURRENT_SWU   = XUNDEF
   XCURRENT_SWDIR = XUNDEF
   XCURRENT_SWDIFF= XUNDEF  
-  XCURRENT_T2M   = XUNDEF
-  XCURRENT_Q2M   = XUNDEF
-  XCURRENT_HU2M  = XUNDEF
-  XCURRENT_ZON10M= XUNDEF
-  XCURRENT_MER10M= XUNDEF
+  XCURRENT_T2M   = XUNDEF_SFX
+  XCURRENT_Q2M   = XUNDEF_SFX
+  XCURRENT_HU2M  = XUNDEF_SFX
+  XCURRENT_ZON10M= XUNDEF_SFX
+  XCURRENT_MER10M= XUNDEF_SFX
   XCURRENT_DSTAOD= XUNDEF
-  XCURRENT_SFCO2 = XUNDEF
+  XCURRENT_SFCO2 = XUNDEF_SFX
   XCURRENT_TKE_DISS = XUNDEF
   XCURRENT_SLTAOD= XUNDEF
-  XCURRENT_ZWS = XUNDEF
+  XCURRENT_ZWS = XUNDEF_SFX
 ELSE
   ALLOCATE(XCURRENT_RN    (0,0))! net radiation
   ALLOCATE(XCURRENT_H     (0,0))! sensible heat flux
diff --git a/src/MNH/ini_dynamics.f90 b/src/MNH/ini_dynamics.f90
index e4d00f5bb6aa29d04e9ce3cdb3cf10e0ae4187cb..add1cc9e389d189ec736e64cc2c1c4f87e6d4758 100644
--- a/src/MNH/ini_dynamics.f90
+++ b/src/MNH/ini_dynamics.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ########################
@@ -8,7 +8,7 @@
 !     ########################
 INTERFACE
 SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ,                   &
-               PDXHAT,PDYHAT,PZHAT,HLBCX,HLBCY,PTSTEP,                       &
+               PDXHAT,PDYHAT,PZHAT,PZHATM,HLBCX,HLBCY,PTSTEP,                &
                OVE_RELAX,OVE_RELAX_GRD,OHORELAX_UVWTH,OHORELAX_RV,           &
                OHORELAX_RC,OHORELAX_RR,OHORELAX_RI,OHORELAX_RS,OHORELAX_RG,  &
                OHORELAX_RH,OHORELAX_TKE,OHORELAX_SV,                         &
@@ -41,7 +41,8 @@ REAL, DIMENSION(:,:),   INTENT(IN)        :: PMAP      ! Map factor
 REAL, DIMENSION(:,:,:), INTENT(IN)        :: PZZ       ! height 
 REAL, DIMENSION(:),     INTENT(IN)        :: PDXHAT     ! Stretching in x direction
 REAL, DIMENSION(:),     INTENT(IN)        :: PDYHAT     ! Stretching in y direction
-REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height   
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHATM    ! ... at mass points
 CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCX    ! x-direction LBC type
 CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCY    ! y-direction LBC type
 LOGICAL,                INTENT(IN)        :: OVE_RELAX ! logical
@@ -179,7 +180,7 @@ END INTERFACE
 END MODULE MODI_INI_DYNAMICS
 !     ######################################################################
 SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ,                   &
-               PDXHAT,PDYHAT,PZHAT,HLBCX,HLBCY,PTSTEP,                       &
+               PDXHAT,PDYHAT,PZHAT,PZHATM,HLBCX,HLBCY,PTSTEP,                &
                OVE_RELAX,OVE_RELAX_GRD,OHORELAX_UVWTH,OHORELAX_RV,           &
                OHORELAX_RC,OHORELAX_RR,OHORELAX_RI,OHORELAX_RS,OHORELAX_RG,  &
                OHORELAX_RH,OHORELAX_TKE,OHORELAX_SV,                         &
@@ -312,6 +313,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN)        :: PZZ       ! height
 REAL, DIMENSION(:),     INTENT(IN)        :: PDXHAT     ! Stretching in x direction
 REAL, DIMENSION(:),     INTENT(IN)        :: PDYHAT     ! Stretching in y direction
 REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height   
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHATM    ! ... at mass points
 CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCX    ! x-direction LBC type
 CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCY    ! y-direction LBC type
 LOGICAL,                INTENT(IN)        :: OVE_RELAX ! logical
@@ -540,7 +542,7 @@ IF (GHORELAX .OR. OVE_RELAX.OR.OVE_RELAX_GRD) THEN
      OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, &
      OHORELAX_SVPP, OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW,    &
      PALKTOP,PALKGRD, PALZBOT,PALZBAS,                                &
-     PZZ, PZHAT, PTSTEP,                                              &
+     PZZ, PZHAT, PZHATM, PTSTEP,                                      &
      PRIMKMAX,KRIMX,KRIMY,                                            &
      PALK, PALKW, KALBOT,                                             &
      PALKBAS, PALKWBAS, KALBAS,                                       &
diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90
index 27ed168cdda2b4f23db4406621869b9161434049..1489ba1af8c26f75a239e04265df6024d392624f 100644
--- a/src/MNH/ini_elecn.f90
+++ b/src/MNH/ini_elecn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2009-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2009-2023 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -20,12 +20,12 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
 TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
 REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ     ! height z
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX    ! metric coefficient dxx
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY    ! metric coefficient dyy
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ    ! metric coefficient dzz
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX    ! metric coefficient dzx
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY    ! metric coefficient dzy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PZZ     ! height z
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX    ! metric coefficient dzx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY    ! metric coefficient dzy
 !
 END SUBROUTINE INI_ELEC_n
 END INTERFACE
@@ -130,12 +130,12 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
 TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
 REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ     ! height z
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX    ! metric coefficient dxx
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY    ! metric coefficient dyy
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ    ! metric coefficient dzz
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX    ! metric coefficient dzx
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY    ! metric coefficient dzy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PZZ     ! height z
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX    ! metric coefficient dzx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY    ! metric coefficient dzy
 !
 !*       0.2   declarations of local variables
 !
diff --git a/src/MNH/ini_field_elec.f90 b/src/MNH/ini_field_elec.f90
index c5dcbb79a30d93761faecc41871205996584c396..49206a1d8d43a3d95d1fc8b59a8e2d74f7fc8f7e 100644
--- a/src/MNH/ini_field_elec.f90
+++ b/src/MNH/ini_field_elec.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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.
@@ -11,12 +11,12 @@ INTERFACE
 !
       SUBROUTINE INI_FIELD_ELEC (PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ)
 !
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDXX     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDYY     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZZ     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZX     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZY     ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PZZ      ! vertical grid
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDXX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDYY     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZZ     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZY     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PZZ      ! vertical grid
 !
 END SUBROUTINE INI_FIELD_ELEC
 END INTERFACE
@@ -85,12 +85,12 @@ IMPLICIT NONE
 !
 !*	0.1	Declaration of dummy arguments
 !
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDXX  ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDYY  ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZZ  ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZX  ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PDZY  ! Metric coefficients
-REAL, DIMENSION(:,:,:),  INTENT(IN) ::  PZZ   ! vertical grid
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDXX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDYY     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PDZZ     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZX     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) ::  PDZY     ! Metric coefficients
+REAL, DIMENSION(:,:,:),  INTENT(IN)    ::  PZZ      ! vertical grid
 !
 !*	0.2	Declaration of local variables
 !
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index b07d03d4c2334d0ad1a23d773123a93ca33a9f6b..a5da9cfcf293144c5ec7f1611036efc5747cc6fe 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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.
@@ -131,37 +131,29 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV,                          &
 !!      J.Escobar : 27/04/2016 : bug , test only on ANY(HGETSVM({{1:KSV}})=='READ'
 !!      J.-P. Pinty     09/02/16    Add LIMA that is LBC for CCN and IFN
 !!      M.Leriche       09/02/16    Treat gas and aq. chemicals separately
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases
-!  P. Wautelet 14/02/2019: move UPCASE function to tools.f90
-!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  S. Bielli      02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !
-USE MODD_CH_AEROSOL
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
-USE MODD_CTURB
-USE MODD_CONF
-USE MODD_DUST
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-use modd_field,           only: tfielddata, TYPELOG, TYPEREAL
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
+USE MODD_CTURB,           ONLY: XTKEMIN
+USE MODD_CONF,            ONLY: LCPL_AROME
+use modd_field,           only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_LUNIT_n,         ONLY: TLUOUT
-USE MODD_NSV
-USE MODD_PARAMETERS,      ONLY: JPHEXT,NMNHNAMELGTMAX
-USE MODD_PARAM_LIMA
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES
-USE MODD_PARAM_n
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_SALT
+USE MODD_NSV,             ONLY: NSV, NSV_CS, NSV_CSBEG, NSV_CSEND, NSV_LIMA_BEG, NSV_LIMA_END,      &
+#ifdef MNH_FOREFIRE
+                                NSV_FF, NSV_FFBEG, NSV_FFEND,                                       &
+#endif
+                                NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, NSV_PP, NSV_PPBEG, NSV_PPEND, &
+                                NSV_SNWBEG, NSV_SNWEND, NSV_USER, TSVLIST
+USE MODD_PARAMETERS,      ONLY: JPHEXT, JPSVNAMELGTMAX, NLONGNAMELGTMAX, NMNHNAMELGTMAX
+USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IFN
 !
 USE MODE_IO_FIELD_READ,   only: IO_Field_read, IO_Field_read_lb
 USE MODE_MSG
-USE MODE_TOOLS, ONLY: UPCASE
 !
 IMPLICIT NONE
 !
@@ -223,16 +215,18 @@ INTEGER             :: JSV,JRR                    ! Loop index for MOIST AND
                                                   !  additional scalar variables 
 INTEGER             :: IRR                        !  counter for moist variables
 INTEGER             :: IRESP
-INTEGER             :: ILUOUT   !  Logical unit number associated with TLUOUT
-LOGICAL :: GHORELAX_UVWTH  ! switch for the horizontal relaxation for U,V,W,TH in the FM file 
+LOGICAL :: GHORELAX_UVWTH  ! switch for the horizontal relaxation for U,V,W,TH in the FM file
 LOGICAL :: GHORELAX_TKE    ! switch for the horizontal relaxation for tke in the FM file
 LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation 
                                    ! for moist and scalar variables
+LOGICAL :: GIS551 ! True if file was written with MNH 5.5.1
+LOGICAL :: GOLDFILEFORMAT
 CHARACTER (LEN= LEN(HGETRVM)), DIMENSION (7) :: YGETRXM ! Arrays with  the get indicators 
                                                         !  for the moist variables
 CHARACTER (LEN=1), DIMENSION (7) :: YC    ! array with the prefix of the moist variables
-CHARACTER(LEN=2)  :: INDICE ! to index CCN and IFN fields of LIMA scheme
-TYPE(TFIELDDATA)  :: TZFIELD
+CHARACTER(LEN=NMNHNAMELGTMAX)  :: YMNHNAME_BASE
+CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !
@@ -248,7 +242,10 @@ ENDIF
 !*       1.    SOME INITIALIZATIONS
 !              --------------------
 !
-ILUOUT = TLUOUT%NLU
+!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
+                   .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
+GIS551 = TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) == 1
 !
 !
 !-------------------------------------------------------------------------------
@@ -285,37 +282,14 @@ ELSE
   IL3DYV=2 + 2*JPHEXT ! 4 
 ENDIF
 !
-IF (KSIZELBXU_ll/= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBXUM',IL3DXU,IRIMXU,PLBXUM)
-END IF
-
-IF ( KSIZELBX_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBXVM',IL3DX,IRIMX,PLBXVM)
-ENDIF
-
-IF ( KSIZELBX_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBXWM',IL3DX,IRIMX,PLBXWM)
-END IF
-
-IF ( KSIZELBY_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBYUM',IL3DY,IRIMY,PLBYUM)
-END IF
-
-IF ( KSIZELBYV_ll  /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBYVM',IL3DYV,IRIMYV,PLBYVM)
-END IF
-
-IF (KSIZELBY_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBYWM',IL3DY,IRIMY,PLBYWM)
-END IF
-
-IF (KSIZELBX_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBXTHM',IL3DX,IRIMX,PLBXTHM)
-END IF
-
-IF ( KSIZELBY_ll /= 0) THEN
-  CALL IO_Field_read_lb(TPINIFILE,'LBYTHM',IL3DY,IRIMY,PLBYTHM)
-END IF
+IF ( KSIZELBXU_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXUM',  IL3DXU, IRIMXU, PLBXUM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXVM',  IL3DX,  IRIMX,  PLBXVM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXWM',  IL3DX,  IRIMX,  PLBXWM  )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYUM',  IL3DY,  IRIMY,  PLBYUM  )
+IF ( KSIZELBYV_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYVM',  IL3DYV, IRIMYV, PLBYVM  )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYWM',  IL3DY,  IRIMY,  PLBYWM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXTHM', IL3DX,  IRIMX,  PLBXTHM )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYTHM', IL3DY,  IRIMY,  PLBYTHM )
 !
 !*        2.3  LB-TKE
 !
@@ -323,11 +297,10 @@ SELECT CASE(HGETTKEM)
 CASE('READ') 
   IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
     IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN
-      WRITE ( ILUOUT,*) 'LBXTKES AND LBYTKES WILL BE INITIALIZED TO 0'
+      CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'LBXTKES and LBYTKE are initialized to PLBXTKEMM and PLBYTKEMM' )
       PLBXTKEM(:,:,:) = PLBXTKEMM(:,:,:)    
       PLBYTKEM(:,:,:) = PLBYTKEMM(:,:,:)
     ELSE
-!callabortstop
       CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize LBXTKES and LBYTKES')
     ENDIF
   ELSE
@@ -361,17 +334,18 @@ END SELECT
 !*        2.5 LB-Rx
 !
 IF(KSIZELBXR_ll  > 0 ) THEN
-  TZFIELD%CMNHNAME   = 'HORELAX_R'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HORELAX_R'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Switch to activate the HOrizontal RELAXation'
-  TZFIELD%CLBTYPE    = 'NONE'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                                      &
+    CMNHNAME   = 'HORELAX_R',                                    &
+    CSTDNAME   = '',                                             &
+    CLONGNAME  = 'HORELAX_R',                                    &
+    CUNITS     = '',                                             &
+    CDIR       = '--',                                           &
+    CCOMMENT   = 'Switch to activate the HOrizontal RELAXation', &
+    CLBTYPE    = 'NONE',                                         &
+    NGRID      = 1,                                              &
+    NTYPE      = TYPELOG,                                        &
+    NDIMS      = 0,                                              &
+    LTIMEDEP   = .FALSE.                                         )
   !
   CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_R)
   !
@@ -389,13 +363,13 @@ IF(KSIZELBXR_ll  > 0 ) THEN
     IL3DY=2*JPHEXT ! 2
   END IF
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA( &
+    CUNITS     = 'kg kg-1', &
+    CDIR       = '',        &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
   !
   IRR=0
   JRR=1
@@ -432,9 +406,8 @@ IF(KSIZELBXR_ll  > 0 ) THEN
         IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
             IF (PRESENT(PLBXRMM)) THEN
               PLBXRM(:,:,:,IRR)=PLBXRMM(:,:,:,IRR)
-              WRITE(ILUOUT,*) 'PLBXRS  will be initialized to 0 for LBXR'//YC(JRR)//'M'
+              CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXRM is initialized to PLBXRMM for LBXR'//YC(JRR)//'M' )
             ELSE
-              !callabortstop
               CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXRM for LBXR'//YC(JRR)//'M')
             ENDIF
         ELSE
@@ -450,9 +423,8 @@ IF(KSIZELBXR_ll  > 0 ) THEN
         IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
             IF (PRESENT(PLBYRMM)) THEN
               PLBYRM(:,:,:,IRR)=PLBYRMM(:,:,:,IRR)
-              WRITE(ILUOUT,*) 'PLBYRS  will be initialized to 0 for LBYR'//YC(JRR)//'M'
+              CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYRM is initialized to PLBYRMM for LBYR'//YC(JRR)//'M' )
             ELSE
-              !callabortstop
               CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYRM for LBYR'//YC(JRR)//'M')
             ENDIF
          ELSE
@@ -473,1138 +445,218 @@ END IF
 !
 !*        2.6    LB-Scalar Variables
 !
-PLBXSVM(:,:,:,:) = 0.
-PLBYSVM(:,:,:,:) = 0.
-!
 IF (KSV > 0) THEN
   IF (ANY(HGETSVM(1:KSV)=='READ')) THEN
-    TZFIELD%CMNHNAME   = 'HORELAX_SV'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'HORELAX_SV'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%CLBTYPE    = 'NONE'
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPELOG
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
-    CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_SV)
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'HORELAX_SV', &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'HORELAX_SV', &
+      CUNITS     = '',           &
+      CDIR       = '--',         &
+      CCOMMENT   = '',           &
+      CLBTYPE    = 'NONE',       &
+      NGRID      = 0,            &
+      NTYPE      = TYPELOG,      &
+      NDIMS      = 0,            &
+      LTIMEDEP   = .FALSE.       )
+    CALL IO_Field_read( TPINIFILE, TZFIELD, GHORELAX_SV )
+
     IF ( GHORELAX_SV ) THEN
-      IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2   
+      IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2
       IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2
       IL3DX=2*ILBSIZEX+2*JPHEXT
       IL3DY=2*ILBSIZEY+2*JPHEXT
     ELSE
       IRIMX=0
       IRIMY=0
-      IL3DX=2*JPHEXT !2
-      IL3DY=2*JPHEXT !2
+      IL3DX=2*JPHEXT
+      IL3DY=2*JPHEXT
     END IF
   END IF
 END IF
-! User scalar variables
-IF (NSV_USER>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = 1, NSV_USER
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'PLXYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! C2R2 scalar variables
-IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_C2R2BEG, NSV_C2R2END
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'C2R2 PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'C2R2 PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBYSVM')
-              ENDIF
+
+! Scalar variables
+DO JSV = 1, NSV
+  SELECT CASE( HGETSVM(JSV) )
+    CASE ( 'READ' )
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CDIR = ''
+      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
+      YMNHNAME_BASE  = TRIM( TZFIELD%CMNHNAME  )
+      YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME )
+
+      IF ( KSIZELBXSV_ll /= 0 .AND. SIZE( PLBXSVM, 1 ) /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBX_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE )
+
+        !Some variables were written with an other name in MesoNH < 5.6
+        IF ( GOLDFILEFORMAT ) THEN
+          IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN
+            WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBXSVM',JSV
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
+          ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+            ! Name was corrected in MNH 5.5.1
+            IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            TZFIELD%CSTDNAME  = ''
+          ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_PP'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_PP'
+            IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_PP scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_PP variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_PP'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! C1R3 scalar variables
-IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_C1R3BEG, NSV_C1R3END
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'C1R3 PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBXSVM')
-              ENDIF
+#ifdef MNH_FOREFIRE
+          ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_FF'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_FF'
+            IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_FF scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_FF variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_FF'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'C1R3 PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBYSVM')
-              ENDIF
+#endif
+          ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_CS'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_CS'
+            IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_CS scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_CS variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_CS'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
           END IF
         END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-! LIMA: CCN and IFN scalar variables
-!
-IF (CCLOUD=='LIMA' ) THEN
-  IF (NSV_LIMA_CCN_FREE+NMOD_CCN-1 >= NSV_LIMA_CCN_FREE) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
-      SELECT CASE(HGETSVM(JSV))
-        CASE ('READ')
-          WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-          IF ( KSIZELBXSV_ll /= 0 ) THEN
-            IF (        TPINIFILE%NMNHVERSION(1) < 5                                       &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5  &
-                        .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN
-              TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-            ELSE
-              TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-            END IF
-            TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-            TZFIELD%CLBTYPE    = 'LBX'
-            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-            CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-            IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-              IF (IRESP/=0) THEN
-                IF (PRESENT(PLBXSVMM)) THEN
-                  PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                  WRITE(ILUOUT,*) 'CCN PLBXSVM   will be initialized to 0'
-                ELSE
-!callabortstop
-                  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBXSVM')
-                ENDIF
-              END IF
-            END IF
-          END IF
-          !
-          IF (KSIZELBYSV_ll  /= 0 ) THEN
-            IF (        TPINIFILE%NMNHVERSION(1) < 5                                       &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5  &
-                        .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN
-              TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-            ELSE
-              TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-            END IF
-            TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-            TZFIELD%CLBTYPE    = 'LBY'
-            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-            CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-            IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-              IF (IRESP/=0) THEN
-                IF (PRESENT(PLBYSVMM)) THEN
-                  PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                  WRITE(ILUOUT,*) 'CCN PLBYSVM   will be initialized to 0'
-                ELSE
-!callabortstop
-                  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBYSVM')
-                ENDIF
-              END IF
-            END IF
-          END IF
-        CASE('INIT')
-          IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-          IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-      END SELECT
-    END DO
-  END IF
-  !
-  IF (NSV_LIMA_IFN_FREE+NMOD_IFN-1 >= NSV_LIMA_IFN_FREE) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
-      SELECT CASE(HGETSVM(JSV))
-        CASE ('READ')
-          WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-          IF ( KSIZELBXSV_ll /= 0 ) THEN
-            IF (        TPINIFILE%NMNHVERSION(1) < 5                                       &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5  &
-                        .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN
-              TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
-            ELSE
-              TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
-            END IF
-            TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-            TZFIELD%CLBTYPE    = 'LBX'
-            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-            CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-            IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-              IF (IRESP/=0) THEN
-                IF (PRESENT(PLBXSVMM)) THEN
-                  PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                  WRITE(ILUOUT,*) 'IFN PLBXSVM   will be initialized to 0'
-                ELSE
-!callabortstop
-                  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
-                ENDIF
+
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV
+        TZFIELD%CLBTYPE     = 'LBX'
+
+        CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DX, IRIMX, PLBXSVM(:,:,:,JSV), IRESP )
+
+        IF ( IRESP /= 0 ) THEN
+          IF ( PRESENT( PLBXSVMM ) ) THEN
+            PLBXSVM(:,:,:,JSV) = PLBXSVMM(:,:,:,JSV)
+            CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXSVM is initialized to PLBXSVMM for ' // TRIM( YMNHNAME_BASE ) )
+          ELSE
+            IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+              !In pre 5.6 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables)
+              IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN
+                CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBXSVM' )
+              ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN
+                CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBXSVM' )
+              ELSE
+                PLBXSVM(:,:,:,JSV) = 0.
+                CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
               END IF
-            END IF
-          END IF
-          !
-          IF (KSIZELBYSV_ll  /= 0 ) THEN
-            IF (        TPINIFILE%NMNHVERSION(1) < 5                                       &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) &
-                 .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5  &
-                        .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN
-              TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
+            ELSE IF ( ( JSV >= NSV_PPBEG  .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+                      ( JSV >= NSV_FFBEG  .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+                      ( JSV >= NSV_CSBEG  .AND. JSV <= NSV_CSEND ) .OR. &
+                      ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6
+              PLBXSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
             ELSE
-              TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
-            END IF
-            TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-            TZFIELD%CLBTYPE    = 'LBY'
-            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-            CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-            IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-              IF (IRESP/=0) THEN
-                IF (PRESENT(PLBYSVMM)) THEN
-                  PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                  WRITE(ILUOUT,*) 'IFN PLBYSVM   will be initialized to 0'
-                ELSE
-!callabortstop
-                  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
-                ENDIF
-              END IF
-            END IF
-          END IF
-        CASE('INIT')
-          IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-          IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-      END SELECT
-    END DO
-  END IF
-ENDIF
-! ELEC scalar variables
-IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_ELECBEG, NSV_ELECEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'ELEC PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'ELEC PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Chemical gas phase scalar variables
-IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHGSBEG, NSV_CHGSEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Chemical aqueous phase scalar variables
-IF (NSV_CHACEND>=NSV_CHACBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHACBEG, NSV_CHACEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Chemical ice phase scalar variables
-IF (NSV_CHICEND>=NSV_CHICBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHICBEG, NSV_CHICEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Ice phase chemical PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Ice phase chemical PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Orilam aerosol scalar variables
-IF (NSV_AEREND>=NSV_AERBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_AERBEG, NSV_AEREND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Aerosol PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Aerosol PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Orilam aerosols moist scalar variables
-IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_AERDEPBEG, NSV_AERDEPEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Aerosol PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Aerosol PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Dust scalar variables
-IF (NSV_DSTEND>=NSV_DSTBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_DSTBEG, NSV_DSTEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Dust PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Dust PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_DSTDEPBEG, NSV_DSTDEPEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Dust Desposition PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Dust Depoistion  PLBYSVM   will be initialized to 0'
-              ELSE
-                WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM '
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Sea salt scalar variables
-IF (NSV_SLTEND>=NSV_SLTBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_SLTBEG, NSV_SLTEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Sea Salt PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Sea Salt PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Passive pollutant variables
-IF (NSV_PPEND>=NSV_PPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_PPBEG, NSV_PPEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_PP'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM   will be initialized to 0'
-              ELSE
-                PLBXSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM   will be initialized to 0'
-              ENDIF
+              CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBXSVM for ' // TRIM( YMNHNAME_BASE ) )
             END IF
           END IF
         END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_PP'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM   will be initialized to 0'
-              ELSE
-                PLBYSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM   will be initialized to 0'
-              ENDIF
+      END IF
+
+      IF ( KSIZELBYSV_ll /= 0 .AND. SIZE( PLBYSVM, 1 ) /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBY_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE )
+
+        !Some variables were written with an other name in MesoNH < 5.6
+        IF ( GOLDFILEFORMAT ) THEN
+          IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN
+            WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBYSVM',JSV
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
+          ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+            ! Name was corrected in MNH 5.5.1
+            IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            TZFIELD%CSTDNAME  = ''
+          ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_PP'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_PP'
+            IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_PP scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_PP variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_PP'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
 #ifdef MNH_FOREFIRE
-! ForeFire scalar variables
-IF (NSV_FFEND>=NSV_FFBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_FFBEG, NSV_FFEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_FF'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          WRITE(ILUOUT,*) 'ForeFire LBX_FF ', IRESP
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM   will be initialized to 0'
-              ELSE
-                PLBXSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM   will be initialized to 0'
-              ENDIF
+          ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_FF'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_FF'
+            IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_FF scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_FF variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_FF'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_FF'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0'
-              ELSE
-                PLBYSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0'
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
 #endif
-! Conditional sampling variables
-IF (NSV_CSEND>=NSV_CSBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CSBEG, NSV_CSEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_CS'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Conditional sampling LBXSVM   will be initialized to 0'
-              ELSE
-                PLBXSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'Conditional sampling PLBXSVM   will be initialized to 0'
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_CS'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM   will be initialized to 0'
-              ELSE
-                PLBYSVM(:,:,:,JSV)=0.
-                WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM   will be initialized to 0'
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Linox scalar variables
-IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_LNOXBEG, NSV_LNOXEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_LINOX'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Linox PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBXSVM')
-              ENDIF
+          ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_CS'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_CS'
+            IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_CS scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_CS variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_CS'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
             END IF
           END IF
         END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_LINOX'
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Linox PLBYSVM   will be initialized to 0'
-              ELSE
-!calla bortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBYSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! Lagrangian variables
-IF (NSV_LGEND>=NSV_LGBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_LGBEG, NSV_LGEND
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBXSVMM)) THEN
-                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'lagrangian PLBXSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBXSVM')
-              ENDIF
-            END IF
-          END IF
-        END IF
-        !
-        IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-            IF (IRESP/=0) THEN
-              IF (PRESENT(PLBYSVMM)) THEN
-                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'lagrangian PLBYSVM   will be initialized to 0'
-              ELSE
-!callabortstop
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBYSVM')
-              ENDIF
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) 'X_2_Z_', 'LBYSVM', JSV
+        TZFIELD%CLBTYPE     = 'LBY'
+
+        CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DY, IRIMY, PLBYSVM(:,:,:,JSV), IRESP )
+
+        IF ( IRESP /= 0 ) THEN
+          IF ( PRESENT( PLBYSVMM ) ) THEN
+            PLBYSVM(:,:,:,JSV) = PLBYSVMM(:,:,:,JSV)
+            CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYSVM is initialized to PLBYSVMM for ' // TRIM( YMNHNAME_BASE ) )
+          ELSE
+            IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+              !In pre 5.6 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables)
+              IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN
+                CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBYSVM' )
+              ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN
+                CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBYSVM' )
+              ELSE
+                PLBYSVM(:,:,:,JSV) = 0.
+                CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+              END IF
+            ELSE IF ( ( JSV >= NSV_PPBEG  .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+                      ( JSV >= NSV_FFBEG  .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+                      ( JSV >= NSV_CSBEG  .AND. JSV <= NSV_CSEND ) .OR. &
+                      ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6
+              PLBYSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+            ELSE
+              CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBYSVM for ' // TRIM( YMNHNAME_BASE ) )
             END IF
           END IF
         END IF
-      !
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
+      END IF
+
+    CASE( 'INIT' )
+      IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+      IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+  END SELECT
+END DO
 !-------------------------------------------------------------------------------
 !
 !*       3.    COMPUTE THE LB SOURCES
@@ -1661,4 +713,32 @@ IF (OLSOURCE) THEN
 !
 ENDIF
 !
+CONTAINS
+
+  SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME )
+
+    CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME
+    CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME
+
+    INTEGER :: IPOS
+    INTEGER :: JI
+
+    !Try to generate CMNHNAME with old format
+    !In the old format, an indice of 2 numbers was written after the name but without trimming it
+    IPOS = SCAN( YMNHNAME, '0123456789' )
+
+    !Unmodified part YMNHNAME(1:IPOS-1) = YMNHNAME(1:IPOS-1)
+
+    !Move number part at the new end
+    IF ( 4+JPSVNAMELGTMAX+2 > LEN( YMNHNAME ) ) &
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','OLD_CMNHNAME_GENERATE_INTERN','CMNHNAME too small')
+    YMNHNAME(4+JPSVNAMELGTMAX+1 : 4+JPSVNAMELGTMAX+2) = YMNHNAME(IPOS : IPOS+1)
+    DO JI = IPOS, 4+JPSVNAMELGTMAX
+      YMNHNAME(JI:JI) = ' '
+    END DO
+
+    YLONGNAME = TRIM( YMNHNAME )
+
+  END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN
+
 END SUBROUTINE INI_LB
diff --git a/src/MNH/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90
index a3e9c7840171d597857e56403768981a86b0ff4a..822d415819808cb29a27cf69f9a6d16f5b3ea9e1 100644
--- a/src/MNH/ini_les_cart_maskn.f90
+++ b/src/MNH/ini_les_cart_maskn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
@@ -93,9 +93,6 @@ INTEGER,            INTENT(OUT) :: KLES_JSUP !
 !       0.2  declaration of local variables
 !
 !
-INTEGER :: IIMAX_ll  ! total physical father domain I size
-INTEGER :: IJMAX_ll  ! total physical father domain J size
-!
 INTEGER :: IIB_ll    ! son domain index
 INTEGER :: IIE_ll    ! son domain index
 INTEGER :: IJB_ll    ! son domain index
@@ -103,12 +100,12 @@ INTEGER :: IJE_ll    ! son domain index
 !
 INTEGER :: JI, JJ    ! loop counters
 !
-REAL    :: ZX, ZY    ! coordinates of msak boundaries
+REAL    :: ZX, ZY    ! coordinates of mask boundaries
 !
-INTEGER :: IINFO_ll, IRESP
+INTEGER :: IINFO_ll
 !
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll !
+REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates
+REAL, DIMENSION(:), POINTER :: ZYHAT_ll !
 INTEGER :: IMI
 !
 IMI = GET_CURRENT_MODEL_INDEX()
@@ -118,11 +115,8 @@ IMI = GET_CURRENT_MODEL_INDEX()
 !            --------------------------
 !
 CALL GO_TOMODEL_ll(IMI, IINFO_ll)
-CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) 
-ALLOCATE(ZXHAT_ll(IIMAX_ll+ 2 * JPHEXT))
-ALLOCATE(ZYHAT_ll(IJMAX_ll+ 2 * JPHEXT))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
+ZXHAT_ll => XXHAT_ll
+ZYHAT_ll => XYHAT_ll
 !
 CALL GO_TOMODEL_ll(KMI, IINFO_ll)
 !
@@ -208,9 +202,6 @@ ELSE
 END IF
 !
 !-------------------------------------------------------------------------------
-DEALLOCATE(ZXHAT_ll)
-DEALLOCATE(ZYHAT_ll)
-!-------------------------------------------------------------------------------
 !
   CONTAINS
 !
@@ -219,8 +210,6 @@ DEALLOCATE(ZYHAT_ll)
     KLES_ISUP=IIE_ll-JPHEXT
     KLES_JINF=IJB_ll-JPHEXT
     KLES_JSUP=IJE_ll-JPHEXT
-    DEALLOCATE(ZXHAT_ll)
-    DEALLOCATE(ZYHAT_ll)
   END SUBROUTINE MASK_OVER_ALL_DOMAIN
 !
 END SUBROUTINE INI_LES_CART_MASK_n   
diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90
index 378e43f533ddc33eac977c0cc9a82b5b9e72e6be..7caf12b44211de2f69700fbab021a42486aa40a7 100644
--- a/src/MNH/ini_lesn.f90
+++ b/src/MNH/ini_lesn.f90
@@ -46,8 +46,6 @@
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODE_ll
-USE MODE_GATHER_ll
 USE MODE_MSG
 USE MODE_MODELN_HANDLER
 !
@@ -90,25 +88,20 @@ IMPLICIT NONE
 !      
 INTEGER :: ILUOUT, IRESP
 INTEGER :: JI,JJ, JK ! loop counters
-INTEGER :: IIU_ll    ! total domain I size
-INTEGER :: IJU_ll    ! total domain J size
-INTEGER :: IIMAX_ll  ! total physical domain I size
-INTEGER :: IJMAX_ll  ! total physical domain J size
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra
 !
 !
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll !
+REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates
+REAL, DIMENSION(:), POINTER :: ZYHAT_ll !
 INTEGER :: IMI
 !
 !-------------------------------------------------------------------------------
 IMI = GET_CURRENT_MODEL_INDEX()
 !
-CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
-IIU_ll = IIMAX_ll+2*JPHEXT
-IJU_ll = IJMAX_ll+2*JPHEXT
+ZXHAT_ll => NULL()
+ZYHAT_ll => NULL()
 !
 ILUOUT = TLUOUT%NLU
 !
@@ -208,19 +201,14 @@ IF (IMI==1) THEN
 !  -----------------------------------------------------
 !
 ELSE
-  ALLOCATE(ZXHAT_ll(IIU_ll))
-  ALLOCATE(ZYHAT_ll(IJU_ll))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
+  ZXHAT_ll => XXHAT_ll !Use current (IMI) model XXHAT_ll
+  ZYHAT_ll => XYHAT_ll
 !
   CALL GOTO_MODEL(NDAD(IMI))
   CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll,          &
                          NLESn_IINF(IMI),NLESn_JINF(IMI), &
                          NLESn_ISUP(IMI),NLESn_JSUP(IMI)  )
   CALL GOTO_MODEL(IMI)
-! 
-  DEALLOCATE(ZXHAT_ll)
-  DEALLOCATE(ZYHAT_ll)
 END IF
 !
 !* in non cyclic boundary conditions, limitiation of masks due to u and v grids
diff --git a/src/MNH/ini_lg.f90 b/src/MNH/ini_lg.f90
index 0ce0d7b1b535d813371881bfc2daf5d6b968aae2..8f5428cae1f9421a238f4c35a74b69ff17b81544 100644
--- a/src/MNH/ini_lg.f90
+++ b/src/MNH/ini_lg.f90
@@ -1,24 +1,19 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 init 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ##################
       MODULE MODI_INI_LG
 !     ##################
 INTERFACE
 !
-      SUBROUTINE INI_LG(PXHAT,PYHAT,PZZ,PSVT,PLBXSVM,PLBYSVM)
+      SUBROUTINE INI_LG( PXHATM, PYHATM, PZZ, PSVT, PLBXSVM, PLBYSVM )
 !
-REAL,DIMENSION(:),      INTENT(IN) :: PXHAT,PYHAT ! Positions x,y in the cartesian plane
-REAL,DIMENSION(:,:,:), INTENT(IN)  :: PZZ         ! True altitude of the w grid-point
-REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT        ! scalar var. at t
-REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM,PLBYSVM  ! LB in x and y-dir.
+REAL, DIMENSION(:),       INTENT(IN)    :: PXHATM, PYHATM    ! Positions x,y in the cartesian plane at mass points
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ               ! True altitude of the w grid-point
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT              ! scalar var. at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM, PLBYSVM  ! LB in x and y-dir.
 !
 END SUBROUTINE INI_LG
 !
@@ -28,9 +23,9 @@ END MODULE MODI_INI_LG
 !
 !
 !
-!     ############################################################
-      SUBROUTINE INI_LG(PXHAT,PYHAT,PZZ,PSVT,PLBXSVM,PLBYSVM)
-!     ############################################################
+!     ################################################################
+      SUBROUTINE INI_LG( PXHATM, PYHATM, PZZ, PSVT, PLBXSVM, PLBYSVM )
+!     ################################################################
 !
 !!****  *INI_LG* - routine to initialize lagrangian variables
 !!
@@ -78,10 +73,10 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of argument
 !
-REAL,DIMENSION(:),      INTENT(IN) :: PXHAT,PYHAT ! Positions x,y in the cartesian plane
-REAL,DIMENSION(:,:,:), INTENT(IN)  :: PZZ         ! True altitude of the w grid-point
-REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT        ! scalar var. at t
-REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM,PLBYSVM  ! LB in x and y-dir.
+REAL, DIMENSION(:),       INTENT(IN)    :: PXHATM, PYHATM    ! Positions x,y in the cartesian plane at mass points
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ               ! True altitude of the w grid-point
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT              ! scalar var. at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM, PLBYSVM  ! LB in x and y-dir.
 !
 !
 !*       0.2   declarations of local variables
@@ -103,7 +98,7 @@ IKU=SIZE(PZZ,3)
 DO JK=1,IKU
   DO JJ=1,IJU
     DO JI=1,IIU-1
-      PSVT(JI,JJ,JK,NSV_LGBEG)=0.5*(PXHAT(JI)+PXHAT(JI+1))
+      PSVT(JI,JJ,JK,NSV_LGBEG)=PXHATM(JI)
     END DO
     PSVT(IIU,JJ,JK,NSV_LGBEG)=2.*PSVT(IIU-1,JJ,JK,NSV_LGBEG)-PSVT(IIU-2,JJ,JK,NSV_LGBEG)
   END DO
@@ -112,7 +107,7 @@ END DO
 DO JK=1,IKU
   DO JI=1,IIU
     DO JJ=1,IJU-1
-      PSVT(JI,JJ,JK,NSV_LGBEG+1)=0.5*(PYHAT(JJ)+PYHAT(JJ+1))
+      PSVT(JI,JJ,JK,NSV_LGBEG+1)=PYHATM(JJ)
     END DO
     PSVT(JI,IJU,JK,NSV_LGBEG+1)=2.*PSVT(JI,IJU-1,JK,NSV_LGBEG+1)-PSVT(JI,IJU-2,JK,NSV_LGBEG+1)
   END DO
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index fa29732f1731151599363366ff3e81c5ee736468..b6aacf7b131235b19427aa4ace8d8e08f9d96573 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.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.
@@ -395,6 +395,7 @@ use MODD_SALT_OPT_LKT,      only: NMAX_RADIUS_LKT_SALT=>NMAX_RADIUS_LKT, NMAX_SI
 USE MODD_SERIES,            only: LSERIES
 USE MODD_SHADOWS_n
 USE MODD_STAND_ATM,         only: XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWATM
+USE MODD_SURF_PAR,          only: XUNDEF_SFX => XUNDEF
 USE MODD_TIME
 USE MODD_TIME_n
 USE MODD_TURB_CLOUD,        only: NMODEL_CLOUD, CTURBLEN_CLOUD,XCEI
@@ -402,6 +403,7 @@ USE MODD_TURB_n
 USE MODD_VAR_ll,            only: IP
 
 USE MODE_GATHER_ll
+USE MODE_INI_AIRCRAFT_BALLOON, only: INI_AIRCRAFT_BALLOON
 use mode_ini_budget,        only: Budget_preallocate, Ini_budget
 USE MODE_INI_ONE_WAY_n
 USE MODE_IO
@@ -412,6 +414,7 @@ USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_MSG
+USE MODE_SET_GRID
 USE MODE_SPLITTINGZ_ll,     only: GET_DIM_EXTZ_ll
 USE MODE_TYPE_ZDIFFU
 USE MODE_FIELD,             ONLY: INI_FIELD_LIST
@@ -429,8 +432,6 @@ USE MODI_INI_AEROSET3
 USE MODI_INI_AEROSET4
 USE MODI_INI_AEROSET5
 USE MODI_INI_AEROSET6
-USE MODI_INI_AIRCRAFT_BALLOON
-USE MODI_INI_AIRCRAFT_BALLOON
 USE MODI_INI_BIKHARDT_n
 USE MODI_INI_CPL
 USE MODI_INI_DEEP_CONVECTION
@@ -463,7 +464,6 @@ USE MODI_MNHGET_SURF_PARAM_n
 USE MODI_MNHREAD_ZS_DUMMY_n
 USE MODI_READ_FIELD
 USE MODI_SET_DIRCOS
-USE MODI_SET_GRID
 USE MODI_SET_REF
 #ifdef CPLOASIS
 USE MODI_SFX_OASIS_READ_NAM
@@ -1023,10 +1023,13 @@ ALLOCATE(XXHAT(IIU))
 ALLOCATE(XDXHAT(IIU))
 ALLOCATE(XYHAT(IJU))
 ALLOCATE(XDYHAT(IJU))
+ALLOCATE(XXHATM(IIU))
+ALLOCATE(XYHATM(IJU))
 ALLOCATE(XZS(IIU,IJU))
 ALLOCATE(XZSMT(IIU,IJU))
 ALLOCATE(XZZ(IIU,IJU,IKU))
 ALLOCATE(XZHAT(IKU))
+ALLOCATE(XZHATM(IKU))
 ALLOCATE(XDIRCOSZW(IIU,IJU))
 ALLOCATE(XDIRCOSXW(IIU,IJU))
 ALLOCATE(XDIRCOSYW(IIU,IJU))
@@ -1513,7 +1516,7 @@ IF (CRAD /= 'NONE') THEN
   ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH))
   ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH))
   ALLOCATE(XEMIS  (IIU,IJU,NLWB_MNH))
-  ALLOCATE(XTSRAD (IIU,IJU))    ; XTSRAD = 0.0
+  ALLOCATE(XTSRAD (IIU,IJU))    ; XTSRAD = XUNDEF_SFX
   ALLOCATE(XSEA (IIU,IJU))
   ALLOCATE(XZS_XY (IIU,IJU))
   ALLOCATE(NCLEARCOL_TM1(IIU,IJU))
@@ -1874,13 +1877,15 @@ END IF
 !*       7.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
 !              ----------------------------------------
 !
-CALL SET_GRID(KMI,TPINIFILE,IKU,NIMAX_ll,NJMAX_ll,                       &
-              XTSTEP,XSEGLEN,                                            &
-              XLONORI,XLATORI,XLON,XLAT,                                 &
-              XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
-              XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT,              &
-              ZJ,                                                        &
-              TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
+CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
+               XTSTEP, XSEGLEN,                                                &
+               XLONORI, XLATORI, XLON, XLAT,                                   &
+               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                       &
+               XHAT_BOUND, XHATM_BOUND,                                        &
+               XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE,                   &
+               XLEN1, XLEN2, XZSMT, ZJ,                                        &
+               TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN )
 !
 CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
 !
@@ -2158,10 +2163,10 @@ CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU,                                    &
 !              ---------------------------
 !
 !
-CALL SET_REF(KMI,TPINIFILE,                         &
-             XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,    &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,        &
-             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ )
+CALL SET_REF( KMI, TPINIFILE,                            &
+              XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
 !
 !-------------------------------------------------------------------------------
 !
@@ -2413,7 +2418,7 @@ END IF
 !               -------------------------------
 !
 IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') &
-  CALL INI_LG(XXHAT,XYHAT,XZZ,XSVT,XLBXSVM,XLBYSVM)
+  CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
 
 !
 !-------------------------------------------------------------------------------
@@ -2422,7 +2427,7 @@ IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') &
 !               ------------------------------------------
 !
 CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT,            &
-             XZHAT,CLBCX,CLBCY,XTSTEP,                                        &
+             XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP,                                 &
              LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,              &
              LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG,     &
              LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV,                            &
@@ -2485,15 +2490,11 @@ IF (CRAD   /= 'NONE') THEN
   IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM)
   CALL SURF_SOLAR_GEOM    (XZS, XZS_XY)
   !
-  ALLOCATE(XXHAT_ll                 (IIU_ll))
-  ALLOCATE(XYHAT_ll                 (IJU_ll))
   ALLOCATE(XZS_ll                   (IIU_ll,IJU_ll))
   ALLOCATE(XZS_XY_ll                (IIU_ll,IJU_ll))
   !
   CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP)
   CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,XXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,XYHAT_ll,IRESP)
   XZS_MAX_ll=MAXVAL(XZS_ll)
 ELSE
   XAZIM       = XPI
@@ -2781,27 +2782,21 @@ DEALLOCATE(XSPOWATM)
 !*      23.     BALLOON and AIRCRAFT initializations
 !              ------------------------------------
 !
-CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, &
-                          IKU,CTURB=="TKEL" ,                          &
-                          XLATORI, XLONORI                             )
+CALL INI_AIRCRAFT_BALLOON( TPINIFILE, XLATORI, XLONORI )
 !
 !-------------------------------------------------------------------------------
 !
 !*      24.     STATION initializations
 !              -----------------------
 !
-CALL INI_SURFSTATION_n(XTSTEP, XSEGLEN, NRR, NSV, &
-                       CTURB=="TKEL" , KMI,       &
-                       XLATORI, XLONORI           )
+CALL INI_SURFSTATION_n( )
 !
 !-------------------------------------------------------------------------------
 !
 !*      25.     PROFILER initializations
 !              ------------------------
 !
-CALL INI_POSPROFILER_n(XTSTEP, XSEGLEN, NRR, NSV,  &
-                       CTURB=="TKEL",              &
-                       XLATORI, XLONORI            )
+CALL INI_POSPROFILER_n( )
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 2b29b251ca2f9349f74051b902db0c45efc5f9b6..86df18e2614f50b85e35d7a540fbdcd686e825fd 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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.
@@ -67,19 +67,21 @@ END MODULE MODI_INI_NSV
 !!      Modification    07/2017  (V. Vionnet) Add blowing snow condition
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
 !  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
-!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
 !  P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv
 !  B. Vie         06/2021: add prognostic supersaturation for LIMA
+!  P. Wautelet 26/11/2021: initialize TSVLIST_A
 !  A. Costes      12/2021: smoke tracer for fire model
-!! 
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
+!                          + NSV_CHEM_LIST(_A) the size of the list
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 USE MODD_BLOWSNOW,        ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, &
-                                LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP
+USE MODD_CH_AEROSOL
+! USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, &
+!                                 LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP
 USE MODD_CH_M9_n,         ONLY: CICNAMES, CNAMES, NEQ, NEQAQ
 USE MODD_CH_MNHC_n,       ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX
 USE MODD_CONDSAMP,        ONLY: LCONDSAMP, NCONDSAMP
@@ -89,7 +91,7 @@ USE MODD_DIAG_FLAG,       ONLY: LCHEMDIAG, LCHAQDIAG
 USE MODD_DUST,            ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, &
                                 LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI
 USE MODD_DYN_n,           ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3,   &
-                                LHORELAX_SVLIMA,                               &
+                                LHORELAX_SVFIRE, LHORELAX_SVLIMA,              &
                                 LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, &
                                 LHORELAX_SVDST,LHORELAX_SVAER, LHORELAX_SVSLT, &
                                 LHORELAX_SVPP,LHORELAX_SVCS, LHORELAX_SVCHIC,  &
@@ -99,21 +101,20 @@ USE MODD_DYN_n,           ONLY: LHORELAX_SVFF
 #endif
 USE MODD_ELEC_DESCR,      ONLY: LLNOX_EXPLICIT
 USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
+USE MODD_FIELD,           ONLY: TFIELDMETADATA, TYPEREAL
+USE MODD_FIRE
 #ifdef MNH_FOREFIRE
 USE MODD_FOREFIRE
 #endif
-!Blaze fire model
-USE MODD_FIRE
-USE MODD_DYN_n,     ONLY : LHORELAX_SVFIRE
-!
 USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_LG,              ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN
 USE MODD_LUNIT_n,         ONLY: TLUOUT
 USE MODD_NSV
 USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
+USE MODD_PARAMETERS,      ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX
 USE MODD_PARAM_LIMA,      ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, &
-                                NMOD_IFN, NMOD_IMM, LHHONI, LSNOW, LHAIL, &
-                                LWARM, LCOLD, LRAIN, LSPRO,  &
+                                NMOD_IFN, NMOD_IMM, LHHONI, LSNOW, LHAIL,      &
+                                LWARM, LCOLD, LRAIN, LSPRO,                    &
                                 NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
 USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
 USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES
@@ -142,17 +143,28 @@ INTEGER, INTENT(IN)             :: KMI ! model index
 !
 CHARACTER(LEN=2) :: YNUM2
 CHARACTER(LEN=3) :: YNUM3
+CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
+CHARACTER(LEN=NUNITLGTMAX)    :: YUNITS
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YAEROLONGNAMES
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YDUSTLONGNAMES
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YSALTLONGNAMES
 INTEGER :: ILUOUT
+INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array
 INTEGER :: ISV ! total number of scalar variables
-INTEGER :: IMODEIDX, IMOMENTS
+INTEGER :: IMODEIDX
+INTEGER :: JAER
 INTEGER :: JI, JJ, JSV
 INTEGER :: JMODE, JMOM, JSV_NAME
+INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt
 !
 !-------------------------------------------------------------------------------
 !
-LINI_NSV = .TRUE.
+LINI_NSV(KMI) = .TRUE.
 
 ILUOUT = TLUOUT%NLU
+
+ICHIDX = 0
+NSV_CHEM_LIST_A(KMI) = 0
 !
 ! Users scalar variables are first considered
 !
@@ -199,16 +211,16 @@ END IF
 IF (CCLOUD == 'LIMA' ) THEN
    ISV = ISV+1
    NSV_LIMA_BEG_A(KMI) = ISV
-   IF (LWARM .AND. NMOM_C.GE.2) THEN
+   IF ( LWARM .AND. NMOM_C >= 2 ) THEN
 ! Nc
       NSV_LIMA_NC_A(KMI) = ISV
       ISV = ISV+1
    END IF
 ! Nr
-      IF (LWARM .AND. LRAIN .AND. NMOM_R.GE.2) THEN
-         NSV_LIMA_NR_A(KMI) = ISV
-         ISV = ISV+1
-      END IF
+   IF ( LWARM .AND. LRAIN .AND. NMOM_R >= 2 ) THEN
+     NSV_LIMA_NR_A(KMI) = ISV
+     ISV = ISV+1
+   END IF
 ! CCN
    IF (NMOD_CCN .GT. 0) THEN
       NSV_LIMA_CCN_FREE_A(KMI) = ISV
@@ -222,22 +234,22 @@ IF (CCLOUD == 'LIMA' ) THEN
       ISV = ISV+1
    END IF
 ! Ni
-   IF (LCOLD .AND. NMOM_I.GE.2) THEN
+   IF ( LCOLD .AND. NMOM_I >= 2 ) THEN
       NSV_LIMA_NI_A(KMI) = ISV
       ISV = ISV+1
    END IF
 ! Ns
-   IF (LCOLD .AND. LSNOW .AND. NMOM_S.GE.2) THEN
+   IF ( LCOLD .AND. LSNOW .AND. NMOM_S >= 2 ) THEN
       NSV_LIMA_NS_A(KMI) = ISV
       ISV = ISV+1
    END IF
 ! Ng
-   IF (LCOLD .AND. LWARM .AND. LSNOW .AND. NMOM_G.GE.2) THEN
+   IF ( LCOLD .AND. LWARM .AND. LSNOW .AND. NMOM_G >= 2) THEN
       NSV_LIMA_NG_A(KMI) = ISV
       ISV = ISV+1
    END IF
 ! Nh
-   IF (LCOLD .AND. LWARM .AND. LSNOW .AND. LHAIL .AND. NMOM_H.GE.2) THEN
+   IF ( LCOLD .AND. LWARM .AND. LSNOW .AND. LHAIL .AND. NMOM_H >= 2 ) THEN
       NSV_LIMA_NH_A(KMI) = ISV
       ISV = ISV+1
    END IF
@@ -253,7 +265,7 @@ IF (CCLOUD == 'LIMA' ) THEN
       NSV_LIMA_IMM_NUCL_A(KMI) = ISV
       ISV = ISV + MAX(1,NMOD_IMM)
    END IF
-!
+
   IF ( NMOD_IFN > 0 ) THEN
     IF ( .NOT. ALLOCATED( NIMM ) ) ALLOCATE( NIMM(NMOD_CCN) )
     NIMM(:) = 0
@@ -361,7 +373,6 @@ ELSE
 END IF
 !
 #ifdef MNH_FOREFIRE
-
 ! ForeFire tracers
 IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN
   NSV_FF_A(KMI)    = NFFSCALARS
@@ -416,6 +427,7 @@ IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN
   NSV_CHEMBEG_A(KMI)= ISV+1
   NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI)
   ISV               = NSV_CHEMEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI)
 ELSE
   NSV_CHEM_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -439,6 +451,7 @@ IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN
     NSV_CHICBEG_A(KMI)= ISV+1
     NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI)
     ISV               = NSV_CHICEND_A(KMI)
+    NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI)
   ELSE
     NSV_CHIC_A(KMI) = 0
     NSV_CHICBEG_A(KMI)= 1
@@ -477,6 +490,9 @@ IF (LORILAM.AND.(NEQ .GT. 0)) THEN
   NSV_AERBEG_A(KMI)= ISV+1
   NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI)
   ISV              = NSV_AEREND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI)
+
+  ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) )
 ELSE
   NSV_AER_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -489,6 +505,7 @@ IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN
   NSV_AERDEPBEG_A(KMI)= ISV+1
   NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI)
   ISV                  = NSV_AERDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI)
 ELSE
   NSV_AERDEP_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -505,15 +522,22 @@ IF (LDUST) THEN
   IF (ALLOCATED(XT_LS).AND. .NOT.(LDSTPRES)) LDSTINIT=.TRUE.
   IF (CPROGRAM == 'IDEAL ') LVARSIG = .TRUE.
   IF ((CPROGRAM == 'REAL  ').AND.LDSTINIT) LVARSIG = .TRUE.
-  NSV_DST_A(KMI)   = NMODE_DST*2
-  IF (LRGFIX_DST) THEN
-        NSV_DST_A(KMI) = NMODE_DST
-        LVARSIG = .FALSE.
+  !Determine number of moments
+  IF ( LRGFIX_DST ) THEN
+    INMOMENTS_DST = 1
+    IF ( LVARSIG ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG forced to FALSE because LRGFIX_DST is TRUE' )
+    LVARSIG = .FALSE.
+  ELSE IF ( LVARSIG ) THEN
+    INMOMENTS_DST = 3
+  ELSE
+    INMOMENTS_DST = 2
   END IF
-  IF (LVARSIG) NSV_DST_A(KMI) = NSV_DST_A(KMI) + NMODE_DST
+  !Number of entries = number of moments multiplied by number of modes
+  NSV_DST_A(KMI) = NMODE_DST * INMOMENTS_DST
   NSV_DSTBEG_A(KMI)= ISV+1
   NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI)
   ISV              = NSV_DSTEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI)
 ELSE
   NSV_DST_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -526,6 +550,7 @@ IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN
   NSV_DSTDEPBEG_A(KMI)= ISV+1
   NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI)
   ISV                  = NSV_DSTDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI)
 ELSE
   NSV_DSTDEP_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -542,15 +567,22 @@ IF (LSALT) THEN
   IF (ALLOCATED(XT_LS).AND. .NOT.(LSLTPRES)) LSLTINIT=.TRUE.
   IF (CPROGRAM == 'IDEAL ') LVARSIG_SLT = .TRUE.
   IF ((CPROGRAM == 'REAL  ').AND. LSLTINIT ) LVARSIG_SLT = .TRUE.
-  NSV_SLT_A(KMI)   = NMODE_SLT*2
-  IF (LRGFIX_SLT) THEN
-        NSV_SLT_A(KMI) = NMODE_SLT
-        LVARSIG_SLT = .FALSE.
+  !Determine number of moments
+  IF ( LRGFIX_SLT ) THEN
+    INMOMENTS_SLT = 1
+    IF ( LVARSIG_SLT ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG_SLT forced to FALSE because LRGFIX_SLT is TRUE' )
+    LVARSIG_SLT = .FALSE.
+  ELSE IF ( LVARSIG_SLT ) THEN
+    INMOMENTS_SLT = 3
+  ELSE
+    INMOMENTS_SLT = 2
   END IF
-  IF (LVARSIG_SLT) NSV_SLT_A(KMI) = NSV_SLT_A(KMI) + NMODE_SLT
+  !Number of entries = number of moments multiplied by number of modes
+  NSV_SLT_A(KMI) = NMODE_SLT * INMOMENTS_SLT
   NSV_SLTBEG_A(KMI)= ISV+1
   NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI)
   ISV              = NSV_SLTEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI)
 ELSE
   NSV_SLT_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -563,6 +595,7 @@ IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN
   NSV_SLTDEPBEG_A(KMI)= ISV+1
   NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI)
   ISV                  = NSV_SLTDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI)
 ELSE
   NSV_SLTDEP_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -596,6 +629,7 @@ IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN
   NSV_LNOXBEG_A(KMI)= ISV+1
   NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI)
   ISV               = NSV_LNOXEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI)
 ELSE
   NSV_LNOX_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -604,7 +638,7 @@ ELSE
   NSV_LNOXEND_A(KMI)= 0
 END IF
 !
-! finale number of NSV variable
+! Final number of NSV variables
 !
 NSV_A(KMI) = ISV
 !
@@ -726,26 +760,39 @@ IF ( LDUST ) THEN
 
   ! Initialization of dust names
   IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN
-    IMOMENTS = ( NSV_DSTEND_A(KMI) - NSV_DSTBEG_A(KMI) + 1 ) / NMODE_DST
-    ALLOCATE( CDUSTNAMES(IMOMENTS * NMODE_DST) )
+    ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) )
+    ALLOCATE( YDUSTLONGNAMES(NSV_DST_A(KMI)) )
     !Loop on all dust modes
-    IF ( IMOMENTS == 1 ) THEN
+    IF ( INMOMENTS_DST == 1 ) THEN
       DO JMODE = 1, NMODE_DST
         IMODEIDX = JPDUSTORDER(JMODE)
         JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
         CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME)
+        !Add meaning of the ppv unit (here for moment 3)
+        YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
       END DO
     ELSE
       DO JMODE = 1,NMODE_DST
         !Find which mode we are dealing with
         IMODEIDX = JPDUSTORDER(JMODE)
-        DO JMOM = 1, IMOMENTS
+        DO JMOM = 1, INMOMENTS_DST
           !Find which number this is of the list of scalars
-          JSV = ( JMODE - 1 ) * IMOMENTS + JMOM
+          JSV = ( JMODE - 1 ) * INMOMENTS_DST + JMOM
           !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI
           JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM
           !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT
           CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME)
+          !Add meaning of the ppv unit
+          IF ( JMOM == 1 ) THEN !Corresponds to moment 0
+            YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]'
+          ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3
+            YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+          ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6
+            YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]'
+          ELSE
+            CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for DUST' )
+            YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) )
+          END IF
         ENDDO ! Loop on moments
       ENDDO    ! Loop on dust modes
     END IF
@@ -769,26 +816,39 @@ IF ( LSALT ) THEN
   IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 8 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 8 interval' )
 
   IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN
-    IMOMENTS = ( NSV_SLTEND_A(KMI) - NSV_SLTBEG_A(KMI) + 1 ) / NMODE_SLT
-    ALLOCATE( CSALTNAMES(IMOMENTS * NMODE_SLT) )
+    ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) )
+    ALLOCATE( YSALTLONGNAMES(NSV_DST_A(KMI)) )
     !Loop on all dust modes
-    IF ( IMOMENTS == 1 ) THEN
+    IF ( INMOMENTS_SLT == 1 ) THEN
       DO JMODE = 1, NMODE_SLT
         IMODEIDX = JPSALTORDER(JMODE)
         JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
         CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME)
+        !Add meaning of the ppv unit (here for moment 3)
+        YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
       END DO
     ELSE
       DO JMODE = 1, NMODE_SLT
         !Find which mode we are dealing with
         IMODEIDX = JPSALTORDER(JMODE)
-        DO JMOM = 1, IMOMENTS
+        DO JMOM = 1, INMOMENTS_SLT
           !Find which number this is of the list of scalars
-          JSV = ( JMODE - 1 ) * IMOMENTS + JMOM
+          JSV = ( JMODE - 1 ) * INMOMENTS_SLT + JMOM
           !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI
           JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM
           !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT
           CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME)
+          !Add meaning of the ppv unit
+          IF ( JMOM == 1 ) THEN !Corresponds to moment 0
+            YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]'
+          ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3
+            YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+          ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6
+            YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]'
+          ELSE
+            CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for SALT' )
+            YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) )
+          END IF
         ENDDO ! Loop on moments
       ENDDO    ! Loop on dust modes
     END IF
@@ -809,131 +869,421 @@ END IF
 ! Initialize scalar variable names for snow
 IF ( LBLOWSNOW ) THEN
   IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN
-    IMOMENTS = ( NSV_SNWEND_A(KMI) - NSV_SNWBEG_A(KMI) + 1 )
-    ALLOCATE( CSNOWNAMES(IMOMENTS) )
-    DO JMOM = 1, IMOMENTS
+    ALLOCATE( CSNOWNAMES(NSV_SNW_A(KMI)) )
+    DO JMOM = 1, NSV_SNW_A(KMI)
       CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM)
-    ENDDO ! Loop on moments
+    END DO
   END IF
 END IF
 
-!Fill CSVNAMES_A for model KMI
+!Fill metadata for model KMI
 DO JSV = 1, NSV_USER_A(KMI)
   WRITE( YNUM3, '( I3.3 )' ) JSV
-  CSVNAMES_A(JSV,KMI) = 'SVUSER'//YNUM3
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(         &
+    CMNHNAME   = 'SVUSER' // YNUM3,             &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'SVUSER' // YNUM3,             &
+    CUNITS     = 'kg kg-1',                     &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_' // 'SVUSER' // YNUM3, &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
 END DO
 
 DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) )
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CUNITS     = 'm-3',                                       &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
 END DO
 
 DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( C1R3NAMES(JSV-NSV_C1R3BEG_A(KMI)+1) )
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CUNITS     = 'm-3',                                       &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
 END DO
 
 DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SV LIMA ' // YNUM3,        &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = '',                         &
+    CUNITS     = 'kg-1',                     &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+
   IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(1) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(1) )
   ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(2) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(2) )
   ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN
     WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2
   ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN
     WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2
   ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CAERO_MASS(1) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CAERO_MASS(1) )
+    TSVLIST_A(JSV, KMI)%CUNITS = 'kg kg-1'
   ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(1) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(1) )
   ELSE IF ( JSV == NSV_LIMA_NS_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(2) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) )
   ELSE IF ( JSV == NSV_LIMA_NG_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(3) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) )
   ELSE IF ( JSV == NSV_LIMA_NH_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(4) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) )
   ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN
     WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2
   ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN
     WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2
   ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN
     WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1)
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2
   ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(8) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(8) )
   ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(5) )
+    TSVLIST_A(JSV, KMI)%CUNITS = '1'
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(5) )
   ELSE
     CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' )
   END IF
+
+   TSVLIST_A(JSV, KMI)%CLONGNAME = TRIM( TSVLIST_A(JSV, KMI)%CMNHNAME )
 END DO
 
 DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) )
+  IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN
+    YUNITS = 'C kg-1'
+    WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
+  ELSE
+    YUNITS = 'kg-1'
+    WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/kg)'
+  END IF
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                        &
+    CMNHNAME   = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                           &
+    CLONGNAME  = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), &
+    CUNITS     = TRIM( YUNITS ),                               &
+    CDIR       = 'XY',                                         &
+    CCOMMENT   = TRIM( YCOMMENT ),                             &
+    NGRID      = 1,                                            &
+    NTYPE      = TYPEREAL,                                     &
+    NDIMS      = 3,                                            &
+    LTIMEDEP   = .TRUE.                                        )
 END DO
 
 DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) )
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                    &
+    CMNHNAME   = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), &
+    CUNITS     = 'm',                                      &
+    CDIR       = 'XY',                                     &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,               &
+    NGRID      = 1,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 3,                                        &
+    LTIMEDEP   = .TRUE.                                    )
 END DO
 
 DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI)
   WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1
-  CSVNAMES_A(JSV,KMI) = 'SVPP'//YNUM3
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVPP' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVPP' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
 END DO
 
 #ifdef MNH_FOREFIRE
 DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI)
   WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1
-  CSVNAMES_A(JSV,KMI) = 'SVFF'//YNUM3
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVFF' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVFF' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
 END DO
 #endif
 
 DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI)
   WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI)
-  CSVNAMES_A(JSV,KMI) = 'SVCS'//YNUM3
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVCS' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVCS' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
 END DO
 
 DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                    &
+    CMNHNAME   = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                    &
+    CDIR       = 'XY',                                     &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,               &
+    NGRID      = 1,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 3,                                        &
+    LTIMEDEP   = .TRUE.                                    )
 END DO
 
 DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                      &
+    CMNHNAME   = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                         &
+    CLONGNAME  = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                      &
+    CDIR       = 'XY',                                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                 &
+    NGRID      = 1,                                          &
+    NTYPE      = TYPEREAL,                                   &
+    NDIMS      = 3,                                          &
+    LTIMEDEP   = .TRUE.                                      )
 END DO
 
 DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  !Determine moment to add meaning of the ppv unit
+  JAER = JSV - NSV_AERBEG_A(KMI) + 1
+  IF ( ANY( JAER == [JP_CH_M0i, JP_CH_M0j] ) ) THEN
+    !Moment 0
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [nb_aerosols/molec_{air}]'
+  ELSE IF ( ANY( JAER == [ JP_CH_SO4i, JP_CH_SO4j, JP_CH_NO3i, JP_CH_NO3j, JP_CH_H2Oi, JP_CH_H2Oj, JP_CH_NH3i, JP_CH_NH3j,   &
+                           JP_CH_OCi,  JP_CH_OCj,  JP_CH_BCi,  JP_CH_BCj,  JP_CH_DSTi, JP_CH_DSTj ] )                        &
+            .OR. ( NSOA == 10 .AND.                                                                                          &
+                   ANY( JAER == [ JP_CH_SOA1i, JP_CH_SOA1j, JP_CH_SOA2i, JP_CH_SOA2j, JP_CH_SOA3i, JP_CH_SOA3j, JP_CH_SOA4i, &
+                                  JP_CH_SOA4j, JP_CH_SOA5i, JP_CH_SOA5j, JP_CH_SOA6i, JP_CH_SOA6j, JP_CH_SOA7i, JP_CH_SOA7j, &
+                                  JP_CH_SOA8i, JP_CH_SOA8j, JP_CH_SOA9i, JP_CH_SOA9j, JP_CH_SOA10i, JP_CH_SOA10j ] )       ) ) THEN
+    !Moment 3
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [molec_{aer}/molec_{air}]'
+  ELSE IF ( ( LVARSIGI .AND. JSV == JP_CH_M6i ) .OR. ( LVARSIGJ .AND. JSV == JP_CH_M6j ) ) THEN
+    !Moment 6
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [um6/molec_{air}*(cm3/m3)]'
+  ELSE
+    CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for AER' )
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) )
+  END IF
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YAEROLONGNAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YDUSTLONGNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YSALTLONGNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) )
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
 END DO
 
 DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI)
-  CSVNAMES_A(JSV,KMI) = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) )
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), &
+    CUNITS     = 'kg kg-1',                                   &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
 END DO
 
+!Check if there is at most 1 LINOX scalar variable
+!if not, the name must be modified and different for all of them
+IF ( NSV_LNOX_A(KMI) > 1 ) &
+  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_LNOX_A>1: problem with the names of the corresponding scalar variables' )
+
 DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
-  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_LNOXBEG_A(KMI)+1
-  CSVNAMES_A(JSV,KMI) = 'SVLNOX'//YNUM3
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX'
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'LINOX',                    &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'LINOX',                    &
+    CUNITS     = 'ppv',                      &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
 END DO
 
+IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) &
+  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' )
+
 END SUBROUTINE INI_NSV
diff --git a/src/MNH/ini_one_wayn.f90 b/src/MNH/ini_one_wayn.f90
index 78e025b2a89dea147d8cac40f2124c1d7412ac72..c18ff402abe26556640f5cd8acbee57b5b75e108 100644
--- a/src/MNH/ini_one_wayn.f90
+++ b/src/MNH/ini_one_wayn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -104,7 +104,9 @@ USE MODD_NSV,            only: NSV_A, NSV_C1R3BEG_A, NSV_C1R3_A, NSV_C2R2BEG_A,
                                NSV_ELECBEG_A, NSV_ELEC_A, NSV_LGBEG_A, NSV_LG_A, NSV_LIMA_A, NSV_LIMA_BEG_A,                  &
                                NSV_LNOXBEG_A, NSV_LNOX_A, NSV_PPBEG_A, NSV_PP_A,                                              &
                                NSV_SLTBEG_A, NSV_SLTDEPBEG_A, NSV_SLTDEP_A, NSV_SLT_A, NSV_USER_A
-
+#ifdef MNH_FOREFIRE
+USE MODD_NSV,            only: NSV_FF_A, NSV_FFBEG_A
+#endif
 USE MODD_PARAM_n,        only: CCLOUD
 USE MODD_REF,            ONLY: LCOUPLES
 USE MODD_REF_n,          only: XRHODJ, XRHODREF
diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90
index 00279c8a81488360ebcc1e2ce4bb677094e55361..674dab0d8b87fa1096fce764af6ff069161da646 100644
--- a/src/MNH/ini_posprofilern.f90
+++ b/src/MNH/ini_posprofilern.f90
@@ -9,19 +9,7 @@ MODULE MODI_INI_POSPROFILER_n
 !
 INTERFACE
 !
-      SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN,          &
-                                   KRR, KSV, OUSETKE,        &
-                                   PLATOR, PLONOR            )
-!
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
-REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
-REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
-!
-!-------------------------------------------------------------------------------
+      SUBROUTINE INI_POSPROFILER_n( )
 !
 END SUBROUTINE INI_POSPROFILER_n
 !
@@ -29,11 +17,9 @@ END INTERFACE
 !
 END MODULE MODI_INI_POSPROFILER_n
 !
-!     ########################################################
-      SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN,          &
-                                   KRR, KSV, OUSETKE,        &
-                                   PLATOR, PLONOR            )
-!     ########################################################
+!     ###############################
+      SUBROUTINE INI_POSPROFILER_n( )
+!     ###############################
 !
 !
 !!****  *INI_POSPROFILER_n* - 
@@ -66,219 +52,94 @@ END MODULE MODI_INI_POSPROFILER_n
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  M. Taufour  05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE
+!  P. Wautelet    04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs
 !! --------------------------------------------------------------------------
-!       
+!
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CONF
-USE MODD_DYN_n
-USE MODD_GRID
-USE MODD_GRID_n
-USE MODD_LUNIT_n,      ONLY: TLUOUT
-USE MODD_PARAMETERS
-USE MODD_PROFILER_n
-USE MODD_RADIATIONS_n, ONLY: NAER
-USE MODD_TYPE_PROFILER
-!
-USE MODE_GRIDPROJ
-USE MODE_ll
+USE MODD_ALLPROFILER_n
+USE MODD_CONF,           ONLY: LCARTESIAN
+USE MODD_DYN,            ONLY: XSEGLEN
+USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
+USE MODD_PROFILER_n,     ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME
+USE MODD_TYPE_STATPROF,  ONLY: TPROFILERDATA
+
 USE MODE_MSG
-!
-USE MODI_INI_PROFILER_N
-!
+USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ
+USE MODE_STATPROF_TOOLS,  ONLY: PROFILER_ADD, PROFILER_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION
+
 IMPLICIT NONE
 !
 !
 !*      0.1  declarations of arguments
 !
-!
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
-REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
-REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
+! NONE
 !
 !-------------------------------------------------------------------------------
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: ISTORE   ! number of storage instants
-INTEGER :: ILUOUT   ! logical unit
-INTEGER :: IKU      !
-!
-!----------------------------------------------------------------------------
-ILUOUT = TLUOUT%NLU
-!----------------------------------------------------------------------------
-!
-!*      1.   Default values
-!            --------------
-IKU =  SIZE(XZZ,3)     ! nombre de niveaux verticaux
-!
-CALL DEFAULT_PROFILER_n(TPROFILER)
-!
-!
-!*      3.   Stations initialization
-!            -----------------------
-!
-CALL INI_PROFILER_n
-LPROFILER = (NUMBPROFILER>0)
-!
-!----------------------------------------------------------------------------
-!
-!*      4.   Allocations of storage arrays
-!            -----------------------------
-!
-IF(NUMBPROFILER>0) THEN
-  CALL ALLOCATE_PROFILER_n(TPROFILER)
-  CALL INI_INTERP_PROFILER_n(TPROFILER)
-END IF
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_PROFILER_n(TPROFILER)
-!
-TYPE(PROFILER), INTENT(INOUT) :: TPROFILER
-!
-NUMBPROFILER     = 0
-TPROFILER%T_CUR  = XUNDEF
-TPROFILER%N_CUR  = 0
-TPROFILER%STEP   = XTSTEP 
+INTEGER :: INUMBPROF                        ! Total number of profilers (inside physical domain of model)
+INTEGER :: ISTORE                           ! number of storage instants
+INTEGER :: JI
+LOGICAL :: GINSIDE                          ! True if profiler is inside physical domain of model
+LOGICAL :: GPRESENT                         ! True if profiler is present on the current process
+TYPE(TPROFILERDATA)          :: TZPROFILER
 !
-END SUBROUTINE DEFAULT_PROFILER_n
-!----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE ALLOCATE_PROFILER_n(TPROFILER)
-!
-TYPE(PROFILER), INTENT(INOUT) :: TPROFILER
-!
-ISTORE = NINT( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILER%STEP ) + 1
-!
-allocate( tprofiler%tpdates( istore ) )
-ALLOCATE(TPROFILER%ERROR (NUMBPROFILER))
-ALLOCATE(TPROFILER%X     (NUMBPROFILER))
-ALLOCATE(TPROFILER%Y     (NUMBPROFILER))
-ALLOCATE(TPROFILER%ZON   (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%MER   (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%FF    (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%DD    (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%W     (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%P     (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%ZZ    (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%TH    (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%THV   (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%RHOD  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%VISI  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%VISIKUN(ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%CRARE  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%CRARE_ATT(ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%LWCZ  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%IWCZ  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%CIZ  (ISTORE,IKU,NUMBPROFILER))
-ALLOCATE(TPROFILER%R     (ISTORE,IKU,NUMBPROFILER,KRR))
-ALLOCATE(TPROFILER%SV    (ISTORE,IKU,NUMBPROFILER,KSV))
-ALLOCATE(TPROFILER%AER   (ISTORE,IKU,NUMBPROFILER,NAER))
-IF (OUSETKE) THEN
-  ALLOCATE(TPROFILER%TKE (ISTORE,IKU,NUMBPROFILER))
+
+TPROFILERS_TIME%XTSTEP = XSTEP_PROF
+
+if ( tprofilers_time%xtstep < xtstep ) then
+  call Print_msg( NVERB_WARNING, 'GEN', 'INI_POSPROFILER_n', 'Timestep for profilers was smaller than model timestep' )
+  tprofilers_time%xtstep = xtstep
+end if
+
+ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILERS_TIME%XTSTEP ) + 1
+
+allocate( tprofilers_time%tpdates(istore) )
+!
+! Profilers initialization
+!
+NUMBPROFILER_LOC = 0
+
+IF (CFILE_PROF=="NO_INPUT_CSV") THEN
+  ! Treat namelist
+  INUMBPROF = 0
+  IF ( NNUMB_PROF > 0 ) THEN
+    DO JI = 1, NNUMB_PROF
+      IF ( LCARTESIAN ) THEN
+        TZPROFILER%XX = XX_PROF(JI)
+        TZPROFILER%XY = XY_PROF(JI)
+      ELSE
+        TZPROFILER%XLAT = XLAT_PROF(JI)
+        TZPROFILER%XLON = XLON_PROF(JI)
+        CALL STATPROF_INI_INTERP( TZPROFILER )
+      END IF
+      TZPROFILER%XZ    = XZ_PROF(JI)
+      TZPROFILER%CNAME = CNAME_PROF(JI)
+
+      CALL STATPROF_POSITION( TZPROFILER, GINSIDE, GPRESENT )
+
+      IF ( GINSIDE ) THEN
+        INUMBPROF = INUMBPROF + 1
+        TZPROFILER%NID = INUMBPROF
+      END IF
+
+      IF ( GPRESENT ) CALL PROFILER_ADD( TZPROFILER )
+    END DO
+  END IF
 ELSE
-  ALLOCATE(TPROFILER%TKE (0,IKU,0))
-END IF
-ALLOCATE(TPROFILER%T2M     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%Q2M     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%HU2M    (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%ZON10M  (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%MER10M  (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%RN      (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%H       (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%LE      (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%LEI     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%GFLUX   (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%LWD     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%LWU     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%SWD     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%SWU     (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%IWV   (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%ZTD   (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%ZWD   (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%ZHD   (ISTORE,NUMBPROFILER))
-ALLOCATE(TPROFILER%TKE_DISS(ISTORE,IKU,NUMBPROFILER))
-!
-!
-TPROFILER%ERROR= .FALSE.
-TPROFILER%ZON  = XUNDEF
-TPROFILER%MER  = XUNDEF
-TPROFILER%FF   = XUNDEF
-TPROFILER%DD   = XUNDEF
-TPROFILER%W    = XUNDEF
-TPROFILER%P    = XUNDEF
-TPROFILER%ZZ   = XUNDEF
-TPROFILER%TH   = XUNDEF
-TPROFILER%THV  = XUNDEF
-TPROFILER%RHOD = XUNDEF
-TPROFILER%VISI = XUNDEF
-TPROFILER%VISIKUN = XUNDEF
-TPROFILER%CRARE = XUNDEF
-TPROFILER%CRARE_ATT = XUNDEF
-TPROFILER%LWCZ = XUNDEF
-TPROFILER%IWCZ = XUNDEF
-TPROFILER%CIZ = XUNDEF
-TPROFILER%IWV  = XUNDEF
-TPROFILER%ZTD  = XUNDEF
-TPROFILER%ZWD  = XUNDEF
-TPROFILER%ZHD  = XUNDEF
-TPROFILER%R    = XUNDEF
-TPROFILER%SV   = XUNDEF
-TPROFILER%AER  = XUNDEF
-TPROFILER%TKE  = XUNDEF
-TPROFILER%T2M      = XUNDEF
-TPROFILER%Q2M      = XUNDEF
-TPROFILER%HU2M     = XUNDEF
-TPROFILER%ZON10M   = XUNDEF
-TPROFILER%MER10M   = XUNDEF
-TPROFILER%RN       = XUNDEF
-TPROFILER%H        = XUNDEF
-TPROFILER%LE       = XUNDEF
-TPROFILER%GFLUX    = XUNDEF
-TPROFILER%LEI      = XUNDEF
-TPROFILER%LWD      = XUNDEF
-TPROFILER%LWU      = XUNDEF
-TPROFILER%SWD      = XUNDEF
-TPROFILER%SWU      = XUNDEF
-TPROFILER%TKE_DISS = XUNDEF
-!
-END SUBROUTINE ALLOCATE_PROFILER_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE INI_INTERP_PROFILER_n(TPROFILER)
-!
-TYPE(PROFILER), INTENT(INOUT) :: TPROFILER
-INTEGER :: III
-INTEGER :: IIU, IJU
-!
-DO III=1,NUMBPROFILER
-  CALL GET_DIM_EXT_ll ('B',IIU,IJU)
-  CALL SM_XYHAT(PLATOR,PLONOR,                          &
-                TPROFILER%LAT(III), TPROFILER%LON(III), &
-                TPROFILER%X(III),   TPROFILER%Y(III)    )
-ENDDO
-!
-IF ( ANY(TPROFILER%LAT(:)==XUNDEF) .OR. ANY(TPROFILER%LON(:)==XUNDEF) ) THEN
-  WRITE(ILUOUT,*) 'Error in station position '
-  WRITE(ILUOUT,*) 'either LATitude or LONgitude segment'
-  WRITE(ILUOUT,*) 'definiton is not complete.'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_INTERP_PROFILER_n','')
+  !Treat CSV datafile
+  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, INUMBPROF )
 END IF
-!
-TPROFILER%STEP  = MAX ( PTSTEP, TPROFILER%STEP )
-!
-!
-END SUBROUTINE INI_INTERP_PROFILER_n
-!----------------------------------------------------------------------------
+
+LPROFILER = ( INUMBPROF > 0 )
+
+DO JI = 1, NUMBPROFILER_LOC
+  CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE )
+END DO
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_POSPROFILER_n
diff --git a/src/MNH/ini_profilern.f90 b/src/MNH/ini_profilern.f90
deleted file mode 100644
index 598980099bb886c15140e56015a181624c94467f..0000000000000000000000000000000000000000
--- a/src/MNH/ini_profilern.f90
+++ /dev/null
@@ -1,176 +0,0 @@
-!MNH_LIC Copyright 2002-2020 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.
-!-----------------------------------------------------------------
-!     #######################
-      SUBROUTINE INI_PROFILER_n
-!     #######################
-!
-!
-!!****  *INI_PROFILER_n* - user initializes the station location
-!!
-!!    PURPOSE
-!!    -------
-!
-!
-!!**  METHOD
-!!    ------
-!!    
-!!   Must be defined (for each aircraft):
-!!   ---------------
-!!
-!!  No default exist for these variables.
-!!  ************************************
-!!
-!!  1) Number of stations
-!!  2) the model in which these stations are
-!!     if NOT initialized, the stations are NOT used.
-!!
-!!  3) the (LAT, LON, ALT) latitude,longitude and altitude of the station location.
-!!  4) the station name
-!!
-!!
-!!
-!!   Can be defined  (for each aircraft):
-!!   --------------
-!!
-!!
-!!  9) the time step for data storage.
-!!    default is 60s
-!!
-!! 10) the name or title describing the balloon (8 characters)
-!!     default is the balloon type (6 characters) + the balloon numbers (2 characters)
-!!
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      Pierre Tulet             * Meteo-France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 15/01/2002
-!!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
-!!                                      aircraft, ballon and profiler
-!!
-!! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
-use modd_conf,       only: lcartesian
-USE MODD_PARAMETERS
-USE MODD_PROFILER_n
-
-use mode_msg
-
-IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Nameliste 
-!            ---------
-NUMBPROFILER             = 0
-
-if ( numbprofiler > 0 .and. lcartesian ) &
-  call Print_msg( NVERB_FATAL, 'GEN', 'INI_PROFILER_n', 'profilers are not available if LCARTESIAN=T' )
-
-IF (NUMBPROFILER > 0) THEN
-ALLOCATE(TPROFILER%LAT (NUMBPROFILER))
-ALLOCATE(TPROFILER%LON (NUMBPROFILER))
-ALLOCATE(TPROFILER%ALT (NUMBPROFILER))
-ALLOCATE(TPROFILER%NAME(NUMBPROFILER))
-ALLOCATE(TPROFILER%TYPE(NUMBPROFILER))
-!
-TPROFILER%LON = XUNDEF
-TPROFILER%LAT = XUNDEF
-TPROFILER%ALT = XUNDEF
-TPROFILER%NAME = "    "
-TPROFILER%TYPE = "         "
-!
-TPROFILER%STEP = 900.
-!
-!* location (latitude, longitude, altitude)
-!
-!
-TPROFILER%LAT                = (/ 43.3000, 43.3300, 43.6200, 43.6550, 43.3400, &
-                                  43.3000, 43.3500, 43.8128, 44.1711, 44.1689, &
-                                  44.0833, 43.6200, 43.7164, 43.5333, 43.4833, &
-                                  43.4800, 43.4856,                            &
-                                  43.5423, 43.3000, 43.5000, 43.2568, 43.5000, &
-                                  43.3333, 43.9070, 43.5430, 43.5300, 43.5000, &
-                                  43.4300,                                     &
-                                  43.2780, 43.3277, 43.3396, 43.3230, 43.3559, &
-                                  43.3060, 43.3724, 43.2568, 43.3834, 43.3417, &
-                                  43.3165, 43.3873, 43.2833, 43.2900, 43.2842, &
-                                  43.3597, 43.2788, 43.4999 /)
-!
-TPROFILER%LON                = (/ 5.3790, 4.8200, 5.2000, 6.0986, 5.4100, &
-                                  5.3833, 5.4000, 5.1506, 5.2875, 5.0692, &
-                                  5.0500, 5.4000, 5.7653, 5.0667, 5.2833, &
-                                  5.3200, 5.3405,                         &
-                                  4.9010, 5.4000, 4.9300, 5.4054, 5.3700, &
-                                  5.4167, 4.8988, 5.0740, 5.0700, 5.3700, &
-                                  5.2300,                                 &
-                                  5.5762, 5.4782, 5.5873, 5.3668, 5.4550, &
-                                  5.3951, 5.4842, 5.4054, 5.4253, 5.4113, &
-                                  5.4369, 5.3893, 5.5114, 5.3788, 5.4611, &
-                                  5.3994, 5.3538, 5.3674 /)
-TPROFILER%ALT                = (/ 2.,2.,2.,2.,2.,&
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,         &
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,2.,2.,2.,&
-                                  2.,            &
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,2.,2.,2.,&
-                                  2.,2.,2.       /)                          
-!
-TPROFILER%NAME               = (/ 'CAAM    ', 'CRAU    ', 'BARD    ', 'MONT    ', 'IUTF    ', &
-                                  'OBSF    ', 'VALF    ', 'LUBE    ', 'VENT    ', 'DENT    ', &
-                                  'CARP    ', 'DUPA    ', 'VINO    ', 'CHAM    ', 'REA1    ', &
-                                  'REA2    ', 'REA3    ',                                     &
-                                  'SOD_4M  ', 'UHF_4M  ', 'VHF_STM ', 'SOD_CO  ', 'UHF_DEG ', &
-                                  'SOD_EC  ', 'SOD_E1  ', 'SOD_E2  ', 'UHF_ED  ', 'VHF_LS  ', &
-                                  'UHF_DEP ',                                                 &
-                                  'AGRI    ', 'ALLA    ', 'BOYE    ', 'CANE    ', 'CHAT    ', &
-                                  'CINQ    ', 'COTE    ', 'DR12    ', 'ETOI    ', 'IUT1    ', &
-                                  'JULI    ', 'ONYX    ', 'PENN    ', 'TRIB    ', 'VALB    ', &
-                                  'VALL    ', 'MARS    ', 'AIRB    ' /)                                               
-!
-TPROFILER%TYPE               = (/ 'flux    ', 'flux    ', 'flux    ', 'flux    ', 'flux    ', &
-                                  'flux    ', 'flux    ', 'flux    ', 'flux    ', 'flux    ', &
-                                  'flux    ', 'flux    ', 'flux    ', 'flux    ', 'flux    ', &
-                                  'flux    ', 'flux    ',                                     &
-                                  'sodar   ', 'uhf     ', 'vhf     ', 'sodar   ', 'uhf     ', &
-                                  'sodar   ', 'sodar   ', 'sodar   ', 'uhf     ', 'vhf     ', &
-                                  'uhf     ',                                                 &
-                                  'gps     ', 'gps     ', 'gps     ', 'gps     ', 'gps     ', &
-                                  'gps     ', 'gps     ', 'gps     ', 'gps     ', 'gps     ', &
-                                  'gps     ', 'gps     ', 'gps     ', 'gps     ', 'gps     ', &
-                                  'gps     ', 'gps     ', 'gps     ' /)                     
-!
-!----------------------------------------------------------------------------
-ENDIF
-!
-END SUBROUTINE INI_PROFILER_n
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 24a1b3c83415ae7ff519b31c14d320f7781c9ac0..1864623ffbe8bd132b556b841d5c1f3a6840e8bd 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -1,4 +1,4 @@
-!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.
@@ -36,8 +36,6 @@ END MODULE MODI_INI_PROG_VAR
 !!    EXTERNAL
 !!    --------
 !!
-!!      Routine PGDFILTER      : to filter a 2D field.
-!!      Module  MODI_PGDFILTER
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -99,50 +97,39 @@ END MODULE MODI_INI_PROG_VAR
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
 !  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
 !  P. Wautelet 10/03/2021: use scalar variable names for dust and salt
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
 !
-USE MODD_CH_AEROSOL
-USE MODD_CH_M9_n,          ONLY: NEQ, CNAMES
-USE MODD_CH_MNHC_n,        ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH 
-USE MODD_CONF
-USE MODD_CONF_n
-USE MODD_DIM_n
-USE MODD_DUST
-USE MODD_DYN_n
-use modd_field,            only: TFIELDDATA, TYPEREAL
-USE MODD_FIELD_n
+USE MODD_CH_M9_n,          ONLY: NEQ
+USE MODD_CH_MNHC_n,        ONLY: LUSECHEM
+USE MODD_CONF,             ONLY: NVERB
+USE MODD_CONF_n,           ONLY: NRR
+USE MODD_DIM_n,            ONLY: NIMAX_ll, NJMAX_ll
+USE MODD_DYN_n,            ONLY: LHORELAX_SV, LHORELAX_TKE, NRIMX, NRIMY, &
+                                 NSIZELBXSV_ll, NSIZELBYSV_ll, NSIZELBXTKE_ll, NSIZELBYTKE_ll
+use modd_field,            only: TFIELDMETADATA
+USE MODD_FIELD_n,          ONLY: XRT, XSIGS, XSRCT, XSVT, XTKET, XWT
 USE MODD_IO,               ONLY: TFILEDATA
-USE MODD_LSFIELD_n
-USE MODD_LUNIT
+USE MODD_LSFIELD_n,        ONLY: XLBXSVM, XLBYSVM, XLBXTKEM, XLBYTKEM
 USE MODD_LUNIT_n,          ONLY: TLUOUT
-USE MODD_NSV
-USE MODD_PARAM_n
-USE MODD_PARAMETERS
-USE MODD_SALT
-USE MODD_TURB_n
-!UPG*PT
-USE MODD_REF_n, ONLY : XRHODREF
-USE MODD_CH_AERO_n
-!UPG*PT
+USE MODD_NSV,              ONLY: NSV, NSV_AERBEG, NSV_AEREND, NSV_AERDEPBEG, NSV_AERDEPEND, NSV_CHEMBEG, NSV_CHEMEND, &
+                                 NSV_DSTBEG, NSV_DSTEND, NSV_DSTDEPBEG, NSV_DSTDEPEND, NSV_SLTBEG, NSV_SLTEND,        &
+                                 NSV_SLTDEPBEG, NSV_SLTDEPEND, TSVLIST
+USE MODD_PARAMETERS,       ONLY: JPHEXT, JPVEXT
+USE MODD_PARAM_n,          ONLY: CTURB
 !
 USE MODE_IO_FIELD_READ,    only: IO_Field_read
 USE MODE_IO_FILE,          ONLY: IO_File_close, IO_File_open
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list
-USE MODE_MODELN_HANDLER
+USE MODE_MODELN_HANDLER,   ONLY: GET_CURRENT_MODEL_INDEX
 USE MODE_MSG
-USE MODE_POS
-!UPG*PT
-USE MODE_DUST_PSD
-USE MODE_SALT_PSD
-!UPG*PT
+USE MODE_POS,              ONLY: POSNAM
 use mode_tools_ll,         only: GET_INDICE_ll
 !
-USE MODI_PGDFILTER
-!
 USE MODN_CH_ORILAM
 USE MODN_DUST
 USE MODN_SALT
@@ -171,7 +158,8 @@ INTEGER :: JSV   ! Loop index
 INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX, IMODEIDX  ! dust and salt modes
 INTEGER :: ILUDES                         !  logical unit numbers of DESFM file
 LOGICAL :: GFOUND                         ! Return code when searching namelist
-TYPE(TFIELDDATA)        :: TZFIELD
+LOGICAL :: GOLDFILEFORMAT
+TYPE(TFIELDMETADATA)    :: TZFIELD
 TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL()
 !-------------------------------------------------------------------------------
 !
@@ -221,13 +209,16 @@ END IF
 !*       3.    PASSIVE SCALAR
 !              --------------
 !
-ALLOCATE(XSVT(0,0,0,0))
 IF(PRESENT(HCHEMFILE)) THEN
   WRITE(ILUOUT,*) 'Routine INI_PROG_VAR: CHEMical species read in ',TRIM(HCHEMFILE)
   ! Read dimensions in chem file and checks with output file
   CALL IO_File_add2list(TZCHEMFILE,TRIM(HCHEMFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB)
   CALL IO_File_open(TZCHEMFILE)
-  !
+
+  !If TZCHEMFILE file was written with a MesoNH version < 5.6, some variables had different names (or were not available)
+  GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5                                        &
+              .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 6 ) )
+
   ILUDES = TZCHEMFILE%TDESFILE%NLU
   !
   CALL IO_Field_read(TZCHEMFILE,'IMAX',IIMAX,IRESP)
@@ -256,10 +247,7 @@ IF(PRESENT(HCHEMFILE)) THEN
     !callabortstop
     CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR','')
   END IF ! IIMAX
-!! UPG*PT pourquoi LDUST intervient ici ??
-!!  IF (.NOT.LDUST) THEN
-    LUSECHEM = .TRUE.
-!!  END IF
+  LUSECHEM = .TRUE.
   IF (LORILAM) THEN
     CALL POSNAM(ILUDES,'NAM_CH_ORILAM',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM)
@@ -275,51 +263,37 @@ IF(PRESENT(HCHEMFILE)) THEN
     LSLTPRES=.FALSE.
     CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT)
-  ! initialise NSV_* variables
   ENDIF
+
+  ! initialise NSV_* variables
   CALL INI_NSV(IMI)
   ALLOCATE(XSVT(IIU,IJU,IKU,NSV))
-  
-  ! Read scalars in chem file   
-!! UPG*PT ???
-!!  IF (.NOT.LDUST) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-      TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
-      IF (IRESP/=0) THEN
-        WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
-        XSVT(:,:,:,JSV) = 0.
-      END IF !IRESP
-    END DO ! JSV
-    IF (ALL(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND) == 0.)) THEN 
-      LUSECHEM=.FALSE.
-      NEQ = 0
+
+  ! Read scalars in chem file
+  DO JSV = NSV_CHEMBEG, NSV_CHEMEND
+    TZFIELD = TSVLIST(JSV)
+    IF ( GOLDFILEFORMAT ) THEN
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     END IF
-!!  END IF
+    CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
+    IF (IRESP/=0) THEN
+      WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+      XSVT(:,:,:,JSV) = 0.
+    END IF !IRESP
+  END DO ! JSV
+  IF (ALL(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND) == 0.)) THEN 
+    LUSECHEM=.FALSE.
+    NEQ = 0
+  END IF
 
   IF (LORILAM) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
     DO JSV = NSV_AERBEG,NSV_AEREND
-      TZFIELD%CMNHNAME   = TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+      TZFIELD = TSVLIST(JSV)
+      IF ( GOLDFILEFORMAT ) THEN
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      END IF
       CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
       IF (IRESP/=0) THEN
         WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
@@ -328,18 +302,12 @@ IF(PRESENT(HCHEMFILE)) THEN
     END DO ! JSV
     !
     IF (LDEPOS_AER(IMI)) THEN   
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
       DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        TZFIELD = TSVLIST(JSV)
+        IF ( GOLDFILEFORMAT ) THEN
+          TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+          TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        END IF
         CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
         IF (IRESP/=0) THEN
           WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
@@ -347,22 +315,15 @@ IF(PRESENT(HCHEMFILE)) THEN
         END IF !IRESP
       END DO ! JSV
     END IF ! ldepos_aer
-
   END IF ! lorilam
   
   IF (LDUST) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
     DO JSV = NSV_DSTBEG, NSV_DSTEND
-      TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+      TZFIELD = TSVLIST(JSV)
+      IF ( GOLDFILEFORMAT ) THEN
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      END IF
       CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
       IF (IRESP/=0) THEN
         CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE))
@@ -370,18 +331,12 @@ IF(PRESENT(HCHEMFILE)) THEN
     END DO ! JSV
 
     IF (LDEPOS_DST(IMI)) THEN   
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
       DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        TZFIELD = TSVLIST(JSV)
+        IF ( GOLDFILEFORMAT ) THEN
+          TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+          TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        END IF
         CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
         IF (IRESP/=0) THEN
           WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
@@ -392,18 +347,12 @@ IF(PRESENT(HCHEMFILE)) THEN
   END IF  ! LDUST
 
   IF (LSALT) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
     DO JSV = NSV_SLTBEG, NSV_SLTEND
-      TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+      TZFIELD = TSVLIST(JSV)
+      IF ( GOLDFILEFORMAT ) THEN
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      END IF
       CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
       IF (IRESP/=0) THEN
         CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE))
@@ -411,18 +360,12 @@ IF(PRESENT(HCHEMFILE)) THEN
     END DO ! JSV
     !
     IF (LDEPOS_SLT(IMI)) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
       DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        TZFIELD = TSVLIST(JSV)
+        IF ( GOLDFILEFORMAT ) THEN
+          TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+          TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        END IF
         CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
         IF (IRESP/=0) THEN
           WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index e831472144f7d4480cc08d3c6a7aea3113c053cc..629da3473fcb06dfeb6b4ad9f50ca49eff9caa45 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -164,7 +164,7 @@ END MODULE MODI_INI_SEG_n
 !!                       07/2017   add GBLOWSNOW (V. Vionnet)
 !  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
 !  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
-!  P. Wautelet 19/06/2019: add Fieldlist_nmodel_resize subroutine + provide KMODEL to INI_FIELD_LIST when known
+!  P. Wautelet 19/06/2019: provide KMODEL to INI_FIELD_LIST when known
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -183,7 +183,7 @@ USE MODD_PARAM_ICE
 USE MODD_PARAMETERS
 USE MODD_REF,              ONLY: LBOUSS
 !
-use mode_field,            only: Fieldlist_nmodel_resize, Ini_field_list, Ini_field_scalars
+use mode_field,            only: Ini_field_list, Ini_field_scalars
 USE MODE_IO_FIELD_READ,    only: IO_Field_read
 USE MODE_IO_FILE,          ONLY: IO_File_close, IO_File_open
 USE MODE_IO,               only: IO_Config_set
@@ -378,13 +378,11 @@ CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC,                  &
 !             --------------------
 !
 IF (KMI==1) THEN !Do this only 1 time
-  IF (CPROGRAM=='SPAWN ') THEN
-    CALL INI_FIELD_LIST(2)
-  ELSE IF (CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ') THEN
-    CALL INI_FIELD_LIST(1)
-  ELSE IF (CPROGRAM/='REAL  ' .AND. CPROGRAM/='IDEAL ' ) THEN
+  IF (      CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' &
+       .OR. ( CPROGRAM/='REAL  ' .AND. CPROGRAM/='IDEAL ' )                    ) THEN
     CALL INI_FIELD_LIST()
   END IF
+
   IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' .OR. CPROGRAM=='MESONH') THEN
     CALL INI_FIELD_SCALARS()
   END IF
@@ -464,11 +462,7 @@ CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC,                 &
                 GLNOX_EXPLICIT,                                             &
                 GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, &
                 YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS,  &
-                PTSTEP_ALL,CINIFILEPGD_n                                     )
-!
-if ( cprogram == 'MESONH' .and. kmi == 1 ) then !Do this only once
-  call Fieldlist_nmodel_resize(NMODEL)
-end if
+                PTSTEP_ALL,CINIFILEPGD_n                                    )
 !
 IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  '      &
      .OR. CPROGRAM=='REAL  ') THEN
diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90
index 0de2efdb4672b8e4e1402330d51dea5d6b759cb4..3695fe140491677c653e6c4af6d6909873b28bb0 100644
--- a/src/MNH/ini_size_spawn.f90
+++ b/src/MNH/ini_size_spawn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -78,7 +78,7 @@ END MODULE MODI_INI_SIZE_SPAWN
 USE MODD_CONF
 USE MODD_DIM_n,            ONLY: DIM_MODEL
 USE MODD_DYN_n,            ONLY: CPRESOPT, NITR
-use modd_field,            only: tfielddata, tfieldlist
+use modd_field,            only: tfieldmetadata, tfieldlist
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_IO,               ONLY: ISNPROC, ISP, TFILEDATA
@@ -137,7 +137,7 @@ INTEGER            :: IDIMX, IDIMY, IIB, IJB, IIE, IJE
 !$
 REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM
 INTEGER :: IIMAX_ll,IJMAX_ll
-TYPE(TFIELDDATA)        :: TZFIELD
+TYPE(TFIELDMETADATA)    :: TZFIELD
 TYPE(TFILEDATA),POINTER :: TZDOMAIN => NULL()
 !
 !
@@ -265,12 +265,12 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN
   !
   IF (TPINIFILE%NMNHVERSION(1)<4 .OR. (TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)<=5)) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LONOR'
     CALL IO_Field_read(TPINIFILE,TZFIELD,XPGDLONOR)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LATOR'
     CALL IO_Field_read(TPINIFILE,TZFIELD,XPGDLATOR)
     !
@@ -287,7 +287,7 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN
   CALL READ_HGRID(2,TZDOMAIN,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
   CALL IO_File_close(TZDOMAIN)
   CALL RETRIEVE1_NEST_INFO_n(1,2,NXOR,NYOR,NXSIZE,NYSIZE,NDXRATIO,NDYRATIO)
-  DEALLOCATE(XZS,XZSMT,XXHAT,XYHAT)
+  DEALLOCATE( XZS, XZSMT, XXHAT, XYHAT, XXHATM, XYHATM)
 !
 END IF
 !
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 1067f2ceffdbf2de2b8de02dcf94039a76a01378..b6e605ecc2f07a37d3b39b42f93646c8cc80da7c 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2015-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2015-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.
@@ -105,6 +105,7 @@ USE MODE_IO_FIELD_READ, only: IO_Field_read
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_MSG
+USE MODE_SET_GRID
 USE MODE_SPLITTINGZ_ll, ONLY: GET_DIM_EXTZ_ll
 USE MODE_TYPE_ZDIFFU
 !
@@ -114,7 +115,6 @@ USE MODI_INI_DYNAMICS
 USE MODI_INI_SPAWN_LS_n
 USE MODI_GET_SIZEX_LB
 USE MODI_GET_SIZEY_LB
-USE MODI_SET_GRID
 USE MODI_METRICS
 USE MODI_SET_REF
 USE MODI_UPDATE_METRICS
@@ -262,10 +262,13 @@ ALLOCATE(XXHAT(IIU))
 ALLOCATE(XDXHAT(IIU))
 ALLOCATE(XYHAT(IJU))
 ALLOCATE(XDYHAT(IJU))
+ALLOCATE(XXHATM(IIU))
+ALLOCATE(XYHATM(IJU))
 ALLOCATE(XZS(IIU,IJU))
 ALLOCATE(XZSMT(IIU,IJU))
 ALLOCATE(XZZ(IIU,IJU,IKU))
 ALLOCATE(XZHAT(IKU))
+ALLOCATE(XZHATM(IKU))
 !
 ALLOCATE(XDXX(IIU,IJU,IKU))
 ALLOCATE(XDYY(IIU,IJU,IKU))
@@ -682,13 +685,15 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
 !*       6.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
 !              ----------------------------------------
 !
-CALL SET_GRID(KMI,TPINIFILE,IKU,NIMAX_ll,NJMAX_ll,                       &
-              XTSTEP,XSEGLEN,                                            &
-              XLONORI,XLATORI,XLON,XLAT,                                 &
-              XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
-              XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT,              &
-              ZJ,                                                        &
-              TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
+CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
+               XTSTEP, XSEGLEN,                                                &
+               XLONORI, XLATORI, XLON, XLAT,                                   &
+               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                       &
+               XHAT_BOUND, XHATM_BOUND,                                        &
+               XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE,                   &
+               XLEN1, XLEN2, XZSMT, ZJ,                                        &
+               TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN )
 !
 CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
 !
@@ -743,10 +748,10 @@ END IF
 !              ---------------------------
 !
 !
-CALL SET_REF(KMI,TPINIFILE,                        &
-             XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,   &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,       &
-             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ)
+CALL SET_REF( KMI, TPINIFILE,                            &
+              XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
 !-------------------------------------------------------------------------------
 !
 !*       11.    INITIALIZE THE SOURCE OF TOTAL DRY MASS Md
@@ -894,7 +899,7 @@ ALLOCATE(XALKBAS(0))
 ALLOCATE(XALKWBAS(0))
 !
 CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT,            &
-             XZHAT,CLBCX,CLBCY,XTSTEP,                                        &
+             XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP,                                 &
              LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,              &
              LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG,     &
              LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV,                            &
diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90
deleted file mode 100644
index 8bfe8866f73bfc3c855b971514bfb88027409cff..0000000000000000000000000000000000000000
--- a/src/MNH/ini_stationn.f90
+++ /dev/null
@@ -1,144 +0,0 @@
-!MNH_LIC Copyright 2002-2021 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.
-!-----------------------------------------------------------------
-!     #######################
-      SUBROUTINE INI_STATION_n
-!     #######################
-!
-!
-!!****  *INI_STATION_n* - user initializes the station location
-!!
-!!    PURPOSE
-!!    -------
-!
-!
-!!**  METHOD
-!!    ------
-!!    
-!!   Must be defined (for each station):
-!!   ---------------
-!!
-!!  No default exist for these variables.
-!!  ************************************
-!!
-!!  1) Number of stations
-!!  2) the model in which these stations are
-!!     if NOT initialized, the stations are NOT used.
-!!
-!!  3) the (LAT, LON, ALT) latitude,longitude and altitude of the station location.
-!!  4) the station name
-!!
-!!
-!!
-!!   Can be defined  (for each station):
-!!   --------------
-!!
-!!
-!!  9) the time step for data storage.
-!!    default is 60s
-!!
-!! 10) the name or title describing the balloon (8 characters)
-!!     default is the balloon type (6 characters) + the balloon numbers (2 characters)
-!!
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      Pierre Tulet             * Meteo-France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 15/01/2002
-!!     Modification: 02/2021 (E.Jezequel) Read stations from CVS file
-!!
-!! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
-USE MODD_ALLSTATION_n
-USE MODD_CONF,         ONLY: LCARTESIAN
-USE MODD_PARAMETERS
-!
-USE MODI_STATION_READER
-!
-!
-IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
-INTEGER :: JI
-!
-!----------------------------------------------------------------------------
-!
-!*      1.   Nameliste 
-!            ---------
-
-IF (CFILE_STAT=="NO_INPUT_CSV") THEN
-  NUMBSTAT             = NNUMB_STAT
-
-  IF (NUMBSTAT > 0) THEN
-    ALLOCATE  (TSTATION%LAT(NUMBSTAT))
-    ALLOCATE  (TSTATION%LON(NUMBSTAT))
-    ALLOCATE  (TSTATION%X(NUMBSTAT))
-    ALLOCATE  (TSTATION%Y(NUMBSTAT))
-    ALLOCATE  (TSTATION%Z(NUMBSTAT))
-    ALLOCATE  (TSTATION%K(NUMBSTAT))
-    ALLOCATE  (TSTATION%NAME(NUMBSTAT))
-    ALLOCATE  (TSTATION%TYPE(NUMBSTAT))
-    !
-    TSTATION%LON  = XUNDEF
-    TSTATION%LAT  = XUNDEF
-    TSTATION%Z    = XUNDEF
-    TSTATION%K    = XUNDEF
-    TSTATION%X    = XUNDEF
-    TSTATION%Y    = XUNDEF
-    TSTATION%NAME = "        "
-    TSTATION%TYPE = "        "
-    !
-    TSTATION%STEP = XSTEP_STAT
-    !
-    IF (LCARTESIAN) THEN
-      DO JI=1,NUMBSTAT
-        TSTATION%X(JI)= XX_STAT(JI)
-        TSTATION%Y(JI)= XY_STAT(JI)
-        TSTATION%Z(JI)= XZ_STAT(JI)
-        TSTATION%NAME(JI)= CNAME_STAT(JI)
-        TSTATION%TYPE(JI)= CTYPE_STAT(JI)
-      END DO
-    ELSE
-      DO JI=1,NUMBSTAT
-        TSTATION%LAT(JI)= XLAT_STAT(JI)
-        TSTATION%LON(JI)= XLON_STAT(JI)
-        TSTATION%Z(JI)= XZ_STAT(JI)
-        TSTATION%NAME(JI)= CNAME_STAT(JI)
-        TSTATION%TYPE(JI)= CTYPE_STAT(JI)
-      END DO
-    ENDIF
-  ENDIF
-ELSE
-!
-!*      2.   CSV DATA 
-!
-  CALL READ_CSV_STATION(CFILE_STAT,TSTATION,LCARTESIAN)
-  TSTATION%STEP = XSTEP_STAT
-END IF 
-
-!
-END SUBROUTINE INI_STATION_n
diff --git a/src/MNH/ini_surf_rad.f90 b/src/MNH/ini_surf_rad.f90
index be7c6f342153a6991a14bc8e03b3cc5465b409ba..19b5f8df6efdff90a4f1250ad9bf7cc6c7a0fab6 100644
--- a/src/MNH/ini_surf_rad.f90
+++ b/src/MNH/ini_surf_rad.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2003-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2003-2021 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.
@@ -63,7 +63,7 @@ END MODULE MODI_INI_SURF_RAD
 !*       0.    DECLARATIONS
 !              ------------
 !
-use modd_field,         only: tfielddata, tfieldlist
+use modd_field,         only: tfieldmetadata, tfieldlist
 USE MODD_IO,            ONLY: TFILEDATA
 !
 use mode_field,         only: Find_field_id_from_mnhname
@@ -82,8 +82,8 @@ REAL, DIMENSION(:,:),   INTENT(OUT) :: PTSRAD    ! radiative surface temperature
 !
 !*       0.2   declarations of local variables
 !
-INTEGER           :: IID, IRESP
-TYPE(TFIELDDATA)  :: TZFIELD
+INTEGER              :: IID, IRESP
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL IO_Field_read(TPINIFILE,'DIR_ALB',PDIR_ALB)
@@ -91,7 +91,7 @@ CALL IO_Field_read(TPINIFILE,'SCA_ALB',PSCA_ALB)
 !
 CALL PRINT_MSG(NVERB_INFO,'IO','INI_SURF_RAD','EMIS: reading only first band (copy on others)')
 CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
-TZFIELD = TFIELDLIST(IID)
+TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
 TZFIELD%NDIMS = 2
 CALL IO_Field_read(TPINIFILE,TZFIELD,PEMIS(:,:,1))
 PEMIS(:,:,:) = SPREAD(SOURCE=PEMIS(:,:,1),DIM=3,NCOPIES=SIZE(PEMIS,3))
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 52c9df797e2008d15cd424e3f9e5c14140ab6036..c312cf819c8b45e50ab9d98bc5f955d4ab07c064 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -9,21 +9,7 @@ MODULE MODI_INI_SURFSTATION_n
 !
 INTERFACE
 !
-      SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN,          &
-                                   KRR, KSV, OUSETKE, KMI,   &
-                                   PLATOR, PLONOR            )
-!
-USE MODD_TYPE_DATE
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
-REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
-REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
-INTEGER,            INTENT(IN) :: KMI     ! MODEL NUMBER
-!
-!-------------------------------------------------------------------------------
+      SUBROUTINE INI_SURFSTATION_n( )
 !
 END SUBROUTINE INI_SURFSTATION_n
 !
@@ -31,11 +17,9 @@ END INTERFACE
 !
 END MODULE MODI_INI_SURFSTATION_n
 !
-!     ########################################################
-      SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN,          &
-                                   KRR, KSV, OUSETKE, KMI,   &
-                                   PLATOR, PLONOR            )
-!     ########################################################
+!     ###############################
+      SUBROUTINE INI_SURFSTATION_n( )
+!     ###############################
 !
 !
 !!****  *INI_SURFSTATION_n* - 
@@ -63,214 +47,101 @@ END MODULE MODI_INI_SURFSTATION_n
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!     P. Tulet 15/01/2002 
-!!     A. Lemonsu 19/11/2002 
+!  P. Tulet     15/01/2002
+!  A. Lemonsu   19/11/2002
 !  P. Wautelet  05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet  13/09/2019: budget: simplify and modernize date/time management
 !  R. Schoetter    11/2019: work for cartesian coordinates + parallel.
 !  E.Jezequel      02/2021: read stations from CVS file
-!! --------------------------------------------------------------------------
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
+! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_ALLSTATION_n
-USE MODD_CONF
-USE MODD_DIM_n
-USE MODD_DYN_n
-USE MODD_GRID
-USE MODD_GRID_n
-USE MODD_LUNIT_n, ONLY: TLUOUT
-USE MODD_NESTING
-USE MODD_PARAMETERS
-USE MODD_SHADOWS_n
+USE MODD_CONF,           ONLY: LCARTESIAN
+USE MODD_DYN,            ONLY: XSEGLEN
+USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
 USE MODD_STATION_n
-USE MODD_TYPE_DATE
-USE MODD_VAR_ll,          ONLY: IP
+USE MODD_TYPE_STATPROF
 !
-USE MODE_GATHER_ll
-USE MODE_GRIDPROJ
-USE MODE_ll
 USE MODE_MSG
-!
-USE MODI_INI_STATION_N
+USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ
+USE MODE_STATPROF_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION
 !
 IMPLICIT NONE
 !
 !
 !*      0.1  declarations of arguments
 !
-!
-REAL,               INTENT(IN) :: PTSTEP  ! time step
-REAL,               INTENT(IN) :: PSEGLEN ! segment length
-INTEGER,            INTENT(IN) :: KRR     ! number of moist variables
-INTEGER,            INTENT(IN) :: KSV     ! number of scalar variables
-LOGICAL,            INTENT(IN) :: OUSETKE ! flag to use tke
-REAL,               INTENT(IN) :: PLATOR  ! latitude of origine point
-REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
-INTEGER,            INTENT(IN) :: KMI     ! MODEL NUMBER
+! NONE
 !
 !-------------------------------------------------------------------------------
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: ISTORE ! number of storage instants
-INTEGER :: ILUOUT ! logical unit
-INTEGER :: IIU_ll,IJU_ll,IRESP
-!
-!----------------------------------------------------------------------------
-ILUOUT = TLUOUT%NLU
-!----------------------------------------------------------------------------
-!
-!*      1.   Default values
-!            --------------
-!
-CALL DEFAULT_STATION_n(TSTATION)
-!
-!
-!*      3.   Stations initialization
-!            -----------------------
-!
-CALL INI_STATION_n
-LSTATION = (NUMBSTAT>0)
+INTEGER :: INUMBSTAT                        ! Total number of stations (inside physical domain of model)
+INTEGER :: ISTORE                           ! number of storage instants
+INTEGER :: JI
+LOGICAL :: GINSIDE                          ! True if station is inside physical domain of model
+LOGICAL :: GPRESENT                         ! True if station is present on the current process
+TYPE(TSTATIONDATA)           :: TZSTATION
 !
 !----------------------------------------------------------------------------
-!
-!*      4.   Allocations of storage arrays
-!            -----------------------------
-!
-IF(NUMBSTAT>0) THEN
-  CALL ALLOCATE_STATION_n(TSTATION,KMI)
-  IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n(TSTATION)
-ENDIF
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_STATION_n(TSTATION)
-!
-TYPE(STATION), INTENT(INOUT) :: TSTATION
-!
-NUMBSTAT   = 0
-!
-TSTATION%T_CUR  = XUNDEF
-TSTATION%N_CUR  = 0
-TSTATION%STEP   = XTSTEP  
-!
-END SUBROUTINE DEFAULT_STATION_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE ALLOCATE_STATION_n(TSTATION,KMI)
-!
-TYPE(STATION), INTENT(INOUT) :: TSTATION   ! 
-INTEGER,       INTENT(IN)    :: KMI        ! Model Index
-!
-if ( tstation%step < xtstep ) then
-  call Print_msg( NVERB_ERROR, 'GEN', 'INI_SURFSTATION_n', 'TSTATION%STEP smaller than XTSTEP' )
-  tstation%step = xtstep
+
+TSTATIONS_TIME%XTSTEP = XSTEP_STAT
+
+if ( tstations_time%xtstep < xtstep ) then
+  call Print_msg( NVERB_WARNING, 'GEN', 'INI_SURFSTATION_n', 'Timestep for stations was smaller than model timestep' )
+  tstations_time%xtstep = xtstep
 end if
 
-ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATION%STEP ) + 1
+ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1
 
-allocate( tstation%tpdates( istore ) )
-ALLOCATE(TSTATION%ERROR (NUMBSTAT))
-ALLOCATE(TSTATION%X   (NUMBSTAT))
-ALLOCATE(TSTATION%Y   (NUMBSTAT))
-ALLOCATE(TSTATION%SV  (ISTORE,NUMBSTAT,KSV))
-ALLOCATE(TSTATION%TSRAD (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%ZS  (NUMBSTAT))
-ALLOCATE(TSTATION%ZON   (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%MER   (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%W     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%P     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%TH    (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%R     (ISTORE,NUMBSTAT,KRR))
-IF (OUSETKE) THEN
-  ALLOCATE(TSTATION%TKE (ISTORE,NUMBSTAT))
-ELSE
-  ALLOCATE(TSTATION%TKE (0,0))
-END IF
-ALLOCATE(TSTATION%T2M     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%Q2M     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%HU2M    (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%ZON10M  (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%MER10M  (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%RN      (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%H       (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%LE      (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%GFLUX   (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%LEI     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%SWD     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%SWU     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%SWDIR   (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%SWDIFF  (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%LWD     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%LWU     (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%DSTAOD  (ISTORE,NUMBSTAT))
-ALLOCATE(TSTATION%SFCO2   (ISTORE,NUMBSTAT))
+allocate( tstations_time%tpdates(istore) )
 !
-TSTATION%ERROR = .FALSE.
-TSTATION%ZON   = XUNDEF
-TSTATION%MER   = XUNDEF
-TSTATION%W     = XUNDEF
-TSTATION%P     = XUNDEF
-TSTATION%TH    = XUNDEF
-TSTATION%R     = XUNDEF
-TSTATION%SV    = XUNDEF
-TSTATION%TKE   = XUNDEF
-TSTATION%TSRAD = XUNDEF
-TSTATION%ZS    = XUNDEF
-TSTATION%T2M     = XUNDEF
-TSTATION%Q2M     = XUNDEF
-TSTATION%HU2M    = XUNDEF
-TSTATION%ZON10M  = XUNDEF
-TSTATION%MER10M  = XUNDEF
-TSTATION%RN      = XUNDEF
-TSTATION%H       = XUNDEF
-TSTATION%LE      = XUNDEF
-TSTATION%GFLUX   = XUNDEF
-TSTATION%LEI     = XUNDEF
-TSTATION%SWD     = XUNDEF
-TSTATION%SWU     = XUNDEF
-TSTATION%SWDIR   = XUNDEF
-TSTATION%SWDIFF  = XUNDEF
-TSTATION%LWD     = XUNDEF
-TSTATION%LWU     = XUNDEF
-TSTATION%DSTAOD  = XUNDEF
-TSTATION%SFCO2   = XUNDEF
+! Stations initialization
 !
-END SUBROUTINE ALLOCATE_STATION_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE INI_INTERP_STATION_n(TSTATION)
-!
-TYPE(STATION), INTENT(INOUT) :: TSTATION   ! 
-INTEGER :: JII                             ! 
-INTEGER :: IIU, IJU                        !   
-!
-IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN
- DO JII=1,NUMBSTAT
-   CALL GET_DIM_EXT_ll ('B',IIU,IJU)
-   CALL SM_XYHAT(PLATOR,PLONOR,                        &
-                 TSTATION%LAT(JII), TSTATION%LON(JII), &
-                 TSTATION%X(JII),   TSTATION%Y(JII)    )
- ENDDO
+NUMBSTAT_LOC = 0
+
+IF (CFILE_STAT=="NO_INPUT_CSV") THEN
+  ! Treat namelist
+  INUMBSTAT = 0
+  IF ( NNUMB_STAT > 0 ) THEN
+    DO JI = 1, NNUMB_STAT
+      IF ( LCARTESIAN ) THEN
+        TZSTATION%XX = XX_STAT(JI)
+        TZSTATION%XY = XY_STAT(JI)
+      ELSE
+        TZSTATION%XLAT = XLAT_STAT(JI)
+        TZSTATION%XLON = XLON_STAT(JI)
+        CALL STATPROF_INI_INTERP( TZSTATION )
+      END IF
+      TZSTATION%XZ    = XZ_STAT(JI)
+      TZSTATION%CNAME = CNAME_STAT(JI)
+
+      CALL STATPROF_POSITION( TZSTATION, GINSIDE, GPRESENT )
+
+      IF ( GINSIDE ) THEN
+        INUMBSTAT = INUMBSTAT + 1
+        TZSTATION%NID = INUMBSTAT
+      END IF
+
+      IF ( GPRESENT ) CALL STATION_ADD( TZSTATION )
+    END DO
+  END IF
 ELSE
-!
-  WRITE(ILUOUT,*) 'Error in station position '
-  WRITE(ILUOUT,*) 'either LATitude or LONgitude segment'
-  WRITE(ILUOUT,*) 'or I and J segment'
-  WRITE(ILUOUT,*) 'definition is not complete.'
-!callabortstop
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SURFSTATION_n','')
+  !Treat CSV datafile
+  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, INUMBSTAT )
 END IF
-!
-TSTATION%STEP  = MAX ( PTSTEP, TSTATION%STEP )
-!
-!
-END SUBROUTINE INI_INTERP_STATION_n
-!----------------------------------------------------------------------------
+
+LSTATION = ( INUMBSTAT > 0 )
+
+DO JI = 1, NUMBSTAT_LOC
+  CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE )
+END DO
+
 !----------------------------------------------------------------------------
-!
+
 END SUBROUTINE INI_SURFSTATION_n
diff --git a/src/MNH/initial_guess.f90 b/src/MNH/initial_guess.f90
index cba1058bc1b554620e674215843be01b2218f9ae..5bfca50c547fa65da6e4f37a100e1667c7442e40 100644
--- a/src/MNH/initial_guess.f90
+++ b/src/MNH/initial_guess.f90
@@ -153,7 +153,7 @@ use modd_budget,     only: lbudget_u,  lbudget_v,  lbudget_w,  lbudget_th, lbudg
                            NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH,  NBUDGET_SV1,             &
                            lbu_beg, lbu_enable, tbudgets
 USE MODD_CONF
-use modd_conf_n, only: luserv
+use modd_conf_n,     only: luserv
 USE MODD_GRID_n
 
 use mode_budget,     only: Budget_store_init, Budget_store_end
diff --git a/src/MNH/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90
index 4ec4ecdab00f6597c1468a95ecef7af467dbf38b..a2639606ed11e7d29346623733c65567418888bf 100644
--- a/src/MNH/khko_notadjust.f90
+++ b/src/MNH/khko_notadjust.f90
@@ -101,7 +101,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
@@ -183,8 +183,8 @@ INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1             ! Vectors of indices for
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::&
                        ZEXNT,ZEXNS,ZT,ZRVSAT,ZWORK,ZLV,ZCPH, ZW1,        &
                        ZACT, ZDZ
-INTEGER           :: JK            ! For loop
-TYPE(TFIELDDATA)  :: TZFIELD
+INTEGER              :: JK            ! For loop
+TYPE(TFIELDMETADATA) :: TZFIELD
 
 !-------------------------------------------------------------------------------
 !
@@ -389,28 +389,30 @@ END IF
   PNPRO(:,:,:) = ZACT(:,:,:) 
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD%CMNHNAME   = 'SURSAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'SURSAT'
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_NEB'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'SURSAT',    &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'SURSAT',    &
+    CUNITS     = '1',         &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'X_Y_Z_NEB', &
+    NGRID      = 1,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
   !
-  TZFIELD%CMNHNAME   = 'ACT_OD'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ACT_OD'
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_NEB'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'ACT_OD',    &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'ACT_OD',    &
+    CUNITS     = '1',         &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'X_Y_Z_NEB', &
+    NGRID      = 1,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPFILE,TZFIELD,ZACT)
 END IF
 !
diff --git a/src/MNH/kid_model.f90 b/src/MNH/kid_model.f90
index 68fdb5dbc34cb4bceaf5e7b6fe6c3395d85455de..44c18b9eb86c0ce4e08a94c1339cd686a7d98520 100644
--- a/src/MNH/kid_model.f90
+++ b/src/MNH/kid_model.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 adiab 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !####################
 MODULE MODI_KID_MODEL
 !####################
@@ -76,20 +71,23 @@ RECURSIVE SUBROUTINE KID_MODEL(KMODEL,KTEMP_MODEL,OEXIT)
 !!    -------------
 !!
 !!      Original    09/04/99 
-!!
-!!
+!
+!  P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order)
+!
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
 USE MODD_CONF
+USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_NESTING
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
 !
-USE MODI_MODEL_n
+USE MODE_IO_FILE,        ONLY: IO_FILE_CLOSE
 USE MODE_MODELN_HANDLER
-!
 USE MODE_ll
 !
+USE MODI_MODEL_n
 !
 !*       0.1    declarations of arguments
 !
@@ -105,6 +103,8 @@ INTEGER :: JTEMP_KID     ! nested temporal loop for the kid model
 INTEGER :: ITEMP_LOOP    ! number of the temporal iteration for the kid model
 LOGICAL :: GEXIT         ! return value of the EXIT signal from MODEL
 INTEGER :: IINFO_ll      ! return code of // routines
+TYPE(TFILEDATA), POINTER :: TZBAKFILE  ! Backup file
+TYPE(DATE_TIME)          :: TZDTMODELN ! Date/time of current model computation
 !
 !
 !-------------------------------------------------------------------------------
@@ -112,7 +112,7 @@ INTEGER :: IINFO_ll      ! return code of // routines
 !*       1.    INITIALIZATION
 !              --------------
 !
-DO JKID=KMODEL+1,NMODEL   
+DO JKID=KMODEL+1,NMODEL
   !
   IF ( NDAD(JKID)==KMODEL ) THEN
     !
@@ -127,11 +127,15 @@ DO JKID=KMODEL+1,NMODEL
       ! call the model$n corresponding to JKID
       CALL GO_TOMODEL_ll(JKID,IINFO_ll)
       CALL GOTO_MODEL(JKID)
-      CALL MODEL_n(ITEMP_LOOP,GEXIT)
+      CALL MODEL_n( ITEMP_LOOP, TZBAKFILE, TZDTMODELN, GEXIT )
       !
       ! call to the kid models of model JKID
       CALL KID_MODEL(JKID,ITEMP_LOOP,GEXIT)
       !
+      IF ( TZBAKFILE%LOPENED ) THEN
+        CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+        NULLIFY( TZBAKFILE )
+      END IF
     END DO
     !
   END IF
diff --git a/src/MNH/lap_m.f90 b/src/MNH/lap_m.f90
index f1936c828237a3c61b7f54fcb0ab6ee86376396a..5eceef4f0dcd0905c8c1e60b995ef9e4b44d08d1 100644
--- a/src/MNH/lap_m.f90
+++ b/src/MNH/lap_m.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2007-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2007-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.
@@ -17,12 +17,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density_reference * J
 !
@@ -119,12 +119,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 !
diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90
index 972999064186796b7d4b1721bdd304e0d51f15c4..98b134a36a1cf7e21a18a8cb4c49a3627e5f8490 100644
--- a/src/MNH/latlon_to_xy.f90
+++ b/src/MNH/latlon_to_xy.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2021 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.
@@ -137,7 +137,7 @@ CALL IO_Init()
 !
 CALL INI_CST()
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 !*    2.     Reading of namelist file
 !            ------------------------
diff --git a/src/MNH/les_specn.f90 b/src/MNH/les_specn.f90
index 9be8e1f806c535837045c3199af39c14bac9815a..7bbdadc48adc06f7fbc306ecf66851b742cb656d 100644
--- a/src/MNH/les_specn.f90
+++ b/src/MNH/les_specn.f90
@@ -1,16 +1,16 @@
-!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-2021 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.
 !-----------------------------------------------------------------
 ! Modifications:
-!  P. Wautelet 12/10/2020: restructure Les_diachro_spec subroutine to use tfield_metadata_base type
+!  P. Wautelet 12/10/2020: restructure Les_diachro_spec subroutine to use tfieldmetadata_base type
 !-----------------------------------------------------------------
 !     ######################
       MODULE MODE_LES_SPEC_n
 !     ######################
 
-use modd_field, only: tfield_metadata_base
+use modd_field, only: tfieldmetadata_base
 
 implicit none
 
@@ -22,8 +22,8 @@ public :: Les_spec_n
 real, dimension(:,:,:,:), allocatable :: xspectrax ! spectra coeffcients for
 real, dimension(:,:,:,:), allocatable :: xspectray ! x and y direction spectra
 
-type(tfield_metadata_base) :: tlesfieldx
-type(tfield_metadata_base) :: tlesfieldy
+type(tfieldmetadata_base) :: tlesfieldx
+type(tfieldmetadata_base) :: tlesfieldy
 
 
 CONTAINS
diff --git a/src/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90
index 7c4fcea5abf4f33dfeb259ec7a071b8a9cb1ce44..f6d0ff1c90d5ec2142b8d5115a15e41faef833a6 100644
--- a/src/MNH/menu_diachro.f90
+++ b/src/MNH/menu_diachro.f90
@@ -65,7 +65,7 @@ contains
 !              ------------
 !
 USE MODD_CONF
-use modd_field,          only: tfielddata, TYPEINT
+use modd_field,          only: tfieldmetadata, TYPEINT
 USE MODD_IO,             only: TFILEDATA
 use modd_parameters,     only: NMNHNAMELGTMAX
 !
@@ -92,7 +92,7 @@ INTEGER   ::   IRESPDIA
 INTEGER,SAVE   ::   IGROUP=0
 INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR
 LOGICAL   ::   GPACK
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 type(tfiledata) :: tzfile
 !------------------------------------------------------------------------------
 !
@@ -115,16 +115,17 @@ IF(HGROUP == 'END')THEN
 
   ILENG=NMNHNAMELGTMAX*IGROUP
 
-  TZFIELD%CMNHNAME   = 'MENU_BUDGET.DIM'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MENU_BUDGET.DIM'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MENU_BUDGET.DIM', &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MENU_BUDGET.DIM', &
+    CUNITS     = '',                &
+    CDIR       = '--',              &
+    CCOMMENT   = '',                &
+    NGRID      = 0,                 &
+    NTYPE      = TYPEINT,           &
+    NDIMS      = 0,                 &
+    LTIMEDEP   = .FALSE.            )
   CALL IO_Field_write(tzfile,TZFIELD,ILENG)
 
   ALLOCATE(ITABCHAR(ILENG))
@@ -134,16 +135,17 @@ IF(HGROUP == 'END')THEN
     ENDDO
   ENDDO
 
-  TZFIELD%CMNHNAME   = 'MENU_BUDGET'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MENU_BUDGET'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'MENU_BUDGET', &
+    CSTDNAME   = '',            &
+    CLONGNAME  = 'MENU_BUDGET', &
+    CUNITS     = '',            &
+    CDIR       = '--',          &
+    CCOMMENT   = '',            &
+    NGRID      = 0,             &
+    NTYPE      = TYPEINT,       &
+    NDIMS      = 1,             &
+    LTIMEDEP   = .FALSE.        )
   CALL IO_Field_write(tzfile,TZFIELD,ITABCHAR)
 
   DEALLOCATE(ITABCHAR)
@@ -154,16 +156,17 @@ ELSE IF(HGROUP == 'READ')THEN
   tzfile = tpdiafile
   tzfile%cformat = 'LFI'
 
-  TZFIELD%CMNHNAME   = 'MENU_BUDGET.DIM'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MENU_BUDGET.DIM'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MENU_BUDGET.DIM', &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MENU_BUDGET.DIM', &
+    CUNITS     = '',                &
+    CDIR       = '--',              &
+    CCOMMENT   = '',                &
+    NGRID      = 0,                 &
+    NTYPE      = TYPEINT,           &
+    NDIMS      = 0,                 &
+    LTIMEDEP   = .FALSE.            )
   CALL IO_Field_read(tzfile,TZFIELD,ILENG,IRESPDIA)
   IF(IRESPDIA == -47)THEN
 !   print *,' No record MENU_BUDGET '
@@ -172,16 +175,17 @@ ELSE IF(HGROUP == 'READ')THEN
   ENDIF
 
   ALLOCATE(ITABCHAR(ILENG))
-  TZFIELD%CMNHNAME   = 'MENU_BUDGET'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MENU_BUDGET'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'MENU_BUDGET', &
+    CSTDNAME   = '',            &
+    CLONGNAME  = 'MENU_BUDGET', &
+    CUNITS     = '',            &
+    CDIR       = '--',          &
+    CCOMMENT   = '',            &
+    NGRID      = 0,             &
+    NTYPE      = TYPEINT,       &
+    NDIMS      = 1,             &
+    LTIMEDEP   = .FALSE.        )
   CALL IO_Field_read(tzfile,TZFIELD,ITABCHAR)
   IGROUP=ILENG/NMNHNAMELGTMAX
   DO JJ=1,IGROUP
diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90
index dd28504bb919d89831b3b9b1c56e8cc63828331d..ad132c9415468145cee0c8661da3f91204fe370c 100644
--- a/src/MNH/mesonh.f90
+++ b/src/MNH/mesonh.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.
@@ -77,6 +77,7 @@
 !!      J. Pianezze               01/08/2016  add sfxoasis coupling functions
 !!      P. Wautelet          05/2016-04/2018  new data structures and calls for I/O
 !!      P. Wautelet               06/07/2021  use FINALIZE_MNH
+!  P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order)
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -89,14 +90,17 @@
 #endif
 !
 USE MODD_CONF,             only: CPROGRAM, NMODEL
-USE MODD_NESTING
 USE MODD_CONF_n
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_NESTING
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
 !
 USE MODI_MODEL_n
 USE MODI_KID_MODEL
 !
 USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
 USE MODE_IO,               only: IO_Init
+USE MODE_IO_FILE,          only: IO_FILE_CLOSE
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 !
@@ -116,11 +120,17 @@ IMPLICIT NONE
 !
 !*       0.1    declarations of local variables
 !
+TYPE TFILEPTR
+  TYPE(TFILEDATA), POINTER :: TPFILE
+END TYPE TFILEPTR
+!
 INTEGER       :: JMODEL                       ! loop index 
 INTEGER       :: ITEMP_MODEL1                 ! loop increment 
-LOGICAL       :: GEXIT                        ! flag for the end of the
-                                              ! temporal loop       
+LOGICAL       :: GEXIT                        ! flag for the end of the temporal loop
 INTEGER       :: IINFO_ll                     ! return code of // routines
+TYPE(TFILEDATA), POINTER :: TZBAKFILE         ! Backup file
+TYPE(DATE_TIME)          :: TZDTMODELN        ! Date/time of current model computation
+TYPE(TFILEPTR), DIMENSION(:), ALLOCATABLE :: TZBAKFILES ! Array of pointers to backup files
 !
 #ifdef CPLOASIS
   CHARACTER(LEN=28)  :: CNAMELIST
@@ -186,13 +196,27 @@ END IF
 !*       2.    TEMPORAL LOOP 
 !              -------------
 !
+ALLOCATE( TZBAKFILES( NMODEL ) )
+!
 DO JMODEL=1,NMODEL
   CALL GO_TOMODEL_ll(JMODEL,IINFO_ll)
   CALL GOTO_MODEL(JMODEL)
   CSTORAGE_TYPE='TT'
-  CALL MODEL_n(1,GEXIT)
+  CALL MODEL_n( 1, TZBAKFILES(JMODEL)%TPFILE, TZDTMODELN, GEXIT )
 END DO
 !
+! Close backup files
+! This is done after previous loop because parent files must stay open for child files (ie to write balloon positions in restarts)
+DO JMODEL = 1, NMODEL
+  TZBAKFILE => TZBAKFILES(JMODEL)%TPFILE
+  IF ( TZBAKFILE%LOPENED ) THEN
+    CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+    NULLIFY( TZBAKFILE )
+  END IF
+END DO
+!
+DEALLOCATE( TZBAKFILES )
+!
 IF(GEXIT) THEN
    !callabortstop
   CALL ABORT
@@ -205,10 +229,15 @@ DO
   !
   CALL GO_TOMODEL_ll(1,IINFO_ll)
   CALL GOTO_MODEL(1)
-  CALL MODEL_n(ITEMP_MODEL1,GEXIT)
+  CALL MODEL_n( ITEMP_MODEL1, TZBAKFILE, TZDTMODELN, GEXIT )
   !
   CALL KID_MODEL(1,ITEMP_MODEL1,GEXIT)
   !
+  IF ( TZBAKFILE%LOPENED ) THEN
+    CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+    NULLIFY( TZBAKFILE )
+  END IF
+  !
   IF(GEXIT) EXIT
   !
 END DO
diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90
index d7ed74c744552ac516721d92bbf73dd793938b14..deb8dda2312cc5000d28482412cf5e4695292e0d 100644
--- a/src/MNH/mnh2lpdm.f90
+++ b/src/MNH/mnh2lpdm.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-2021 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.
@@ -78,7 +78,7 @@ CALL GOTO_MODEL(1)
 CALL VERSION()
 CALL IO_Init()
 CALL INI_CST()
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 CALL INI_FIELD_SCALARS()
 !
 CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE')
diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90
index 67eb3ed1cfee5dd9b9b67986bac802aa11071fb9..37bd578e933f53f0126b83fa6d3ca9c1cdadbec6 100644
--- a/src/MNH/mnh2lpdm_ech.f90
+++ b/src/MNH/mnh2lpdm_ech.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2009-2021 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.
@@ -36,7 +36,7 @@ USE MODD_TIME
 !
 USE MODD_MNH2LPDM
 !
-use modd_field,            only: tfielddata, TYPEREAL
+use modd_field,            only: tfieldmetadata, TYPEREAL
 USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
 USE MODE_IO_FIELD_READ,    only: IO_Field_read
 USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
@@ -61,7 +61,7 @@ INTEGER              :: ICURAA,ICURMM,ICURJJ         ! Date  courante.
 INTEGER              :: ICURHH,ICURMN,ICURSS         ! Heure courante.
 INTEGER              :: JI,JJ,JK
 TYPE(DATE_TIME)      :: TZDTCUR
-type(tfielddata)        :: tzfield
+type(tfieldmetadata)    :: tzfield
 TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !
@@ -110,54 +110,59 @@ CALL IO_Field_read(TPFILE,'WT',     XWT)
 CALL IO_Field_read(TPFILE,'THT',    XTHT)
 CALL IO_Field_read(TPFILE,'TKET',   XTKET)
 
-tzfield%cmnhname  = 'LM'
-tzfield%clongname = ''
-tzfield%cunits    = 'm'
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'Mixing length'
-tzfield%ngrid     = 1
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 3
+tzfield = tfieldmetadata(      &
+  cmnhname  = 'LM',            &
+  clongname = '',              &
+  cunits    = 'm',             &
+  cdir      = 'XY',            &
+  ccomment  = 'Mixing length', &
+  ngrid     = 1,               &
+  ntype     = TYPEREAL,        &
+  ndims     = 3                )
 CALL IO_Field_read(TPFILE, tzfield, XLM)
 
-tzfield%cmnhname  = 'THW_FLX'
-tzfield%clongname = ''
-tzfield%cunits    = 'K s-1' !correct?
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'Conservative potential temperature vertical flux'
-tzfield%ngrid     = 4
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 3
+tzfield = tfieldmetadata(&
+  cmnhname  = 'THW_FLX', &
+  clongname = '',        &
+  cunits    = 'K s-1',   & !correct?
+  cdir      = 'XY',      &
+  ccomment  = 'Conservative potential temperature vertical flux', &
+  ngrid     = 4,         &
+  ntype     = TYPEREAL,  &
+  ndims     = 3          )
 CALL IO_Field_read(TPFILE, tzfield, XWPTHP)
 
-tzfield%cmnhname  = 'DISS'
-tzfield%clongname = ''
-tzfield%cunits    = '' !TODO: set units
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'X_Y_Z_DISS'
-tzfield%ngrid     = 1
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 3
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'DISS',       &
+  clongname = '',           &
+  cunits    = '',           & !TODO: set units
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_Z_DISS', &
+  ngrid     = 1,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 3             )
 CALL IO_Field_read(TPFILE, tzfield, XDISSIP)
 
-tzfield%cmnhname  = 'FMU'
-tzfield%clongname = ''
-tzfield%cunits    = 'kg m-1 s-2'
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'X_Y_FMU'
-tzfield%ngrid     = 4
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 2
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'FMU',        &
+  clongname = '',           &
+  cunits    = 'kg m-1 s-2', &
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_FMU',    &
+  ngrid     = 4,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 2             )
 CALL IO_Field_read(TPFILE, tzfield, XSFU)
 
-tzfield%cmnhname  = 'FMV'
-tzfield%clongname = ''
-tzfield%cunits    = 'kg m-1 s-2'
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'X_Y_FMV'
-tzfield%ngrid     = 4
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 2
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'FMV',        &
+  clongname = '',           &
+  cunits    = 'kg m-1 s-2', &
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_FMV',    &
+  ngrid     = 4,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 2             )
 CALL IO_Field_read(TPFILE, tzfield, XSFV)
 
 CALL IO_Field_read(TPFILE,'INPRT',  XINRT)
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index a430219a2c3e26b0ff17d55d836544c41648e91c..4993f4c293ad828b9f59891251c85a2ca071abc3 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2009-2021 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.
@@ -34,7 +34,7 @@
 !
 USE MODD_CST
 USE MODD_DIM_n
-use modd_field,         only: tfielddata, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPEREAL
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_IO,            ONLY: TFILEDATA
@@ -83,7 +83,7 @@ INTEGER, DIMENSION(:),   ALLOCATABLE   :: TAB1D
 INTEGER, DIMENSION(:,:), ALLOCATABLE   :: TAB2D
 TYPE(DATE_TIME)         :: TZDTCUR1,TZDTCUR2,TZDTEXP1
 INTEGER                :: IFDAT,IFGRI,IFLOG
-type(tfielddata)       :: tzfield
+type(tfieldmetadata)   :: tzfield
 !
 !
 !
@@ -207,14 +207,15 @@ CALL IO_Field_read(TPFILE1,'ZS',XZS)
 !
 !*	2.8 Rugosite Z0. 
 !
-tzfield%cmnhname  = 'Z0'
-tzfield%clongname = ''
-tzfield%cunits    = 'm'
-tzfield%cdir      = 'XY'
-tzfield%ccomment  = 'X_Y_Z0'
-tzfield%ngrid     = 4
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 2
+tzfield = tfieldmetadata( &
+  cmnhname  = 'Z0',       &
+  clongname = '',         &
+  cunits    = 'm',        &
+  cdir      = 'XY',       &
+  ccomment  = 'X_Y_Z0',   &
+  ngrid     = 4,          &
+  ntype     = TYPEREAL,   &
+  ndims     = 2           )
 CALL IO_Field_read(TPFILE1,tzfield,XZ0)
 !
 XXPTSOMNH=XXHAT(1)+(XXHAT(2)-XXHAT(1))/2
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 33d6f973fbc2407e4d9f72b8922e1d2e1179dc27..98bbd34ed663dd7037ed61a1122f139608284ae5 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
@@ -34,165 +34,166 @@
 !!              Oct,2016 : G.DELAUTIER LIMA
 !  P. Wautelet 08/02/2019: add missing NULL association for pointers
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet    06/2022: reorganize flyers
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 !
-use modd_type_date, only: date_time
+use modd_parameters,    only: NNEGUNDEF, XNEGUNDEF, XUNDEF
+USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME
+use modd_type_date,     only: date_time
+
+USE MODE_DATETIME,      ONLY: TPREFERENCE_DATE
 
 implicit none
 
-TYPE FLYER
-!
-!
-!* general information
-!
-CHARACTER(LEN=3)              :: MODEL  ! type of model used for each balloon/aircraft
-                                        ! 'FIX' : NMODEL used during the run
-                                        ! 'MOB' : change od model depends of the 
-                                        !         balloon/aircraft location
-INTEGER                       :: NMODEL ! model number for each balloon/aircraft
-CHARACTER(LEN=6)              :: TYPE   ! flyer type:
-                                        ! 'RADIOS' : radiosounding balloon
-                                        ! 'ISODEN' : iso-density balloon
-                                        ! 'AIRCRA' : aircraft
-                                        ! 'CVBALL' : Constant Volume balloon
-CHARACTER(LEN=10)             :: TITLE  ! title or name for the balloon/aircraft
-TYPE(DATE_TIME)               :: LAUNCH ! launch/takeoff date and time
-LOGICAL                       :: CRASH  ! occurence of crash
-LOGICAL                       :: FLY    ! occurence of flying
-!
-!* storage monitoring
-!
-REAL                          :: T_CUR  ! current time since last storage
-INTEGER                       :: N_CUR  ! current step of storage
-REAL                          :: STEP   ! storage time step
-!
-!* balloon dynamical characteristics
-!
-REAL                          :: LAT    ! latitude of launch
-REAL                          :: LON    ! lontitude of launch
-REAL                          :: XLAUNCH! X coordinate of launch
-REAL                          :: YLAUNCH! Y coordinate of launch
-REAL                          :: ALT    ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
-REAL                          :: WASCENT! ascent vertical speed (if 'RADIOS')
-REAL                          :: RHO    ! density of launch (if 'ISODEN')
-REAL                          :: PRES   ! pressure of launch (if 'ISODEN')
-REAL                          :: DIAMETER! apparent diameter of the balloon (m) (if 'CVBALL')
-REAL                          :: AERODRAG! aerodynamic drag coefficient of the balloon (if 'CVBALL')
-REAL                          :: INDDRAG! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
-REAL                          :: VOLUME ! volume of the balloon (m3) (if 'CVBALL')
-REAL                          :: MASS   ! mass of the balloon (kg) (if 'CVBALL')
-!
-!* aircraft flight definition
-!
-INTEGER                       :: SEG      ! number of aircraft flight segments
-INTEGER                       :: SEGCURN  ! current flight segment number
-REAL                          :: SEGCURT  ! current flight segment time spent
-REAL, DIMENSION(:),   POINTER :: SEGLAT  => NULL() ! latitude of flight segment extremities  (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGLON  => NULL() ! longitude of flight segment extremities (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGX    => NULL() ! X of flight segment extremities         (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGY    => NULL() ! Y of flight segment extremities         (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGP    => NULL() ! pressure of flight segment extremities  (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGZ    => NULL() ! altitude of flight segment extremities  (LEG+1)
-REAL, DIMENSION(:),   POINTER :: SEGTIME => NULL() ! duration of flight segments             (LEG  )
-!
-!* aircraft altitude type definition
-!
-LOGICAL                       :: ALTDEF   ! TRUE == altitude given in pressure
-!
-!* current position of the balloon/aircraft
-!
-REAL                          :: X_CUR    ! current x
-REAL                          :: Y_CUR    ! current y
-REAL                          :: Z_CUR    ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
-REAL                          :: P_CUR    ! current p (if 'AIRCRA' and 'ALTDEF' = F)
-!
-!* data records
-!
-type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants)
-REAL, DIMENSION(:),    POINTER :: X         => NULL() ! X(n)
-REAL, DIMENSION(:),    POINTER :: Y         => NULL() ! Y(n)
-REAL, DIMENSION(:),    POINTER :: Z         => NULL() ! Z(n)
-REAL, DIMENSION(:),    POINTER :: XLON      => NULL() ! longitude(n)
-REAL, DIMENSION(:),    POINTER :: YLAT      => NULL() ! latitude (n)
-REAL, DIMENSION(:),    POINTER :: ZON       => NULL() ! zonal wind(n)
-REAL, DIMENSION(:),    POINTER :: MER       => NULL() ! meridian wind(n)
-REAL, DIMENSION(:),    POINTER :: W         => NULL() ! w(n)  (air vertical speed)
-REAL, DIMENSION(:),    POINTER :: P         => NULL() ! p(n)
-REAL, DIMENSION(:),    POINTER :: TKE       => NULL() ! tke(n)
-REAL, DIMENSION(:),    POINTER :: TKE_DISS  => NULL() ! tke dissipation rate
-REAL, DIMENSION(:),    POINTER :: TH        => NULL() ! th(n)
-REAL, DIMENSION(:,:),  POINTER :: R         => NULL() ! r*(n)
-REAL, DIMENSION(:,:),  POINTER :: SV        => NULL() ! Sv*(n)
-REAL, DIMENSION(:,:),  POINTER :: RTZ       => NULL() ! tot hydrometeor mixing ratio
-REAL, DIMENSION(:,:,:),POINTER :: RZ        => NULL() ! water vapour mixing ratio
-REAL, DIMENSION(:,:),  POINTER :: FFZ       => NULL() ! horizontal wind
-REAL, DIMENSION(:,:),  POINTER :: IWCZ      => NULL() ! ice water content
-REAL, DIMENSION(:,:),  POINTER :: LWCZ      => NULL() ! liquid water content
-REAL, DIMENSION(:,:),  POINTER :: CIZ       => NULL() ! Ice concentration
-REAL, DIMENSION(:,:),  POINTER :: CCZ       => NULL() ! Cloud concentration (LIMA)
-REAL, DIMENSION(:,:),  POINTER :: CRZ       => NULL() ! Rain concentration (LIMA)
-REAL, DIMENSION(:,:),  POINTER :: CRARE     => NULL() ! cloud radar reflectivity
-REAL, DIMENSION(:,:),  POINTER :: CRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity
-REAL, DIMENSION(:,:),  POINTER :: WZ        => NULL() ! vertical profile of vertical velocity
-REAL, DIMENSION(:,:),  POINTER :: ZZ        => NULL() ! vertical profile of mass point altitude (above sea)
-REAL, DIMENSION(:,:),  POINTER :: AER       => NULL() ! Extinction at 550 nm
-REAL, DIMENSION(:,:),  POINTER :: DST_WL    => NULL() ! Extinction by wavelength
-REAL, DIMENSION(:),    POINTER :: ZS        => NULL() ! zs(n)
-REAL, DIMENSION(:),    POINTER :: TSRAD     => NULL() ! Ts(n)
-!
-REAL, DIMENSION(:)  ,   POINTER :: THW_FLUX => NULL() ! thw_flux(n)
-REAL, DIMENSION(:)  ,   POINTER :: RCW_FLUX => NULL() ! rcw_flux(n)
-REAL, DIMENSION(:,:),   POINTER :: SVW_FLUX => NULL() ! psw_flux(n)
-END TYPE FLYER
-REAL :: XLAM_CRAD ! cloud radar wavelength (m)
-!
-!-------------------------------------------------------------------------------------------
-!
-LOGICAL     :: LFLYER    ! flag to use aircraft/balloons
-!
-TYPE(FLYER) :: TBALLOON1 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON2 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON3 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON4 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON5 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON6 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON7 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON8 ! characteristics and records of a balloon
-TYPE(FLYER) :: TBALLOON9 ! characteristics and records of a balloon
-!
-TYPE(FLYER) :: TAIRCRAFT1 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT2 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT3 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT4 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT5 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT6 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT7 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT8 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT9 ! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT10! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT11! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT12! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT13! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT14! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT15! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT16! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT17! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT18! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT19! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT20! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT21! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT22! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT23! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT24! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT25! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT26! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT27! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT28! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT29! characteristics and records of an aircraft
-TYPE(FLYER) :: TAIRCRAFT30! characteristics and records of an aircraft
-!
+save
+
+INTEGER, PARAMETER :: NCRASH_NO        = 0 ! Not crashed
+INTEGER, PARAMETER :: NCRASH_OUT_HORIZ = 1 ! Flyer is outside of horizontal domain
+INTEGER, PARAMETER :: NCRASH_OUT_LOW   = 2 ! Flyer crashed on ground (or sea!)
+INTEGER, PARAMETER :: NCRASH_OUT_HIGH  = 3 ! Flyer is too high (outside of domain)
+
+INTEGER, PARAMETER :: NFLYER_DEFAULT_RANK = 1
+
+LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons
+
+TYPE :: TFLYERDATA
+  !
+  !* general information
+  !
+  CHARACTER(LEN=3) :: CMODEL = 'FIX' ! type of model used for each balloon/aircraft
+                                     ! 'FIX' : NMODEL used during the run
+                                     ! 'MOB' : change od model depends of the
+                                     !         balloon/aircraft location
+  INTEGER          :: NMODEL = 0 ! model number for each balloon/aircraft (may change if CMODEL='MOB')
+  INTEGER          :: NID    = 0 ! Identification number
+  CHARACTER(LEN=6) :: CTYPE = ''  ! flyer type:
+                                  ! 'RADIOS' : radiosounding balloon
+                                  ! 'ISODEN' : iso-density balloon
+                                  ! 'AIRCRA' : aircraft
+                                  ! 'CVBALL' : Constant Volume balloon
+  CHARACTER(LEN=10) :: CTITLE = ''  ! title or name for the balloon/aircraft
+  TYPE(DATE_TIME)   :: TLAUNCH = TPREFERENCE_DATE ! launch/takeoff date and time
+  LOGICAL           :: LCRASH = .FALSE. ! occurence of crash
+  INTEGER           :: NCRASH = NCRASH_NO
+  LOGICAL           :: LFLY   = .FALSE. ! occurence of flying
+  !
+  !* storage monitoring
+  !
+  LOGICAL             :: LSTORE = .FALSE. ! Do we have to store data now
+  TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer
+  !
+  !* current position of the balloon/aircraft
+  !
+  REAL :: XX_CUR = XNEGUNDEF ! current x
+  REAL :: XY_CUR = XNEGUNDEF ! current y
+  REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
+  INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is
+  !
+  !* data records
+  !
+  INTEGER, DIMENSION(:),  ALLOCATABLE :: NMODELHIST ! List of models where data has been computed
+  REAL, DIMENSION(:),     ALLOCATABLE :: XX         ! X(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XY         ! Y(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XZ         ! Z(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XLAT       ! latitude (n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XLON       ! longitude(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XZON       ! zonal wind(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XMER       ! meridian wind(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XW         ! w(n)  (air vertical speed)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XP         ! p(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTKE       ! tke(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTKE_DISS  ! tke dissipation rate
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTH        ! th(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XR         ! r*(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XSV        ! Sv*(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XRTZ       ! tot hydrometeor mixing ratio
+  REAL, DIMENSION(:,:,:), ALLOCATABLE :: XRZ        ! water vapour mixing ratio
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XFFZ       ! horizontal wind
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XIWCZ      ! ice water content
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XLWCZ      ! liquid water content
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCIZ       ! Ice concentration
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCCZ       ! Cloud concentration (LIMA)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCRZ       ! Rain concentration (LIMA)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCRARE     ! cloud radar reflectivity
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCRARE_ATT ! attenuated (= more realistic) cloud radar reflectivity
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XWZ        ! vertical profile of vertical velocity
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XZZ        ! vertical profile of mass point altitude (above sea)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XZS        ! zs(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTSRAD     ! Ts(n)
+  !
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTHW_FLUX  ! thw_flux(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XRCW_FLUX  ! rcw_flux(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XSVW_FLUX  ! psw_flux(n)
+END TYPE TFLYERDATA
+
+TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
+  LOGICAL :: LTOOKOFF = .FALSE. ! Set to true once the aircraft takes off
+  !
+  !* aircraft flight definition
+  !
+  INTEGER :: NPOS     = 0  ! number of aircraft positions (segment extremities)
+  INTEGER :: NPOSCUR  = 1  ! current flight segment number
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSLAT  ! latitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSLON  ! longitude of flight segment extremities (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSX    ! X of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSY    ! Y of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSP    ! pressure of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSZ    ! altitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XPOSTIME ! time since launch (corresponding to flight segments extremities (LEG+1)
+  TYPE(DATE_TIME) :: TLAND =  TPREFERENCE_DATE    ! landing / end of flight date and time
+  !
+  !* aircraft altitude type definition
+  !
+  LOGICAL :: LALTDEF = .FALSE.  ! TRUE == altitude given in pressure
+  REAL    :: XP_CUR = XNEGUNDEF ! current p (only if LALTDEF = F)
+END TYPE TAIRCRAFTDATA
+
+TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
+  LOGICAL :: LPOSITION_INIT = .FALSE. ! True if initial position has been computed
+  !
+  !* balloon dynamical characteristics
+  !
+  REAL :: XLATLAUNCH = XUNDEF ! latitude of launch
+  REAL :: XLONLAUNCH = XUNDEF ! lontitude of launch
+  REAL :: XXLAUNCH   = XUNDEF ! X coordinate of launch
+  REAL :: XYLAUNCH   = XUNDEF ! Y coordinate of launch
+  REAL :: XALTLAUNCH = XNEGUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
+  REAL :: XWASCENT   = XNEGUNDEF ! ascent vertical speed, m/s (constant if 'RADIOS' or variable if 'CVBALL')
+  REAL :: XRHO       = XNEGUNDEF ! density of launch (if 'ISODEN')
+  REAL :: XPRES      = XNEGUNDEF ! pressure of launch (if 'ISODEN' or 'CVBALL')
+  REAL :: XDIAMETER  = XNEGUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL')
+  REAL :: XAERODRAG  = XNEGUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL')
+  REAL :: XINDDRAG   = XNEGUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
+  REAL :: XVOLUME    = XNEGUNDEF ! volume of the balloon (m3) (if 'CVBALL')
+  REAL :: XMASS      = XNEGUNDEF ! mass of the balloon (kg) (if 'CVBALL')
+
+  TYPE(DATE_TIME) :: TPOS_CUR = TPREFERENCE_DATE ! Time corresponding to the current position (XX_CUR, XY_CUR...)
+
+END TYPE TBALLOONDATA
+
+INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
+INTEGER :: NBALLOONS  = 0 ! Total number of balloons
+
+TYPE TAIRCRAFT_PTR
+  TYPE(TAIRCRAFTDATA), POINTER :: TAIRCRAFT => NULL()
+END TYPE TAIRCRAFT_PTR
+
+TYPE TBALLOON_PTR
+  TYPE(TBALLOONDATA), POINTER :: TBALLOON => NULL()
+END TYPE TBALLOON_PTR
+
+TYPE(TAIRCRAFT_PTR), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts
+
+TYPE(TBALLOON_PTR),  DIMENSION(:), ALLOCATABLE :: TBALLOONS  ! characteristics and records of the balloons
+
+INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKCUR_AIRCRAFT ! Array to store the rank of the process where a given aircraft is present
+INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKNXT_AIRCRAFT ! Array to store the rank of the process where a given aircraft is going
+
+INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKCUR_BALLOON  ! Array to store the rank of the process where a given ballon is present
+INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKNXT_BALLOON  ! Array to store the rank of the process where a given ballon is going
+
 END MODULE MODD_AIRCRAFT_BALLOON
diff --git a/src/MNH/modd_allprofilern.f90 b/src/MNH/modd_allprofilern.f90
new file mode 100644
index 0000000000000000000000000000000000000000..fd7cd8eb21b2e5938cb4f72068f2cfe466e72c65
--- /dev/null
+++ b/src/MNH/modd_allprofilern.f90
@@ -0,0 +1,99 @@
+!MNH_LIC Copyright 2021-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 MODD_ALLPROFILER_n
+!     ############################
+!
+!!****  *MODD_PROFILER* - declaration of profilers
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this declarative module is to define
+!      the different profilers.
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE 
+!!
+!!    REFERENCE
+!!    --------- 
+!!       
+!!    AUTHOR
+!!    ------
+!!	E. Jezequel   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    01/06/21
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
+!  P. Wautelet  27/04/2022: copied from modd_allstationn.f90
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+!
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: NNUMB_PROF, XSTEP_PROF, XX_PROF, XY_PROF, XLAT_PROF, XLON_PROF, XZ_PROF
+PUBLIC :: CNAME_PROF, CFILE_PROF !, LDIAG_SURFRAD
+
+PUBLIC :: ALLPROFILER_GOTO_MODEL
+
+TYPE ALLPROFILER_t
+!
+!-------------------------------------------------------------------------------------------
+!
+!
+  INTEGER                          :: NNUMB_PROF  !Number of stations as defined in namelist
+  REAL, DIMENSION(100)             :: XX_PROF, XY_PROF, XZ_PROF, XLAT_PROF, XLON_PROF
+  CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_PROF
+  CHARACTER(LEN=NFILENAMELGTMAX)   :: CFILE_PROF
+  REAL                             :: XSTEP_PROF
+!  LOGICAL                          :: LDIAG_SURFRAD
+  !
+!
+END TYPE ALLPROFILER_t
+
+TYPE(ALLPROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: ALLPROFILER_MODEL
+
+INTEGER, POINTER                             :: NNUMB_PROF=>NULL()
+REAL, POINTER                                :: XSTEP_PROF=>NULL()
+REAL, DIMENSION(:), POINTER                  :: XX_PROF=>NULL()
+REAL, DIMENSION(:), POINTER                  :: XY_PROF=>NULL()
+REAL, DIMENSION(:), POINTER                  :: XLAT_PROF=>NULL()
+REAL, DIMENSION(:), POINTER                  :: XLON_PROF=>NULL()
+REAL, DIMENSION(:), POINTER                  :: XZ_PROF=>NULL()
+CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_PROF=>NULL()
+CHARACTER (LEN=NFILENAMELGTMAX),POINTER      :: CFILE_PROF=>NULL()
+!LOGICAL, POINTER                             :: LDIAG_SURFRAD=>NULL()
+CONTAINS
+
+SUBROUTINE ALLPROFILER_GOTO_MODEL(KFROM, KTO)
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+! Save current state for allocated arrays
+!
+! Current model is set to model KTO
+
+NNUMB_PROF    =>ALLPROFILER_MODEL(KTO)%NNUMB_PROF
+XSTEP_PROF    =>ALLPROFILER_MODEL(KTO)%XSTEP_PROF
+XX_PROF       =>ALLPROFILER_MODEL(KTO)%XX_PROF
+XY_PROF       =>ALLPROFILER_MODEL(KTO)%XY_PROF
+XZ_PROF       =>ALLPROFILER_MODEL(KTO)%XZ_PROF
+XLAT_PROF     =>ALLPROFILER_MODEL(KTO)%XLAT_PROF
+XLON_PROF     =>ALLPROFILER_MODEL(KTO)%XLON_PROF
+CNAME_PROF    =>ALLPROFILER_MODEL(KTO)%CNAME_PROF
+CFILE_PROF    =>ALLPROFILER_MODEL(KTO)%CFILE_PROF
+!LDIAG_SURFRAD =>ALLPROFILER_MODEL(KTO)%LDIAG_SURFRAD
+END SUBROUTINE ALLPROFILER_GOTO_MODEL
+
+END MODULE MODD_ALLPROFILER_n
diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90
index 933c1657174cab1dfee31f99a8be37abddbb3a12..4fe0a7be7e95b4677d7a9dd3f4752d996ace1d7a 100644
--- a/src/MNH/modd_allstationn.f90
+++ b/src/MNH/modd_allstationn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2021-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.
@@ -29,18 +29,24 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    01/06/21
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 !
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
-USE MODD_STATION_n
-USE MODD_TYPE_STATION
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
 
 IMPLICIT NONE
 
+PRIVATE
+
+PUBLIC :: NNUMB_STAT, XSTEP_STAT, XX_STAT, XY_STAT, XLAT_STAT, XLON_STAT, XZ_STAT
+PUBLIC :: CNAME_STAT, CFILE_STAT, LDIAG_SURFRAD
+
+PUBLIC :: ALLSTATION_GOTO_MODEL
+
 TYPE ALLSTATION_t
 !
 !-------------------------------------------------------------------------------------------
@@ -48,8 +54,8 @@ TYPE ALLSTATION_t
 !
   INTEGER                          :: NNUMB_STAT  !Number of stations as defined in namelist
   REAL, DIMENSION(100)             :: XX_STAT, XY_STAT, XZ_STAT, XLAT_STAT, XLON_STAT
-  CHARACTER(LEN=7), DIMENSION(100) :: CNAME_STAT, CTYPE_STAT
-  CHARACTER(LEN=20)                :: CFILE_STAT
+  CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_STAT
+  CHARACTER(LEN=NFILENAMELGTMAX)   :: CFILE_STAT
   REAL                             :: XSTEP_STAT
   LOGICAL                          :: LDIAG_SURFRAD
   !
@@ -65,9 +71,8 @@ REAL, DIMENSION(:), POINTER                  :: XY_STAT=>NULL()
 REAL, DIMENSION(:), POINTER                  :: XLAT_STAT=>NULL()
 REAL, DIMENSION(:), POINTER                  :: XLON_STAT=>NULL()
 REAL, DIMENSION(:), POINTER                  :: XZ_STAT=>NULL()
-CHARACTER (LEN=7),DIMENSION(:), POINTER      :: CNAME_STAT=>NULL()
-CHARACTER (LEN=7),DIMENSION(:), POINTER      :: CTYPE_STAT=>NULL()
-CHARACTER (LEN=20),POINTER                   :: CFILE_STAT=>NULL()
+CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL()
+CHARACTER (LEN=NFILENAMELGTMAX),POINTER      :: CFILE_STAT=>NULL()
 LOGICAL, POINTER                             :: LDIAG_SURFRAD=>NULL()
 CONTAINS
 
@@ -86,7 +91,6 @@ XZ_STAT       =>ALLSTATION_MODEL(KTO)%XZ_STAT
 XLAT_STAT     =>ALLSTATION_MODEL(KTO)%XLAT_STAT
 XLON_STAT     =>ALLSTATION_MODEL(KTO)%XLON_STAT
 CNAME_STAT    =>ALLSTATION_MODEL(KTO)%CNAME_STAT
-CTYPE_STAT    =>ALLSTATION_MODEL(KTO)%CTYPE_STAT
 CFILE_STAT    =>ALLSTATION_MODEL(KTO)%CFILE_STAT
 LDIAG_SURFRAD =>ALLSTATION_MODEL(KTO)%LDIAG_SURFRAD
 END SUBROUTINE ALLSTATION_GOTO_MODEL
diff --git a/src/MNH/modd_ch_flxn.f90 b/src/MNH/modd_ch_flxn.f90
index 47c729a93a24003e3a3b7871975de0cb25e07a9f..4a1e9930f89e90856336d4f43d5d06219972f102 100644
--- a/src/MNH/modd_ch_flxn.f90
+++ b/src/MNH/modd_ch_flxn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2016-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/modd_ch_flxn.f90,v $ $Revision: 1.1 $
-! MASDEV5_2 modd 2016/06/27 14:05:40
-!-----------------------------------------------------------------
 !     #####################
       MODULE MODD_CH_FLX_n
 !     ######################
@@ -42,7 +37,7 @@ IMPLICIT NONE
 
 TYPE CH_FLX_t
 !
-  REAL, DIMENSION(:,:,:), POINTER :: XCHFLX=>NULL() ! chemical fluxes ppp.m/s at t
+  REAL, DIMENSION(:,:,:), POINTER :: XCHFLX=>NULL() ! chemical fluxes ppv.m/s at t
 !
 END TYPE CH_FLX_t
 
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 055d3c88f76b4634b987607db83365a12e58710f..c5fcc566b9620e98dcfc4ba13eced5232bed2cda 100644
--- a/src/MNH/modd_gridn.f90
+++ b/src/MNH/modd_gridn.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ##################
@@ -31,22 +31,45 @@
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original    05/05/94                      
-!!      J. Stein    15/11/95  add the slope angle
-!!      V. Ducrocq   13/08/98  // : add XLATOR_ll and XLONOR_ll       
-!!      V. Masson   nov 2004  supress XLATOR,XLONOR,XLATOR_ll,XLONOR_ll
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  Original    05/05/94
+!  J. Stein    15/11/95:  add the slope angle
+!  V. Ducrocq  13/08/98: //: add XLATOR_ll and XLONOR_ll
+!  V. Masson      11/2004: supress XLATOR, XLONOR, XLATOR_ll, XLONOR_ll
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet    09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND, XHATM_BOUND,
+!                          XXHAT_ll, XYHAT_ll, XXHATM_ll and XYHATM_ll
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
+
 IMPLICIT NONE
 
+SAVE
+
+! Parameters for XHAT_BOUND and XHATM_BOUND
+INTEGER, PARAMETER :: NHAT_BOUND_SIZE = 12
+INTEGER, PARAMETER :: NPHYS_XMIN = 1  ! Position of minimum position in physical domain in x direction
+INTEGER, PARAMETER :: NPHYS_XMAX = 2  ! Position of maximum position in physical domain in x direction
+INTEGER, PARAMETER :: NPHYS_YMIN = 3  ! Position of minimum position in physical domain in y direction
+INTEGER, PARAMETER :: NPHYS_YMAX = 4  ! Position of maximum position in physical domain in y direction
+INTEGER, PARAMETER :: NPHYS_ZMIN = 5  ! Position of minimum position in physical domain in z direction
+INTEGER, PARAMETER :: NPHYS_ZMAX = 6  ! Position of maximum position in physical domain in z direction
+INTEGER, PARAMETER :: NEXTE_XMIN = 7  ! Position of minimum position in extended domain in x direction
+INTEGER, PARAMETER :: NEXTE_XMAX = 8  ! Position of maximum position in extended domain in x direction
+INTEGER, PARAMETER :: NEXTE_YMIN = 9  ! Position of minimum position in extended domain in y direction
+INTEGER, PARAMETER :: NEXTE_YMAX = 10 ! Position of maximum position in extended domain in y direction
+INTEGER, PARAMETER :: NEXTE_ZMIN = 11 ! Position of minimum position in extended domain in z direction
+INTEGER, PARAMETER :: NEXTE_ZMAX = 12 ! Position of maximum position in extended domain in z direction
+
+
 REAL, DIMENSION(:,:),  POINTER :: XLON=>NULL(),XLAT=>NULL() ! Longitude and latitude  
 REAL, DIMENSION(:),    POINTER :: XXHAT=>NULL()             ! Position x in the conformal or cartesian plane
 REAL, DIMENSION(:),    POINTER :: XYHAT=>NULL()             ! Position y in the conformal or cartesian plane
+REAL, DIMENSION(:),    POINTER :: XXHATM=>NULL()            ! Position x in the conformal or cartesian plane at mass points
+REAL, DIMENSION(:),    POINTER :: XYHATM=>NULL()            ! Position y in the conformal or cartesian plane at mass points
 REAL, DIMENSION(:),    POINTER :: XDXHAT=>NULL()            ! horizontal stretching in x
 REAL, DIMENSION(:),    POINTER :: XDYHAT=>NULL()            ! horizontal stretching in y
 REAL, DIMENSION(:,:),  POINTER :: XMAP=>NULL()              ! Map factor 
@@ -54,6 +77,7 @@ REAL, DIMENSION(:,:),  POINTER :: XZS=>NULL()               ! orography
 REAL, DIMENSION(:,:,:),POINTER :: XZZ=>NULL()               ! height z 
 REAL,                  POINTER :: XZTOP=>NULL()             ! model top (m)
 REAL, DIMENSION(:),    POINTER :: XZHAT=>NULL()             ! height level without orography
+REAL, DIMENSION(:),    POINTER :: XZHATM=>NULL()            ! height level without orography at mass points
 REAL, DIMENSION(:,:),  POINTER :: XDIRCOSXW=>NULL(),XDIRCOSYW=>NULL(),XDIRCOSZW=>NULL() ! director cosinus of the normal
                                                                                         ! to the ground surface
 REAL, DIMENSION(:,:),  POINTER  :: XCOSSLOPE=>NULL()         ! cosinus of the angle between i and the slope vector
@@ -63,5 +87,11 @@ LOGICAL,               POINTER  :: LSLEVE=>NULL()            ! Logical for SLEVE
 REAL,                  POINTER  :: XLEN1=>NULL()             ! Decay scale for smooth topography
 REAL,                  POINTER  :: XLEN2=>NULL()             ! Decay scale for small-scale topography deviation
 REAL, DIMENSION(:,:),  POINTER  :: XZSMT=>NULL()             ! smooth orography for SLEVE coordinate
+REAL, DIMENSION(:),    POINTER :: XHAT_BOUND  => NULL() ! Boundaries of global domain at u and v points
+REAL, DIMENSION(:),    POINTER :: XHATM_BOUND => NULL() ! Boundaries of global domain at mass points
+REAL, DIMENSION(:),    POINTER :: XXHAT_ll  => NULL()   ! Position x in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),    POINTER :: XYHAT_ll  => NULL()   ! Position y in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),    POINTER :: XXHATM_ll => NULL()   ! Position x in the conformal or cartesian plane at mass points (all domain)
+REAL, DIMENSION(:),    POINTER :: XYHATM_ll => NULL()   ! Position y in the conformal or cartesian plane (all domain) at mass points
 
 END MODULE MODD_GRID_n
diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 2ec859b7dc098d4fdbe5e13d0794ccea1e87d26c..47fce4f4f9d39bf81d85edc66542d4ee9c075ce6 100644
--- a/src/MNH/modd_nsv.f90
+++ b/src/MNH/modd_nsv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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.
@@ -28,30 +28,35 @@
 !!       Pialat/Tulet  15/02/12 add ForeFire
 !!      Modification    01/2016  (JP Pinty) Add LIMA
 !!       V. Vionnet     07/17   add blowing snow
-!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
 !  B. Vie         06/2021: add prognostic supersaturation for LIMA
+!  P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables
 !  A. Costes      12/2021: add Blaze fire model smoke
-!
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
+!                          + NSV_CHEM_LIST(_A) the size of the list
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
-USE MODD_PARAMETERS, ONLY : JPMODELMAX, &  ! Maximum allowed number of nested models
-                            JPSVMAX,    &  ! Maximum number of scalar variables
-                            JPSVNAMELGTMAX ! Maximum length of a scalar variable name
+USE MODD_FIELD,      ONLY: tfieldmetadata
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, &     ! Maximum allowed number of nested models
+                           JPSVMAX,    &     ! Maximum number of scalar variables
+                           JPSVNAMELGTMAX, & ! Maximum length of a scalar variable name
+                           NMNHNAMELGTMAX
 !
 IMPLICIT NONE
 SAVE
 !
 REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
 !
-LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called
+LOGICAL :: LINI_NSV(JPMODELMAX) = .FALSE. ! becomes True when routine INI_NSV is called
 !
-CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSV_CHEM_LIST_A !Names of all the chemical variables
+TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE, TARGET :: TSVLIST_A !Metadata of all the scalar variables
 
 INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables
                                          ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+..
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_LIST_A = 0 ! total number of chemical variables (including dust, salt...)
 INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0  ! number of user scalar variables with 
                                                ! indices in the range : 1...NSV_USER_A
 !
@@ -90,7 +95,7 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_LGEND_A = 0 ! NSV_LGBEG_A...NSV_LGEND_A
 !
 INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOX_A = 0    ! number of lightning NOx
 INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXBEG_A = 0 ! with indices in the range :
-INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A                !                                 
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A
 INTEGER,DIMENSION(JPMODELMAX)::NSV_DST_A = 0    ! number of dust scalar
 INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTBEG_A = 0 ! with indices in the range :
 INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTEND_A = 0 ! NSV_DSTBEG_A...NSV_DSTEND_A
@@ -145,6 +150,7 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0     ! Supersaturation
 INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0    ! number of ForeFire scalar variables
 INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range :
 INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A
+!
 #endif
 ! Blaze smoke indexes
 INTEGER,DIMENSION(JPMODELMAX)::NSV_FIRE_A = 0    ! number of Blaze smoke scalar variables
@@ -159,10 +165,15 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A
 !
 ! variables updated for the current model
 !
-CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSV_CHEM_LIST !Names of all the chemical variables
+TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST !Metadata of all the scalar variables
+
 CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables
+
 INTEGER :: NSV         = 0 ! total number of user scalar variables
 !
+INTEGER :: NSV_CHEM_LIST = 0 ! total number of chemical variables (including dust, salt...)
+!
 INTEGER :: NSV_USER    = 0 ! number of user scalar variables with indices
                            ! in the range : 1...NSV_USER
 INTEGER :: NSV_C2R2    = 0 ! number of liq scalar used in C2R2 and in C3R5
@@ -255,6 +266,7 @@ INTEGER :: NSV_LIMA_SPRO     !
 INTEGER :: NSV_FF    = 0 ! number of ForeFire scalar variables
 INTEGER :: NSV_FFBEG = 0 ! with indices in the range :
 INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND
+!
 #endif
 ! Blaze smoke
 INTEGER :: NSV_FIRE    = 0 ! number of Blaze smoke scalar variables
diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index c21c6e70955e1e1ecbe501225f6d3f83dd66a1ec..c848073f93201f6d291e7003dba2fa21601ae5aa 100644
--- a/src/MNH/modd_parameters.f90
+++ b/src/MNH/modd_parameters.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -39,10 +39,12 @@
 !!      Modification 17/05/04 (P.Jabouille) add JPOUTMAX
 !!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
 !!      B.VIE 2016 LIMA
-! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-! Q. Rodier   29/03/2019: increase maximum number of outputs to 999
-! P. Wautelet 17/01/2020: add NBUNAMELGTMAX and NCOMMENTLGTMAX parameters
-! P. Wautelet 13/03/2020: remove JPBUMAX and JPBUPROMAX
+!  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  Q. Rodier   29/03/2019: increase maximum number of outputs to 999
+!  P. Wautelet 17/01/2020: add NBUNAMELGTMAX and NCOMMENTLGTMAX parameters
+!  P. Wautelet 13/03/2020: remove JPBUMAX and JPBUPROMAX
+!  P. Wautelet 24/09/2021: add NLONGNAMELGTMAX and NUNITLGTMAX parameters
+!  P. Wautelet 20/04/2022: add NSTATPROFNAMELGTMAX parameter
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -78,11 +80,15 @@ INTEGER, PARAMETER :: JPDUMMY  = 20   ! Size of dummy array
 INTEGER, PARAMETER :: JPOUTMAX = 999    ! Maximum allowed number of OUTput files
 INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file
 !
-INTEGER, PARAMETER :: NBUNAMELGTMAX  = 32  ! Maximum length of a budget name
-INTEGER, PARAMETER :: NCOMMENTLGTMAX = 100 ! Maximum length of a comment
-INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32  ! Maximum length of a MNH variable name
-INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64  ! Maximum length of the standard name of a variable (CF convention)
+INTEGER, PARAMETER :: NBUNAMELGTMAX   = 32  ! Maximum length of a budget name
+INTEGER, PARAMETER :: NCOMMENTLGTMAX  = 100 ! Maximum length of a comment
+INTEGER, PARAMETER :: NMNHNAMELGTMAX  = 32  ! Maximum length of a MNH variable name
+INTEGER, PARAMETER :: NSTDNAMELGTMAX  = 64  ! Maximum length of the standard name of a variable (CF convention)
+INTEGER, PARAMETER :: NLONGNAMELGTMAX = 32  ! Maximum length of the long name of a variable (CF convention)
+INTEGER, PARAMETER :: NUNITLGTMAX     = 40  ! Maximum length of the canonical units of a variable (CF convention)
 !
+INTEGER, PARAMETER :: NSTATPROFNAMELGTMAX = 8 ! Maximum length for the name of a station or profiler
+
 INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name
 INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI)
 INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary
diff --git a/src/MNH/modd_precision.f90 b/src/MNH/modd_precision.f90
index a759ddf1f11072a20864f52cc148e8e3fa66d79d..83db215583b5eda80510ea23e0baefafbb7866ac 100644
--- a/src/MNH/modd_precision.f90
+++ b/src/MNH/modd_precision.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-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.
@@ -10,6 +10,7 @@
 !  P. Wautelet 27/03/2019: add MNHTIME and MNHTIME_MPI
 !  P. Wautelet 26/04/2019: add MNHLOG and MNHLOG_MPI/MNHLOG32_MPI/MNHLOG64_MPI
 !  P. Wautelet 06/01/2021: use kind=CDFINT to define parameters used in netCDF calls
+!  P. Wautelet 25/08/2022: add CDFINT_MPI parameter
 !-----------------------------------------------------------------
 module modd_precision
 
@@ -37,7 +38,7 @@ public :: MNHTIME, MNHTIME_MPI
 public :: LFIINT
 
 #ifdef MNH_IOCDF4
-public :: CDFINT, MNHINT_NF90, MNHREAL_NF90
+public :: CDFINT, CDFINT_MPI, MNHINT_NF90, MNHREAL_NF90
 #endif
 
 integer, parameter :: MNHINT32 = selected_int_kind( r = 9 )
@@ -117,6 +118,7 @@ integer, parameter :: LFIINT = MNHINT64
 #ifdef MNH_IOCDF4
 ! Kinds for netCDF
 integer, parameter :: CDFINT = selected_int_kind( r = 9 )
+integer, parameter :: CDFINT_MPI = MPI_INTEGER4
 
 #if (MNH_INT == 4)
 integer(kind=CDFINT), parameter :: MNHINT_NF90 = NF90_INT
diff --git a/src/MNH/modd_profilern.f90 b/src/MNH/modd_profilern.f90
index d8fb2469f8b7550feac893f47c6491287f7c840a..3abfe6611c28229209d7ccd573edb89995900643 100644
--- a/src/MNH/modd_profilern.f90
+++ b/src/MNH/modd_profilern.f90
@@ -1,23 +1,18 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ############################
       MODULE MODD_PROFILER_n
 !     ############################
 !
-!!****  *MODD_PROFILER* - declaration of stations
+!!****  *MODD_PROFILER* - declaration of profilers
 !!
 !!    PURPOSE
 !!    -------
 !       The purpose of this declarative module is to define
-!      the different stations types.
+!      the different profilers types.
 !
 !!
 !!**  IMPLICIT ARGUMENTS
@@ -34,32 +29,42 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    15/01/02
+!  P. Wautelet    04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 !
-USE MODD_TYPE_PROFILER
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
+USE MODD_PARAMETERS,    ONLY: JPMODELMAX
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATPROFTIME
+
 IMPLICIT NONE
 
+PRIVATE
+
+PUBLIC :: LPROFILER, NUMBPROFILER_LOC, TPROFILERS_TIME, TPROFILERS
+
+PUBLIC :: PROFILER_GOTO_MODEL
+
 TYPE PROFILER_t
 !
 !-------------------------------------------------------------------------------------------
 !
-  LOGICAL                          :: LPROFILER    ! flag to use stations
-  INTEGER                          :: NUMBPROFILER    ! number of stations
+  LOGICAL                          :: LPROFILER    ! flag to use profilers
+  INTEGER                          :: NUMBPROFILER_LOC = 0 ! number of profilers on this process
 !
-  TYPE(PROFILER) :: TPROFILER ! characteristics and records of an aircraft
+  TYPE(TSTATPROFTIME) :: TPROFILERS_TIME
+  TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TPROFILERS ! characteristics and records of the profilers
 !
 END TYPE PROFILER_t
 
 TYPE(PROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PROFILER_MODEL
 
 LOGICAL, POINTER :: LPROFILER=>NULL()
-INTEGER, POINTER :: NUMBPROFILER=>NULL()
-TYPE(PROFILER), POINTER :: TPROFILER=>NULL()
+INTEGER, POINTER :: NUMBPROFILER_LOC=>NULL()
+TYPE(TSTATPROFTIME),               POINTER :: TPROFILERS_TIME => NULL()
+TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TPROFILERS      => NULL()
 
 CONTAINS
 
@@ -67,11 +72,13 @@ SUBROUTINE PROFILER_GOTO_MODEL(KFROM, KTO)
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
 ! Save current state for allocated arrays
+PROFILER_MODEL(KFROM)%TPROFILERS => TPROFILERS
 !
 ! Current model is set to model KTO
-LPROFILER=>PROFILER_MODEL(KTO)%LPROFILER
-NUMBPROFILER=>PROFILER_MODEL(KTO)%NUMBPROFILER
-TPROFILER=>PROFILER_MODEL(KTO)%TPROFILER
+LPROFILER        => PROFILER_MODEL(KTO)%LPROFILER
+NUMBPROFILER_LOC => PROFILER_MODEL(KTO)%NUMBPROFILER_LOC
+TPROFILERS_TIME  => PROFILER_MODEL(KTO)%TPROFILERS_TIME
+TPROFILERS       => PROFILER_MODEL(KTO)%TPROFILERS
 
 END SUBROUTINE PROFILER_GOTO_MODEL
 
diff --git a/src/MNH/modd_shadowsn.f90 b/src/MNH/modd_shadowsn.f90
index b2ca81707df06b07af367dae7b3cfaa2fa989626..ebb1372e4bc024324ad861deaf87c0002511ab4b 100644
--- a/src/MNH/modd_shadowsn.f90
+++ b/src/MNH/modd_shadowsn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2012-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/11/23 17:28:44
-!-----------------------------------------------------------------
 !      ########################
        MODULE MODD_SHADOWS_n
 !      ########################
@@ -34,7 +29,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original      04/2012
-!!
+!  P. Wautelet 22/09/2022: remove XXHAT_ll and XYHAT_ll (now in modd_grid_n)
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -52,8 +47,6 @@ TYPE SHADOWS_t
   REAL, DIMENSION(:,:),         POINTER :: XZS_XY=>NULL()     !  orography at vort. points
   REAL, DIMENSION(:,:),         POINTER :: XZS_ll=>NULL()     !  orography at mass points (all domain)
   REAL, DIMENSION(:,:),         POINTER :: XZS_XY_ll=>NULL()  !  orography at vort. points (all domain)
-  REAL, DIMENSION(:),           POINTER :: XXHAT_ll=>NULL()   !  X coordinate (all domain)
-  REAL, DIMENSION(:),           POINTER :: XYHAT_ll=>NULL()   !  Y coordinate (all domain)
 !
 !
 END TYPE SHADOWS_t
@@ -64,8 +57,6 @@ REAL, POINTER :: XZS_MAX_ll=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_XY=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_ll=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_XY_ll=>NULL()
-REAL, DIMENSION(:),     POINTER :: XXHAT_ll=>NULL()
-REAL, DIMENSION(:),     POINTER :: XYHAT_ll=>NULL()
 
 CONTAINS
 
@@ -76,16 +67,12 @@ INTEGER, INTENT(IN) :: KFROM, KTO
 SHADOWS_MODEL(KFROM)%XZS_XY=>XZS_XY
 SHADOWS_MODEL(KFROM)%XZS_ll=>XZS_ll
 SHADOWS_MODEL(KFROM)%XZS_XY_ll=>XZS_XY_ll
-SHADOWS_MODEL(KFROM)%XXHAT_ll=>XXHAT_ll
-SHADOWS_MODEL(KFROM)%XYHAT_ll=>XYHAT_ll
 !
 ! Current model is set to model KTO
 XZS_MAX_ll=>SHADOWS_MODEL(KTO)%XZS_MAX_ll
 XZS_XY=>SHADOWS_MODEL(KTO)%XZS_XY
 XZS_ll=>SHADOWS_MODEL(KTO)%XZS_ll
 XZS_XY_ll=>SHADOWS_MODEL(KTO)%XZS_XY_ll
-XXHAT_ll=>SHADOWS_MODEL(KTO)%XXHAT_ll
-XYHAT_ll=>SHADOWS_MODEL(KTO)%XYHAT_ll
 
 END SUBROUTINE SHADOWS_GOTO_MODEL
 
diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90
index 8d432e588f5fbce395ee2385fb50883f8eb5f41e..6efedc643dbbef8fdf2a9e5e52c8f72c68afcaf7 100644
--- a/src/MNH/modd_spawn.f90
+++ b/src/MNH/modd_spawn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -66,6 +66,7 @@ CHARACTER (LEN=28) :: CDADSPAFILE ! DAD fm-file for spawning file
 REAL,DIMENSION(:),    SAVE,POINTER :: XXHAT1  => NULL()
 REAL,DIMENSION(:),    SAVE,POINTER :: XYHAT1  => NULL()
 REAL,DIMENSION(:),    SAVE,POINTER :: XZHAT1  => NULL()
+REAL,DIMENSION(:),    SAVE,POINTER :: XZHATM1 => NULL()
 REAL,                 SAVE,POINTER :: XZTOP1  => NULL()
 REAL,DIMENSION(:,:),  SAVE,POINTER :: XZS1    => NULL()
 REAL,DIMENSION(:,:),  SAVE,POINTER :: XZSMT1  => NULL()
diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90
index fe16b769732e659cb6ec94f8683dafe2f1200f64..406d14909bec8ed563486f0ec51262b8f52ead70 100644
--- a/src/MNH/modd_stationn.f90
+++ b/src/MNH/modd_stationn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ############################
       MODULE MODD_STATION_n
 !     ############################
@@ -34,34 +29,42 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    15/01/02
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 !
-USE MODD_TYPE_STATION
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
+USE MODD_PARAMETERS,    ONLY: JPMODELMAX
+USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA, TSTATPROFTIME
+
 IMPLICIT NONE
 
+PRIVATE
+
+PUBLIC :: LSTATION, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS
+
+PUBLIC :: STATION_GOTO_MODEL
+
 TYPE STATION_t
 !
 !-------------------------------------------------------------------------------------------
 !
   LOGICAL                          :: LSTATION    ! flag to use stations
-  INTEGER                          :: NUMBSTAT    ! number of stations
-  LOGICAL                          :: LSTATLAT    ! positioning in lat/lon
+  INTEGER                          :: NUMBSTAT_LOC = 0 ! number of stations on this process
 !
-  TYPE(STATION) :: TSTATION ! characteristics and records of a station
+  TYPE(TSTATPROFTIME) :: TSTATIONS_TIME
+  TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations
 !
 END TYPE STATION_t
 
 TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL
 
 LOGICAL, POINTER :: LSTATION=>NULL()
-INTEGER, POINTER :: NUMBSTAT=>NULL()
-LOGICAL, POINTER :: LSTATLAT=>NULL()
-TYPE(STATION), POINTER :: TSTATION=>NULL()
+INTEGER, POINTER :: NUMBSTAT_LOC=>NULL()
+TYPE(TSTATPROFTIME),              POINTER :: TSTATIONS_TIME => NULL()
+TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS      => NULL()
 
 CONTAINS
 
@@ -69,12 +72,13 @@ SUBROUTINE STATION_GOTO_MODEL(KFROM, KTO)
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
 ! Save current state for allocated arrays
+STATION_MODEL(KFROM)%TSTATIONS => TSTATIONS
 !
 ! Current model is set to model KTO
-LSTATION=>STATION_MODEL(KTO)%LSTATION
-NUMBSTAT=>STATION_MODEL(KTO)%NUMBSTAT
-LSTATLAT=>STATION_MODEL(KTO)%LSTATLAT
-TSTATION=>STATION_MODEL(KTO)%TSTATION
+LSTATION       => STATION_MODEL(KTO)%LSTATION
+NUMBSTAT_LOC   => STATION_MODEL(KTO)%NUMBSTAT_LOC
+TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME
+TSTATIONS      => STATION_MODEL(KTO)%TSTATIONS
 
 END SUBROUTINE STATION_GOTO_MODEL
 
diff --git a/src/MNH/modd_sub_elecn.f90 b/src/MNH/modd_sub_elecn.f90
index d25df3084adf326595431c9d9e122baa7a90aa1e..1f5b6b9405c83f091bcb41bcf5bb6f5270b1d820 100644
--- a/src/MNH/modd_sub_elecn.f90
+++ b/src/MNH/modd_sub_elecn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2011-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/06/27 12:43:28
-!-----------------------------------------------------------------
 !!    ############################ 
       MODULE MODD_SUB_ELEC_n
 !!    ############################ 
@@ -32,6 +27,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    07/11
+!  P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead)
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -50,8 +46,6 @@ TYPE SUB_ELEC_t
   INTEGER , DIMENSION(:), POINTER :: ISNBSEG=>NULL() ! Number of flash segments
   INTEGER , DIMENSION(:), POINTER :: ISTCOUNT_NUMBER=>NULL() ! Temporal loop number of the flash
   INTEGER , DIMENSION(:), POINTER :: ISTYPE=>NULL() ! flash type :IC, CGN or CGP
-  REAL    , DIMENSION(:), POINTER :: ZXMASS=>NULL() ! Coord. at mass points
-  REAL    , DIMENSION(:), POINTER :: ZYMASS=>NULL() ! Coord. at mass points
   REAL    , DIMENSION(:,:,:), POINTER :: ZZMASS=>NULL() ! Coord. at mass points
   REAL    , DIMENSION(:,:,:), POINTER :: ZPRES_COEF=>NULL() ! Pressure effect for E
   REAL    , DIMENSION(:,:,:), POINTER :: ZSCOORD_SEG=>NULL() ! Global coordinates of segments
@@ -71,8 +65,6 @@ TYPE(SUB_ELEC_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_ELEC_MODEL
   INTEGER , DIMENSION(:), POINTER :: ISNBSEG=>NULL() 
   INTEGER , DIMENSION(:), POINTER :: ISTCOUNT_NUMBER=>NULL() 
   INTEGER , DIMENSION(:), POINTER :: ISTYPE=>NULL() 
-  REAL    , DIMENSION(:), POINTER :: ZXMASS=>NULL() 
-  REAL    , DIMENSION(:), POINTER :: ZYMASS=>NULL() 
   REAL    , DIMENSION(:,:,:), POINTER :: ZZMASS=>NULL() 
   REAL    , DIMENSION(:,:,:), POINTER :: ZPRES_COEF=>NULL() 
   REAL    , DIMENSION(:,:,:), POINTER :: ZSCOORD_SEG=>NULL()
@@ -92,8 +84,6 @@ SUB_ELEC_MODEL(KFROM)%ISCELL_NUMBER=>ISCELL_NUMBER
 SUB_ELEC_MODEL(KFROM)%ISNBSEG=>ISNBSEG            
 SUB_ELEC_MODEL(KFROM)%ISTCOUNT_NUMBER=>ISTCOUNT_NUMBER
 SUB_ELEC_MODEL(KFROM)%ISTYPE=>ISTYPE           
-SUB_ELEC_MODEL(KFROM)%ZXMASS=>ZXMASS
-SUB_ELEC_MODEL(KFROM)%ZYMASS=>ZYMASS
 SUB_ELEC_MODEL(KFROM)%ZZMASS=>ZZMASS
 SUB_ELEC_MODEL(KFROM)%ZPRES_COEF=>ZPRES_COEF
 SUB_ELEC_MODEL(KFROM)%ZSCOORD_SEG=>ZSCOORD_SEG
@@ -109,8 +99,6 @@ ISCELL_NUMBER=>SUB_ELEC_MODEL(KTO)%ISCELL_NUMBER
 ISNBSEG=>SUB_ELEC_MODEL(KTO)%ISNBSEG        
 ISTCOUNT_NUMBER=>SUB_ELEC_MODEL(KTO)%ISTCOUNT_NUMBER 
 ISTYPE=>SUB_ELEC_MODEL(KTO)%ISTYPE              
-ZXMASS=>SUB_ELEC_MODEL(KTO)%ZXMASS 
-ZYMASS=>SUB_ELEC_MODEL(KTO)%ZYMASS 
 ZZMASS=>SUB_ELEC_MODEL(KTO)%ZZMASS 
 ZPRES_COEF=>SUB_ELEC_MODEL(KTO)%ZPRES_COEF 
 ZSCOORD_SEG=>SUB_ELEC_MODEL(KTO)%ZSCOORD_SEG
diff --git a/src/MNH/modd_sub_profilern.f90 b/src/MNH/modd_sub_profilern.f90
deleted file mode 100644
index 14582b74ba45f032c41dff8e0538b195e8fc56c9..0000000000000000000000000000000000000000
--- a/src/MNH/modd_sub_profilern.f90
+++ /dev/null
@@ -1,109 +0,0 @@
-!MNH_LIC Copyright 1994-2014 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.
-!-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/06/27 12:30:56
-!-----------------------------------------------------------------
-!     ############################
-      MODULE MODD_SUB_PROFILER_n
-!     ############################
-!
-!!****  *MODD_PROFILER* - declaration of stations
-!!
-!!    PURPOSE
-!!    -------
-!       The purpose of this declarative module is to define
-!      the different stations types.
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!      NONE 
-!!
-!!    REFERENCE
-!!    --------- 
-!!       
-!!    AUTHOR
-!!    ------
-!!	P. Tulet   *Meteo France*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    15/01/02
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-!
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
-IMPLICIT NONE
-
-TYPE SUB_PROFILER_t
-!
-!-------------------------------------------------------------------------------------------
-!
-  LOGICAL :: GPROFILERFIRSTCALL  = .TRUE.
-!
-  INTEGER,DIMENSION(:), POINTER :: II=>NULL()       ! mass lidar position (x index)
-  INTEGER,DIMENSION(:), POINTER :: IJ=>NULL()       ! mass lidar position (y index)
-  INTEGER,DIMENSION(:), POINTER :: IU=>NULL()       ! U flux point lidar position (x index)
-  INTEGER,DIMENSION(:), POINTER :: IV=>NULL()       ! V flux point lidar position (y index)
-!
-  REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL()
-!
-  REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL()   ! X direction interpolation coefficient
-  REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL()   ! X direction interpolation coefficient (for U)
-  REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL()   ! Y direction interpolation coefficient
-  REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL()   ! Y direction interpolation coefficient (for V)
-
-END TYPE SUB_PROFILER_t
-
-TYPE(SUB_PROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_PROFILER_MODEL
-
-LOGICAL, POINTER :: GPROFILERFIRSTCALL=>NULL()
-INTEGER,DIMENSION(:), POINTER :: II=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IJ=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IU=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IV=>NULL()
-REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL()
-REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL()
-
-CONTAINS
-
-SUBROUTINE SUB_PROFILER_GOTO_MODEL(KFROM, KTO)
-INTEGER, INTENT(IN) :: KFROM, KTO
-!
-! Save current state for allocated arrays
-SUB_PROFILER_MODEL(KFROM)%II=>II
-SUB_PROFILER_MODEL(KFROM)%IJ=>IJ
-SUB_PROFILER_MODEL(KFROM)%IU=>IU
-SUB_PROFILER_MODEL(KFROM)%IV=>IV
-SUB_PROFILER_MODEL(KFROM)%ZTHIS_PROCS=>ZTHIS_PROCS
-SUB_PROFILER_MODEL(KFROM)%ZXCOEF=>ZXCOEF
-SUB_PROFILER_MODEL(KFROM)%ZUCOEF=>ZUCOEF
-SUB_PROFILER_MODEL(KFROM)%ZYCOEF=>ZYCOEF
-SUB_PROFILER_MODEL(KFROM)%ZVCOEF=>ZVCOEF
-!
-! Current model is set to model KTO
-GPROFILERFIRSTCALL=>SUB_PROFILER_MODEL(KTO)%GPROFILERFIRSTCALL
-II=>SUB_PROFILER_MODEL(KTO)%II
-IJ=>SUB_PROFILER_MODEL(KTO)%IJ
-IU=>SUB_PROFILER_MODEL(KTO)%IU
-IV=>SUB_PROFILER_MODEL(KTO)%IV
-ZTHIS_PROCS=>SUB_PROFILER_MODEL(KTO)%ZTHIS_PROCS
-ZXCOEF=>SUB_PROFILER_MODEL(KTO)%ZXCOEF
-ZUCOEF=>SUB_PROFILER_MODEL(KTO)%ZUCOEF
-ZYCOEF=>SUB_PROFILER_MODEL(KTO)%ZYCOEF
-ZVCOEF=>SUB_PROFILER_MODEL(KTO)%ZVCOEF
-
-END SUBROUTINE SUB_PROFILER_GOTO_MODEL
-
-END MODULE MODD_SUB_PROFILER_n
diff --git a/src/MNH/modd_sub_stationn.f90 b/src/MNH/modd_sub_stationn.f90
deleted file mode 100644
index d9fffb3ecf6ee5131fc7b45a8e4cb6e5ce0983f5..0000000000000000000000000000000000000000
--- a/src/MNH/modd_sub_stationn.f90
+++ /dev/null
@@ -1,108 +0,0 @@
-!MNH_LIC Copyright 1994-2014 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.
-!-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/06/27 12:28:56
-!-----------------------------------------------------------------
-!     ############################
-      MODULE MODD_SUB_STATION_n
-!     ############################
-!
-!!****  *MODD_STATION* - declaration of stations
-!!
-!!    PURPOSE
-!!    -------
-!       The purpose of this declarative module is to define
-!      the different stations types.
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!      NONE 
-!!
-!!    REFERENCE
-!!    --------- 
-!!       
-!!    AUTHOR
-!!    ------
-!!	P. Tulet   *Meteo France*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    15/01/02
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-!
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
-IMPLICIT NONE
-
-TYPE SUB_STATION_t
-!
-  LOGICAL :: GSTATFIRSTCALL  = .TRUE.     ! 
-!
-  INTEGER,DIMENSION(:), POINTER :: II=>NULL()       ! mass station position (x index)
-  INTEGER,DIMENSION(:), POINTER :: IJ=>NULL()       ! mass station position (y index)
-  INTEGER,DIMENSION(:), POINTER :: IU=>NULL()       ! U flux point station position (x index)
-  INTEGER,DIMENSION(:), POINTER :: IV=>NULL()       ! V flux point station position (y index)
-!
-  REAL, DIMENSION(:), POINTER  :: ZTHIS_PROCS=>NULL()     ! 
-!
-  REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL()      ! X direction interpolation coefficient
-  REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL()      ! X direction interpolation coefficient (for U)
-  REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL()      ! Y direction interpolation coefficient
-  REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL()      ! Y direction interpolation coefficient (for V)
-!
-
-END TYPE SUB_STATION_t
-
-TYPE(SUB_STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_STATION_MODEL
-
-LOGICAL, POINTER :: GSTATFIRSTCALL=>NULL()
-INTEGER,DIMENSION(:), POINTER :: II=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IJ=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IU=>NULL()
-INTEGER,DIMENSION(:), POINTER :: IV=>NULL()
-REAL, DIMENSION(:), POINTER  :: ZTHIS_PROCS=>NULL()
-REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL()
-REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL()
-
-CONTAINS
-
-SUBROUTINE SUB_STATION_GOTO_MODEL(KFROM, KTO)
-INTEGER, INTENT(IN) :: KFROM, KTO
-!
-! Save current state for allocated arrays
-SUB_STATION_MODEL(KFROM)%II=>II
-SUB_STATION_MODEL(KFROM)%IJ=>IJ
-SUB_STATION_MODEL(KFROM)%IU=>IU
-SUB_STATION_MODEL(KFROM)%IV=>IV
-SUB_STATION_MODEL(KFROM)%ZTHIS_PROCS=>ZTHIS_PROCS
-SUB_STATION_MODEL(KFROM)%ZXCOEF=>ZXCOEF
-SUB_STATION_MODEL(KFROM)%ZUCOEF=>ZUCOEF
-SUB_STATION_MODEL(KFROM)%ZYCOEF=>ZYCOEF
-SUB_STATION_MODEL(KFROM)%ZVCOEF=>ZVCOEF
-!
-! Current model is set to model KTO
-GSTATFIRSTCALL=>SUB_STATION_MODEL(KTO)%GSTATFIRSTCALL
-II=>SUB_STATION_MODEL(KTO)%II
-IJ=>SUB_STATION_MODEL(KTO)%IJ
-IU=>SUB_STATION_MODEL(KTO)%IU
-IV=>SUB_STATION_MODEL(KTO)%IV
-ZTHIS_PROCS=>SUB_STATION_MODEL(KTO)%ZTHIS_PROCS
-ZXCOEF=>SUB_STATION_MODEL(KTO)%ZXCOEF
-ZUCOEF=>SUB_STATION_MODEL(KTO)%ZUCOEF
-ZYCOEF=>SUB_STATION_MODEL(KTO)%ZYCOEF
-ZVCOEF=>SUB_STATION_MODEL(KTO)%ZVCOEF
-
-END SUBROUTINE SUB_STATION_GOTO_MODEL
-
-END MODULE MODD_SUB_STATION_n
diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90
index e9717d3217f8f2e43f1f56877fd1b8eb0c24df64..31b67ef896e1191e9906fb49569ae413da16662e 100644
--- a/src/MNH/modd_type_date.f90
+++ b/src/MNH/modd_type_date.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1997-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.
@@ -32,6 +32,7 @@ module modd_type_date
 !!      Original    11/08/97
 !  P. Wautelet 24/07/2019: set default values
 !  P. Wautelet 17/12/2020: restructure type date_time
+!  P. Wautelet 11/07/2022: add Datetime_initialized_check function
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -46,9 +47,98 @@ type date
   integer :: nmonth = 0
   integer :: nday   = 0
 end type date
-!
+
+#if 0
+!GCC BUG: if an extended type is used in an array for a namelist, the reading fails
+!GCC bug (at least from 5.5 to 12.1, see GCC bug 106065)
 type, extends( date ) :: date_time
   real :: xtime = XNEGUNDEF
 end type date_time
-!
+#else
+type :: date_time
+  integer :: nyear  = NNEGUNDEF
+  integer :: nmonth = 0
+  integer :: nday   = 0
+  real :: xtime = XNEGUNDEF
+
+  contains
+    procedure, pass(tpdt) :: check => Datetime_initialized_check
+end type date_time
+#endif
+
+contains
+
+logical function Datetime_initialized_check( tpdt, hname ) result( gok )
+  !Check if the values of the date_time type have been set and are valid
+  !Remark: xtime must be inside the day (between 0. and 24h)
+
+  use mode_msg
+
+  class( date_time ),           intent(in) :: tpdt
+  character(len=*),   optional, intent(in) :: hname !Name of the variable (useful for messages)
+
+  character(len=:), allocatable :: yname
+  logical :: gdayok
+
+  gok = .true.
+
+  if ( Present( hname ) ) then
+    yname = Trim( hname ) // ': '
+  else
+    yname = ''
+  end if
+
+  if ( tpdt%nyear == NNEGUNDEF ) then
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'year has not been set' )
+    gok = .false.
+  end if
+
+  if ( tpdt%nmonth == 0 ) then
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'month has not been set (=0)' )
+    gok = .false.
+  else if ( tpdt%nmonth < 0 .or. tpdt%nmonth > 12 ) then
+    Write( cmnhmsg(1), '( A, "invalid month: ", I18 )' ) Trim( yname ), tpdt%nmonth
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' )
+    gok = .false.
+  end if
+
+  if ( tpdt%nday == 0 ) then
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'day has not been set (=0)' )
+    gdayok = .false.
+    gok = .false.
+  else
+    gdayok = .true.
+    if ( tpdt%nday < 1 ) then
+      gdayok = .false.
+    else if ( Any( tpdt%nmonth == [ 1, 3, 5, 7, 8, 10, 12 ] ) .and. tpdt%nday > 31 ) then
+      gdayok = .false.
+    else if ( Any( tpdt%nmonth == [ 4, 6, 9, 11 ] ) .and. tpdt%nday > 30 ) then
+      gdayok = .false.
+    else if ( tpdt%nmonth == 2 ) then
+      if ( ( Mod( tpdt%nyear, 4 ) == 0 .and. Mod( tpdt%nyear, 100 ) /= 0 ) .or. Mod( tpdt%nyear, 400 ) == 0 ) then
+        if ( tpdt%nday > 29 ) then
+          gdayok = .false.
+        end if
+      else if ( tpdt%nday > 28 ) then
+        gdayok = .false.
+      end if
+    end if
+    if ( .not. gdayok ) then
+      Write( cmnhmsg(1), '( A, "invalid day", I18, " for month: ", I18 )' ) Trim( yname ), tpdt%nday, tpdt%nmonth
+      call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' )
+      gok = .false.
+    end if
+  end if
+
+  if ( tpdt%xtime == XNEGUNDEF ) then
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'time has not been set' )
+    gok = .false.
+  else if ( tpdt%xtime < 0 .or. tpdt%xtime > ( 3600. * 24 ) ) then
+    Write( cmnhmsg(1), '( A, "invalid time: ", EN12.3 )' ) Trim( yname ), tpdt%xtime
+    call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' )
+    gok = .false.
+  end if
+
+end function Datetime_initialized_check
+
 end module modd_type_date
diff --git a/src/MNH/modd_type_profiler.f90 b/src/MNH/modd_type_profiler.f90
deleted file mode 100644
index b5fedbf60ab7d849a2d04fc98d3047daa34cad64..0000000000000000000000000000000000000000
--- a/src/MNH/modd_type_profiler.f90
+++ /dev/null
@@ -1,115 +0,0 @@
-!MNH_LIC Copyright 2002-2021 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 MODD_TYPE_PROFILER
-!     ############################
-!
-!!****  *MODD_PROFILER* - declaration of stations
-!!
-!!    PURPOSE
-!!    -------
-!       The purpose of this declarative module is to define
-!      the different stations types.
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!
-!!    REFERENCE
-!!    --------- 
-!!       
-!!    AUTHOR
-!!    ------
-!!	P. Tulet   *Meteo France*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    15/01/02
-!!     C.Lac 10/2016  Add visibility diagnostic
-!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!  M. Taufour  05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-use modd_type_date, only: date_time
-
-implicit none
-
-TYPE PROFILER
-!
-!
-!* general information
-!
-!
-!* storage monitoring
-!
-REAL                          :: T_CUR  ! current time since last storage
-INTEGER                       :: N_CUR  ! current step of storage
-REAL                          :: STEP   ! storage time step
-!
-!* data records
-!
-CHARACTER(LEN=8),DIMENSION(:), POINTER   :: NAME=>NULL()   ! station name
-CHARACTER(LEN=8),DIMENSION(:), POINTER   :: TYPE=>NULL()   ! station type
-!
-type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants)
-LOGICAL, DIMENSION(:),    POINTER :: ERROR=>NULL()
-REAL, DIMENSION(:),       POINTER :: X=>NULL()        ! X(n)
-REAL, DIMENSION(:),       POINTER :: Y=>NULL()        ! Y(n)
-REAL, DIMENSION(:),       POINTER :: LON=>NULL()      ! longitude(n)
-REAL, DIMENSION(:),       POINTER :: LAT=>NULL()      ! latitude (n)
-REAL, DIMENSION(:),       POINTER :: ALT=>NULL()      ! altitude (n)
-REAL, DIMENSION(:,:,:),   POINTER :: ZON=>NULL()      ! zonal wind(n)
-REAL, DIMENSION(:,:,:),   POINTER :: MER=>NULL()      ! meridian wind(n)
-REAL, DIMENSION(:,:,:),   POINTER :: FF=>NULL()       ! wind intensity
-REAL, DIMENSION(:,:,:),   POINTER :: DD=>NULL()       ! wind direction
-REAL, DIMENSION(:,:,:),   POINTER :: W=>NULL()        ! w(n)  (air vertical speed)
-REAL, DIMENSION(:,:,:),   POINTER :: P=>NULL()        ! p(n)
-REAL, DIMENSION(:,:,:),   POINTER :: ZZ=>NULL()       ! altitude(n)
-REAL, DIMENSION(:,:,:),   POINTER :: TKE=>NULL()      ! tke(n)
-REAL, DIMENSION(:,:,:),   POINTER :: TH=>NULL()       ! th(n)
-REAL, DIMENSION(:,:,:),   POINTER :: THV=>NULL()      ! thv(n)
-REAL, DIMENSION(:,:,:),   POINTER :: VISI=>NULL()     ! VISI(n)
-REAL, DIMENSION(:,:,:),   POINTER :: VISIKUN=>NULL()  ! VISI KUNKEL(n)
-REAL, DIMENSION(:,:,:),   POINTER :: CRARE=>NULL()     ! radar reflectivity (n)
-REAL, DIMENSION(:,:,:),   POINTER :: CRARE_ATT=>NULL() ! radar attenuated reflectivity (n)
-REAL, DIMENSION(:,:,:),   POINTER :: CIZ=>NULL()       ! Ice number concentration ICE3 (n)
-REAL, DIMENSION(:,:,:),   POINTER :: LWCZ=>NULL()      ! liquid water content (n)
-REAL, DIMENSION(:,:,:),   POINTER :: IWCZ=>NULL()      ! ice water content (n)
-REAL, DIMENSION(:,:,:),   POINTER :: RHOD=>NULL()     ! density of dry air/moist air
-REAL, DIMENSION(:,:,:,:), POINTER :: R=>NULL()        ! r*(n)
-REAL, DIMENSION(:,:,:,:), POINTER :: SV=>NULL()       ! Sv*(n)
-REAL, DIMENSION(:,:,:,:), POINTER :: AER=>NULL()      ! AER*(n) aerosol extinction
-!
-REAL, DIMENSION(:,:),     POINTER :: T2M=>NULL()      ! 2 m air temperature (°C)
-REAL, DIMENSION(:,:),     POINTER :: Q2M=>NULL()      ! 2 m humidity (kg/kg)
-REAL, DIMENSION(:,:),     POINTER :: HU2M=>NULL()     ! 2 m relative humidity (%)
-REAL, DIMENSION(:,:),     POINTER :: ZON10M=>NULL()   ! 10 m zonal wind (m/s)  
-REAL, DIMENSION(:,:),     POINTER :: MER10M=>NULL()   ! 10 m merid. wind (m/s)
-REAL, DIMENSION(:,:),     POINTER :: RN=>NULL()       ! net radiation (W m2)
-REAL, DIMENSION(:,:),     POINTER :: H=>NULL()        ! sensible heat flux (W m2)
-REAL, DIMENSION(:,:),     POINTER :: LE=>NULL()       ! Total latent heat flux (W m2)
-REAL, DIMENSION(:,:),     POINTER :: LEI=>NULL()      ! Solid latent heat flux (W m2)
-REAL, DIMENSION(:,:),     POINTER :: GFLUX=>NULL()    ! storage heat flux (W m2)
-REAL, DIMENSION(:,:),     POINTER :: LWD=>NULL()       ! IR downward radiation (W m2)
-REAL, DIMENSION(:,:),     POINTER :: LWU=>NULL()       ! IR upward radiation (W m2)
-REAL, DIMENSION(:,:),     POINTER :: SWD=>NULL()       ! solar downward radiation (W m2)
-REAL, DIMENSION(:,:),     POINTER :: SWU=>NULL()       ! solar upward radiation (W m2)
-REAL, DIMENSION(:,:),   POINTER :: IWV=>NULL()      ! integrated water vpour(n)
-REAL, DIMENSION(:,:),   POINTER :: ZTD=>NULL()      ! GPS zenith tropo delay(n)
-REAL, DIMENSION(:,:),   POINTER :: ZWD=>NULL()      ! GPS zenith wet delay(n)
-REAL, DIMENSION(:,:),   POINTER :: ZHD=>NULL()      ! GPS zenith hydro delay(n)
-!
-REAL, DIMENSION(:,:,:),   POINTER :: TKE_DISS=>NULL() ! TKE dissipation rate
-!
-!
-END TYPE PROFILER
-!
-END MODULE MODD_TYPE_PROFILER
-
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
deleted file mode 100644
index 3456ac2d272e30cd9ce2e85fbd58f6d4dd4019a3..0000000000000000000000000000000000000000
--- a/src/MNH/modd_type_station.f90
+++ /dev/null
@@ -1,103 +0,0 @@
-!MNH_LIC Copyright 2002-2019 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 MODD_TYPE_STATION
-!     ############################
-!
-!!****  *MODD_STATION* - declaration of stations
-!!
-!!    PURPOSE
-!!    -------
-!       The purpose of this declarative module is to define
-!      the different stations types.
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!      NONE 
-!!
-!!    REFERENCE
-!!    --------- 
-!!       
-!!    AUTHOR
-!!    ------
-!!	P. Tulet   *Meteo France*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    15/01/02
-!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-!
-use modd_type_date, only: date_time
-
-implicit none
-
-TYPE STATION
-!
-!
-!* general information
-!
-!
-!* storage monitoring
-!
-REAL                          :: T_CUR  ! current time since last storage
-INTEGER                       :: N_CUR  ! current step of storage
-REAL                          :: STEP   ! storage time step
-!
-!* data records
-!
-CHARACTER(LEN=8),DIMENSION(:), POINTER   :: NAME=>NULL()   ! station name
-CHARACTER(LEN=8),DIMENSION(:), POINTER   :: TYPE=>NULL()   ! station type
-type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants)
-LOGICAL, DIMENSION(:),  POINTER :: ERROR=>NULL()  !
-REAL, DIMENSION(:),     POINTER :: X=>NULL()      ! X(n)
-REAL, DIMENSION(:),     POINTER :: Y=>NULL()      ! Y(n)
-REAL, DIMENSION(:),     POINTER :: Z=>NULL()      ! Z(n)
-REAL, DIMENSION(:),     POINTER :: LON=>NULL()    ! longitude(n)
-REAL, DIMENSION(:),     POINTER :: LAT=>NULL()    ! latitude (n)
-REAL, DIMENSION(:,:),   POINTER :: ZON=>NULL()    ! zonal wind(n)
-REAL, DIMENSION(:,:),   POINTER :: MER=>NULL()    ! meridian wind(n)
-REAL, DIMENSION(:,:),   POINTER :: W=>NULL()      ! w(n)  (air vertical speed)
-REAL, DIMENSION(:,:),   POINTER :: P=>NULL()      ! p(n)
-REAL, DIMENSION(:,:),   POINTER :: TKE=>NULL()    ! tke(n)
-REAL, DIMENSION(:,:),   POINTER :: TH=>NULL()     ! th(n)
-REAL, DIMENSION(:,:,:), POINTER :: R=>NULL()      ! r*(n)
-REAL, DIMENSION(:,:,:), POINTER :: SV=>NULL()     ! Sv*(n)
-REAL, DIMENSION(:),     POINTER :: ZS=>NULL()     ! zs(n)
-REAL, DIMENSION(:,:),   POINTER :: TSRAD=>NULL()  ! Ts(n)
-!
-REAL, DIMENSION(:,:),   POINTER :: T2M=>NULL()    ! 
-REAL, DIMENSION(:,:),   POINTER :: Q2M=>NULL()    ! 
-REAL, DIMENSION(:,:),   POINTER :: HU2M=>NULL()   ! 
-REAL, DIMENSION(:,:),   POINTER :: ZON10M=>NULL() ! 
-REAL, DIMENSION(:,:),   POINTER :: MER10M=>NULL() ! 
-REAL, DIMENSION(:,:),   POINTER :: RN=>NULL()     ! 
-REAL, DIMENSION(:,:),   POINTER :: H=>NULL()      ! 
-REAL, DIMENSION(:,:),   POINTER :: LE=>NULL()     !
-REAL, DIMENSION(:,:),   POINTER :: LEI=>NULL()    ! 
-REAL, DIMENSION(:,:),   POINTER :: GFLUX=>NULL()  !
-REAL, DIMENSION(:,:),   POINTER :: SWD=>NULL()     ! 
-REAL, DIMENSION(:,:),   POINTER :: SWU=>NULL()     ! 
-REAL, DIMENSION(:,:),   POINTER :: LWD=>NULL()     !
-REAL, DIMENSION(:,:),   POINTER :: LWU=>NULL()     !
-REAL, DIMENSION(:,:),   POINTER :: SWDIR=>NULL()  ! 
-REAL, DIMENSION(:,:),   POINTER :: SWDIFF=>NULL() !
-REAL, DIMENSION(:,:),   POINTER :: DSTAOD=>NULL() ! Dust Aerosol Optical Depth
-REAL, DIMENSION(:,:),   POINTER :: SFCO2=>NULL()  ! CO2 surface flux
-!
-INTEGER, DIMENSION(:),  POINTER :: K=>NULL()      ! Model level for altitude
-                                                  ! comparisons
-INTEGER, DIMENSION(:),  POINTER :: I=>NULL()      ! i index  (n)
-INTEGER, DIMENSION(:),  POINTER :: J=>NULL()      ! j index  (n)
-
-END TYPE STATION
-!
-END MODULE MODD_TYPE_STATION
diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90
new file mode 100644
index 0000000000000000000000000000000000000000..24d4d7e19bcf565891cc60958180732be5d35fde
--- /dev/null
+++ b/src/MNH/modd_type_statprof.f90
@@ -0,0 +1,156 @@
+!MNH_LIC Copyright 2002-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 MODD_TYPE_STATPROF
+!     ############################
+!
+!!****  *MODD_STATION* - declaration of stations
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this declarative module is to define
+!      the different stations types.
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE 
+!!
+!!    REFERENCE
+!!    --------- 
+!!       
+!!    AUTHOR
+!!    ------
+!!	P. Tulet   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    15/01/02
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet    04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+use modd_type_date,  only: date_time
+use modd_parameters, only: NNEGUNDEF, NSTATPROFNAMELGTMAX, XUNDEF
+
+implicit none
+
+private
+
+public :: TSTATPROFTIME
+public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
+
+TYPE :: TSTATPROFTIME
+  INTEGER                                    :: N_CUR     = 0       ! current step of storage
+  REAL                                       :: XTSTEP    = 60.     ! storage time step (default reset later by INI_STATION_n)
+  type(date_time), dimension(:), ALLOCATABLE :: tpdates             ! dates(n) (n: recording instants)
+END TYPE TSTATPROFTIME
+
+TYPE :: TSTATPROFDATA
+  ! Type to store data common to stations and profilers
+  ! It is used as a basis for the TSTATIONDATA and TPROFILERDATA
+  ! and for common procedures for these 2 types
+  CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = ''  ! Station/profiler name
+
+  INTEGER :: NID = 0 ! Global identification number of the station/profiler (from 1 to total number)
+
+  REAL :: XX   = XUNDEF  ! X(n)
+  REAL :: XY   = XUNDEF  ! Y(n)
+  REAL :: XZ   = XUNDEF  ! Z(n)
+  REAL :: XLON = XUNDEF  ! longitude(n)
+  REAL :: XLAT = XUNDEF  ! latitude (n)
+
+  ! Position in the mesh
+  INTEGER :: NI_M = NNEGUNDEF ! X position for mass-point axis (between this one and the next one)
+  INTEGER :: NJ_M = NNEGUNDEF ! Y position for mass-point axis (between this one and the next one)
+  INTEGER :: NI_U = NNEGUNDEF ! X position for u-point axis (between this one and the next one)
+  INTEGER :: NJ_V = NNEGUNDEF ! Y position for v-point axis (between this one and the next one)
+
+  ! Coefficient to interpolate values (stations are usually not exactly on mesh points)
+  REAL :: XXMCOEF = XUNDEF ! Interpolation coefficient for X (mass-point)
+  REAL :: XYMCOEF = XUNDEF ! Interpolation coefficient for Y (mass-point)
+  REAL :: XXUCOEF = XUNDEF ! Interpolation coefficient for X (U-point)
+  REAL :: XYVCOEF = XUNDEF ! Interpolation coefficient for Y (V-point)
+
+  ! Dimension corresponds to recording instants
+  REAL, DIMENSION(:),   ALLOCATABLE :: XT2M    ! 2 m air temperature (C)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XQ2M    ! 2 m humidity (kg/kg)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XHU2M   ! 2 m relative humidity (%)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XZON10M ! 10 m zonal wind (m/s)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XMER10M ! 10 m merid. wind (m/s)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XRN     ! net radiation (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XH      ! sensible heat flux (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XLE     ! Total latent heat flux (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XLEI    ! Solid latent heat flux (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XGFLUX  ! storage heat flux (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XSWD    ! IR downward radiation (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XSWU    ! IR upward radiation (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XLWD    ! solar downward radiation (W m2)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XLWU    ! solar upward radiation (W m2)
+END TYPE
+
+TYPE, EXTENDS( TSTATPROFDATA ) ::  TSTATIONDATA
+  ! Type to store all the data of 1 station
+  INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons
+
+  REAL :: XZS  = XUNDEF  ! zs(n)
+
+  ! (n: recording instants)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XZON    ! zonal wind(n)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XMER    ! meridian wind(n)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XW      ! w(n)  (air vertical speed)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XP      ! p(n)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XTKE    ! tke(n)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XTH     ! th(n)
+  REAL, DIMENSION(:,:), ALLOCATABLE :: XR      ! r*(n)
+  REAL, DIMENSION(:,:), ALLOCATABLE :: XSV     ! Sv*(n)
+  REAL, DIMENSION(:),   ALLOCATABLE :: XTSRAD  ! Ts(n)
+
+  REAL, DIMENSION(:),   ALLOCATABLE :: XSWDIR
+  REAL, DIMENSION(:),   ALLOCATABLE :: XSWDIFF
+  REAL, DIMENSION(:),   ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth
+  REAL, DIMENSION(:),   ALLOCATABLE :: XSFCO2  ! CO2 surface flux
+END TYPE TSTATIONDATA
+
+TYPE, EXTENDS( TSTATPROFDATA ) ::  TPROFILERDATA
+  ! Type to store all the data of 1 profiler
+  CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CTYPE = ''  ! Profiler type
+
+  ! (n: recording instants)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XZON       ! zonal wind(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XMER       ! meridian wind(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XFF        ! wind intensity
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XDD        ! wind direction
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XW         ! w(n)  (air vertical speed)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XP         ! p(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XZZ        ! altitude(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XTKE       ! tke(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XTH        ! th(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XTHV       ! thv(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XVISIGUL   ! VISI GULTEPE(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XVISIKUN   ! VISI KUNKEL(n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCRARE     ! radar reflectivity (n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCRARE_ATT ! radar attenuated reflectivity (n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XCIZ       ! Ice number concentration ICE3 (n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XLWCZ      ! liquid water content (n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XIWCZ      ! ice water content (n)
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XRHOD      ! density of dry air/moist air
+  REAL, DIMENSION(:,:,:), ALLOCATABLE :: XR         ! r*(n)
+  REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSV        ! Sv*(n)
+  REAL, DIMENSION(:,:,:), ALLOCATABLE :: XAER       ! AER*(n) aerosol extinction
+
+  REAL, DIMENSION(:), ALLOCATABLE :: XIWV ! integrated water vpour(n)
+  REAL, DIMENSION(:), ALLOCATABLE :: XZTD ! GPS zenith tropo delay(n)
+  REAL, DIMENSION(:), ALLOCATABLE :: XZWD ! GPS zenith wet delay(n)
+  REAL, DIMENSION(:), ALLOCATABLE :: XZHD ! GPS zenith hydro delay(n)
+
+  REAL, DIMENSION(:,:), ALLOCATABLE :: XTKE_DISS ! TKE dissipation rate
+END TYPE
+
+END MODULE MODD_TYPE_STATPROF
diff --git a/src/MNH/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90
index 7a18e45152de412d236f0f35c820cabb92b3d311..04fb8c93082582f410f4467304335cd822649bdb 100644
--- a/src/MNH/mode_aero_psd.f90
+++ b/src/MNH/mode_aero_psd.f90
@@ -1,19 +1,14 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ########################
 MODULE MODE_AERO_PSD
 !!   ########################
 !!
 !! MODULE DUST PSD (Particle Size Distribution)
-!! Purpose: Contains subroutines to convert from transported variables (ppp)
+!! Purpose: Contains subroutines to convert from transported variables (ppv)
 !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n}
 
 USE MODD_CH_AEROSOL
@@ -32,7 +27,7 @@ CONTAINS
 ! 
 !    ############################################################
   SUBROUTINE PPP2AERO(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !O [-] standard deviation of aerosol distribution
        , PRG3D                      & !O [um] number median diameter of aerosol distribution
@@ -46,7 +41,7 @@ CONTAINS
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -558,7 +553,7 @@ END SUBROUTINE CON2MIX
 
 !   ############################################################
   SUBROUTINE AERO2PPP(             &
-       PSVT                         & !IO [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !IO [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !I [-] standard deviation of aerosol distribution
        , PRG3D                      & !I [um] number median diameter of aerosol distribution
@@ -569,7 +564,7 @@ END SUBROUTINE CON2MIX
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the aerosol Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppp 
+!!    Translate the aerosol Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppv 
 !!
 !!    REFERENCE
 !!    ---------
@@ -758,7 +753,7 @@ ZCTOTA(:,:,:,:,:) = 0.
  ZM(:,:,:,6) = ZM(:,:,:,4)*(PRG3D(:,:,:,2)**6) * &
                EXP(18 *(LOG(PSIG3D(:,:,:,2)))**2)
 
-!*       6    return to ppp
+!*       6    return to ppv
 !
 PSVT(:,:,:,JP_CH_M0i) = ZM(:,:,:,1) * 1E-6 
 PSVT(:,:,:,JP_CH_M0j) = ZM(:,:,:,4) * 1E-6
@@ -776,7 +771,7 @@ END SUBROUTINE AERO2PPP
 !
 !    ############################################################
   SUBROUTINE PPP2AERO1D(            &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PMI                        & !O molecular weight
        , PSIG1D                     & !O [-] standard deviation of aerosol distribution
@@ -790,7 +785,7 @@ END SUBROUTINE AERO2PPP
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
diff --git a/src/MNH/mode_blowsnow_psd.f90 b/src/MNH/mode_blowsnow_psd.f90
index 71298e3319a0ac8cb37f974c727c40f38bc9b7a2..6e741809b34581a3a0f766a3c85094f92e8dbe0a 100644
--- a/src/MNH/mode_blowsnow_psd.f90
+++ b/src/MNH/mode_blowsnow_psd.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2018-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.
@@ -32,7 +32,7 @@ CONTAINS
 !
 !!   ############################################################
   SUBROUTINE PPP2SNOW(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PBET3D                     & !O [m] scale parameter of snow distribution
        , PRG3D                      & !O [um] mean radius of snow  distribution
@@ -72,7 +72,7 @@ CONTAINS
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:,:,:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:,:),  OPTIONAL, INTENT(OUT)     :: PBET3D   !O [-] scale parameter
diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index fc9f68267d6cca9e7d770dc7b3cfd86ba067ad52..fdcde8e7e56e367458a9b73c81964b27f81499d7 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2018-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.
@@ -7,6 +7,8 @@
 !  P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard)
 !  P. Wautelet 19/04/2019: use modd_precision kinds
 !  P. Wautelet 20/07/2021: modify DATETIME_TIME2REFERENCE and DATETIME_DISTANCE to allow correct computation with 32-bit floats
+!  P. Wautelet 27/10/2022: add +, -, <= and > operators and improve older comparison subroutines (more robust but slower)
+!  P. Wautelet 05/01/2023: fix: DATETIME_DISTANCE: need 64 bits integers computation for very distant dates
 !-----------------------------------------------------------------
 MODULE MODE_DATETIME
 !
@@ -19,8 +21,13 @@ IMPLICIT NONE
 PRIVATE
 !
 PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
+PUBLIC :: TPREFERENCE_DATE
 PUBLIC :: OPERATOR(<)
+PUBLIC :: OPERATOR(<=)
+PUBLIC :: OPERATOR(>)
 PUBLIC :: OPERATOR(>=)
+PUBLIC :: OPERATOR(+)
+PUBLIC :: OPERATOR(-)
 !
 !Reference date (do not change it)
 !To work with DATETIME_TIME2REFERENCE, we assume the year is a multiple of 400 + 1 and the date is January 1st (and time=0.)
@@ -30,10 +37,26 @@ INTERFACE OPERATOR(<)
   MODULE PROCEDURE DATETIME_LT
 END INTERFACE
 !
+INTERFACE OPERATOR(<=)
+  MODULE PROCEDURE DATETIME_LE
+END INTERFACE
+!
+INTERFACE OPERATOR(>)
+  MODULE PROCEDURE DATETIME_GT
+END INTERFACE
+!
 INTERFACE OPERATOR(>=)
   MODULE PROCEDURE DATETIME_GE
 END INTERFACE
 !
+INTERFACE OPERATOR(+)
+  MODULE PROCEDURE DATETIME_TIME_ADD
+END INTERFACE
+!
+INTERFACE OPERATOR(-)
+  MODULE PROCEDURE DATETIME_TIME_SUBSTRACT
+END INTERFACE
+!
 CONTAINS
 !
 SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC )
@@ -119,6 +142,8 @@ SUBROUTINE DATETIME_DISTANCE(TPDATEBEG,TPDATEEND,PDIST)
 !
 !Compute distance (in seconds) between 2 dates
 !
+use modd_precision, only: MNHINT64
+!
 TYPE(DATE_TIME), INTENT(IN)  :: TPDATEBEG
 TYPE(DATE_TIME), INTENT(IN)  :: TPDATEEND
 REAL,            INTENT(OUT) :: PDIST
@@ -136,11 +161,11 @@ IF ( ZSECEND < ZSECBEG ) THEN
   IF ( ZSECEND < ZSECBEG ) CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DATETIME_DISTANCE', 'unexpected: ZSECEND is too small' )
 END IF
 !
-PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (24*60*60) ) + ZSECEND - ZSECBEG
+PDIST = REAL( INT( IDAYSEND - IDAYSBEG, KIND=MNHINT64 ) * 24*60*60 ) + ZSECEND - ZSECBEG
 !
 END SUBROUTINE DATETIME_DISTANCE
 !
-SUBROUTINE DATETIME_CORRECTDATE(TPDATE)
+PURE SUBROUTINE DATETIME_CORRECTDATE(TPDATE)
 !
 ! Correct the date if not in the correct interval
 ! Change the date if time is <0 or >=86400 s
@@ -232,7 +257,7 @@ TPDATE%xtime  = ZSEC
 END SUBROUTINE DATETIME_CORRECTDATE
 !
 !
-SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT)
+PURE SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT)
 !
 INTEGER, INTENT(IN)  :: KYEAR
 INTEGER, INTENT(IN)  :: KMONTH
@@ -254,16 +279,23 @@ SELECT CASE(KMONTH)
 END SELECT
 !
 END SUBROUTINE DATETIME_GETMONTHLGT
-!
-!
+
+
 FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
-IMPLICIT NONE
-LOGICAL :: OLT
-TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
 !
 ! TRUE if TPT1 .LT. TPT2
 !
-!
+IMPLICIT NONE
+
+TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+
+LOGICAL :: OLT
+
+INTEGER :: IDAYS1, IDAYS2
+REAL    :: ZSEC1, ZSEC2
+
+#if 0
+!Simpler but works only for correct dates (see DATETIME_CORRECTDATE)
 IF ( TPT1%nyear .EQ. TPT2%nyear ) THEN
   IF ( TPT1%nmonth .EQ. TPT2%nmonth ) THEN
     IF ( TPT1%nday .EQ. TPT2%nday ) THEN
@@ -277,19 +309,125 @@ IF ( TPT1%nyear .EQ. TPT2%nyear ) THEN
 ELSE
   OLT = TPT1%nyear .LT. TPT2%nyear
 ENDIF
-!
+#else
+CALL DATETIME_TIME2REFERENCE( TPT1, IDAYS1, ZSEC1 )
+CALL DATETIME_TIME2REFERENCE( TPT2, IDAYS2, ZSEC2 )
+
+OLT = .FALSE.
+
+IF ( IDAYS1 < IDAYS2 ) THEN
+  OLT = .TRUE.
+ELSE IF ( IDAYS1 == IDAYS2 ) THEN
+  IF ( ZSEC1 < ZSEC2 ) OLT = .TRUE.
+END IF
+#endif
+
 END FUNCTION DATETIME_LT
+
+
+FUNCTION DATETIME_LE(TPT1, TPT2) RESULT (OLE)
 !
+! TRUE if TPT1 <= TPT2
 !
-FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT)
 IMPLICIT NONE
-LOGICAL :: OLT
+
 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+
+LOGICAL :: OLE
+
+INTEGER :: IDAYS1, IDAYS2
+REAL    :: ZSEC1, ZSEC2
+
+#if 0
+!Simpler but works only for correct dates (see DATETIME_CORRECTDATE)
+IF ( TPT1%nyear == TPT2%nyear ) THEN
+  IF ( TPT1%nmonth == TPT2%nmonth ) THEN
+    IF ( TPT1%nday == TPT2%nday ) THEN
+      OLE = TPT1%xtime <= TPT2%xtime
+    ELSE
+      OLE = TPT1%nday <= TPT2%nday
+    END IF
+  ELSE
+   OLE = TPT1%nmonth <= TPT2%nmonth
+  END IF
+ELSE
+  OLE = TPT1%nyear <= TPT2%nyear
+ENDIF
+#else
+CALL DATETIME_TIME2REFERENCE( TPT1, IDAYS1, ZSEC1 )
+CALL DATETIME_TIME2REFERENCE( TPT2, IDAYS2, ZSEC2 )
+
+OLE = .FALSE.
+
+IF ( IDAYS1 < IDAYS2 ) THEN
+  OLE = .TRUE.
+ELSE IF ( IDAYS1 == IDAYS2 ) THEN
+  IF ( ZSEC1 <= ZSEC2 ) OLE = .TRUE.
+END IF
+#endif
 !
-! TRUE if TPT1 .GE. TPT2
+END FUNCTION DATETIME_LE
+
+
+FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OGE)
 !
-OLT = .NOT.DATETIME_LT(TPT1,TPT2)
+! TRUE if TPT1 >=. TPT2
 !
+IMPLICIT NONE
+
+TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+
+LOGICAL :: OGE
+
+OGE = .NOT. DATETIME_LT( TPT1, TPT2 )
+
 END FUNCTION DATETIME_GE
+
+
+FUNCTION DATETIME_GT(TPT1, TPT2) RESULT (OGT)
+!
+! TRUE if TPT1 > TPT2
 !
+IMPLICIT NONE
+
+TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+
+LOGICAL :: OGT
+
+OGT = .NOT. DATETIME_LE( TPT1, TPT2 )
+
+END FUNCTION DATETIME_GT
+
+
+FUNCTION DATETIME_TIME_ADD( TPIN, PTIME ) RESULT ( TPOUT )
+
+IMPLICIT NONE
+
+TYPE(DATE_TIME), INTENT(IN) :: TPIN  ! Start date
+REAL,            INTENT(IN) :: PTIME ! Added time
+TYPE(DATE_TIME) :: TPOUT             ! End date = start date + added time
+
+TPOUT = TPIN
+TPOUT%XTIME = TPOUT%XTIME + PTIME
+
+CALL DATETIME_CORRECTDATE( TPOUT )
+
+END FUNCTION DATETIME_TIME_ADD
+
+
+FUNCTION DATETIME_TIME_SUBSTRACT( TPT1, TPT2 ) RESULT( PDIST )
+!
+!Compute distance (in seconds) between 2 dates
+!
+
+IMPLICIT NONE
+
+TYPE(DATE_TIME), INTENT(IN)  :: TPT1
+TYPE(DATE_TIME), INTENT(IN)  :: TPT2
+REAL                         :: PDIST
+
+CALL DATETIME_DISTANCE( TPT2, TPT1, PDIST )
+
+END FUNCTION  DATETIME_TIME_SUBSTRACT
+
 END MODULE MODE_DATETIME
diff --git a/src/MNH/mode_dust_psd.f90 b/src/MNH/mode_dust_psd.f90
index 016abf4f5c41b1bdd3d86c030a9dfecfbdda06df..dc34447c25f9559fa5e5ec4ec9f2a6d0c8c634b1 100644
--- a/src/MNH/mode_dust_psd.f90
+++ b/src/MNH/mode_dust_psd.f90
@@ -1,12 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ########################
      MODULE MODE_DUST_PSD
 !!   ########################
@@ -14,7 +10,7 @@
 !!    PURPOSE
 !!    -------
 !! MODULE DUST PSD (Particle Size Distribution)
-!! Purpose: Contains subroutines to convert from transported variables (ppp)
+!! Purpose: Contains subroutines to convert from transported variables (ppv)
 !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n}
 !!
 !!    AUTHOR
@@ -45,7 +41,7 @@ CONTAINS
 !
 !!   ############################################################
   SUBROUTINE PPP2DUST(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !O [-] standard deviation of aerosol distribution
        , PRG3D                      & !O [um] number median diameter of aerosol distribution
@@ -58,7 +54,7 @@ CONTAINS
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -92,7 +88,7 @@ CONTAINS
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:,:,:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:,:,:),  OPTIONAL, INTENT(OUT)     :: PSIG3D   !O [-] standard deviation
@@ -326,7 +322,7 @@ END SUBROUTINE PPP2DUST
 
 !!   ############################################################
   SUBROUTINE DUST2PPP(             &
-       PSVT                         & !IO [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !IO [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !I [-] standard deviation of aerosol distribution
        , PRG3D                      & !I [um] number median diameter of aerosol distribution
@@ -336,7 +332,7 @@ END SUBROUTINE PPP2DUST
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the dust Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppp 
+!!    Translate the dust Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppv 
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
 !!    -------
@@ -542,7 +538,7 @@ DEALLOCATE(NM0)
 END SUBROUTINE DUST2PPP
 !!   ############################################################
   SUBROUTINE PPP2DUST1D(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG1D                     & !O [-] standard deviation of aerosol distribution
        , PRG1D                      & !O [um] number median diameter of aerosol distribution
@@ -555,7 +551,7 @@ END SUBROUTINE DUST2PPP
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -589,7 +585,7 @@ END SUBROUTINE DUST2PPP
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:),  OPTIONAL, INTENT(OUT)     :: PSIG1D   !O [-] standard deviation
diff --git a/src/MNH/mode_gridproj.f90 b/src/MNH/mode_gridproj.f90
index d907e68015248c67d0c3c1bcbc229c7a3cf6d1c5..77aa0c961c815d7cc8e082a74b88199309b001d6 100644
--- a/src/MNH/mode_gridproj.f90
+++ b/src/MNH/mode_gridproj.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -71,11 +71,11 @@ CONTAINS
 !*                1.  ROUTINE  SM_GRIDPROJ   
 !                     --------------------
 !-------------------------------------------------------------------------------
-!      ####################################################################
-       SUBROUTINE SM_GRIDPROJ(PXHAT,PYHAT,PZHAT,PZS,                  &
-                              OSLEVE,PLEN1,PLEN2,PZSMT,PLATOR,PLONOR, &
-                              PMAP,PLAT,PLON,PDXHAT,PDYHAT,PZZ,PJ     )
-!      ####################################################################
+!      ######################################################################
+       SUBROUTINE SM_GRIDPROJ( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZS,    &
+                               OSLEVE, PLEN1, PLEN2, PZSMT, PLATOR, PLONOR, &
+                               PMAP, PLAT, PLON, PDXHAT, PDYHAT, PZZ, PJ    )
+!      ######################################################################
 !
 !!*****  *SM_GRIDPROJ * - Computes Jacobian J, map factor M,
 !!    horizontal grid-meshes, latitude and longitude  at the 
@@ -199,8 +199,8 @@ IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
 !
-REAL, DIMENSION(:),      INTENT(IN) :: PXHAT,PYHAT,PZHAT ! Positions x,y,z in 
-                                                         ! the cartesian plane
+REAL, DIMENSION(:),      INTENT(IN) :: PXHAT,PYHAT,PZHAT ! Positions x,y,z in the cartesian plane
+REAL, DIMENSION(:),      INTENT(IN) :: PXHATM, PYHATM    ! Positions x,y,z in the cartesian plane at mass points
 REAL, DIMENSION(:,:),    INTENT(IN) :: PZS               ! Orography
 LOGICAL,                INTENT(IN)  :: OSLEVE            ! flag for SLEVE coordinate
 REAL,                   INTENT(IN)  :: PLEN1             ! Decay scale for smooth topography
@@ -332,21 +332,13 @@ END IF
 !*       4.   COMPUTE ZXHAT AND ZYHAT AT MASS POINTS
 !              -------------------------------------
 !
-ZXHATM(:,:) = 0.
-ZYHATM(:,:) = 0.
-ZXHATM(1:IIU-1,1) = .5*(PXHAT(1:IIU-1)+PXHAT(2:IIU))
-ZXHATM(IIU,1)     = 2.*PXHAT(IIU)-ZXHATM(IIU-1,1)
-ZXHATM(:,2:IJU)   = SPREAD(ZXHATM(:,1),2,IJU-1)
+ZXHATM(:,:) = SPREAD( PXHATM(:), 2 , IJU )
+ZYHATM(:,:) = SPREAD( PYHATM(:), 1 , IIU )
 ! cancel MPPDB_CHECK if cprog=='SPAWN  '
-IF(CPROGRAM/='SPAWN ')&
-CALL MPPDB_CHECK2D(ZXHATM,"GRIDPROJ:ZXHATM",PRECISION)
-!
-ZYHATM(1,1:IJU-1) = .5*(PYHAT(1:IJU-1)+PYHAT(2:IJU))
-ZYHATM(1,IJU)     = 2.*PYHAT(IJU)-ZYHATM(1,IJU-1)
-ZYHATM(2:IIU,:)   = SPREAD(ZYHATM(1,:),1,IIU-1)
-! cancel MPPDB_CHECK if cprog=='SPAWN  '
-IF(CPROGRAM/='SPAWN ')&
-CALL MPPDB_CHECK2D(ZYHATM,"GRIDPROJ:ZYHATM",PRECISION)
+IF( CPROGRAM /= 'SPAWN ') THEN
+  CALL MPPDB_CHECK2D(ZXHATM,"GRIDPROJ:ZXHATM",PRECISION)
+  CALL MPPDB_CHECK2D(ZYHATM,"GRIDPROJ:ZYHATM",PRECISION)
+END IF
 ! ZXHATM and ZXHATM have to be updated
 CALL ADD2DFIELD_ll( TZHALO_ll, ZXHATM, 'SM_GRIDPROJ::ZXHATM' )
 CALL ADD2DFIELD_ll( TZHALO_ll, ZYHATM, 'SM_GRIDPROJ::ZYHATM' )
diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index 7d8d698722653f0bb5255fcbe99e88a33992bf0e..8f848f4e91734d56a56461c4660af25ef0cc73ba 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.f90
@@ -9,7 +9,7 @@
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 20/09/2019: rewrite normalization of LES budgets
 !  P. Wautelet 14/08/2020: deduplicate LES_DIACHRO* subroutines
-!  P. Wautelet    10/2020: restructure subroutines to use tfield_metadata_base type
+!  P. Wautelet    10/2020: restructure subroutines to use tfieldmetadata_base type
 !  P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro)
 !  P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro
 !  P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals)
@@ -631,18 +631,18 @@ end function Les_time_avg_1pt
 subroutine Les_diachro_1D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, odonorm, pfield )
 !##############################################################################################
 
-use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, tfield_metadata_base
+use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, tfieldmetadata_base
 use modd_io,    only: tfiledata
 
 type(tfiledata),                       intent(in) :: tpdiafile  ! File to write
-type(tfield_metadata_base),            intent(in) :: tpfield    ! Metadata of field
+type(tfieldmetadata_base),             intent(in) :: tpfield    ! Metadata of field
 character(len=*),                      intent(in) :: hgroup     ! Group of the field
 character(len=*),                      intent(in) :: hgroupcomment
 logical,                               intent(in) :: odoavg     ! Compute and store time average
 logical,                               intent(in) :: odonorm    ! Compute and store normalized field
 real,                    dimension(:), intent(in) :: pfield     ! Data array
 
-type(tfield_metadata_base) :: tzfield
+type(tfieldmetadata_base) :: tzfield
 
 tzfield = tpfield
 
@@ -676,18 +676,18 @@ subroutine Les_diachro_2D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od
 !##############################################################################################
 
 use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, &
-                      tfield_metadata_base
+                      tfieldmetadata_base
 use modd_io,    only: tfiledata
 
 type(tfiledata),                         intent(in) :: tpdiafile  ! File to write
-type(tfield_metadata_base),              intent(in) :: tpfield    ! Metadata of field
+type(tfieldmetadata_base),               intent(in) :: tpfield    ! Metadata of field
 character(len=*),                        intent(in) :: hgroup     ! Group of the field
 character(len=*),                        intent(in) :: hgroupcomment
 logical,                                 intent(in) :: odoavg     ! Compute and store time average
 logical,                                 intent(in) :: odonorm    ! Compute and store normalized field
 real,                    dimension(:,:), intent(in) :: pfield     ! Data array
 
-type(tfield_metadata_base) :: tzfield
+type(tfieldmetadata_base) :: tzfield
 
 tzfield = tpfield
 
@@ -733,11 +733,11 @@ subroutine Les_diachro_3D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od
 
 use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_MASK, NMNHDIM_BUDGET_LES_SV, &
                       NMNHDIM_BUDGET_LES_TIME,  NMNHDIM_BUDGET_TERM,     NMNHDIM_UNUSED,        &
-                      tfield_metadata_base
+                      tfieldmetadata_base
 use modd_io,    only: tfiledata
 
 type(tfiledata),                           intent(in) :: tpdiafile  ! File to write
-type(tfield_metadata_base),                intent(in) :: tpfield    ! Metadata of field
+type(tfieldmetadata_base),                 intent(in) :: tpfield    ! Metadata of field
 character(len=*),                          intent(in) :: hgroup     ! Group of the field
 character(len=*),                          intent(in) :: hgroupcomment
 logical,                                   intent(in) :: odoavg     ! Compute and store time average
@@ -747,7 +747,7 @@ character(len=*),        dimension(:),     optional, intent(in) :: hfieldnames
 character(len=*),        dimension(:),     optional, intent(in) :: hfieldcomments
 character(len=*),        dimension(:),     optional, intent(in) :: hmasks
 
-type(tfield_metadata_base) :: tzfield
+type(tfieldmetadata_base) :: tzfield
 
 tzfield = tpfield
 
@@ -831,11 +831,11 @@ subroutine Les_diachro_4D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od
 
 use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_MASK, NMNHDIM_BUDGET_LES_PDF,  NMNHDIM_BUDGET_LES_SV, &
                       NMNHDIM_BUDGET_LES_TIME,  NMNHDIM_BUDGET_TERM,     NMNHDIM_UNUSED,                                 &
-                      tfield_metadata_base
+                      tfieldmetadata_base
 use modd_io,    only: tfiledata
 
 type(tfiledata),                             intent(in) :: tpdiafile  ! File to write
-type(tfield_metadata_base),                  intent(in) :: tpfield ! Metadata of field
+type(tfieldmetadata_base),                   intent(in) :: tpfield ! Metadata of field
 character(len=*),                            intent(in) :: hgroup     ! Group of the field
 character(len=*),                            intent(in) :: hgroupcomment
 logical,                                     intent(in) :: odoavg     ! Compute and store time average
@@ -845,7 +845,7 @@ character(len=*),        dimension(:),     optional, intent(in) :: hfieldnames
 character(len=*),        dimension(:),     optional, intent(in) :: hfieldcomments
 character(len=*),        dimension(:),     optional, intent(in) :: hmasks
 
-type(tfield_metadata_base) :: tzfield
+type(tfieldmetadata_base) :: tzfield
 
 tzfield = tpfield
 
@@ -935,7 +935,7 @@ subroutine Les_diachro_common( tpdiafile, tpfield, hgroup, hgroupcomment, pfield
                                hfieldnames, hfieldcomments, hmasks )
 !###################################################################################################
 
-use modd_field,         only: tfield_metadata_base
+use modd_field,         only: tfieldmetadata_base
 use modd_io,            only: tfiledata
 use modd_les,           only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, &
                               nles_levels, xles_current_z
@@ -944,25 +944,25 @@ use modd_type_date,     only: date_time
 
 implicit none
 
-type(tfiledata),                                          intent(in) :: tpdiafile ! File to write
-type(tfield_metadata_base),                               intent(in) :: tpfield
-character(len=*),                                         intent(in) :: hgroup    ! Group of the field
-character(len=*),                                         intent(in) :: hgroupcomment
-real,                       dimension(:,:,:,:),           intent(in) :: pfield    ! Data array
-logical,                                                  intent(in) :: odoavg    ! Compute and store time average
-logical,                                                  intent(in) :: odonorm   ! Compute and store normalized field
-character(len=*),           dimension(:),       optional, intent(in) :: hfieldnames
-character(len=*),           dimension(:),       optional, intent(in) :: hfieldcomments
-character(len=*),           dimension(:),       optional, intent(in) :: hmasks
-
-character(len=100),         dimension(:),     allocatable :: ycomment                      ! Comment string
-character(len=100),         dimension(:),     allocatable :: ytitle                        ! Title
-integer                                                   :: iles_k                        ! Number of vertical levels
-integer                                                   :: iil, iih, ijl, ijh, ikl, ikh  ! Cartesian area relatively to the
-                                                                                           ! entire domain
-integer                                                   :: jp                            ! Process loop counter
-real,                       dimension(:,:,:), allocatable :: ztrajz                        ! x and y are not used for LES
-type(tfield_metadata_base), dimension(:),     allocatable :: tzfields
+type(tfiledata),                                         intent(in) :: tpdiafile ! File to write
+type(tfieldmetadata_base),                               intent(in) :: tpfield
+character(len=*),                                        intent(in) :: hgroup    ! Group of the field
+character(len=*),                                        intent(in) :: hgroupcomment
+real,                      dimension(:,:,:,:),           intent(in) :: pfield    ! Data array
+logical,                                                 intent(in) :: odoavg    ! Compute and store time average
+logical,                                                 intent(in) :: odonorm   ! Compute and store normalized field
+character(len=*),          dimension(:),       optional, intent(in) :: hfieldnames
+character(len=*),          dimension(:),       optional, intent(in) :: hfieldcomments
+character(len=*),          dimension(:),       optional, intent(in) :: hmasks
+
+character(len=100),        dimension(:),     allocatable :: ycomment                      ! Comment string
+character(len=100),        dimension(:),     allocatable :: ytitle                        ! Title
+integer                                                  :: iles_k                        ! Number of vertical levels
+integer                                                  :: iil, iih, ijl, ijh, ikl, ikh  ! Cartesian area relatively to the
+                                                                                          ! entire domain
+integer                                                  :: jp                            ! Process loop counter
+real,                      dimension(:,:,:), allocatable :: ztrajz                        ! x and y are not used for LES
+type(tfieldmetadata_base), dimension(:),     allocatable :: tzfields
 !------------------------------------------------------------------------------
 
 iles_k = Size( pfield, 1 )
@@ -1215,7 +1215,7 @@ subroutine Les_diachro_2pt( tpdiafile, tpfieldx, tpfieldy, pfieldx, pfieldy )
 !
 !
 use modd_conf,       only: l2d
-use modd_field,      only: tfield_metadata_base
+use modd_field,      only: tfieldmetadata_base
 use modd_io,         only: tfiledata
 use modd_les,        only: xles_temp_mean_start, xles_temp_mean_end
 use modd_parameters, only: XUNDEF
@@ -1226,8 +1226,8 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 type(tfiledata),                    intent(in) :: tpdiafile! file to write
-type(tfield_metadata_base),         intent(in) :: tpfieldx ! Metadata of field pfieldx
-type(tfield_metadata_base),         intent(in) :: tpfieldy ! Metadata of field pfieldy
+type(tfieldmetadata_base),          intent(in) :: tpfieldx ! Metadata of field pfieldx
+type(tfieldmetadata_base),          intent(in) :: tpfieldy ! Metadata of field pfieldy
 real,             dimension(:,:,:), intent(in) :: pfieldx
 real,             dimension(:,:,:), intent(in) :: pfieldy
 !-------------------------------------------------------------------------------
@@ -1250,7 +1250,7 @@ subroutine Les_diachro_2pt_1d_intern( tpdiafile, tpfield, gavg, pfield )
 
 use modd_field,         only: NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, &
                               NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ,                     &
-                              NMNHMAXDIMS, tfield_metadata_base
+                              NMNHMAXDIMS, tfieldmetadata_base
 use modd_io,            only: tfiledata
 use modd_les,           only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, &
                               nles_current_times, nspectra_k, xles_current_domegax, xles_current_domegay
@@ -1259,7 +1259,7 @@ use modd_type_date,     only: date_time
 use mode_write_diachro, only: Write_diachro
 
 type(tfiledata),                    intent(in) :: tpdiafile! file to write
-type(tfield_metadata_base),         intent(in) :: tpfield ! Metadata of field pfield
+type(tfieldmetadata_base),          intent(in) :: tpfield ! Metadata of field pfield
 logical,                            intent(in) :: gavg
 real,             dimension(:,:,:), intent(in) :: pfield
 
@@ -1274,7 +1274,7 @@ integer                                              :: jk       ! level counter
 real,            dimension(:,:,:,:,:,:), allocatable :: zwork6 ! contains physical field
 type(date_time), dimension(:),           allocatable :: tzdates
 type(tbudiachrometadata)                             :: tzbudiachro
-type(tfield_metadata_base)                           :: tzfield
+type(tfieldmetadata_base)                            :: tzfield
 
 !*      1.0  Initialization of diachro variables for LES (z,t) profiles
 !            ----------------------------------------------------------
@@ -1423,14 +1423,14 @@ subroutine Les_diachro_spec( tpdiafile, tpfieldx, tpfieldy, pspectrax, pspectray
 !
 !
 use modd_conf,  only: l2d
-use modd_field, only: tfield_metadata_base
+use modd_field, only: tfieldmetadata_base
 use modd_io,    only: tfiledata
 
 implicit none
 
 type(tfiledata),                      intent(in) :: tpdiafile! file to write
-type(tfield_metadata_base),           intent(in) :: tpfieldx ! metadata of field pfieldx
-type(tfield_metadata_base),           intent(in) :: tpfieldy ! metadata of field pfieldy
+type(tfieldmetadata_base),            intent(in) :: tpfieldx ! metadata of field pfieldx
+type(tfieldmetadata_base),            intent(in) :: tpfieldy ! metadata of field pfieldy
 real,             dimension(:,:,:,:), intent(in) :: pspectrax! spectra in x
 real,             dimension(:,:,:,:), intent(in) :: pspectray! and y directions
 
@@ -1446,7 +1446,7 @@ subroutine Les_diachro_spec_1D_intern( tpdiafile, tpfield, pspectra )
 
 use modd_field,         only: NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, &
                               NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ,                     &
-                              NMNHMAXDIMS, tfield_metadata_base
+                              NMNHMAXDIMS, tfieldmetadata_base
 use modd_io,            only: tfiledata
 use modd_les,           only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, &
                               nles_current_times, nspectra_k, &
@@ -1459,7 +1459,7 @@ use mode_write_diachro, only: Write_diachro
 implicit none
 
 type(tfiledata),             intent(in) :: tpdiafile ! file to write
-type(tfield_metadata_base),  intent(in) :: tpfield   ! metadata of field pfield
+type(tfieldmetadata_base),   intent(in) :: tpfield   ! metadata of field pfield
 real, dimension(:,:,:,:),    intent(in) :: pspectra
 
 character(len=10)                                    :: ygroup   ! group title
@@ -1473,7 +1473,7 @@ integer                                              :: jk       ! level counter
 real,            dimension(:,:,:,:,:,:), allocatable :: zwork6   ! physical field
 type(date_time), dimension(:),           allocatable :: tzdates
 type(tbudiachrometadata)                             :: tzbudiachro
-type(tfield_metadata_base)                           :: tzfield
+type(tfieldmetadata_base)                            :: tzfield
 !
 !*      1.0  Initialization of diachro variables for LES (z,t) profiles
 !            ----------------------------------------------------------
diff --git a/src/MNH/mode_salt_psd.f90 b/src/MNH/mode_salt_psd.f90
index 1a4a9e799d5a6928e53e50f988b2f2f540cd86ad..28da713be516a68e6cd1ad11ac99517eec98e245 100644
--- a/src/MNH/mode_salt_psd.f90
+++ b/src/MNH/mode_salt_psd.f90
@@ -1,12 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
 !!   ########################
      MODULE MODE_SALT_PSD
 !!   ########################
@@ -14,7 +10,7 @@
 !!    PURPOSE
 !!    -------
 !! MODULE SALT PSD (Particle Size Distribution)
-!! Purpose: Contains subroutines to convert from transported variables (ppp)
+!! Purpose: Contains subroutines to convert from transported variables (ppv)
 !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n}
 !!
 !!    AUTHOR
@@ -50,7 +46,7 @@ CONTAINS
 !
 !!   ############################################################
   SUBROUTINE PPP2SALT(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !O [-] standard deviation of aerosol distribution
        , PRG3D                      & !O [um] number median diameter of aerosol distribution
@@ -63,7 +59,7 @@ CONTAINS
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -97,7 +93,7 @@ CONTAINS
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:,:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:,:,:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:,:,:),  OPTIONAL, INTENT(OUT)     :: PSIG3D   !O [-] standard deviation
@@ -340,7 +336,7 @@ END SUBROUTINE PPP2SALT
 
 !!   ############################################################
   SUBROUTINE SALT2PPP(             &
-       PSVT                         & !IO [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !IO [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !I [-] standard deviation of aerosol distribution
        , PRG3D                      & !I [um] number median diameter of aerosol distribution
@@ -350,7 +346,7 @@ END SUBROUTINE PPP2SALT
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the sea salt Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppp 
+!!    Translate the sea salt Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppv 
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
 !!    -------
@@ -552,7 +548,7 @@ END SUBROUTINE SALT2PPP
 !
 !!   ############################################################
   SUBROUTINE PPP2SALT1D(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG1D                     & !O [-] standard deviation of aerosol distribution
        , PRG1D                      & !O [um] number median diameter of aerosol distribution
@@ -565,7 +561,7 @@ END SUBROUTINE SALT2PPP
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -599,7 +595,7 @@ END SUBROUTINE SALT2PPP
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:),  OPTIONAL, INTENT(OUT)     :: PSIG1D   !O [-] standard deviation
diff --git a/src/MNH/mode_salt_psd_wet.f90 b/src/MNH/mode_salt_psd_wet.f90
index cb5af52f838a83cd4997f9fad234eb1919262d24..2a679f193c5bfdfcf2dcb68761e89d2cbbf014e3 100644
--- a/src/MNH/mode_salt_psd_wet.f90
+++ b/src/MNH/mode_salt_psd_wet.f90
@@ -1,12 +1,8 @@
-!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/mode_salt_psd.f90,v $ $Revision: 1.1.2.1.2.1.2.1.2.1 $ $Date: 2013/07/12 13:55:08 $
-!-----------------------------------------------------------------
 !!   ########################
      MODULE MODE_SALT_PSD_WET
 !!   ########################
@@ -14,7 +10,7 @@
 !!    PURPOSE
 !!    -------
 !! MODULE SALT PSD (Particle Size Distribution)
-!! Purpose: Contains subroutines to convert from transported variables (ppp)
+!! Purpose: Contains subroutines to convert from transported variables (ppv)
 !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n}
 !!
 !!    AUTHOR
@@ -56,7 +52,7 @@ CONTAINS
 !
 !!   ############################################################
   SUBROUTINE PPP2SALT_WET(          &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PPABST                     & !I Pression
        , PTHT                       & !I Potential temperature
@@ -73,7 +69,7 @@ CONTAINS
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !!    
 !!    Calcul the wet radius of the particles, using RH and Gerber (1985) relation
@@ -111,7 +107,7 @@ CONTAINS
 !
 !*      0.1    declarations of arguments
 !
-REAL, DIMENSION(:,:,:,:),           INTENT(INOUT) :: PSVT      !I [ppp] first moment
+REAL, DIMENSION(:,:,:,:),           INTENT(INOUT) :: PSVT      !I [ppv] first moment
 REAL, DIMENSION(:,:,:),             INTENT(IN)    :: PRHODREF  !I [kg/m3] density of air
 REAL, DIMENSION(:,:,:),             INTENT(IN)    :: PPABST    !I Pression
 REAL, DIMENSION(:,:,:),             INTENT(IN)    :: PTHT      !I Potential temperature
@@ -432,7 +428,7 @@ END SUBROUTINE PPP2SALT_WET
 
 !!   ############################################################
   SUBROUTINE SALT2PPP(             &
-       PSVT                         & !IO [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !IO [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG3D                     & !I [-] standard deviation of aerosol distribution
        , PRG3D                      & !I [um] number median diameter of aerosol distribution
@@ -442,7 +438,7 @@ END SUBROUTINE PPP2SALT_WET
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the sea salt Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppp 
+!!    Translate the sea salt Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppv 
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
 !!    -------
@@ -645,7 +641,7 @@ END SUBROUTINE SALT2PPP
 !
 !!   ############################################################
   SUBROUTINE PPP2SALT1D(             &
-       PSVT                         & !I [ppp] input scalar variables (moment of distribution)
+       PSVT                         & !I [ppv] input scalar variables (moment of distribution)
        , PRHODREF                   & !I [kg/m3] density of air       
        , PSIG1D                     & !O [-] standard deviation of aerosol distribution
        , PRG1D                      & !O [um] number median diameter of aerosol distribution
@@ -658,7 +654,7 @@ END SUBROUTINE SALT2PPP
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -692,7 +688,7 @@ END SUBROUTINE SALT2PPP
 !
 !*      0.1    declarations of arguments
 !
-REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppp] first moment
+REAL,       DIMENSION(:,:),  INTENT(INOUT)  :: PSVT      !I [ppv] first moment
 REAL,       DIMENSION(:),    INTENT(IN)     :: PRHODREF !I [kg/m3] density of air
 
 REAL,       DIMENSION(:,:),  OPTIONAL, INTENT(OUT)     :: PSIG1D   !O [-] standard deviation
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 3d8010abc27de107c3190cee67a9a330ef5a9e00..3ee78c99f06551d13aa7d2148cab112b21c0a9d5 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.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.
@@ -9,10 +9,15 @@
 !
 INTERFACE
 !
-       SUBROUTINE MODEL_n(KTCOUNT,OEXIT)
+       SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
 !
-INTEGER, INTENT(IN)   :: KTCOUNT  ! temporal loop index of model KMODEL
-LOGICAL, INTENT(INOUT):: OEXIT    ! switch for the end of the temporal loop
+USE MODD_IO,        ONLY: TFILEDATA
+USE MODD_TYPE_DATE, ONLY: DATE_TIME
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
 !
 END SUBROUTINE MODEL_n
 !
@@ -21,7 +26,7 @@ END INTERFACE
 END MODULE MODI_MODEL_n
 
 !     ################################### 
-      SUBROUTINE MODEL_n(KTCOUNT, OEXIT) 
+      SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
 !     ###################################
 !
 !!****  *MODEL_n * -monitor of the model version _n 
@@ -274,6 +279,9 @@ END MODULE MODI_MODEL_n
 !  J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version)
 !  A. Costes      12/2021: add Blaze fire model
 !  C. Barthe   07/04/2022: deallocation of ZSEA
+!  P. Wautelet 08/12/2022: bugfix if no TDADFILE
+!  P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n
+!                          (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n)
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -363,8 +371,10 @@ USE MODD_TIME_n
 USE MODD_TIMEZ
 USE MODD_TURB_CLOUD,     ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI
 USE MODD_TURB_n
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
 USE MODD_VISCOSITY
 !
+USE MODE_AIRCRAFT_BALLOON
 use mode_budget,           only: Budget_store_init, Budget_store_end
 USE MODE_DATETIME
 USE MODE_ELEC_ll
@@ -382,9 +392,11 @@ USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_MSG
 USE MODE_ONE_WAY_n
+USE MODE_WRITE_AIRCRAFT_BALLOON
 use mode_write_les_n,               only: Write_les_n
 use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n
 USE MODE_WRITE_PROFILER_n,          ONLY: WRITE_PROFILER_n
+USE MODE_WRITE_STATION_n,           ONLY: WRITE_STATION_n
 !
 USE MODI_ADDFLUCTUATIONS
 USE MODI_ADVECTION_METSV
@@ -392,7 +404,6 @@ USE MODI_ADVECTION_UVW
 USE MODI_ADVECTION_UVW_CEN
 USE MODI_ADV_FORCING_n
 USE MODI_AER_MONITOR_n
-USE MODI_AIRCRAFT_BALLOON
 USE MODI_BLOWSNOW
 USE MODI_BOUNDARIES
 USE MODI_BUDGET_FLAGS
@@ -447,12 +458,10 @@ USE MODI_TURB_CLOUD_INDEX
 USE MODI_TWO_WAY
 USE MODI_UPDATE_NSV
 USE MODI_VISCOSITY
-USE MODI_WRITE_AIRCRAFT_BALLOON
 USE MODI_WRITE_DESFM_n
 USE MODI_WRITE_DIAG_SURF_ATM_N
 USE MODI_WRITE_LFIFM_n
 USE MODI_WRITE_SERIES_n
-USE MODI_WRITE_STATION_n
 USE MODI_WRITE_SURF_ATM_N
 !
 USE MODD_FIRE
@@ -462,8 +471,10 @@ IMPLICIT NONE
 !
 !
 !
-INTEGER, INTENT(IN)   :: KTCOUNT
-LOGICAL, INTENT(INOUT):: OEXIT
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
 !
 !*       0.2   declarations of local variables
 !
@@ -482,6 +493,7 @@ REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_STEP,ZTIME_STEP_PTS
 CHARACTER                 :: YMI
 INTEGER                   :: IPOINTS
 CHARACTER(len=16)         :: YTCOUNT,YPOINTS
+CHARACTER(LEN=:), ALLOCATABLE :: YDADNAME
 !
 INTEGER :: ISYNCHRO          ! model synchronic index relative to its father
                              ! = 1  for the first time step in phase with DAD
@@ -552,16 +564,16 @@ LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
 LOGICAL :: GCLOUD_ONLY              ! conditionnal radiation computations for
                                 !      the only cloudy columns
 REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER)  :: ZWETDEPAER
-
-
 !
-TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE
+TYPE(TFILEDATA),POINTER :: TZOUTFILE
 ! TYPE(TFILEDATA),SAVE    :: TZDIACFILE
 !-------------------------------------------------------------------------------
 !
-TZBAKFILE=> NULL()
+TPBAKFILE=> NULL()
 TZOUTFILE=> NULL()
 !
+TPDTMODELN = TDTCUR
+!
 !*       0.    MICROPHYSICAL SCHEME
 !              ------------------- 
 SELECT CASE(CCLOUD)
@@ -997,18 +1009,24 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
   IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN
     nfile_backup_current = nfile_backup_current + 1
     !
-    TZBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
-    IVERB    = TZBAKFILE%NLFIVERB
+    TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
+    IVERB    = TPBAKFILE%NLFIVERB
     !
-    CALL IO_File_open(TZBAKFILE)
+    CALL IO_File_open(TPBAKFILE)
     !
-    CALL WRITE_DESFM_n(IMI,TZBAKFILE)
+    CALL WRITE_DESFM_n(IMI,TPBAKFILE)
     CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE )
-    CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME )
-    TOUTDATAFILE => TZBAKFILE
-    CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
+    IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN
+      YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME
+    ELSE
+      ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file
+      YDADNAME = 'DUMMY'
+    END IF
+    CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) )
+    TOUTDATAFILE => TPBAKFILE
+    CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE)
     IF (CSURF=='EXTE') THEN
-      TFILE_SURFEX => TZBAKFILE
+      TFILE_SURFEX => TPBAKFILE
       CALL GOTO_SURFEX(IMI)
       CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.)
       IF ( KTCOUNT > 1) THEN
@@ -1020,10 +1038,10 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
     !
     ! Reinitialize Lagragian variables at every model backup
     IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN
-      CALL INI_LG(XXHAT,XYHAT,XZZ,XSVT,XLBXSVM,XLBYSVM)
+      CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
       IF (IVERB>=5) THEN
         WRITE(UNIT=ILUOUT,FMT=*) '************************************'
-        WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TZBAKFILE%CNAME),' backup'
+        WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup'
         WRITE(UNIT=ILUOUT,FMT=*) '************************************'
       END IF
     END IF
@@ -1034,11 +1052,11 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
 !
   ELSE
     !Necessary to have a 'valid' CNAME when calling some subroutines
-    TZBAKFILE => TFILE_DUMMY
+    TPBAKFILE => TFILE_DUMMY
   END IF
 ELSE
   !Necessary to have a 'valid' CNAME when calling some subroutines
-  TZBAKFILE => TFILE_DUMMY
+  TPBAKFILE => TFILE_DUMMY
 END IF
 !
 IF ( nfile_output_current < NOUT_NUMB ) THEN
@@ -1235,8 +1253,9 @@ IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ)
   XMAP=1.
 ELSE
-  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, &
-                   XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ)
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ      )
 END IF
 !
 IF ( LFORCING ) THEN
@@ -1460,7 +1479,7 @@ XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 &
 !
 ZTIME1 = ZTIME2
 !
-CALL PHYS_PARAM_n( KTCOUNT, TZBAKFILE,                            &
+CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE,                            &
                    XT_RAD,  XT_SHADOWS, XT_DCONV, XT_GROUND,      &
                    XT_MAFL, XT_DRAG, XT_EOL, XT_TURB,  XT_TRACER, &
                    ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY      )
@@ -1640,7 +1659,7 @@ XTIME_LES_BU_PROCESS = 0.
 !
 CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,&
                    &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
- CALL ADVECTION_METSV ( TZBAKFILE, CUVW_ADV_SCHEME,                    &
+ CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME,                    &
                  CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT,      &
                  LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT,                    &
                  CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP,               &
@@ -1742,7 +1761,7 @@ XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCES
 !-------------------------------------------------------------------------------
 !
 IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN
-  CALL TURB_CLOUD_INDEX( XTSTEP, TZBAKFILE,                               &
+  CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE,                               &
                          LTURB_DIAG, NRRI,                                &
                          XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, &
                          XCEI                                             )
@@ -1929,7 +1948,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
     CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                           NSPLITG, IMI, KTCOUNT,                               &
-                          CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM,               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
                           LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP,                &
                           XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
                           ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
@@ -1949,7 +1968,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
   ELSE
     CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                           NSPLITG, IMI, KTCOUNT,                               &
-                          CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM,               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
                           LSUBG_COND,LSIGMAS,CSUBG_AUCV,                       &
                           XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
                           ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
@@ -2151,16 +2170,14 @@ IF (LFLYER) THEN
     ALLOCATE(ZSEA(IIU,IJU))
     ZSEA(:,:) = 0.
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:))
-    CALL AIRCRAFT_BALLOON(XTSTEP,                                             &
-                      XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI,              &
-                      XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD,  &
-                      XRHODREF,XCIT,PSEA=ZSEA(:,:))
+    CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI,                   &
+                           XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, &
+                           XRHODREF, XCIT, PSEA = ZSEA(:,:)                       )
     DEALLOCATE(ZSEA)
   ELSE
-    CALL AIRCRAFT_BALLOON(XTSTEP,                                             &
-                      XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI,              &
-                      XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD,  &
-                      XRHODREF,XCIT)
+    CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI,                   &
+                           XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, &
+                           XRHODREF, XCIT                                         )
   END IF
 END IF
 
@@ -2169,10 +2186,8 @@ END IF
 !*       24.2    STATION (observation diagnostic)
 !               --------------------------------
 !
-IF (LSTATION)                                                            &
-  CALL STATION_n(XTSTEP,                                                 &
-                 XXHAT, XYHAT, XZZ,                                      &
-                 XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST   )
+IF ( LSTATION ) &
+  CALL STATION_n( XZZ, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST )
 !
 !---------------------------------------------------------
 !
@@ -2184,16 +2199,14 @@ IF (LPROFILER)  THEN
     ALLOCATE(ZSEA(IIU,IJU))
     ZSEA(:,:) = 0.
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:))
-    CALL PROFILER_n(XTSTEP,                                              &
-                  XXHAT, XYHAT, XZZ,XRHODREF,                            &
-                  XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
-                  XAER, MAX(XCLDFR,XICEFR), XCIT,PSEA=ZSEA(:,:))
+    CALL PROFILER_n( XZZ, XRHODREF,                             &
+                     XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET,     &
+                     XTSRAD, XPABST, XAER, XCIT, PSEA=ZSEA(:,:) )
     DEALLOCATE(ZSEA)
   ELSE
-    CALL PROFILER_n(XTSTEP,                                              &
-                  XXHAT, XYHAT, XZZ,XRHODREF,                            &
-                  XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
-                  XAER, MAX(XCLDFR,XICEFR), XCIT)
+    CALL PROFILER_n( XZZ, XRHODREF,                         &
+                     XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, &
+                     XTSRAD, XPABST, XAER, XCIT             )
   END IF
 END IF
 !
@@ -2230,15 +2243,6 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
 !
 !-------------------------------------------------------------------------------
 !
-!*       26.    FM FILE CLOSURE
-!               ---------------
-!
-IF ( tzbakfile%lopened ) THEN
-  CALL IO_File_close(TZBAKFILE)
-END IF
-!
-!-------------------------------------------------------------------------------
-!
 !*       27.    CURRENT TIME REFRESH
 !               --------------------
 !
@@ -2270,6 +2274,8 @@ IF (OEXIT) THEN
     CALL MENU_DIACHRO(TDIAFILE,'END')
 #endif
     CALL IO_File_close(TDIAFILE)
+    ! Free memory of flyer that is not present on the master process of the file (was allocated in WRITE_AIRCRAFT_BALLOON)
+    CALL AIRCRAFT_BALLOON_FREE_NONLOCAL( TDIAFILE )
   END IF
   !
   CALL IO_File_close(TINIFILE)
diff --git a/src/MNH/modn_aircrafts.f90 b/src/MNH/modn_aircrafts.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f4309dfc793e1387355328bb6af8844ef64066e1
--- /dev/null
+++ b/src/MNH/modn_aircrafts.f90
@@ -0,0 +1,69 @@
+!MNH_LIC Copyright 2022-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Author: P. Wautelet 19/08/2022
+! Modifications:
+!-----------------------------------------------------------------
+!####################
+MODULE MODN_AIRCRAFTS
+!####################
+!
+! Namelist with the the characteristics of the aircrafts
+!
+USE MODD_AIRCRAFT_BALLOON
+USE MODD_PARAMETERS,       ONLY: NFILENAMELGTMAX
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
+
+IMPLICIT NONE
+
+!Use separated arrays for the different aircraft characteristics
+!Using directly TAIRCRAFTDATA derived types does not work due to compiler bug (GCC at least from 5.5 to 12.1, see GCC bug 106065)
+
+CHARACTER(LEN=3),               DIMENSION(:), ALLOCATABLE :: CMODEL
+INTEGER,                        DIMENSION(:), ALLOCATABLE :: NMODEL
+CHARACTER(LEN=6),               DIMENSION(:), ALLOCATABLE :: CTYPE
+CHARACTER(LEN=10),              DIMENSION(:), ALLOCATABLE :: CTITLE
+TYPE(DATE_TIME),                DIMENSION(:), ALLOCATABLE :: TLAUNCH
+REAL,                           DIMENSION(:), ALLOCATABLE :: XTSTEP
+INTEGER,                        DIMENSION(:), ALLOCATABLE :: NPOS
+LOGICAL,                        DIMENSION(:), ALLOCATABLE :: LALTDEF
+CHARACTER(LEN=NFILENAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CFILE !Names of CSV files with trajectory data
+
+!Do not read CTYPE, value is always forced to 'AIRCRA'
+NAMELIST / NAM_AIRCRAFTS / CFILE, CMODEL, CTITLE, LALTDEF, NMODEL, NPOS, TLAUNCH, XTSTEP
+
+CONTAINS
+
+SUBROUTINE AIRCRAFTS_NML_ALLOCATE( KAIRCRAFTS )
+  INTEGER, INTENT(IN) :: KAIRCRAFTS
+
+  !Note: the default values are used/checked in ini_aircraft => be careful to ensure coherency
+  ALLOCATE( CMODEL (KAIRCRAFTS) ); CMODEL(:)  = 'FIX'
+  ALLOCATE( CTITLE (KAIRCRAFTS) ); CTITLE(:)  = ''
+  ALLOCATE( CTYPE  (KAIRCRAFTS) ); CTYPE(:)   = 'AIRCRA'
+  ALLOCATE( NMODEL (KAIRCRAFTS) ); NMODEL(:)  = 0
+  ALLOCATE( TLAUNCH(KAIRCRAFTS) )
+  ALLOCATE( XTSTEP (KAIRCRAFTS) ); XTSTEP(:)  = XNEGUNDEF
+  ALLOCATE( NPOS   (KAIRCRAFTS) ); NPOS(:)    = 0
+  ALLOCATE( LALTDEF(KAIRCRAFTS) ); LALTDEF(:) = .FALSE.
+  ALLOCATE( CFILE  (KAIRCRAFTS) ); CFILE(:)   = ''
+END SUBROUTINE AIRCRAFTS_NML_ALLOCATE
+
+
+SUBROUTINE AIRCRAFTS_NML_DEALLOCATE( )
+  !Deallocate namelist arrays
+  DEALLOCATE( CMODEL     )
+  DEALLOCATE( CTITLE     )
+  DEALLOCATE( CTYPE      )
+  DEALLOCATE( NMODEL     )
+  DEALLOCATE( TLAUNCH    )
+  DEALLOCATE( XTSTEP     )
+  DEALLOCATE( NPOS       )
+  DEALLOCATE( LALTDEF    )
+  DEALLOCATE( CFILE      )
+END SUBROUTINE AIRCRAFTS_NML_DEALLOCATE
+
+
+END MODULE MODN_AIRCRAFTS
diff --git a/src/MNH/modn_balloons.f90 b/src/MNH/modn_balloons.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f77356c88a006e722ae782e3e8b4330c86238a2a
--- /dev/null
+++ b/src/MNH/modn_balloons.f90
@@ -0,0 +1,93 @@
+!MNH_LIC Copyright 2022-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Author: P. Wautelet 13/07/2022
+! Modifications:
+!-----------------------------------------------------------------
+!###################
+MODULE MODN_BALLOONS
+!###################
+!
+! Namelist with the the characteristics of the balloons
+!
+USE MODD_AIRCRAFT_BALLOON
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
+
+IMPLICIT NONE
+
+!Use separated arrays for the different balloon characteristics
+!Using directly TBALLOONDATA derived types does not work due to compiler bug (GCC at least from 5.5 to 12.1, see GCC bug 106065)
+
+CHARACTER(LEN=3),  DIMENSION(:), ALLOCATABLE :: CMODEL
+INTEGER,           DIMENSION(:), ALLOCATABLE :: NMODEL
+CHARACTER(LEN=6),  DIMENSION(:), ALLOCATABLE :: CTYPE
+CHARACTER(LEN=10), DIMENSION(:), ALLOCATABLE :: CTITLE
+TYPE(DATE_TIME),   DIMENSION(:), ALLOCATABLE :: TLAUNCH
+REAL,              DIMENSION(:), ALLOCATABLE :: XLATLAUNCH
+REAL,              DIMENSION(:), ALLOCATABLE :: XLONLAUNCH
+!Not needed: XXLAUNCH
+!Not needed: XYLAUNCH
+REAL,              DIMENSION(:), ALLOCATABLE :: XALTLAUNCH
+REAL,              DIMENSION(:), ALLOCATABLE :: XTSTEP
+REAL,              DIMENSION(:), ALLOCATABLE :: XWASCENT
+!Not used in NML (computed): REAL,              DIMENSION(:), ALLOCATABLE :: XRHO
+REAL,              DIMENSION(:), ALLOCATABLE :: XPRES
+REAL,              DIMENSION(:), ALLOCATABLE :: XDIAMETER
+REAL,              DIMENSION(:), ALLOCATABLE :: XAERODRAG
+REAL,              DIMENSION(:), ALLOCATABLE :: XINDDRAG
+REAL,              DIMENSION(:), ALLOCATABLE :: XVOLUME
+REAL,              DIMENSION(:), ALLOCATABLE :: XMASS
+
+NAMELIST / NAM_BALLOONS / CMODEL, CTITLE, CTYPE, NMODEL, TLAUNCH,                      &
+                          XLATLAUNCH, XLONLAUNCH, XALTLAUNCH, XTSTEP, XWASCENT, XPRES, &
+                          XDIAMETER, XAERODRAG, XINDDRAG, XVOLUME, XMASS
+
+CONTAINS
+
+SUBROUTINE BALLOONS_NML_ALLOCATE( KBALLOONS )
+  INTEGER, INTENT(IN) :: KBALLOONS
+
+  !Note: the default values are used/checked in ini_balloon => be careful to ensure coherency
+  ALLOCATE( CMODEL (KBALLOONS) ); CMODEL(:)  = 'FIX'
+  ALLOCATE( CTITLE (KBALLOONS) ); CTITLE(:)  = ''
+  ALLOCATE( CTYPE  (KBALLOONS) ); CTYPE(:)   = ''
+  ALLOCATE( NMODEL (KBALLOONS) ); NMODEL(:)  = 0
+  ALLOCATE( TLAUNCH(KBALLOONS) )
+  ALLOCATE( XLATLAUNCH  (KBALLOONS) ); XLATLAUNCH(:) = XUNDEF
+  ALLOCATE( XLONLAUNCH  (KBALLOONS) ); XLONLAUNCH(:) = XUNDEF
+  ALLOCATE( XALTLAUNCH  (KBALLOONS) ); XALTLAUNCH(:) = XNEGUNDEF
+  ALLOCATE( XTSTEP      (KBALLOONS) ); XTSTEP(:)     = XNEGUNDEF
+  ALLOCATE( XWASCENT    (KBALLOONS) ); XWASCENT(:)   = XNEGUNDEF
+  ALLOCATE( XPRES       (KBALLOONS) ); XPRES(:)      = XNEGUNDEF
+  ALLOCATE( XDIAMETER   (KBALLOONS) ); XDIAMETER(:)  = XNEGUNDEF
+  ALLOCATE( XAERODRAG   (KBALLOONS) ); XAERODRAG(:)  = XNEGUNDEF
+  ALLOCATE( XINDDRAG    (KBALLOONS) ); XINDDRAG(:)   = XNEGUNDEF
+  ALLOCATE( XVOLUME     (KBALLOONS) ); XVOLUME(:)    = XNEGUNDEF
+  ALLOCATE( XMASS       (KBALLOONS) ); XMASS(:)      = XNEGUNDEF
+END SUBROUTINE BALLOONS_NML_ALLOCATE
+
+
+SUBROUTINE BALLOONS_NML_DEALLOCATE( )
+  !Deallocate namelist arrays
+  DEALLOCATE( CMODEL     )
+  DEALLOCATE( CTITLE     )
+  DEALLOCATE( CTYPE      )
+  DEALLOCATE( NMODEL     )
+  DEALLOCATE( TLAUNCH    )
+  DEALLOCATE( XLATLAUNCH )
+  DEALLOCATE( XLONLAUNCH )
+  DEALLOCATE( XALTLAUNCH )
+  DEALLOCATE( XTSTEP     )
+  DEALLOCATE( XWASCENT   )
+  DEALLOCATE( XPRES      )
+  DEALLOCATE( XDIAMETER  )
+  DEALLOCATE( XAERODRAG  )
+  DEALLOCATE( XINDDRAG   )
+  DEALLOCATE( XVOLUME    )
+  DEALLOCATE( XMASS      )
+END SUBROUTINE BALLOONS_NML_DEALLOCATE
+
+
+END MODULE MODN_BALLOONS
diff --git a/src/MNH/modn_flyers.f90 b/src/MNH/modn_flyers.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0c8b6e3e2e3fc054affceee3e872dcf618953495
--- /dev/null
+++ b/src/MNH/modn_flyers.f90
@@ -0,0 +1,21 @@
+!MNH_LIC Copyright 2022-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Author: P. Wautelet 13/07/2022
+! Modifications:
+!-----------------------------------------------------------------
+!#################
+MODULE MODN_FLYERS
+!#################
+!
+! Namelist to prepare the aircrafts and balloon namelists (dynamic allocation)
+!
+USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS
+
+IMPLICIT NONE
+
+NAMELIST / NAM_FLYERS / NAIRCRAFTS, NBALLOONS
+
+END MODULE MODN_FLYERS
diff --git a/src/MNH/modn_profilern.f90 b/src/MNH/modn_profilern.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d050fddcf48abb54547f69c42a1180a4321397ee
--- /dev/null
+++ b/src/MNH/modn_profilern.f90
@@ -0,0 +1,91 @@
+!MNH_LIC Copyright 2020-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 MODN_PROFILER_n
+!!    #####################
+!!
+!!*** *MODN_PROFILER*
+!!
+!!    PURPOSE
+!!    -------
+!       Namelist to define the stations 
+!!
+!!**  AUTHOR
+!!    ------
+!!    E. Jézéquel                   *CNRM & IFPEN*
+!
+!!    MODIFICATIONS
+!!    -------------
+!!    Original 10/03/20
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
+!  P. Wautelet  27/07/2022: copied from modn_stationn.f90
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+USE MODD_ALLPROFILER_n, ONLY:&
+        NNUMB_PROF_n    =>NNUMB_PROF    ,&
+        XSTEP_PROF_n    =>XSTEP_PROF    ,&
+        XX_PROF_n       =>XX_PROF       ,&
+        XY_PROF_n       =>XY_PROF       ,&
+        XLAT_PROF_n     =>XLAT_PROF     ,&
+        XLON_PROF_n     =>XLON_PROF     ,&
+        XZ_PROF_n       =>XZ_PROF       ,&
+        CNAME_PROF_n    =>CNAME_PROF    ,&
+        CFILE_PROF_n    =>CFILE_PROF    !,&
+!         LDIAG_SURFRAD_n =>LDIAG_SURFRAD
+USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
+!
+!-----------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!        -----------------
+
+IMPLICIT NONE
+
+INTEGER                          ,SAVE:: NNUMB_PROF
+REAL                             ,SAVE:: XSTEP_PROF
+REAL, DIMENSION(100)             ,SAVE:: XX_PROF, XY_PROF, XZ_PROF, XLAT_PROF, XLON_PROF
+CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_PROF
+CHARACTER (LEN=NFILENAMELGTMAX),                   SAVE:: CFILE_PROF              !filename
+! LOGICAL                          ,SAVE:: LDIAG_SURFRAD
+
+NAMELIST /NAM_PROFILERn/  &
+     NNUMB_PROF, XSTEP_PROF, &
+     XX_PROF,XY_PROF,XZ_PROF,&
+     XLON_PROF,XLAT_PROF,&
+     CNAME_PROF,&
+     CFILE_PROF !,LDIAG_SURFRAD
+     
+!
+CONTAINS
+!
+SUBROUTINE INIT_NAM_PROFILERn
+  NNUMB_PROF   = NNUMB_PROF_n
+  XSTEP_PROF   = XSTEP_PROF_n
+  XX_PROF      = XX_PROF_n
+  XY_PROF      = XY_PROF_n
+  XLAT_PROF    = XLAT_PROF_n
+  XLON_PROF    = XLON_PROF_n
+  XZ_PROF      = XZ_PROF_n
+  CNAME_PROF   = CNAME_PROF_n
+  CFILE_PROF   = CFILE_PROF_n
+!   LDIAG_SURFRAD= LDIAG_SURFRAD_n
+END SUBROUTINE INIT_NAM_PROFILERn
+
+SUBROUTINE UPDATE_NAM_PROFILERn
+  NNUMB_PROF_n   = NNUMB_PROF
+  XSTEP_PROF_n   = XSTEP_PROF
+  XX_PROF_n      = XX_PROF
+  XY_PROF_n      = XY_PROF
+  XLAT_PROF_n    = XLAT_PROF
+  XLON_PROF_n    = XLON_PROF
+  XZ_PROF_n      = XZ_PROF
+  CNAME_PROF_n   = CNAME_PROF
+  CFILE_PROF_n   = CFILE_PROF
+!   LDIAG_SURFRAD_n= LDIAG_SURFRAD
+END SUBROUTINE UPDATE_NAM_PROFILERn
+END MODULE MODN_PROFILER_n
diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90
index f388061e72fd7fc36bf3abc91db723843803f80d..094b3dbb1c5325f2a8264a316a211ad131e7997f 100644
--- a/src/MNH/modn_stationn.f90
+++ b/src/MNH/modn_stationn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2020-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2020-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.
@@ -21,10 +21,10 @@
 !!    MODIFICATIONS
 !!    -------------
 !!    Original 10/03/20
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
-USE MODD_STATION_n
 USE MODD_ALLSTATION_n, ONLY:&
         NNUMB_STAT_n    =>NNUMB_STAT    ,&
         XSTEP_STAT_n    =>XSTEP_STAT    ,&
@@ -34,27 +34,29 @@ USE MODD_ALLSTATION_n, ONLY:&
         XLON_STAT_n     =>XLON_STAT     ,&
         XZ_STAT_n       =>XZ_STAT       ,&
         CNAME_STAT_n    =>CNAME_STAT    ,&
-        CTYPE_STAT_n    =>CTYPE_STAT    ,&
         CFILE_STAT_n    =>CFILE_STAT    ,&
-        LDIAG_SURFRAD_n =>LDIAG_SURFRAD 
-!!
+        LDIAG_SURFRAD_n =>LDIAG_SURFRAD
+USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
+!
 !-----------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !        -----------------
+
 IMPLICIT NONE
+
 INTEGER                          ,SAVE:: NNUMB_STAT
 REAL                             ,SAVE:: XSTEP_STAT
 REAL, DIMENSION(100)             ,SAVE:: XX_STAT, XY_STAT, XZ_STAT, XLAT_STAT, XLON_STAT
-CHARACTER (LEN=7), DIMENSION(100),SAVE:: CNAME_STAT, CTYPE_STAT
-CHARACTER (LEN=20)               ,SAVE:: CFILE_STAT              !filename
+CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT
+CHARACTER (LEN=NFILENAMELGTMAX),                   SAVE:: CFILE_STAT              !filename
 LOGICAL                          ,SAVE:: LDIAG_SURFRAD
 
 NAMELIST /NAM_STATIONn/  &
      NNUMB_STAT, XSTEP_STAT, &
      XX_STAT,XY_STAT,XZ_STAT,&
      XLON_STAT,XLAT_STAT,&
-     CNAME_STAT,CTYPE_STAT,&
+     CNAME_STAT,&
      CFILE_STAT,LDIAG_SURFRAD
      
 !
@@ -69,7 +71,6 @@ SUBROUTINE INIT_NAM_STATIONn
   XLON_STAT    = XLON_STAT_n
   XZ_STAT      = XZ_STAT_n
   CNAME_STAT   = CNAME_STAT_n
-  CTYPE_STAT   = CTYPE_STAT_n
   CFILE_STAT   = CFILE_STAT_n
   LDIAG_SURFRAD= LDIAG_SURFRAD_n
 END SUBROUTINE INIT_NAM_STATIONn
@@ -83,7 +84,6 @@ SUBROUTINE UPDATE_NAM_STATIONn
   XLON_STAT_n    = XLON_STAT
   XZ_STAT_n      = XZ_STAT
   CNAME_STAT_n   = CNAME_STAT
-  CTYPE_STAT_n   = CTYPE_STAT
   CFILE_STAT_n   = CFILE_STAT
   LDIAG_SURFRAD_n= LDIAG_SURFRAD
 END SUBROUTINE UPDATE_NAM_STATIONn
diff --git a/src/MNH/one_wayn.f90 b/src/MNH/one_wayn.f90
index eac7238d63ed4e9ee1b641155964a222bdc1273e..aa78ac7811a3b9a60b93f245969f9da744894efe 100644
--- a/src/MNH/one_wayn.f90
+++ b/src/MNH/one_wayn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-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.
@@ -137,7 +137,9 @@ USE MODD_NSV,            only: NSV_A, NSV_C1R3BEG_A, NSV_C1R3_A, NSV_C2R2BEG_A,
                                NSV_PPBEG_A, NSV_PP_A,                                                                     &
                                NSV_SLTBEG_A, NSV_SLT_A, NSV_USER_A,                                                       &
                                NSV_AERBEG_A, NSV_AER_A, NSV_CSBEG_A, NSV_CS_A
-
+#ifdef MNH_FOREFIRE
+USE MODD_NSV,            only: NSV_FF_A, NSV_FFBEG_A
+#endif
 USE MODD_PARAMETERS,     only: JPHEXT, JPVEXT
 USE MODD_PARAM_n,        only: CCLOUD
 USE MODD_REF,            ONLY: LCOUPLES
diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90
index b3043a864dd8f4d66b9f7bae9e3d5d3ded8f1a1a..af5da06658860e8f4f327f6f0e2052e4821546ce 100644
--- a/src/MNH/paspol.f90
+++ b/src/MNH/paspol.f90
@@ -69,7 +69,7 @@ END MODULE MODI_PASPOL
 USE MODD_PARAMETERS
 USE MODD_NSV
 USE MODD_CST
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO, ONLY: TFILEDATA
 USE MODE_GRIDPROJ
 USE MODD_PASPOL
@@ -141,10 +141,10 @@ REAL    :: ZP, ZTH, ZT, ZRHO, ZMASAIR
 !INTEGER                    :: J4PTI,J4PTJ,J9PTI,J9PTJ
 !
 REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZRHOM  ! 
-REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPO, ZSVT ! Work arrays
+REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZSVT ! Work arrays
 !
-TYPE(DATE_TIME)   :: TZDATE1,TZDATE2,TZDATE3,TZDATE4,TZDATE
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(DATE_TIME)      :: TZDATE1,TZDATE2,TZDATE3,TZDATE4,TZDATE
+TYPE(TFIELDMetaDATA) :: TZFIELD
 !
 !
 !--------------------------------------------------------------------------------------
@@ -579,27 +579,23 @@ END DO
 !*	3.4 Ecriture conditionnelle.
 !
 IF ( tpfile%lopened ) THEN
-  ALLOCATE( ZTEMPO(IIU,IJU,IKU) )
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = 'generic for paspol', & !Temporary name to ease identification
+    CSTDNAME   = '',                   &
+    CUNITS     = 'm-3',                &
+    CDIR       = 'XY',                 &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
   !
   DO JSV=1,NSV_PP
-    ZTEMPO(:,:,:)=XATC(:,:,:,JSV)
-    !
     WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
     TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
     WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
     !
-    CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPO)
+    CALL IO_Field_write(TPFILE,TZFIELD,XATC(:,:,:,JSV))
   END DO
-  !
-  DEALLOCATE(ZTEMPO)
 ENDIF
 !
 DEALLOCATE(ZRHOM, ZSVT)
diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90
index c01f484c51e41dbe8029d077e254174719206c58..e94400bedbdec4ccb3e551a056dcb944ed15e1f5 100644
--- a/src/MNH/phys_paramn.f90
+++ b/src/MNH/phys_paramn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -237,13 +237,15 @@ END MODULE MODI_PHYS_PARAM_n
 !  C. Lac         11/2019: correction in the drag formula and application to building in addition to tree
 !  F. Auguste     02/2021: add IBM
 !  JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case
+!  P. Wautelet 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed
 !  A. Costes      12/2021: add Blaze fire model
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
-USE MODD_ADV_n,       ONLY : XRTKEMS
+USE MODD_ADV_n,            ONLY : XRTKEMS
+USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODD_BLOWSNOW,    ONLY : LBLOWSNOW,XRSNOW
 USE MODD_BUDGET,      ONLY: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
@@ -807,9 +809,9 @@ CALL SUNPOS_n   ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL )
 !
   ZTIME1 = ZTIME2
 !
-  CALL SURF_RAD_MODIF (XMAP, XXHAT, XYHAT,                 &
-                  ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, &
-                  XDIRFLASWD, XDIRSRFSWD                   )
+  CALL SURF_RAD_MODIF (XMAP, XDXHAT, XDYHAT, XXHATM, XYHATM, &
+                  ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY,   &
+                  XDIRFLASWD, XDIRSRFSWD                     )
 !
 !* Azimuthal angle to be sent later to surface processes
 !  Defined in radian, clockwise, from North
@@ -1510,25 +1512,25 @@ IF ( CTURB == 'TKEL' ) THEN
   END IF
 !
 !
-IF(ALLOCATED(XTHW_FLUX))  THEN
- DEALLOCATE(XTHW_FLUX)
- ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+IF ( ALLOCATED( XTHW_FLUX ) ) DEALLOCATE( XTHW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XTHW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) )
 ELSE
- ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+  ALLOCATE( XTHW_FLUX(0, 0, 0) )
 END IF
 
-IF(ALLOCATED(XRCW_FLUX))  THEN
- DEALLOCATE(XRCW_FLUX)
- ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+IF ( ALLOCATED( XRCW_FLUX ) ) DEALLOCATE( XRCW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XRCW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) )
 ELSE
- ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+  ALLOCATE( XRCW_FLUX(0, 0, 0) )
 END IF
-!
-IF(ALLOCATED(XSVW_FLUX))  THEN
- DEALLOCATE(XSVW_FLUX)
- ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4)))
+
+IF ( ALLOCATED( XSVW_FLUX ) ) DEALLOCATE( XSVW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XSVW_FLUX(SIZE( XSVT, 1 ), SIZE( XSVT, 2 ), SIZE( XSVT, 3 ), SIZE( XSVT, 4 )) )
 ELSE
- ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4)))
+  ALLOCATE( XSVW_FLUX(0, 0, 0, 0) )
 END IF
 !
 GCOMPUTE_SRC=SIZE(XSIGS, 3)/=0
diff --git a/src/MNH/position_tools.f90 b/src/MNH/position_tools.f90
new file mode 100644
index 0000000000000000000000000000000000000000..2fb03e7d5ce4366b0d794f72ddfd0a1b163cd085
--- /dev/null
+++ b/src/MNH/position_tools.f90
@@ -0,0 +1,230 @@
+!MNH_LIC Copyright 2022-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Author:
+!  P. Wautelet 25/11/2022
+! Modifications:
+!-----------------------------------------------------------------
+!      ###################
+MODULE MODE_POSITION_TOOLS
+!      ###################
+
+USE MODE_MSG
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: FIND_PROCESS_AND_MODEL_FROM_XY_POS
+
+CONTAINS
+
+!----------------------------------------------------------------------------
+SUBROUTINE FIND_PROCESS_FROM_XY_POS( PX, PY, TPMODEL, KRANK, GINSIDE )
+  ! Find the rank of the process with the given position
+  USE MODD_FIELD,        ONLY: TFIELDLIST
+  USE MODD_IO,           ONLY: ISNPROC
+  USE MODD_PARAMETERS,   ONLY: NNEGUNDEF
+  USE MODD_STRUCTURE_ll, ONLY: PROCONF_ll
+
+  USE MODE_FIELD, ONLY: FIND_FIELD_ID_FROM_MNHNAME
+
+  IMPLICIT NONE
+
+  REAL,             INTENT(IN)  :: PX
+  REAL,             INTENT(IN)  :: PY
+  TYPE(PROCONF_ll), INTENT(IN)  :: TPMODEL
+  INTEGER,          INTENT(OUT) :: KRANK
+  LOGICAL,          INTENT(OUT) :: GINSIDE
+
+  INTEGER :: IID
+  INTEGER :: IRESP
+  INTEGER :: IXPOS
+  INTEGER :: IYPOS
+  INTEGER :: JP
+  REAL, DIMENSION(:), POINTER :: ZXHAT_ll
+  REAL, DIMENSION(:), POINTER :: ZYHAT_ll
+
+  GINSIDE = .FALSE.
+  KRANK = NNEGUNDEF
+
+  ZXHAT_ll => NULL()
+  ZYHAT_ll => NULL()
+
+  call Find_field_id_from_mnhname( 'XHAT_ll', iid, iresp )
+  ZXHAT_ll => tfieldlist(iid)%tfield_x1d(TPMODEL%NUMBER)%data
+  call Find_field_id_from_mnhname( 'YHAT_ll', iid, iresp )
+  ZYHAT_ll => tfieldlist(iid)%tfield_x1d(TPMODEL%NUMBER)%data
+
+  IXPOS = COUNT( ZXHAT_ll(:) <= PX )
+  IYPOS = COUNT( ZYHAT_ll(:) <= PY )
+
+  DO JP = 1, ISNPROC
+    IF (       IXPOS >= TPMODEL%TSPLITS_B(JP)%NXORP .AND. IXPOS <= TPMODEL%TSPLITS_B(JP)%NXENDP &
+         .AND. IYPOS >= TPMODEL%TSPLITS_B(JP)%NYORP .AND. IYPOS <= TPMODEL%TSPLITS_B(JP)%NYENDP ) THEN
+      GINSIDE = .TRUE.
+      KRANK = JP
+      EXIT
+    END IF
+  END DO
+
+END SUBROUTINE FIND_PROCESS_FROM_XY_POS
+!----------------------------------------------------------------------------
+
+!----------------------------------------------------------------------------
+SUBROUTINE FIND_PROCESS_AND_MODEL_FROM_XY_POS( PX, PY, KRANK, KMODEL )
+  ! Find the rank of the process with the given position
+  ! on the most refined model (except if model number is forced)
+
+  USE MODD_IO,           ONLY: ISNPROC
+  USE MODD_PARAMETERS,   ONLY: NNEGUNDEF
+  USE MODD_STRUCTURE_ll, ONLY: PROCONF_ll
+  USE MODD_VAR_ll,       ONLY: TCRRT_PROCONF
+
+  IMPLICIT NONE
+
+  REAL,    INTENT(IN)    :: PX
+  REAL,    INTENT(IN)    :: PY
+  INTEGER, INTENT(OUT)   :: KRANK  ! If < 1, position is outside domain(s)
+  INTEGER, INTENT(INOUT) :: KMODEL ! If > 0 at entry, model is fixed, else it is set by subroutine
+
+  CHARACTER(LEN=3) :: YMODEL
+  LOGICAL          :: GFOUND
+  LOGICAL          :: OINSIDE
+  TYPE(PROCONF_ll), POINTER :: TZMODEL
+
+  KRANK = NNEGUNDEF
+
+  TZMODEL => TCRRT_PROCONF
+
+  ! Go back to the root model
+  DO WHILE( ASSOCIATED( TZMODEL%TPARENT ) )
+    TZMODEL => TZMODEL%TPARENT
+  END DO
+
+  IF ( KMODEL > 0 ) THEN
+    ! Find the configuration corresponding to KMODEL
+    ! based on GO_TOMODEL_ll
+
+    ! Find the model configuration
+    CALL FIND_MODEL( TZMODEL, KMODEL, GFOUND )
+
+    IF ( .NOT. GFOUND ) THEN
+      WRITE( YMODEL, '( I3 )' ) KMODEL
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'FIND_PROCESS_AND_MODEL_FROM_XY_POS', 'model ' // YMODEL // ' not found' )
+    END IF
+
+    ! Find the rank of the process where the position is
+    CALL FIND_PROCESS_FROM_XY_POS( PX, PY, TZMODEL, KRANK, OINSIDE )
+  ELSE
+    ! Model number is not fixed => find the finer model corresponding to the position
+    CALL FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TZMODEL, KMODEL, KRANK, OINSIDE )
+  END IF
+
+END SUBROUTINE FIND_PROCESS_AND_MODEL_FROM_XY_POS
+!----------------------------------------------------------------------------
+
+
+!----------------------------------------------------------------------------
+RECURSIVE SUBROUTINE FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TPMODEL, KMODEL, KRANK, OINSIDE )
+  USE MODD_PARAMETERS,   ONLY: NNEGUNDEF
+  USE MODD_STRUCTURE_ll, ONLY: LPROCONF_ll, PROCONF_ll
+
+  IMPLICIT NONE
+
+  REAL,                      INTENT(IN)    :: PX
+  REAL,                      INTENT(IN)    :: PY
+  TYPE(PROCONF_ll), POINTER, INTENT(INOUT) :: TPMODEL
+  INTEGER,                   INTENT(INOUT) :: KMODEL
+  INTEGER,                   INTENT(OUT)   :: KRANK
+  LOGICAL,                   INTENT(OUT)   :: OINSIDE
+
+  INTEGER :: IRANK
+  LOGICAL :: GINSIDE
+  TYPE(PROCONF_ll),  POINTER :: TZCHILD
+  TYPE(LPROCONF_ll), POINTER :: TZMODELS
+
+  IRANK = NNEGUNDEF
+  GINSIDE = .FALSE.
+
+  CALL FIND_PROCESS_FROM_XY_POS( PX, PY, TPMODEL, IRANK, GINSIDE )
+  IF ( GINSIDE ) THEN
+    KMODEL = TPMODEL%NUMBER
+    KRANK = IRANK
+  END IF
+  OINSIDE = GINSIDE
+
+  IF ( .NOT. GINSIDE ) RETURN
+
+  !If the coordinates are inside the current model, look at its children
+  TZMODELS => TPMODEL%TCHILDREN
+  DO WHILE(ASSOCIATED(TZMODELS))
+    TZCHILD => TZMODELS%TELT
+
+    CALL FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TZCHILD, KMODEL, IRANK, GINSIDE )
+
+    IF ( .NOT. GINSIDE ) THEN
+      TZMODELS => TZMODELS%TNEXT
+    ELSE
+      TPMODEL => TZCHILD
+      KMODEL = TPMODEL%NUMBER
+      KRANK = IRANK
+      OINSIDE = GINSIDE
+      RETURN
+    END IF
+  END DO
+
+END SUBROUTINE FIND_FINER_MODEL_WITH_XY_POS
+!----------------------------------------------------------------------------
+
+
+!----------------------------------------------------------------------------
+RECURSIVE SUBROUTINE FIND_MODEL( TPMODEL, KMODEL, OFOUND )
+  USE MODD_STRUCTURE_ll, ONLY: LPROCONF_ll, PROCONF_ll
+
+  IMPLICIT NONE
+
+  TYPE(PROCONF_ll), POINTER, INTENT(INOUT) :: TPMODEL
+  INTEGER,                   INTENT(IN)    :: KMODEL
+  LOGICAL,                   INTENT(OUT)   :: OFOUND
+
+  TYPE(PROCONF_ll),  POINTER :: TZCHILD
+  TYPE(LPROCONF_ll), POINTER :: TZMODELS
+
+  OFOUND = .FALSE.
+
+  ! Is the current model the searched one?
+  IF (TPMODEL%NUMBER == KMODEL) THEN
+    OFOUND = .TRUE.
+    RETURN
+  ENDIF
+
+  ! no => explore all the children model of the current model
+  TZMODELS => TPMODEL%TCHILDREN
+  DO WHILE(ASSOCIATED(TZMODELS))
+
+    IF (TZMODELS%TELT%NUMBER == KMODEL) THEN
+      OFOUND = .TRUE.
+      TPMODEL => TZMODELS%TELT
+      RETURN
+    END IF
+
+    TZCHILD => TZMODELS%TELT
+
+    CALL FIND_MODEL( TZCHILD, KMODEL, OFOUND )
+
+    IF ( .NOT. OFOUND ) THEN
+      TZMODELS => TZMODELS%TNEXT
+    ELSE
+      TPMODEL => TZCHILD
+      RETURN
+    END IF
+
+  END DO
+
+END SUBROUTINE FIND_MODEL
+!----------------------------------------------------------------------------
+
+END MODULE MODE_POSITION_TOOLS
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index ea749bd3cb1fbef2221e006a78929c3aa9675aa7..e83f7580a28ffb1e4a643493dbd323c6e28a870a 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -1,4 +1,4 @@
-!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.
@@ -381,6 +381,7 @@ USE MODE_ll
 USE MODE_MODELN_HANDLER
 use mode_field,            only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars
 USE MODE_MSG
+USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
 !
 USE MODI_DEFAULT_DESFM_n    ! Interface modules
 USE MODI_DEFAULT_EXPRE
@@ -556,7 +557,6 @@ INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
 INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
 INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
 INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY
-REAL, DIMENSION(:),   ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,&
                                       ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, &
@@ -719,7 +719,7 @@ IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE)
 CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT)
 IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF )
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 CALL INI_FIELD_SCALARS()
 ! Sea salt
@@ -1248,7 +1248,8 @@ ELSE
 ! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations
 !------------------------------------------------------------------------
 !
-  ALLOCATE(XXHAT(NIU),XYHAT(NJU))
+  ALLOCATE( XXHAT(NIU),  XYHAT(NJU)  )
+  ALLOCATE( XXHATM(NIU), XYHATM(NJU) )
 !
 ! define the grid localization at the earth surface by the central point
 ! coordinates
@@ -1261,14 +1262,10 @@ ELSE
 ! conformal coordinates (0,0). This is to allow the centering of the model in
 ! a non-cyclic  configuration regarding to XLATCEN or XLONCEN.
 !
-      ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT))
-      ZXHAT_ll=0.
-      ZYHAT_ll=0.
       CALL SM_LATLON(XLATCEN,XLONCEN,                     &
                        -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT),  &
                        -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT),  &
                        XLATORI,XLONORI)
-        DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
 !
       WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, &
                           ' XLONORI= ', XLONORI
@@ -1292,6 +1289,13 @@ ELSE
     XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /)
     XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /)
   END IF
+
+  ! Interpolations of positions to mass points
+  CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
+
+  ! Collect global domain boundaries
+  CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
+
 END IF
 !
 !*       5.1.2  Orography and Gal-Chen Sommerville transformation :
@@ -1434,8 +1438,9 @@ IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ)
   XMAP=1.
 ELSE
-  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, &
-                   XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,XJ)
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, XJ      )
 END IF
 !*       5.4.1  metrics coefficients and update halos:
 !
@@ -1458,12 +1463,9 @@ IF (CTYPELOC =='LATLON' ) THEN
   END IF 
 END IF  
 !
-ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !//
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !//
 IF (CTYPELOC /= 'IJGRID') THEN                                               
-  NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:)))
-  NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:)))
+  NILOC = MINLOC(ABS(XXHATLOC-XXHAT_ll(:)))
+  NJLOC = MINLOC(ABS(XYHATLOC-XYHAT_ll(:)))
 END IF
 !
 IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN
@@ -1489,7 +1491,7 @@ IF (CIDEAL == 'RSOU') THEN
   WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE'
   CALL POSKEY(NLUPRE,NLUOUT,'RSOU')
   READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
-  TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME)
+  TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME)
   TDTEXP = TDTCUR
   TDTSEG = TDTCUR
   TDTMOD = TDTCUR
@@ -1508,7 +1510,7 @@ ELSE IF (CIDEAL == 'CSTN') THEN
   WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE'
   CALL POSKEY(NLUPRE,NLUOUT,'CSTN')
   READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
-  TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME)
+  TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME)
   TDTEXP = TDTCUR
   TDTSEG = TDTCUR
   TDTMOD = TDTCUR
@@ -1559,10 +1561,10 @@ CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
 !
 !*       5.4.2  3D reference state :
 !
-CALL SET_REF(0,TFILE_DUMMY,                        &
-             XZZ,XZHAT,XJ,XDXX,XDYY,CLBCX,CLBCY,   &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,       &
-             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ)
+CALL SET_REF( 0, TFILE_DUMMY,                            &
+              XZZ, XZHATM, XJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
 !
 !
 !*       5.5.1  Absolute pressure :
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index 80b493fbcd6bcd3d097efeb2ccc6380bbe6bef6e..e894cd407d2d529ae44e19b2e4145dc68dfa2580 100644
--- a/src/MNH/prep_nest_pgd.f90
+++ b/src/MNH/prep_nest_pgd.f90
@@ -199,7 +199,7 @@ CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
 !*       3.    READING OF THE GRIDS
 !              --------------------
 !
-CALL INI_FIELD_LIST(NMODEL)
+CALL INI_FIELD_LIST()
 !
 CALL SET_DAD0_ll()
 DO JPGD=1,NMODEL
diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90
index 046ddde7822141fefa4743338cfcb32469bca981..2df254d5ec8aab95ee4ad9713ccf8e65fc7f4af4 100644
--- a/src/MNH/prep_pgd.f90
+++ b/src/MNH/prep_pgd.f90
@@ -217,7 +217,7 @@ CALL SURFEX_ALLOC_LIST(1)
 YSURF_CUR => YSURF_LIST(1)
 CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 CALL GOTO_MODEL(1)
 CALL GOTO_SURFEX(1)
diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90
index a13872ff80c2eec2e81a2a89a9d84f17eb31ce5b..9424fbb3549ab46d6df213c8b3d00c9dbe5fd09e 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -678,7 +678,7 @@ IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF)
 CALL POSNAM(IPRE_REAL1,'NAM_PARAM_LIMA',GFOUND,ILUOUT0)
 IF (GFOUND) READ(IPRE_REAL1,NAM_PARAM_LIMA)
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 CALL INI_FIELD_SCALARS()
 !
@@ -928,9 +928,9 @@ IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ)
   XMAP=1.
 ELSE
-  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,                    &
-                   LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, &
-                   XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ       )
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ      )
 END IF
 !
 CALL MPPDB_CHECK2D(XZS,"prep_real_case8:XZS",PRECISION)
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index 68ec7b3a8779d70d45f174ab868a07192b9dc4c5..547f5b1bc96757a740126f0b8ba53b4ab623cbdd 100644
--- a/src/MNH/prep_surfex.f90
+++ b/src/MNH/prep_surfex.f90
@@ -131,7 +131,7 @@ CALL IO_File_close(TZPRE_REAL1FILE)
 !
 !*       4.2   reading of values of some configuration variables in namelist
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 CALL INI_FIELD_SCALARS()
 !
diff --git a/src/MNH/pressure_in_prep.f90 b/src/MNH/pressure_in_prep.f90
index 6219e352f27f06e8a418d8073fdd8aed4031802d..e5d004e09378e6d12cd12d1fe1db3f6aea8e3d53 100644
--- a/src/MNH/pressure_in_prep.f90
+++ b/src/MNH/pressure_in_prep.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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.
@@ -11,11 +11,11 @@ INTERFACE
 !
       SUBROUTINE PRESSURE_IN_PREP(PDXX,PDYY,PDZX,PDZY,PDZZ)
 !
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz  
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDXX     ! metric coefficient dxx
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDYY     ! metric coefficient dyy 
+REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZX     ! metric coefficient dzx 
+REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZY     ! metric coefficient dzy 
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDZZ     ! metric coefficient dzz  
 !
 END SUBROUTINE PRESSURE_IN_PREP
 !
@@ -97,11 +97,11 @@ IMPLICIT NONE
 !*       0.1   Declaration of dummy arguments
 !              ------------------------------
 !
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy 
-REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz  
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDXX     ! metric coefficient dxx
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDYY     ! metric coefficient dyy 
+REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZX     ! metric coefficient dzx 
+REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZY     ! metric coefficient dzy 
+REAL,DIMENSION(:,:,:), INTENT(IN)    :: PDZZ     ! metric coefficient dzz  
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
diff --git a/src/MNH/pressurez.f90 b/src/MNH/pressurez.f90
index 1f597f1046fe54250debe75b86c1098f011be758..320351512acff82a0abd13499b91e94cb11c600a 100644
--- a/src/MNH/pressurez.f90
+++ b/src/MNH/pressurez.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.
@@ -39,7 +39,8 @@ REAL, INTENT(IN)    :: PRELAX                    ! relaxation coefficient for
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ     ! density of reference state
                                                  ! * J
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients
 !
 REAL, INTENT(IN) :: PDXHATM                     ! mean grid increment in the x
                                                 ! direction
@@ -281,7 +282,8 @@ REAL, INTENT(IN)    :: PRELAX                    ! relaxation coefficient for
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ     ! density of reference state
                                                  ! * J
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients
 !
 REAL, INTENT(IN) :: PDXHATM                     ! mean grid increment in the x
                                                 ! direction
diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index 1e307b9eaa5f86571552630438a476abab2cc7c7..0b8083a90ca0eccec04eb651ff5b41b7b3d77f83 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -9,29 +9,24 @@ MODULE MODI_PROFILER_n
 !
 INTERFACE
 !
-      SUBROUTINE PROFILER_n(PTSTEP,                               &
-                            PXHAT, PYHAT, PZ,PRHODREF,            &
-                            PU, PV, PW, PTH, PR, PSV, PTKE,       &
-                            PTS, PP, PAER, PCLDFR, PCIT, PSEA)
+      SUBROUTINE PROFILER_n( PZ, PRHODREF,                   &
+                             PU, PV, PW, PTH, PR, PSV, PTKE, &
+                             PTS, PP, PAER, PCIT, PSEA )
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF                            
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PAER   ! aerosol extinction
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCLDFR ! cloud fraction
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT   ! ice concentration
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar 
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar
 !
 !-------------------------------------------------------------------------------
 !
@@ -41,11 +36,10 @@ END INTERFACE
 !
 END MODULE MODI_PROFILER_n
 !
-!  ########################################################
-      SUBROUTINE PROFILER_n(PTSTEP,                               &
-                            PXHAT, PYHAT, PZ,PRHODREF,            &
-                            PU, PV, PW, PTH, PR, PSV, PTKE,       &
-                            PTS, PP, PAER, PCLDFR, PCIT, PSEA)
+!     ########################################################
+      SUBROUTINE PROFILER_n( PZ, PRHODREF,                   &
+                             PU, PV, PW, PTH, PR, PSV, PTKE, &
+                             PTS, PP, PAER, PCIT, PSEA )
 !     ########################################################
 !
 !
@@ -88,56 +82,52 @@ END MODULE MODI_PROFILER_n
 !  P. Wautelet 09/02/2022: add message when some variables not computed
 !                          + bugfix: put values in variables in this case
 !                          + move some operations outside a do loop
+!  P. Wautelet    04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs
 ! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CONF
-USE MODD_CST
+USE MODD_CST,              ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT
 USE MODD_DIAG_IN_RUN
-USE MODD_GRID
-USE MODD_SUB_PROFILER_n
-USE MODD_NSV
-USE MODD_PARAMETERS
-USE MODD_PARAM_n,        ONLY: CCLOUD, CRAD, CSURF
+USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
+USE MODD_NSV,              ONLY: NSV_C2R2, NSV_C2R2BEG, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR
+USE MODD_PARAMETERS,       ONLY: JPVEXT, XUNDEF
+USE MODD_PARAM_ICE,        ONLY: LSNOW_T_I => LSNOW_T
+USE MODD_PARAM_LIMA,       ONLY: LSNOW_T_L => LSNOW_T,                                                       &
+                                 XALPHAR_L => XALPHAR, XNUR_L => XNUR, XALPHAS_L => XALPHAS, XNUS_L => XNUS, &
+                                 XALPHAG_L => XALPHAG, XNUG_L => XNUG, XALPHAI_L => XALPHAI, XNUI_L => XNUI, &
+                                 XRTMIN_L => XRTMIN, XALPHAC_L => XALPHAC, XNUC_L => XNUC
+USE MODD_PARAM_LIMA_COLD,  ONLY: XDI_L => XDI, XLBEXI_L => XLBEXI, XLBI_L => XLBI, XAI_L => XAI, XBI_L => XBI, XC_I_L => XC_I, &
+                                 XLBEXS_L => XLBEXS, XLBS_L => XLBS, XCCS_L => XCCS,                                           &
+                                 XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS, XLBDAS_MAX, XLBDAS_MIN, XNS_L => XNS
+USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L => XDG, XLBEXG_L => XLBEXG, XLBG_L => XLBG, XCCG_L => XCCG, &
+                                 XAG_L => XAG, XBG_L => XBG, XCXG_L => XCXG, XCG_L => XCG
+USE MODD_PARAM_LIMA_WARM,  ONLY: XLBEXR_L => XLBEXR, XLBR_L => XLBR, XBR_L => XBR, XAR_L => XAR, &
+                                 XBC_L => XBC, XAC_L => XAC
+USE MODD_PARAM_n,          ONLY: CCLOUD, CRAD, CSURF
 USE MODD_PROFILER_n
-USE MODD_TIME,           only: tdtexp
-USE MODD_TIME_n,         only: tdtcur
-!
-USE MODE_ll
+USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I => XLBEXR,                                 &
+                                 XLBR_I => XLBR, XCCR_I => XCCR, XBR_I => XBR, XAR_I => XAR,                               &
+                                 XALPHAC_I => XALPHAC, XNUC_I => XNUC,                                                     &
+                                 XLBC_I => XLBC, XBC_I => XBC, XAC_I => XAC,                                               &
+                                 XALPHAC2_I => XALPHAC2, XNUC2_I => XNUC2,                                                 &
+                                 XALPHAS_I => XALPHAS, XNUS_I => XNUS, XLBEXS_I => XLBEXS,                                 &
+                                 XLBS_I => XLBS, XCCS_I => XCCS, XAS_I => XAS, XBS_I => XBS, XCXS_I => XCXS,               &
+                                 XALPHAG_I => XALPHAG, XNUG_I => XNUG, XDG_I => XDG, XLBEXG_I => XLBEXG,                   &
+                                 XLBG_I => XLBG, XCCG_I => XCCG, XAG_I => XAG, XBG_I => XBG, XCXG_I => XCXG, XCG_I => XCG, &
+                                 XALPHAI_I => XALPHAI, XNUI_I => XNUI, XDI_I => XDI, XLBEXI_I => XLBEXI,                   &
+                                 XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI, XC_I_I => XC_I,                               &
+                                 XNS_I => XNS, XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA
+!
+USE MODE_FGAU,             ONLY: GAULAG
+USE MODE_FSCATTER,         ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG
 USE MODE_MSG
+USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_3D, &
+                                 STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V
 !
 USE MODI_GPS_ZENITH_GRID
-USE MODI_LIDAR
-USE MODI_RADAR_RAIN_ICE
 USE MODI_WATER_SUM
-USE MODE_FGAU,             ONLY : GAULAG
-USE MODE_FSCATTER,         ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG
-USE MODD_PARAM_LIMA,       ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,&
-                                 XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,&
-                                 XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC, LSNOW_T_L=>LSNOW_T
-USE MODD_PARAM_LIMA_COLD,  ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,&
-                                 XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XNS_L=>XNS,&
-                                 XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,        &
-                                 XLBDAS_MIN,XLBDAS_MAX
-USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,&
-                                 XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG
-USE MODD_PARAM_LIMA_WARM,  ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,&
-                                 XBC_L=>XBC,XAC_L=>XAC
-USE MODD_PARAM_ICE,        ONLY: LSNOW_T_I=>LSNOW_T
-USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,&
-                                 XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,&
-                                 XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,&
-                                 XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,&
-                                 XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,&
-                                 XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,&
-                                 XLBS_I=>XLBS,XCCS_I=>XCCS,XNS_I=>XNS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,&
-                                 XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,&
-                                 XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,&
-                                 XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,&
-                                 XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,&
-                                 XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA
 !
 !
 IMPLICIT NONE
@@ -146,52 +136,40 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF                            
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
 REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PAER   ! aerosol extinction
-REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCLDFR ! cloud fraction
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT   ! ice concentration
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar 
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar
 !
 !-------------------------------------------------------------------------------
 !
 !       0.2  declaration of local variables
 !
 !
-INTEGER :: IIB        ! current processor domain sizes
-INTEGER :: IJB
+INTEGER, PARAMETER :: JPTS_GAULAG = 9 ! number of points for Gauss-Laguerre quadrature
+!
 INTEGER :: IKB
-INTEGER :: IIE
-INTEGER :: IJE
 INTEGER :: IKE
-INTEGER :: IIU
-INTEGER :: IJU
 INTEGER :: IKU
 !
 !
-REAL, DIMENSION(SIZE(PXHAT))        :: ZXHATM ! mass point coordinates
-REAL, DIMENSION(SIZE(PYHAT))        :: ZYHATM ! mass point coordinates
-!
 REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))  :: ZWORK  
 REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PAER,4))  :: ZWORK2  
 !
-LOGICAL :: GSTORE   ! storage occurs at this time step
-!
 INTEGER :: IN     ! time index
 INTEGER :: JSV    ! loop counter
 INTEGER :: JK     ! loop
+INTEGER :: JP     ! loop for profilers
 INTEGER :: IKRAD
 !
 REAL,DIMENSION(SIZE(PZ,3)) :: ZU_PROFILER ! horizontal wind speed profile at station location (along x)
@@ -221,38 +199,29 @@ REAL                       :: ZZWD_PROFILER ! ZWD at station location
 REAL                       :: ZZHDR         ! ZHD correction at station location
 REAL                       :: ZZWDR         ! ZWD correction at station location
 !
-INTEGER                    :: IINFO_ll    ! return code
-INTEGER                    :: ILUOUT      ! logical unit
-INTEGER                    :: IRESP       ! return code
-INTEGER                    :: I           ! loop for stations
-!
 REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2))              :: ZZTD,ZZHD,ZZWD
-REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZTEMP,ZRARE,ZTHV,ZTEMPV
-REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZWORK32,ZWORK33,ZWORK34
-REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZVISI,ZVISIKUN
+REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZTEMP,ZTHV,ZTEMPV
+REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZVISIGUL, ZVISIKUN
 REAL ::  ZK1,ZK2,ZK3            ! k1, k2 and K3 atmospheric refractivity constants
 REAL  :: ZRDSRV                 ! XRD/XRV
 !
 ! specific to cloud radar
-INTEGER                        :: JLOOP,JLOOP2    ! loop counter
+INTEGER                        :: JLOOP    ! loop counter
 REAL, DIMENSION(SIZE(PR,3))    :: ZTEMPZ! vertical profile of temperature
 REAL, DIMENSION(SIZE(PR,3))    :: ZRHODREFZ ! vertical profile of dry air density of the reference state
 REAL, DIMENSION(SIZE(PR,3))    :: ZCIT     ! pristine ice concentration
 REAL, DIMENSION(SIZE(PR,3))    :: ZCCI,ZCCR,ZCCC     ! ICE,RAIN CLOUD concentration (LIMA)
-REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3))    :: ZR   
 REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ  ! vertical profile of hydrometeor mixing ratios
-REAL                           :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD,XLAM_CRAD,ZNS   ! generic microphysical parameters
+REAL                           :: ZA, ZB, ZCC, ZCX, ZALPHA, ZNS, ZNU, ZLB, ZLBEX, ZRHOHYD   ! generic microphysical parameters
 INTEGER                        :: JJ    ! loop counter for quadrature
 COMPLEX                        :: QMW,QMI,QM,QB,QEPSIW,QEPSWI   ! dielectric parameter
 REAL                           :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters
 REAL,DIMENSION(:),ALLOCATABLE  :: ZAELOC,ZZMZ ! temporary arrays
-INTEGER                        :: JPTS_GAULAG=9 ! number of points for Gauss-Laguerre quadrature
 REAL                           :: ZLBDA   ! slope distribution parameter
-REAL                           :: ZN   ! number cocentration
-REAL                           :: ZFRAC_ICE  ! ice water fraction
 REAL                           :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point
 REAL                           :: ZFW ! liquid fraction
 REAL                           :: ZFPW ! weight for mixed-phase reflectivity
+REAL                           :: ZN   ! number concentration
 REAL,DIMENSION(:),ALLOCATABLE  :: ZX,ZW ! Gauss-Laguerre points and weights
 REAL,DIMENSION(:),ALLOCATABLE  :: ZRTMIN ! local values for XRTMIN
 LOGICAL                        :: GCALC
@@ -269,801 +238,468 @@ ZK2 = 0.704       ! K/Pa
 ZK3 = 3739.       ! K2/Pa
 ZRDSRV=XRD/XRV
 !
-XLAM_CRAD        = 3.154E-3 ! (in m) <=> 95.04 GHz = Rasta cloud radar frequency
 !*      2.1  Indices
 !            -------
 !
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKU =   SIZE(PZ,3)     ! nombre de niveaux sur la verticale
 IKB = JPVEXT+1
 IKE = IKU-JPVEXT
 !
-!
-!*      2.2  Interpolations of model variables to mass points
-!            ------------------------------------------------
-!
-IIU=SIZE(PXHAT)
-IJU=SIZE(PYHAT)
-!
-ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU  )
-ZXHATM(  IIU  )=1.5*PXHAT(  IIU  )-0.5*PXHAT(  IIU-1)
-!
-ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU  )
-ZYHATM(  IJU  )=1.5*PYHAT(  IJU  )-0.5*PYHAT(  IJU-1)
-!
 !----------------------------------------------------------------------------
 !
-!
 !*      3.4  instant of storage
 !            ------------------
 !
-IF ( TPROFILER%T_CUR == XUNDEF ) TPROFILER%T_CUR = TPROFILER%STEP - PTSTEP
-!
-TPROFILER%T_CUR = TPROFILER%T_CUR + PTSTEP
-!
-IF ( TPROFILER%T_CUR >= TPROFILER%STEP - 1.E-10 ) THEN
-  GSTORE = .TRUE.
-  TPROFILER%T_CUR = TPROFILER%T_CUR - TPROFILER%STEP
-  TPROFILER%N_CUR = TPROFILER%N_CUR + 1
-  IN = TPROFILER%N_CUR
-ELSE
-  GSTORE = .FALSE.
-END IF
-!
-IF (GSTORE) THEN
-#if 0
-  tprofiler%tpdates(in)%date%year  = tdtexp%date%year
-  tprofiler%tpdates(in)%date%month = tdtexp%date%month
-  tprofiler%tpdates(in)%date%day   = tdtexp%date%day
-  tprofiler%tpdates(in)%xtime      = tdtexp%xtime + ( in - 1 ) * tprofiler%step
-#else
-  tprofiler%tpdates(in) = tdtcur
-#endif
-END IF
-!
+CALL  STATPROF_INSTANT( TPROFILERS_TIME, IN )
+IF ( IN < 1 ) RETURN !No profiler storage at this time step
 !
 !----------------------------------------------------------------------------
 !
-!*      4.   PROFILER POSITION
-!            --------------
-!
-!*      4.0  initialization of processor test
-!            --------------------------------
-IF (GPROFILERFIRSTCALL) THEN
-GPROFILERFIRSTCALL=.FALSE.
-!
- IF (.NOT.(ASSOCIATED(ZTHIS_PROCS))) ALLOCATE(ZTHIS_PROCS(NUMBPROFILER))
-!
-IF (.NOT.(ASSOCIATED(II))) ALLOCATE(II(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(IJ))) ALLOCATE(IJ(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(IV))) ALLOCATE(IV(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(IU))) ALLOCATE(IU(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(ZXCOEF))) ALLOCATE(ZXCOEF(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(ZUCOEF))) ALLOCATE(ZUCOEF(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(ZYCOEF))) ALLOCATE(ZYCOEF(NUMBPROFILER))
-IF (.NOT.(ASSOCIATED(ZVCOEF))) ALLOCATE(ZVCOEF(NUMBPROFILER))
-!
-ZXCOEF(:)=XUNDEF
-ZUCOEF(:)=XUNDEF
-ZYCOEF(:)=XUNDEF
-ZVCOEF(:)=XUNDEF
-!
-DO I=1,NUMBPROFILER
-
-ZTHIS_PROCS(I)=0.
-!
-!*      4.1  X position
-!            ----------
-!
-IU(I)=COUNT( PXHAT (:)<=TPROFILER%X(I) )
-II(I)=COUNT( ZXHATM(:)<=TPROFILER%X(I) )
-!
-IF (II(I)<=IIB-1   .AND. LWEST_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE.
-IF (II(I)>=IIE     .AND. LEAST_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE.
-!
-!
-!*      4.2  Y position
-!            ----------
-!
-IV(I)=COUNT( PYHAT (:)<=TPROFILER%Y(I) )
-IJ(I)=COUNT( ZYHATM(:)<=TPROFILER%Y(I) )
-!
-IF (IJ(I)<=IJB-1   .AND. LSOUTH_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE.
-IF (IJ(I)>=IJE     .AND. LNORTH_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE.
-!
-!
-!*      4.3  Position of station according to processors
-!            -------------------------------------------
-!
-IF (IU(I)>=IIB .AND. IU(I)<=IIE .AND. IV(I)>=IJB .AND. IV(I)<=IJE) ZTHIS_PROCS(I)=1.
-IF (L1D) ZTHIS_PROCS(I)=1.
-!
-!
-!*      4.4  Computations only on correct processor
-!            --------------------------------------
-ZXCOEF(I) = 0.
-ZYCOEF(I) = 0.
-ZUCOEF(I) = 0.         
-ZVCOEF(I) = 0.
-IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN
-!
-!*      6.1  Interpolation coefficient for X
-!            -------------------------------
-!
-  ZXCOEF(I) = (TPROFILER%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I)))
-!
-!
-!
-!*      6.2  Interpolation coefficient for y
-!            -------------------------------
-!
-  ZYCOEF(I) = (TPROFILER%Y(I) - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I)))
-!
-!----------------------------------------------------------------------------
-!
-!*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-!            ---------------------------------------------
-!
-!*      7.1  Interpolation coefficient for X (for U)
-!            -------------------------------
-!
-  ZUCOEF(I) = (TPROFILER%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I)))
-!
-!*      7.2  Interpolation coefficient for y (for V)
-!            -------------------------------
-!
-  ZVCOEF(I) = (TPROFILER%Y(I) - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I)))
-!
-END IF
-ENDDO
-END IF
-!----------------------------------------------------------------------------
-!
 !*      8.   DATA RECORDING
 !            --------------
 !
+!PW: TODO: ne faire le calcul que si necessaire (presence de profileurs locaux,...)
 ZTEMP(:,:,:)=PTH(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD)
 ! Theta_v
 ZTHV(:,:,:) = PTH(:,:,:) / (1.+WATER_SUM(PR(:,:,:,:)))*(1.+PR(:,:,:,1)/ZRDSRV)
 ! virtual temperature
 ZTEMPV(:,:,:)=ZTHV(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD)
 CALL GPS_ZENITH_GRID(PR(:,:,:,1),ZTEMP,PP,ZZTD,ZZHD,ZZWD)
-! Kunkel formulation
-IF (SIZE(PR,4) >= 2) THEN
+
+IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN
+  ! Gultepe formulation
+  ZVISIGUL(:,:,:) = 10E5 !default value
+  WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) )
+    ZVISIGUL(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473
+  END WHERE
+END IF
+
+IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN
+  ! Kunkel formulation
   ZVISIKUN(:,:,:) = 10E5  !default value
   WHERE ( PR(:,:,:,2) /=0 )
     ZVISIKUN(:,:,:) =0.027/(10**(-8)+(PR(:,:,:,2)/(1+PR(:,:,:,2))*PRHODREF(:,:,:)*1000))**0.88
   END WHERE
 END IF
-! Gultepe formulation
-IF ((SIZE(PR,4) >= 2) .AND. NSV_C2R2END /= 0 ) THEN 
-  WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) )
-    ZVISI(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473
-  END WHERE
-END IF
 !
-IF (GSTORE) THEN
-  DO I=1,NUMBPROFILER
-    IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TPROFILER%ERROR(I))) THEN
-      !
-      ZZ(:)                  = PROFILER_INTERP(PZ)
-      ZRHOD(:)               = PROFILER_INTERP(PRHODREF)
-      ZPRES(:)               = PROFILER_INTERP(PP)
-      ZU_PROFILER(:)         = PROFILER_INTERP_U(PU)
-      ZV_PROFILER(:)         = PROFILER_INTERP_V(PV)
-      ZGAM                   = (XRPK * (TPROFILER%LON(I) - XLON0) - XBETA)*(XPI/180.)
-      ZFF(:)                 = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2)
-      DO JK=1,IKU
-       IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) &
-         ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180.
-       IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) &
-         ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270.
-       IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) &
-         ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI 
-       IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) &
-         ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90.
-       IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) &
-         ZDD(JK) = XUNDEF
+PROFILER: DO JP = 1, NUMBPROFILER_LOC
+  ZZ(:)                  = STATPROF_INTERP_3D( TPROFILERS(JP), PZ )
+  ZRHOD(:)               = STATPROF_INTERP_3D( TPROFILERS(JP), PRHODREF )
+  ZPRES(:)               = STATPROF_INTERP_3D( TPROFILERS(JP), PP )
+  ZU_PROFILER(:)         = STATPROF_INTERP_3D_U( TPROFILERS(JP), PU )
+  ZV_PROFILER(:)         = STATPROF_INTERP_3D_V( TPROFILERS(JP), PV )
+  ZGAM                   = (XRPK * (TPROFILERS(JP)%XLON - XLON0) - XBETA)*(XPI/180.)
+  ZFF(:)                 = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2)
+  DO JK=1,IKU
+    IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) &
+      ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180.
+    IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) &
+      ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270.
+    IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) &
+      ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI
+    IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) &
+      ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90.
+    IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) &
+      ZDD(JK) = XUNDEF
+  END DO
+  ! GPS IWV and ZTD
+  XZS_GPS=TPROFILERS(JP)%XZ
+  IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok
+    ZRV(:)                 = STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,1) )
+    ZT(:)                  = STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMP )
+    ZE(:)                  = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:))
+    ZTV(:)                 = STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMPV )
+    ZZTD_PROFILER          = STATPROF_INTERP_2D( TPROFILERS(JP), ZZTD )
+    ZZHD_PROFILER          = STATPROF_INTERP_2D( TPROFILERS(JP), ZZHD )
+    ZZWD_PROFILER          = STATPROF_INTERP_2D( TPROFILERS(JP), ZZWD )
+    ZIWV = 0.
+    DO JK=IKB,IKE
+      ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK))
+    END DO
+    IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography
+      DO JK=IKB+1,IKE
+        IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove
+          ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1))
+          ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
+             ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) )
+          ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
+          ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
+          ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
+        ELSE                       ! partial layer to remove
+          ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1))
+          ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
+             ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) )
+          ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
+          ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
+          ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
+          EXIT
+        END IF
       END DO
-      ! GPS IWV and ZTD
-      XZS_GPS=TPROFILER%ALT(I)
-      IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok
-        ZRV(:)                 = PROFILER_INTERP(PR(:,:,:,1))
-        ZT(:)                  = PROFILER_INTERP(ZTEMP)
-        ZE(:)                  = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:))
-        ZTV(:)                 = PROFILER_INTERP(ZTEMPV)
-        ZZTD_PROFILER          = PROFILER_INTERP_2D(ZZTD)
-        ZZHD_PROFILER          = PROFILER_INTERP_2D(ZZHD)
-        ZZWD_PROFILER          = PROFILER_INTERP_2D(ZZWD)
-        ZIWV = 0.
-        DO JK=IKB,IKE
-         ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK))
-        END DO
-        IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography     
-          DO JK=IKB+1,IKE
-            IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove
-              ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1))
-              ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
-                 ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) )
-              ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
-              ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
-              ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
-            ELSE                       ! partial layer to remove
-              ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1)) 
-              ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
-                 ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) ) 
-              ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
-              ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
-              ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
-              EXIT
-            END IF
-          END DO 
-        ELSE ! station below the model orography
+    ELSE ! station below the model orography
 ! Extrapolate variables below the model orography assuming constant T&Tv gradients,
 ! constant rv and hydrostatic law
-          ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU))
-          ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB))
-          ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
-             ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
-          ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
-             ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
-          ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))&
-             /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB))))
-          ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) )
-! add contribution below the model orography        
-          ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT )
-          ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )&
-             * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT )
-          ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR
-          ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR
-          ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR
-        END IF
-        TPROFILER%IWV(IN,I)= ZIWV
-        TPROFILER%ZTD(IN,I)= ZZTD_PROFILER
-        TPROFILER%ZWD(IN,I)= ZZWD_PROFILER
-        TPROFILER%ZHD(IN,I)= ZZHD_PROFILER
-      ELSE
-        CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILER%NAME(I) ) // ' is too far from orography'
-        CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)'
-        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n' )
-        TPROFILER%IWV(IN,I)= XUNDEF
-        TPROFILER%ZTD(IN,I)= XUNDEF
-        TPROFILER%ZWD(IN,I)= XUNDEF
-        TPROFILER%ZHD(IN,I)= XUNDEF
-      END IF
-      TPROFILER%ZON (IN,:,I) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM)
-      TPROFILER%MER (IN,:,I) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM)
-      TPROFILER%FF  (IN,:,I) = ZFF(:)                                                     
-      TPROFILER%DD  (IN,:,I) = ZDD(:)   
-      TPROFILER%W   (IN,:,I) = PROFILER_INTERP(PW)
-      TPROFILER%TH  (IN,:,I) = PROFILER_INTERP(PTH)
-      TPROFILER%THV (IN,:,I) = PROFILER_INTERP(ZTHV)
-      TPROFILER%VISI(IN,:,I) = PROFILER_INTERP(ZVISI)
-      TPROFILER%VISIKUN(IN,:,I) = PROFILER_INTERP(ZVISIKUN)
-      TPROFILER%ZZ  (IN,:,I) = ZZ(:)
-      TPROFILER%RHOD(IN,:,I) = ZRHOD(:)
-      TPROFILER%CIZ(IN,:,I) = PROFILER_INTERP(PCIT)
+      ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU))
+      ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB))
+      ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
+         ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
+      ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
+         ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
+      ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))&
+         /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB))))
+      ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) )
+! add contribution below the model orography
+      ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT )
+      ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )&
+         * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT )
+      ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR
+      ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR
+      ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR
+    END IF
+    TPROFILERS(JP)%XIWV(IN)= ZIWV
+    TPROFILERS(JP)%XZTD(IN)= ZZTD_PROFILER
+    TPROFILERS(JP)%XZWD(IN)= ZZWD_PROFILER
+    TPROFILERS(JP)%XZHD(IN)= ZZHD_PROFILER
+  ELSE
+    CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILERS(JP)%CNAME ) // ' is too far from orography'
+    CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)'
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n', OLOCAL = .TRUE. )
+    TPROFILERS(JP)%XIWV(IN)= XUNDEF
+    TPROFILERS(JP)%XZTD(IN)= XUNDEF
+    TPROFILERS(JP)%XZWD(IN)= XUNDEF
+    TPROFILERS(JP)%XZHD(IN)= XUNDEF
+  END IF
+  TPROFILERS(JP)%XZON (IN,:) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM)
+  TPROFILERS(JP)%XMER (IN,:) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM)
+  TPROFILERS(JP)%XFF  (IN,:) = ZFF(:)
+  TPROFILERS(JP)%XDD  (IN,:) = ZDD(:)
+  TPROFILERS(JP)%XW   (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PW )
+  TPROFILERS(JP)%XTH  (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PTH )
+  TPROFILERS(JP)%XTHV (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZTHV )
+  IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' )  TPROFILERS(JP)%XVISIGUL(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIGUL )
+  IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) TPROFILERS(JP)%XVISIKUN(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIKUN )
+  TPROFILERS(JP)%XZZ  (IN,:) = ZZ(:)
+  TPROFILERS(JP)%XRHOD(IN,:) = ZRHOD(:)
+  IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) &
+    TPROFILERS(JP)%XCIZ(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PCIT )
 ! add RARE
-        ! initialization CRARE and CRARE_ATT + LWC and IWC
-      TPROFILER%CRARE(IN,:,I) = 0.
-      TPROFILER%CRARE_ATT(IN,:,I) = 0.
-      TPROFILER%LWCZ  (IN,:,I) = 0.
-      TPROFILER%IWCZ  (IN,:,I) = 0.
-      IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
-       TPROFILER%LWCZ  (IN,:,I) = PROFILER_INTERP((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
-       TPROFILER%IWCZ  (IN,:,I) = PROFILER_INTERP((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:))
-       ZTEMPZ(:)=PROFILER_INTERP(ZTEMP(:,:,:))
-       ZRHODREFZ(:)=PROFILER_INTERP(PRHODREF(:,:,:))
-       ZCIT(:)=PROFILER_INTERP(PCIT(:,:,:))
-       IF (CCLOUD=="LIMA") THEN
-          ZCCI(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NI))
-          ZCCR(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NR))
-          ZCCC(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NC))
-       ENDIF
-       DO JLOOP=3,6
-          ZRZ(:,JLOOP)=PROFILER_INTERP(PR(:,:,:,JLOOP))
-       END DO
-       IF (CSURF=="EXTE") THEN
-         DO JK=1,IKU
-            ZRZ(JK,2)=PROFILER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:))       ! becomes cloud mixing ratio over sea
-            ZRZ(JK,7)=PROFILER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:)))  ! becomes cloud mixing ratio over land
-         END DO
-       ELSE
-          ZRZ(:,2)=PROFILER_INTERP(PR(:,:,:,2))
-          ZRZ(:,7)=0.
-       END IF
-       ALLOCATE(ZAELOC(IKU))
-        !
-       ZAELOC(:)=0.
-       ! initialization of quadrature points and weights
-       ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG))
-       CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters
-        ! initialize minimum values
-       ALLOCATE(ZRTMIN(SIZE(PR,4)+1))
-       IF (CCLOUD == 'LIMA') THEN
-          ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea
-          ZRTMIN(3)=XRTMIN_L(3)
-          ZRTMIN(4)=XRTMIN_L(4)
-          ZRTMIN(5)=1E-10
-          ZRTMIN(6)=XRTMIN_L(6)
-          ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land
-       ELSE
-          ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea
-          ZRTMIN(3)=XRTMIN_I(3)
-          ZRTMIN(4)=XRTMIN_I(4)
-          ZRTMIN(5)=1E-10
-          ZRTMIN(6)=XRTMIN_I(6)
-          ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land
-       ENDIF
-        ! compute cloud radar reflectivity from vertical profiles of temperature
-        ! and mixing ratios
-       DO JK=1,IKU
-         QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
-         QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
-         DO JLOOP=2,7
-           IF (CCLOUD == 'LIMA') THEN
-              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.&
-                    (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND.JLOOP.NE.7).OR.ZCCC(JK)>0.))
-           ELSE
-              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.))
-           ENDIF
-           IF(GCALC) THEN
-              SELECT CASE(JLOOP)
-                CASE(2) ! cloud water over sea
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAC_L
-                    ZB=XBC_L
-                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAC_L
-                    ZNU=XNUC_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAC_I
-                    ZB=XBC_I
-                    ZCC=XCONC_SEA
-                    ZCX=0.
-                    ZALPHA=XALPHAC2_I
-                    ZNU=XNUC2_I
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ENDIF
-                CASE(3) ! rain water
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAR_L
-                    ZB=XBR_L
-                    ZCC=ZCCR(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAR_L
-                    ZNU=XNUR_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAR_I
-                    ZB=XBR_I
-                    ZCC=XCCR_I
-                    ZCX=-1.
-                    ZALPHA=XALPHAR_I
-                    ZNU=XNUR_I
-                    ZLB=XLBR_I
-                    ZLBEX=XLBEXR_I
-                  ENDIF
-                CASE(4) ! pristine ice
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAI_L
-                    ZB=XBI_L
-                    ZCC=ZCCI(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAI_L
-                    ZNU=XNUI_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI
-                    ZFW=0
-                  ELSE
-                    ZA=XAI_I
-                    ZB=XBI_I
-                    ZCC=ZCIT(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAI_I
-                    ZNU=XNUI_I
-                    ZLBEX=XLBEXI_I
-                    ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI
-                    ZFW=0
-                  ENDIF
-                CASE(5) ! snow
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAS_L
-                    ZB=XBS_L
-                    ZCC=XCCS_L
-                    ZCX=XCXS_L
-                    ZALPHA=XALPHAS_L
-                    ZNU=XNUS_L
-                    ZNS=XNS_L
-                    ZLB=XLBS_L
-                    ZLBEX=XLBEXS_L
-                    ZFW=0
-                  ELSE
-                    ZA=XAS_I
-                    ZB=XBS_I
-                    ZCC=XCCS_I
-                    ZCX=XCXS_I
-                    ZALPHA=XALPHAS_I
-                    ZNU=XNUS_I
-                    ZNS=XNS_I
-                    ZLB=XLBS_I
-                    ZLBEX=XLBEXS_I
-                    ZFW=0
-                  ENDIF
-                CASE(6) ! graupel
-                  !If temperature between -10 and 10B0C and Mr and Mg over min
-                  !threshold: melting graupel
-                  ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel
-                  ! (Fw=0)    
-                  IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 &
-                    .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN
-                    ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP))
-                  ELSE
-                    ZFW=0
-                  ENDIF
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAG_L
-                    ZB=XBG_L
-                    ZCC=XCCG_L
-                    ZCX=XCXG_L
-                    ZALPHA=XALPHAG_L
-                    ZNU=XNUG_L
-                    ZLB=XLBG_L
-                    ZLBEX=XLBEXG_L
-                  ELSE
-                    ZA=XAG_I
-                    ZB=XBG_I
-                    ZCC=XCCG_I
-                    ZCX=XCXG_I
-                    ZALPHA=XALPHAG_I
-                    ZNU=XNUG_I
-                    ZLB=XLBG_I
-                    ZLBEX=XLBEXG_I
-                  ENDIF
-                CASE(7) ! cloud water over land
-                  IF (CCLOUD == 'LIMA') THEN
-                    ZA=XAC_L
-                    ZB=XBC_L
-                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
-                    ZCX=0.
-                    ZALPHA=XALPHAC_L
-                    ZNU=XNUC_L
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ELSE
-                    ZA=XAC_I
-                    ZB=XBC_I
-                    ZCC=XCONC_LAND
-                    ZCX=0.
-                    ZALPHA=XALPHAC_I
-                    ZNU=XNUC_I
-                    ZLBEX=1.0/(ZCX-ZB)
-                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
-                  ENDIF
-            END SELECT
-            IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. &
+    ! initialization CRARE and CRARE_ATT + LWC and IWC
+  TPROFILERS(JP)%XCRARE(IN,:) = 0.
+  TPROFILERS(JP)%XCRARE_ATT(IN,:) = 0.
+  TPROFILERS(JP)%XLWCZ  (IN,:) = 0.
+  TPROFILERS(JP)%XIWCZ  (IN,:) = 0.
+  IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
+    TPROFILERS(JP)%XLWCZ  (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), (PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:) )
+    TPROFILERS(JP)%XIWCZ  (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), (PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:) )
+    ZTEMPZ(:)=STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMP(:,:,:) )
+    ZRHODREFZ(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PRHODREF(:,:,:) )
+    ZCIT(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PCIT(:,:,:) )
+    IF (CCLOUD=="LIMA") THEN
+      ZCCI(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NI) )
+      ZCCR(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NR) )
+      ZCCC(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NC) )
+    END IF
+    DO JLOOP=3,6
+      ZRZ(:,JLOOP)=STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,JLOOP) )
+    END DO
+    IF (CSURF=="EXTE") THEN
+      DO JK=1,IKU
+        ZRZ(JK,2)=STATPROF_INTERP_2D( TPROFILERS(JP), PR(:,:,JK,2)*PSEA(:,:) )       ! becomes cloud mixing ratio over sea
+        ZRZ(JK,7)=STATPROF_INTERP_2D( TPROFILERS(JP), PR(:,:,JK,2)*(1.-PSEA(:,:)) )  ! becomes cloud mixing ratio over land
+      END DO
+    ELSE
+      ZRZ(:,2)=STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,2) )
+      ZRZ(:,7)=0.
+    END IF
+    ALLOCATE(ZAELOC(IKU))
+    !
+    ZAELOC(:)=0.
+    ! initialization of quadrature points and weights
+    ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG))
+    CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters
+    ! initialize minimum values
+    ALLOCATE(ZRTMIN(SIZE(PR,4)+1))
+    IF (CCLOUD == 'LIMA') THEN
+      ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea
+      ZRTMIN(3)=XRTMIN_L(3)
+      ZRTMIN(4)=XRTMIN_L(4)
+      ZRTMIN(5)=1E-10
+      ZRTMIN(6)=XRTMIN_L(6)
+      ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land
+    ELSE
+      ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea
+      ZRTMIN(3)=XRTMIN_I(3)
+      ZRTMIN(4)=XRTMIN_I(4)
+      ZRTMIN(5)=1E-10
+      ZRTMIN(6)=XRTMIN_I(6)
+      ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land
+    END IF
+    ! compute cloud radar reflectivity from vertical profiles of temperature
+    ! and mixing ratios
+    DO JK=1,IKU
+      QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
+      QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
+      DO JLOOP=2,7
+        IF (CCLOUD == 'LIMA') THEN
+          GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.&
+                (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND.JLOOP.NE.7).OR.ZCCC(JK)>0.))
+        ELSE
+          GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.))
+        END IF
+        IF (GCALC) THEN
+          SELECT CASE(JLOOP)
+            CASE(2) ! cloud water over sea
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAC_L
+                ZB=XBC_L
+                ZCC=ZCCC(JK)*ZRHODREFZ(JK)
+                ZCX=0.
+                ZALPHA=XALPHAC_L
+                ZNU=XNUC_L
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+              ELSE
+                ZA=XAC_I
+                ZB=XBC_I
+                ZCC=XCONC_SEA
+                ZCX=0.
+                ZALPHA=XALPHAC2_I
+                ZNU=XNUC2_I
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+              END IF
+            CASE(3) ! rain water
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAR_L
+                ZB=XBR_L
+                ZCC=ZCCR(JK)*ZRHODREFZ(JK)
+                ZCX=0.
+                ZALPHA=XALPHAR_L
+                ZNU=XNUR_L
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+              ELSE
+                ZA=XAR_I
+                ZB=XBR_I
+                ZCC=XCCR_I
+                ZCX=-1.
+                ZALPHA=XALPHAR_I
+                ZNU=XNUR_I
+                ZLB=XLBR_I
+                ZLBEX=XLBEXR_I
+              END IF
+            CASE(4) ! pristine ice
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAI_L
+                ZB=XBI_L
+                ZCC=ZCCI(JK)*ZRHODREFZ(JK)
+                ZCX=0.
+                ZALPHA=XALPHAI_L
+                ZNU=XNUI_L
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI
+                ZFW=0
+              ELSE
+                ZA=XAI_I
+                ZB=XBI_I
+                ZCC=ZCIT(JK)
+                ZCX=0.
+                ZALPHA=XALPHAI_I
+                ZNU=XNUI_I
+                ZLBEX=XLBEXI_I
+                ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI
+                ZFW=0
+              END IF
+            CASE(5) ! snow
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAS_L
+                ZB=XBS_L
+                ZCC=XCCS_L
+                ZCX=XCXS_L
+                ZALPHA=XALPHAS_L
+                ZNU=XNUS_L
+                ZNS=XNS_L
+                ZLB=XLBS_L
+                ZLBEX=XLBEXS_L
+                ZFW=0
+              ELSE
+                ZA=XAS_I
+                ZB=XBS_I
+                ZCC=XCCS_I
+                ZCX=XCXS_I
+                ZALPHA=XALPHAS_I
+                ZNU=XNUS_I
+                ZNS=XNS_I
+                ZLB=XLBS_I
+                ZLBEX=XLBEXS_I
+                ZFW=0
+              END IF
+            CASE(6) ! graupel
+              !If temperature between -10 and 10B0C and Mr and Mg over min
+              !threshold: melting graupel
+              ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel
+              ! (Fw=0)
+              IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 &
+                .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN
+                ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP))
+              ELSE
+                ZFW=0
+              END IF
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAG_L
+                ZB=XBG_L
+                ZCC=XCCG_L
+                ZCX=XCXG_L
+                ZALPHA=XALPHAG_L
+                ZNU=XNUG_L
+                ZLB=XLBG_L
+                ZLBEX=XLBEXG_L
+              ELSE
+                ZA=XAG_I
+                ZB=XBG_I
+                ZCC=XCCG_I
+                ZCX=XCXG_I
+                ZALPHA=XALPHAG_I
+                ZNU=XNUG_I
+                ZLB=XLBG_I
+                ZLBEX=XLBEXG_I
+              END IF
+            CASE(7) ! cloud water over land
+              IF (CCLOUD == 'LIMA') THEN
+                ZA=XAC_L
+                ZB=XBC_L
+                ZCC=ZCCC(JK)*ZRHODREFZ(JK)
+                ZCX=0.
+                ZALPHA=XALPHAC_L
+                ZNU=XNUC_L
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+              ELSE
+                ZA=XAC_I
+                ZB=XBC_I
+                ZCC=XCONC_LAND
+                ZCX=0.
+                ZALPHA=XALPHAC_I
+                ZNU=XNUC_I
+                ZLBEX=1.0/(ZCX-ZB)
+                ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
+              END IF
+          END SELECT
+          IF ( JLOOP ==  5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. &
                                    (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN
-               IF (ZTEMPZ(JK)>-10.) THEN
-                  ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
-               ELSE
-                  ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
-               END IF
-               ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB
+            IF (ZTEMPZ(JK)>-10.) THEN
+              ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
             ELSE
-               ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
-               ZN=ZCC*ZLBDA**ZCX
+              ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN)
             END IF
-            ZREFLOC=0.
-            ZAETMP=0.
-            DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature
-               ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA
-               SELECT CASE(JLOOP)
-                  CASE(2,3,7)
-                    QM=QMW
-                  CASE(4,5,6)
-                    ! pristine ice, snow, dry graupel
-                    ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW)
-                    QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW))
-                    ! water inclusions in ice in air
-                    QEPSWI=MG(QMW**2,QM**2,ZFW)
-                    ! ice in air inclusions in water
-                    QEPSIW=MG(QM**2,QMW**2,1.-ZFW)
-                    !MG weighted rule (Matrosov 2008)
-                    IF(ZFW .LT. 0.37) THEN
-                      ZFPW=0
-                    ELSE IF(ZFW .GT. 0.63) THEN
-                      ZFPW=1
-                    ELSE
-                      ZFPW=(ZFW-0.37)/(0.63-0.37)
-                    ENDIF
-                    QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW)
-               END SELECT
-               CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK)
-               ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
-               ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
-             END DO
-             ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93)
-             ZAETMP=ZAETMP  *           XPI    *ZN/(4.*GAMMA(ZNU))
-             TPROFILER%CRARE(IN,JK,I)=TPROFILER%CRARE(IN,JK,I)+ZREFLOC
-             ZAELOC(JK)=ZAELOC(JK)+ZAETMP
-           END IF
-         END DO
-       END DO
-     ! apply attenuation
-       ALLOCATE(ZZMZ(IKU))
-       ZZMZ = ZZ(:) ! PROFILER_INTERP(ZZM(:,:,:))
+            ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB
+          ELSE
+            ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
+            ZN=ZCC*ZLBDA**ZCX
+          END IF
+          ZREFLOC=0.
+          ZAETMP=0.
+          DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature
+            ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA
+            SELECT CASE(JLOOP)
+              CASE(2,3,7)
+                QM=QMW
+              CASE(4,5,6)
+                ! pristine ice, snow, dry graupel
+                ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW)
+                QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW))
+                ! water inclusions in ice in air
+                QEPSWI=MG(QMW**2,QM**2,ZFW)
+                ! ice in air inclusions in water
+                QEPSIW=MG(QM**2,QMW**2,1.-ZFW)
+                !MG weighted rule (Matrosov 2008)
+                IF(ZFW .LT. 0.37) THEN
+                  ZFPW=0
+                ELSE IF(ZFW .GT. 0.63) THEN
+                  ZFPW=1
+                ELSE
+                  ZFPW=(ZFW-0.37)/(0.63-0.37)
+                ENDIF
+                QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW)
+            END SELECT
+            CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK)
+            ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
+            ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
+          END DO
+          ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93)
+          ZAETMP=ZAETMP  *           XPI    *ZN/(4.*GAMMA(ZNU))
+          TPROFILERS(JP)%XCRARE(IN,JK)=TPROFILERS(JP)%XCRARE(IN,JK)+ZREFLOC
+          ZAELOC(JK)=ZAELOC(JK)+ZAETMP
+        END IF
+      END DO
+    END DO
+ ! apply attenuation
+    ALLOCATE(ZZMZ(IKU))
+    ZZMZ = ZZ(:) ! STATPROF_INTERP_3D( TPROFILERS(JP), ZZM(:,:,:) )
 !        ZZMZ(1)=ZZM_STAT
-        ! zenith
-       ZAETOT=1.
-       DO JK = 2,IKU
-            ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
-        ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1)))
-        TPROFILER%CRARE_ATT(IN,JK,I)=TPROFILER%CRARE(IN,JK,I)*ZAETOT
-       END DO
-!        TPROFILER%ZZ  (IN,:,I) = ZZMZ(:)
-       DEALLOCATE(ZZMZ,ZAELOC)
-        ! m^3 bmm^6/m^3 bdBZ
-       WHERE(TPROFILER%CRARE(IN,:,I)>0)
-          TPROFILER%CRARE(IN,:,I)=10.*LOG10(1.E18*TPROFILER%CRARE(IN,:,I))
-       ELSEWHERE
-          TPROFILER%CRARE(IN,:,I)=XUNDEF
-       END WHERE
-       WHERE(TPROFILER%CRARE_ATT(IN,:,I)>0)
-          TPROFILER%CRARE_ATT(IN,:,I)=10.*LOG10(1.E18*TPROFILER%CRARE_ATT(IN,:,I))
-       ELSEWHERE
-          TPROFILER%CRARE_ATT(IN,:,I)=XUNDEF
-       END WHERE
-       DEALLOCATE(ZX,ZW,ZRTMIN)
-     END IF ! end LOOP ICE3
+    ! zenith
+    ZAETOT=1.
+    DO JK = 2,IKU
+         ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
+      ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1)))
+      TPROFILERS(JP)%XCRARE_ATT(IN,JK)=TPROFILERS(JP)%XCRARE(IN,JK)*ZAETOT
+    END DO
+    DEALLOCATE(ZZMZ,ZAELOC)
+     ! m^3 b mm^6/m^3 b dBZ
+    WHERE(TPROFILERS(JP)%XCRARE(IN,:)>0)
+      TPROFILERS(JP)%XCRARE(IN,:)=10.*LOG10(1.E18*TPROFILERS(JP)%XCRARE(IN,:))
+    ELSEWHERE
+      TPROFILERS(JP)%XCRARE(IN,:)=XUNDEF
+    END WHERE
+    WHERE(TPROFILERS(JP)%XCRARE_ATT(IN,:)>0)
+      TPROFILERS(JP)%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPROFILERS(JP)%XCRARE_ATT(IN,:))
+    ELSEWHERE
+      TPROFILERS(JP)%XCRARE_ATT(IN,:)=XUNDEF
+    END WHERE
+    DEALLOCATE(ZX,ZW,ZRTMIN)
+  END IF ! end LOOP ICE3
 ! end add RARE
 !!
-      IF (.NOT. L1D) THEN
-        TPROFILER%P   (IN,:,I) = PROFILER_INTERP(PP(II(I):II(I)+1,IJ(I):IJ(I)+1,:))
-      ELSE
-        TPROFILER%P   (IN,:,I) = PROFILER_INTERP(PP)
-      END IF
-      !
-      DO JSV=1,SIZE(PR,4)
-        TPROFILER%R   (IN,:,I,JSV) = PROFILER_INTERP(PR(:,:,:,JSV))
-      END DO
-        ZWORK(:,:,:,:)=PSV(:,:,:,:)
-        ZWORK(:,:,1,:)=PSV(:,:,2,:)
-      DO JSV=1,SIZE(PSV,4)
-        TPROFILER%SV  (IN,:,I,JSV) = PROFILER_INTERP(ZWORK(:,:,:,JSV))
-      END DO
-      ZWORK2(:,:,:,:) = 0.
-      DO JK=IKB,IKE
-        IKRAD = JK - JPVEXT
-        ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:)
-      ENDDO
-      DO JSV=1,SIZE(PAER,4)
-        TPROFILER%AER(IN,:,I,JSV) = PROFILER_INTERP(ZWORK2(:,:,:,JSV))
-      ENDDO
-      IF (SIZE(PTKE)>0) TPROFILER%TKE  (IN,:,I) = PROFILER_INTERP(PTKE)
-      !
-      IF (LDIAG_IN_RUN) THEN
-        TPROFILER%T2M   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_T2M   )
-        TPROFILER%Q2M   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_Q2M   )
-        TPROFILER%HU2M  (IN,I)     = PROFILER_INTERP_2D(XCURRENT_HU2M  )
-        TPROFILER%ZON10M(IN,I)     = PROFILER_INTERP_2D(XCURRENT_ZON10M)
-        TPROFILER%MER10M(IN,I)     = PROFILER_INTERP_2D(XCURRENT_MER10M)
-        TPROFILER%RN    (IN,I)     = PROFILER_INTERP_2D(XCURRENT_RN    )
-        TPROFILER%H     (IN,I)     = PROFILER_INTERP_2D(XCURRENT_H     )
-        TPROFILER%LE    (IN,I)     = PROFILER_INTERP_2D(XCURRENT_LE    )
-        TPROFILER%LEI   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_LEI   )        
-        TPROFILER%GFLUX (IN,I)     = PROFILER_INTERP_2D(XCURRENT_GFLUX )
-       IF (CRAD /= 'NONE') THEN
-        TPROFILER%SWD   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_SWD   )
-        TPROFILER%SWU   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_SWU   )
-        TPROFILER%LWD   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_LWD   )
-        TPROFILER%LWU   (IN,I)     = PROFILER_INTERP_2D(XCURRENT_LWU   )
-       END IF
-        TPROFILER%TKE_DISS(IN,:,I) = PROFILER_INTERP(XCURRENT_TKE_DISS)
-      ENDIF
-    ENDIF
-!
-!----------------------------------------------------------------------------
-!
-!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
-!            ------------------------------------------
-!
-!*     11.2  data stored
-!            -----------
-!
-  CALL DISTRIBUTE_PROFILER(TPROFILER%X   (I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%Y   (I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%LON (I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%LAT (I))
-  !
-  IF (LDIAG_IN_RUN) THEN
-    CALL DISTRIBUTE_PROFILER(TPROFILER%T2M   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%Q2M   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%HU2M  (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%ZON10M(IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%MER10M(IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%RN    (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%H     (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%LE    (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%LEI   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%GFLUX (IN,I))
-   IF (CRAD /= 'NONE') THEN
-    CALL DISTRIBUTE_PROFILER(TPROFILER%LWD   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%LWU   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%SWD   (IN,I))
-    CALL DISTRIBUTE_PROFILER(TPROFILER%SWU   (IN,I))
-   ENDIF
-  ENDIF
- DO JK=1,IKU
-  CALL DISTRIBUTE_PROFILER(TPROFILER%ZON (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%MER (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%FF  (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%DD  (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%W   (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%P   (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%ZZ  (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%TH  (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%THV (IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%VISI(IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%VISIKUN(IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%RHOD(IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%CRARE(IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%CRARE_ATT(IN,JK,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%CIZ(IN,JK,I))
-
-  !
-  IF (LDIAG_IN_RUN) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE_DISS(IN,JK,I))
+  TPROFILERS(JP)%XP   (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PP )
   !
   DO JSV=1,SIZE(PR,4)
-    CALL DISTRIBUTE_PROFILER(TPROFILER%R   (IN,JK,I,JSV))
+    TPROFILERS(JP)%XR   (IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,JSV) )
   END DO
+    ZWORK(:,:,:,:)=PSV(:,:,:,:)
+    ZWORK(:,:,1,:)=PSV(:,:,2,:)
   DO JSV=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_PROFILER(TPROFILER%SV  (IN,JK,I,JSV))
+    TPROFILERS(JP)%XSV  (IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), ZWORK(:,:,:,JSV) )
   END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE  (IN,JK,I))
- ENDDO
-
-  CALL DISTRIBUTE_PROFILER(TPROFILER%IWV(IN,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%ZTD(IN,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%ZHD(IN,I))
-  CALL DISTRIBUTE_PROFILER(TPROFILER%ZWD(IN,I))
-ENDDO
-!
-END IF
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-FUNCTION PROFILER_INTERP_2D(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:), INTENT(IN) :: PA
-REAL                             :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-  JI=1
-  JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-  JI=II(I)
-  JJ=IJ(I)
-END IF
-!
-!
-PB = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ)    + &
-     (1.-ZYCOEF(I)) *    (ZXCOEF(I)) *  PA(JI+1,JJ)  + &
-     (   ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ+1)  + &
-     (   ZYCOEF(I)) *    (ZXCOEF(I)) *  PA(JI+1,JJ+1)
-!
-END FUNCTION PROFILER_INTERP_2D
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-FUNCTION PROFILER_INTERP(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
-REAL, DIMENSION(SIZE(PA,3))        :: PB
-!
-INTEGER :: JI, JJ,JK
-!
-IF (SIZE(PA,1)==2) THEN
-  JI=1
-  JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-  JI=II(I)
-  JJ=IJ(I)
-END IF
-!
-!
-DO JK=1,SIZE(PA,3)
- IF ( (PA(JI,JJ,JK) /= XUNDEF) .AND. (PA(JI+1,JJ,JK) /= XUNDEF) .AND. &
-      (PA(JI,JJ+1,JK) /= XUNDEF) .AND. (PA(JI+1,JJ+1,JK) /= XUNDEF) ) THEN
-    PB(JK) = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ,JK) + &
-            (1.-ZYCOEF(I)) * (ZXCOEF(I)) *  PA(JI+1,JJ,JK)  + &
-            (ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ+1,JK)  + &
-            (ZYCOEF(I)) * (ZXCOEF(I)) *  PA(JI+1,JJ+1,JK) 
- ELSE
-    PB(JK) = XUNDEF 
- END IF
-END DO
-!
-END FUNCTION PROFILER_INTERP
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-FUNCTION PROFILER_INTERP_U(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
-REAL, DIMENSION(SIZE(PA,3))        :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-  JI=1
-  JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-  JI=IU(I)
-  JJ=IJ(I)
-END IF
-!
-PB(:) = (1.- ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI  ,JJ  ,:) &
-   +    (1.- ZYCOEF(I)) * (   ZUCOEF(I)) * PA(JI+1,JJ  ,:) &
-   + (    ZYCOEF(I)) * (1.-ZUCOEF(I)) *    PA(JI  ,JJ+1,:) &
-   + (    ZYCOEF(I)) * (   ZUCOEF(I)) *    PA(JI+1,JJ+1,:)
-!
-END FUNCTION PROFILER_INTERP_U
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-FUNCTION PROFILER_INTERP_V(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
-REAL, DIMENSION(SIZE(PA,3))        :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-  JI=1
-  JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-  JI=II(I)
-  JJ=IV(I)
-END IF
-!
-PB(:) = (1.- ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI  ,JJ  ,:) &
-   + (1.- ZVCOEF(I)) * (   ZXCOEF(I)) *  PA(JI+1,JJ  ,:)   &
-   + (    ZVCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI  ,JJ+1,:)   &
-   + (    ZVCOEF(I)) * (   ZXCOEF(I)) *  PA(JI+1,JJ+1,:) 
-!
-END FUNCTION PROFILER_INTERP_V
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_PROFILER(PAS)
-!
-REAL, INTENT(INOUT) :: PAS
-!
-PAS = PAS * ZTHIS_PROCS(I)
-
-CALL REDUCESUM_ll(PAS,IINFO_ll)
+  ZWORK2(:,:,:,:) = 0.
+  DO JK=IKB,IKE
+    IKRAD = JK - JPVEXT
+    ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:)
+  END DO
+  DO JSV=1,SIZE(PAER,4)
+    TPROFILERS(JP)%XAER(IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), ZWORK2(:,:,:,JSV) )
+  END DO
+  IF (SIZE(PTKE)>0) TPROFILERS(JP)%XTKE  (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PTKE )
+  !
+  IF (LDIAG_IN_RUN) THEN
+    TPROFILERS(JP)%XT2M   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_T2M    )
+    TPROFILERS(JP)%XQ2M   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_Q2M    )
+    TPROFILERS(JP)%XHU2M  (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_HU2M   )
+    TPROFILERS(JP)%XZON10M(IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_ZON10M )
+    TPROFILERS(JP)%XMER10M(IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_MER10M )
+    TPROFILERS(JP)%XRN    (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_RN     )
+    TPROFILERS(JP)%XH     (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_H      )
+    TPROFILERS(JP)%XLE    (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LE     )
+    TPROFILERS(JP)%XLEI   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LEI    )
+    TPROFILERS(JP)%XGFLUX (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_GFLUX  )
+    IF (CRAD /= 'NONE') THEN
+      TPROFILERS(JP)%XSWD   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWD    )
+      TPROFILERS(JP)%XSWU   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWU    )
+      TPROFILERS(JP)%XLWD   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWD    )
+      TPROFILERS(JP)%XLWU   (IN)     = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWU    )
+    END IF
+    TPROFILERS(JP)%XTKE_DISS(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), XCURRENT_TKE_DISS )
+  END IF
+END DO PROFILER
 !
-END SUBROUTINE DISTRIBUTE_PROFILER
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE PROFILER_n
diff --git a/src/MNH/qlap.f90 b/src/MNH/qlap.f90
index 24c49ab38f58702aec4c40a6996f0575a3d2f8e5..4502200a9da8c2bfd2a4174794fc8280afe874e6 100644
--- a/src/MNH/qlap.f90
+++ b/src/MNH/qlap.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.
@@ -17,12 +17,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
@@ -138,12 +138,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at time t
diff --git a/src/MNH/radar_simulator.f90 b/src/MNH/radar_simulator.f90
index b855afc924ed0d8a391fc7d21a9d572158c6fd7f..d03bfb6571bbe080898d4b8396b266d560c68036 100644
--- a/src/MNH/radar_simulator.f90
+++ b/src/MNH/radar_simulator.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2004-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.
@@ -204,8 +204,6 @@ REAL                                     :: ZCLAT0,ZSLAT0          ! cos and sin
 REAL                                     :: ZMAP     ! Map factor
 REAL                                     :: ZGAMMA,ZCOSG,ZSING  ! angle of projection and its cos and sin values
 !
-REAL, DIMENSION(:),          ALLOCATABLE :: ZXHATM ! X values of the mass points
-REAL, DIMENSION(:),          ALLOCATABLE :: ZYHATM ! Y values of the mass points
 REAL, DIMENSION(:,:,:),      ALLOCATABLE :: ZZM    ! Z values of the mass points
 REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZT_RAY  ! temperature interpolated along the rays
 REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZR_RAY  ! rain            mixing ratio interpolated along the rays
@@ -519,16 +517,8 @@ ZSLAT0 = SIN(ZRDSDG*ZLAT0)
 !
 !  Positions of the mass points in the MESO-NH conformal projection 
 !
-ALLOCATE(ZXHATM(IIU))
-ALLOCATE(ZYHATM(IJU)) 
 ALLOCATE(ZZM(IIU,IJU,IKU))
 !
-ZXHATM(1:IIU-1) = .5*(XXHAT(1:IIU-1)+XXHAT(2:IIU))
-ZXHATM(IIU)     = 2.*XXHAT(IIU)-ZXHATM(IIU-1)
-!
-ZYHATM(1:IJU-1) = .5*(XYHAT(1:IJU-1)+XYHAT(2:IJU))
-ZYHATM(IJU)     = 2.*XYHAT(IJU)-ZYHATM(IJU-1)
-!
 ZZM(:,:,1:IKU-1)= .5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
 ZZM(:,:,IKU)= 2. * XZZ(:,:,IKU) - ZZM(:,:,IKU-1)
 !
@@ -626,7 +616,7 @@ DO JI=1,NBRAD
               ! first compute vertical position (height)          
               ! compute the index of refraction at the radar gate boundaries
               CALL INTERPOL_BEAM(ZN(:,:,:),ZN1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),&
-              ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:))
+              ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),XXHATM(:),XYHATM(:),ZZM(:,:,:))
               IF(LREFR) ZN_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-1.)*1.E6 !LREFR: if true writes out refractivity (N ≡ (n − 1) × 106)
               IF(LDNDZ) THEN !LDNDZ: if true writes out vertical gradient of refractivity
                 IF(JL==1) THEN
@@ -654,7 +644,7 @@ DO JI=1,NBRAD
                   ZDNDZ1=(ZN1-ZN0)/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1))
                 ELSE ! for first gate DNDZ1 is the local value at radar
                   CALL INTERPOL_BEAM(ZDNDZ(:,:,:),ZDNDZ1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),&
-                            ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:))
+                            ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),XXHATM(:),XYHATM(:),ZZM(:,:,:))
                 END IF
                 IF(ZDNDZ1>-ZN1/XRADIUS/COS(ZELEV(JI,JEL,JL,JV))) THEN
                   ZKE=1./(1.+XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV)))
@@ -802,10 +792,10 @@ ENDIF
 !interpolation from TVARMOD to TVARRAD of the model variables in the radar projection, using the position (ZX_RAY, ZY_RAY, ZZ_RAY)
 !of the beam in the model grid 
 CALL INTERPOL_BEAM(TVARMOD,TVARRAD,ZX_RAY(:,:,:,:,:,:),&
-     ZY_RAY(:,:,:,:,:,:),ZZ_RAY(:,:,:,:,:,:),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) 
+     ZY_RAY(:,:,:,:,:,:),ZZ_RAY(:,:,:,:,:,:),XXHATM(:),XYHATM(:),ZZM(:,:,:))
 !
 DEALLOCATE(ZBU_MASK)
-DEALLOCATE(ZXHATM,ZYHATM,ZZM)
+DEALLOCATE(ZZM)
 DEALLOCATE(ZX_RAY,ZY_RAY)
 DEALLOCATE(TVARMOD,TVARRAD)
 !
diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90
index 67dba74ce1cb8bd2ac34828a4c76762d5c1056f1..5c0191e379d5870cb55395474020775638db9efe 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.f90
@@ -134,7 +134,7 @@ USE MODD_CH_AEROSOL,  ONLY: LORILAM
 USE MODD_CONF,        ONLY: LCARTESIAN
 USE MODD_CST
 USE MODD_DUST,        ONLY: LDUST
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_GRID ,       ONLY: XLAT0, XLON0
 USE MODD_GRID_n ,     ONLY: XLAT, XLON
 USE MODD_IO,          ONLY: TFILEDATA
@@ -536,7 +536,7 @@ CHARACTER (LEN=2)               :: YDIR        ! Type of the data field
 INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes)
 INTEGER :: JSWB ! loop on SW spectral bands
 INTEGER :: JAE  ! loop on aerosol class
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D
 !
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST
 REAL :: ZMINVAL
@@ -898,7 +898,7 @@ IF (CAOP=='EXPL') THEN
   
  IF (LORILAM) THEN
    CALL AEROOPT_GET(                             &
-        PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND)        &  !I [ppp]  aerosols concentration
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND)        &  !I [ppv]  aerosols concentration
         ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
         ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
         ,ZPIZA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)   &  !O [-] single scattering albedo of aerosols
@@ -912,7 +912,7 @@ IF (CAOP=='EXPL') THEN
  ENDIF
  IF(LDUST) THEN
    CALL DUSTOPT_GET(                             &
-        PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND)        &  !I [ppp] Dust scalar concentration
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND)        &  !I [ppv] Dust scalar concentration
         ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
         ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
         ,ZPIZA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)   &  !O [-] single scattering albedo of dust
@@ -927,7 +927,7 @@ IF (CAOP=='EXPL') THEN
  ENDIF
  IF(LSALT) THEN
    CALL SALTOPT_GET(                             &
-        PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND)        &  !I [ppp] sea salt scalar concentration
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND)        &  !I [ppv] sea salt scalar concentration
         ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
         ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
         ,PTHT(IIB:IIE,IJB:IJE,:)                  &  !I [K] potential temperature
@@ -2686,6 +2686,24 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
   ZSTORE_3D2(:,:,:) = 0.0
   ZSTORE_2D(:,:)   = 0.0
   !
+  TZFIELD2D = TFIELDMETADATA(                 &
+    CMNHNAME   = 'generic 2D for radiations', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 2,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  TZFIELD3D = TFIELDMETADATA(                 &
+    CMNHNAME   = 'generic 3D for radiations', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+
   IF( KRAD_DIAG >= 1) THEN
     !
     ILUOUT = TLUOUT%NLU
@@ -2700,17 +2718,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_DOWN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_DOWN'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_DOWN'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_DOWN'
+    TZFIELD3D%CLONGNAME  = 'SWF_DOWN'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2721,17 +2733,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_UP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_UP'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_UP'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_UP'
+    TZFIELD3D%CLONGNAME  = 'SWF_UP'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2742,17 +2748,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_DOWN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_DOWN'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_DOWN'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_DOWN'
+    TZFIELD3D%CLONGNAME  = 'LWF_DOWN'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2763,17 +2763,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_UP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_UP'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_UP'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_UP'
+    TZFIELD3D%CLONGNAME  = 'LWF_UP'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2784,17 +2778,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_NET'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_NET'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_NET'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_NET'
+    TZFIELD3D%CLONGNAME  = 'LWF_NET'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_NET'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2805,17 +2793,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_NET'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_NET'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_NET'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_NET'
+    TZFIELD3D%CLONGNAME  = 'SWF_NET'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_NET'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       DO JJ=IJB,IJE
@@ -2824,17 +2806,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'DTRAD_LW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DTRAD_LW'
-    TZFIELD%CUNITS     = 'K day-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_LW'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'DTRAD_LW'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_LW'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_LW'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       DO JJ=IJB,IJE
@@ -2843,17 +2819,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'DTRAD_SW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DTRAD_SW'
-    TZFIELD%CUNITS     = 'K day-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_SW'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'DTRAD_SW'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_SW'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_SW'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2861,17 +2831,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADSWD_VIS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADSWD_VIS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_VIS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADSWD_VIS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
 !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2879,17 +2843,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADSWD_NIR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADSWD_NIR'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_NIR'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADSWD_NIR'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2897,17 +2855,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADLWD'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADLWD'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADLWD'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADLWD'
+    TZFIELD2D%CLONGNAME  = 'RADLWD'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADLWD'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
   END IF
   !
   !
@@ -2921,17 +2873,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_DOWN_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_DOWN_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_DOWN_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_DOWN_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_DOWN_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_DOWN_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2942,17 +2888,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_UP_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_UP_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_UP_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_UP_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_UP_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_UP_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2963,17 +2903,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_DOWN_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_DOWN_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_DOWN_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_DOWN_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_DOWN_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_DOWN_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2984,17 +2918,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_UP_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_UP_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_UP_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_UP_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_UP_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_UP_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3005,17 +2933,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'LWF_NET_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWF_NET_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_NET_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'LWF_NET_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_NET_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_NET_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3026,17 +2948,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SWF_NET_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWF_NET_CS'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_NET_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SWF_NET_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_NET_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_NET_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK-JPVEXT
@@ -3047,17 +2963,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'DTRAD_SW_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DTRAD_SW_CS'
-    TZFIELD%CUNITS     = 'K day-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_SW_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'DTRAD_SW_CS'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_SW_CS'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_SW_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK-JPVEXT
@@ -3068,17 +2978,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'DTRAD_LW_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DTRAD_LW_CS'
-    TZFIELD%CUNITS     = 'K day-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_LW_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'DTRAD_LW_CS'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_LW_CS'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_LW_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3086,17 +2990,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADSWD_VIS_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADSWD_VIS_CS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_VIS_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADSWD_VIS_CS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_VIS_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_VIS_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3104,17 +3002,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADSWD_NIR_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADSWD_NIR_CS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_NIR_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADSWD_NIR_CS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_NIR_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_NIR_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3122,17 +3014,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RADLWD_CS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RADLWD_CS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_RADLWD_CS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'RADLWD_CS'
+    TZFIELD2D%CLONGNAME  = 'RADLWD_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADLWD_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
   END IF
   !
   !
@@ -3143,17 +3029,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_ALB_VIS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_ALB_VIS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ALB_VIS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_ALB_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ALB_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ALB_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3161,17 +3041,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_ALB_NIR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_ALB_NIR'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ALB_NIR'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_ALB_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ALB_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ALB_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3179,17 +3053,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_TRA_VIS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_TRA_VIS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_TRA_VIS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_TRA_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_TRA_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_TRA_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3197,17 +3065,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_TRA_NIR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_TRA_NIR'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_TRA_NIR'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_TRA_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_TRA_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_TRA_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3215,17 +3077,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_ABS_VIS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_ABS_VIS'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ABS_VIS'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_ABS_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ABS_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ABS_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -3233,17 +3089,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ)
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'PLAN_ABS_NIR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'PLAN_ABS_NIR'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ABS_NIR'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D)
+    TZFIELD2D%CMNHNAME   = 'PLAN_ABS_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ABS_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ABS_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
     !
     !
   END IF
@@ -3259,17 +3109,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'EFNEB_DOWN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'EFNEB_DOWN'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_EFNEB_DOWN'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'EFNEB_DOWN'
+    TZFIELD3D%CLONGNAME  = 'EFNEB_DOWN'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_EFNEB_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3280,17 +3124,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'EFNEB_UP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'EFNEB_UP'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_EFNEB_UP'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'EFNEB_UP'
+    TZFIELD3D%CLONGNAME  = 'EFNEB_UP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_EFNEB_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3301,17 +3139,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'FLWP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'FLWP'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_FLWP'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'FLWP'
+    TZFIELD3D%CLONGNAME  = 'FLWP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_FLWP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3322,17 +3154,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'FIWP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'FIWP'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_FIWP'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'FIWP'
+    TZFIELD3D%CLONGNAME  = 'FIWP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_FIWP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3343,17 +3169,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'EFRADL'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'EFRADL'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_RAD_microm'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'EFRADL'
+    TZFIELD3D%CLONGNAME  = 'EFRADL'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     ! 
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3364,17 +3184,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'EFRADI'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'EFRADI'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_RAD_microm'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'EFRADI'
+    TZFIELD3D%CLONGNAME  = 'EFRADI'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3385,17 +3199,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'SW_NEB'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SW_NEB'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_SW_NEB'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'SW_NEB'
+    TZFIELD3D%CLONGNAME  = 'SW_NEB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SW_NEB'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3406,17 +3214,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'RRTM_LW_NEB'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'RRTM_LW_NEB'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LW_NEB'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'RRTM_LW_NEB'
+    TZFIELD3D%CLONGNAME  = 'RRTM_LW_NEB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LW_NEB'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     !
     ! spectral bands
     IF (KSWB_OLD==6) THEN
@@ -3433,41 +3235,23 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
     END DO
 !
     DO JBAND=1,KSWB_OLD
-      TZFIELD%CMNHNAME   = 'ODAER_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_OD_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZTAUAZ(:,:,:,JBAND))
+      TZFIELD3D%CMNHNAME   = 'ODAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'ODAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_OD_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZTAUAZ(:,:,:,JBAND))
       !
-      TZFIELD%CMNHNAME   = 'SSAAER_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPIZAZ(:,:,:,JBAND))
+      TZFIELD3D%CMNHNAME   = 'SSAAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'SSAAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZPIZAZ(:,:,:,JBAND))
       !
-      TZFIELD%CMNHNAME   = 'GAER_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_G_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZCGAZ(:,:,:,JBAND))
+      TZFIELD3D%CMNHNAME   = 'GAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'GAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_G_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZCGAZ(:,:,:,JBAND))
     ENDDO
 
     DO JBAND=1,KSWB_OLD
@@ -3480,17 +3264,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      TZFIELD%CMNHNAME   = 'OTH_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+      TZFIELD3D%CMNHNAME   = 'OTH_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'OTH_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
       !
       DO JK=IKB,IKE
         JKRAD = JK - JPVEXT
@@ -3501,17 +3279,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      TZFIELD%CMNHNAME   = 'SSA_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+      TZFIELD3D%CMNHNAME   = 'SSA_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'SSA_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
       !
       DO JK=IKB,IKE
         JKRAD = JK - JPVEXT
@@ -3522,17 +3294,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      TZFIELD%CMNHNAME   = 'ASF_'//YBAND_NAME(JBAND)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND)
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+      TZFIELD3D%CMNHNAME   = 'ASF_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'ASF_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
     END DO
   END IF
   !
@@ -3550,17 +3316,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    TZFIELD%CMNHNAME   = 'O3CLIM'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'O3CLIM'
-    TZFIELD%CUNITS     = 'Pa Pa-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_O3'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D)
+    TZFIELD3D%CMNHNAME   = 'O3CLIM'
+    TZFIELD3D%CLONGNAME  = 'O3CLIM'
+    TZFIELD3D%CUNITS     = 'Pa Pa-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_O3'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
 ! 
 !cumulated optical thickness of aerosols
 !cumul begin from the top of the domain, not from the TOA !      
@@ -3581,17 +3341,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
-    TZFIELD%CMNHNAME   = 'CUM_AER_LAND'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_LAND'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_LAND'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_LAND'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
 !
 ! sea
     DO JK=IKB,IKE
@@ -3610,17 +3364,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    TZFIELD%CMNHNAME   = 'CUM_AER_SEA'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_SEA'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_SEA'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_SEA'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
 !
 ! desert
     DO JK=IKB,IKE
@@ -3639,17 +3387,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !    
-    TZFIELD%CMNHNAME   = 'CUM_AER_DES'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_DES'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_DES'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_DES'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
 !
 ! urban
     DO JK=IKB,IKE
@@ -3668,17 +3410,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    TZFIELD%CMNHNAME   = 'CUM_AER_URB'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_URB'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_URB'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_URB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
 !
 ! Volcanoes
     DO JK=IKB,IKE
@@ -3697,17 +3433,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    TZFIELD%CMNHNAME   = 'CUM_AER_VOL'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_VOL'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_VOL'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_VOL'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
 !
 ! stratospheric background
     DO JK=IKB,IKE
@@ -3726,17 +3456,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    TZFIELD%CMNHNAME   = 'CUM_AER_STRB'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'CUM_AER_STRB'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2)
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_STRB'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_STRB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
   ENDIF
 END IF
 !
diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index ec83d1da95759f639525edda2af8fe611b989ce3..4e03378378ef394b67c2644ca79352602f39b2e6 100644
--- a/src/MNH/read_all_data_grib_case.f90
+++ b/src/MNH/read_all_data_grib_case.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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.
@@ -371,12 +371,8 @@ ALLOCATE (ZXM(IIU,IJU))
 ALLOCATE (ZYM(IIU,IJU))
 ALLOCATE (ZLONM(IIU,IJU))
 ALLOCATE (ZLATM(IIU,IJU))
-ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2.
-ZXM(IIU,1)     = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1)
-ZXM(:,2:IJU)   = SPREAD(ZXM(:,1),2,IJU-1)
-ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2.
-ZYM(1,IJU)     = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1)
-ZYM(2:IIU,:)   = SPREAD(ZYM(1,:),1,IIU-1)
+ZXM(:,:) = SPREAD(XXHATM(:),2,IJU)
+ZYM(:,:) = SPREAD(XYHATM(:),1,IIU)
 CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, &
                       IIU,IJU)
 ALLOCATE (ZLONOUT(INO))
@@ -1363,7 +1359,7 @@ IF (IMODEL==5) THEN
   XSV_LS(:,:,:,:) = 0.
   ILEV1=-1
 !
-  WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppp) from ',HFILE,' file'
+  WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppv) from ',HFILE,' file'
 !
 !*       2.6.1  read mocage species
 !
diff --git a/src/MNH/read_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90
index 89ab3518c9bb0b4ad0152fdc980b49cd1d630355..ec6421713a1541e9b1f4f2f32460b345398177e1 100644
--- a/src/MNH/read_cams_data_netcdf_case.f90
+++ b/src/MNH/read_cams_data_netcdf_case.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2012-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2012-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.
@@ -88,8 +88,8 @@ END MODULE MODI_READ_CAMS_DATA_NETCDF_CASE
 !------------
 !
 USE MODD_CH_AEROSOL, ONLY: CORGANIC, NCARB, NSOA, NSP, LORILAM,&
-                           JPMODE, LVARSIGI, LVARSIGJ,CAERONAMES
-USE MODD_CH_M9_n,    ONLY: NEQ ,  CNAMES
+                           JPMODE, LVARSIGI, LVARSIGJ
+USE MODD_CH_M9_n,    ONLY: NEQ
 USE MODD_CH_MNHC_n,  ONLY: LUSECHEM,LUSECHAQ,LUSECHIC,LCH_PH
 USE MODD_CONF
 USE MODD_CONF_n
@@ -207,12 +207,8 @@ ALLOCATE (ZXM(IIU,IJU))
 ALLOCATE (ZYM(IIU,IJU))
 ALLOCATE (ZLONM(IIU,IJU))
 ALLOCATE (ZLATM(IIU,IJU))
-ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2.
-ZXM(IIU,1)     = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1)
-ZXM(:,2:IJU)   = SPREAD(ZXM(:,1),2,IJU-1)
-ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2.
-ZYM(1,IJU)     = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1)
-ZYM(2:IIU,:)   = SPREAD(ZYM(1,:),1,IIU-1)
+ZXM(:,:) = SPREAD(XXHATM(:),2,IJU)
+ZYM(:,:) = SPREAD(XYHATM(:),1,IIU)
 CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, &
                       IIU,IJU)
 ALLOCATE (ZLONOUT(INO))
diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90
index 3ecc3f594c36347e046515c7e9a5995490a3ad02..2648709e0c93aed6ecd7ca7c21a4727a94d9881b 100644
--- a/src/MNH/read_chem_data_netcdf_case.f90
+++ b/src/MNH/read_chem_data_netcdf_case.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2012-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2012-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.
@@ -238,12 +238,8 @@ ALLOCATE (ZXM(IIU,IJU))
 ALLOCATE (ZYM(IIU,IJU))
 ALLOCATE (ZLONM(IIU,IJU))
 ALLOCATE (ZLATM(IIU,IJU))
-ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2.
-ZXM(IIU,1)     = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1)
-ZXM(:,2:IJU)   = SPREAD(ZXM(:,1),2,IJU-1)
-ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2.
-ZYM(1,IJU)     = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1)
-ZYM(2:IIU,:)   = SPREAD(ZYM(1,:),1,IIU-1)
+ZXM(:,:) = SPREAD(XXHATM(:),2,IJU)
+ZYM(:,:) = SPREAD(XYHATM(:),1,IIU)
 CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, &
                       IIU,IJU)
 ALLOCATE (ZLONOUT(INO))
@@ -443,7 +439,7 @@ enddo
     ALLOCATE (XSV_LS(IIU,IJU,ilevlen,NSV))
    XSV_LS(:,:,:,:) = 0.
 !
-  WRITE (ILUOUT0,'(A,A4,A)') ' | Reading MOZART species (ppp) from ',HFILE,' file'
+  WRITE (ILUOUT0,'(A,A4,A)') ' | Reading MOZART species (ppv) from ',HFILE,' file'
 
 where (ZLONOUT(:) < 0.) ZLONOUT(:) = ZLONOUT(:) + 360.
 !
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 7485c40400d62925d39db8b9d8ee33b2fba9bc5b..8a69a7f9c641da3c0015298e0e6768db47c3e196 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.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.
@@ -196,7 +196,8 @@ END MODULE MODI_READ_DESFM_n
 !!      Modification   02/2021   (F.Auguste)  add IBM
 !!                               (T.Nagel)    add turbulence recycling
 !!                               (E.Jezequel) add stations read from CSV file
-!!      Modifications  12/2021   (A. Costes)  add Blaze fire model
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -265,9 +266,11 @@ USE MODN_LATZ_EDFLX
 USE MODN_2D_FRC
 USE MODN_BLOWSNOW_n
 USE MODN_BLOWSNOW
+USE MODN_PROFILER_n
 USE MODN_STATION_n
 !
 USE MODN_PARAM_LIMA
+! USE MODN_FLYERS
 !
 USE MODE_MSG
 USE MODE_POS
@@ -477,6 +480,12 @@ IF (GFOUND) THEN
   READ(UNIT=ILUDES,NML=NAM_BLANKn)
   CALL UPDATE_NAM_BLANKn
 END IF
+CALL POSNAM(ILUDES,'NAM_PROFILERN',GFOUND,ILUOUT)
+CALL INIT_NAM_PROFILERn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_PROFILERN)
+  CALL UPDATE_NAM_PROFILERn
+END IF
 CALL POSNAM(ILUDES,'NAM_STATIONN',GFOUND,ILUOUT)
 CALL INIT_NAM_STATIONn
 IF (GFOUND) THEN
@@ -544,7 +553,7 @@ IF (KMI == 1) THEN
     READ(UNIT=ILUDES,NML=NAM_OUTPUT)
   END IF
 ! Note: it is not useful to read the budget namelists in the .des files
-! The value here (if present in file) don't need to be compared with the ones in the EXSEGn files
+! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files
 !   CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
 !   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
 !   CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND)
@@ -622,7 +631,15 @@ IF (KMI == 1) THEN
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX)
   CALL POSNAM(ILUDES,'NAM_VISC',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC)
-END IF                                                       
+! Note: it is not useful to read the FLYERS/AIRCRAFTS/BALLOONS namelists in the .des files
+! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files
+!   CALL POSNAM(ILUDES,'NAM_FLYERS',GFOUND,ILUOUT)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FLYERS)
+!   CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT)
+!   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+!   CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT)
+!   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS)
+END IF
 !
 !-------------------------------------------------------------------------------
 !
@@ -652,7 +669,7 @@ OSALT    = LSALT
 OORILAM  = LORILAM
 OLG      = LLG
 OPASPOL  = LPASPOL
-OFIRE  = LBLAZE
+OFIRE    = LBLAZE
 #ifdef MNH_FOREFIRE
 OFOREFIRE  = LFOREFIRE
 #endif
@@ -741,6 +758,9 @@ IF (NVERB >= 10) THEN
 !
   WRITE(UNIT=ILUOUT,FMT="('********** BLANKn ******************')")
   WRITE(UNIT=ILUOUT,NML=NAM_BLANKn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** PROFILERn *****************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PROFILERn)
 !
   WRITE(UNIT=ILUOUT,FMT="('********** STATIONn ******************')")
   WRITE(UNIT=ILUOUT,NML=NAM_STATIONn)
@@ -826,16 +846,16 @@ IF (NVERB >= 10) THEN
     WRITE(UNIT=ILUOUT,NML=NAM_VISC)
 !
 #ifdef MNH_FOREFIRE
-	WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE  ***************')")
-	WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE)
+    WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE  ***************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE)
 !
-#endif	
+#endif
+!
+    IF ( LBLAZE ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_FIRE)
+    END IF
 !
-IF (LBLAZE) THEN
-  WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')")
-  WRITE(UNIT=ILUOUT,NML=NAM_FIRE)
-END IF
-!	
     WRITE(UNIT=ILUOUT,FMT="('************ CONDITIONAL SAMPLING *************')")
     WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP)
  !
diff --git a/src/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90
index 80f9ceefd4eb572e8c9f69a5eace441a7a0d2da6..edb10fbbff5cce332b47fe0b5307f160680a56c4 100644
--- a/src/MNH/read_dummy_gr_fieldn.f90
+++ b/src/MNH/read_dummy_gr_fieldn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2021 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.
@@ -74,7 +74,7 @@ END MODULE MODI_READ_DUMMY_GR_FIELD_n
 !*       0.    DECLARATIONS
 !
 USE MODD_DUMMY_GR_FIELD_n
-use modd_field,         only: tfielddata, TYPEINT, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPEINT, TYPEREAL
 USE MODD_GRID_n
 USE MODD_IO,            ONLY: TFILEDATA
 USE MODD_PARAMETERS,    ONLY: JPHEXT, NMNHNAMELGTMAX
@@ -106,7 +106,7 @@ INTEGER                           :: IIINF  ! lower I index
 INTEGER                           :: IISUP  ! upper I index
 INTEGER                           :: IJINF  ! lower J index
 INTEGER                           :: IJSUP  ! upper J index
-TYPE(TFIELDDATA)                  :: TZFIELD
+TYPE(TFIELDMETADATA)              :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -147,16 +147,17 @@ END IF
 !
 !
 IF (TPINIFILE%NMNHVERSION(1)>=4) THEN
-  TZFIELD%CMNHNAME   = 'DUMMY_GR_NBR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'DUMMY_GR_NBR'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'number of dummy pgd fields chosen by user'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                                   &
+    CMNHNAME   = 'DUMMY_GR_NBR',                              &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = 'DUMMY_GR_NBR',                              &
+    CUNITS     = '',                                          &
+    CDIR       = '--',                                        &
+    CCOMMENT   = 'number of dummy pgd fields chosen by user', &
+    NGRID      = 0,                                           &
+    NTYPE      = TYPEINT,                                     &
+    NDIMS      = 0,                                           &
+    LTIMEDEP   = .FALSE.                                      )
   !
   CALL IO_Field_read(TPINIFILE,TZFIELD,NDUMMY_GR_NBR,IRESP)
   !
@@ -176,18 +177,19 @@ ALLOCATE(XDUMMY_GR_FIELDS(SIZE(XXHAT),SIZE(XYHAT),NDUMMY_GR_NBR))
 !
 DO JDUMMY=1,NDUMMY_GR_NBR
   WRITE(YRECFM,'(A8,I3.3)') 'DUMMY_GR',JDUMMY
-  TZFIELD%CMNHNAME   = TRIM(YRECFM)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(YRECFM)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  ! Expected comment is not known but is in the following form:
-  ! 'X_Y_'//TRIM(YRECFM)//YSTRING20//YSTRING03
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = TRIM(YRECFM), &
+    CSTDNAME   = '',           &
+    CLONGNAME  = TRIM(YRECFM), &
+    CUNITS     = '',           &
+    CDIR       = 'XY',         &
+    ! Expected comment is not known but is in the following form:
+    ! 'X_Y_'//TRIM(YRECFM)//YSTRING20//YSTRING03
+    CCOMMENT   = '',           &
+    NGRID      = 4,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
   !
   CALL IO_Field_read(TPINIFILE,TZFIELD,ZWORK(:,:),IRESP)
   !
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 0b419f28d03401f39a5a83a42ca2155b1ec632b8..0f2ceab346b4416ee5aa1546b9a018094fec621c 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -1,4 +1,4 @@
-!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.
@@ -304,11 +304,15 @@ END MODULE MODI_READ_EXSEG_n
 !  R. Honnert  23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT
 !  S. Riette   11/05/2021  HighLow cloud
 !  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !  P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables
+!  P. Wautelet 13/07/2022: add namelist for flyers and balloons
+!  P. Wautelet 19/08/2022: add namelist for aircrafts
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
+USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS
 USE MODD_BLOWSNOW
 USE MODD_BUDGET
 USE MODD_CH_AEROSOL
@@ -342,7 +346,9 @@ USE MODI_TEST_NAM_VAR
 
 USE MODN_2D_FRC
 USE MODN_ADV_n      ! The final filling of these modules for the model n is
+USE MODN_AIRCRAFTS, ONLY: AIRCRAFTS_NML_ALLOCATE, NAM_AIRCRAFTS
 USE MODN_BACKUP
+USE MODN_BALLOONS,  ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS
 USE MODN_BLANK_n
 USE MODN_BLOWSNOW
 USE MODN_BLOWSNOW_n
@@ -364,6 +370,7 @@ USE MODN_ELEC
 USE MODN_EOL
 USE MODN_EOL_ADNR
 USE MODN_EOL_ALM
+USE MODN_FLYERS
 #ifdef MNH_FOREFIRE
 USE MODN_FOREFIRE
 #endif
@@ -393,6 +400,7 @@ USE MODN_PARAM_MFSHALL_n
 USE MODN_PARAM_n    ! realized in subroutine ini_model n
 USE MODN_PARAM_RAD_n
 USE MODN_PASPOL
+USE MODN_PROFILER_n
 USE MODN_RECYCL_PARAM_n
 USE MODN_SALT
 USE MODN_SERIES
@@ -502,6 +510,7 @@ CALL INIT_NAM_CH_MNHCN
 CALL INIT_NAM_CH_SOLVERN
 CALL INIT_NAM_SERIESN
 CALL INIT_NAM_BLOWSNOWN
+CALL INIT_NAM_PROFILERn
 CALL INIT_NAM_STATIONn
 !
 WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')")
@@ -557,6 +566,8 @@ CALL POSNAM(ILUSEG,'NAM_EOL_ADNR',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR)
 CALL POSNAM(ILUSEG,'NAM_EOL_ALM',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM)
+CALL POSNAM(ILUSEG,'NAM_PROFILERN',GFOUND,ILUOUT)
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn)
 CALL POSNAM(ILUSEG,'NAM_STATIONN',GFOUND,ILUOUT)
 IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn)
 !
@@ -847,6 +858,21 @@ IF (KMI == 1) THEN
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW)
   CALL POSNAM(ILUSEG,'NAM_VISC',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC)
+
+  CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT)
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS)
+
+  IF ( NAIRCRAFTS > 0 ) THEN
+    CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS )
+    CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT)
+    IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+  END IF
+
+  IF ( NBALLOONS > 0 ) THEN
+    CALL BALLOONS_NML_ALLOCATE( NBALLOONS )
+    CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT)
+    IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS)
+  END IF
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -3035,6 +3061,7 @@ CALL UPDATE_NAM_CH_MNHCN
 CALL UPDATE_NAM_CH_SOLVERN
 CALL UPDATE_NAM_SERIESN
 CALL UPDATE_NAM_BLOWSNOWN
+CALL UPDATE_NAM_PROFILERn
 CALL UPDATE_NAM_STATIONn
 !-------------------------------------------------------------------------------
 WRITE(UNIT=ILUOUT,FMT='(/)')
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 32ef01869fd487a49b35919b4b0fb0f881de477a..b55c45de3ce68f708be765dc50f95eaa0c7001ab 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.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.
@@ -47,8 +47,9 @@ CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
                                           HGETRVT,HGETRCT,HGETRRT,           &
                                           HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
                                           HGETCIT,HGETSRCT, HGETZWS,         &
-                                          HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH,   &
-                                          HGETSBL_DEPTH,HGETPHC,HGETPHR
+                                          HGETSIGS, HGETCLDFR, HGETICEFR,    &
+                                          HGETBL_DEPTH, HGETSBL_DEPTH,       &
+                                          HGETPHC, HGETPHR
 CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
 !
 ! GET indicators to know wether a given  variable should or not be read in the
@@ -259,61 +260,50 @@ END MODULE MODI_READ_FIELD
 !!          C.Lac        10/16 CEN4TH with RKC4 + Correction on RK loop
 !!                   09/2017 Q.Rodier add LTEND_UV_FRC
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!          V. Vionnet  07/17    add blowing snow scheme
-!!          P. Wautelet 01/2019  corrected intent of PDUM,PDVM,PDWM (OUT->INOUT)
+!  V. Vionnet       07/17:   add blowing snow scheme
+!  P. Wautelet    01/2019:  corrected intent of PDUM,PDVM,PDWM (OUT->INOUT)
 !  P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT))
-!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  S. Bielli      02/2019:  Sea salt : significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
 !  M. Leriche  10/06/2019: in restart case read all immersion modes for LIMA
-!! B. Vie         06/2020: Add prognostic supersaturation for LIMA
-!! F. Auguste  02/2021: add fields necessary for IBM
-!! T. Nagel    02/2021: add fields necessary for turbulence recycling
-!! J.L. Redelsperger 03/2021:  add necessary variables for Ocean LES case
-!! A. Costes   12/2021: add Blaze fire model
+!  B. Vie         06/2020: Add prognostic supersaturation for LIMA
+!  F. Auguste     02/2021: add fields necessary for IBM
+!  T. Nagel       02/2021: add fields necessary for turbulence recycling
+!  JL. Redelsperger 03/2021:  add necessary variables for Ocean LES case
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !!-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_2D_FRC
-USE MODD_ADV_n
-USE MODD_BLOWSNOW
-USE MODD_BLOWSNOW_n
-USE MODD_CH_AEROSOL
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
-USE MODD_CONF
-USE MODD_CONF_n
-USE MODD_CST
-USE MODD_CTURB
-USE MODD_DUST
+USE MODD_2D_FRC,          ONLY: L2D_ADV_FRC, L2D_REL_FRC
+USE MODD_ADV_n,           ONLY: CTEMP_SCHEME, LSPLIT_CFL
+USE MODD_BLOWSNOW_n,      ONLY: XSNWCANO
+USE MODD_CONF,            ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB
+USE MODD_CONF_n,          ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT
+USE MODD_CST,             ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD
+USE MODD_CTURB,           ONLY: XTKEMIN
 USE MODD_DYN_n,           ONLY: LOCEAN
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-use modd_field,           only: tfielddata, tfieldlist, TYPEDATE, TYPEREAL,TYPELOG,TYPEINT
+use modd_field,           only: tfieldmetadata, tfieldlist, TYPEDATE, TYPEREAL, TYPELOG, TYPEINT
 USE MODD_FIELD_n,         only: XZWS_DEFAULT
-#ifdef MNH_FOREFIRE
-USE MODD_FOREFIRE
-#endif
+USE MODD_FIRE,            ONLY: CWINDFILTER, LBLAZE, LRESTA_ASE, LRESTA_AWC, LRESTA_EWAM, LRESTA_WLIM, LWINDFILTER
 USE MODD_IBM_PARAM_n,     ONLY: LIBM
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LATZ_EDFLX
-USE MODD_LG,              ONLY: CLGNAMES
+USE MODD_LATZ_EDFLX,      ONLY: LTH_FLX, LUV_FLX
 USE MODD_LUNIT_N,         ONLY: TLUOUT
-USE MODD_NSV
-USE MODD_OCEANH
+USE MODD_NSV,             ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, &
+#ifdef MNH_FOREFIRE
+                                NSV_FFBEG, NSV_FFEND,                                &
+#endif
+                                NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST
+USE MODD_OCEANH,          ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T
 USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
-!
-USE MODD_PARAM_LIMA     , ONLY: NMOD_CCN, LSCAV, LAERO_MASS,                &
-                                NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
+USE MODD_PARAMETERS,      ONLY: XUNDEF
 USE MODD_PARAM_n,         ONLY: CSCONV
-USE MODD_PASPOL
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_RECYCL_PARAM_n
+USE MODD_RECYCL_PARAM_n,  ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT
 USE MODD_REF,             ONLY: LCOUPLES
-USE MODD_SALT
-USE MODD_TIME ! for type DATE_TIME
+USE MODD_TIME,            ONLY: DATE_TIME
 !
 use mode_field,           only: Find_field_id_from_mnhname
 USE MODE_IO_FIELD_READ,   only: IO_Field_read
@@ -323,8 +313,6 @@ USE MODE_TOOLS,           ONLY: UPCASE
 USE MODI_INI_LB
 USE MODI_INI_LS
 !
-USE MODD_FIRE,            ONLY: LBLAZE, LRESTA_ASE, LRESTA_AWC, LWINDFILTER, LRESTA_EWAM, LRESTA_WLIM, CWINDFILTER
-!
 IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
@@ -339,9 +327,10 @@ INTEGER,                   INTENT(IN)  :: KIU, KJU, KKU
 CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
                                           HGETRVT,HGETRCT,HGETRRT,           &
                                           HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
-                                          HGETCIT,HGETSRCT,HGETZWS,          &
-                                          HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH, &
-                                          HGETSBL_DEPTH,HGETPHC,HGETPHR
+                                          HGETCIT,HGETSRCT, HGETZWS,         &
+                                          HGETSIGS, HGETCLDFR, HGETICEFR,    &
+                                          HGETBL_DEPTH, HGETSBL_DEPTH,       &
+                                          HGETPHC, HGETPHR
 CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
 !
 ! GET indicators to know wether a given  variable should or not be read in the
@@ -447,11 +436,12 @@ INTEGER                      :: IIUP,IJUP    ! size  of working window arrays
 INTEGER                      :: JT           ! loop index
 LOGICAL                      :: GLSOURCE     ! switch for the source term (for ini_ls and ini_lb)
 LOGICAL                      :: ZLRECYCL     ! switch if turbulence recycling is activated
-CHARACTER(LEN=2)             :: INDICE
+LOGICAL                      :: GOLDFILEFORMAT
 CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
+CHARACTER(LEN=3)             :: YNUM3
 CHARACTER(LEN=15)            :: YVAL
 REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
-TYPE(TFIELDDATA)             :: TZFIELD
+TYPE(TFIELDMETADATA)         :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -461,6 +451,9 @@ TYPE(TFIELDDATA)             :: TZFIELD
 GLSOURCE=.FALSE.
 ZWORK = 0.0
 !
+!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
+                   .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
 !-------------------------------------------------------------------------------
 !
 !*       2.    READ PROGNOSTIC VARIABLES
@@ -470,27 +463,27 @@ ZWORK = 0.0
 !
 IF (TPINIFILE%NMNHVERSION(1)<5) THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('UT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'UM'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PUT)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('VT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'VM'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PVT)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'WM'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PWT)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('THT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'THM'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PTHT)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'PABSM'
   CALL IO_Field_read(TPINIFILE,TZFIELD,PPABST)
 ELSE
@@ -505,7 +498,7 @@ SELECT CASE(HGETTKET)
   CASE('READ')
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('TKET',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'TKEM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PTKET)
     ELSE
@@ -539,7 +532,7 @@ SELECT CASE(HGETRVT)             ! vapor
   CASE('READ')
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RVM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RVT))
     ELSE
@@ -553,7 +546,7 @@ SELECT CASE(HGETRCT)             ! cloud
   CASE('READ') 
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RCM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RCT))
     ELSE
@@ -567,7 +560,7 @@ SELECT CASE(HGETRRT)             ! rain
   CASE('READ') 
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RRM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RRT))
     ELSE
@@ -581,7 +574,7 @@ SELECT CASE(HGETRIT)             ! cloud ice
   CASE('READ') 
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RIM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RIT))
     ELSE
@@ -595,7 +588,7 @@ SELECT CASE(HGETRST)             ! snow
   CASE('READ')
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RSM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RST))
     ELSE
@@ -609,7 +602,7 @@ SELECT CASE(HGETRGT)             ! graupel
   CASE('READ') 
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RGM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RGT))
     ELSE
@@ -623,7 +616,7 @@ SELECT CASE(HGETRHT)             ! hail
   CASE('READ') 
     IF (TPINIFILE%NMNHVERSION(1)<5) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'RHM'
       CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RHT))
     ELSE
@@ -836,554 +829,30 @@ IF (ZLRECYCL) THEN
     ENDIF
   ENDIF  
 ENDIF
-!
-!  Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV
-!
-ISV= SIZE(PSVT,4)
-!
-IF (NSV_USER>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = 1, NSV_USER              ! initialize according to the get indicators
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_C2R2BEG,NSV_C2R2END
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-        IF (LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
-          ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
-          ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
-          ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*ALOG(ZWORK(:,:,:)))
-          !rvsat
-          ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
-          ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:)
-          PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:)
-        END IF
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_C1R3BEG,NSV_C1R3END
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-! LIMA variables
-!
-DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    TZFIELD%CSTDNAME   = ''
-    WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CUNITS     = 'kg-1'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-! Nc
-    IF (JSV .EQ. NSV_LIMA_NC) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(1))//'T'
-    END IF
-! Nr
-    IF (JSV .EQ. NSV_LIMA_NR) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(2))//'T'
-    END IF
-! N CCN free
-    IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
-    END IF
-! N CCN acti
-    IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
-    END IF
-! Scavenging
-    IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
-      TZFIELD%CUNITS     = 'kg kg-1'
-    END IF
-! Ni
-    IF (JSV .EQ. NSV_LIMA_NI) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(1))//'T'
-    END IF
-! Ns
-    IF (JSV .EQ. NSV_LIMA_NS) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(2))//'T'
-    END IF
-! Ng
-    IF (JSV .EQ. NSV_LIMA_NG) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(3))//'T'
-    END IF
-! Nh
-    IF (JSV .EQ. NSV_LIMA_NH) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//'T'
-    END IF
-! N IFN free
-    IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T'
-    END IF
-! N IFN nucl
-    IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T'
-    END IF
-! N IMM nucl
-    IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-      WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T'
-    END IF
-! Hom. freez. of CCN
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(8))//'T'
-    END IF
-!
-! Super saturation      
-    IF (JSV .EQ. NSV_LIMA_SPRO) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(5))//'T'
-    END IF
-!
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
-!
-IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_ELECBEG,NSV_ELECEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN
-          TZFIELD%CUNITS     = 'C m-3'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        ELSE
-          TZFIELD%CUNITS     = 'm-3'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
-        END IF
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHGSBEG,NSV_CHGSEND
-    CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_CHACEND>=NSV_CHACBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  !PW TODO: check units
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHACBEG,NSV_CHACEND
-    CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHAQ',JSV,' (M)'
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-!***ATTENTION: BUG ? field written with a M suffix, read with a T suffix
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_CHICEND>=NSV_CHICBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHICBEG,NSV_CHICEND
-    CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_SLTEND>=NSV_SLTBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_SLTBEG,NSV_SLTEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_DSTEND>=NSV_DSTBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_DSTBEG,NSV_DSTEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_AEREND>=NSV_AERBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_AERBEG,NSV_AEREND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_LGEND>=NSV_LGBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_LGBEG,NSV_LGEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_PPEND>=NSV_PPBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_PPBEG,NSV_PPEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CUNITS     = 'kg kg-1'
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP)
-        IF (IRESP/=0) THEN
-          PSVT(:,:,:,JSV) = 0.
-        END IF
-        !
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
-        TZFIELD%CUNITS     = 'm-3'
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PATC(:,:,:,JSV-NSV_PPBEG+1),IRESP)
-        IF (IRESP/=0) THEN
-          PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
-        ENDIF
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-        PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
-    END SELECT
-  END DO
-END IF
-!
-#ifdef MNH_FOREFIRE
-IF (NSV_FFEND>=NSV_FFBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_FFBEG,NSV_FFEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP)
-        IF (IRESP /= 0) THEN
-          PSVT(:,:,:,JSV) = 0.
-        END IF
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-#endif
-! Blaze smoke variables
-IF (NSV_FIREEND>=NSV_FIREBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_FIREBEG,NSV_FIREEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP)
-        IF (IRESP /= 0) THEN
-          PSVT(:,:,:,JSV) = 0.
-        END IF
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-!
-IF (NSV_CSEND>=NSV_CSBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CSBEG,NSV_CSEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP)
-        IF (IRESP /= 0) THEN
-          PSVT(:,:,:,JSV) = 0.
-        END IF
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
+
 ! Blaze fire model
 IF (LBLAZE .AND. CCONF=='RESTA') THEN
   ! Blaze is not compliant with MNHVERSION(1)<5
   ! Blaze begins with MNH 5.3.1
   CALL IO_Field_read(TPINIFILE,'LSPHI',PLSPHI,IRESP)
-  IF (IRESP /= 0) PLSPHI = 0.
+  IF (IRESP /= 0) PLSPHI(:,:,:) = 0.
   CALL IO_Field_read(TPINIFILE,'BMAP',PBMAP,IRESP)
-  IF (IRESP /= 0) PBMAP = -1.
+  IF (IRESP /= 0) PBMAP(:,:,:) = -1.
   CALL IO_Field_read(TPINIFILE,'FMASE',PFMASE,IRESP)
   IF(IRESP == 0) THEN
     ! flag for the use of restart value for ASE initialization
     LRESTA_ASE = .TRUE.
   ELSE
-    PFMASE = 0.
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMASE set to 0' )
+    PFMASE(:,:,:) = 0.
   END IF
   CALL IO_Field_read(TPINIFILE,'FMAWC',PFMAWC,IRESP)
   ! flag for the use of restart value for AWC initialization
   IF(IRESP == 0) THEN
     LRESTA_AWC = .TRUE.
   ELSE
-    PFMAWC = 0.
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMAWC set to 0' )
+    PFMAWC(:,:,:) = 0.
   END IF
   ! read wind on fire grid if present
   IF (LWINDFILTER) THEN
@@ -1396,7 +865,8 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN
       IF(IRESP == 0) THEN
         LRESTA_EWAM = .TRUE.
       ELSE
-       PFMWINDU = 0.
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDU set to 0' )
+        PFMWINDU(:,:,:) = 0.
       END IF
       ! read v
       CALL IO_Field_read(TPINIFILE,'FMWINDV',PFMWINDV,IRESP)
@@ -1408,7 +878,10 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN
         ! u or v fields NOT found
         LRESTA_EWAM = .FALSE.
       END IF
-      IF (IRESP /= 0) PFMWINDV = 0.
+      IF (IRESP /= 0) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDV set to 0' )
+        PFMWINDV(:,:,:) = 0.
+      END IF
       ! read w
       CALL IO_Field_read(TPINIFILE,'FMWINDW',PFMWINDW,IRESP)
       ! flag for EWAM filtered w wind
@@ -1419,7 +892,10 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN
         ! u or v or w fields NOT found
         LRESTA_EWAM = .FALSE.
       END IF
-      IF (IRESP /= 0) PFMWINDW = 0.
+      IF (IRESP /= 0) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDW set to 0' )
+        PFMWINDW(:,:,:) = 0.
+      END IF
 
     CASE('WLIM')
       CALL IO_Field_read(TPINIFILE,'FMHWS',PFMHWS,IRESP)
@@ -1427,55 +903,96 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN
       IF(IRESP == 0) THEN
         LRESTA_WLIM = .TRUE.
       ELSE
-        PFMHWS = 0.
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMHWS set to 0' )
+        PFMHWS(:,:,:) = 0.
       END IF
     END SELECT
   END IF
 END IF
 !
-IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = 'LINOXT'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
+!  Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV
 !
-IF (NSV_SNWEND>=NSV_SNWBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  DO JSV = NSV_SNWBEG,NSV_SNWEND
-    SELECT CASE(HGETSVT(JSV))
-      CASE ('READ')
-        TZFIELD%CMNHNAME   = TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-      CASE ('INIT')
+ISV= SIZE(PSVT,4)
+!
+DO JSV = 1, NSV              ! initialize according to the get indicators
+  SELECT CASE( HGETSVT(JSV) )
+    CASE ('READ')
+      TZFIELD = TSVLIST(JSV)
+
+      IF ( GOLDFILEFORMAT ) THEN
+        IF ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+             ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+             ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+             ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
+          !Some variables were written with an other name in MesoNH < 5.6
+          WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CSTDNAME   = ''
+          TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        ELSE
+          !Scalar variables were written with a T suffix in older versions
+          TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+          TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        END IF
+      END IF
+
+      CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP )
+
+      IF ( IRESP /= 0 ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) )
         PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-IF (NSV_SNW>=1) THEN
+      END IF
+
+    CASE ('INIT')
+      PSVT(:,:,:,JSV) = 0.
+
+      IF ( JSV == NSV_C2R2END ) THEN
+        IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
+          ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
+          ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
+          ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:)))
+          !rvsat
+          ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
+          ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:)
+          PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:)
+        END IF
+      END IF
+
+  END SELECT
+END DO
+
+DO JSV = NSV_PPBEG, NSV_PPEND
+  SELECT CASE( HGETSVT(JSV) )
+    CASE ('READ')
+      WRITE( YNUM3, '( I3.3 )' ) JSV
+
+      TZFIELD = TFIELDMETADATA(            &
+        CMNHNAME   = 'ATC' // YNUM3,       &
+        CSTDNAME   = '',                   &
+        CLONGNAME  = 'ATC' // YNUM3,       &
+        CCOMMENT   = 'X_Y_Z_ATC' // YNUM3, &
+        CUNITS     = 'm-3',                &
+        CDIR       = 'XY',                 &
+        NGRID      = 1,                    &
+        NTYPE      = TYPEREAL,             &
+        NDIMS      = 3,                    &
+        LTIMEDEP   = .TRUE.                )
+
+      CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP )
+
+      IF ( IRESP /= 0 ) THEN
+        PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+      ENDIF
+
+    CASE ('INIT')
+      PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+
+  END SELECT
+END DO
+
+IF ( NSV_SNW >= 1 ) THEN
   TZFIELD%CSTDNAME   = ''
   TZFIELD%CUNITS     = 'kg kg-1'
   TZFIELD%CDIR       = 'XY'
@@ -1483,20 +1000,18 @@ IF (NSV_SNW>=1) THEN
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 2
   TZFIELD%LTIMEDEP   = .TRUE.
-  DO JSV = 1,NSV_SNW
+  DO JSV = 1, NSV_SNW
     SELECT CASE(HGETSVT(JSV))
       CASE ('READ')
-        WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV      
+        WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV
         TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
         WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV
-        CALL IO_Field_read(TPINIFILE,TZFIELD,XSNWCANO(:,:,JSV))
+        CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) )
       CASE ('INIT')
         XSNWCANO(:,:,JSV) = 0.
     END SELECT
   END DO
-
 END IF
-
 !
 IF (CCONF == 'RESTA') THEN
   IF (CTEMP_SCHEME/='LEFR') THEN
@@ -1598,7 +1113,13 @@ CALL INI_LB(TPINIFILE,GLSOURCE,ISV,                                   &
 !
 CALL IO_Field_read(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass
 IF (CCONF=='RESTA') THEN
-  CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS) ! dry mass tendency
+  CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS,IRESP) ! dry mass tendency
+
+  ! DRYMASSS was not written in backup files before MesoNH 5.5.1
+  IF ( IRESP /= 0 ) THEN
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PDRYMASSS set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) )
+    PDRYMASSS = 0.
+  END IF
 ELSE
   PDRYMASSS=XUNDEF   ! should not be used
 END IF
diff --git a/src/MNH/read_hgrid.f90 b/src/MNH/read_hgrid.f90
index c695be83b8a5a090518995350f0966ca72c00e2f..30a92650b1f57ff963a98821611c274cf4e69445 100644
--- a/src/MNH/read_hgrid.f90
+++ b/src/MNH/read_hgrid.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-2021 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.
@@ -81,7 +81,7 @@ END MODULE MODI_READ_HGRID
 !*       0.    DECLARATIONS
 !
 USE MODD_CONF,          ONLY: CPROGRAM
-use modd_field,         only: tfielddata, tfieldlist
+use modd_field,         only: tfieldmetadata, tfieldlist
 USE MODD_GRID
 USE MODD_IO,            ONLY: TFILEDATA
 USE MODD_PARAMETERS
@@ -117,7 +117,7 @@ INTEGER                :: IID, IMI
 LOGICAL                :: G1D,G2D,GPACK
 INTEGER                :: IINFO_ll
 REAL                   :: ZLATOR, ZLONOR, ZXHATM, ZYHATM
-TYPE(TFIELDDATA)       :: TZFIELD
+TYPE(TFIELDMETADATA)   :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.     TEST ON MODEL INDEX
@@ -201,12 +201,12 @@ CALL IO_Pack_set(G1D,G2D,GPACK)
 !-------------------------------------------------------------------------------
 IF (TPFMFILE%NMNHVERSION(1)<4 .OR. (TPFMFILE%NMNHVERSION(1)==4 .AND. TPFMFILE%NMNHVERSION(2)<=5)) THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'LONOR'
   CALL IO_Field_read(TPFMFILE,TZFIELD,XPGDLONOR)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'LATOR'
   CALL IO_Field_read(TPFMFILE,TZFIELD,XPGDLATOR)
   !
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index 41385f588e3808e85c1438f8f4eb9ee7fc763edc..1ac466b48e61249026080ac6614027b04b287399 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-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.
@@ -80,7 +80,7 @@ END MODULE MODI_READ_HGRID_n
 !
 USE MODD_CONF
 USE MODD_DIM_n
-use modd_field,         only: tfielddata, tfieldlist
+use modd_field,         only: tfieldmetadata, tfieldlist
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_IO,            ONLY: TFILEDATA
@@ -93,6 +93,7 @@ USE MODE_IO,            only: IO_Pack_set
 USE MODE_IO_FIELD_READ, only: IO_Field_read
 USE MODE_MSG
 USE MODE_MODELN_HANDLER
+USE MODE_SET_GRID,       only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
 use MODE_TOOLS_ll,       only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll
 !
 IMPLICIT NONE
@@ -106,21 +107,21 @@ CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
 !
 !*       0.2   declarations of local variables
 !
-INTEGER             :: ILUOUT
-INTEGER             :: IRESP
-REAL                :: ZLAT0,ZLON0,ZRPK,ZBETA
-REAL                :: ZEPS = 1.E-10
-INTEGER             :: IID, IMI
+INTEGER              :: ILUOUT
+INTEGER              :: IRESP
+REAL                 :: ZLAT0,ZLON0,ZRPK,ZBETA
+REAL                 :: ZEPS = 1.E-10
+INTEGER              :: IID, IMI
 !
 !-------------------------------------------------------------------------------
 REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM
 !-------------------------------------------------------------------------------
 !JUAN REALZ
-INTEGER             :: IIU,IJU
+INTEGER              :: IIU,IJU
 !JUAN REALZ
-INTEGER             :: IXOR, IYOR, IXEND, IYEND
-INTEGER             :: IJPHEXT
-TYPE(TFIELDDATA)    :: TZFIELD
+INTEGER              :: IXOR, IYOR, IXEND, IYEND
+INTEGER              :: IJPHEXT
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 ILUOUT = TLUOUT%NLU
 !
@@ -250,7 +251,16 @@ ENDIF
 
 CALL IO_Field_read(TPFMFILE,'XHAT',XXHAT)
 CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT)
-!
+
+IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) )
+IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
+
+! Interpolations of positions to mass points
+CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
+
+! Collect global domain boundaries
+CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
+
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
 IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU))
@@ -279,12 +289,12 @@ END IF
 !-------------------------------------------------------------------------------
 IF (TPFMFILE%NMNHVERSION(1)<4 .OR. (TPFMFILE%NMNHVERSION(1)==4 .AND. TPFMFILE%NMNHVERSION(2)<=5)) THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'LONOR'
   CALL IO_Field_read(TPFMFILE,TZFIELD,XLONORI)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'LATOR'
   CALL IO_Field_read(TPFMFILE,TZFIELD,XLATORI)
   !
diff --git a/src/MNH/read_precip_field.f90 b/src/MNH/read_precip_field.f90
index 0946c03a882fbcf524a7f2b76846cfb4400c879f..0d74aaf464ddaa6aad01cdf66a4d0fccdc272d1d 100644
--- a/src/MNH/read_precip_field.f90
+++ b/src/MNH/read_precip_field.f90
@@ -98,7 +98,7 @@ END MODULE MODI_READ_PRECIP_FIELD
 !
 !*       0.    DECLARATIONS
 
-use modd_field,         only: tfielddata, tfieldlist
+use modd_field,         only: tfieldmetadata, tfieldlist
 USE MODD_IO,            ONLY: TFILEDATA
 USE MODD_PARAM_ICE,     ONLY: LDEPOSC
 USE MODD_PARAM_C2R2,    ONLY: LDEPOC
@@ -138,10 +138,10 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRH   ! Hail accumulated precip
 REAL, DIMENSION(SIZE(PINPRR,1),SIZE(PINPRR,2)) :: Z2D ! 2D array to read  data
 REAL, DIMENSION(SIZE(PINPRR3D,1),SIZE(PINPRR3D,2),SIZE(PINPRR3D,3)) :: Z3D ! 3D array to read  data
                                                   ! in initial file 
-INTEGER             :: IID
-INTEGER             :: IRESP
-CHARACTER(LEN=4)    :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT                    
-TYPE(TFIELDDATA)    :: TZFIELD
+INTEGER              :: IID
+INTEGER              :: IRESP
+CHARACTER(LEN=4)     :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -170,13 +170,13 @@ IF (SIZE(PINPRC) /= 0 ) THEN
   SELECT CASE(YGETRCT)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRC(:,:)=Z2D(:,:)/(1000.*3600.)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRC(:,:)=Z2D(:,:)/(1000.)
@@ -190,13 +190,13 @@ IF (SIZE(PINDEP) /= 0 ) THEN
   SELECT CASE(YGETRCT)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINDEP(:,:)=Z2D(:,:)/(1000.*3600.)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACDEP(:,:)=Z2D(:,:)/(1000.)
@@ -210,7 +210,7 @@ IF (SIZE(PINPRR) /= 0 ) THEN
   SELECT CASE(YGETRRT)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRR(:,:)=Z2D(:,:)/(1000.*3600.)
@@ -222,7 +222,7 @@ IF (SIZE(PINPRR) /= 0 ) THEN
     IF (IRESP == 0) PEVAP3D(:,:,:)=Z3D(:,:,:)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRR(:,:)=Z2D(:,:)/(1000.)
@@ -238,13 +238,13 @@ IF (SIZE(PINPRS) /= 0 ) THEN
   SELECT CASE(YGETRST)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRS(:,:)=Z2D(:,:)/(1000.*3600.)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRS(:,:)=Z2D(:,:)/(1000.)
@@ -258,13 +258,13 @@ IF (SIZE(PINPRG) /= 0 ) THEN
   SELECT CASE(YGETRGT)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRG(:,:)=Z2D(:,:)/(1000.*3600.)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRG(:,:)=Z2D(:,:)/(1000.)
@@ -278,13 +278,13 @@ IF (SIZE(PINPRH) /= 0 ) THEN
   SELECT CASE(YGETRHT)
   CASE ('READ')
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRH(:,:)=Z2D(:,:)/(1000.*3600.)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRH(:,:)=Z2D(:,:)/(1000.)
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index 30b2a93712df54151a1f2dd8927e3e2de626d8d9..96693291f32ee2a1d2e1cb0260b2f7f5d6604ffb 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -18,7 +18,7 @@ CONTAINS
 
 SUBROUTINE PREPARE_METADATA_READ_SURF(HREC,HDIR,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
 !
-use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPELOG
+use modd_field, only: tfieldmetadata, tfieldlist
 use mode_field, only: Find_field_id_from_mnhname
 !
 CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
@@ -27,14 +27,14 @@ INTEGER,                INTENT(IN)  :: KGRID    ! Localization on the model grid
 INTEGER,                INTENT(IN)  :: KTYPE    ! Datatype
 INTEGER,                INTENT(IN)  :: KDIMS    ! Number of dimensions
 CHARACTER(LEN=*),       INTENT(IN)  :: HSUBR    ! name of the subroutine calling
-TYPE(TFIELDDATA),       INTENT(OUT) :: TPFIELD  ! metadata of field
+TYPE(TFIELDMETADATA),       INTENT(OUT) :: TPFIELD  ! metadata of field
 !
 CHARACTER(LEN=32) :: YTXT
 INTEGER           :: IID, IRESP
 !
 CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.)
 IF (IRESP==0) THEN
-  TPFIELD = TFIELDLIST(IID)
+  TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   !Modify and check CLONGNAME
   IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC) &
       .AND. TRIM(HREC)/='VERSION' .AND. TRIM(HREC)/='BUG') THEN
@@ -71,25 +71,24 @@ IF (IRESP==0) THEN
   END IF
 ELSE
   CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata')
-  TPFIELD%CMNHNAME   = TRIM(HREC)
-  TPFIELD%CSTDNAME   = ''
-  TPFIELD%CLONGNAME  = TRIM(HREC)
-  TPFIELD%CUNITS     = ''
-  TPFIELD%CDIR       = HDIR
-  TPFIELD%CCOMMENT   = '' !Expected comment is not known
-  TPFIELD%NGRID      = KGRID
-  TPFIELD%NTYPE      = KTYPE
-  TPFIELD%NDIMS      = KDIMS
+  TPFIELD = TFIELDMETADATA(  &
+    CMNHNAME   = TRIM(HREC), &
+    CSTDNAME   = '',         &
+    CLONGNAME  = TRIM(HREC), &
+    CUNITS     = '',         &
+    CDIR       = HDIR,       &
+    CCOMMENT   = '',         & !Expected comment is not known
+    NGRID      = KGRID,      &
+    NTYPE      = KTYPE,      &
+    NDIMS      = KDIMS,      &
+    LTIMEDEP   = .FALSE.     )
 #if 0
   IF (TPFIELD%NDIMS==0 .OR. TPFIELD%NTYPE==TYPECHAR .OR. TPFIELD%NTYPE==TYPEDATE .OR. TPFIELD%NTYPE==TYPELOG) THEN
     TPFIELD%LTIMEDEP   = .FALSE.
   ELSE
     TPFIELD%LTIMEDEP   = .TRUE.
   END IF
-#else
-  TPFIELD%LTIMEDEP   = .FALSE.
 #endif
-
 END IF
 !
 END SUBROUTINE PREPARE_METADATA_READ_SURF
@@ -141,7 +140,7 @@ END MODULE MODE_READ_SURF_MNH_TOOLS
 !             ------------
 !
 USE MODD_CONF,          ONLY: CPROGRAM
-use modd_field,         only: tfielddata, tfieldlist, TYPEREAL
+use modd_field,         only: tfieldmetadata, tfieldlist, TYPEREAL
 USE MODD_GRID,          ONLY: XRPK,XBETA,XLAT0,XLON0
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
 USE MODD_PARAMETERS,    ONLY: JPHEXT, XUNDEF
@@ -165,15 +164,15 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-INTEGER           :: ILUOUT
-INTEGER           :: IID,IRESP
-INTEGER           :: IIMAX,IJMAX
+INTEGER              :: IGRID          ! IGRID : grid indicator
+INTEGER              :: ILENCH         ! ILENCH : length of comment string
+INTEGER              :: ILUOUT
+INTEGER              :: IID,IRESP
+INTEGER              :: IIMAX,IJMAX
 REAL,DIMENSION(:), ALLOCATABLE :: ZXHAT,ZYHAT
-REAL              :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI
-REAL              :: ZRPK, ZBETA, ZLAT0, ZLON0
-TYPE(TFIELDDATA)  :: TZFIELD
+REAL                 :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI
+REAL                 :: ZRPK, ZBETA, ZLAT0, ZLON0
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -203,12 +202,12 @@ IF (HREC=='LONORI' .OR. HREC=='LATORI') THEN
       CALL IO_Field_read(TPINFILE,'YHAT',ZYHAT)
       !
       CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'LONOR'
       CALL IO_Field_read(TPINFILE,TZFIELD,ZLONOR)
       !
       CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CMNHNAME = 'LATOR'
       CALL IO_Field_read(TPINFILE,TZFIELD,ZLATOR)
       !
@@ -291,7 +290,7 @@ END SUBROUTINE READ_SURFX0_MNH
 !             ------------
 !
 USE MODD_CST,           ONLY: XPI
-use modd_field,         only: tfielddata, tfieldlist, TYPEREAL
+use modd_field,         only: tfieldmetadata, tfieldlist, TYPEREAL
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK, &
                               NIU, NJU, NIB, NJB, NIE, NJE, &
                               NIU_ALL, NJU_ALL, NIB_ALL,    &
@@ -337,11 +336,11 @@ REAL                              :: ZW     ! work value
 CHARACTER(LEN=LEN_HREC) :: YREC
 CHARACTER(LEN=2)  :: YSTORAGE_TYPE
 !
-INTEGER           :: IID, IRESP
-INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
+INTEGER              :: IID, IRESP
+INTEGER              :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for packing
-REAL              :: ZUNDEF         ! undefined value in SURFEX
-TYPE(TFIELDDATA)  :: TZFIELD
+REAL                 :: ZUNDEF         ! undefined value in SURFEX
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -392,7 +391,7 @@ ELSE IF (HREC=='XX') THEN
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
   CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   IF (HDIR/='A'.AND.HDIR/='E') THEN
     TZFIELD%CDIR       = 'XX'
   ELSE
@@ -412,7 +411,7 @@ ELSE IF (HREC=='DX') THEN
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
   CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   IF (HDIR/='A'.AND.HDIR/='E') THEN
     TZFIELD%CDIR       = 'XX'
   ELSE
@@ -432,7 +431,7 @@ ELSE IF (HREC=='YY') THEN
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
   CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   IF (HDIR/='A'.AND.HDIR/='E') THEN
     TZFIELD%CDIR       = 'YY'
   ELSE
@@ -452,7 +451,7 @@ ELSE IF (HREC=='DY') THEN
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
   CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   IF (HDIR/='A'.AND.HDIR/='E') THEN
     TZFIELD%CDIR       = 'YY'
   ELSE
@@ -581,7 +580,7 @@ END SUBROUTINE READ_SURFX1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPEREAL
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK, NIU, NJU, NIB, NJB, NIE, NJE, &
                               NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, NIE_ALL, NJE_ALL, NMASK_ALL
 USE MODD_PARAMETERS,    ONLY: XUNDEF
@@ -611,14 +610,14 @@ CHARACTER(LEN=1),        INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-INTEGER           :: ILUOUT
-INTEGER           :: JP             ! loop index
+INTEGER              :: IGRID          ! IGRID : grid indicator
+INTEGER              :: ILENCH         ! ILENCH : length of comment string
+INTEGER              :: ILUOUT
+INTEGER              :: JP             ! loop index
 
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK  ! work array read in the file
-REAL              :: ZUNDEF         ! undefined value in SURFEX
-TYPE(TFIELDDATA)  :: TZFIELD
+REAL                 :: ZUNDEF         ! undefined value in SURFEX
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -717,7 +716,7 @@ END SUBROUTINE READ_SURFX2_MNH
 !
 USE MODD_CST,            ONLY: XPI
 USE MODD_DATA_COVER_PAR, ONLY: JPCOVER
-use modd_field,          only: tfielddata, TYPELOG, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPELOG, TYPEREAL
 USE MODD_IO_SURF_MNH,    ONLY: TOUT, TPINFILE, NMASK, &
                                NIU, NJU, NIB, NJB, NIE, NJE, &
                                NIU_ALL, NJU_ALL, NIB_ALL,    &
@@ -766,7 +765,7 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
 INTEGER  :: IRESP
 INTEGER  :: IVERSION, IBUGFIX
 LOGICAL  :: GCOVER_PACKED ! .T. if COVER are all packed into one field
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2COV_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -810,33 +809,36 @@ CALL IO_Field_read(TPINFILE,'BUG',    IBUGFIX)
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  TZFIELD%CMNHNAME   = 'COVER_PACKED'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'COVER_PACKED'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(      &
+    CMNHNAME   = 'COVER_PACKED', &
+    CSTDNAME   = '',             &
+    CLONGNAME  = 'COVER_PACKED', &
+    CUNITS     = '',             &
+    CDIR       = '--',           &
+    CCOMMENT   = '',             &
+    NGRID      = 0,              &
+    NTYPE      = TYPELOG,        &
+    NDIMS      = 0,              &
+    LTIMEDEP   = .FALSE.         )
   CALL IO_Field_read(TPINFILE,TZFIELD,GCOVER_PACKED)
 END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
   ICOVER=0
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(&
+    CMNHNAME   = 'generic no COVER_PACKED', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CUNITS     = '',       &
+    CDIR       = YDIR,     &
+    NGRID      = 4,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .FALSE.   )
   DO JL2=1,SIZE(OFLAG)
     WRITE(YREC,'(A5,I3.3)') 'COVER',JL2
     TZFIELD%CMNHNAME   = TRIM(YREC)
     TZFIELD%CLONGNAME  = TRIM(YREC)
     TZFIELD%CCOMMENT   = 'X_Y_'//TRIM(YREC)
-    TZFIELD%CDIR       = YDIR
     IF (OFLAG(JL2)) THEN
       ICOVER=ICOVER+1
       CALL IO_Field_read(TPINFILE,TZFIELD,ZWORK3D(:,:,ICOVER),IRESP)
@@ -911,7 +913,7 @@ END SUBROUTINE READ_SURFX2COV_MNH
 !             ------------
 !
 USE MODD_CST,           ONLY: XPI
-use modd_field,         only: tfielddata, TYPELOG, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPELOG, TYPEREAL
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK,        &
                               NIU, NJU, NIB, NJB, NIE, NJE, &
                               NIU_ALL, NJU_ALL, NIB_ALL,    &
@@ -959,7 +961,7 @@ REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D
 INTEGER  :: IVERSION, IBUGFIX
 LOGICAL  :: GCOVER_PACKED ! .T. if COVER are all packed into one field
 CHARACTER(LEN=1) :: YDIR1
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2COV_1COV_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -1004,31 +1006,33 @@ CALL IO_Field_read(TPINFILE,'BUG',    IBUGFIX)
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  TZFIELD%CMNHNAME   = 'COVER_PACKED'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'COVER_PACKED'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(      &
+    CMNHNAME   = 'COVER_PACKED', &
+    CSTDNAME   = '',             &
+    CLONGNAME  = 'COVER_PACKED', &
+    CUNITS     = '',             &
+    CDIR       = '--',           &
+    CCOMMENT   = '',             &
+    NGRID      = 0,              &
+    NTYPE      = TYPELOG,        &
+    NDIMS      = 0,              &
+    LTIMEDEP   = .FALSE.         )
   CALL IO_Field_read(TPINFILE,TZFIELD,GCOVER_PACKED,KRESP)
 END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
   WRITE(YREC,'(A5,I3.3)') 'COVER',KCOVER
-  TZFIELD%CMNHNAME   = TRIM(YREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(YREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = YDIR
-  TZFIELD%CCOMMENT   = 'X_Y_'//TRIM(YREC)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = TRIM(YREC),         &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = TRIM(YREC),         &
+    CUNITS     = '',                 &
+    CDIR       = YDIR,               &
+    CCOMMENT   = 'X_Y_'//TRIM(YREC), &
+    NGRID      = 4,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 2,                  &
+    LTIMEDEP   = .FALSE.             )
   CALL IO_Field_read(TPINFILE,TZFIELD,ZWORK2D,KRESP)
 ELSE
   call Print_msg( NVERB_FATAL, 'IO', 'READ_SURFX2COV_1COV_MNH', 'GCOVER_PACKED=TRUE and we try to read the covers one by one' )
@@ -1094,7 +1098,7 @@ END SUBROUTINE READ_SURFX2COV_1COV_MNH
 !             ------------
 !
 USE MODD_CONF,          ONLY: CPROGRAM
-use modd_field,         only: tfielddata, TYPEINT
+use modd_field,         only: tfieldmetadata, TYPEINT
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK, &
                               NIU, NJU, NIB, NJB, NIE, NJE
 
@@ -1114,9 +1118,9 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER          :: IIMAX, IJMAX
-INTEGER          :: ILUOUT
-TYPE(TFIELDDATA) :: TZFIELD
+INTEGER              :: IIMAX, IJMAX
+INTEGER              :: ILUOUT
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -1189,7 +1193,7 @@ END SUBROUTINE READ_SURFN0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPEINT
+use modd_field,         only: tfieldmetadata, TYPEINT
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK, &
                               NIU, NJU, NIB, NJB, NIE, NJE
 !
@@ -1220,7 +1224,7 @@ INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA)                 :: TZFIELD
 !---------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFN1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -1298,7 +1302,7 @@ END SUBROUTINE READ_SURFN1_MNH
 !             ------------
 !
 USE MODD_CONF,          ONLY: LCARTESIAN, CPROGRAM
-use modd_field,         only: tfielddata, TYPECHAR
+use modd_field,         only: tfieldmetadata, TYPECHAR
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
 USE MODD_LUNIT,         ONLY: TPGDFILE
 
@@ -1319,17 +1323,17 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT  ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IRESP          ! return code
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-INTEGER           :: ILUOUT
+INTEGER              :: IRESP          ! return code
+INTEGER              :: IGRID          ! IGRID : grid indicator
+INTEGER              :: ILENCH         ! ILENCH : length of comment string
+INTEGER              :: ILUOUT
 !
-INTEGER           :: ILUDES       ! .des file logical unit
+INTEGER              :: ILUDES       ! .des file logical unit
 !
-LOGICAL           :: GFOUND
-CHARACTER(LEN=4)  :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC
-CHARACTER(LEN=6)  :: CSEA_FLUX
-TYPE(TFIELDDATA)  :: TZFIELD
+LOGICAL              :: GFOUND
+CHARACTER(LEN=4)     :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC
+CHARACTER(LEN=6)     :: CSEA_FLUX
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 NAMELIST/NAM_PARAMn/CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CSEA_FLUX, CELEC
 !----------------------------------------------------------------------------
@@ -1453,7 +1457,7 @@ END SUBROUTINE READ_SURFC0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPEINT, TYPELOG
+use modd_field,         only: tfieldmetadata, TYPEINT, TYPELOG
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE, NMASK, &
                               NIU, NJU, NIB, NJB, NIE, NJE
 !
@@ -1479,12 +1483,12 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-INTEGER           :: ILUOUT
+INTEGER              :: IGRID          ! IGRID : grid indicator
+INTEGER              :: ILENCH         ! ILENCH : length of comment string
+INTEGER              :: ILUOUT
 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK  ! work array read in the file
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFL1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
 !
@@ -1569,7 +1573,7 @@ END SUBROUTINE READ_SURFL1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPELOG
+use modd_field,         only: tfieldmetadata, TYPELOG
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
 
 USE MODE_IO_FIELD_READ, only: IO_Field_read
@@ -1588,7 +1592,7 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT ! comment
 !*      0.2   Declarations of local variables
 !
 INTEGER           :: ILUOUT
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFL0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
 !
@@ -1665,7 +1669,7 @@ END SUBROUTINE READ_SURFL0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPECHAR
+use modd_field,         only: tfieldmetadata, TYPECHAR
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
 USE MODD_TYPE_DATE
 
@@ -1693,9 +1697,9 @@ INTEGER           :: ILUOUT
 CHARACTER(LEN=LEN_HREC)        :: YRECFM     ! Name of the article to be written
 CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
 CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
-INTEGER, DIMENSION(3)  :: ITDATE
-TYPE(TFIELDDATA)       :: TZFIELD
-TYPE(DATE_TIME)        :: TZDATETIME
+INTEGER, DIMENSION(3)          :: ITDATE
+TYPE(TFIELDMETADATA)           :: TZFIELD
+TYPE(DATE_TIME)                :: TZDATETIME
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -1706,16 +1710,17 @@ HCOMMENT = ''
 IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NMNHVERSION(2)<6)) THEN
   CALL IO_Field_read(TPINFILE,'STORAGE_TYPE',YFILETYPE2)
 ELSE
-  TZFIELD%CMNHNAME   = 'STORAGETYPE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'STORAGETYPE'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPECHAR
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'STORAGETYPE', &
+    CSTDNAME   = '',            &
+    CLONGNAME  = 'STORAGETYPE', &
+    CUNITS     = '',            &
+    CDIR       = '--',          &
+    CCOMMENT   = '',            &
+    NGRID      = 0,             &
+    NTYPE      = TYPECHAR,      &
+    NDIMS      = 0,             &
+    LTIMEDEP   = .FALSE.        )
   CALL IO_Field_read(TPINFILE,TZFIELD,YFILETYPE40)
   YFILETYPE2 = YFILETYPE40(1:2)
 END IF
@@ -1788,7 +1793,7 @@ END SUBROUTINE READ_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfielddata, TYPECHAR, TYPEINT, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPECHAR, TYPEINT, TYPEREAL
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
 
 USE MODE_IO_FIELD_READ, only: IO_Field_read
@@ -1817,8 +1822,8 @@ INTEGER           :: ILUOUT
 CHARACTER(LEN=LEN_HREC)        :: YRECFM     ! Name of the article to be written
 CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
 CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
-INTEGER, DIMENSION(3,KL1)  :: ITDATE
-TYPE(TFIELDDATA)       :: TZFIELD
+INTEGER, DIMENSION(3,KL1)      :: ITDATE
+TYPE(TFIELDMETADATA)           :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -1829,16 +1834,17 @@ HCOMMENT = ''
 IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NMNHVERSION(2)<6)) THEN
   CALL IO_Field_read(TPINFILE,'STORAGE_TYPE',YFILETYPE2)
 ELSE
-  TZFIELD%CMNHNAME   = 'STORAGETYPE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'STORAGETYPE'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPECHAR
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'STORAGETYPE', &
+    CSTDNAME   = '',            &
+    CLONGNAME  = 'STORAGETYPE', &
+    CUNITS     = '',            &
+    CDIR       = '--',          &
+    CCOMMENT   = '',            &
+    NGRID      = 0,             &
+    NTYPE      = TYPECHAR,      &
+    NDIMS      = 0,             &
+    LTIMEDEP   = .FALSE.        )
   CALL IO_Field_read(TPINFILE,TZFIELD,YFILETYPE40)
   YFILETYPE2 = YFILETYPE40(1:2)
 END IF
@@ -1852,16 +1858,17 @@ END IF
 !  RETURN
 !END IF
 !
-TZFIELD%CMNHNAME   = TRIM(HREC)//'%TDATE'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEINT
-TZFIELD%NDIMS      = 2
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(            &
+  CMNHNAME   = TRIM(HREC)//'%TDATE', &
+  CSTDNAME   = '',                   &
+  CLONGNAME  = TRIM(HREC)//'%TDATE', &
+  CUNITS     = '',                   &
+  CDIR       = '--',                 &
+  CCOMMENT   = '',                   &
+  NGRID      = 0,                    &
+  NTYPE      = TYPEINT,              &
+  NDIMS      = 2,                    &
+  LTIMEDEP   = .FALSE.               )
 !
 CALL IO_Field_read(TPINFILE,TZFIELD,ITDATE(:,:),KRESP)
 !
@@ -1877,16 +1884,17 @@ IF (KRESP /=0) THEN
   WRITE(ILUOUT,*) ' '
 ENDIF
 !
-TZFIELD%CMNHNAME   = TRIM(HREC)//'%xtime'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 1
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(            &
+  CMNHNAME   = TRIM(HREC)//'%xtime', &
+  CSTDNAME   = '',                   &
+  CLONGNAME  = TRIM(HREC)//'%xtime', &
+  CUNITS     = '',                   &
+  CDIR       = '--',                 &
+  CCOMMENT   = '',                   &
+  NGRID      = 0,                    &
+  NTYPE      = TYPEREAL,             &
+  NDIMS      = 1,                    &
+  LTIMEDEP   = .FALSE.               )
 !
 CALL IO_Field_read(TPINFILE,TZFIELD,PTIME(:),KRESP)
 !
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index 2f8b1fc47b98956bea3fd157a989b8b733546377..44665594e92d8c833c04c902e3a38c96287524e7 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -1,4 +1,4 @@
-!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.
@@ -7,7 +7,7 @@
       MODULE MODI_READ_VER_GRID
 !     #########################
 INTERFACE
-      SUBROUTINE READ_VER_GRID(TPPRE_REAL1,PZHAT,OSLEVE,PLEN1,PLEN2)
+      SUBROUTINE READ_VER_GRID( TPPRE_REAL1, PZHAT, OSLEVE, PLEN1, PLEN2 )
 !
 USE MODD_IO, ONLY : TFILEDATA
 !
@@ -21,9 +21,9 @@ END SUBROUTINE READ_VER_GRID
 END INTERFACE
 END MODULE MODI_READ_VER_GRID
 !
-!     ##############################################################
-      SUBROUTINE READ_VER_GRID(TPPRE_REAL1,PZHAT,OSLEVE,PLEN1,PLEN2)
-!     ##############################################################
+!     ####################################################################
+      SUBROUTINE READ_VER_GRID( TPPRE_REAL1, PZHAT, OSLEVE, PLEN1, PLEN2 )
+!     ####################################################################
 !
 !!****  *READ_VER_GRID* - reads namelist data in file PRE_REAL1 for the 
 !!                        initialization of the vertical grid for real cases.
@@ -111,6 +111,7 @@ USE MODD_PARAMETERS
 !
 USE MODE_MSG
 USE MODE_POS
+USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_GLOB_VERGRID
 !
 USE MODI_DEFAULT_SLEVE
 !
@@ -121,10 +122,10 @@ IMPLICIT NONE
 !*       0.1   Declaration of arguments
 !              ------------------------
 TYPE(TFILEDATA),POINTER,      INTENT(IN) :: TPPRE_REAL1! namelist file
+REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PZHAT      ! vertival grid of input fmfile
 LOGICAL,            OPTIONAL, INTENT(IN) :: OSLEVE     ! flag for SLEVE coordinate
 REAL,               OPTIONAL, INTENT(IN) :: PLEN1      ! Decay scale for smooth topography
 REAL,               OPTIONAL, INTENT(IN) :: PLEN2      ! Decay scale for small-scale topography deviation
-REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PZHAT      ! vertival grid of input fmfile
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -193,7 +194,8 @@ XLEN1_n  = XLEN1
 XLEN2_n  = XLEN2
 !
 IF (CPROGRAM=='REAL  ') THEN
-  IF (ASSOCIATED (XZHAT) ) DEALLOCATE(XZHAT)
+  IF (ASSOCIATED (XZHAT)  ) DEALLOCATE(XZHAT)
+  IF (ASSOCIATED (XZHATM) ) DEALLOCATE(XZHATM)
   CALL POSNAM(IPRE_REAL1,'NAM_BLANKN',GFOUND,ILUOUT0)
   IF (GFOUND) THEN
     CALL INIT_NAM_BLANKn
@@ -214,9 +216,10 @@ SELECT CASE(YZGRID_TYPE)
 CASE('SAMEGR')
   IF (PRESENT(PZHAT) .AND. PRESENT(OSLEVE) .AND. PRESENT(PLEN1) .AND.  PRESENT(PLEN2)) THEN
     IF (NKMAX_n==0)  NKMAX_n=SIZE(PZHAT)-2*JPVEXT
-    ALLOCATE(XZHAT(NKMAX_n+2*JPVEXT))
+    ALLOCATE( XZHAT (IKU) )
+    ALLOCATE( XZHATM(IKU) )
 
-    IF ( (NKMAX_n+2*JPVEXT) > SIZE(PZHAT) ) THEN
+    IF ( (IKU) > SIZE(PZHAT) ) THEN
       WRITE(ILUOUT0,*) 'ERROR IN READ_VER_GRID :'
       WRITE(ILUOUT0,*) '  YOU WANT TO KEEP THE SAME VERTICAL GRID, BUT YOU ASK'
       WRITE(ILUOUT0,*) '  FOR MORE LEVELS THAN IN INPUT FM FILE.'
@@ -226,13 +229,13 @@ CASE('SAMEGR')
       CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_VER_GRID','')
     END IF
 
-    XZHAT(:)=PZHAT(1:NKMAX_n+2*JPVEXT)
+    XZHAT(:)  = PZHAT (1:IKU)
     LTHINSHELL = GTHINSHELL
     LSLEVE_n     = OSLEVE
     XLEN1_n      = PLEN1
     XLEN2_n      = PLEN2
 
-    IF ( (NKMAX_n+2*JPVEXT) == SIZE(PZHAT) ) THEN
+    IF ( (IKU) == SIZE(PZHAT) ) THEN
       WRITE(ILUOUT0,*) 'same vertical grid kept.'
     ELSE
       WRITE(ILUOUT0,*) NKMAX_n,' first levels in vertical grid kept.'
@@ -257,7 +260,8 @@ CASE('SAMEGR')
 !
 CASE('FUNCTN')
 !
-  IF (.NOT. ASSOCIATED(XZHAT)) ALLOCATE(XZHAT(IKU))
+  IF ( .NOT. ASSOCIATED(XZHAT)  ) ALLOCATE( XZHAT (IKU) )
+  IF ( .NOT. ASSOCIATED(XZHATM) ) ALLOCATE( XZHATM(IKU) )
 !
   IF (ABS(ZDZTOP-ZDZGRD) < 1.E-10) THEN
     XZHAT(:) = (/ (REAL(JK-IKB)*ZDZGRD, JK=1,IKU) /)
@@ -297,7 +301,8 @@ CASE('FUNCTN')
 !
 CASE('MANUAL')
 !
-  IF (.NOT. ASSOCIATED(XZHAT)) ALLOCATE(XZHAT(IKU))
+  IF ( .NOT. ASSOCIATED(XZHAT)  ) ALLOCATE( XZHAT (IKU) )
+  IF ( .NOT. ASSOCIATED(XZHATM) ) ALLOCATE( XZHATM(IKU) )
 !
   WRITE(ILUOUT0,FMT=*) 'YZGRID_TYPE="MANUAL", ATTEMPT TO READ VECTOR XZHAT(2,NKU)'
   CALL POSKEY(IPRE_REAL1,ILUOUT0,'ZHAT')
@@ -322,7 +327,13 @@ END SELECT
 !
 !Set model top
 XZTOP = XZHAT(IKU)
-!
+
+! Interpolations of positions to mass points
+CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
+
+! Collect global domain boundaries
+CALL STORE_GLOB_VERGRID( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
+
 !-------------------------------------------------------------------------------
 !
 !*       5.    TEST ON STRETCHING :
diff --git a/src/MNH/relaxdef.f90 b/src/MNH/relaxdef.f90
index 41665139b06cfe2cdd71187dbf66dba9ac34f17a..216dc038972b2c009df0b4b67e5ee19c2759440d 100644
--- a/src/MNH/relaxdef.f90
+++ b/src/MNH/relaxdef.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2019 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.
@@ -17,7 +17,7 @@ INTERFACE
             OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, &
             OHORELAX_SVPP,OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW,     &
             PALKTOP,PALKGRD, PALZBOT,PALZBAS,                                &
-            PZZ, PZHAT, PTSTEP,                                              &
+            PZZ, PZHAT, PZHATM, PTSTEP,                                      &
             PRIMKMAX,KRIMX, KRIMY,                                           &
             PALK, PALKW, KALBOT,PALKBAS,PALKWBAS,KALBAS,                     &  
             OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX    )
@@ -79,8 +79,9 @@ REAL,                   INTENT(IN)        :: PALZBOT   ! Height of the abs.
 REAL,                   INTENT(IN)        :: PALZBAS   ! Height of the abs.
                                                        ! layer base            
 REAL, DIMENSION(:,:,:), INTENT(IN)        :: PZZ       ! Height 
-REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height 
-REAL,                   INTENT(IN)        :: PTSTEP    ! Time step         
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHATM    ! ... at mass points
+REAL,                   INTENT(IN)        :: PTSTEP    ! Time step
 REAL,                     INTENT(IN)    :: PRIMKMAX !Max. value of the horiz.
                                           ! relaxation coefficients
 INTEGER,                INTENT(IN)        :: KRIMX,KRIMY ! Number of points in 
@@ -122,7 +123,7 @@ END MODULE MODI_RELAXDEF
             OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, &
             OHORELAX_SVPP,OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW,     &
             PALKTOP,PALKGRD, PALZBOT,PALZBAS,                                &
-            PZZ, PZHAT, PTSTEP,                                              &
+            PZZ, PZHAT, PZHATM, PTSTEP,                                      &
             PRIMKMAX,KRIMX, KRIMY,                                           &
             PALK, PALKW, KALBOT,PALKBAS,PALKWBAS,KALBAS,                     &
             OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX    )
@@ -306,7 +307,8 @@ REAL,                   INTENT(IN)        :: PALZBAS   ! Height of the abs.
                                                        ! layer base                                                        
 REAL, DIMENSION(:,:,:), INTENT(IN)        :: PZZ       ! Height 
 REAL, DIMENSION(:),     INTENT(IN)        :: PZHAT     ! Gal-Chen Height 
-REAL,                   INTENT(IN)        :: PTSTEP    ! Time step         
+REAL, DIMENSION(:),     INTENT(IN)        :: PZHATM    ! ... at mass points
+REAL,                   INTENT(IN)        :: PTSTEP    ! Time step
 REAL,                     INTENT(IN)    :: PRIMKMAX !Max. value of the horiz.
                                           ! relaxation coefficients
 INTEGER,                INTENT(IN)        :: KRIMX,KRIMY ! Number of points in 
@@ -341,8 +343,6 @@ REAL                       :: ZZSHAT
 REAL                       :: ZZTOP       ! Height of the model top         
 REAL                       :: ZALZHAT     ! Gal-Chen height of the abs. layer 
                                           ! base
-REAL                       :: ZZHATK      ! Gal-Chen height of u(k), v(k), and 
-                                          ! theta(k)
 !
 INTEGER                    :: IKRIMAX     ! Maximum width of the rim zone
                                           !  (number of points)
@@ -445,8 +445,7 @@ IF(OVE_RELAX) THEN
   END DO
 !
   DO JK = KALBOT, IKE
-    ZZHATK = 0.5 * (PZHAT(JK) +PZHAT(JK+1))
-    PALK(JK) = PALKTOP * SIN ( ZWORK * (ZZHATK - PZHAT(KALBOT))) **2
+    PALK(JK) = PALKTOP * SIN ( ZWORK * (PZHATM(JK) - PZHAT(KALBOT))) **2
     PALK(JK) = PALK(JK) / (1. + 2. * PTSTEP * PALK(JK))
   END DO
 !
@@ -469,8 +468,7 @@ IF (OVE_RELAX_GRD) THEN
   END DO
 !
   DO JK = 1,KALBAS
-    ZZHATK = 0.5 * (PZHAT(JK) +PZHAT(JK+1))
-    PALKBAS(JK) = PALKGRD * SIN ( ZWORK * (-ZZHATK + PZHAT(KALBAS))) **2
+    PALKBAS(JK) = PALKGRD * SIN ( ZWORK * (-PZHATM(JK) + PZHAT(KALBAS))) **2
     PALKBAS(JK) = PALKBAS(JK) / (1. + 2. * PTSTEP * PALKBAS(JK))
   END DO
 END IF
diff --git a/src/MNH/richardson.f90 b/src/MNH/richardson.f90
index 492454276f2ffcfaaa52e9c4e0b917b6ea70b963..7f80f4a6df8e2859592ca7a8b810173ad44fc84e 100644
--- a/src/MNH/richardson.f90
+++ b/src/MNH/richardson.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 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.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 solver 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ######spl
       MODULE MODI_RICHARDSON
 !     ######################
@@ -23,12 +18,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at 
@@ -148,12 +143,12 @@ IMPLICIT NONE
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX    ! x-direction LBC type 
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY    ! y-direction LBC type 
 !
-                                                 ! Metric coefficients:
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! d*xx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY      ! d*yy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX      ! d*zx 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY      ! d*zy 
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ      ! d*zz
+                                                   ! Metric coefficients:
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX      ! d*xx 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY      ! d*yy 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX      ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY      ! d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ      ! d*zz
 !
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ    ! density of reference * J
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PTHETAV   ! virtual potential temp. at 
diff --git a/src/MNH/sedim_blowsnow.f90 b/src/MNH/sedim_blowsnow.f90
index 2cb0f82646a9748e9cca38b64e336699bb01c983..75985a3dced721aaeb21c8f4f324bb50f396b968 100644
--- a/src/MNH/sedim_blowsnow.f90
+++ b/src/MNH/sedim_blowsnow.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2018-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.
@@ -17,7 +17,7 @@ SUBROUTINE SEDIM_BLOWSNOW(  &
      ,PDTMONITOR        & !I Time step
      ,PRHODREF          & !I [kg/m3] air density
      ,PZZ               & !I [m] height of layers
-     ,PSVT              & !IO [scalar variable, ppp] Blowing snow concentration
+     ,PSVT              & !IO [scalar variable, ppv] Blowing snow concentration
      ,PSVS              & !IO ! Blowing snow variable source
      ,PVGK              &  !I [m/s] Blowing snow variable settling velocity 
      )
diff --git a/src/MNH/sedim_dust.f90 b/src/MNH/sedim_dust.f90
index 145939e1f3a17796398f5ddc29ccfcd0ffc95fdd..339f4cfa757042e35c40fd7ec2f3dca87a620469 100644
--- a/src/MNH/sedim_dust.f90
+++ b/src/MNH/sedim_dust.f90
@@ -1,4 +1,4 @@
-!ORILAM_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
@@ -15,7 +15,7 @@ SUBROUTINE SEDIM_DUST(  &
      ,PRHODREF          & !I [kg/m3] air density
      ,PPABST            & !I [Pa] pressure
      ,PZZ               & !I [m] height of layers
-     ,PSVT              & !IO [scalar variable, ppp] sea salt concentration
+     ,PSVT              & !IO [scalar variable, ppv] sea salt concentration
      )
 
 IMPLICIT NONE
@@ -241,7 +241,7 @@ ELSE
   LSEDFIX = .TRUE.
 END IF
 !
-!*       5.   Return to concentration in ppp (#/molec_{air})
+!*       5.   Return to concentration in ppv (#/molec_{air})
 !
 DO JN=1,NMODE_DST
 IF (LVARSIG) THEN
diff --git a/src/MNH/sedim_salt.f90 b/src/MNH/sedim_salt.f90
index 43e407a88308b2ce2a49928bb14d1cbd0aba0875..7027377414104596a76b390405a941fe023bc382 100644
--- a/src/MNH/sedim_salt.f90
+++ b/src/MNH/sedim_salt.f90
@@ -1,4 +1,4 @@
-!ORILAM_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
 !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !ORILAM_LIC for details.
@@ -15,7 +15,7 @@ SUBROUTINE SEDIM_SALT(  &
      ,PRHODREF          & !I [kg/m3] air density
      ,PPABST            & !I [Pa] pressure
      ,PZZ               & !I [m] height of layers
-     ,PSVT              & !IO [scalar variable, ppp] sea salt concentration
+     ,PSVT              & !IO [scalar variable, ppv] sea salt concentration
      )
 
 IMPLICIT NONE
@@ -241,7 +241,7 @@ ELSE
   LSEDFIX = .TRUE.
 END IF
 !
-!*       5.   Return to concentration in ppp (#/molec_{air})
+!*       5.   Return to concentration in ppv (#/molec_{air})
 !
 DO JN=1,NMODE_SLT
 IF (LVARSIG_SLT) THEN
diff --git a/src/MNH/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90
index cb4d18b427e80960d528689416df35526711dc03..05ced2f2a1366d29bc2d76b3ae5dea0a280cd3ff 100644
--- a/src/MNH/series_cloud_elec.f90
+++ b/src/MNH/series_cloud_elec.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2010-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.
@@ -94,7 +94,6 @@ USE MODD_CST
 USE MODD_DYN_n,           ONLY: XDXHATM, XDYHATM
 USE MODD_ELEC_DESCR
 USE MODD_ELEC_PARAM
-USE MODD_GRID_n,          ONLY: XXHAT, XYHAT, XZHAT
 USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_NSV,             ONLY: NSV_ELECBEG, NSV_ELECEND
 USE MODD_PARAMETERS
diff --git a/src/MNH/set_advfrc.f90 b/src/MNH/set_advfrc.f90
index 395660c8837f8278d7a8544a33a4f1208464dc9c..eac8ea7b8a8ca0741394ab1d1e84f03f1ee875e4 100644
--- a/src/MNH/set_advfrc.f90
+++ b/src/MNH/set_advfrc.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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.
@@ -126,7 +126,6 @@ CHARACTER(LEN=48)   :: CFNAM_MEANVAR_ADV
 CHARACTER(LEN=48) :: CFNAM_ADV
 !
 REAL, DIMENSION(:), ALLOCATABLE::     ZHEIGHTMF,ZHEIGHTF,ZTHVUF
-REAL, DIMENSION(:), ALLOCATABLE::     ZZHATM
 REAL, DIMENSION(:), ALLOCATABLE::     ZTHDF,ZRVF,ZPRESS_ADV,ZTHVF
 REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZTHFRC,ZRVFRC
 REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZDRVFRC1D,ZDTHFRC1D,ZDVFRC1D
@@ -190,7 +189,6 @@ ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC))
 ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC))
 ! 
 ! For reading in PRE_IDEA1.nam
-ALLOCATE(ZZHATM(IKU))
 ALLOCATE(ZDRVFRC1D(IIU,IKU,NADVFRC))
 ALLOCATE(ZDTHFRC1D(IIU,IKU,NADVFRC))
 ALLOCATE(ZDVFRC1D(IIU,IKU,NADVFRC))
@@ -245,26 +243,24 @@ print*,"  ! 3.2  READ AND INTERPOLATE FORCING"
    !
   END IF
  !
-  ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1))
-  ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1)
 
 print*,"  !! 3.2.2  Vertical interpolation"
   DO JK = 1,IKU
-    IF (ZZHATM(JK) <= ZHEIGHTF(1)) THEN
+    IF (XZHATM(JK) <= ZHEIGHTF(1)) THEN
 !
 print*,"! extrapolation below the first level"
 !   
    
-      ZDZSDH  = (ZZHATM(JK)-ZHEIGHTF(1)) / (ZHEIGHTF(2)-ZHEIGHTF(1))
+      ZDZSDH  = (XZHATM(JK)-ZHEIGHTF(1)) / (ZHEIGHTF(2)-ZHEIGHTF(1))
       ZDRVFRC1D(IIB:IIE,JK,JKT) = ZRVFRC(IIB:IIE,1,JKT) + & 
       (ZRVFRC(IIB:IIE,2,JKT) - ZRVFRC(IIB:IIE,1,JKT)) * ZDZSDH
       ZDTHFRC1D(IIB:IIE,JK,JKT) = ZTHFRC(IIB:IIE,1,JKT) + & 
       (ZTHFRC(IIB:IIE,2,JKT) - ZTHFRC(IIB:IIE,1,JKT)) * ZDZSDH
-    ELSE IF (ZZHATM(JK) > ZHEIGHTF(NPRESSLEV_ADV) ) THEN
+    ELSE IF (XZHATM(JK) > ZHEIGHTF(NPRESSLEV_ADV) ) THEN
 !
 print*,"! extrapolation above the last level"
 !
-      ZDZSDH  = (ZZHATM(JK) - ZHEIGHTF(NPRESSLEV_ADV)) /      &
+      ZDZSDH  = (XZHATM(JK) - ZHEIGHTF(NPRESSLEV_ADV)) /      &
                 (ZHEIGHTF(NPRESSLEV_ADV) - ZHEIGHTF(NPRESSLEV_ADV-1))
       ZDRVFRC1D(IIB:IIE,JK,JKT)  = ZRVFRC(IIB:IIE,NPRESSLEV_ADV,JKT) +  & 
       (ZRVFRC(IIB:IIE,NPRESSLEV_ADV,JKT)-ZRVFRC(IIB:IIE,NPRESSLEV_ADV-1,JKT)) * ZDZSDH
@@ -275,9 +271,9 @@ print*,"! extrapolation above the last level"
 print*,"! interpolation between first and last levels"
 !
       DO JKLEV = 1,NPRESSLEV_ADV-1
-        IF ( (ZZHATM(JK) > ZHEIGHTF(JKLEV)).AND. &
-             (ZZHATM(JK) <= ZHEIGHTF(JKLEV+1))   ) THEN
-          ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTF(JKLEV)) /  &
+        IF ( (XZHATM(JK) > ZHEIGHTF(JKLEV)).AND. &
+             (XZHATM(JK) <= ZHEIGHTF(JKLEV+1))   ) THEN
+          ZDZ1SDH = (XZHATM(JK) - ZHEIGHTF(JKLEV)) /  &
                     (ZHEIGHTF(JKLEV+1)-ZHEIGHTF(JKLEV))
           ZDZ2SDH = 1.- ZDZ1SDH
           ZDRVFRC1D(IIB:IIE,JK,JKT)  = ZRVFRC(IIB:IIE,JKLEV,JKT)*ZDZ2SDH & 
@@ -360,7 +356,6 @@ DEALLOCATE(ZHEIGHTMF)
 DEALLOCATE(ZHEIGHTF)
 DEALLOCATE(ZTHVUF)
 ! pour lecture dans PREIDEA
-DEALLOCATE(ZZHATM)
 DEALLOCATE(ZDRVFRC1D)
 DEALLOCATE(ZDTHFRC1D)
 DEALLOCATE(ZDVFRC1D)
diff --git a/src/MNH/set_frc.f90 b/src/MNH/set_frc.f90
index 6c49fbbf288028ccd6c579aeddf88cc7988c05d8..3f82878d97a8f76f650a7aa1f5c919e2288507e9 100644
--- a/src/MNH/set_frc.f90
+++ b/src/MNH/set_frc.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -153,8 +153,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTMF   ! Height at mass levels
 REAL, DIMENSION(:), ALLOCATABLE :: ZTHVF       ! Thetav at mass levels
 REAL, DIMENSION(:), ALLOCATABLE :: ZTHDF       ! Theta (dry) at mass levels
 REAL, DIMENSION(:), ALLOCATABLE :: ZMRF        ! Vapor mixing ratio at mass lev.
-REAL, DIMENSION(SIZE(XZHAT))    :: ZZHATM      ! Height of mass model grid
-                                               ! levels  without orography
 REAL, DIMENSION(SIZE(XZHAT))    :: ZSHEAR      ! vertical wind shear
 CHARACTER(LEN=4)                :: YZP         ! choice of zfrc or pfrc
 CHARACTER(LEN=100)              :: YMSG
@@ -385,12 +383,9 @@ DO JKT = 1,NFRC
 !
 ! Interpolate and extrapolate Ufrc on u-vertical-grid levels
 !           the other forcing variables.
-!
-  ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1))
-  ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1)
 !
   DO JK = 1,IKU
-    IF (ZZHATM(JK) <= ZHEIGHTF(1)) THEN
+    IF (XZHATM(JK) <= ZHEIGHTF(1)) THEN
 !
 ! copy below the first level
 !
@@ -402,7 +397,7 @@ DO JKT = 1,NFRC
       XTENDRVFRC(JK,JKT) = ZGYRF(1)
       XTENDUFRC(JK,JKT) = ZTUF(1)
       XTENDVFRC(JK,JKT) = ZTVF(1)        
-    ELSE IF (ZZHATM(JK) > ZHEIGHTF(ILEVELF) ) THEN
+    ELSE IF (XZHATM(JK) > ZHEIGHTF(ILEVELF) ) THEN
 !
 ! copy above the last level
 !
@@ -419,9 +414,9 @@ DO JKT = 1,NFRC
 ! interpolation between first and last levels
 !
       DO JKLEV = 1,ILEVELF-1
-        IF ( (ZZHATM(JK) > ZHEIGHTF(JKLEV)).AND. &
-             (ZZHATM(JK) <= ZHEIGHTF(JKLEV+1))   ) THEN
-          ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTF(JKLEV)) /  &
+        IF ( (XZHATM(JK) > ZHEIGHTF(JKLEV)).AND. &
+             (XZHATM(JK) <= ZHEIGHTF(JKLEV+1))   ) THEN
+          ZDZ1SDH = (XZHATM(JK) - ZHEIGHTF(JKLEV)) /  &
                     (ZHEIGHTF(JKLEV+1)-ZHEIGHTF(JKLEV))
           ZDZ2SDH = 1.- ZDZ1SDH
           XUFRC(JK,JKT)  = ZUF(JKLEV)*ZDZ2SDH  + ZUF(JKLEV+1)*ZDZ1SDH
diff --git a/src/MNH/set_geosbal.f90 b/src/MNH/set_geosbal.f90
index 28e528d8b1fbc1d269681cc40769c4f31e2ed273..2f8bd2e68e437c0c2158e26f8ac63d57380c7fca 100644
--- a/src/MNH/set_geosbal.f90
+++ b/src/MNH/set_geosbal.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2010-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.
@@ -49,7 +49,7 @@ END MODULE MODI_SET_GEOSBAL
 !     fields (at w-grid levels without ororgraphy i.e. at height XZHAT,
 !     with u along latitude circles and v along meridians.)
 !     The vertical profile of mass variable is given at mass-grid levels
-!     (without orography), i.e. at height ZZHATM.
+!     (without orography), i.e. at height XZHATM.
 !       The thermal wind balance is used to compute the potential virtual
 !     temperature from wind field and the vertical profile of thetav.
 !       The vapor mixing ratio is taken  uniform in horizontal plane, i.e.
@@ -289,9 +289,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHV  !  potential virtual temperature
 !
 !*       0.2   Declarations of local variables :
 !
-REAL, DIMENSION(SIZE(XZHAT))    :: ZZHATM  ! Height of mass model grid levels
-                                             ! (without orography)
-
 INTEGER             :: IITRREF  !  iteration number for the determination of
                                  !  the thetav field
 REAL,DIMENSION(:,:),ALLOCATABLE :: ZGAMMA,ZGAMMA_ll ! K(lambda-lambda0) -beta
@@ -311,7 +308,7 @@ REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZDXX,ZDYY ! metric
                                        ! coefficients dxx,dyy for the grid
                                        ! without orography
 REAL, DIMENSION(SIZE(XZHAT))                         :: ZDZHATM,ZDZHAT  ! deltaz
-                                       ! for ZZHATM and XZHAT levels
+                                       ! for XZHATM and XZHAT levels
 REAL    :: ZRADSDG,ZRVSRD         !Pi/180,Rv/Rd
 INTEGER :: IKB,IKE                 ! useful area in z direction
 INTEGER :: IIU,IJU,IKU             ! Upper bounds in x,y,z directions
@@ -351,14 +348,7 @@ CALL GET_OR_ll('B',IXOR_ll,IYOR_ll)
 !               IN X,Y DIRECTION AND COMPUTE CORIOLIS PARAMETER, AND METRIC
 !               COEFFICIENTS :
 !               -------------------------------------------------------------
-  ZZHATM(1:IKU-1) = 0.5 * (XZHAT(2:IKU)+XZHAT(1:IKU-1))  ! ZHATm(k)=
-                                                     ! 0.5(ZHAT(k+1) +ZHAT(k)
-  ZZHATM(IKU) = 2.* XZHAT(IKU) - ZZHATM(IKU-1)    ! extrapolation for IKU 
-                                                  ! based on deltazhat(iku+1) =
-                                                  ! deltazhat(iku) and  Zhatm(k)
-                                                  ! is the middle point between 
-                                                  ! Zhat(k) and Zhat(k+1)  
-!                                                  
+!
 !*       2.1    Compute a first guess of the dry density
 !
 IF (LTHINSHELL .OR. LCARTESIAN) THEN
@@ -402,7 +392,7 @@ END IF
 !
 ZTHV3D(:,:,:) = SPREAD(SPREAD(PTHVM(:),1,IIU),2,IJU)  ! initialize  with
                                               ! (KILOC,KJLOC) vertical profile
-  ZDZHATM(2:IKU) = ZZHATM(2:IKU)-ZZHATM(1:IKU-1)
+  ZDZHATM(2:IKU) = XZHATM(2:IKU)-XZHATM(1:IKU-1)
   ZDZHAT(1:IKU-1) = XZHAT(2:IKU) - XZHAT(1:IKU-1)
 !
   IF (OBOUSS) THEN
@@ -652,28 +642,28 @@ ZZM(:,:,:)   = MZF(XZZ)                       ! compute height at mass level
                                               ! of grid with orography
 !
 ZZM(:,:,IKU) = 2. * XZZ(:,:,IKU) - ZZM(:,:,IKU-1) ! extrapolate on IKU mass level
-!  ZZM(:,:,1) is always greater than or equal to ZZHATM(1)
-!  ZZM(:,:,IKU) is always smaller than or equal to ZZHATM(IKU)
+!  ZZM(:,:,1) is always greater than or equal to XZHATM(1)
+!  ZZM(:,:,IKU) is always smaller than or equal to XZHATM(IKU)
 !
 DO JI = 1,IIU
   DO JJ = 1,IJU
 !
     DO JK = 1,IKU            ! loop on vertical levels of grid with orography
 !
-      IF (ZZM(JI,JJ,JK) >= ZZHATM(IKU)) THEN     ! copy out when
-        PTHV(JI,JJ,JK)  =  ZTHV3D (JI,JJ,IKU)    ! ZZM(IKU)= ZZHATM(IKU)
+      IF (ZZM(JI,JJ,JK) >= XZHATM(IKU)) THEN     ! copy out when
+        PTHV(JI,JJ,JK)  =  ZTHV3D (JI,JJ,IKU)    ! ZZM(IKU)= XZHATM(IKU)
         XRT(JI,JJ,JK,1) = PMRM(IKU)              ! (in case zs=0.)
 !
-      ELSEIF (ZZM(JI,JJ,JK) < ZZHATM(1)) THEN    ! copy out when  
-        PTHV(JI,JJ,JK)  =  ZTHV3D (JI,JJ,1)      ! ZZM(1)< ZZHATM(1)  
+      ELSEIF (ZZM(JI,JJ,JK) < XZHATM(1)) THEN    ! copy out when
+        PTHV(JI,JJ,JK)  =  ZTHV3D (JI,JJ,1)      ! ZZM(1)< XZHATM(1)
         XRT(JI,JJ,JK,1) = PMRM(1)                ! (in case zs=0.)
 !
       ELSE                  ! search levels on the mass grid without orography
         DO JKS = 2,IKU      ! that surrounded JK
-          IF((ZZM(JI,JJ,JK) >= ZZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < ZZHATM(JKS))) &
+          IF((ZZM(JI,JJ,JK) >= XZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < XZHATM(JKS))) &
           THEN              ! interpolation with the values on the grid without
                             ! orography
-            ZDZ1SDH = (ZZM(JI,JJ,JK)-ZZHATM(JKS-1))/ (ZZHATM(JKS)-ZZHATM(JKS-1))
+            ZDZ1SDH = (ZZM(JI,JJ,JK)-XZHATM(JKS-1))/ (XZHATM(JKS)-XZHATM(JKS-1))
             ZDZ2SDH = 1. - ZDZ1SDH
             PTHV(JI,JJ,JK)  = (ZDZ1SDH * ZTHV3D(JI,JJ,JKS)   )       &
                             + (ZDZ2SDH * ZTHV3D(JI,JJ,JKS-1) )
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index 80b75a18778e0127d1c9792f21fc9e387e76c193..4ecfdf8979259f43fdb27dbb497156adcd8ffea0 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -1,96 +1,41 @@
-!MNH_LIC Copyright 1994-2020 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.
 !-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 31/08/2022: add PXHATM and PYHATM variables
+!  P. Wautelet 07/09/2022: add INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
+!-----------------------------------------------------------------
 !     ####################
-      MODULE MODI_SET_GRID
+      MODULE MODE_SET_GRID
 !     ####################
-!
-INTERFACE
-!
-      SUBROUTINE SET_GRID(KMI,TPINIFILE,                                      &
-                          KKU,KIMAX_ll,KJMAX_ll,                              &
-                          PTSTEP,PSEGLEN,                                     &
-                          PLONORI,PLATORI,PLON,PLAT,                          &
-                          PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
-                          PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT,       &
-                          PJ,                                                 &
-                          TPDTMOD,TPDTCUR,KSTOP,                              &
-                          KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
-!
-USE MODD_TYPE_DATE
-USE MODD_IO, ONLY: TFILEDATA,TOUTBAK
-!
-INTEGER,                INTENT(IN)  :: KMI       ! Model index
-TYPE(TFILEDATA),        INTENT(IN)  :: TPINIFILE !Initial file
-INTEGER,                INTENT(IN)  :: KKU       ! Upper dimension in z direction
-                                                 ! for domain arrays
-INTEGER,                INTENT(IN)  :: KIMAX_ll  !  Dimensions  in x direction
-                                                 ! of the physical domain,
-INTEGER,                INTENT(IN)  :: KJMAX_ll  !  Dimensions  in y direction
-                                                 ! of the physical domain,
-!
-REAL,                   INTENT(IN)  :: PTSTEP    ! time step of model KMI
-REAL,                   INTENT(INOUT) :: PSEGLEN ! segment duration (in seconds)
-!
-REAL,                   INTENT(OUT) :: PLONORI   ! Longitude  of the
-                                                 ! Origine point of
-                                                 ! conformal projection
-REAL,                   INTENT(OUT) :: PLATORI   ! Latitude of the
-                                                 ! Origine point of
-                                                 ! conformal projection
-REAL, DIMENSION(:,:),   INTENT(OUT) :: PLON,PLAT ! Longitude and latitude
-REAL, DIMENSION(:),     INTENT(OUT) :: PXHAT     ! Position x in the conformal
-                                                 ! plane or on the cartesian plane
-REAL, DIMENSION(:),     INTENT(OUT) :: PYHAT     ! Position y in the conformal
-                                                 ! plane or on the cartesian plane
-REAL, DIMENSION(:),     INTENT(OUT) :: PDXHAT    ! horizontal stretching in x
-REAL, DIMENSION(:),     INTENT(OUT) :: PDYHAT    ! horizontal stretching in y
-REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
-!
-REAL, DIMENSION(:,:),   INTENT(OUT) :: PZS       ! orography
-REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ       ! Height z
-REAL, DIMENSION(:),     INTENT(OUT) :: PZHAT     ! Height  level
-REAL,                   INTENT(OUT) :: PZTOP     ! Model top
-LOGICAL,                INTENT(OUT) :: OSLEVE    ! flag for SLEVE coordinate
-REAL,                   INTENT(OUT) :: PLEN1     ! Decay scale for smooth topography
-REAL,                   INTENT(OUT) :: PLEN2     ! Decay scale for small-scale topography deviation
-REAL, DIMENSION(:,:),   INTENT(OUT) :: PZSMT     ! smooth-orography
-!
-TYPE (DATE_TIME),       INTENT(OUT) :: TPDTMOD   ! date and time of the model
-                                                 ! beginning
-TYPE (DATE_TIME),       INTENT(OUT) :: TPDTCUR   ! Current date and time
-INTEGER,                INTENT(OUT) :: KSTOP     ! number of time steps for
-                                                 ! current segment
-INTEGER,POINTER,        INTENT(OUT) :: KBAK_NUMB ! number of backups
-INTEGER,POINTER,        INTENT(OUT) :: KOUT_NUMB ! number of outputs
-TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups
-TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs
-!
-REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ        ! Jacobian
-!
-END SUBROUTINE SET_GRID
-!
-END INTERFACE
-!
-END MODULE MODI_SET_GRID
-!
-!
-!
-!
-!
-!     #########################################################################
-      SUBROUTINE SET_GRID(KMI,TPINIFILE,                                      &
-                          KKU,KIMAX_ll,KJMAX_ll,                              &
-                          PTSTEP,PSEGLEN,                                     &
-                          PLONORI,PLATORI,PLON,PLAT,                          &
-                          PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
-                          PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT,       &
-                          PJ,                                                 &
-                          TPDTMOD,TPDTCUR,KSTOP,                              &
-                          KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
-!     #########################################################################
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: SET_GRID
+
+PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
+
+PUBLIC :: STORE_GLOB_GRID, STORE_GLOB_HORGRID, STORE_GLOB_VERGRID
+
+CONTAINS
+
+!     #####################################################################
+      SUBROUTINE SET_GRID( KMI, TPINIFILE,                                &
+                           KKU, KIMAX_ll, KJMAX_ll,                       &
+                           PTSTEP, PSEGLEN,                               &
+                           PLONORI, PLATORI, PLON, PLAT,                  &
+                           PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                           PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,      &
+                           PHAT_BOUND, PHATM_BOUND,                       &
+                           PMAP, PZS, PZZ, PZHAT, PZHATM, PZTOP, OSLEVE,  &
+                           PLEN1, PLEN2, PZSMT, PJ,                       &
+                           TPDTMOD, TPDTCUR, KSTOP,                       &
+                           KBAK_NUMB, KOUT_NUMB, TPBACKUPN, TPOUTPUTN     )
+!     #####################################################################
 !
 !!****  *SET_GRID* - routine to set grid variables
 !!
@@ -207,6 +152,7 @@ END MODULE MODI_SET_GRID
 !!     V.MASSON 12/10/00 read of the orography in all cases, even if LFLAT=T
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  P. Wautelet 31/08/2022: add PXHATM and PYHATM variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -214,7 +160,7 @@ END MODULE MODI_SET_GRID
 USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_DYN
-use modd_field,            only: tfielddata, tfieldlist
+use modd_field,            only: tfieldmetadata, tfieldlist
 USE MODD_GRID
 USE MODD_IO,      ONLY: TFILEDATA,TOUTBAK
 USE MODD_LUNIT_n, ONLY: TLUOUT
@@ -260,11 +206,20 @@ REAL, DIMENSION(:),     INTENT(OUT) :: PYHAT     ! Position y in the conformal
                                                  ! plane or on the cartesian plane
 REAL, DIMENSION(:),     INTENT(OUT) :: PDXHAT    ! horizontal stretching in x
 REAL, DIMENSION(:),     INTENT(OUT) :: PDYHAT    ! horizontal stretching in y
+REAL, DIMENSION(:),     INTENT(OUT) :: PXHATM    ! Position x in the conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),     INTENT(OUT) :: PYHATM    ! Position y in the conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
 !
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PZS       ! orography
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ       ! Height z
-REAL, DIMENSION(:),     INTENT(OUT) :: PZHAT     ! Height  level
+REAL, DIMENSION(:),     INTENT(OUT) :: PZHAT     ! Height level
+REAL, DIMENSION(:),     INTENT(OUT) :: PZHATM    ! Height level at mass points
 REAL,                   INTENT(OUT) :: PZTOP     ! Model top
 LOGICAL,                INTENT(OUT) :: OSLEVE    ! flag for SLEVE coordinate
 REAL,                   INTENT(OUT) :: PLEN1     ! Decay scale for smooth topography
@@ -299,7 +254,7 @@ INTEGER                :: IIUP,IJUP ,ISUP=1         ! size  of working
                                                     ! window arrays,
                                                     ! supp. time steps
 !
-TYPE(TFIELDDATA)       :: TZFIELD
+TYPE(TFIELDMETADATA)   :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.    READ GRID  VARIABLES IN INITIAL FILE
@@ -334,14 +289,15 @@ IF (.NOT.LCARTESIAN) THEN
     CALL IO_Field_read(TPINIFILE,'LONORI',PLONORI)
     CALL IO_Field_read(TPINIFILE,'LATORI',PLATORI)
   !
-  ELSE                     
+  ELSE
+    ! If file comes from MesoNH < 4.6.0
     CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LONOR'
     CALL IO_Field_read(TPINIFILE,TZFIELD,PLONORI)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LATOR'
     CALL IO_Field_read(TPINIFILE,TZFIELD,PLATORI)
     !
@@ -396,11 +352,21 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG)
 !
 !*       2.1    Spatial grid
 !
+
+! Interpolations of positions to mass points
+CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
+CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
+
+! Collect global domain boundaries
+CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                      &
+                        PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
 IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ)
 ELSE
-  CALL SM_GRIDPROJ(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PLATORI,PLONORI, &
-                   PMAP,PLAT,PLON,PDXHAT,PDYHAT,PZZ,PJ)
+  CALL SM_GRIDPROJ( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZS,      &
+                    OSLEVE, PLEN1, PLEN2, PZSMT, PLATORI, PLONORI, &
+                    PMAP, PLAT, PLON, PDXHAT, PDYHAT, PZZ, PJ      )
 END IF
 !
 !*       2.2    Temporal grid - segment length
@@ -477,3 +443,274 @@ CALL SM_PRINT_TIME(TDTSEG,TLUOUT,YTITLE)
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE SET_GRID
+
+
+!-----------------------------------------------------------------
+SUBROUTINE INTERP_HORGRID_1DIR_TO_MASSPOINTS( HDIR, PHAT, PHATM )
+  ! Interpolate 1 direction of horizontal grid to mass points
+
+  USE MODD_ARGSLIST_ll, ONLY: LIST1D_ll
+
+  USE MODE_ARGSLIST_ll, ONLY: ADD1DFIELD_ll, CLEANLIST1D_ll
+  USE MODE_EXCHANGE_ll, ONLY: UPDATE_1DHALO_ll
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CHARACTER(LEN=1),   INTENT(IN)  :: HDIR  ! Direction ('X' or 'Y')
+  REAL, DIMENSION(:), INTENT(IN)  :: PHAT  ! Position x or y in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(OUT) :: PHATM ! Position x or y in the conformal or cartesian plane at mass points
+
+  CHARACTER(LEN=:), ALLOCATABLE :: YNAME
+  INTEGER                       :: IINFO_ll ! return code
+  TYPE(LIST1D_ll),  POINTER     :: TZLIST   ! pointer for the list of 1D fields to be communicated
+
+
+  ! Interpolate inside subdomain
+  PHATM( : UBOUND(PHATM,1)-1 ) = 0.5 * PHAT( : UBOUND(PHAT,1)-1 ) + 0.5 * PHAT( LBOUND(PHAT,1)+1 : UBOUND(PHAT,1) )
+  PHATM( UBOUND(PHATM,1)     ) = 1.5 * PHAT( UBOUND(PHAT,1)     ) - 0.5 * PHAT( UBOUND(PHAT,1)-1 )
+
+  ! Update data between subdomains
+  NULLIFY( TZLIST )
+
+  IF ( HDIR == 'X' ) THEN
+    YNAME = 'XHATM'
+  ELSE IF ( HDIR == 'Y' ) THEN
+    YNAME = 'YHATM'
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INTERP_HORGRID_1DIR_TO_MASSPOINTS', 'invalid direction (valid: X or Y)' )
+  END IF
+
+  CALL ADD1DFIELD_ll( HDIR, TZLIST, PHATM, YNAME )
+  CALL UPDATE_1DHALO_ll( TZLIST, IINFO_ll )
+  CALL CLEANLIST1D_ll( TZLIST )
+
+END SUBROUTINE INTERP_HORGRID_1DIR_TO_MASSPOINTS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:), INTENT(IN)  :: PXHAT  ! Position x in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(IN)  :: PYHAT  ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(OUT) :: PXHATM ! Position x in the conformal or cartesian plane at mass points
+  REAL, DIMENSION(:), INTENT(OUT) :: PYHATM ! Position y in the conformal or cartesian plane at mass points
+
+  CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', PXHAT, PXHATM )
+  CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', PYHAT, PYHATM )
+
+END SUBROUTINE INTERP_HORGRID_TO_MASSPOINTS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+PURE SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
+  ! Interpolate vertical grid to mass points
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:), INTENT(IN)  :: PZHAT  ! Position z in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(OUT) :: PZHATM ! Position z in the conformal or cartesian plane at mass points
+
+  PZHATM( : UBOUND(PZHATM,1)-1 ) = 0.5 * PZHAT( : UBOUND(PZHAT,1)-1 ) + 0.5 * PZHAT( LBOUND(PZHAT,1)+1 : UBOUND(PZHAT,1) )
+  PZHATM( UBOUND(PZHATM,1)     ) = 1.5 * PZHAT( UBOUND(PZHAT,1)     ) - 0.5 * PZHAT( UBOUND(PZHAT,1)-1 )
+
+END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_GRID_1DIR( HDIR, PHAT, PHATM, PHAT_ll, PHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
+  USE MODD_GRID_n
+  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT, XNEGUNDEF
+
+  USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll
+  USE MODE_GATHER_ll,      ONLY: GATHERALL_FIELD_ll
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CHARACTER(LEN=1),            INTENT(IN)    :: HDIR        ! Direction ('X', 'Y' or 'Z')
+  REAL, DIMENSION(:), TARGET,  INTENT(IN)    :: PHAT        ! Position x, y or z in the conformal or cartesian plane
+  REAL, DIMENSION(:), TARGET,  INTENT(IN)    :: PHATM       ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
+
+  INTEGER                     :: IERR
+  LOGICAL                     :: GALLOC, GALLOCM !Remark: do not deallocate (PHAT_ll/PHATM_ll may be used outside this subroutine)
+
+  GALLOC  = .FALSE.
+  GALLOCM = .FALSE.
+
+
+  IF ( .NOT. ASSOCIATED( PHAT_BOUND ) ) THEN
+    ALLOCATE( PHAT_BOUND(NHAT_BOUND_SIZE) )
+    PHAT_BOUND(:) = XNEGUNDEF
+  END IF
+
+  IF ( .NOT. ASSOCIATED( PHATM_BOUND ) ) THEN
+    ALLOCATE( PHATM_BOUND(NHAT_BOUND_SIZE) )
+    PHATM_BOUND(:) = XNEGUNDEF
+  END IF
+
+  SELECT CASE (HDIR)
+    CASE ( 'X' )
+      IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHAT_ll,  PHAT,  'XX', GALLOC )
+        CALL GATHERALL_FIELD_ll( 'XX', PHAT,  PHAT_ll,  IERR )
+      END IF
+      IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'XX', GALLOCM )
+        CALL GATHERALL_FIELD_ll( 'XX', PHATM, PHATM_ll, IERR )
+      END IF
+
+      ! Global boundaries on u points
+      PHAT_BOUND(NEXTE_XMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_XMIN) = PHAT_ll( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_XMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_XMIN) = PHATM_ll( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT )
+
+    CASE ( 'Y' )
+      IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHAT_ll,  PHAT,  'YY', GALLOC )
+        CALL GATHERALL_FIELD_ll( 'YY', PHAT,  PHAT_ll,  IERR )
+      END IF
+      IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'YY', GALLOCM )
+        CALL GATHERALL_FIELD_ll( 'YY', PHATM, PHATM_ll, IERR )
+      END IF
+
+      ! Global boundaries on v points
+      PHAT_BOUND(NEXTE_YMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_YMIN) = PHAT_ll( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_YMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_YMIN) = PHATM_ll( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT )
+
+    CASE ( 'Z' )
+      PHAT_ll  => PHAT
+      PHATM_ll => PHATM
+
+      ! Global boundaries on w points
+      PHAT_BOUND(NEXTE_ZMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_ZMIN) = PHAT_ll( JPVEXT + 1 )
+      PHAT_BOUND(NPHYS_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_ZMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_ZMIN) = PHATM_ll( JPVEXT + 1 )
+      PHATM_BOUND(NPHYS_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPVEXT )
+
+    CASE DEFAULT
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR', 'invalid direction (valid: X, Y or Z)' )
+
+  END SELECT
+
+END SUBROUTINE STORE_GRID_1DIR
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                        &
+                              PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHAT       ! Position x in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHAT       ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHAT       ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHATM      ! idem at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
+
+  REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll
+  REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll
+
+  PZHAT_DUMMY_ll  => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+  CALL STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM, PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+
+  PZHAT_DUMMY_ll => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+END SUBROUTINE STORE_GLOB_GRID
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM,                                     &
+                                 PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHAT       ! Position x in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHAT       ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHATM      ! idem at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
+
+  CALL STORE_GRID_1DIR( 'X', PXHAT, PXHATM, PXHAT_ll, PXHATM_ll, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR( 'Y', PYHAT, PYHATM, PYHAT_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
+END SUBROUTINE STORE_GLOB_HORGRID
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHAT       ! Position z in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHATM      ! idem at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
+
+  REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll
+  REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll
+
+  PZHAT_DUMMY_ll  => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+  CALL STORE_GRID_1DIR( 'Z', PZHAT, PZHATM, PZHAT_DUMMY_ll, PZHATM_DUMMY_ll, PHAT_BOUND, PHATM_BOUND )
+
+  PZHAT_DUMMY_ll => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+END SUBROUTINE STORE_GLOB_VERGRID
+!-----------------------------------------------------------------
+
+
+END MODULE MODE_SET_GRID
diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90
index 42e384c2a602a5eff3e16415e897edff93ae7922..7c4ea5e2e9c224c4d9d1d2022b8fcc0c372d1d8f 100644
--- a/src/MNH/set_perturb.f90
+++ b/src/MNH/set_perturb.f90
@@ -1,4 +1,4 @@
-!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.
@@ -164,10 +164,6 @@ REAL,DIMENSION(:,:),ALLOCATABLE :: ZCY_ll,ZSY_ll  ! and y directions
 REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZT    ! temperature
 REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZHU   ! rel. humidity
 !
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
-                                                 ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
-                                                 ! plane (array on the complete domain)
 INTEGER :: IIU_ll,IJU_ll ! horizontal,vertical size of the extended global domain 
 INTEGER :: IIB_ll,IJB_ll ! global coordinate of the physical global domain 
 INTEGER :: IIE_ll,IJE_ll ! 
@@ -241,9 +237,6 @@ IJE=IJU-JPHEXT
 !
 IIU_ll=NIMAX_ll+2*JPHEXT
 IJU_ll=NJMAX_ll+2*JPHEXT
-ALLOCATE(ZXHAT_ll(IIU_ll),ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
 !  
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IIB_ll=1+JPHEXT
@@ -269,17 +262,16 @@ SELECT CASE(CPERT_KIND)
   CASE('TH')
     ZDIST(:,:,:) = 2.
 ! C grid shift
-    ZCENTERX=(ZXHAT_ll(2)+ZXHAT_ll(IIU_ll))*0.5
-    ZCENTERY=(ZYHAT_ll(2)+ZYHAT_ll(IJU_ll))*0.5
+    ZCENTERX=(XXHAT_ll(2)+XXHAT_ll(IIU_ll))*0.5
+    ZCENTERY=(XYHAT_ll(2)+XYHAT_ll(IJU_ll))*0.5
 !
     DO JK =IKB,IKE
       DO JJ = IJB,IJE
         DO JI = IIB,IIE
-          ZDIST(JI,JJ,JK) = SQRT(                         &
-          (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - ZCENTERX ) / XRADX)**2 + &
-          (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - ZCENTERY ) / XRADY)**2 + &
-          (( (XZHAT(JK)+XZHAT(JK+1))*0.5 - XCENTERZ ) / XRADZ)**2   &
-                                )
+          ZDIST(JI,JJ,JK) = SQRT(                                           &
+                                  ( ( XXHATM(JI) - ZCENTERX ) / XRADX)**2 + &
+                                  ( ( XYHATM(JJ) - ZCENTERY ) / XRADY)**2 + &
+                                  ( ( XZHATM(JK) - XCENTERZ ) / XRADZ)**2   )
         END DO
       END DO
     END DO
@@ -340,8 +332,8 @@ SELECT CASE(CPERT_KIND)
 !
     DO JI = 1,IIU_ll
       DO JJ = 1,IJU_ll
-        ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((ZYHAT_ll(JJ)-ZYHAT_ll(IJ0))/XRADY)**2)       &
-                             * COS(2.*XPI/XRADX*ZXHAT_ll(JI))
+        ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((XYHAT_ll(JJ)-XYHAT_ll(IJ0))/XRADY)**2)       &
+                             * COS(2.*XPI/XRADX*XXHAT_ll(JI))
       END DO
     END DO
 !
@@ -349,8 +341,8 @@ SELECT CASE(CPERT_KIND)
 !
     DO JI = 1,IIU_ll
       DO JJ = IJMIN,IJMAX
-        ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-ZYHAT_ll(JJ+1)+ZYHAT_ll(JJ) )
-        ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( ZXHAT_ll(JI+1)-ZXHAT_ll(JI) )
+        ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-XYHAT_ll(JJ+1)+XYHAT_ll(JJ) )
+        ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( XXHAT_ll(JI+1)-XXHAT_ll(JI) )
       END DO
     END DO
 !
@@ -559,8 +551,6 @@ SELECT CASE(CPERT_KIND)
 !
 END SELECT
 !
-DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
-!
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE SET_PERTURB 
diff --git a/src/MNH/set_ref.f90 b/src/MNH/set_ref.f90
index 3fbd530b720dad8acead062a8a9854cfbc3950a0..02496e9208ff2a06760bf878f1626b76a2616898 100644
--- a/src/MNH/set_ref.f90
+++ b/src/MNH/set_ref.f90
@@ -1,4 +1,4 @@
-!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.
@@ -10,7 +10,7 @@ MODULE MODI_SET_REF
 INTERFACE
 !
       SUBROUTINE SET_REF(KMI,TPINIFILE,                                    &
-                         PZZ,PZHAT,PJ,PDXX,PDYY,HLBCX,HLBCY,               &
+                         PZZ,PZHATM,PJ,PDXX,PDYY,HLBCX,HLBCY,              &
                          PREFMASS,PMASS_O_PHI0,PLINMASS,                   &
                          PRHODREF,PTHVREF,PRVREF,PEXNREF,PRHODJ            )
 !
@@ -20,7 +20,7 @@ INTEGER,                INTENT(IN)  :: KMI       ! Model index
 TYPE(TFILEDATA),        INTENT(IN)  :: TPINIFILE ! Initial file
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PZZ       ! Height  of the w levels
                                                  ! with orography                                          
-REAL, DIMENSION(:),     INTENT(IN)  :: PZHAT     ! Height of the w levels
+REAL, DIMENSION(:),     INTENT(IN)  :: PZHATM    ! Height of the w levels at mass points
            ! in the transformed space (GCS transf.) or without orography                                         
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PJ        ! Jacobian 
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! metric coefficient dxx
@@ -54,7 +54,7 @@ END MODULE MODI_SET_REF
 !
 !     #########################################################################
       SUBROUTINE SET_REF(KMI,TPINIFILE,                                &
-                         PZZ,PZHAT,PJ,PDXX,PDYY,HLBCX,HLBCY,           &
+                         PZZ,PZHATM,PJ,PDXX,PDYY,HLBCX,HLBCY,          &
                          PREFMASS,PMASS_O_PHI0,PLINMASS,               &
                          PRHODREF,PTHVREF,PRVREF,PEXNREF,PRHODJ        )
 !     #########################################################################
@@ -176,7 +176,7 @@ INTEGER,                INTENT(IN)  :: KMI       ! Model index
 TYPE(TFILEDATA),        INTENT(IN)  :: TPINIFILE ! Initial file
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PZZ       ! Height  of the w levels
                                                  ! with orography                                          
-REAL, DIMENSION(:),     INTENT(IN)  :: PZHAT     ! Height of the w levels
+REAL, DIMENSION(:),     INTENT(IN)  :: PZHATM    ! Height of the w levels at mass points
            ! in the transformed space (GCS transf.) or without orography                                         
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PJ        ! Jacobian 
 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX      ! metric coefficient dxx
@@ -210,8 +210,6 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZM
                                                  ! with orography
 REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZRHOREF
                                                  ! Reference density
-REAL, DIMENSION(SIZE(PZZ,3))    :: ZZHATM        ! height of the mass levels
-               ! in the transformed space (GCS transf.) or without orography 
 REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDENSOC,ZPFLUX,ZPMASS
 !
 INTEGER             :: IIU        ! Upper dimension in x direction
@@ -282,11 +280,9 @@ END IF
 ! 
 DO JK = 1,IKU-1
   ZZM(:,:,JK) = 0.5*(PZZ(:,:,JK) + PZZ(:,:,JK+1))
-  ZZHATM(JK)  = 0.5*(PZHAT(JK)+PZHAT(JK+1))
 END DO
-ZZHATM(IKU) = 2.* PZHAT(IKU) -ZZHATM(IKU-1)
 ZZM(:,:,IKU)    = 2.* PZZ(:,:,IKU)   -ZZM(:,:,IKU-1)
-! ZZM(:,:,IKU) is always smaller than or equal ZZHATM(IKU)
+! ZZM(:,:,IKU) is always smaller than or equal PZHATM(IKU)
 !
 !
 CALL MPPDB_CHECK3D(ZZM,"SET_REF::ZZM",PRECISION)
@@ -304,16 +300,16 @@ ELSE
 !
     DO JK = 1,IKU
 !
-      IF (ZZM(JI,JJ,JK) >= ZZHATM(IKU)) THEN     ! copy out when  
-        PTHVREF(JI,JJ,JK) =  XTHVREFZ(IKU)       ! ZZM(IKU)= ZZHATM(IKU)  
+      IF (ZZM(JI,JJ,JK) >= PZHATM(IKU)) THEN     ! copy out when
+        PTHVREF(JI,JJ,JK) =  XTHVREFZ(IKU)       ! ZZM(IKU)= PZHATM(IKU)
         PRHODREF(JI,JJ,JK) =  XRHODREFZ(IKU)     ! (in case zs=0.)
 ! 
       ELSE              ! search levels on the mass grid without orography
-        IF (ZZM(JI,JJ,JK) < ZZHATM(2)) THEN
+        IF (ZZM(JI,JJ,JK) < PZHATM(2)) THEN
            IKS=3
         ELSE
           SEARCH : DO JKS = 3,IKU
-            IF((ZZM(JI,JJ,JK) >= ZZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < ZZHATM(JKS))) &
+            IF((ZZM(JI,JJ,JK) >= PZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < PZHATM(JKS))) &
             THEN          ! interpolation with the values on the grid without
                           ! orography
               IKS=JKS
@@ -321,7 +317,7 @@ ELSE
             END IF
           END DO SEARCH
         END IF
-        ZDZ1SDZ = (ZZM(JI,JJ,JK)-ZZHATM(IKS-1)) / (ZZHATM(IKS)-ZZHATM(IKS-1))
+        ZDZ1SDZ = (ZZM(JI,JJ,JK)-PZHATM(IKS-1)) / (PZHATM(IKS)-PZHATM(IKS-1))
         ZDZ2SDZ = 1. - ZDZ1SDZ
         PTHVREF(JI,JJ,JK) = ( ZDZ1SDZ* XTHVREFZ(IKS) )  &
                           + (ZDZ2SDZ* XTHVREFZ(IKS-1) )      
diff --git a/src/MNH/set_refz.f90 b/src/MNH/set_refz.f90
index f6e82cd85f4e20a2e30627462ed593af03d6d0b8..7822c7e60b1cc345e89cfa995891195401abd656 100644
--- a/src/MNH/set_refz.f90
+++ b/src/MNH/set_refz.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -193,8 +193,7 @@ XTHVREFZ(:)=-999.
 !ocl scalar
 !!!!!!!!!!!!!!!!  FUJI  compiler directive !!!!!!!!!!
 DO JK=IKB,IKU-1
-    XTHVREFZ(JK)= ZSECT(0.5*(XZHAT(JK)+XZHAT(JK+1)),             &
-                        ZZMASS(:,:,IKB:IKE+1),PTHV(:,:,IKB:IKE+1))
+    XTHVREFZ(JK) = ZSECT( XZHATM(JK), ZZMASS(:,:,IKB:IKE+1), PTHV(:,:,IKB:IKE+1) )
 END DO
     XTHVREFZ(IKU)=XTHVREFZ(IKU-1)                                 &
                  +(XTHVREFZ(IKU-1)-XTHVREFZ(IKU-2))               &
@@ -217,8 +216,7 @@ XTHVREFZ(1)=XTHVREFZ(2)
 ZRREFZ(:)=-999.
 !ocl scalar
 DO JK=IKB,IKU-1
-    ZRREFZ(JK)= ZSECT(0.5*(XZHAT(JK)+XZHAT(JK+1)),              &
-                      ZZMASS(:,:,IKB:IKE+1),PRV(:,:,IKB:IKE+1))
+    ZRREFZ(JK) = ZSECT( XZHATM(JK), ZZMASS(:,:,IKB:IKE+1), PRV(:,:,IKB:IKE+1) )
 END DO
     ZRREFZ(IKU)=ZRREFZ(IKU-1)                                   &
                +(ZRREFZ(IKU-1)-ZRREFZ(IKU-2))                   &
@@ -233,7 +231,7 @@ IF (ZRREFZ(IMINLEVEL)==0) THEN
 ELSE
   ZCOEFB=-(LOG(ZRREFZ(IMINLEVEL+1))-LOG(ZRREFZ(IMINLEVEL))) &
        /(0.5*(XZHAT(IMINLEVEL+2)-XZHAT(IMINLEVEL)))
-  ZCOEFA=ZRREFZ(IMINLEVEL)*EXP(ZCOEFB*0.5*(XZHAT(IMINLEVEL+1)+XZHAT(IMINLEVEL)))
+  ZCOEFA=ZRREFZ(IMINLEVEL)*EXP(ZCOEFB*XZHATM(IMINLEVEL))
   WHERE (ZRREFZ==-999.)
     ZRREFZ(:)=ZCOEFA*EXP(-ZCOEFB*0.5*(XZHAT(:)+EOSHIFT(XZHAT(:),1)))
   END WHERE
diff --git a/src/MNH/set_relfrc.f90 b/src/MNH/set_relfrc.f90
index d53c5ae3696c64ed0033d848869479f61bab9f88..857e92ede1b7d77173aff94e05a03c809f730a6e 100644
--- a/src/MNH/set_relfrc.f90
+++ b/src/MNH/set_relfrc.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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.
@@ -126,7 +126,6 @@ CHARACTER(LEN=48)   :: CFNAM_MEANVAR_REL
 CHARACTER(LEN=28) :: CFNAM_REL
 !
 REAL, DIMENSION(:), ALLOCATABLE::     ZHEIGHTMFR,ZHEIGHTFR,ZTHVUFR,ZTHVUF
-REAL, DIMENSION(:), ALLOCATABLE::     ZZHATM
 REAL, DIMENSION(:), ALLOCATABLE::     ZPRESS_REL
 REAL, DIMENSION(:), ALLOCATABLE::     ZTHDFR,ZTHVFR,ZRVFR
 !
@@ -192,9 +191,6 @@ ALLOCATE(ZHEIGHTFR(NPRESSLEV_REL))
 ! allocations pour le module moddb_advfrc
 !  Adv forcing
 ! 
-! For reading in PRE_IDEA1.nam
-ALLOCATE(ZZHATM(IKU))
-!
 ! relaxation profile
 ALLOCATE(ZRVREL1D(IIU,IKU,NRELFRC))
 ALLOCATE(ZVREL1D(IIU,IKU,NRELFRC))
@@ -259,15 +255,11 @@ DO JKT = 1,NRELFRC
 
   END IF
   !
-  ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1))
-  ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1)
-!
-
   DO JK = 1,IKU
-    IF (ZZHATM(JK) <= ZHEIGHTFR(1)) THEN
+    IF (XZHATM(JK) <= ZHEIGHTFR(1)) THEN
 !
  ! extrapolation below the first level
-      ZDZSDH  = (ZZHATM(JK)-ZHEIGHTFR(1)) / (ZHEIGHTFR(2)-ZHEIGHTFR(1))
+      ZDZSDH  = (XZHATM(JK)-ZHEIGHTFR(1)) / (ZHEIGHTFR(2)-ZHEIGHTFR(1))
       !
       ZRVREL1D(IIB:IIE,JK,JKT) = ZRVREL(IIB:IIE,1,JKT) + & 
       (ZRVREL(IIB:IIE,2,JKT) - ZRVREL(IIB:IIE,1,JKT)) * ZDZSDH
@@ -276,10 +268,10 @@ DO JKT = 1,NRELFRC
       ZTHREL1D(IIB:IIE,JK,JKT) = ZtHREL(IIB:IIE,1,JKT) + & 
       (ZTHREL(IIB:IIE,2,JKT) - ZTHREL(IIB:IIE,1,JKT)) * ZDZSDH
 
-    ELSE IF (ZZHATM(JK) > ZHEIGHTFR(NPRESSLEV_REL) ) THEN
+    ELSE IF (XZHATM(JK) > ZHEIGHTFR(NPRESSLEV_REL) ) THEN
 !
  ! extrapolation above the last level
-      ZDZSDH  = (ZZHATM(JK) - ZHEIGHTFR(NPRESSLEV_REL)) /      &
+      ZDZSDH  = (XZHATM(JK) - ZHEIGHTFR(NPRESSLEV_REL)) /      &
                 (ZHEIGHTFR(NPRESSLEV_REL) - ZHEIGHTFR(NPRESSLEV_REL-1))
       !
       ZRVREL1D(IIB:IIE,JK,JKT)  = ZRVREL(IIB:IIE,NPRESSLEV_REL,JKT) +  & 
@@ -294,9 +286,9 @@ DO JKT = 1,NRELFRC
  ! interpolation between first and last levels
 !
       DO JKLEV = 1,NPRESSLEV_REL-1
-        IF ( (ZZHATM(JK) > ZHEIGHTFR(JKLEV)).AND. &
-             (ZZHATM(JK) <= ZHEIGHTFR(JKLEV+1))   ) THEN
-          ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTFR(JKLEV)) /  &
+        IF ( (XZHATM(JK) > ZHEIGHTFR(JKLEV)).AND. &
+             (XZHATM(JK) <= ZHEIGHTFR(JKLEV+1))   ) THEN
+          ZDZ1SDH = (XZHATM(JK) - ZHEIGHTFR(JKLEV)) /  &
                     (ZHEIGHTFR(JKLEV+1)-ZHEIGHTFR(JKLEV))
           ZDZ2SDH = 1.- ZDZ1SDH
           ZRVREL1D(IIB:IIE,JK,JKT)  = ZRVREL(IIB:IIE,JKLEV,JKT)*ZDZ2SDH & 
@@ -376,8 +368,6 @@ DEALLOCATE(ZTHVUFR)
 DEALLOCATE(ZRVFR)
 
 DEALLOCATE(ZHEIGHTFR)
-! pour lecture dans PREIDEA
-DEALLOCATE(ZZHATM)
 DEALLOCATE(ZPRESS_REL)
 
 DEALLOCATE(ZRVREL1D)
diff --git a/src/MNH/setlb_lg.f90 b/src/MNH/setlb_lg.f90
index 89bb3d3ecd0a556b7194a93f99b29c8540740641..bbdf91a69606292a347431757efb7364bc078968 100644
--- a/src/MNH/setlb_lg.f90
+++ b/src/MNH/setlb_lg.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ###################
@@ -50,13 +50,13 @@
 !              ------------
 !
 !
-USE MODD_TIME
-USE MODD_TIME_n
-USE MODD_LBC_n
-USE MODD_LSFIELD_n
 USE MODD_GRID_n
+USE MODD_LBC_n
 USE MODD_LG
+USE MODD_LSFIELD_n
 USE MODD_NSV,         ONLY : NSV_LGBEG,NSV_LGEND
+USE MODD_TIME
+USE MODD_TIME_n
 !
 USE MODE_DATETIME
 USE MODE_ll
@@ -80,19 +80,12 @@ IKU=SIZE(XZZ,3)
 CALL DATETIME_DISTANCE(TDTEXP,TDTCUR,ZTEMP_DIST)
 !
 IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
-  DO JK=1,IKU
-    DO JJ=1,IJU
-      XLBXSVM(1,JJ,JK,NSV_LGBEG)=0.5*(XXHAT(1)+XXHAT(2))-ZTEMP_DIST*XLGSPEED
-    END DO
-  END DO
-!
-  DO JK=1,IKU
-    DO JJ=1,IJU-1
-      XLBXSVM(1,JJ,JK,NSV_LGBEG+1)=0.5*(XYHAT(JJ)+XYHAT(JJ+1))
-    END DO
-    XLBXSVM(1,IJU,JK,NSV_LGBEG+1)=1.5*XYHAT(IJU)-0.5*XYHAT(IJU-1)
+  XLBXSVM(1,1:IJU,1:IKU,NSV_LGBEG)  = XXHATM(1) - ZTEMP_DIST * XLGSPEED
+
+  DO JK = 1, IKU
+    XLBXSVM(1,1:IJU,JK,NSV_LGBEG+1) = XYHATM(1:IJU)
   END DO
-  !
+
   DO JJ=1,IJU
     DO JK=1,IKU-1
       XLBXSVM(1,JJ,JK,NSV_LGEND)=0.5*(XZZ(1,JJ,JK)+XZZ(1,JJ,JK+1))
@@ -100,69 +93,44 @@ IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
     XLBXSVM(1,JJ,IKU,NSV_LGEND)=1.5*XZZ(1,JJ,IKU)  -0.5*XZZ(1,JJ,IKU-1)
   END DO
 END IF
-  !
+
 IF ( CLBCX(1) /= "CYCL" .AND. LEAST_ll()) THEN
-  DO JK=1,IKU
-    DO JJ=1,IJU
-      XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGBEG)=0.5*(XXHAT(IIU-1)+XXHAT(IIU))+ZTEMP_DIST*XLGSPEED
-    END DO
-  END DO
-!
-  DO JK=1,IKU
-    DO JJ=1,IJU-1
-      XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGBEG+1)=0.5*(XYHAT(JJ)+XYHAT(JJ+1))
-    END DO
-    XLBXSVM(SIZE(XLBXSVM,1),IJU,JK,NSV_LGBEG+1)=1.5*XYHAT(IJU)-0.5*XYHAT(IJU-1)
+  XLBXSVM(SIZE(XLBXSVM,1),1:IJU,1:IKU,NSV_LGBEG)  = XXHATM(IIU-1) + ZTEMP_DIST * XLGSPEED
+
+  DO JK = 1, IKU
+    XLBXSVM(SIZE(XLBXSVM,1),1:IJU,JK,NSV_LGBEG+1) = XYHATM(1:IJU)
   END DO
-!
+
   DO JJ=1,IJU
     DO JK=1,IKU-1
       XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGEND)=0.5*(XZZ(IIU,JJ,JK)+XZZ(IIU,JJ,JK+1))
     END DO
     XLBXSVM(SIZE(XLBXSVM,1),JJ,IKU,NSV_LGEND)=1.5*XZZ(IIU,JJ,IKU)-0.5*XZZ(IIU,JJ,IKU-1)
   END DO
-  !
-ENDIF
-  !
+END IF
+
 IF (SIZE(XLBYSVM,1) .NE. 0 .AND. CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
-!
-  DO JK=1,IKU
-    DO JI=1,IIU-1
-      XLBYSVM(JI,1,JK,NSV_LGBEG)=0.5*(XXHAT(JI)+XXHAT(JI+1))
-    END DO
-    XLBYSVM(IIU,1,JK,NSV_LGBEG)=1.5*XXHAT(IIU)-0.5*XXHAT(IIU-1)
-  END DO
-      !
-  DO JK=1,IKU
-    DO JI=1,IIU
-      XLBYSVM(JI,1,JK,NSV_LGBEG+1)=0.5*(XYHAT(1)+XYHAT(2))-ZTEMP_DIST*XLGSPEED
-    END DO
+  DO JK = 1, IKU
+    XLBYSVM(1:IIU,1,JK,NSV_LGBEG)    = XXHATM(1:IIU)
   END DO
-      !
+
+  XLBYSVM(1:IIU,1,1:IKU,NSV_LGBEG+1) = XYHATM(1) - ZTEMP_DIST * XLGSPEED
+
   DO JI=1,IIU
     DO JK=1,IKU-1
       XLBYSVM(JI,1,JK,NSV_LGEND)=0.5*(XZZ(JI,1,JK)+XZZ(JI,1,JK+1))
     END DO
     XLBYSVM(JI,1,IKU,NSV_LGEND)=1.5*XZZ(JI,1,IKU)  -0.5*XZZ(JI,1,IKU-1)
   END DO
+END IF
 
-ENDIF
-    !
 IF (SIZE(XLBYSVM,1) .NE. 0 .AND. CLBCY(1) /= "CYCL" .AND. LNORTH_ll()) THEN
-!
-  DO JK=1,IKU
-    DO JI=1,IIU-1
-      XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGBEG)=0.5*(XXHAT(JI)+XXHAT(JI+1))
-    END DO
-    XLBYSVM(IIU,SIZE(XLBYSVM,2),JK,NSV_LGBEG)=1.5*XXHAT(IIU)-0.5*XXHAT(IIU-1)
-  END DO
-!
-  DO JK=1,IKU
-    DO JI=1,IIU
-      XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGBEG+1)=0.5*(XYHAT(IJU-1)+XYHAT(IJU))+ZTEMP_DIST*XLGSPEED
-    END DO
+  DO JK = 1, IKU
+    XLBYSVM(1:IIU,SIZE(XLBYSVM,2),JK,NSV_LGBEG)    = XXHATM(1:IIU)
   END DO
-!
+
+  XLBYSVM(1:IIU,SIZE(XLBYSVM,2),1:IKU,NSV_LGBEG+1) = XYHATM(IJU-1) + ZTEMP_DIST * XLGSPEED
+
   DO JI=1,IIU
     DO JK=1,IKU-1
       XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGEND)=0.5*(XZZ(JI,IJU,JK)+XZZ(JI,IJU,JK+1))
diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90
index ee2f7e2fb5d794175d12979085583f31a02a53fd..c7ad64d47c3b250dedc7d1006c3ea1200efffc58 100644
--- a/src/MNH/shallow_mf_pack.f90
+++ b/src/MNH/shallow_mf_pack.f90
@@ -128,7 +128,7 @@ USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX
 USE MODD_BUDGET,          ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th
 USE MODD_CONF
 USE MODD_IO,              ONLY: TFILEDATA
-USE modd_field,           ONLY: tfielddata, TYPEREAL
+use modd_field,           only: tfieldmetadata, TYPEREAL
 USE MODD_NSV,             ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND
 USE MODD_PARAMETERS
 USE MODD_PARAM_ICE,       ONLY: CFRAC_ICE_SHALLOW_MF
@@ -181,6 +181,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud
 REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
 !
 REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions
+!
 !                     0.2  Declaration of local variables
 !
 REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT_TURB   ! tendency of U   by turbulence only
@@ -219,12 +220,11 @@ INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2))     :: IKLCL,IKETL,IKCTL ! level of
 INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV  
 INTEGER :: JK,JRR,JSV                          ! Loop counters
 
-
 LOGICAL :: LSTATNW  !  switch for HARMONIE-AROME turb physics option
                     ! TODO: linked with modd_turbn + init at default_desfmn 
 
-TYPE(TFIELDDATA) :: TZFIELD
-TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK
+TYPE(TFIELDMETADATA) :: TZFIELD
+TYPE(DIMPHYEX_t)     :: YLDIMPHYEXPACK
 !------------------------------------------------------------------------
 !
 !!! 1. Initialisation
@@ -301,69 +301,74 @@ END DO
 !
 IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   ! stores the conservative potential temperature vertical flux
-  TZFIELD%CMNHNAME   = 'MF_THW_FLX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MF_THW_FLX'
-  TZFIELD%CUNITS     = 'K m s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THW_FLX'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'MF_THW_FLX',       &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = 'MF_THW_FLX',       &
+    CUNITS     = 'K m s-1',          &
+    CDIR       = 'XY',               &
+    CCOMMENT   = 'X_Y_Z_MF_THW_FLX', &
+    NGRID      = 4,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 3,                  &
+    LTIMEDEP   = .TRUE.              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZTHMF)
   !
   ! stores the conservative mixing ratio vertical flux
-  TZFIELD%CMNHNAME   = 'MF_RCONSW_FLX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MF_RCONSW_FLX'
-  TZFIELD%CUNITS     = 'K m s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_RCONSW_FLX'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(             &
+      CMNHNAME   = 'MF_RCONSW_FLX',       &
+      CSTDNAME   = '',                    &
+      CLONGNAME  = 'MF_RCONSW_FLX',       &
+      CUNITS     = 'K m s-1',             &
+      CDIR       = 'XY',                  &
+      CCOMMENT   = 'X_Y_Z_MF_RCONSW_FLX', &
+      NGRID      = 4,                     &
+      NTYPE      = TYPEREAL,              &
+      NDIMS      = 3,                     &
+      LTIMEDEP   = .TRUE.                 )
   CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZRMF)
   !
   ! stores the theta_v vertical flux
-  TZFIELD%CMNHNAME   = 'MF_THVW_FLX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MF_THVW_FLX'
-  TZFIELD%CUNITS     = 'K m s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THVW_FLX'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'MF_THVW_FLX',       &
+    CSTDNAME   = '',                  &
+    CLONGNAME  = 'MF_THVW_FLX',       &
+    CUNITS     = 'K m s-1',           &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_MF_THVW_FLX', &
+    NGRID      = 4,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
   CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF)
   !
  IF (PARAM_MFSHALLN%LMIXUV) THEN
   ! stores the U momentum vertical flux
-  TZFIELD%CMNHNAME   = 'MF_UW_FLX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MF_UW_FLX'
-  TZFIELD%CUNITS     = 'm2 s-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_UW_FLX'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MF_UW_FLX',       &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MF_UW_FLX',       &
+    CUNITS     = 'm2 s-2',          &
+    CDIR       = 'XY',              &
+    CCOMMENT   = 'X_Y_Z_MF_UW_FLX', &
+    NGRID      = 4,                 &
+    NTYPE      = TYPEREAL,          &
+    NDIMS      = 3,                 &
+    LTIMEDEP   = .TRUE.             )
   CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZUMF)
   !
   ! stores the V momentum vertical flux
-  TZFIELD%CMNHNAME   = 'MF_VW_FLX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MF_VW_FLX'
-  TZFIELD%CUNITS     = 'm2 s-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_VW_FLX'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MF_VW_FLX',       &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MF_VW_FLX',       &
+    CUNITS     = 'm2 s-2',          &
+    CDIR       = 'XY',              &
+    CCOMMENT   = 'X_Y_Z_MF_VW_FLX', &
+    NGRID      = 4,                 &
+    NTYPE      = TYPEREAL,          &
+    NDIMS      = 3,                 &
+    LTIMEDEP   = .TRUE.             )
   CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZVMF)
   !
  END IF
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 881fd4e6b57fdd0eddef14baf93d6fb0bcc075be..50047fb02056b2cf69a0a7b247ff23c5353c1cb5 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -152,43 +152,31 @@ END MODULE MODI_SPAWN_FIELD2
 !!                   29/04/2016 (J.Escobar) bug in use of ZSVT_C in SET_LSFIELD_1WAY_ll        
 !!      Modification    01/2016  (JP Pinty) Add LIMA
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!      Modification 05/03/2018 (J.Escobar) bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized
-!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  J. Escobar  05/03/2018: bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized
+!  S. Bielli S.   02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
-!!      B. Vie          06/2020 Add prognostic supersaturation for LIMA
+!  B. Vie         06/2020: Add prognostic supersaturation for LIMA
 !  P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
-USE MODD_2D_FRC
-USE MODD_ADVFRC_n
-USE MODD_BIKHARDT_n
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
-USE MODD_CONF
-USE MODD_CST
+USE MODD_2D_FRC,          ONLY: L2D_ADV_FRC, L2D_REL_FRC
+USE MODD_ADVFRC_n,        ONLY: ADVFRC_MODEL
+USE MODD_BIKHARDT_N,      ONLY: XBFX1, XBFX2, XBFX3, XBFX4, XBFY1, XBFY2, XBFY3, XBFY4, &
+                                XBMX1, XBMX2, XBMX3, XBMX4, XBMY1, XBMY2, XBMY3, XBMY4
+USE MODD_CST,             ONLY: XCPD, XP00, XRD, XRV
 USE MODD_CONF_n,          ONLY: CONF_MODEL
-USE MODD_DUST,            ONLY: CDUSTNAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-use modd_field,           only: tfielddata, TYPEREAL
+use modd_field,           only: tfieldmetadata, TYPEREAL
 USE MODD_FIELD_n,         ONLY: FIELD_MODEL, XZWS_DEFAULT
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LATZ_EDFLX
+USE MODD_LATZ_EDFLX,      ONLY: LTH_FLX, LUV_FLX
 USE MODD_LBC_n,           ONLY: LBC_MODEL
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_LUNIT_n,         ONLY: LUNIT_MODEL,TLUOUT
-USE MODD_NSV
-USE MODD_REF_n,           ONLY: REF_MODEL
-USE MODD_PARAMETERS
-USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,&
-                                LSCAV, LAERO_MASS, LHHONI
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_RELFRC_n 
-USE MODD_SALT,            ONLY: CSALTNAMES
+USE MODD_LUNIT_n,         ONLY: TLUOUT
+USE MODD_NSV,             ONLY: NSV, NSV_CSBEG, NSV_CSEND, NSV_PPBEG, NSV_PPEND, NSV_USER, TSVLIST
+USE MODD_RELFRC_n,        ONLY: RELFRC_MODEL
 USE MODD_SPAWN
 !
 use mode_bikhardt
@@ -198,7 +186,6 @@ USE MODE_MSG
 USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_THERMO
-USE MODE_TOOLS,           ONLY: UPCASE
 !
 IMPLICIT NONE
 !
@@ -269,6 +256,7 @@ INTEGER  :: IMI, JI,KI
 INTEGER  :: IDIMX_C, IDIMY_C
 INTEGER  :: IINFO_ll
 !$
+LOGICAL :: GOLDFILEFORMAT
 ! Arrays for reading fields of input SON 1 file
 REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZWORK3D
 REAL, DIMENSION(:,:),   ALLOCATABLE   :: ZWORK2D
@@ -277,9 +265,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZPABST1,ZHUT1
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1
 LOGICAL :: GUSERV
 !
+CHARACTER(LEN=3)  :: YNUM3
 CHARACTER(LEN=15) :: YVAL
-CHARACTER(LEN=2)  :: INDICE
-TYPE(TFIELDDATA)             :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -289,6 +277,12 @@ TYPE(TFIELDDATA)             :: TZFIELD
 IMI = GET_CURRENT_MODEL_INDEX()
 CALL GOTO_MODEL(2)
 CALL GO_TOMODEL_ll(2, IINFO_ll)
+
+IF (PRESENT(TPSONFILE)) THEN
+  !If TPSONFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+  GOLDFILEFORMAT = (      TPSONFILE%NMNHVERSION(1) < 5                                      &
+                   .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) <6 ) )
+END IF
 !
 !*       1.0  recovers logical unit number of output listing
 !
@@ -839,396 +833,53 @@ IF (PRESENT(TPSONFILE)) THEN
   !
   ! Scalar variables
   !
-  IF (NSV /= 0) THEN
-    ! User scalar variables
-    IF (NSV_USER>0) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = 1, NSV_USER      ! Users Scalar Variables
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! microphysical C2R2 scheme scalar variables
-    IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'm-3'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_C2R2BEG,NSV_C2R2END
-        TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! LIMA variables
-    !
-    DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
-      TZFIELD%CSTDNAME   = ''
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CUNITS     = 'kg-1'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      ! Nc
-      IF (JSV .EQ. NSV_LIMA_NC) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(1))//'T'
-      END IF
-      ! Nr
-      IF (JSV .EQ. NSV_LIMA_NR) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(2))//'T'
-      END IF
-      ! N CCN free
-      IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
-      END IF
-      ! N CCN acti
-      IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
-      END IF
-      ! Scavenging
-      IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-        TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
-        TZFIELD%CUNITS     = 'kg kg-1'
-      END IF
-      ! Ni
-      IF (JSV .EQ. NSV_LIMA_NI) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(1))//'T'
-      END IF
-      ! Ns
-      IF (JSV .EQ. NSV_LIMA_NS) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(2))//'T'
-      END IF
-      ! Ng
-      IF (JSV .EQ. NSV_LIMA_NG) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(3))//'T'
-      END IF
-      ! Nh
-      IF (JSV .EQ. NSV_LIMA_NH) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//'T'
-      END IF
-      ! N IFN free
-      IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T'
-      END IF
-      ! N IFN nucl
-      IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T'
-      END IF
-      ! N IMM nucl
-      IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-        WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T'
-      END IF
-      ! Hom. freez. of CCN
-      IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(8))//'T'
-      END IF
-      ! Supersaturation    
-      IF (JSV .EQ. NSV_LIMA_SPRO) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(5))//'T'
-      END IF
-      ! time t
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    !
-    ! ELEC Scalar Variables
-    !
-    IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_ELECBEG,NSV_ELECEND
-        TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN
-          TZFIELD%CUNITS   = 'C m-3'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        ELSE
-          TZFIELD%CUNITS   = 'm-3'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
-        END IF
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Chemical Scalar Variables
-    !
-    IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-        TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Ice phase chemical Scalar Variables
-    !
-    IF (NSV_CHICEND>=NSV_CHICBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_CHICBEG,NSV_CHICEND
-        CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
-        TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Orilam Scalar Variables
-    !
-    IF (NSV_AEREND>=NSV_AERBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_AERBEG,NSV_AEREND
-        TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Dust Scalar Variables
-    !
-    IF (NSV_DSTEND>=NSV_DSTBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_DSTBEG,NSV_DSTEND
-        TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Sea Salt Scalar Variables
-    !
-    IF (NSV_SLTEND>=NSV_SLTBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_SLTBEG,NSV_SLTEND
-        TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! LG Scalar Variables
-    !
-    IF (NSV_LGEND>=NSV_LGBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'm'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_LGBEG,NSV_LGEND
-        TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! LNOx Scalar Variables
-    !
-!PW:TODO/bug1?: LINOX or LINOXT?
-!PW:TODO/bug2?: Same name of variable in a loop!
-    IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp' !PW: TODO: not sure (depends if LINOX or LINOXT)
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-        TZFIELD%CMNHNAME   = 'LINOX'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Passive scalar variables
-    !
-    IF (NSV_PPEND>=NSV_PPBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_PPBEG,NSV_PPEND
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
+  DO JSV = 1, NSV
+    TZFIELD = TSVLIST(JSV)
+    IF ( GOLDFILEFORMAT ) THEN
+      IF ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+           ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. &
 #ifdef MNH_FOREFIRE
-    !
-    ! ForeFire variables
-    !
-    IF (NSV_FFEND>=NSV_FFBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_FFBEG,NSV_FFEND
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
+           ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. &
 #endif
-    !
-    ! Passive scalar variables
-    !
-    IF (NSV_CSEND>=NSV_CSBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_CSBEG,NSV_CSEND
+           ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
+        !Some variables were written with an other name in MesoNH < 5.6
         WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
         TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CSTDNAME   = ''
         TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-    !
-    ! Passive scalar variables
-    !
-    IF (NSV_PP>=1) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'm-3'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = 1,NSV_PP
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
-    END IF
-#ifdef MNH_FOREFIRE
-    !
-    ! ForeFire variables
-    !
-    IF (NSV_FF>=1) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'm-3'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = 1,NSV_FF
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_FFBEG-1
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_FFBEG-1
-        CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
+      ELSE
+        !Scalar variables were written with a T suffix in older versions
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      END IF
     END IF
-#endif
-  END IF
+
+    CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP )
+
+    IF( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :)
+  END DO
+  !
+  ! Passive scalar variables
+  !
+  DO JSV = NSV_PPBEG, NSV_PPEND
+    WRITE( YNUM3, '( I3.3 )' ) JSV
+
+    TZFIELD = TFIELDMETADATA(            &
+      CMNHNAME   = 'ATC' // YNUM3,       &
+      CSTDNAME   = '',                   &
+      CLONGNAME  = 'ATC' // YNUM3,       &
+      CCOMMENT   = 'X_Y_Z_ATC' // YNUM3, &
+      CUNITS     = 'm-3',                &
+      CDIR       = 'XY',                 &
+      NGRID      = 1,                    &
+      NTYPE      = TYPEREAL,             &
+      NDIMS      = 3,                    &
+      LTIMEDEP   = .TRUE.                )
+
+    CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP )
+
+    IF( IRESP == 0 ) PATC(KIB2:KIE2, KJB2:KJE2, :, JSV-NSV_PPBEG+1) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :)
+  END DO
   !
   ! Secondary pronostic variables
   !
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 4ba0d58a36220aa6703065ab8e356a3a0494bfaa..8521be04db1d670e423d1277eb0daefcb5d1efa3 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -9,11 +9,13 @@ MODULE MODI_SPAWN_GRID2
 !
 INTERFACE
 !
-     SUBROUTINE SPAWN_GRID2 (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,         &
-                             PLONOR,PLATOR,PXHAT,PYHAT,PZHAT,PZTOP,           &
-                             OSLEVE,PLEN1,PLEN2,                              &
-                             PZS,PZSMT,PZS_LS,PZSMT_LS,                       &
-                             TPDTMOD,TPDTCUR                                  )
+     SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
+                             PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,                    &
+                             PHAT_BOUND, PHATM_BOUND,                                     &
+                             PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
+                             PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
+                             TPDTMOD, TPDTCUR                                             )
 !
 USE MODD_TIME
 !
@@ -23,22 +25,29 @@ INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the model 2 domain, relative to model
 INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
 INTEGER,   INTENT(IN)  :: KDYRATIO   ! between model 2 and model 1
 !
-REAL,                 INTENT(INOUT) :: PLATOR            ! Latitude of the origine point
-REAL,                 INTENT(INOUT) :: PLONOR            ! Longitude of the origine point
-REAL, DIMENSION(:),   INTENT(INOUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
+REAL,                 INTENT(OUT) :: PLATOR            ! Latitude of the origine point
+REAL,                 INTENT(OUT) :: PLONOR            ! Longitude of the origine point
+REAL, DIMENSION(:),   INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
                                      ! conformal plane or on the cartesian plane
+REAL, DIMENSION(:),   INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the
+                                     ! conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL,                 INTENT(OUT)   :: PZTOP             ! model top (m)
 LOGICAL,              INTENT(OUT)   :: OSLEVE            ! flag for SLEVE coordinate
 REAL,                 INTENT(OUT)   :: PLEN1             ! Decay scale for smooth topography
 REAL,                 INTENT(OUT)   :: PLEN2             ! Decay scale for small-scale topography deviation
-REAL, DIMENSION(:,:), INTENT(INOUT) :: PZS               ! orography
-REAL, DIMENSION(:,:), INTENT(INOUT) :: PZSMT             ! smooth orography
+REAL, DIMENSION(:,:), INTENT(OUT)   :: PZS               ! orography
+REAL, DIMENSION(:,:), INTENT(OUT)   :: PZSMT             ! smooth orography
 REAL, DIMENSION(:,:), INTENT(OUT)   :: PZS_LS            ! interpolated orography
 REAL, DIMENSION(:,:), INTENT(OUT)   :: PZSMT_LS          ! interpolated smooth orography
 !
-!
-TYPE (DATE_TIME),     INTENT(INOUT) :: TPDTMOD  ! Date and Time of MODel beginning
-TYPE (DATE_TIME),     INTENT(INOUT) :: TPDTCUR  ! CURent date and time
+TYPE (DATE_TIME),     INTENT(OUT) :: TPDTMOD  ! Date and Time of MODel beginning
+TYPE (DATE_TIME),     INTENT(OUT) :: TPDTCUR  ! CURent date and time
 !
 END SUBROUTINE SPAWN_GRID2
 !
@@ -47,13 +56,15 @@ END INTERFACE
 END MODULE MODI_SPAWN_GRID2
 !
 !
-!     #########################################################################
-     SUBROUTINE SPAWN_GRID2 (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,         &
-                             PLONOR,PLATOR,PXHAT,PYHAT,PZHAT,PZTOP,           &
-                             OSLEVE,PLEN1,PLEN2,                              &
-                             PZS,PZSMT,PZS_LS,PZSMT_LS,                       &
-                             TPDTMOD,TPDTCUR                                  )
-!     #########################################################################
+!    ######################################################################################
+     SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
+                             PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,                    &
+                             PHAT_BOUND, PHATM_BOUND,                                     &
+                             PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
+                             PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
+                             TPDTMOD, TPDTCUR                                             )
+!    ######################################################################################
 !
 !!****  *SPAWN_GRID2 * - subroutine to define spatial and temporal grid.
 !!
@@ -166,6 +177,7 @@ USE MODD_BIKHARDT_n
 USE MODD_VAR_ll
 use mode_bikhardt
 USE MODE_ll
+USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_GRID
 USE MODE_TIME
 USE MODE_GRIDPROJ
 !
@@ -184,10 +196,18 @@ INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the model 2 domain, relative to model
 INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
 INTEGER,   INTENT(IN)  :: KDYRATIO   ! between model 2 and model 1
 !
-REAL,                 INTENT(INOUT) :: PLATOR            ! Latitude of the origine point
-REAL,                 INTENT(INOUT) :: PLONOR            ! Longitude of the origine point
-REAL, DIMENSION(:),   INTENT(INOUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
+REAL,                 INTENT(OUT) :: PLATOR            ! Latitude of the origine point
+REAL,                 INTENT(OUT) :: PLONOR            ! Longitude of the origine point
+REAL, DIMENSION(:),   INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
                                      ! conformal plane or on the cartesian plane
+REAL, DIMENSION(:),   INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the
+                                     ! conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL,                 INTENT(OUT)   :: PZTOP             ! model top (m)
 LOGICAL,              INTENT(OUT)   :: OSLEVE            ! flag for SLEVE coordinate
 REAL,                 INTENT(OUT)   :: PLEN1             ! Decay scale for smooth topography
@@ -197,9 +217,8 @@ REAL, DIMENSION(:,:), INTENT(OUT)   :: PZSMT             ! smooth orography
 REAL, DIMENSION(:,:), INTENT(OUT)   :: PZS_LS            ! interpolated orography
 REAL, DIMENSION(:,:), INTENT(OUT)   :: PZSMT_LS          ! interpolated smooth orography
 !
-!
-TYPE (DATE_TIME),     INTENT(INOUT) :: TPDTMOD  ! Date and Time of MODel beginning
-TYPE (DATE_TIME),     INTENT(INOUT) :: TPDTCUR  ! CURent date and time
+TYPE (DATE_TIME),     INTENT(OUT) :: TPDTMOD  ! Date and Time of MODel beginning
+TYPE (DATE_TIME),     INTENT(OUT) :: TPDTCUR  ! CURent date and time
 !
 !*       0.2    Declarations of local variables for print on FM file
 !
@@ -304,7 +323,8 @@ END IF
 !              --------------------------------------
 !
 PZTOP    = XZTOP1
-PZHAT(:) = XZHAT1(:) 
+PZHAT(:)  = XZHAT1(:)
+PZHATM(:) = XZHATM1(:)
 OSLEVE   = LSLEVE1
 PLEN1    = XLEN11
 PLEN2    = XLEN21
@@ -449,6 +469,14 @@ PLEN2    = XLEN21
   DEALLOCATE(ZYHAT_2D_F)
   DEALLOCATE(ZYHAT_EXTENDED_C)
   DEALLOCATE(ZYHAT_2D_C)
+
+  ! Interpolations of positions to mass points
+  CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
+
+  ! Collect global domain boundaries
+  CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                      &
+                        PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+
 !!$=======
 !!$  IXSIZE1=SIZE(XXHAT1)
 !!$  ALLOCATE(ZXHAT_EXTENDED(IXSIZE1+1))
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index cea25a6b4983f6f107bf671ebb1d45fe1567f216..b592b2651b91459fccb3739cc2f962e426195e91 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -737,6 +737,7 @@ END IF
 !*       4.4   Grid variables (module MODD_GRID2 and MODD_METRICS2):
 !
 ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU))
+ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU))
 ALLOCATE(XZTOP)
 ALLOCATE(XMAP(IIU,IJU))
 ALLOCATE(XLAT(IIU,IJU))
@@ -1061,9 +1062,12 @@ ELSE
         NYEND_TMP = NYEND
 ENDIF
 XZS=0.
-CALL SPAWN_GRID2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,                    &
-                  XLONORI,XLATORI,XXHAT,XYHAT,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2, &
-                  XZS,XZSMT,ZZS_LS,ZZSMT_LS,TDTMOD,TDTCUR                     )
+CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO,                  &
+                  XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, &
+                  XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                      &
+                  XHAT_BOUND, XHATM_BOUND,                                       &
+                  XZTOP, LSLEVE, XLEN1, XLEN2,                                   &
+                  XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR                   )
 !
 CALL MPPDB_CHECK2D(ZZS_LS,"SPAWN_MOD2:ZZS_LS",PRECISION)
 CALL MPPDB_CHECK2D(ZZSMT_LS,"SPAWN_MOD2:ZZSMT_LS",PRECISION)
@@ -1082,10 +1086,12 @@ IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,XDXHAT,XDYHAT,ZZZ_LS,ZJ)
   CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS   ,LSLEVE,XLEN1,XLEN2,XZSMT   ,XDXHAT,XDYHAT,XZZ   ,ZJ)
 ELSE
-  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,&
-                   XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,ZZZ_LS,ZJ)
-  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS   ,LSLEVE,XLEN1,XLEN2,XZSMT   ,&
-                   XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ   ,ZJ)
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, ZZS_LS,      &
+                    LSLEVE, XLEN1, XLEN2, ZZSMT_LS, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, ZZZ_LS, ZJ      )
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,         &
+                    LSLEVE, XLEN1, XLEN2, XZSMT,    XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ,    ZJ      )
 END IF
 !
 !*       5.4  Compute the metric coefficients
@@ -1111,10 +1117,10 @@ CALL MPPDB_CHECK3D(XDZY,"spawnmod2-aftrupdate_metrics:XDZY",PRECISION)
 !
 !*       5.5    3D Reference state variables :
 !
-CALL SET_REF(0,TFILE_DUMMY,                        &
-             XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,   &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,       &
-             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ)
+CALL SET_REF( 0, TFILE_DUMMY,                            &
+              XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
 !
 CALL SECOND_MNH(ZTIME2)
 !
diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90
index 15c7d98b76f599f4f2b5329cc09333df5c484bfb..f0ef283104e3c88829e862df850bdd5a11a39c2e 100644
--- a/src/MNH/spawning.f90
+++ b/src/MNH/spawning.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -280,6 +280,7 @@ USE MODD_PRECIP_n
 XXHAT1 => XXHAT
 XYHAT1 => XYHAT
 XZHAT1 => XZHAT
+XZHATM1 => XZHATM
 XZTOP1 => XZTOP
 XZS1 => XZS
 XZSMT1 => XZSMT
diff --git a/src/MNH/station_reader.f90 b/src/MNH/station_reader.f90
deleted file mode 100644
index 0f6b74663480f8dc78a48531f285837929fdfad6..0000000000000000000000000000000000000000
--- a/src/MNH/station_reader.f90
+++ /dev/null
@@ -1,153 +0,0 @@
-!MNH_LIC Copyright 2020-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!     #######################
-       MODULE MODI_STATION_READER
-!     #######################
-!
-INTERFACE
-!
-SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN)
-        USE MODD_STATION_n
-        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
-        TYPE(STATION),      INTENT(OUT) :: TPSTATION       ! stored blade data
-        LOGICAL,            INTENT(IN)  :: OCARTESIAN
-END SUBROUTINE READ_CSV_STATION
-!
-END INTERFACE
-!
-END MODULE MODI_STATION_READER
-!-------------------------------------------------------------------
-!
-!!****  *EOL_READER* -
-!!
-!!    PURPOSE
-!!    -------
-!!    Prescribe probes through a CSV file
-!!
-!!    AUTHOR
-!!    ------
-!!     E. Jézéquel 		*CNRM & IFPEN*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     03/2020      Original
-!!
-!!---------------------------------------------------------------
-!
-!#########################################################
-SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN)
-USE MODD_ALLSTATION_n
-USE MODD_STATION_n
-USE MODD_PARAMETERS
-USE MODD_TYPE_STATION
-USE MODI_INI_SURFSTATION_n
-
-!
-CHARACTER(LEN=*),   INTENT(IN)    :: HFILE      ! file to read
-TYPE(STATION),      INTENT(INOUT) :: TPSTATION     ! dummy stored
-LOGICAL,            INTENT(IN)    :: OCARTESIAN
-!
-INTEGER                           :: INBLINE      ! Nb of line in csv file
-!
-CHARACTER(LEN=80)                 :: YERROR
-CHARACTER(LEN=400)                :: YSTRING
-INTEGER                           :: ILU     ! logical unit of the file
-!
-
-! Open file
-OPEN(NEWUNIT=ILU,FILE=HFILE, FORM='formatted')
-! Count lines  
-REWIND(ILU)
-INBLINE=0
-DO
- READ(ILU,END=101,FMT='(A400)') YSTRING
-!* analyses if the record has been written in French convention 
- CALL FRENCH_TO_ENGLISH(YSTRING)                                         ! analyse de convention fr ou eng
- IF (LEN_TRIM(YSTRING) > 0) THEN
-  INBLINE = INBLINE + 1
- END IF
-END DO
-!
-101 CONTINUE
- IF (INBLINE == 0) THEN
-  YERROR = 'Data not found in file : '//TRIM(HFILE)
-  PRINT*, YERROR
- ELSE 
-  ! Save number of station 
-  NUMBSTAT = INBLINE - 1 
-  !
-  ! Allocation des tableaux
-  ALLOCATE(TPSTATION%LAT(NUMBSTAT))
-  ALLOCATE(TPSTATION%LON(NUMBSTAT)) 
-  ALLOCATE(TPSTATION%X(NUMBSTAT))
-  ALLOCATE(TPSTATION%Y(NUMBSTAT))
-  ALLOCATE(TPSTATION%Z(NUMBSTAT))
-  ALLOCATE(TPSTATION%K(NUMBSTAT))
-  !ALLOCATE(TPSTATION%STEP(NUMBSTAT))
-  ALLOCATE(TPSTATION%NAME(NUMBSTAT))
-!  ALLOCATE(TPSTATION%TYPE(NUMBSTAT))
-
-  TPSTATION%LON  = XUNDEF
-  TPSTATION%LAT  = XUNDEF
-  TPSTATION%Z    = XUNDEF
-  TPSTATION%K    = XUNDEF
-  TPSTATION%X    = XUNDEF
-  TPSTATION%Y    = XUNDEF
-  TPSTATION%NAME = "        "
-!  TPSTATION%TYPE = "        "
-  ! Nouvelle lecture 
-  REWIND(ILU)
-  READ(ILU,FMT='(A400)') YSTRING ! Lecture du header
-  !
-  ! Save the data
-  IF (OCARTESIAN) THEN
-   INBLINE = 1
-   DO INBLINE=1, NUMBSTAT
-    READ(ILU,FMT='(A400)') YSTRING
-    READ(YSTRING,*) TPSTATION%NAME(INBLINE), & !TPSTATION%TYPE(INBLINE),& 
-    TPSTATION%X(INBLINE), TPSTATION%Y(INBLINE), TPSTATION%Z(INBLINE)!,&
-   END DO
-   REWIND(ILU)
-   CLOSE(ILU)
-   RETURN
-  ELSE
-   INBLINE = 1
-   DO INBLINE=1, NUMBSTAT
-    READ(ILU,FMT='(A400)') YSTRING
-    READ(YSTRING,*) TPSTATION%NAME(INBLINE), & !TPSTATION%TYPE(INBLINE),&
-    TPSTATION%LAT(INBLINE), TPSTATION%LON(INBLINE), TPSTATION%Z(INBLINE)!,&
-   END DO
-   REWIND(ILU)
-   CLOSE(ILU)
-   RETURN
-  END IF
- END IF
-!
-END SUBROUTINE READ_CSV_STATION
-!#########################################################
-SUBROUTINE FRENCH_TO_ENGLISH(HSTRING)
-CHARACTER(LEN=400), INTENT(INOUT) :: HSTRING ! csv record
-INTEGER :: JL
-LOGICAL :: GFRENCH
-!
-GFRENCH = .FALSE.
-!* analyses if the record has been written in French convention 
-!     French  convention (separator is ;  decimal symbol is ,) 
-!  or English convention (separator is ,  decimal symbol is .)
-DO JL=1,400
- IF (HSTRING(JL:JL)==';') GFRENCH=.TRUE.
-END DO
-!
-! If French convention is used in the file, transforms it in English convention
-IF (GFRENCH) THEN
- DO JL=1,400
-   IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.'
-   IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=','
- END DO
-END IF
-!
-END SUBROUTINE FRENCH_TO_ENGLISH
-
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index 8774f316af1407a1f08b151fd469aa351461ae21..172521e8abb91b0ef28830380b52e3aee4aea628 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -9,14 +9,10 @@ MODULE MODI_STATION_n
 !
 INTERFACE
 !
-      SUBROUTINE STATION_n(PTSTEP,                               &
-                           PXHAT, PYHAT, PZ,                     &
-                           PU, PV, PW, PTH, PR, PSV, PTKE,       &
-                           PTS,PP ) 
-!
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
+      SUBROUTINE STATION_n( PZ,                             &
+                            PU, PV, PW, PTH, PR, PSV, PTKE, &
+                            PTS, PP )
+!
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
@@ -36,12 +32,11 @@ END INTERFACE
 !
 END MODULE MODI_STATION_n
 !
-!     ########################################################
-      SUBROUTINE STATION_n(PTSTEP,                           &
-                       PXHAT, PYHAT, PZ,                     &
-                       PU, PV, PW, PTH, PR, PSV, PTKE,       &
-                       PTS, PP )
-!     ########################################################
+!     #######################################################
+      SUBROUTINE STATION_n( PZ,                             &
+                            PU, PV, PW, PTH, PR, PSV, PTKE, &
+                            PTS, PP )
+!     #######################################################
 !
 !
 !!****  *STATION_n* - (advects and) stores 
@@ -72,37 +67,31 @@ END MODULE MODI_STATION_n
 !!    MODIFICATIONS
 !!    -------------
 !!     Original 15/02/2002
-!!     A. Lemonsu 19/11/2002
-!!     P.Aumond 01/07/2011 : Add model levels
-!!     C.Lac       04/2013 : Correction on the vertical levels
-!!     C.Lac       04/2013 : Add I/J positioning                   
+!  A. Lemonsu   19/11/2002
+!  P. Aumond    01/07/2011: add model levels
+!  C. Lac          04/2013: correction on the vertical levels
+!  C. Lac          04/2013: add I/JK positioning
 !  P. Wautelet  28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE
 !  P. Wautelet  05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet  13/09/2019: budget: simplify and modernize date/time management
 !  R. Schoetter    11/2019: use LCARTESIAN instead of LSTATLAT for multiproc in cartesian
-!  P. Wautelet  09/05/2022: bugfix: use correct indices for U and V interpolation
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CONF
-USE MODD_CST
+USE MODD_CONF,          ONLY: LCARTESIAN
+USE MODD_CST,           ONLY: XPI
 USE MODD_DIAG_IN_RUN
-USE MODD_GRID
-USE MODD_PARAMETERS
+USE MODD_GRID,          ONLY: XBETA, XLON0, XRPK
+USE MODD_PARAMETERS,    ONLY: JPVEXT
 USE MODD_PARAM_n,       ONLY: CRAD
 USE MODD_STATION_n
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
-USE MODD_SUB_STATION_n
-USE MODD_TIME,          ONLY: tdtexp
-USE MODD_TIME_n,        ONLY: tdtcur
-!
-USE MODE_ll
-!
-USE MODI_WATER_SUM
 !
+USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V
 !
 !
 IMPLICIT NONE
@@ -111,9 +100,6 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
-REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
-REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
@@ -130,21 +116,6 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
 !       0.2  declaration of local variables
 !
 !
-INTEGER :: IIB        ! current processor domain sizes
-INTEGER :: IJB        ! 
-INTEGER :: IIE        !    
-INTEGER :: IJE        !   
-INTEGER :: IIU        ! 
-INTEGER :: IJU        ! 
-!
-REAL, DIMENSION(SIZE(PXHAT))        :: ZXHATM ! mass point coordinates
-REAL, DIMENSION(SIZE(PYHAT))        :: ZYHATM ! mass point coordinates
-!
-REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))  :: ZWORK   ! 
-!
-LOGICAL       :: GSTORE                       ! storage occurs at this time step
-!
-!
 INTEGER :: IN       ! time index
 INTEGER :: JSV      ! loop counter
 !
@@ -152,397 +123,75 @@ REAL    :: ZU_STAT     ! horizontal wind speed at station location (along x)
 REAL    :: ZV_STAT     ! horizontal wind speed at station location (along y)
 REAL    :: ZGAM        ! rotation between meso-nh base and spherical lat-lon base.
 !
-INTEGER :: IINFO_ll   ! return code
-INTEGER :: IRESP      ! return code
-INTEGER :: I          ! loop for stations
-INTEGER :: J          ! loop for levels
-
-!
-!----------------------------------------------------------------------------
-!
-!*      2.   PRELIMINARIES
-!            -------------
-!
-!*      2.1  Indices
-!            -------
-!
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-!
-!
-!*      2.2  Interpolations of model variables to mass points
-!            ------------------------------------------------
-!
-IIU=SIZE(PXHAT)
-IJU=SIZE(PYHAT)
-!
-ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU  )
-ZXHATM(  IIU  )=1.5*PXHAT(  IIU  )-0.5*PXHAT(  IIU-1)
-!
-ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU  )
-ZYHATM(  IJU  )=1.5*PYHAT(  IJU  )-0.5*PYHAT(  IJU-1)
+INTEGER :: JS          ! loop for stations
+INTEGER :: JK          ! loop for levels
 !
 !----------------------------------------------------------------------------
 !
 !*      3.4  instant of storage
 !            ------------------
 !
-IF ( TSTATION%T_CUR == XUNDEF ) TSTATION%T_CUR = TSTATION%STEP - PTSTEP
-!
-TSTATION%T_CUR = TSTATION%T_CUR + PTSTEP
-!
-IF ( TSTATION%T_CUR >= TSTATION%STEP - 1.E-10 ) THEN
-     GSTORE = .TRUE.
-     TSTATION%T_CUR = TSTATION%T_CUR - TSTATION%STEP
-     TSTATION%N_CUR = TSTATION%N_CUR + 1
-     IN = TSTATION%N_CUR
-ELSE
-     GSTORE = .FALSE.
-END IF
-!
-IF (GSTORE) THEN
-#if 0
-  tstation%tpdates(in)%date%year  = tdtexp%date%year
-  tstation%tpdates(in)%date%month = tdtexp%date%month
-  tstation%tpdates(in)%date%day   = tdtexp%date%day
-  tstation%tpdates(in)%xtime      = tdtexp%xtime + ( in - 1 ) * tstation%step
-#else
-  tstation%tpdates(in) = tdtcur
-#endif
-END IF
-!
+CALL  STATPROF_INSTANT( TSTATIONS_TIME, IN )
+IF ( IN < 1 ) RETURN !No profiler storage at this time step
 !
 !----------------------------------------------------------------------------
 !
-!*      4.   STATION POSITION
+!*      8.   DATA RECORDING
 !            --------------
 !
-!*      4.0  initialization of processor test
-!            --------------------------------
-IF (GSTATFIRSTCALL) THEN
- GSTATFIRSTCALL=.FALSE.
-!
- IF (.NOT.(ASSOCIATED(ZTHIS_PROCS))) ALLOCATE(ZTHIS_PROCS(NUMBSTAT))
-!
- IF (.NOT.(ASSOCIATED(II)))     ALLOCATE(II(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(IJ)))     ALLOCATE(IJ(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(IV)))     ALLOCATE(IV(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(IU)))     ALLOCATE(IU(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(ZXCOEF))) ALLOCATE(ZXCOEF(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(ZUCOEF))) ALLOCATE(ZUCOEF(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(ZYCOEF))) ALLOCATE(ZYCOEF(NUMBSTAT))
- IF (.NOT.(ASSOCIATED(ZVCOEF))) ALLOCATE(ZVCOEF(NUMBSTAT))
+STATION: DO JS = 1,NUMBSTAT_LOC
+  JK = TSTATIONS(JS)%NK
 
- ZXCOEF(:)  =XUNDEF
- ZUCOEF(:)  =XUNDEF
- ZYCOEF(:)  =XUNDEF
- ZVCOEF(:)  =XUNDEF
+  IF (LCARTESIAN) THEN
+    TSTATIONS(JS)%XZON(IN) =   STATPROF_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
+    TSTATIONS(JS)%XMER(IN) =   STATPROF_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) )
+  ELSE
+    ZU_STAT                = STATPROF_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
+    ZV_STAT                = STATPROF_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) )
+    ZGAM                   = (XRPK * (TSTATIONS(JS)%XLON - XLON0) - XBETA)*(XPI/180.)
+    TSTATIONS(JS)%XZON(IN) =   ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM)
+    TSTATIONS(JS)%XMER(IN) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM)
+  END IF
+  TSTATIONS(JS)%XW (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) )
+  TSTATIONS(JS)%XTH(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) )
+  TSTATIONS(JS)%XP (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) )
 
-!
- DO I=1,NUMBSTAT
-!
-  ZTHIS_PROCS(I)=0.
-!
-!*      4.1  X position
-!            ----------
-!
-  IU(I)=COUNT( PXHAT (:)<=TSTATION%X(I) )
-  II(I)=COUNT( ZXHATM(:)<=TSTATION%X(I) )
-!
-  IF (II(I)<=IIB-1   .AND. LWEST_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE.
-  IF (II(I)>=IIE     .AND. LEAST_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE.
-!
-!
-!*      4.2  Y position
-!            ----------
-!
-  IV(I)=COUNT( PYHAT (:)<=TSTATION%Y(I) )
-  IJ(I)=COUNT( ZYHATM(:)<=TSTATION%Y(I) )
-!
-  IF (IJ(I)<=IJB-1   .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE.
-  IF (IJ(I)>=IJE     .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE.
-!
-!
-!*      4.3  Position of station according to processors
-!            -------------------------------------------
-!
-  IF (IU(I)>=IIB .AND. IU(I)<=IIE .AND. IV(I)>=IJB .AND. IV(I)<=IJE) ZTHIS_PROCS(I)=1.
-  IF (L1D) ZTHIS_PROCS(I)=1.
-!
-!
-!*      4.4  Computations only on correct processor
-!            --------------------------------------
-    ZXCOEF(I) = 0.
-    ZYCOEF(I) = 0.
-    ZUCOEF(I) = 0.         
-    ZVCOEF(I) = 0.
-    IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN
-!----------------------------------------------------------------------------
-!
-!*      6.1  Interpolation coefficient for X
-!            -------------------------------
-!
-       ZXCOEF(I) = (TSTATION%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I)))
-!
-!
-!
-!*      6.2  Interpolation coefficient for y
-!            -------------------------------
-!
-       ZYCOEF(I) = (TSTATION%Y(I) - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I)))
-!
-!-------------------------------------------------------------------
-!
-!*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-!            ---------------------------------------------
-!
-!*      7.1  Interpolation coefficient for X (for U)
-!            -------------------------------
-!
-       ZUCOEF(I) = (TSTATION%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I)))
-!
-!
-!*      7.2  Interpolation coefficient for y (for V)
-!            -------------------------------
-!
-       ZVCOEF(I) = (TSTATION%Y(I) - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I)))
-!
-!
-
-    END IF
- ENDDO
-END IF
-!----------------------------------------------------------------------------
-!
-!*      8.   DATA RECORDING
-!            --------------
-!
-IF (GSTORE) THEN
-  DO I=1,NUMBSTAT
-     !
-     IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATION%ERROR(I))) THEN
-       IF (TSTATION%K(I)/= XUNDEF) THEN
-         J = TSTATION%K(I)
-       ELSE  ! suppose TSTATION%Z(I) /= XUNDEF
-        J=1
-        DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) &
-        < TSTATION%Z(I))
-         J = J + 1
-        END DO
-        IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATION%Z(I))>&
-       (TSTATION%Z(I)-(STATION_INTERP_2D(PZ(:,:,J-1))-STATION_INTERP_2D(PZ(:,:,2))))) THEN
-         J=J-1
-        ENDIF
-       END IF
-      !
-      IF (LCARTESIAN) THEN
-        TSTATION%ZON (IN,I)   =   STATION_INTERP_2D_U(PU(:,:,J))
-        TSTATION%MER (IN,I)   =   STATION_INTERP_2D_V(PV(:,:,J))
-      ELSE
-        ZU_STAT               = STATION_INTERP_2D_U(PU(:,:,J))
-        ZV_STAT               = STATION_INTERP_2D_V(PV(:,:,J))
-        ZGAM                  = (XRPK * (TSTATION%LON(I) - XLON0) - XBETA)*(XPI/180.)
-        TSTATION%ZON (IN,I)   =   ZU_STAT     * COS(ZGAM) + ZV_STAT     * SIN(ZGAM)
-        TSTATION%MER (IN,I)   = - ZU_STAT     * SIN(ZGAM) + ZV_STAT     * COS(ZGAM)
-      ENDIF
-        TSTATION%W   (IN,I)   = STATION_INTERP_2D(PW(:,:,J))
-        TSTATION%TH  (IN,I)   = STATION_INTERP_2D(PTH(:,:,J))
-        TSTATION%P   (IN,I)   = STATION_INTERP_2D(PP(:,:,J))
-      !
-        DO JSV=1,SIZE(PR,4)
-         TSTATION%R   (IN,I,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV))
-        END DO
-      !
-        DO JSV=1,SIZE(PSV,4)
-         TSTATION%SV  (IN,I,JSV) = STATION_INTERP_2D(PSV(:,:,J,JSV))
-        END DO
-      !
-        IF (SIZE(PTKE)>0) TSTATION%TKE  (IN,I) = STATION_INTERP_2D(PTKE(:,:,J))
-        IF (SIZE(PTS) >0) TSTATION%TSRAD(IN,I) = STATION_INTERP_2D(PTS)
-        TSTATION%ZS(I)      = STATION_INTERP_2D(PZ(:,:,1+JPVEXT))
-      !
-        IF (LDIAG_SURFRAD) THEN
-          TSTATION%ZON10M(IN,I) = STATION_INTERP_2D(XCURRENT_ZON10M)
-          TSTATION%MER10M(IN,I) = STATION_INTERP_2D(XCURRENT_MER10M)
-          TSTATION%T2M   (IN,I) = STATION_INTERP_2D(XCURRENT_T2M   )
-          TSTATION%Q2M   (IN,I) = STATION_INTERP_2D(XCURRENT_Q2M   )
-          TSTATION%HU2M  (IN,I) = STATION_INTERP_2D(XCURRENT_HU2M  )
-          TSTATION%RN    (IN,I) = STATION_INTERP_2D(XCURRENT_RN    ) 
-          TSTATION%H     (IN,I) = STATION_INTERP_2D(XCURRENT_H     ) 
-          TSTATION%LE    (IN,I) = STATION_INTERP_2D(XCURRENT_LE    ) 
-          TSTATION%LEI   (IN,I) = STATION_INTERP_2D(XCURRENT_LEI   ) 
-          TSTATION%GFLUX (IN,I) = STATION_INTERP_2D(XCURRENT_GFLUX ) 
-         IF (CRAD /= 'NONE') THEN
-          TSTATION%SWD   (IN,I) = STATION_INTERP_2D(XCURRENT_SWD   ) 
-          TSTATION%SWU   (IN,I) = STATION_INTERP_2D(XCURRENT_SWU   ) 
-          TSTATION%LWD   (IN,I) = STATION_INTERP_2D(XCURRENT_LWD   ) 
-          TSTATION%LWU   (IN,I) = STATION_INTERP_2D(XCURRENT_LWU   ) 
-          TSTATION%SWDIR (IN,I) = STATION_INTERP_2D(XCURRENT_SWDIR ) 
-          TSTATION%SWDIFF(IN,I) = STATION_INTERP_2D(XCURRENT_SWDIFF)
-          TSTATION%DSTAOD(IN,I) = STATION_INTERP_2D(XCURRENT_DSTAOD)
-         ENDIF
-          TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) 
-        ENDIF
-       
-      !
-    END IF
-!
-!----------------------------------------------------------------------------
-!
-!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
-!            ------------------------------------------
-!
-!*     11.2  data stored
-!            -----------
-!
-  CALL DISTRIBUTE_STATION(TSTATION%X   (I))
-  CALL DISTRIBUTE_STATION(TSTATION%Y   (I))
-  CALL DISTRIBUTE_STATION(TSTATION%Z   (I))
-  CALL DISTRIBUTE_STATION(TSTATION%LON (I))
-  CALL DISTRIBUTE_STATION(TSTATION%LAT (I))    
-  CALL DISTRIBUTE_STATION(TSTATION%ZON (IN,I))
-  CALL DISTRIBUTE_STATION(TSTATION%MER (IN,I))
-  CALL DISTRIBUTE_STATION(TSTATION%W   (IN,I))
-  CALL DISTRIBUTE_STATION(TSTATION%P   (IN,I))
-  CALL DISTRIBUTE_STATION(TSTATION%TH  (IN,I))
   DO JSV=1,SIZE(PR,4)
-    CALL DISTRIBUTE_STATION(TSTATION%R   (IN,I,JSV))
+    TSTATIONS(JS)%XR(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) )
   END DO
+
   DO JSV=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_STATION(TSTATION%SV  (IN,I,JSV))
+    TSTATIONS(JS)%XSV(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) )
   END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATION%TKE  (IN,I))
-  IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATION%TSRAD(IN,I))
-  CALL DISTRIBUTE_STATION(TSTATION%ZS  (I))
-  IF (LDIAG_SURFRAD) THEN
-    CALL DISTRIBUTE_STATION(TSTATION%T2M    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%Q2M    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%HU2M   (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%ZON10M (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%MER10M (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%RN     (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%H      (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%LE     (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%LEI    (IN,I))    
-    CALL DISTRIBUTE_STATION(TSTATION%GFLUX  (IN,I))
-   IF (CRAD /= 'NONE') THEN
-    CALL DISTRIBUTE_STATION(TSTATION%SWD    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%SWU    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%LWD    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%LWU    (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%SWDIR  (IN,I))
-    CALL DISTRIBUTE_STATION(TSTATION%SWDIFF (IN,I))    
-    CALL DISTRIBUTE_STATION(TSTATION%DSTAOD (IN,I))
-   END IF
-    CALL DISTRIBUTE_STATION(TSTATION%SFCO2  (IN,I))
-  ENDIF
-  !
- ENDDO
-  !
-END IF
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-FUNCTION STATION_INTERP_2D(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:), INTENT(IN) :: PA
-REAL                             :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-     JI=1
-     JJ=1 
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-     JI=II(I)
-     JJ=IJ(I)
-END IF
-!
-!
-IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
-    (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
-PB = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ)    + &
-     (1.-ZYCOEF(I)) *    (ZXCOEF(I)) *  PA(JI+1,JJ)  + &
-     (   ZYCOEF(I)) * (1.-ZXCOEF(I)) *  PA(JI,JJ+1)  + &
-     (   ZYCOEF(I)) *    (ZXCOEF(I)) *  PA(JI+1,JJ+1)
-!
-END FUNCTION STATION_INTERP_2D
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-! MODIFS
-FUNCTION STATION_INTERP_2D_U(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:), INTENT(IN) :: PA
-REAL                             :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-     JI=1
-     JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2
-ELSE
-     JI=IU(I)
-     JJ=IJ(I)
-END IF
-!
-IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
-    (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
-PB = (1.- ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI  ,JJ  ) &
-   + (1.- ZYCOEF(I)) * (   ZUCOEF(I)) * PA(JI+1,JJ  ) &
-   + (    ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI  ,JJ+1) &
-   + (    ZYCOEF(I)) * (   ZUCOEF(I)) * PA(JI+1,JJ+1)
-!
-END FUNCTION STATION_INTERP_2D_U
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-! MODIFS
-FUNCTION STATION_INTERP_2D_V(PA) RESULT(PB)
-!
-REAL, DIMENSION(:,:), INTENT(IN) :: PA
-REAL                             :: PB
-!
-INTEGER :: JI, JJ
-!
-IF (SIZE(PA,1)==2) THEN
-  JI=1
-  JJ=1
-ELSEIF (L1D) THEN
-     JI=2
-     JJ=2  
-ELSE
-  JI=II(I)
-  JJ=IV(I)
-END IF
-!
-IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. &
-    (JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) &
-PB = (1.- ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI  ,JJ  ) &
-   + (1.- ZVCOEF(I)) * (   ZXCOEF(I)) * PA(JI+1,JJ  ) &
-   + (    ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI  ,JJ+1) &
-   + (    ZVCOEF(I)) * (   ZXCOEF(I)) * PA(JI+1,JJ+1)
-!
-END FUNCTION STATION_INTERP_2D_V
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_STATION(PAS)
-!
-REAL, INTENT(INOUT) :: PAS
-!
-PAS = PAS * ZTHIS_PROCS(I)
-CALL REDUCESUM_ll(PAS,IINFO_ll)
+
+  IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) )
+  IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTS )
+  TSTATIONS(JS)%XZS  = STATPROF_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT))
+
+  IF ( LDIAG_SURFRAD ) THEN
+    TSTATIONS(JS)%XZON10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M )
+    TSTATIONS(JS)%XMER10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M )
+    TSTATIONS(JS)%XT2M   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M    )
+    TSTATIONS(JS)%XQ2M   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M    )
+    TSTATIONS(JS)%XHU2M  (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M   )
+    TSTATIONS(JS)%XRN    (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_RN     )
+    TSTATIONS(JS)%XH     (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_H      )
+    TSTATIONS(JS)%XLE    (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LE     )
+    TSTATIONS(JS)%XLEI   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI    )
+    TSTATIONS(JS)%XGFLUX (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX  )
+    IF ( CRAD /= 'NONE' ) THEN
+      TSTATIONS(JS)%XSWD   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD    )
+      TSTATIONS(JS)%XSWU   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU    )
+      TSTATIONS(JS)%XLWD   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD    )
+      TSTATIONS(JS)%XLWU   (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU    )
+      TSTATIONS(JS)%XSWDIR (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR  )
+      TSTATIONS(JS)%XSWDIFF(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF )
+      TSTATIONS(JS)%XDSTAOD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD )
+    END IF
+    TSTATIONS(JS)%XSFCO2(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 )
+  END IF
+END DO STATION
 !
-END SUBROUTINE DISTRIBUTE_STATION
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE STATION_n
diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90
new file mode 100644
index 0000000000000000000000000000000000000000..be9c3d2e269800071670b5c4795e56745290e133
--- /dev/null
+++ b/src/MNH/statprof_reader.f90
@@ -0,0 +1,150 @@
+!MNH_LIC Copyright 2020-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_STATPROF_READER
+!     ############################
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: STATPROF_CSV_READ
+
+INTEGER, PARAMETER :: NMAXLINELGT = 400
+
+CONTAINS
+!-------------------------------------------------------------------
+!
+!!****  *STATPROF_CSV_READ* -
+!!
+!!    PURPOSE
+!!    -------
+!!    Prescribe probes through a CSV file
+!!
+!!    AUTHOR
+!!    ------
+!!     E. Jezequel *CNRM & IFPEN*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!     03/2020      Original
+!  P. Wautelet    04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs
+!---------------------------------------------------------------
+!
+!###############################################################
+SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, KNUMBSTATPROF )
+!###############################################################
+
+USE MODD_CONF,          ONLY: LCARTESIAN
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
+
+USE MODE_MSG
+USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, STATION_ADD, STATPROF_INI_INTERP, STATPROF_POSITION
+
+CLASS(TSTATPROFDATA), INTENT(IN)  :: TPSTATPROF ! Used only to identify datatype
+CHARACTER(LEN=*),     INTENT(IN)  :: HFILE ! file to read
+INTEGER,              INTENT(OUT) :: KNUMBSTATPROF ! Total number of stations/profilers (inside physical domain of model)
+!
+CHARACTER(LEN=NMAXLINELGT) :: YSTRING
+INTEGER             :: ILU      ! logical unit of the file
+INTEGER             :: INBLINE  ! Nb of lines in csv file
+LOGICAL             :: GINSIDE  ! True if station/profiler is inside physical domain of model
+LOGICAL             :: GPRESENT ! True if station/profiler is present on the current process
+TYPE(TSTATIONDATA),  TARGET :: TZSTATION
+TYPE(TPROFILERDATA), TARGET :: TZPROFILER
+
+CLASS(TSTATPROFDATA), POINTER :: TZSTATPROF
+
+SELECT TYPE( TPSTATPROF )
+  TYPE IS( TPROFILERDATA )
+    TZSTATPROF => TZPROFILER
+
+  TYPE IS( TSTATIONDATA )
+    TZSTATPROF => TZSTATION
+
+  CLASS DEFAULT
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF' )
+END SELECT
+
+INBLINE       = 0 !Number of stations/profilers found in the file
+KNUMBSTATPROF = 0 !Number of stations/profilers found in the file AND inside the model domain
+
+! Open file
+OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' )
+
+READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it)
+
+DO
+  ! Read station/profiler coordinates
+  READ( ILU, END = 101, FMT = '(A)' ) YSTRING
+
+  ! Check if record is written in French convention
+  CALL FRENCH_TO_ENGLISH( YSTRING )
+
+  IF ( LCARTESIAN ) THEN
+    READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XX,   TZSTATPROF%XY,   TZSTATPROF%XZ
+  ELSE
+    READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XLAT, TZSTATPROF%XLON, TZSTATPROF%XZ
+  END IF
+
+  IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF )
+  CALL STATPROF_POSITION( TZSTATPROF, GINSIDE, GPRESENT )
+
+  IF ( GINSIDE ) THEN
+    KNUMBSTATPROF = KNUMBSTATPROF + 1
+    TZSTATPROF%NID = KNUMBSTATPROF
+  END IF
+
+  IF ( GPRESENT ) THEN
+    SELECT TYPE( TZSTATPROF )
+      TYPE IS( TPROFILERDATA )
+        CALL PROFILER_ADD( TZSTATPROF )
+
+      TYPE IS( TSTATIONDATA )
+        CALL STATION_ADD( TZSTATPROF )
+
+      CLASS DEFAULT
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. )
+    END SELECT
+  END IF
+
+  INBLINE = INBLINE + 1
+END DO
+
+101 CONTINUE
+
+CLOSE( ILU )
+
+IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) )
+
+END SUBROUTINE STATPROF_CSV_READ
+
+!#########################################################
+SUBROUTINE FRENCH_TO_ENGLISH(HSTRING)
+CHARACTER(LEN=NMAXLINELGT), INTENT(INOUT) :: HSTRING ! csv record
+
+INTEGER :: JL
+LOGICAL :: GFRENCH
+!
+GFRENCH = .FALSE.
+!* analyses if the record has been written in French convention 
+!     French  convention (separator is ;  decimal symbol is ,) 
+!  or English convention (separator is ,  decimal symbol is .)
+DO JL = 1, NMAXLINELGT
+ IF (HSTRING(JL:JL)==';') GFRENCH=.TRUE.
+END DO
+!
+! If French convention is used in the file, transforms it in English convention
+IF (GFRENCH) THEN
+ DO JL = 1, NMAXLINELGT
+   IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.'
+   IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=','
+ END DO
+END IF
+!
+END SUBROUTINE FRENCH_TO_ENGLISH
+
+END MODULE MODE_STATPROF_READER
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0d1de4a1616acc850cbc6d264e7ce3fbcb78e9f8
--- /dev/null
+++ b/src/MNH/statprof_tools.f90
@@ -0,0 +1,767 @@
+!MNH_LIC Copyright 2002-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.
+!-----------------------------------------------------------------
+! Authors:
+!  Misc: some of the code was taken from older subroutines/functions for stations
+!  P. Wautelet 08/04/2022
+!-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX
+!  P. Wautelet 25/11/2022: rewrite STATPROF_INSTANT algorithm (does not depends on model timestep anymore => independent of model)
+!-----------------------------------------------------------------
+!      ###################
+MODULE MODE_STATPROF_TOOLS
+!      ###################
+
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA, TSTATPROFTIME
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: PROFILER_ALLOCATE, STATION_ALLOCATE
+PUBLIC :: STATPROF_INI_INTERP
+PUBLIC :: STATPROF_POSITION
+PUBLIC :: PROFILER_ADD, STATION_ADD
+PUBLIC :: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V
+PUBLIC :: STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V
+PUBLIC :: STATPROF_INSTANT
+
+CONTAINS
+
+! ################################################
+SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE )
+! ################################################
+
+!   USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD
+  USE MODD_CONF_n,       ONLY: NRR
+  USE MODD_DIAG_IN_RUN,  ONLY: LDIAG_IN_RUN
+  USE MODD_DIM_n,        ONLY: NKMAX
+  USE MODD_NSV,          ONLY: NSV
+  USE MODD_PARAMETERS,   ONLY: JPVEXT, XUNDEF
+  USE MODD_PARAM_n,      ONLY: CCLOUD, CRAD, CTURB
+  USE MODD_RADIATIONS_n, ONLY: NAER
+  USE MODD_SURF_PAR,     ONLY: XUNDEF_SFX => XUNDEF
+
+  IMPLICIT NONE
+
+  TYPE(TPROFILERDATA), INTENT(INOUT) :: TPPROFILER
+  INTEGER,             INTENT(IN)    :: KSTORE  ! number of moments to store
+
+  INTEGER :: IKU
+
+  IKU = NKMAX + 2 * JPVEXT
+  ALLOCATE( TPPROFILER%XZON      (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XMER      (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XFF       (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XDD       (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XW        (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XP        (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XZZ       (KSTORE, IKU) )
+  IF ( CTURB == 'TKEL' ) THEN
+    ALLOCATE( TPPROFILER%XTKE    (KSTORE, IKU) )
+  ELSE
+    ALLOCATE( TPPROFILER%XTKE    (0, 0) )
+  END IF
+  ALLOCATE( TPPROFILER%XTH       (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XTHV      (KSTORE, IKU) )
+  IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN
+    ALLOCATE( TPPROFILER%XVISIGUL  (KSTORE, IKU) )
+  ELSE
+    ALLOCATE( TPPROFILER%XVISIGUL  (0, 0) )
+  END IF
+  IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN
+    ALLOCATE( TPPROFILER%XVISIKUN  (KSTORE, IKU) )
+  ELSE
+    ALLOCATE( TPPROFILER%XVISIKUN  (0, 0) )
+  END IF
+  ALLOCATE( TPPROFILER%XCRARE    (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XCRARE_ATT(KSTORE, IKU) )
+  IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN
+    ALLOCATE( TPPROFILER%XCIZ    (KSTORE, IKU) )
+  ELSE
+    ALLOCATE( TPPROFILER%XCIZ    (0, 0) )
+  END IF
+  ALLOCATE( TPPROFILER%XLWCZ     (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XIWCZ     (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XRHOD     (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XR        (KSTORE, IKU, NRR) )
+  ALLOCATE( TPPROFILER%XSV       (KSTORE, IKU, NSV) )
+  ALLOCATE( TPPROFILER%XAER      (KSTORE, IKU, NAER) )
+
+  ALLOCATE( TPPROFILER%XIWV(KSTORE) )
+  ALLOCATE( TPPROFILER%XZTD(KSTORE) )
+  ALLOCATE( TPPROFILER%XZWD(KSTORE) )
+  ALLOCATE( TPPROFILER%XZHD(KSTORE) )
+
+!   IF ( LDIAG_IN_RUN ) THEN
+    ALLOCATE( TPPROFILER%XT2M   (KSTORE) )
+    ALLOCATE( TPPROFILER%XQ2M   (KSTORE) )
+    ALLOCATE( TPPROFILER%XHU2M  (KSTORE) )
+    ALLOCATE( TPPROFILER%XZON10M(KSTORE) )
+    ALLOCATE( TPPROFILER%XMER10M(KSTORE) )
+    ALLOCATE( TPPROFILER%XRN    (KSTORE) )
+    ALLOCATE( TPPROFILER%XH     (KSTORE) )
+    ALLOCATE( TPPROFILER%XLE    (KSTORE) )
+    ALLOCATE( TPPROFILER%XLEI   (KSTORE) )
+    ALLOCATE( TPPROFILER%XGFLUX (KSTORE) )
+    IF ( CRAD /= 'NONE' ) THEN
+      ALLOCATE( TPPROFILER%XSWD   (KSTORE) )
+      ALLOCATE( TPPROFILER%XSWU   (KSTORE) )
+      ALLOCATE( TPPROFILER%XLWD   (KSTORE) )
+      ALLOCATE( TPPROFILER%XLWU   (KSTORE) )
+    END IF
+    ALLOCATE( TPPROFILER%XTKE_DISS(KSTORE, IKU) )
+!   END IF
+
+  TPPROFILER%XZON      (:,:) = XUNDEF
+  TPPROFILER%XMER      (:,:) = XUNDEF
+  TPPROFILER%XFF       (:,:) = XUNDEF
+  TPPROFILER%XDD       (:,:) = XUNDEF
+  TPPROFILER%XW        (:,:) = XUNDEF
+  TPPROFILER%XP        (:,:) = XUNDEF
+  TPPROFILER%XZZ       (:,:) = XUNDEF
+  IF ( CTURB == 'TKEL' ) TPPROFILER%XTKE(:,:) = XUNDEF
+  TPPROFILER%XTH       (:,:) = XUNDEF
+  TPPROFILER%XTHV      (:,:) = XUNDEF
+  IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' )  TPPROFILER%XVISIGUL(:,:) = XUNDEF
+  IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) TPPROFILER%XVISIKUN(:,:) = XUNDEF
+  TPPROFILER%XCRARE    (:,:) = XUNDEF
+  TPPROFILER%XCRARE_ATT(:,:) = XUNDEF
+  IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) TPPROFILER%XCIZ      (:,:) = XUNDEF
+  TPPROFILER%XLWCZ     (:,:) = XUNDEF
+  TPPROFILER%XIWCZ     (:,:) = XUNDEF
+  TPPROFILER%XRHOD     (:,:) = XUNDEF
+  TPPROFILER%XR        (:,:,:) = XUNDEF
+  TPPROFILER%XSV       (:,:,:) = XUNDEF
+  TPPROFILER%XAER      (:,:,:) = XUNDEF
+
+  TPPROFILER%XIWV(:) = XUNDEF
+  TPPROFILER%XZTD(:) = XUNDEF
+  TPPROFILER%XZWD(:) = XUNDEF
+  TPPROFILER%XZHD(:) = XUNDEF
+
+!   IF ( LDIAG_IN_RUN ) THEN
+    TPPROFILER%XT2M   (:) = XUNDEF_SFX
+    TPPROFILER%XQ2M   (:) = XUNDEF_SFX
+    TPPROFILER%XHU2M  (:) = XUNDEF_SFX
+    TPPROFILER%XZON10M(:) = XUNDEF_SFX
+    TPPROFILER%XMER10M(:) = XUNDEF_SFX
+    TPPROFILER%XRN    (:) = XUNDEF_SFX
+    TPPROFILER%XH     (:) = XUNDEF_SFX
+    TPPROFILER%XLE    (:) = XUNDEF_SFX
+    TPPROFILER%XLEI   (:) = XUNDEF_SFX
+    TPPROFILER%XGFLUX (:) = XUNDEF_SFX
+    IF ( CRAD /= 'NONE' ) THEN
+      TPPROFILER%XSWD   (:) = XUNDEF
+      TPPROFILER%XSWU   (:) = XUNDEF
+      TPPROFILER%XLWD   (:) = XUNDEF
+      TPPROFILER%XLWU   (:) = XUNDEF
+    END IF
+    TPPROFILER%XTKE_DISS(:,:) = XUNDEF
+!   END IF
+
+END SUBROUTINE PROFILER_ALLOCATE
+
+! ##############################################
+SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE )
+! ##############################################
+
+  USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD
+  USE MODD_CONF_n,       ONLY: NRR
+  USE MODD_NSV,          ONLY: NSV
+  USE MODD_PARAMETERS,   ONLY: XUNDEF
+  USE MODD_PARAM_n,      ONLY: CRAD, CTURB
+  USE MODD_SURF_PAR,     ONLY: XUNDEF_SFX => XUNDEF
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
+  INTEGER,            INTENT(IN)    :: KSTORE  ! number of moments to store
+
+  ALLOCATE( TPSTATION%XZON(KSTORE) )
+  ALLOCATE( TPSTATION%XMER(KSTORE) )
+  ALLOCATE( TPSTATION%XW  (KSTORE) )
+  ALLOCATE( TPSTATION%XP  (KSTORE) )
+  IF ( CTURB == 'TKEL' ) THEN
+    ALLOCATE( TPSTATION%XTKE(KSTORE) )
+  ELSE
+    ALLOCATE( TPSTATION%XTKE(0) )
+  END IF
+  ALLOCATE( TPSTATION%XTH(KSTORE) )
+  ALLOCATE( TPSTATION%XR (KSTORE, NRR) )
+  ALLOCATE( TPSTATION%XSV(KSTORE, NSV) )
+  IF ( CRAD /= 'NONE' ) THEN
+    ALLOCATE( TPSTATION%XTSRAD(KSTORE) )
+  ELSE
+    ALLOCATE( TPSTATION%XTSRAD(0) )
+  END IF
+  IF ( LDIAG_SURFRAD ) THEN
+    ALLOCATE( TPSTATION%XT2M   (KSTORE) )
+    ALLOCATE( TPSTATION%XQ2M   (KSTORE) )
+    ALLOCATE( TPSTATION%XHU2M  (KSTORE) )
+    ALLOCATE( TPSTATION%XZON10M(KSTORE) )
+    ALLOCATE( TPSTATION%XMER10M(KSTORE) )
+    ALLOCATE( TPSTATION%XRN    (KSTORE) )
+    ALLOCATE( TPSTATION%XH     (KSTORE) )
+    ALLOCATE( TPSTATION%XLE    (KSTORE) )
+    ALLOCATE( TPSTATION%XLEI   (KSTORE) )
+    ALLOCATE( TPSTATION%XGFLUX (KSTORE) )
+    IF ( CRAD /= 'NONE' ) THEN
+      ALLOCATE( TPSTATION%XSWD   (KSTORE) )
+      ALLOCATE( TPSTATION%XSWU   (KSTORE) )
+      ALLOCATE( TPSTATION%XLWD   (KSTORE) )
+      ALLOCATE( TPSTATION%XLWU   (KSTORE) )
+      ALLOCATE( TPSTATION%XSWDIR (KSTORE) )
+      ALLOCATE( TPSTATION%XSWDIFF(KSTORE) )
+      ALLOCATE( TPSTATION%XDSTAOD(KSTORE) )
+    END IF
+    ALLOCATE( TPSTATION%XSFCO2(KSTORE) )
+  END IF
+
+  TPSTATION%XZON(:)    = XUNDEF
+  TPSTATION%XMER(:)    = XUNDEF
+  TPSTATION%XW(:)      = XUNDEF
+  TPSTATION%XP(:)      = XUNDEF
+  TPSTATION%XTKE(:)    = XUNDEF
+  TPSTATION%XTH(:)     = XUNDEF
+  TPSTATION%XR(:,:)    = XUNDEF
+  TPSTATION%XSV(:,:)   = XUNDEF
+  TPSTATION%XTSRAD(:)  = XUNDEF
+  IF ( LDIAG_SURFRAD ) THEN
+    TPSTATION%XT2M(:)    = XUNDEF_SFX
+    TPSTATION%XQ2M(:)    = XUNDEF_SFX
+    TPSTATION%XHU2M(:)   = XUNDEF_SFX
+    TPSTATION%XZON10M(:) = XUNDEF_SFX
+    TPSTATION%XMER10M(:) = XUNDEF_SFX
+    TPSTATION%XRN(:)     = XUNDEF_SFX
+    TPSTATION%XH(:)      = XUNDEF_SFX
+    TPSTATION%XLE(:)     = XUNDEF_SFX
+    TPSTATION%XLEI(:)    = XUNDEF_SFX
+    TPSTATION%XGFLUX(:)  = XUNDEF_SFX
+    IF ( CRAD /= 'NONE' ) THEN
+      TPSTATION%XSWD(:)    = XUNDEF
+      TPSTATION%XSWU(:)    = XUNDEF
+      TPSTATION%XLWD(:)    = XUNDEF
+      TPSTATION%XLWU(:)    = XUNDEF
+      TPSTATION%XSWDIR(:)  = XUNDEF
+      TPSTATION%XSWDIFF(:) = XUNDEF
+      TPSTATION%XDSTAOD(:) = XUNDEF
+    END IF
+    TPSTATION%XSFCO2(:)  = XUNDEF_SFX
+  END IF
+
+END SUBROUTINE STATION_ALLOCATE
+
+! ##########################################
+SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF )
+! ##########################################
+
+  USE MODD_GRID,         ONLY: XLATORI, XLONORI
+  USE MODD_PARAMETERS,   ONLY: XUNDEF
+
+  USE MODE_GRIDPROJ,     ONLY: SM_XYHAT
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF
+
+  IF ( TPSTATPROF%XLAT == XUNDEF .OR. TPSTATPROF%XLON == XUNDEF ) THEN
+    CMNHMSG(1) = 'Error in station or profiler position'
+    CMNHMSG(2) = 'either LATitude or LONgitude segment'
+    CMNHMSG(3) = 'or I and J segment'
+    CMNHMSG(4) = 'definition is not complete.'
+    CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'STATPROF_INI_INTERP' )
+  END IF
+
+  CALL SM_XYHAT( XLATORI,         XLONORI,         &
+                 TPSTATPROF%XLAT, TPSTATPROF%XLON, &
+                 TPSTATPROF%XX,   TPSTATPROF%XY    )
+
+END SUBROUTINE STATPROF_INI_INTERP
+
+! ###########################################################
+SUBROUTINE STATPROF_POSITION( TPSTATPROF, OINSIDE, OPRESENT )
+! ###########################################################
+! Subroutine to determine the position of a station/profiler on the model grid
+! and set the useful coefficients for data interpolation
+
+  USE MODD_CONF,           ONLY: L1D
+  USE MODD_GRID_n,         ONLY: NPHYS_XMIN, NPHYS_XMAX, NPHYS_YMIN, NPHYS_YMAX, XHAT_BOUND, XHATM_BOUND, &
+                                 XXHAT, XYHAT, XXHATM, XYHATM, XZZ
+  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+
+  USE MODE_MSG
+  USE MODE_NEST_LL,        ONLY: GET_MODEL_NUMBER_ll
+  USE MODE_TOOLS_ll,       ONLY: GET_INDICE_ll
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF
+  LOGICAL,              INTENT(OUT)   :: OINSIDE  ! True if station/profiler is inside physical domain of model
+  LOGICAL,              INTENT(OUT)   :: OPRESENT ! True if station/profiler is present on the current process
+
+  INTEGER :: IIB ! domain sizes of current process
+  INTEGER :: IJB !
+  INTEGER :: IIE !
+  INTEGER :: IJE !
+  INTEGER :: IMI
+  INTEGER :: JK
+  REAL    :: ZLOW, ZHIGH
+
+  OPRESENT = .FALSE.
+  OINSIDE  = .FALSE.
+
+  CALL GET_INDICE_ll( IIB, IJB, IIE, IJE )
+
+  IF (       TPSTATPROF%XX >= XHAT_BOUND(NPHYS_XMIN) .AND. TPSTATPROF%XX <= XHAT_BOUND(NPHYS_XMAX) &
+       .AND. TPSTATPROF%XY >= XHAT_BOUND(NPHYS_YMIN) .AND. TPSTATPROF%XY <= XHAT_BOUND(NPHYS_YMAX) ) THEN
+    OINSIDE = .TRUE.
+  ELSE
+    CALL GET_MODEL_NUMBER_ll(IMI)
+    WRITE( CMNHMSG(1), "( 'station or profiler ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATPROF%CNAME), IMI
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATPROF_POSITION' )
+ END IF
+
+  ! X position
+  TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX )
+  TPSTATPROF%NI_M = COUNT( XXHATM(:) <= TPSTATPROF%XX )
+
+  ! Y position
+  TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY )
+  TPSTATPROF%NJ_M = COUNT( XYHATM(:) <= TPSTATPROF%XY )
+
+  ! Position of station/profiler according to process
+  IF (       TPSTATPROF%NI_U >= IIB .AND. TPSTATPROF%NI_U <= IIE &
+       .AND. TPSTATPROF%NJ_V >= IJB .AND. TPSTATPROF%NJ_V <= IJE ) OPRESENT = .TRUE.
+  IF ( L1D ) OPRESENT = .TRUE.
+
+  ! Check if station/profiler is too near of physical domain border (outside of physical domain for mass points)
+  IF ( OINSIDE .AND. .NOT. L1D ) THEN
+    IF (      TPSTATPROF%XX < XHATM_BOUND(NPHYS_XMIN) .OR. TPSTATPROF%XX > XHATM_BOUND(NPHYS_XMAX) &
+         .OR. TPSTATPROF%XY < XHATM_BOUND(NPHYS_YMIN) .OR. TPSTATPROF%XY > XHATM_BOUND(NPHYS_YMAX) ) THEN
+      CALL GET_MODEL_NUMBER_ll(IMI)
+      WRITE( CMNHMSG(1), "( 'station or profiler ', A, ' is outside of mass-points physical domain of model', I3 )" ) &
+             TRIM(TPSTATPROF%CNAME), IMI
+      CMNHMSG(2) = 'but is inside of flux-points physical domain.'
+      CMNHMSG(3) = 'Meaning: station or profiler is too close to the boundaries of physical domain.'
+      CMNHMSG(4) = '=> station or profiler disabled (not computed)'
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATPROF_POSITION' )
+      OPRESENT = .FALSE.
+      OINSIDE = .FALSE.
+    END IF
+  END IF
+
+  ! Computations only on correct process
+  IF ( OPRESENT .AND. .NOT. L1D ) THEN
+    ! Interpolation coefficient for X (mass-point)
+    TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - XXHATM(TPSTATPROF%NI_M) ) / ( XXHATM(TPSTATPROF%NI_M+1) - XXHATM(TPSTATPROF%NI_M) )
+    ! Interpolation coefficient for Y (mass-point)
+    TPSTATPROF%XYMCOEF = ( TPSTATPROF%XY - XYHATM(TPSTATPROF%NJ_M) ) / ( XYHATM(TPSTATPROF%NJ_M+1) - XYHATM(TPSTATPROF%NJ_M) )
+    ! Interpolation coefficient for X (U-point)
+    TPSTATPROF%XXUCOEF = ( TPSTATPROF%XX - XXHAT(TPSTATPROF%NI_U) )  / ( XXHAT(TPSTATPROF%NI_U+1)  - XXHAT(TPSTATPROF%NI_U) )
+    ! Interpolation coefficient for Y (V-point)
+    TPSTATPROF%XYVCOEF = ( TPSTATPROF%XY - XYHAT(TPSTATPROF%NJ_V) )  / ( XYHAT(TPSTATPROF%NJ_V+1)  - XYHAT(TPSTATPROF%NJ_V) )
+  END IF
+
+  IF ( OPRESENT ) THEN
+    SELECT TYPE( TPSTATPROF )
+      TYPE IS( TPROFILERDATA )
+        ! Nothing to do
+
+      TYPE IS( TSTATIONDATA )
+        ! The closest K-level to the station altitude is chosen
+        JK = JPVEXT + 1
+        DO WHILE ( ( STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) ) ) &
+                   < TPSTATPROF%XZ)
+          JK = JK + 1
+        END DO
+        ZLOW  = STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK-1) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) )
+        ZHIGH = STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK  ) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) )
+        !If the station/profiler is nearer from the lower level, select it
+        IF ( ( ZHIGH - TPSTATPROF%XZ ) > ( TPSTATPROF%XZ - ZLOW ) ) JK = JK - 1
+        TPSTATPROF%NK = JK
+
+      CLASS DEFAULT
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. )
+    END SELECT
+  END IF
+
+END SUBROUTINE STATPROF_POSITION
+
+! ###################################
+SUBROUTINE PROFILER_ADD( TPPROFILER )
+! ###################################
+! Subroutine to add a station to the local list of profilers
+  USE MODD_PROFILER_n, ONLY: NUMBPROFILER_LOC, TPROFILERS
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPPROFILER
+
+  INTEGER :: JS
+  TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TZPROFILERS
+
+  NUMBPROFILER_LOC = NUMBPROFILER_LOC + 1
+
+  ALLOCATE( TZPROFILERS( NUMBPROFILER_LOC ) )
+  DO JS = 1, NUMBPROFILER_LOC - 1
+    TZPROFILERS(JS) = TPROFILERS(JS)
+  END DO
+
+  !Copy fields available in TSTATPROFDATA
+  !other fields are not yet set
+  TZPROFILERS(NUMBPROFILER_LOC)%CNAME   = TPPROFILER%CNAME
+  TZPROFILERS(NUMBPROFILER_LOC)%NID     = TPPROFILER%NID
+  TZPROFILERS(NUMBPROFILER_LOC)%XX      = TPPROFILER%XX
+  TZPROFILERS(NUMBPROFILER_LOC)%XY      = TPPROFILER%XY
+  TZPROFILERS(NUMBPROFILER_LOC)%XZ      = TPPROFILER%XZ
+  TZPROFILERS(NUMBPROFILER_LOC)%XLON    = TPPROFILER%XLON
+  TZPROFILERS(NUMBPROFILER_LOC)%XLAT    = TPPROFILER%XLAT
+  TZPROFILERS(NUMBPROFILER_LOC)%NI_M    = TPPROFILER%NI_M
+  TZPROFILERS(NUMBPROFILER_LOC)%NJ_M    = TPPROFILER%NJ_M
+  TZPROFILERS(NUMBPROFILER_LOC)%NI_U    = TPPROFILER%NI_U
+  TZPROFILERS(NUMBPROFILER_LOC)%NJ_V    = TPPROFILER%NJ_V
+  TZPROFILERS(NUMBPROFILER_LOC)%XXMCOEF = TPPROFILER%XXMCOEF
+  TZPROFILERS(NUMBPROFILER_LOC)%XYMCOEF = TPPROFILER%XYMCOEF
+  TZPROFILERS(NUMBPROFILER_LOC)%XXUCOEF = TPPROFILER%XXUCOEF
+  TZPROFILERS(NUMBPROFILER_LOC)%XYVCOEF = TPPROFILER%XYVCOEF
+
+  IF ( ASSOCIATED( TPROFILERS ) ) DEALLOCATE( TPROFILERS ) !Can be done without memory leak because allocatable arrays were
+                                                           !not yet allocated (will be done in PROFILER_ALLOCATE)
+  TPROFILERS => TZPROFILERS
+
+END SUBROUTINE PROFILER_ADD
+
+! #################################
+SUBROUTINE STATION_ADD( TPSTATION )
+! #################################
+! Subroutine to add a station to the local list of stations
+  USE MODD_STATION_n, ONLY: NUMBSTAT_LOC, TSTATIONS
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATION
+
+  INTEGER :: JS
+  TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TZSTATIONS
+
+  NUMBSTAT_LOC = NUMBSTAT_LOC + 1
+
+  ALLOCATE( TZSTATIONS( NUMBSTAT_LOC ) )
+  DO JS = 1, NUMBSTAT_LOC - 1
+    TZSTATIONS(JS) = TSTATIONS(JS)
+  END DO
+
+  !Copy fields available in TSTATPROFDATA
+  !other fields are not yet set
+  TZSTATIONS(NUMBSTAT_LOC)%CNAME   = TPSTATION%CNAME
+  TZSTATIONS(NUMBSTAT_LOC)%NID     = TPSTATION%NID
+  TZSTATIONS(NUMBSTAT_LOC)%XX      = TPSTATION%XX
+  TZSTATIONS(NUMBSTAT_LOC)%XY      = TPSTATION%XY
+  TZSTATIONS(NUMBSTAT_LOC)%XZ      = TPSTATION%XZ
+  TZSTATIONS(NUMBSTAT_LOC)%XLON    = TPSTATION%XLON
+  TZSTATIONS(NUMBSTAT_LOC)%XLAT    = TPSTATION%XLAT
+  TZSTATIONS(NUMBSTAT_LOC)%NI_M    = TPSTATION%NI_M
+  TZSTATIONS(NUMBSTAT_LOC)%NJ_M    = TPSTATION%NJ_M
+  TZSTATIONS(NUMBSTAT_LOC)%NI_U    = TPSTATION%NI_U
+  TZSTATIONS(NUMBSTAT_LOC)%NJ_V    = TPSTATION%NJ_V
+  TZSTATIONS(NUMBSTAT_LOC)%XXMCOEF = TPSTATION%XXMCOEF
+  TZSTATIONS(NUMBSTAT_LOC)%XYMCOEF = TPSTATION%XYMCOEF
+  TZSTATIONS(NUMBSTAT_LOC)%XXUCOEF = TPSTATION%XXUCOEF
+  TZSTATIONS(NUMBSTAT_LOC)%XYVCOEF = TPSTATION%XYVCOEF
+
+  IF ( ASSOCIATED( TSTATIONS ) ) DEALLOCATE( TSTATIONS ) !Can be done without memory leak because allocatable arrays were
+                                                         !not yet allocated (will be done in STATION_ALLOCATE)
+  TSTATIONS => TZSTATIONS
+
+END SUBROUTINE STATION_ADD
+
+! ########################################################
+FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB )
+! ########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:), INTENT(IN) :: PA
+  REAL                             :: PB
+
+  INTEGER :: JI, JJ
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_M
+    JJ = TPSTATPROF%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI,   JJ  ) + &
+         (   TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ  ) + &
+         (1.-TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI,   JJ+1) + &
+         (   TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_2D
+
+! ##########################################################
+FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:), INTENT(IN) :: PA
+  REAL                             :: PB
+
+  INTEGER :: JI, JJ
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_U
+    JJ = TPSTATPROF%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATPROF%XXUCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI,   JJ  ) + &
+         (   TPSTATPROF%XXUCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ  ) + &
+         (1.-TPSTATPROF%XXUCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI,   JJ+1) + &
+         (   TPSTATPROF%XXUCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_2D_U
+
+! ##########################################################
+FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:), INTENT(IN) :: PA
+  REAL                             :: PB
+
+  INTEGER :: JI, JJ
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_M
+    JJ = TPSTATPROF%NJ_V
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYVCOEF) * PA(JI,   JJ  ) + &
+         (   TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYVCOEF) * PA(JI+1, JJ  ) + &
+         (1.-TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYVCOEF) * PA(JI,   JJ+1) + &
+         (   TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYVCOEF) * PA(JI+1, JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_2D_V
+
+! ########################################################
+FUNCTION STATPROF_INTERP_3D( TPSTATPROF, PA ) RESULT( PB )
+! ########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA),   INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
+  REAL, DIMENSION(SIZE(PA,3))        :: PB
+
+  INTEGER :: JI, JJ, JK
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_M
+    JJ = TPSTATPROF%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    DO JK = 1, SIZE( PA, 3 )
+      IF ( PA(JI, JJ,   JK) /= XUNDEF .AND. PA(JI+1, JJ,   JK) /= XUNDEF .AND. &
+           PA(JI, JJ+1, JK) /= XUNDEF .AND. PA(JI+1, JJ+1, JK) /= XUNDEF       ) THEN
+        PB(JK) = (1.-TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI,   JJ,   JK) + &
+                 (   TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ,   JK) + &
+                 (1.-TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI,   JJ+1, JK) + &
+                 (   TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1, JK)
+      ELSE
+        PB(JK) = XUNDEF
+      END IF
+    END DO
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB(:) = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_3D
+
+! ##########################################################
+FUNCTION STATPROF_INTERP_3D_U( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA),   INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
+  REAL, DIMENSION(SIZE(PA,3))        :: PB
+
+  INTEGER :: JI, JJ
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_U
+    JJ = TPSTATPROF%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB(:) = (1.-TPSTATPROF%XXUCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI,   JJ,   :) + &
+            (   TPSTATPROF%XXUCOEF) *  (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ,   :) + &
+            (1.-TPSTATPROF%XXUCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI,   JJ+1, :) + &
+            (   TPSTATPROF%XXUCOEF) *  (   TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1, :)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_U', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_3D_U
+
+! ##########################################################
+FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  CLASS(TSTATPROFDATA),   INTENT(IN) :: TPSTATPROF
+  REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
+  REAL, DIMENSION(SIZE(PA,3))        :: PB
+
+  INTEGER :: JI, JJ
+
+  IF ( SIZE( PA, 1 ) == 2 ) THEN
+    JI = 1
+    JJ = 1
+  ELSE IF ( L1D ) THEN
+    JI = 2
+    JJ = 2
+  ELSE
+    JI = TPSTATPROF%NI_M
+    JJ = TPSTATPROF%NJ_V
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB(:) = (1.-TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYVCOEF) * PA(JI,   JJ,   :) + &
+            (   TPSTATPROF%XXMCOEF) *  (1.-TPSTATPROF%XYVCOEF) * PA(JI+1, JJ,   :) + &
+            (1.-TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYVCOEF) * PA(JI,   JJ+1, :) + &
+            (   TPSTATPROF%XXMCOEF) *  (   TPSTATPROF%XYVCOEF) * PA(JI+1, JJ+1, :)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_V', 'value can not be interpolated', OLOCAL = .TRUE. )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_3D_V
+
+! #################################################
+SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN )
+! #################################################
+  USE MODD_TIME_n,     ONLY: TDTCUR
+
+  USE MODE_DATETIME
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME
+  INTEGER,             INTENT(OUT)   :: KIN ! Current step of storage
+
+  IF ( TPSTATPROF_TIME%N_CUR == 0 ) THEN
+    ! First store
+    TPSTATPROF_TIME%N_CUR = 1
+    TPSTATPROF_TIME%TPDATES(1) = TDTCUR
+    KIN = 1
+  ELSE
+    IF ( TDTCUR - TPSTATPROF_TIME%TPDATES(TPSTATPROF_TIME%N_CUR) >= TPSTATPROF_TIME%XTSTEP - 1.E-6 ) THEN
+      TPSTATPROF_TIME%N_CUR = TPSTATPROF_TIME%N_CUR + 1
+      KIN = TPSTATPROF_TIME%N_CUR
+
+      IF ( KIN < 1 .OR. KIN > SIZE( TPSTATPROF_TIME%TPDATES ) ) THEN
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INSTANT', 'problem with step of storage' )
+        KIN = -2
+      ELSE
+        TPSTATPROF_TIME%TPDATES(KIN) = TDTCUR
+      END IF
+    ELSE
+      ! Return an invalid step number
+      KIN = -1
+    END IF
+  END IF
+
+END SUBROUTINE STATPROF_INSTANT
+
+END MODULE MODE_STATPROF_TOOLS
diff --git a/src/MNH/surf_rad_modif.f90 b/src/MNH/surf_rad_modif.f90
index a21ce0dc1b934549ae77da4bf3e3ebd704a21394..1cb4f085de74345d4701e2227a760187a1fe14e4 100644
--- a/src/MNH/surf_rad_modif.f90
+++ b/src/MNH/surf_rad_modif.f90
@@ -1,26 +1,23 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 param 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !    ##########################
      MODULE MODI_SURF_RAD_MODIF 
 !    ##########################
 !
 INTERFACE 
 !
-      SUBROUTINE SURF_RAD_MODIF ( PMAP, PXHAT, PYHAT,            &
-                  PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY,         &
-                  PDIRFLASWD, PDIRSRFSWD                         )
+      SUBROUTINE SURF_RAD_MODIF ( PMAP, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                                  PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, &
+                                  PDIRFLASWD, PDIRSRFSWD                 )
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP       ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT      ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT      ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PDXHAT     ! horizontal stretching in x
+REAL, DIMENSION(:),       INTENT(IN) :: PDYHAT     ! horizontal stretching in y
+REAL, DIMENSION(:),       INTENT(IN) :: PXHATM     ! X coordinates at mass points
+REAL, DIMENSION(:),       INTENT(IN) :: PYHATM     ! Y coordinates at mass points
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN    ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN    ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL   ! azimuthal solar angle
@@ -36,11 +33,11 @@ END INTERFACE
 !
 END MODULE MODI_SURF_RAD_MODIF
 !
-!     ###################################################################
-      SUBROUTINE SURF_RAD_MODIF ( PMAP, PXHAT, PYHAT,            &
-                  PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY,         &
-                  PDIRFLASWD, PDIRSRFSWD                         )
-!     ###################################################################
+!     ####################################################################
+      SUBROUTINE SURF_RAD_MODIF ( PMAP, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                                  PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, &
+                                  PDIRFLASWD, PDIRSRFSWD                 )
+!     ####################################################################
 !
 !!****  * SURF_RAD_MODIF * - computes the modifications to the downwards
 !!                           radiative fluxes at the surface, due to
@@ -113,8 +110,10 @@ IMPLICIT NONE
 !
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP       ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT      ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT      ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PDXHAT     ! horizontal stretching in x
+REAL, DIMENSION(:),       INTENT(IN) :: PDYHAT     ! horizontal stretching in y
+REAL, DIMENSION(:),       INTENT(IN) :: PXHATM     ! X coordinates at mass points
+REAL, DIMENSION(:),       INTENT(IN) :: PYHATM     ! Y coordinates at mass points
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN    ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN    ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL   ! azimuthal solar angle
@@ -158,14 +157,14 @@ ISWB = SIZE(PDIRFLASWD,3)
 !-------------------------------------------------------------------------------
 !
 DO JSWB = 1, ISWB
-  CALL SURF_SOLAR_SUM     (PXHAT, PYHAT, ZMAP, PDIRFLASWD(:,:,JSWB), ZENERGY1(JSWB) )
+  CALL SURF_SOLAR_SUM     (PDXHAT, PDYHAT, ZMAP, PDIRFLASWD(:,:,JSWB), ZENERGY1(JSWB) )
 END DO
 !
 !
 !*       2.    Slope direction direct SW effects
 !              ---------------------------------
 !
-CALL SURF_SOLAR_SLOPES  (ZMAP, PXHAT, PYHAT,                 &
+CALL SURF_SOLAR_SLOPES  (ZMAP, PDXHAT, PDYHAT,               &
                          PCOSZEN, PSINZEN, PAZIMSOL,         &
                          PZS, PZS_XY, PDIRFLASWD, ZDIRSWDT   )
 
@@ -173,7 +172,7 @@ CALL SURF_SOLAR_SLOPES  (ZMAP, PXHAT, PYHAT,                 &
 !*       3.    RESOLVED shadows for direct solar radiation
 !              -------------------------------------------
 !
-CALL SURF_SOLAR_SHADOWS (ZMAP, PXHAT, PYHAT,           &
+CALL SURF_SOLAR_SHADOWS (ZMAP, PXHATM, PYHATM,         &
                          PCOSZEN, PSINZEN, PAZIMSOL,   &
                          PZS, PZS_XY, ZDIRSWDT, ZDIRSWD)
 !
@@ -182,11 +181,11 @@ CALL SURF_SOLAR_SHADOWS (ZMAP, PXHAT, PYHAT,           &
 !              -------------------
 !
 DO JSWB = 1, ISWB
-  CALL SURF_SOLAR_SUM(PXHAT, PYHAT, ZMAP,  &
+  CALL SURF_SOLAR_SUM(PDXHAT, PDYHAT, ZMAP,  &
                       ZDIRSWD(:,:,JSWB),   &
                       ZENERGY2(JSWB)       )
   !
-  CALL SURF_SOLAR_SUM(PXHAT, PYHAT, ZMAP,                             &
+  CALL SURF_SOLAR_SUM(PDXHAT, PDYHAT, ZMAP,                             &
                       MAX(ZDIRSWD(:,:,JSWB)-PDIRFLASWD(:,:,JSWB),0.), &
                       ZENERGYP(JSWB)                                  )
   !
diff --git a/src/MNH/surf_solar_shadows.f90 b/src/MNH/surf_solar_shadows.f90
index b751989594ce9b2c0975f956fe7d0402802d7114..7d13e34b03b4783cb8ce0d2daf659d75d20c06a7 100644
--- a/src/MNH/surf_solar_shadows.f90
+++ b/src/MNH/surf_solar_shadows.f90
@@ -1,27 +1,22 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 param 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !    ##############################
      MODULE MODI_SURF_SOLAR_SHADOWS 
 !    ##############################
 !
 INTERFACE 
 !
-      SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHAT, PYHAT,                     &
+      SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHATM, PYHATM,                   &
                   PCOSZEN, PSINZEN, PAZIMSOL,                                 &
                   PZS, PZS_XY, PDIRSWDT, PDIRSRFSWD                           )
 !
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP         ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT        ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT        ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PXHATM       ! X coordinate at mass points
+REAL, DIMENSION(:),       INTENT(IN) :: PYHATM       ! Y coordinate at mass points
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL! azimuthal solar angle
@@ -39,7 +34,7 @@ END INTERFACE
 !
 END MODULE MODI_SURF_SOLAR_SHADOWS
 !     #########################################################################
-      SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHAT, PYHAT,                     &
+      SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHATM, PYHATM,                   &
                   PCOSZEN, PSINZEN, PAZIMSOL,                                 &
                   PZS, PZS_XY, PDIRSWDT, PDIRSRFSWD                           )
 !     #########################################################################
@@ -81,13 +76,14 @@ END MODULE MODI_SURF_SOLAR_SHADOWS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_ll
 !
-USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT
-USE MODD_CST,        ONLY : XPI, XRADIUS
 USE MODD_CONF,       ONLY : LCARTESIAN
-USE MODD_SHADOWS_n,  ONLY : XZS_ll, XZS_XY_ll, XXHAT_ll, &
-                            XYHAT_ll, XZS_MAX_ll, XZS_MAX_ll
+USE MODD_CST,        ONLY : XPI, XRADIUS
+USE MODD_GRID_n,     ONLY : XXHAT_ll, XYHAT_ll
+USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT
+USE MODD_SHADOWS_n,  ONLY : XZS_ll, XZS_XY_ll, XZS_MAX_ll, XZS_MAX_ll
+!
+USE MODE_ll
 !
 IMPLICIT NONE
 !
@@ -95,8 +91,8 @@ IMPLICIT NONE
 !
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP         ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT        ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT        ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PXHATM       ! X coordinate at mass points
+REAL, DIMENSION(:),       INTENT(IN) :: PYHATM       ! Y coordinate at mass points
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL! azimuthal solar angle
@@ -231,20 +227,20 @@ DO JJ=IJB,IJE
 !
       SELECT CASE (JT)
        CASE (1)
-         ZX=(5.*PXHAT(JI)+PXHAT(JI+1))/6.
-         ZY=0.5*(PYHAT(JJ)+PYHAT(JJ+1))
+         ZX=PXHATM(JI)/6.
+         ZY=PYHATM(JJ)
          ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ)+PZS_XY(JI,JJ+1))/3.
        CASE (2)
-         ZX=0.5*(PXHAT(JI)+PXHAT(JI+1))
-         ZY=(5.*PYHAT(JJ+1)+PYHAT(JJ))/6.
+         ZX=PXHATM(JI)
+         ZY=PYHATM(JJ)/6.
          ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ+1)+PZS_XY(JI+1,JJ+1))/3.
        CASE (3)
-         ZX=(5.*PXHAT(JI+1)+PXHAT(JI))/6.
-         ZY=0.5*(PYHAT(JJ)+PYHAT(JJ+1))
+         ZX=PXHATM(JI)/6.
+         ZY=PYHATM(JJ)
          ZZ=(PZS(JI,JJ)+PZS_XY(JI+1,JJ)+PZS_XY(JI+1,JJ+1))/3.
        CASE (4)
-         ZX=0.5*(PXHAT(JI)+PXHAT(JI+1))
-         ZY=(5.*PYHAT(JJ)+PYHAT(JJ+1))/6.
+         ZX=PXHATM(JI)
+         ZY=PYHATM(JJ)/6.
          ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ)+PZS_XY(JI+1,JJ))/3.
       END SELECT
 !
diff --git a/src/MNH/surf_solar_slopes.f90 b/src/MNH/surf_solar_slopes.f90
index e7ea4ef2284690164c6c4c0679c8621f245ec5dd..0ffcf81e32e18b4cceb8cc16350224eed428d22d 100644
--- a/src/MNH/surf_solar_slopes.f90
+++ b/src/MNH/surf_solar_slopes.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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.
@@ -9,14 +9,14 @@
 !
 INTERFACE 
 !
-      SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PXHAT, PYHAT,                      &
+      SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PDXHAT, PDYHAT,                    &
                   PCOSZEN, PSINZEN, PAZIMSOL,                                 &
                   PZS, PZS_XY, PDIRSRFSWD, PDIRSWDT                           )
 !
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP         ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT        ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT        ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PDXHAT       ! horizontal stretching in x
+REAL, DIMENSION(:),       INTENT(IN) :: PDYHAT       ! horizontal stretching in y
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL! azimuthal solar angle
@@ -34,7 +34,7 @@ END INTERFACE
 !
 END MODULE MODI_SURF_SOLAR_SLOPES
 !     #########################################################################
-      SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PXHAT, PYHAT,                      &
+      SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PDXHAT, PDYHAT,                    &
                   PCOSZEN, PSINZEN, PAZIMSOL,                                 &
                   PZS, PZS_XY, PDIRSRFSWD, PDIRSWDT                           )
 !     #########################################################################
@@ -86,8 +86,8 @@ IMPLICIT NONE
 !
 !
 REAL, DIMENSION(:,:),     INTENT(IN) :: PMAP         ! map factor
-REAL, DIMENSION(:),       INTENT(IN) :: PXHAT        ! X coordinate
-REAL, DIMENSION(:),       INTENT(IN) :: PYHAT        ! Y coordinate
+REAL, DIMENSION(:),       INTENT(IN) :: PDXHAT       ! horizontal stretching in x
+REAL, DIMENSION(:),       INTENT(IN) :: PDYHAT       ! horizontal stretching in y
 REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle)
 REAL, DIMENSION(:,:),     INTENT(IN) :: PAZIMSOL! azimuthal solar angle
@@ -144,27 +144,27 @@ DO JT=1,4
         CASE (1)
           ZDZSDX=(    2.* PZS   (JI,JJ)                   &
                    - (PZS_XY(JI,JJ)+PZS_XY(JI,JJ+1)) )    &
-                 / (PXHAT(JI+1)-PXHAT(JI))  * PMAP(JI,JJ)
+                 / PDXHAT(JI)  * PMAP(JI,JJ)
           ZDZSDY=(  PZS_XY(JI,JJ+1) - PZS_XY(JI,JJ) )     &
-                 / (PYHAT(JJ+1)-PYHAT(JJ))  * PMAP(JI,JJ)
+                 / PDYHAT(JJ)  * PMAP(JI,JJ)
         CASE (2)
            ZDZSDX=(  PZS_XY(JI+1,JJ+1) -PZS_XY(JI,JJ+1))  &
-                 / (PXHAT(JI+1)-PXHAT(JI))  * PMAP(JI,JJ)
+                 / PDXHAT(JI)  * PMAP(JI,JJ)
            ZDZSDY=(  (PZS_XY(JI+1,JJ+1)+PZS_XY(JI,JJ+1))  &
                      - 2.* PZS (JI,JJ) )                  &
-                 / (PYHAT(JJ+1)-PYHAT(JJ))  * PMAP(JI,JJ)
+                 / PDYHAT(JJ)  * PMAP(JI,JJ)
         CASE (3)
           ZDZSDX=(  (PZS_XY(JI+1,JJ)+PZS_XY(JI+1,JJ+1))   &
                    - 2.* PZS(JI,JJ)                    )  &
-                 / (PXHAT(JI+1)-PXHAT(JI))  * PMAP(JI,JJ)
+                 / PDXHAT(JI)  * PMAP(JI,JJ)
           ZDZSDY=(  PZS_XY(JI+1,JJ+1) - PZS_XY(JI+1,JJ) ) &
-                 / (PYHAT(JJ+1)-PYHAT(JJ))  * PMAP(JI,JJ)
+                 / PDYHAT(JJ)  * PMAP(JI,JJ)
         CASE (4)
            ZDZSDX=(  PZS_XY(JI+1,JJ) - PZS_XY(JI,JJ) )    &
-                 / (PXHAT(JI+1)-PXHAT(JI))  * PMAP(JI,JJ)
+                 / PDXHAT(JI)  * PMAP(JI,JJ)
            ZDZSDY=(  2.* PZS(JI,JJ)                       &
                    - (PZS_XY(JI+1,JJ)+PZS_XY(JI,JJ)) )    &
-                 / (PYHAT(JJ+1)-PYHAT(JJ))  * PMAP(JI,JJ)
+                 / PDYHAT(JJ)  * PMAP(JI,JJ)
       END SELECT
 !
 !* slope angles
diff --git a/src/MNH/surf_solar_sum.f90 b/src/MNH/surf_solar_sum.f90
index 3742792d5b0f261dfc6af9f88d7f71ee10c3de0a..11295f83a009955f5752b047d49f531b47609f10 100644
--- a/src/MNH/surf_solar_sum.f90
+++ b/src/MNH/surf_solar_sum.f90
@@ -1,24 +1,19 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 param 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !    ##########################
      MODULE MODI_SURF_SOLAR_SUM 
 !    ##########################
 !
 INTERFACE 
 !
-      SUBROUTINE SURF_SOLAR_SUM ( PXHAT, PYHAT, PMAP, PDIRSWD, PENERGY )
+      SUBROUTINE SURF_SOLAR_SUM ( PDXHAT, PDYHAT, PMAP, PDIRSWD, PENERGY )
 !
 !
-REAL, DIMENSION(:),   INTENT(IN) :: PXHAT    ! X coordinate
-REAL, DIMENSION(:),   INTENT(IN) :: PYHAT    ! Y coordinate
+REAL, DIMENSION(:),   INTENT(IN) :: PDXHAT   ! horizontal stretching in x
+REAL, DIMENSION(:),   INTENT(IN) :: PDYHAT   ! horizontal stretching in y
 REAL, DIMENSION(:,:), INTENT(IN) :: PMAP     ! map factor
 REAL, DIMENSION(:,:), INTENT(IN) :: PDIRSWD  ! direct SW flux on hor. surf.
 REAL,                 INTENT(OUT):: PENERGY  ! energy received by the surface
@@ -30,9 +25,9 @@ END INTERFACE
 !
 END MODULE MODI_SURF_SOLAR_SUM
 !
-!     ##################################################################
-      SUBROUTINE SURF_SOLAR_SUM ( PXHAT, PYHAT, PMAP, PDIRSWD, PENERGY )
-!     ##################################################################
+!     ####################################################################
+      SUBROUTINE SURF_SOLAR_SUM ( PDXHAT, PDYHAT, PMAP, PDIRSWD, PENERGY )
+!     ####################################################################
 !
 !!****  * SURF_SOLAR_SUM * - computes the sum of energy received by
 !!                           the surface from direct solar radiation
@@ -78,8 +73,8 @@ IMPLICIT NONE
 !*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
 !
 !
-REAL, DIMENSION(:),   INTENT(IN) :: PXHAT    ! X coordinate
-REAL, DIMENSION(:),   INTENT(IN) :: PYHAT    ! Y coordinate
+REAL, DIMENSION(:),   INTENT(IN) :: PDXHAT   ! horizontal stretching in x
+REAL, DIMENSION(:),   INTENT(IN) :: PDYHAT   ! horizontal stretching in y
 REAL, DIMENSION(:,:), INTENT(IN) :: PMAP     ! map factor
 REAL, DIMENSION(:,:), INTENT(IN) :: PDIRSWD  ! direct SW flux on hor. surf.
 REAL,                 INTENT(OUT):: PENERGY  ! energy received by the surface
@@ -109,9 +104,7 @@ ALLOCATE(ZENERGY_2D(IIB:IIE,IJB:IJE))
 !
 DO JJ=IJB,IJE
   DO JI=IIB,IIE
-    ZENERGY_2D(JI,JJ) = PDIRSWD(JI,JJ)*(PXHAT(JI+1)-PXHAT(JI)) &
-                                      *(PYHAT(JJ+1)-PYHAT(JJ)) &
-                                      /PMAP(JI,JJ)**2
+    ZENERGY_2D(JI,JJ) = PDIRSWD(JI,JJ) * PDXHAT(JI) * PDYHAT(JJ) / PMAP(JI,JJ)**2
   END DO
 END DO
 !
diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90
index c194db61154a5c3fe6fcf2308dae47d01720856c..18c0e8ffb0c22d9ea6f2512d1c382b023665d475 100644
--- a/src/MNH/turb_cloud_index.f90
+++ b/src/MNH/turb_cloud_index.f90
@@ -83,7 +83,7 @@ END MODULE MODI_TURB_CLOUD_INDEX
 !
 !-------------------------------------------------------------------------------
 !
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_PARAMETERS,     ONLY: JPVEXT
 !
@@ -133,7 +133,7 @@ INTEGER             :: IIB,IJB,IKB  ! Begin of physical dimensions
 INTEGER             :: IIE,IJE,IKE  ! End   of physical dimensions
 INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD
                              ! 0 except cloudy points or adjacent points (1)
-TYPE(TFIELDDATA)    :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -244,100 +244,108 @@ ENDDO
 !*       2.5    Writing
 !
 IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
-  TZFIELD%CMNHNAME   = 'RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'RVCI',      &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'RVCI',      &
+    CUNITS     = 'kg kg-1',   &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'X_Y_Z_RVCI',&
+    NGRID      = 1,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .TRUE.       )
   CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI)
   !
-  TZFIELD%CMNHNAME   = 'GX_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'GX_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_GX_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'GX_RVCI',       &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'GX_RVCI',       &
+    CUNITS     = 'kg kg-1 m-1',   &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_Z_GX_RVCI', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1))
   !
-  TZFIELD%CMNHNAME   = 'GY_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'GY_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_GY_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'GY_RVCI',       &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'GY_RVCI',       &
+    CUNITS     = 'kg kg-1 m-1',   &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_Z_GY_RVCI', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2))
   !
-  TZFIELD%CMNHNAME   = 'GNORM_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'GNORM_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_NORM G'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(      &
+    CMNHNAME   = 'GNORM_RVCI',   &
+    CSTDNAME   = '',             &
+    CLONGNAME  = 'GNORM_RVCI',   &
+    CUNITS     = 'kg kg-1 m-1',  &
+    CDIR       = 'XY',           &
+    CCOMMENT   = 'X_Y_Z_NORM G', &
+    NGRID      = 1,              &
+    NTYPE      = TYPEREAL,       &
+    NDIMS      = 3,              &
+    LTIMEDEP   = .TRUE.          )
   CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI)
   !
-  TZFIELD%CMNHNAME   = 'QX_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'QX_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_QX_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'QX_RVCI',       &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'QX_RVCI',       &
+    CUNITS     = 'kg kg-1 m-1',   &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_Z_QX_RVCI', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1))
   !
-  TZFIELD%CMNHNAME   = 'QY_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'QY_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_QY_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'QY_RVCI',       &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'QY_RVCI',       &
+    CUNITS     = 'kg kg-1 m-1',   &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_Z_QY_RVCI', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2))
   !
-  TZFIELD%CMNHNAME   = 'QNORM_RVCI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'QNORM_RVCI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_QNORM_RVCI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'QNORM_RVCI',       &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = 'QNORM_RVCI',       &
+    CUNITS     = 'kg kg-1 m-1',      &
+    CDIR       = 'XY',               &
+    CCOMMENT   = 'X_Y_Z_QNORM_RVCI', &
+    NGRID      = 1,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 3,                  &
+    LTIMEDEP   = .TRUE.              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI)
   !
-  TZFIELD%CMNHNAME   = 'CEI'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CEI'
-  TZFIELD%CUNITS     = 'kg kg-1 m-1 s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_CEI'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'CEI',             &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'CEI',             &
+    CUNITS     = 'kg kg-1 m-1 s-1', &
+    CDIR       = 'XY',              &
+    CCOMMENT   = 'X_Y_Z_CEI',       &
+    NGRID      = 1,                 &
+    NTYPE      = TYPEREAL,          &
+    NDIMS      = 3,                 &
+    LTIMEDEP   = .TRUE.             )
   CALL IO_Field_write(TPFILE,TZFIELD,PCEI)
 END IF
 !
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index f75aa19f9aa547e0fd43b47a47e9e75e662b9e68..92a0dc327a43bbae9ce9360a2d77872b778eadcd 100644
--- a/src/MNH/update_nsv.f90
+++ b/src/MNH/update_nsv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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.
@@ -26,11 +26,14 @@ END MODULE MODI_UPDATE_NSV
 !!  Modify (Vie) 2016 : add LIMA
 !!         V. Vionnet 7/2017 : add blowing snow var
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
-!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
+!  P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
 !-------------------------------------------------------------------------------
 !
-USE MODD_CONF, ONLY : NVERB
+USE MODD_CONF,       ONLY: NVERB
+USE MODD_FIELD,      ONLY: tfieldmetadata
 USE MODD_NSV
+USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX
 
 use mode_msg
 
@@ -39,10 +42,12 @@ IMPLICIT NONE
 INTEGER, INTENT(IN) :: KMI ! Model index
 
 CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP
 INTEGER :: JI, JJ
+TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP
 !
 ! STOP if INI_NSV has not be called yet
-IF (.NOT. LINI_NSV) THEN
+IF ( .NOT. LINI_NSV(KMI) ) THEN
   call Print_msg( NVERB_FATAL, 'GEN', 'UPDATE_NSV', 'can not continue because INI_NSV was not called' )
 END IF
 !
@@ -50,20 +55,35 @@ END IF
 ! that have been initialized in ini_nsv.f90 for model KMI
 !
 
-! Allocate/reallocate CSVNAMES_A
-IF ( .NOT. ALLOCATED( CSVNAMES_A ) ) ALLOCATE( CSVNAMES_A( NSV_A(KMI), KMI) )
-!If CSVNAMES_A is too small, enlarge it and transfer data
-IF ( SIZE( CSVNAMES_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSVNAMES_A, 2 ) < KMI ) THEN
-  ALLOCATE( YSVNAMES_TMP(NSV_A(KMI), KMI) )
-  DO JJ = 1, SIZE( CSVNAMES_A, 2 )
-    DO JI = 1, SIZE( CSVNAMES_A, 1 )
-      YSVNAMES_TMP(JI, JJ) = CSVNAMES_A(JI, JJ)
+! Allocate/reallocate CSV_CHEM_LIST_A
+IF ( .NOT. ALLOCATED( CSV_CHEM_LIST_A ) ) ALLOCATE( CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) )
+!If CSV_CHEM_LIST_A is too small, enlarge it and transfer data
+IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSVCHEM_LIST_TMP(NSV_CHEM_LIST_A(KMI), KMI) )
+  DO JJ = 1, SIZE( CSV_CHEM_LIST_A, 2 )
+    DO JI = 1, SIZE( CSV_CHEM_LIST_A, 1 )
+      YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ)
     END DO
   END DO
-  CALL MOVE_ALLOC( FROM = YSVNAMES_TMP, TO = CSVNAMES_A )
+  CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A )
 END IF
 
-CSVNAMES => CSVNAMES_A(:,KMI)
+CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI)
+
+! Allocate/reallocate TSVLIST_A
+IF ( .NOT. ALLOCATED( TSVLIST_A ) ) ALLOCATE( TSVLIST_A( NSV_A(KMI), KMI) )
+!If TSVLIST_A is too small, enlarge it and transfer data
+IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSVLIST_TMP(NSV_A(KMI), KMI) )
+  DO JJ = 1, SIZE( TSVLIST_A, 2 )
+    DO JI = 1, SIZE( TSVLIST_A, 1 )
+      YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ)
+    END DO
+  END DO
+  CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TSVLIST_A )
+END IF
+
+TSVLIST => TSVLIST_A(:,KMI)
 
 NSV         = NSV_A(KMI)
 NSV_USER    = NSV_USER_A(KMI)
diff --git a/src/MNH/uv_to_zonal_and_merid.f90 b/src/MNH/uv_to_zonal_and_merid.f90
index 6ce72b8c276368ca96f11d8626d9e8477081a170..95d768766915625a2ce9908eecc8aa0048ff246e 100644
--- a/src/MNH/uv_to_zonal_and_merid.f90
+++ b/src/MNH/uv_to_zonal_and_merid.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-2021 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.
@@ -9,31 +9,31 @@
 INTERFACE UV_TO_ZONAL_AND_MERID
       SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
-use modd_field, only: tfielddata
+use modd_field, only: tfieldmetadata
 use modd_io,    only: tfiledata
 !
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
-INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
-TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
-TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                      INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),                    OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 !
       SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
-use modd_field, only: tfielddata
+use modd_field, only: tfieldmetadata
 use modd_io,    only: tfiledata
 !
-REAL, DIMENSION(:,:),                    INTENT(IN)  :: PU       ! Input U component
-REAL, DIMENSION(:,:),                    INTENT(IN)  :: PV       ! Input V component
-INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
-REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
-REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
-TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
-TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
+REAL, DIMENSION(:,:),                         INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:),                         INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                      INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:),               OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:),               OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),                    OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID2D
 !
@@ -47,16 +47,16 @@ INTERFACE
 !
       SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
-use modd_field, only: tfielddata
+use modd_field, only: tfieldmetadata
 use modd_io,    only: tfiledata
 !
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
-INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
-TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
-TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                      INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),                    OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 END INTERFACE
@@ -103,7 +103,7 @@ END MODULE MODI_UV_TO_ZONAL_AND_MERID3D
 USE MODD_CONF
 USE MODD_CST
 USE MODD_DIM_n
-use modd_field,          only: tfielddata
+use modd_field,          only: tfieldmetadata
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_IO,             ONLY: TFILEDATA
@@ -119,13 +119,13 @@ IMPLICIT NONE
 !
 !*      0.1    declarations of arguments
 !
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
-REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
-INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
-REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
-TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
-TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                       INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                      INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),             OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),                    OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 !*      0.2    declarations of local variables
 !
@@ -276,7 +276,7 @@ END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 !*       0.     DECLARATIONS
 !               ------------
 !
-use modd_field,          only: tfielddata
+use modd_field,          only: tfieldmetadata
 USE MODD_IO,             ONLY: TFILEDATA, NVERB_WARNING
 USE MODD_LUNIT_n,        ONLY: TLUOUT
 !
@@ -289,13 +289,13 @@ IMPLICIT NONE
 !
 !*      0.1    declarations of arguments
 !
-REAL, DIMENSION(:,:),                    INTENT(IN)  :: PU       ! Input U component
-REAL, DIMENSION(:,:),                    INTENT(IN)  :: PV       ! Input V component
-INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
-REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
-REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
-TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
-TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
+REAL, DIMENSION(:,:),                         INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:),                         INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                      INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:),               OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:),               OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),                    OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 !*      0.2    declarations of local variables
 !
diff --git a/src/MNH/ver_interp_to_mixed_grid.f90 b/src/MNH/ver_interp_to_mixed_grid.f90
index 94b161a5d4989fd24bcc8dc2305436acfc304d03..1c1580cc9588bf11b59feda0d5f22d5fc4b2d63f 100644
--- a/src/MNH/ver_interp_to_mixed_grid.f90
+++ b/src/MNH/ver_interp_to_mixed_grid.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -274,7 +274,7 @@ ILU=SIZE(PZMASS_LS,3)
 !*       1.1   Grid definition
 !              ---------------
 !
-IF (MINVAL(PZMASS_LS (:,:,ILU))<0.5*(XZHAT(IKE)+XZHAT(IKE+1))) THEN
+IF (MINVAL(PZMASS_LS (:,:,ILU))<XZHATM(IKE)) THEN
   WRITE(ILUOUT0,*)
   WRITE(ILUOUT0,*) '+-----------------------------------------------------+'
   WRITE(ILUOUT0,*) '| MESONH highest mass level above highest input level |'
diff --git a/src/MNH/ver_thermo.f90 b/src/MNH/ver_thermo.f90
index d926e6c26166d796723e9c9050aad7b41e79ae0a..186f230a42bb33b3b038d73bb0d58f9b8347c152 100644
--- a/src/MNH/ver_thermo.f90
+++ b/src/MNH/ver_thermo.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 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.
@@ -159,7 +159,7 @@ USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_CST
 USE MODD_DYN_n
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_FIELD_n,        ONLY: XTHT,XRT,XPABST,XDRYMASST
 USE MODD_GRID_n
 USE MODD_IO,             ONLY: TFILEDATA,TFILE_DUMMY
@@ -227,7 +227,7 @@ INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
 INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
 INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
 INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 
 !-------------------------------------------------------------------------------
 !
@@ -295,16 +295,17 @@ DO JRR=1,SIZE(XRT,4)
 END DO
 !
 IF (NVERB>=10) THEN
-  TZFIELD%CMNHNAME   = 'THV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'THV'
-  TZFIELD%CUNITS     = 'K'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_THV'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'THV',       &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'THV',       &
+    CUNITS     = 'K',         &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'X_Y_Z_THV', &
+    NGRID      = 4,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .TRUE.       )
   CALL IO_Field_write(TPFILE,TZFIELD,ZTHV)
 END IF
 !-------------------------------------------------------------------------------
@@ -331,9 +332,9 @@ ALLOCATE(XRVREF(IIU,IJU,IKU))
 ALLOCATE(XEXNREF(IIU,IJU,IKU))
 ALLOCATE(XRHODJ(IIU,IJU,IKU))
 XRVREF(:,:,:) = 0.
-CALL SET_REF(0,TFILE_DUMMY,XZZ,XZHAT,PJ,PDXX,PDYY,CLBCX,CLBCY,       &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,XRHODREF,XTHVREF,XRVREF, &
-             XEXNREF,XRHODJ)
+CALL SET_REF( 0, TFILE_DUMMY, XZZ, XZHATM, PJ, PDXX, PDYY, CLBCX, CLBCY,   &
+              XREFMASS, XMASS_O_PHI0, XLINMASS, XRHODREF, XTHVREF, XRVREF, &
+              XEXNREF, XRHODJ                                              )
 
 CALL MPPDB_CHECK3D(XRHODREF,"VERTHERMO::XRHODREF",PRECISION)
 CALL MPPDB_CHECK3D(XTHVREF,"VERTHERMO::XTHVREF",PRECISION)
diff --git a/src/MNH/version.f90 b/src/MNH/version.f90
index 5c98f1946a20fa439b85ac1ef532e771ecb90a4a..c8283e7235c7a52cb15dcbb16e2b2d2516cce9ed 100644
--- a/src/MNH/version.f90
+++ b/src/MNH/version.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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.
@@ -43,10 +43,10 @@ USE MODD_CONF, ONLY : NMNHVERSION,NMASDEV,NBUGFIX,CBIBUSER
 IMPLICIT NONE
 !
 NMNHVERSION(1)=5
-NMNHVERSION(2)=5
-NMNHVERSION(3)=1
-NMASDEV=55
-NBUGFIX=1
+NMNHVERSION(2)=6
+NMNHVERSION(3)=0
+NMASDEV=56
+NBUGFIX=0
 CBIBUSER=''
 !
 END SUBROUTINE VERSION
diff --git a/src/MNH/viscosity.f90 b/src/MNH/viscosity.f90
index 4a9607c8cd1a382362c1308ed60fd33cf28120b5..c909bd9b0b511d83e006129f28491f332b2ddac5 100644
--- a/src/MNH/viscosity.f90
+++ b/src/MNH/viscosity.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.
@@ -51,11 +51,11 @@ INTERFACE
 !
       REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slipcondition is applied
 ! metric coefficients
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY
 !
 ! output source terms
      REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS
@@ -150,12 +150,12 @@ SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL,          &
 !
 !
 REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slip condition is applied
-
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX
-     REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY
+! metric coefficients
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY
+     REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX
+     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY
 !
 ! output source terms
      REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS
diff --git a/src/MNH/water_sum.f90 b/src/MNH/water_sum.f90
index 845b99c4882ede66201e5e37158e7a72b3870883..46a899cdac5e9cb34d972f1a2ae757fabf9d90eb 100644
--- a/src/MNH/water_sum.f90
+++ b/src/MNH/water_sum.f90
@@ -1,18 +1,13 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 prep_real 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     #####################
       MODULE MODI_WATER_SUM
 !     #####################
 INTERFACE
-      FUNCTION WATER_SUM(PR) RESULT (PSUM_R)
+      PURE FUNCTION WATER_SUM(PR) RESULT (PSUM_R)
 !
 REAL,DIMENSION(:,:,:,:),              INTENT(IN) :: PR     ! water species
 REAL,DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: PSUM_R ! sum of water species
@@ -20,9 +15,9 @@ REAL,DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: PSUM_R ! sum of water specie
 END FUNCTION WATER_SUM
 END INTERFACE
 END MODULE MODI_WATER_SUM
-!     ######################################
-      FUNCTION WATER_SUM(PR) RESULT (PSUM_R)
-!     ######################################
+!     ###########################################
+      PURE FUNCTION WATER_SUM(PR) RESULT (PSUM_R)
+!     ###########################################
 !
 !!****  *WATER_SUM* - summation on the water species (fourth array index)
 !! 
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index f9295b656f516849d6400fde6a9417ca07b1a513..2284be8ea3e8264dbb21d273f7e11a7604ffad51 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -1,29 +1,34 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
 !      ###########################
-MODULE MODI_WRITE_AIRCRAFT_BALLOON
+MODULE MODE_WRITE_AIRCRAFT_BALLOON
 !      ###########################
-!
-INTERFACE
-!
-      SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
-!
-USE MODD_IO, ONLY: TFILEDATA
-!
-TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
-!
-END SUBROUTINE WRITE_AIRCRAFT_BALLOON
-!
-END INTERFACE
-!
-END MODULE MODI_WRITE_AIRCRAFT_BALLOON
-!
-!     ##########################################
-      SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
-!     ##########################################
+
+use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+
+use mode_msg
+
+implicit none
+
+private
+
+PUBLIC :: AIRCRAFT_BALLOON_FREE_NONLOCAL
+public :: WRITE_AIRCRAFT_BALLOON
+
+CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string(
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE   ! title
+CHARACTER(LEN=NUNITLGTMAX),    DIMENSION(:), ALLOCATABLE :: CUNIT    ! physical unit
+
+REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6   ! contains temporal serie
+
+contains
+
+! ##########################################
+SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
+! ##########################################
 !
 !
 !!****  *WRITE_AIRCRAFT_BALLOON* - write the balloon and aircraft trajectories and records
@@ -65,48 +70,22 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON
 !  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 29/01/2019: bug: moved an instruction later (to prevent access to a not allocated array)
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!  P. Wautelet 02/10/2020: bugfix: YGROUP/YGROUPZ were too small
 !  P. Wautelet 09/10/2020: bugfix: correction on IPROCZ when not LIMA (condition was wrong)
 !  P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields
 !  P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro)
 !  P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro
 !  P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!  P. Wautelet    06/2022: reorganize flyers
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST
-USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LUNIT
-USE MODD_PARAMETERS
-!
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CH_M9_n,         ONLY: CNAMES
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, LORILAM, NSP, NCARB, NSOA,    & 
-                                JPMODE, JP_AER_BC, JP_AER_OC, JP_AER_DST, &
-                                JP_AER_H2O, JP_AER_SO4, JP_AER_NO3,       &
-                                JP_AER_NH3, JP_AER_SOA1, JP_AER_SOA2,     &
-                                JP_AER_SOA3, JP_AER_SOA4, JP_AER_SOA5,    &
-                                JP_AER_SOA6, JP_AER_SOA7, JP_AER_SOA8,    &
-                                JP_AER_SOA9, JP_AER_SOA10
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_DUST,            ONLY: CDUSTNAMES, LDUST, NMODE_DST
-USE MODD_SALT,            ONLY: CSALTNAMES
-USE MODD_NSV
-USE MODD_DIAG_IN_RUN
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_PARAM_LIMA     , ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM
-!
-USE MODE_MODELN_HANDLER
-USE MODE_DUST_PSD
-USE MODE_AERO_PSD
-use mode_msg
-use mode_write_diachro,   only: Write_diachro
+USE MODD_IO,               ONLY: ISP, TFILEDATA
+!
+USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND
 !
 IMPLICIT NONE
 !
@@ -119,736 +98,447 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: IMI    ! current model index
-!
-!----------------------------------------------------------------------------
-!
-IMI=GET_CURRENT_MODEL_INDEX()
-!
-CALL FLYER_DIACHRO(TBALLOON1)
-CALL FLYER_DIACHRO(TBALLOON2)
-CALL FLYER_DIACHRO(TBALLOON3)
-CALL FLYER_DIACHRO(TBALLOON4)
-CALL FLYER_DIACHRO(TBALLOON5)
-CALL FLYER_DIACHRO(TBALLOON6)
-CALL FLYER_DIACHRO(TBALLOON7)
-CALL FLYER_DIACHRO(TBALLOON8)
-CALL FLYER_DIACHRO(TBALLOON9)
-!
-CALL FLYER_DIACHRO(TAIRCRAFT1)
-CALL FLYER_DIACHRO(TAIRCRAFT2)
-CALL FLYER_DIACHRO(TAIRCRAFT3)
-CALL FLYER_DIACHRO(TAIRCRAFT4)
-CALL FLYER_DIACHRO(TAIRCRAFT5)
-CALL FLYER_DIACHRO(TAIRCRAFT6)
-CALL FLYER_DIACHRO(TAIRCRAFT7)
-CALL FLYER_DIACHRO(TAIRCRAFT8)
-CALL FLYER_DIACHRO(TAIRCRAFT9)
-CALL FLYER_DIACHRO(TAIRCRAFT10)
-CALL FLYER_DIACHRO(TAIRCRAFT11)
-CALL FLYER_DIACHRO(TAIRCRAFT12)
-CALL FLYER_DIACHRO(TAIRCRAFT13)
-CALL FLYER_DIACHRO(TAIRCRAFT14)
-CALL FLYER_DIACHRO(TAIRCRAFT15)
-CALL FLYER_DIACHRO(TAIRCRAFT16)
-CALL FLYER_DIACHRO(TAIRCRAFT17)
-CALL FLYER_DIACHRO(TAIRCRAFT18)
-CALL FLYER_DIACHRO(TAIRCRAFT19)
-CALL FLYER_DIACHRO(TAIRCRAFT20)
-CALL FLYER_DIACHRO(TAIRCRAFT21)
-CALL FLYER_DIACHRO(TAIRCRAFT22)
-CALL FLYER_DIACHRO(TAIRCRAFT23)
-CALL FLYER_DIACHRO(TAIRCRAFT24)
-CALL FLYER_DIACHRO(TAIRCRAFT25)
-CALL FLYER_DIACHRO(TAIRCRAFT26)
-CALL FLYER_DIACHRO(TAIRCRAFT27)
-CALL FLYER_DIACHRO(TAIRCRAFT28)
-CALL FLYER_DIACHRO(TAIRCRAFT29)
-CALL FLYER_DIACHRO(TAIRCRAFT30)
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
+INTEGER :: JI
 !
 !----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-SUBROUTINE FLYER_DIACHRO(TPFLYER)
 
-use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
-                       tbudiachrometadata
-use modd_field,  only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, &
-                       tfield_metadata_base, TYPEREAL
+DO JI = 1, NBALLOONS
+  ! The balloon data is only available on the process where it is physically located => transfer it if necessary
+
+  ! Send data from owner to writer if necessary
+  IF ( ISP == NRANKCUR_BALLOON(JI) .AND. NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+    CALL FLYER_SEND( TBALLOONS(JI)%TBALLOON, TPDIAFILE%NMASTER_RANK )
+  END IF
+
+  IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+    ! Receive data from owner if not available on the writer process
+    IF ( NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+      IF ( ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) &
+        call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_AIRCRAFT_BALLOON', 'balloon already associated' )
+      ALLOCATE( TBALLOONS(JI)%TBALLOON )
+      CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) )
+    END IF
+
+    ! Write data
+    CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON )
+
+    ! Remark: release of memory is done later by a call to AIRCRAFT_BALLOON_FREE_NONLOCAL
+    !         This call must be done after the file is closed because flyer data is needed on the
+    !         file master process at this last stage (coordinates writing)
+  END IF
+END DO
 
-use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
+DO JI = 1, NAIRCRAFTS
+  ! The aircraft data is only available on the process where it is physically located => transfer it if necessary
 
-TYPE(FLYER),        INTENT(IN)       :: TPFLYER
+  ! Send data from owner to writer if necessary
+  IF ( ISP == NRANKCUR_AIRCRAFT(JI) .AND. NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+    CALL FLYER_SEND( TAIRCRAFTS(JI)%TAIRCRAFT, TPDIAFILE%NMASTER_RANK )
+  END IF
+
+  IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+    ! Receive data from owner if not available on the writer process (need to be done only for the first model)
+    IF ( NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+      IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) &
+        call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_AIRCRAFT_BALLOON', 'aircraft already associated' )
+      ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+      CALL FLYER_RECV_AND_ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI) )
+    END IF
+
+    ! Write data
+    CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT )
+
+    ! Remark: release of memory is done later by a call to AIRCRAFT_BALLOON_FREE_NONLOCAL
+    !         This call must be done after the file is closed because flyer data is needed on the
+    !         file master process at this last stage (coordinates writing)
+  END IF
+END DO
+
+END SUBROUTINE WRITE_AIRCRAFT_BALLOON
+
+
+! ####################################################
+SUBROUTINE AIRCRAFT_BALLOON_FREE_NONLOCAL( TPDIAFILE )
+! ####################################################
+
+USE MODD_AIRCRAFT_BALLOON,     ONLY: NAIRCRAFTS, NBALLOONS, NRANKCUR_AIRCRAFT, NRANKCUR_BALLOON, TAIRCRAFTS, TBALLOONS
+USE MODD_IO,                   ONLY: ISP, TFILEDATA
+
+USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER
+
+IMPLICIT NONE
+
+TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE
+
+INTEGER :: JI
+
+CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'AIRCRAFT_BALLOON_FREE_NONLOCAL', 'called for ' // TRIM(TPDIAFILE%CNAME) )
+
+IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+  DO JI = 1, NBALLOONS
+    ! Free ballon data if it was not stored on this process
+    IF ( NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+      CALL DEALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
+      DEALLOCATE( TBALLOONS(JI)%TBALLOON )
+    END IF
+  END DO
+
+  DO JI = 1, NAIRCRAFTS
+    ! Free aircraft data if it was not stored on this process
+    IF ( NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN
+      CALL DEALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT )
+      DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+    END IF
+  END DO
+END IF
+
+END SUBROUTINE AIRCRAFT_BALLOON_FREE_NONLOCAL
+
+
+! ############################################
+SUBROUTINE FLYER_DIACHRO( TPDIAFILE, TPFLYER )
+! ############################################
+
+USE MODD_AIRCRAFT_BALLOON
+use modd_budget,           only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
+                                 tbudiachrometadata
+USE MODD_CST,              ONLY: XRV
+USE MODD_DIAG_IN_RUN,      ONLY: LDIAG_IN_RUN
+use modd_field,            only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, &
+                                 tfieldmetadata_base, TYPEREAL
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_NSV,              ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, &
+                                 nsv_lima_beg, nsv_lima_end
+USE MODD_PARAMETERS,       ONLY: XUNDEF
+USE MODD_PARAM_n,          ONLY: CCLOUD
+
+USE MODE_AERO_PSD
+use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get
+USE MODE_DUST_PSD
+USE MODE_MODELN_HANDLER,   ONLY: GET_CURRENT_MODEL_INDEX
+use mode_write_diachro,    only: Write_diachro
+
+
+TYPE(TFILEDATA),   INTENT(IN) :: TPDIAFILE ! file to write
+CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER
 !
 !*      0.2  declaration of local variables for diachro
 !
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6    ! contains temporal serie to write
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORKZ6! contains temporal serie
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWZ6   ! contains temporal serie
 REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
 REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
 !
-INTEGER, DIMENSION(:),            ALLOCATABLE :: IGRID    ! grid indicator
-CHARACTER(LEN=:), ALLOCATABLE                 :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT    ! physical unit
+CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE
+CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
+CHARACTER(LEN=NUNITLGTMAX)    :: YUNIT
 !
+INTEGER :: IMI      ! current model index
 INTEGER :: IPROC    ! number of variables records
 INTEGER :: JPROC    ! loop counter
-INTEGER, DIMENSION(:),            ALLOCATABLE :: IGRIDZ   ! grid indicator
-CHARACTER(LEN=:), ALLOCATABLE                 :: YGROUPZ  ! group title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENTZ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLEZ  ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNITZ   ! physical unit
+INTEGER :: ISTORE
 INTEGER :: IPROCZ   ! number of variables records
-INTEGER :: JPROCZ   ! loop counter
+INTEGER :: IRR      ! number of hydrometeors
 INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
 INTEGER :: JPT      ! loop counter
-INTEGER :: IKU, IK
-CHARACTER(LEN=2)  :: INDICE
-INTEGER :: JLOOP
+INTEGER :: IKU
+REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position
 type(tbudiachrometadata) :: tzbudiachro
-type(tfield_metadata_base), dimension(:), allocatable :: tzfields
+type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 !
+IMI = GET_CURRENT_MODEL_INDEX()
+
+IRR = SIZE( tpflyer%xr, 2 )
+
 IF (TPFLYER%NMODEL==0) RETURN
-IF (ALL(TPFLYER%X==XUNDEF)) RETURN
-IF (COUNT(TPFLYER%X/=XUNDEF)<=1) RETURN
+IF (ALL(TPFLYER%XX==XUNDEF)) RETURN
+IF (COUNT(TPFLYER%XX/=XUNDEF)<=1) RETURN
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
-IKU = SIZE(TPFLYER%RTZ,2) !number of vertical levels
+IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels
 !
-IPROC = 20 + SIZE(TPFLYER%R,2) + SIZE(TPFLYER%SV,2) &
-       + 2 + SIZE(TPFLYER%SVW_FLUX,2)
-IPROCZ = SIZE(TPFLYER%RTZ,2)+ SIZE(TPFLYER%RZ,2)+ SIZE(TPFLYER%RZ,3)+  SIZE(TPFLYER%CRARE,2)+ &
-         SIZE(TPFLYER%CRARE_ATT,2)+ SIZE(TPFLYER%WZ,2) + SIZE(TPFLYER%FFZ,2)+ &
-         SIZE(TPFLYER%IWCZ,2)+ SIZE(TPFLYER%LWCZ,2) + SIZE(TPFLYER%CIZ,2) + &
-         SIZE(TPFLYER%ZZ,2)
+IPROC = 21 + IRR + SIZE(TPFLYER%XSV,2) &
+       + 2 + SIZE(TPFLYER%XSVW_FLUX,2)
+IPROCZ = SIZE(TPFLYER%XRTZ,2)+ SIZE(TPFLYER%XRZ,2)+ SIZE(TPFLYER%XRZ,3)+  SIZE(TPFLYER%XCRARE,2)+ &
+         SIZE(TPFLYER%XCRARE_ATT,2)+ SIZE(TPFLYER%XWZ,2) + SIZE(TPFLYER%XFFZ,2)+ &
+         SIZE(TPFLYER%XIWCZ,2)+ SIZE(TPFLYER%XLWCZ,2) + SIZE(TPFLYER%XCIZ,2) + &
+         SIZE(TPFLYER%XZZ,2)
 
-IF (NSV_LIMA_BEG<=NSV_LIMA_END) IPROCZ= IPROCZ+ SIZE(TPFLYER%CCZ,2) + SIZE(TPFLYER%CRZ,2)
-IF (SIZE(TPFLYER%TKE  )>0) IPROC = IPROC + 1
+IF (NSV_LIMA_BEG<=NSV_LIMA_END) IPROCZ= IPROCZ+ SIZE(TPFLYER%XCCZ,2) + SIZE(TPFLYER%XCRZ,2)
+IF (SIZE(TPFLYER%XTKE  )>0) IPROC = IPROC + 1
 IF (LDIAG_IN_RUN) IPROC = IPROC + 1
 IF (LORILAM) IPROC = IPROC + JPMODE*3
 IF (LDUST) IPROC = IPROC + NMODE_DST*3
-IF (SIZE(TPFLYER%TSRAD)>0) IPROC = IPROC + 1
-!
-ALLOCATE (ZWORK6(1,1,1,size(tpflyer%tpdates),1,IPROC))
-ALLOCATE (YCOMMENT(IPROC))
-ALLOCATE (YTITLE  (IPROC))
-ALLOCATE (YUNIT   (IPROC))
-ALLOCATE (IGRID   (IPROC))
-ALLOCATE (ZWORKZ6(1,1,IKU,size(tpflyer%tpdates),1,IPROCZ))
-ALLOCATE (YCOMMENTZ(IPROCZ))
-ALLOCATE (YTITLEZ (IPROCZ))
-ALLOCATE (YUNITZ  (IPROCZ))
-ALLOCATE (IGRIDZ  (IPROCZ))
-!
-IGRID  = 1
-YGROUP = TPFLYER%TITLE
-IGRIDZ = 1
-YGROUPZ = TPFLYER%TITLE
+IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1
 !
-!----------------------------------------------------------------------------
-JPROC = 0
+ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZS'
-YUNIT    (JPROC) = 'm'
-YCOMMENT (JPROC) = 'orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZS(:)
-!
-IF (TPFLYER%ALTDEF) THEN
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'P'
-  YUNIT    (JPROC) = 'Pascal'
-  YCOMMENT (JPROC) = 'pressure' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%P(:)
-ELSE
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'Z'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'altitude' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:)
-ENDIF
+!----------------------------------------------------------------------------
+!Treat point values
+ALLOCATE (XWORK6(1,1,1,ISTORE,1,IPROC))
+ALLOCATE (CCOMMENT(IPROC))
+ALLOCATE (CTITLE  (IPROC))
+ALLOCATE (CUNIT   (IPROC))
+
+jproc = 0
+
+call Add_point( 'ZS', 'orography', 'm', tpflyer%xzs(:) )
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LON'
-YUNIT    (JPROC) = 'degree'
-YCOMMENT (JPROC) = 'longitude'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLON(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LAT'
-YUNIT    (JPROC) = 'degree'
-YCOMMENT (JPROC) = 'latitude'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%YLAT(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZON_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'zonal wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZON(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'MER_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'meridian wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%MER(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'W'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'air vertical speed' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%W(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'Th'
-YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TH(:)
-!
-DO JRR=1,SIZE(TPFLYER%R,2)
-  JPROC = JPROC+1
-  YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,JRR)
-  IF (JRR==1) THEN
-    YTITLE   (JPROC) = 'Rv'
-    YCOMMENT (JPROC) = 'water vapor mixing ratio' 
-  ELSE IF (JRR==2) THEN
-    YTITLE   (JPROC) = 'Rc'
-    YCOMMENT (JPROC) = 'liquid cloud water mixing ratio' 
-  ELSE IF (JRR==3) THEN
-    YTITLE   (JPROC) = 'Rr'
-    YCOMMENT (JPROC) = 'Rain water mixing ratio' 
-  ELSE IF (JRR==4) THEN
-    YTITLE   (JPROC) = 'Ri'
-    YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' 
-  ELSE IF (JRR==5) THEN
-    YTITLE   (JPROC) = 'Rs'
-    YCOMMENT (JPROC) = 'Snow mixing ratio' 
-  ELSE IF (JRR==6) THEN
-    YTITLE   (JPROC) = 'Rg'
-    YCOMMENT (JPROC) = 'Graupel mixing ratio' 
-  ELSE IF (JRR==7) THEN
-    YTITLE   (JPROC) = 'Rh'
-    YCOMMENT (JPROC) = 'Hail mixing ratio' 
-  END IF
-END DO
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    IF (TPFLYER%LALTDEF) THEN
+      call Add_point( 'P', 'pressure', 'Pascal', tpflyer%xp(:) )
+    ELSE
+      call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
+    ENDIF
+
+  CLASS IS ( TBALLOONDATA )
+    call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
+
+END SELECT
+!
+call Add_point( 'MODEL',    'model on which data was computed', '1', REAL( tpflyer%nmodelhist(:) ) )
+call Add_point( 'LON',      'longitude',             'degree', tpflyer%xlon(:) )
+call Add_point( 'LAT',      'latitude',              'degree', tpflyer%xlat(:) )
+call Add_point( 'ZON_WIND', 'zonal wind',            'm s-1',  tpflyer%xzon(:) )
+call Add_point( 'MER_WIND', 'meridian wind',         'm s-1',  tpflyer%xmer(:) )
+call Add_point( 'W',        'air vertical speed',    'm s-1',  tpflyer%xw(:)   )
+call Add_point( 'Th',       'potential temperature', 'K',      tpflyer%xth(:)  )
+!
+if ( irr >= 1 ) call Add_point( 'Rv', 'water vapor mixing ratio',        'kg kg-1', tpflyer%xr(:,1) )
+if ( irr >= 2 ) call Add_point( 'Rc', 'liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xr(:,2) )
+if ( irr >= 3 ) call Add_point( 'Rr', 'Rain water mixing ratio',         'kg kg-1', tpflyer%xr(:,3) )
+if ( irr >= 4 ) call Add_point( 'Ri', 'Ice cloud water mixing ratio',    'kg kg-1', tpflyer%xr(:,4) )
+if ( irr >= 5 ) call Add_point( 'Rs', 'Snow mixing ratio',               'kg kg-1', tpflyer%xr(:,5) )
+if ( irr >= 6 ) call Add_point( 'Rg', 'Graupel mixing ratio',            'kg kg-1', tpflyer%xr(:,6) )
+if ( irr >= 7 ) call Add_point( 'Rh', 'Hail mixing ratio',               'kg kg-1', tpflyer%xr(:,7) )
 !
 !add cloud liquid water content in g/m3 to compare to measurements from FSSP
-!IF (.NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
-ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates)))
-IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present
+!IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
+IF ( IRR > 1 ) THEN !cloud water is present
+  ALLOCATE( ZRHO(1, 1, ISTORE) )
+  ALLOCATE( ZLWC(ISTORE) )
   ZRHO(1,1,:) = 0.
-  DO JRR=1,SIZE(TPFLYER%R,2)
-    ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
+  DO JRR = 1, IRR
+    ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
   ENDDO
-  ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
+  ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
                                 / ( 1. + ZRHO(1,1,:)              )
-  DO JPT=1,size(tpflyer%tpdates)
-    IF (TPFLYER%P(JPT) == 0.) THEN
-      ZRHO(1,1,JPT) = 0.
+  DO JPT=1,ISTORE
+    IF ( TPFLYER%NMODELHIST(JPT) > 0 ) THEN !Compute LWC only if flyer is flying
+      IF (TPFLYER%XP(JPT) == 0.) THEN
+        ZRHO(1,1,JPT) = 0.
+      ELSE
+        ZRHO(1,1,JPT) = TPFLYER%XP(JPT) / &
+                        (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(JPT)/XP00)**(XRD/XCPD))  )
+      ENDIF
+      ZLWC(JPT) = TPFLYER%XR(JPT,2) * ZRHO(1,1,JPT) * 1.E3
     ELSE
-      ZRHO(1,1,JPT) =  TPFLYER%P(JPT) / &
-               (XRD *ZRHO(1,1,JPT) *((TPFLYER%P(JPT)/XP00)**(XRD/XCPD))  )
-    ENDIF
-  ENDDO
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWC'
-  YUNIT    (JPROC) = 'g m-3'
-  YCOMMENT (JPROC) = 'cloud liquid water content'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,2)*ZRHO(1,1,:)*1.E3
-  DEALLOCATE (ZRHO)
-ENDIF
-!ENDIF
-!
-IF (SIZE(TPFLYER%TKE)>0) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'Turbulent kinetic energy' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TKE(:)
+      ZLWC(JPT) = XUNDEF
+    END IF
+  END DO
+  call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', ZLWC(:) )
+  DEALLOCATE( ZLWC, ZRHO )
 END IF
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'H_FLUX'
-YUNIT    (JPROC) = 'W m-2'
-YCOMMENT (JPROC) = 'sensible flux' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%THW_FLUX(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LE_FLUX'
-YUNIT    (JPROC) = 'W m-2'
-YCOMMENT (JPROC) = 'latent flux' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%RCW_FLUX(:)
-!
-DO JSV=1,SIZE(TPFLYER%SVW_FLUX,2)
-  JPROC = JPROC + 1
-  WRITE ( YTITLE(JPROC), FMT = '( A7, I3.3 )' ) 'SV_FLUX', JSV
-  YUNIT    (JPROC) = 'SVUNIT m s-1'
-  YCOMMENT (JPROC) = 'scalar flux' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SVW_FLUX(:,JSV)
+IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) )
+!
+call Add_point( 'H_FLUX',  'sensible flux', 'W m-2', tpflyer%xthw_flux(:) )
+call Add_point( 'LE_FLUX', 'latent flux',   'W m-2', tpflyer%xrcw_flux(:) )
+!
+DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2)
+  WRITE ( YTITLE, FMT = '( A, I3.3 )' ) 'SV_FLUX', JSV
+  call Add_point( Trim( ytitle ), 'scalar flux', 'SVUNIT m s-1', tpflyer%xsvw_flux(:,jsv) )
 END DO
 IF (LDIAG_IN_RUN) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke_Diss'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'TKE dissipation rate' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TKE_DISS(:)
+  call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) )
 ENDIF
 !
-IF (SIZE(TPFLYER%SV,2)>=1) THEN
-  ! User scalar variables
-  DO JSV = 1,NSV_USER
-    JPROC = JPROC+1
-    WRITE (YTITLE(JPROC),FMT='(A2,I3.3)')   'Sv',JSV
-    YUNIT    (JPROC) = 'kg kg-1'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO
-  ! microphysical C2R2 scheme scalar variables
-  DO JSV = NSV_C2R2BEG,NSV_C2R2END
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-    YUNIT    (JPROC) = 'm-3'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO
-  ! microphysical C3R5 scheme additional scalar variables
-  DO JSV = NSV_C1R3BEG,NSV_C1R3END
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-    YUNIT    (JPROC) = 'm-3'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO
-! LIMA variables
-  DO JSV=NSV_LIMA_BEG,NSV_LIMA_END
-    JPROC = JPROC+1
-    YUNIT    (JPROC) = 'kg-1'
-    YCOMMENT (JPROC) = ' '
-    IF (JSV==NSV_LIMA_NC) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(1))//'T' 
-    IF (JSV==NSV_LIMA_NR) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(2))//'T' 
-    IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-        YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
-    ENDIF
-    IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-        YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
-    ENDIF
-    IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-      YTITLE(JPROC)=TRIM(CAERO_MASS(1))//'T'
-      YUNIT    (JPROC) = 'kg kg-1'
-    ENDIF
-    IF (JSV==NSV_LIMA_NI) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(1))//'T' 
-    IF (JSV==NSV_LIMA_NS) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(2))//'T' 
-    IF (JSV==NSV_LIMA_NG) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(3))//'T' 
-    IF (JSV==NSV_LIMA_NH) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(4))//'T' 
-    IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-        YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T'
-    ENDIF
-    IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
-        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-        YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T'
-    ENDIF
-    IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-        WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
-        YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T'
-    ENDIF
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(8))//'T'
-    IF (JSV .EQ. NSV_LIMA_SPRO)     YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(5))//'T'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO 
-  ! electrical scalar variables
-  DO JSV = NSV_ELECBEG,NSV_ELECEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-    YUNIT    (JPROC) = 'C'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO
-  ! chemical scalar variables
-  DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9
-  END DO
-  ! LiNOX passive tracer
-  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-    JPROC = JPROC+1
-    WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx'
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9
-  END DO
-  ! aerosol scalar variables
-  DO JSV = NSV_AERBEG,NSV_AEREND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9
+IF (SIZE(TPFLYER%XSV,2)>=1) THEN
+  ! Scalar variables
+  DO JSV = 1, NSV
+    IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsv(:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb
+    ELSE
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsv(:,jsv) )
+    END IF
   END DO
-  IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
-
-    ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER))
-    ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates)))
-    ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),JPMODE))
-    ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),JPMODE))
-    ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),JPMODE))
-    ALLOCATE (ZPTOTA(1,1,size(tpflyer%tpdates),NSP+NCARB+NSOA,JPMODE))
-    ZSV(1,1,:,1:NSV_AER) = TPFLYER%SV(:,NSV_AERBEG:NSV_AEREND)
-    IF (SIZE(TPFLYER%R,2) >0) THEN
+
+  IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
+
+    ALLOCATE (ZSV(1,1,ISTORE,NSV_AER))
+    ALLOCATE (ZRHO(1,1,ISTORE))
+    ALLOCATE (ZN0(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZRG(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZSIG(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE))
+    ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(:,NSV_AERBEG:NSV_AEREND)
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%R,2)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
+      DO JRR=1,IRR
+        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
-      ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
-                                  / ( 1. + ZRHO(1,1,:)                ) 
+      ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
+                                  / ( 1. + ZRHO(1,1,:)                )
     ELSE
-      ZRHO(1,1,:) = TPFLYER%TH(:)
+      ZRHO(1,1,:) = TPFLYER%XTH(:)
     ENDIF
-    ZRHO(1,1,:) =  TPFLYER%P(:) / &
-                  (XRD *ZRHO(1,1,:) *((TPFLYER%P(:)/XP00)**(XRD/XCPD))  )
+    ZRHO(1,1,:) =  TPFLYER%XP(:) / &
+                  (XRD *ZRHO(1,1,:) *((TPFLYER%XP(:)/XP00)**(XRD/XCPD))  )
     ZSIG = 0.
     ZRG = 0.
     ZN0 = 0.
     ZPTOTA = 0.
-    DO JPT=1,size(tpflyer%tpdates) ! prevent division by zero if ZSV = 0.
+    DO JPT=1,ISTORE ! prevent division by zero if ZSV = 0.
       IF (ALL(ZSV(1,1,JPT,:)/=0.)) THEN
         CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA)
       ENDIF
     ENDDO
     DO JSV=1,JPMODE
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERRGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'RG (nb) AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) )
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERSIGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'SIGMA AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) )
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERN0A',JSV
+      WRITE(YCOMMENT,'(A,I1)')'N0 AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) )
       ! mass concentration in microg/m3
       ! sulfate
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MSO4',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SO4 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SO4,JSV)
+      WRITE(YTITLE,'(A,I1)')'MSO4',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SO4,JSV) )
       ! nitrate
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MNO3',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NO3 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NO3,JSV)
+      WRITE(YTITLE,'(A,I1)')'MNO3',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NO3,JSV) )
       ! amoniac
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MNH3',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NH3 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NH3,JSV)
+      WRITE(YTITLE,'(A,I1)')'MNH3',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NH3,JSV) )
       ! water
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MH2O',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS H2O AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_H2O,JSV)
+      WRITE(YTITLE,'(A,I1)')'MH2O',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_H2O,JSV) )
       IF (NSOA .EQ. 10) THEN
         ! SOA1
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA1',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA1 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA1,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA1',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA1,JSV) )
         ! SOA2
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA2',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA2 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA2,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA2',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA2,JSV) )
         ! SOA3
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA3',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA3 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA3,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA3',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA3,JSV) )
         ! SOA4
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA4',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA4 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA4,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA4',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA4,JSV) )
         ! SOA5
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA5',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA5 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA5,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA5',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA5,JSV) )
         ! SOA6
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA6',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA6 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA6,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA6',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA6,JSV) )
         ! SOA7
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA7',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA7 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA7,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA7',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA7,JSV) )
         ! SOA8
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA8',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA8 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA8,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA8',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA8,JSV) )
         ! SOA9
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA9',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA9 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA9,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA9',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA9,JSV) )
         ! SOA10
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA10',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA10 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA10,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA10',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA10,JSV) )
       ENDIF
       ! OC
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MOC',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS OC AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_OC,JSV)
+      WRITE(YTITLE,'(A,I1)')'MOC',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_OC,JSV) )
       ! BC
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MBC',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS BC AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_BC,JSV)
+      WRITE(YTITLE,'(A,I1)')'MBC',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_BC,JSV) )
       ! dust
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MDUST',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS DUST AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_DST,JSV)      
+      WRITE(YTITLE,'(A,I1)')'MDUST',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_DST,JSV) )
     ENDDO
-    DEALLOCATE (ZSV,ZRHO) 
-    DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) 
+    DEALLOCATE (ZSV,ZRHO)
+    DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA)
   END IF
-! dust scalar variables
-  DO JSV = NSV_DSTBEG,NSV_DSTEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9
-  END DO
-  IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_DST))
-    ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates)))
-    ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),NMODE_DST))
-    ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),NMODE_DST))
-    ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),NMODE_DST))
-    ZSV(1,1,:,1:NSV_DST) = TPFLYER%SV(:,NSV_DSTBEG:NSV_DSTEND)
-    IF (SIZE(TPFLYER%R,2) >0) THEN
+
+  IF ((LDUST).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
+    ALLOCATE (ZSV(1,1,ISTORE,NSV_DST))
+    ALLOCATE (ZRHO(1,1,ISTORE))
+    ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST))
+    ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST))
+    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST))
+    ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(:,NSV_DSTBEG:NSV_DSTEND)
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%R,2)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
+      DO JRR=1,IRR
+        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
-      ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
-                                          / ( 1. + ZRHO(1,1,:)                ) 
+      ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
+                                          / ( 1. + ZRHO(1,1,:)                )
     ELSE
-      ZRHO(1,1,:) = TPFLYER%TH(:)
+      ZRHO(1,1,:) = TPFLYER%XTH(:)
     ENDIF
-    ZRHO(1,1,:) =  TPFLYER%P(:) / &
-                  (XRD *ZRHO(1,1,:) *((TPFLYER%P(:)/XP00)**(XRD/XCPD)) )
+    ZRHO(1,1,:) =  TPFLYER%XP(:) / &
+                  (XRD *ZRHO(1,1,:) *((TPFLYER%XP(:)/XP00)**(XRD/XCPD)) )
     CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,NMODE_DST
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTRGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'RG (nb) DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) )
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTSIGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'SIGMA DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) )
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTN0A',JSV
+      WRITE(YCOMMENT,'(A,I1)')'N0 DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) )
     ENDDO
-    DEALLOCATE (ZSV,ZRHO) 
-    DEALLOCATE (ZN0,ZRG,ZSIG) 
+    DEALLOCATE (ZSV,ZRHO)
+    DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  ! sea salt scalar variables
-  DO JSV = NSV_SLTBEG,NSV_SLTEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9
-  END DO
 ENDIF
 !
-IF (SIZE(TPFLYER%TSRAD)>0) THEN
+IF (SIZE(TPFLYER%XTSRAD)>0) THEN
   JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tsrad'
-  YUNIT    (JPROC) = 'K'
-  YCOMMENT (JPROC) = 'Radiative Surface Temperature'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TSRAD(:)
+  CTITLE   (JPROC) = 'Tsrad'
+  CUNIT    (JPROC) = 'K'
+  CCOMMENT (JPROC) = 'Radiative Surface Temperature'
+  XWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:)
 END IF
 !
-DO IK=1, IKU
-!
-  JPROCZ=0
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'Rt'
-  YUNITZ   (JPROCZ) = 'kg kg-1'
-  YCOMMENTZ(JPROCZ) = '1D Total hydrometeor mixing ratio'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RTZ(:,IK)
-!
-  DO JRR=1,SIZE(TPFLYER%RZ,3)
-    JPROCZ = JPROCZ+1
-    YUNITZ    (JPROCZ) = 'kg kg-1'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RZ(:,IK,JRR)
-    IF (JRR==1) THEN
-      YTITLEZ   (JPROCZ) = 'Rv'
-      YCOMMENTZ (JPROCZ) = '1D water vapor mixing ratio' 
-    ELSE IF (JRR==2) THEN
-      YTITLEZ   (JPROCZ) = 'Rc'
-      YCOMMENTZ (JPROCZ) = '1D liquid cloud water mixing ratio' 
-    ELSE IF (JRR==3) THEN
-      YTITLEZ   (JPROCZ) = 'Rr'
-      YCOMMENTZ (JPROCZ) = '1D Rain water mixing ratio' 
-    ELSE IF (JRR==4) THEN
-      YTITLEZ   (JPROCZ) = 'Ri'
-      YCOMMENTZ (JPROCZ) = '1D Ice cloud water mixing ratio' 
-    ELSE IF (JRR==5) THEN
-      YTITLEZ   (JPROCZ) = 'Rs'
-      YCOMMENTZ (JPROCZ) = '1D Snow mixing ratio' 
-    ELSE IF (JRR==6) THEN
-      YTITLEZ   (JPROCZ) = 'Rg'
-      YCOMMENTZ (JPROCZ) = '1D Graupel mixing ratio' 
-    ELSE IF (JRR==7) THEN
-      YTITLEZ   (JPROCZ) = 'Rh'
-      YCOMMENTZ (JPROCZ) = '1D Hail mixing ratio' 
-    END IF
-  END DO
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'FF'
-  YUNITZ   (JPROCZ) = 'm s-1'
-  YCOMMENTZ(JPROCZ) = 'Horizontal wind'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%FFZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'IWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Ice water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%IWCZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'LWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Liquid water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%LWCZ(:,IK)
-!
-  IF (NSV_LIMA_BEG/=NSV_LIMA_END) THEN
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CIT'
-    YUNITZ   (JPROCZ) = 'm-3'
-    YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK)
-  ELSE
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CCLOUDT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'liquid cloud concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CCZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CRAINT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Rain concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CICET'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK)
- ENDIF
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RARE'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar reflectivity'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRARE(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RAREatt'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar attenuated reflectivity' 
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRARE_ATT(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'W'
-  YUNITZ   (JPROCZ) = 'm s-1'
-  YCOMMENTZ(JPROCZ) = '1D vertical velocity' 
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%WZ(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'Z'
-  YUNITZ   (JPROCZ) = 'm'
-  YCOMMENTZ(JPROCZ) = '1D altitude above sea'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%ZZ(:,IK)
-END DO
-!----------------------------------------------------------------------------
-!
-ALLOCATE (ZW6(1,1,1,size(tpflyer%tpdates),1,JPROC))
-ZW6  = ZWORK6(:,:,:,:,:,:JPROC)
-DEALLOCATE(ZWORK6)
-ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ))
-ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ)
-DEALLOCATE(ZWORKZ6)
-!
 allocate( tzfields( jproc ) )
 
-tzfields(:)%cmnhname  = ytitle(1 : jproc)
+tzfields(:)%cmnhname  = ctitle(1 : jproc)
 tzfields(:)%cstdname  = ''
-tzfields(:)%clongname = ytitle(1 : jproc)
-tzfields(:)%cunits    = yunit(1 : jproc)
-tzfields(:)%ccomment  = ycomment(1 : jproc)
+tzfields(:)%clongname = ctitle(1 : jproc)
+tzfields(:)%cunits    = cunit(1 : jproc)
+tzfields(:)%ccomment  = ccomment(1 : jproc)
 tzfields(:)%ngrid     = 0
 tzfields(:)%ntype     = TYPEREAL
 tzfields(:)%ndims     = 2
@@ -868,12 +558,12 @@ call Aircraft_balloon_longtype_get( tpflyer, tzbudiachro%clevels(NLVL_SUBCATEGOR
 tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Trim( tzbudiachro%clevels(NLVL_SUBCATEGORY) )
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
-tzbudiachro%clevels  (NLVL_GROUP)       = Trim( ygroup )
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%title )
+tzbudiachro%clevels  (NLVL_GROUP)       = Trim( tpflyer%ctitle )
+tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
 tzbudiachro%clevels  (NLVL_SHAPE)       = 'Point'
-tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of flyer ' // Trim( tpflyer%title )
+tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_TIMEAVG)     = .false.
 tzbudiachro%clevels  (NLVL_TIMEAVG)     = 'Not_time_averaged'
@@ -904,18 +594,61 @@ tzbudiachro%lnorm      = .false.
 ! tzbudiachro%nkl        = NOT SET (default values)
 ! tzbudiachro%nkh        = NOT SET (default values)
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zw6, &
-                    tpflyer = tpflyer                                       )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), &
+                    tpflyer = tpflyer                                                                        )
 
-deallocate( tzfields )
+Deallocate( tzfields )
+Deallocate( xwork6 )
+Deallocate( ccomment )
+Deallocate( ctitle )
+Deallocate( cunit )
+
+!----------------------------------------------------------------------------
+!Treat vertical profiles
+
+ALLOCATE (XWORK6(1,1,IKU,ISTORE,1,IPROCZ))
+ALLOCATE (CCOMMENT(IPROCZ))
+ALLOCATE (CTITLE (IPROCZ))
+ALLOCATE (CUNIT  (IPROCZ))
+
+JPROC = 0
+
+call Add_profile( 'Rt', '1D Total hydrometeor mixing ratio', 'kg kg-1', tpflyer%xrtz(:,:) )
 
-allocate( tzfields( jprocz ) )
+if ( irr >= 1 ) call Add_profile( 'Rv', '1D water vapor mixing ratio',        'kg kg-1', tpflyer%xrz(:,:,1) )
+if ( irr >= 2 ) call Add_profile( 'Rc', '1D liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,2) )
+if ( irr >= 3 ) call Add_profile( 'Rr', '1D Rain water mixing ratio',         'kg kg-1', tpflyer%xrz(:,:,3) )
+if ( irr >= 4 ) call Add_profile( 'Ri', '1D Ice cloud water mixing ratio',    'kg kg-1', tpflyer%xrz(:,:,4) )
+if ( irr >= 5 ) call Add_profile( 'Rs', '1D Snow mixing ratio',               'kg kg-1', tpflyer%xrz(:,:,5) )
+if ( irr >= 6 ) call Add_profile( 'Rg', '1D Graupel mixing ratio',            'kg kg-1', tpflyer%xrz(:,:,6) )
+if ( irr >= 7 ) call Add_profile( 'Rh', '1D Hail mixing ratio',               'kg kg-1', tpflyer%xrz(:,:,7) )
 
-tzfields(:)%cmnhname  = ytitlez(1 : jprocz)
+call Add_profile( 'FF', 'Horizontal wind', 'm s-1', tpflyer%xffz(:,:) )
+
+call Add_profile( 'IWC', 'Ice water content',    'kg m-3', tpflyer%xiwcz(:,:) )
+call Add_profile( 'LWC', 'Liquid water content', 'kg m-3', tpflyer%xlwcz(:,:) )
+
+IF ( CCLOUD == 'LIMA' ) THEN
+  call Add_profile( 'CCLOUDT', 'liquid cloud concentration', 'kg-1', tpflyer%xccz(:,:) )
+  call Add_profile( 'CRAINT',  'Rain concentration',         'kg-1', tpflyer%xcrz(:,:) )
+  call Add_profile( 'CICET',   'Ice concentration',          'kg-1', tpflyer%xciz(:,:) )
+ELSE IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN
+  call Add_profile( 'CIT', 'Ice concentration', 'm-3', tpflyer%xciz(:,:) )
+END IF
+
+call Add_profile( 'RARE',    '1D cloud radar reflectivity',            'dBZ', tpflyer%xcrare(:,:) )
+call Add_profile( 'RAREatt', '1D cloud radar attenuated reflectivity', 'dBZ', tpflyer%xcrare_att(:,:) )
+
+call Add_profile( 'W', '1D vertical velocity', 'm s-1', tpflyer%xwz(:,:) )
+call Add_profile( 'Z', '1D altitude above sea', 'm', tpflyer%xzz(:,:) )
+
+allocate( tzfields( jproc ) )
+
+tzfields(:)%cmnhname  = ctitle(1 : jproc)
 tzfields(:)%cstdname  = ''
-tzfields(:)%clongname = ytitlez(1 : jprocz)
-tzfields(:)%cunits    = yunitz(1 : jprocz)
-tzfields(:)%ccomment  = ycommentz(1 : jprocz)
+tzfields(:)%clongname = ctitle(1 : jproc)
+tzfields(:)%cunits    = cunit(1 : jproc)
+tzfields(:)%ccomment  = ccomment(1 : jproc)
 tzfields(:)%ngrid     = 0
 tzfields(:)%ntype     = TYPEREAL
 tzfields(:)%ndims     = 3
@@ -935,12 +668,12 @@ call Aircraft_balloon_longtype_get( tpflyer, tzbudiachro%clevels(NLVL_SUBCATEGOR
 tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Trim( tzbudiachro%clevels(NLVL_SUBCATEGORY) )
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
-tzbudiachro%clevels  (NLVL_GROUP)       = Trim( ygroupz )
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%title )
+tzbudiachro%clevels  (NLVL_GROUP)       = Trim( tpflyer%ctitle )
+tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
 tzbudiachro%clevels  (NLVL_SHAPE)       = 'Vertical_profile'
-tzbudiachro%ccomments(NLVL_SHAPE)       = 'Vertical profiles at position of flyer ' // Trim( tpflyer%title )
+tzbudiachro%ccomments(NLVL_SHAPE)       = 'Vertical profiles at position of flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_TIMEAVG)     = .false.
 tzbudiachro%clevels  (NLVL_TIMEAVG)     = 'Not_time_averaged'
@@ -976,24 +709,68 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = iku
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zwz6, &
-                    tpflyer = tpflyer                                        )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), &
+                    tpflyer = tpflyer                                                                        )
 
 deallocate( tzfields )
 
-DEALLOCATE (ZW6)
-DEALLOCATE (YCOMMENT)
-DEALLOCATE (YTITLE  )
-DEALLOCATE (YUNIT   )
-DEALLOCATE (IGRID   )
-DEALLOCATE (ZWZ6)
-DEALLOCATE (YCOMMENTZ)
-DEALLOCATE (YTITLEZ )
-DEALLOCATE (YUNITZ  )
-DEALLOCATE (IGRIDZ  )
+DEALLOCATE (XWORK6)
+DEALLOCATE (CCOMMENT)
+DEALLOCATE (CTITLE  )
+DEALLOCATE (CUNIT   )
+
+contains
+
+
+subroutine Add_profile( htitle, hcomment, hunits, pfield )
+
+character(len=*),     intent(in) :: htitle
+character(len=*),     intent(in) :: hcomment
+character(len=*),     intent(in) :: hunits
+real, dimension(:,:), intent(in) :: pfield
+
+integer :: jk
+
+jproc = jproc + 1
+
+if ( jproc > iprocz ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more processes than expected' )
+
+ctitle(jproc)   = Trim( htitle )
+ccomment(jproc) = Trim( hcomment )
+cunit(jproc)    = Trim( hunits )
+
+do jk = 1, iku
+  xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk)
+end do
+
+end subroutine Add_profile
+
+
+subroutine Add_point( htitle, hcomment, hunits, pfield )
+
+character(len=*),   intent(in) :: htitle
+character(len=*),   intent(in) :: hcomment
+character(len=*),   intent(in) :: hunits
+real, dimension(:), intent(in) :: pfield
+
+integer :: jk
+
+jproc = jproc + 1
+
+if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' )
+
+ctitle(jproc)   = Trim( htitle)
+ccomment(jproc) = Trim( hcomment )
+cunit(jproc)    = Trim( hunits )
+
+xwork6(1, 1, 1, :, 1, jproc) = pfield(:)
+
+end subroutine Add_point
+
 !----------------------------------------------------------------------------
 END SUBROUTINE FLYER_DIACHRO
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
-END SUBROUTINE WRITE_AIRCRAFT_BALLOON
+
+END MODULE MODE_WRITE_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index f0c790ddd868d44f382b961b742bc4f6528b545e..e20c046d59996c34ef2f64fff9a88a71deaa2a05 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -1,28 +1,20 @@
-!MNH_LIC Copyright 2001-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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.
 !-----------------------------------------------------------------
-!     ###########################
-      MODULE MODI_WRITE_BALLOON_n
-!     ###########################
-!
-INTERFACE
-!
-SUBROUTINE WRITE_BALLOON_n(TPFILE)
-USE MODD_IO, ONLY: TFILEDATA
+!##########################
+MODULE MODE_WRITE_BALLOON_n
+!##########################
 !
 IMPLICIT NONE
-!
-TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
-!
-END SUBROUTINE WRITE_BALLOON_n
-!
-END INTERFACE
-!
-END MODULE MODI_WRITE_BALLOON_n
-!
-!
+
+PRIVATE
+
+PUBLIC :: WRITE_BALLOON_n
+
+CONTAINS
+
 !     ###################################
       SUBROUTINE WRITE_BALLOON_n(TPFILE)
 !     ###################################
@@ -52,23 +44,25 @@ END MODULE MODI_WRITE_BALLOON_n
 !!
 !!    AUTHOR
 !!    ------
-!!  	G.Jaubert   *Meteo France* 
+!!  	G.Jaubert   *Meteo France*
 !!
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    06/06/01 
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet    06/2022: reorganize flyers
+!  P. Wautelet 25/08/2022: write balloon positions in netCDF4 files inside HDF5 groups
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_AIRCRAFT_BALLOON
-USE MODD_GRID, ONLY: XLONORI, XLATORI
-USE MODD_IO,   ONLY: TFILEDATA
-USE MODD_LUNIT_n
+USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, NRANKCUR_BALLOON, TBALLOONS
+USE MODD_IO,               ONLY: GSMONOPROC, ISP, TFILEDATA
 !
-USE MODE_GRIDPROJ
+USE MODE_AIRCRAFT_BALLOON,     ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND
+USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER
+USE MODE_MODELN_HANDLER,       ONLY: GET_CURRENT_MODEL_INDEX
 !
 IMPLICIT NONE
 !
@@ -79,104 +73,272 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 !*       0.2   Declarations of local variables
 !
 !
-IF (TBALLOON1%FLY) CALL WRITE_LFI_BALLOON(TBALLOON1)
-IF (TBALLOON2%FLY) CALL WRITE_LFI_BALLOON(TBALLOON2)
-IF (TBALLOON3%FLY) CALL WRITE_LFI_BALLOON(TBALLOON3)
-IF (TBALLOON4%FLY) CALL WRITE_LFI_BALLOON(TBALLOON4)
-IF (TBALLOON5%FLY) CALL WRITE_LFI_BALLOON(TBALLOON5)
-IF (TBALLOON6%FLY) CALL WRITE_LFI_BALLOON(TBALLOON6)
-IF (TBALLOON7%FLY) CALL WRITE_LFI_BALLOON(TBALLOON7)
-IF (TBALLOON8%FLY) CALL WRITE_LFI_BALLOON(TBALLOON8)
-IF (TBALLOON9%FLY) CALL WRITE_LFI_BALLOON(TBALLOON9)
-!
-!
-CONTAINS
-!
+INTEGER :: IMI
+INTEGER :: JI
+LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC
+
+IMI = GET_CURRENT_MODEL_INDEX()
+
+! Save GSMONOPROC value
+OMONOPROC_SAVE = GSMONOPROC
+! Force GSMONOPROC to true to allow IO_Field_write on only 1 process! (not very clean hack)
+GSMONOPROC = .TRUE.
+
+DO JI = 1, NBALLOONS
+  ! The balloon data is only available on the process where it is physically located => transfer it if necessary
+
+  ! Send data from owner to writer if necessary
+  IF ( ISP == NRANKCUR_BALLOON(JI) .AND. NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN
+    CALL FLYER_SEND( TBALLOONS(JI)%TBALLOON, TPFILE%NMASTER_RANK )
+  END IF
+
+  IF ( ISP == TPFILE%NMASTER_RANK ) THEN
+    ! Receive data from owner if not available on the writer process
+    IF ( NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN
+      ALLOCATE( TBALLOONS(JI)%TBALLOON )
+      CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) )
+    END IF
+
+    ! Write data (only if flyer is on the current model)
+    ! It will also be written in the ancestry model files
+    IF ( TBALLOONS(JI)%TBALLOON%NMODEL == IMI ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON )
+
+    ! Free ballon data if it was not stored on this process
+    IF ( NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN
+      CALL DEALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
+      DEALLOCATE( TBALLOONS(JI)%TBALLOON )
+    END IF
+  END IF
+END DO
+
+! Restore correct value of GSMONOPROC
+GSMONOPROC = OMONOPROC_SAVE
+
+END SUBROUTINE WRITE_BALLOON_n
 !-------------------------------------------------------------------------------
+
 !-------------------------------------------------------------------------------
-SUBROUTINE WRITE_LFI_BALLOON(TPFLYER)
+RECURSIVE SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER )
 !
-use modd_field,          only: tfielddata, TYPEREAL
+#ifdef MNH_IOCDF4
+use NETCDF,              only: NF90_DEF_GRP, NF90_GLOBAL, NF90_INQ_NCID, NF90_NOERR, NF90_PUT_ATT
+#endif
+
+USE MODD_AIRCRAFT_BALLOON
+use modd_field,          only: tfieldmetadata, TYPEREAL
+USE MODD_GRID,           ONLY: XLONORI, XLATORI
+use modd_io,             only: isp, tfiledata
+#ifdef MNH_IOCDF4
+use modd_precision,      only: CDFINT
+#endif
+USE MODD_TIME_n,         ONLY: TDTCUR
+
+USE MODE_DATETIME
+USE MODE_GRIDPROJ,       ONLY: SM_LATLON
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-!
-TYPE(FLYER),        INTENT(IN)       :: TPFLYER
-!
-!
-!*       0.2   Declarations of local variables
-!
-REAL               :: ZLAT          ! latitude of the balloon
-REAL               :: ZLON          ! longitude of the balloon
-TYPE(TFIELDDATA)   :: TZFIELD
-!
-!
-CALL SM_LATLON(XLATORI,XLONORI,  &
-     TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON)
-!
-!
-TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = 'degree'
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .TRUE.
-CALL IO_Field_write(TPFILE,TZFIELD,ZLAT)
-!
-TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = 'degree'
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .TRUE.
-CALL IO_Field_write(TPFILE,TZFIELD,ZLON)
-!
-TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = 'm'
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .TRUE.
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR)
-!
-TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = 'm s-1'
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .TRUE.
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT)
-!
-TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-TZFIELD%CUNITS     = 'kg m-3'
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .TRUE.
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO)
-!
-!
-!
-END SUBROUTINE WRITE_LFI_BALLOON
+#ifdef MNH_IOCDF4
+use mode_io_tools_nc4,   only: IO_Err_handle_nc4
+#endif
+use mode_msg
+
+TYPE(TFILEDATA),    INTENT(IN) :: TPFILE ! File characteristics
+TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER
+
+#ifdef MNH_IOCDF4
+integer(kind=CDFINT) :: igroupid
+integer(kind=CDFINT) :: istatus
+#endif
+REAL                 :: ZLAT          ! latitude of the balloon
+REAL                 :: ZLON          ! longitude of the balloon
+type(tfiledata)      :: tzfile
+TYPE(TFIELDMETADATA) :: TZFIELD
+
+! Do not write balloon position if not yet in fly or crashed
+IF ( .NOT.TPFLYER%LFLY .OR. TPFLYER%LCRASH ) RETURN
+
+! Check if current model time is the same as the time corresponding to the balloon position
+IF ( ABS( TDTCUR - TPFLYER%TPOS_CUR ) > 1.e-6 ) &
+  call Print_msg( NVERB_WARNING, 'IO', 'WRITE_BALLOON_POSITION', 'position time does not corresponds to current time for balloon ' &
+  // Trim( tpflyer%ctitle ) )
+
+! Recursive call up to grand parent file
+! This way balloon position is also available on all ancestry model files (useful for restart with different number of models)
+! This is done by a recursive call instead of a more standard loop on all the models to ensure that the balloon position
+! corresponds to the correct instant.
+IF ( ASSOCIATED( TPFILE%TDADFILE ) ) THEN
+  IF ( TRIM( TPFILE%TDADFILE%CNAME ) /= TRIM( TPFILE%CNAME ) ) CALL WRITE_BALLOON_POSITION( TPFILE%TDADFILE, TPFLYER )
+END IF
+
+CALL SM_LATLON( XLATORI, XLONORI, TPFLYER%XX_CUR, TPFLYER%XY_CUR, ZLAT, ZLON )
+
+#ifdef MNH_IOLFI
+IF ( TPFILE%CFORMAT == 'LFI' .OR. TPFILE%CFORMAT == 'LFICDF4' ) THEN
+  ! Write current balloon position for LFI files (netCDF uses an other structure)
+  TZFILE = TPFILE
+  TZFILE%CFORMAT = 'LFI'
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LAT', &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LAT', &
+    CUNITS     = 'degree',                    &
+    CDIR       = '--',                        &
+    CCOMMENT   = '',                          &
+    NGRID      = 0,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 0,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TZFILE,TZFIELD,ZLAT)
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LON', &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LON', &
+    CUNITS     = 'degree',                    &
+    CDIR       = '--',                        &
+    CCOMMENT   = '',                          &
+    NGRID      = 0,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 0,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TZFILE,TZFIELD,ZLON)
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = TRIM(TPFLYER%CTITLE)//'ALT', &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = TRIM(TPFLYER%CTITLE)//'ALT', &
+    CUNITS     = 'm',                         &
+    CDIR       = '--',                        &
+    CCOMMENT   = '',                          &
+    NGRID      = 0,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 0,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XZ_CUR)
+
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM(TPFLYER%CTITLE)//'WASCENT', &
+    CSTDNAME   = '',                              &
+    CLONGNAME  = TRIM(TPFLYER%CTITLE)//'WASCENT', &
+    CUNITS     = 'm s-1',                         &
+    CDIR       = '--',                            &
+    CCOMMENT   = '',                              &
+    NGRID      = 0,                               &
+    NTYPE      = TYPEREAL,                        &
+    NDIMS      = 0,                               &
+    LTIMEDEP   = .TRUE.                           )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XWASCENT)
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = TRIM(TPFLYER%CTITLE)//'RHO', &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = TRIM(TPFLYER%CTITLE)//'RHO', &
+    CUNITS     = 'kg m-3',                    &
+    CDIR       = '--',                        &
+    CCOMMENT   = '',                          &
+    NGRID      = 0,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 0,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XRHO)
+END IF
+#endif
+
+#ifdef MNH_IOCDF4
+IF ( TPFILE%CFORMAT == 'NETCDF4' .OR. TPFILE%CFORMAT == 'LFICDF4' ) THEN
+  ! Write current balloon position for netCDF files
+  ! Each balloon position is written inside an HDF5 group
+  TZFILE = TPFILE
+  TZFILE%CFORMAT = 'NETCDF4'
+
+  if ( isp == tzfile%nmaster_rank ) then
+    istatus = NF90_INQ_NCID( tzfile%nncid, Trim( tpflyer%ctitle ), igroupid )
+    if ( istatus == NF90_NOERR ) then
+      ! The group already exists (should not)
+      call Print_msg( NVERB_WARNING, 'IO', 'WRITE_BALLOON_POSITION', 'group '// Trim( tpflyer%ctitle ) // ' already exists' )
+    else
+      ! Create the group
+      istatus = NF90_DEF_GRP( tzfile%nncid, Trim( tpflyer%ctitle ), igroupid )
+      if ( istatus /= NF90_NOERR ) &
+        call IO_Err_handle_nc4( istatus, 'WRITE_BALLOON_POSITION', 'NF90_DEF_GRP', 'for ' // Trim( tpflyer%ctitle ) )
+
+      ! Add a comment attribute
+      istatus = NF90_PUT_ATT( igroupid, NF90_GLOBAL, 'comment', 'Current position of balloon '// Trim( tpflyer%ctitle ) )
+      if (istatus /= NF90_NOERR ) &
+        call IO_Err_handle_nc4( istatus, 'WRITE_BALLOON_POSITION', 'NF90_PUT_ATT', 'comment for '// Trim( tpflyer%ctitle ) )
+    end if
+  end if
+
+  tzfile%nncid = igroupid
+
+  TZFIELD = TFIELDMETADATA(  &
+    CMNHNAME   = 'LAT',      &
+    CSTDNAME   = '',         &
+    CLONGNAME  = 'LAT',      &
+    CUNITS     = 'degree',   &
+    CDIR       = '--',       &
+    CCOMMENT   = 'latitude', &
+    NGRID      = 0,          &
+    NTYPE      = TYPEREAL,   &
+    NDIMS      = 0,          &
+    LTIMEDEP   = .TRUE.      )
+  CALL IO_Field_write(TZFILE,TZFIELD,ZLAT)
+
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'LON',       &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'LON',       &
+    CUNITS     = 'degree',    &
+    CDIR       = '--',        &
+    CCOMMENT   = 'longitude', &
+    NGRID      = 0,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 0,           &
+    LTIMEDEP   = .TRUE.       )
+  CALL IO_Field_write(TZFILE,TZFIELD,ZLON)
+
+  TZFIELD = TFIELDMETADATA(  &
+    CMNHNAME   = 'ALT',      &
+    CSTDNAME   = '',         &
+    CLONGNAME  = 'ALT',      &
+    CUNITS     = 'm',        &
+    CDIR       = '--',       &
+    CCOMMENT   = 'altitude', &
+    NGRID      = 0,          &
+    NTYPE      = TYPEREAL,   &
+    NDIMS      = 0,          &
+    LTIMEDEP   = .TRUE.      )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XZ_CUR)
+
+  TZFIELD = TFIELDMETADATA(               &
+    CMNHNAME   = 'WASCENT',               &
+    CSTDNAME   = '',                      &
+    CLONGNAME  = 'WASCENT',               &
+    CUNITS     = 'm s-1',                 &
+    CDIR       = '--',                    &
+    CCOMMENT   = 'ascent vertical speed', &
+    NGRID      = 0,                       &
+    NTYPE      = TYPEREAL,                &
+    NDIMS      = 0,                       &
+    LTIMEDEP   = .TRUE.                   )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XWASCENT)
+
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'RHO',         &
+    CSTDNAME   = '',            &
+    CLONGNAME  = 'RHO',         &
+    CUNITS     = 'kg m-3',      &
+    CDIR       = '--',          &
+    CCOMMENT   = 'air density', &
+    NGRID      = 0,             &
+    NTYPE      = TYPEREAL,      &
+    NDIMS      = 0,             &
+    LTIMEDEP   = .TRUE.         )
+  CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XRHO)
+END IF
+#endif
+
+END SUBROUTINE WRITE_BALLOON_POSITION
 !-------------------------------------------------------------------------------
-!
-!
-END SUBROUTINE WRITE_BALLOON_n
+
+END MODULE MODE_WRITE_BALLOON_n
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 767541ad935a58606ffd9de97aaddc47c1fe836c..50dcb283b6e28bb2da6446f6ba5267c6aa138948 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -105,10 +105,10 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
                                  tbudgets, tburhodj
   use modd_field,          only: NMNHDIM_ONE, NMNHDIM_NI, NMNHDIM_NJ,                              &
                                  NMNHDIM_BUDGET_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_UNUSED, &
-                                 tfielddata, TYPEINT, TYPEREAL
+                                 tfieldmetadata, TYPEINT, TYPEREAL
   use modd_io,             only: tfiledata
   use modd_lunit_n,        only: tluout
-  use modd_parameters,     only: NMNHNAMELGTMAX
+  use modd_parameters,     only: NCOMMENTLGTMAX, NMNHNAMELGTMAX
   use modd_type_date,      only: date_time
 
   use mode_datetime,       only: datetime_distance
@@ -126,6 +126,8 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
   real,            intent(in) :: ptstep       ! time step
   integer,         intent(in) :: ksv          ! number of scalar variables
 
+  character(len=NCOMMENTLGTMAX)                        :: ycomment
+  character(len=NMNHNAMELGTMAX)                        :: ymnhname
   character(len=NMNHNAMELGTMAX)                        :: yrecfm        ! name of the article to be written
   integer                                              :: jt, jmask
   integer                                              :: jsv           ! loop index over the ksv svx
@@ -133,8 +135,8 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
   real,            dimension(:),           allocatable :: zworktemp
   real,            dimension(:,:,:,:,:,:), allocatable :: zrhodjn, zworkmask
   type(date_time), dimension(:),           allocatable :: tzdates
-  type(tfielddata) :: tzfield
-  type(tfiledata)  :: tzfile
+  type(tfieldmetadata) :: tzfield
+  type(tfiledata)      :: tzfile
   !
   !-------------------------------------------------------------------------------
   !
@@ -145,28 +147,30 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
   !* Write TSTEP and BULEN
   !  ---------------------
   !
-  TZFIELD%CMNHNAME   = 'TSTEP'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'TSTEP'
-  TZFIELD%CUNITS     = 's'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Time step'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'TSTEP',     &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'TSTEP',     &
+    CUNITS     = 's',         &
+    CDIR       = '--',        &
+    CCOMMENT   = 'Time step', &
+    NGRID      = 0,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 0,           &
+    LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPDIAFILE,TZFIELD,PTSTEP)
   !
-  TZFIELD%CMNHNAME   = 'BULEN'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'BULEN'
-  TZFIELD%CUNITS     = 's'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Time step'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'BULEN',     &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'BULEN',     &
+    CUNITS     = 's',         &
+    CDIR       = '--',        &
+    CCOMMENT   = 'Length of the budget temporal average', &
+    NGRID      = 0,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 0,           &
+    LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPDIAFILE,TZFIELD,XBULEN)
   !
   ! Initialize NBUTSHIFT
@@ -245,22 +249,20 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
         tzfile = tpdiafile
         tzfile%cformat = 'LFI'
 
-        Write( tzfield%cmnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift
-        tzfield%cstdname   = ''
-        tzfield%clongname  = Trim( tzfield%cmnhname )
-        tzfield%cunits     = ''
-        tzfield%cdir       = 'XY'
-        Write( tzfield%ccomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift
-        tzfield%ngrid      = 1
-        tzfield%ntype      = TYPEREAL
-        tzfield%ndims      = 6
-        tzfield%ltimedep   = .FALSE.
-        tzfield%ndimlist(1) = NMNHDIM_NI
-        tzfield%ndimlist(2) = NMNHDIM_NJ
-        tzfield%ndimlist(3) = NMNHDIM_ONE
-        tzfield%ndimlist(4) = NMNHDIM_BUDGET_TIME
-        tzfield%ndimlist(5) = NMNHDIM_BUDGET_MASK_NBUMASK
-        tzfield%ndimlist(6) = NMNHDIM_ONE
+        Write( ymnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift
+        Write( ycomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift
+        tzfield = tfieldmetadata(         &
+          cmnhname   = Trim( ymnhname ),  &
+          cstdname   = '',                &
+          clongname  = Trim( ymnhname ),  &
+          cunits     = '',                &
+          cdir       = 'XY',              &
+          ccomment   = Trim ( ycomment ), &
+          ngrid      = 1,                 &
+          ntype      = TYPEREAL,          &
+          ndims      = 6,                 &
+          ndimlist = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_ONE, NMNHDIM_BUDGET_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_ONE ], &
+          ltimedep   = .FALSE.            )
         call IO_Field_write( tzfile, tzfield, zworkmask(:, :, :, :, :, :) )
 
         Write( yrecfm, fmt = "( 'MASK_', i4.4 )" ) nbutshift
@@ -274,21 +276,18 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
         tzfile = tpdiafile
         tzfile%cformat = 'NETCDF4'
 
-        tzfield%cmnhname   = CMASK_VARNAME
-        tzfield%cstdname   = ''
-        tzfield%clongname  = Trim( tzfield%cmnhname )
-        tzfield%cunits     = '1'
-        tzfield%cdir       = 'XY'
-        tzfield%ccomment   = 'Masks for budget areas'
-        tzfield%ngrid      = 1
-        tzfield%ntype      = TYPEINT
-        tzfield%ndims      = 4
-        tzfield%ltimedep   = .false. !The time dependance is in the NMNHDIM_BUDGET_TIME dimension
-        tzfield%ndimlist(1)  = NMNHDIM_NI
-        tzfield%ndimlist(2)  = NMNHDIM_NJ
-        tzfield%ndimlist(3)  = NMNHDIM_BUDGET_MASK_NBUMASK
-        tzfield%ndimlist(4)  = NMNHDIM_BUDGET_TIME
-        tzfield%ndimlist(5:) = NMNHDIM_UNUSED
+        tzfield = tfieldmetadata(                &
+          cmnhname   = CMASK_VARNAME,            &
+          cstdname   = '',                       &
+          clongname  = CMASK_VARNAME,            &
+          cunits     = '1',                      &
+          cdir       = 'XY',                     &
+          ccomment   = 'Masks for budget areas', &
+          ngrid      = 1,                        &
+          ntype      = TYPEINT,                  &
+          ndims      = 4,                        &
+          ndimlist = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_BUDGET_TIME ], &
+          ltimedep   = .false.                   ) !The time dependance is in the NMNHDIM_BUDGET_TIME dimension
 
         !Create the metadata of the field (has to be done only once)
         if ( nbutshift == 1 ) call IO_Field_create( tzfile, tzfield )
@@ -621,7 +620,6 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress,
                                     TYPEREAL
   use modd_io,                only: tfiledata
   use modd_lunit_n,           only: tluout
-  use modd_nsv,               only: csvnames
   use modd_parameters,        only: NBUNAMELGTMAX
   use modd_type_date,         only: date_time
 
diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index 9aa7454234875a84a7b8d5f5ea767feb10169698..7c1496b3c58c36e960332ecd520ae11b49d2fb0c 100644
--- a/src/MNH/write_desfmn.f90
+++ b/src/MNH/write_desfmn.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.
@@ -146,20 +146,32 @@ END MODULE MODI_WRITE_DESFM_n
 !!      Modification   V. Vionnet     07/2017  add blowing snow variables
 !!      Modification   F.Auguste      02/2021  add IBM
 !!                     E.Jezequel     02/2021  add stations read from CSV file
-!!      Modification   A. Costes      12/2021  add Blaze fire model
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 13/07/2022: add namelist for flyers and balloons
+!  P. Wautelet 19/01/2023: bugfix for ForeFire
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 USE MODD_CONF
-USE MODD_DYN_n,   ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE
-USE MODD_IO,      ONLY: TFILEDATA
-USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_DYN_n,      ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE
+USE MODD_FIRE,       ONLY: LBLAZE
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE,   ONLY: LFOREFIRE
+#endif
+USE MODD_IBM_LSF,    ONLY: LIBM_LSF
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_LUNIT_n,    ONLY: TLUOUT
 USE MODD_PARAMETERS
+USE MODD_PROFILER_n, ONLY: LPROFILER
+USE MODD_STATION_n,  ONLY: LSTATION
 !
 USE MODE_MSG
 !
+! USE MODN_AIRCRAFTS
 USE MODN_BACKUP
+! USE MODN_BALLOONS
 USE MODN_CONF
 USE MODN_DYN
 USE MODN_NESTING
@@ -200,16 +212,15 @@ USE MODN_2D_FRC
 USE MODN_LATZ_EDFLX
 #ifdef MNH_FOREFIRE
 USE MODN_FOREFIRE
-USE MODD_FOREFIRE_n, ONLY : FFCOUPLING
 #endif
 USE MODN_BLOWSNOW_n
 USE MODN_BLOWSNOW
 USE MODN_IBM_PARAM_n
 USE MODN_RECYCL_PARAM_n
-USE MODD_IBM_LSF, ONLY: LIBM_LSF
+USE MODN_PROFILER_n
 USE MODN_STATION_n
-USE MODD_FIRE
 USE MODN_FIRE
+USE MODN_FLYERS
 !
 IMPLICIT NONE
 !
@@ -394,6 +405,9 @@ CALL INIT_NAM_BLOWSNOWn
 IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOWn)
 IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOW)
 !
+CALL INIT_NAM_PROFILERn
+IF(LPROFILER) WRITE(UNIT=ILUSEG,NML=NAM_PROFILERn)
+!
 CALL INIT_NAM_STATIONn
 IF(LSTATION) WRITE(UNIT=ILUSEG,NML=NAM_STATIONn)
 !
@@ -401,7 +415,7 @@ IF(LDUST) WRITE(UNIT=ILUSEG,NML=NAM_DUST)
 IF(LSALT) WRITE(UNIT=ILUSEG,NML=NAM_SALT)
 IF(LPASPOL) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL)
 #ifdef MNH_FOREFIRE
-IF(FFCOUPLING) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE)
+IF(LFOREFIRE) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE)
 #endif
 IF(LBLAZE) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL)
 IF(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP)
@@ -450,6 +464,9 @@ IF(CELEC /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_ELEC)
 IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIES)
 IF(NMODEL_CLOUD/=NUNDEF) WRITE(UNIT=ILUSEG,NML=NAM_TURB_CLOUD)
 IF(CTURB /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_TURB)
+WRITE(UNIT=ILUSEG,NML=NAM_FLYERS)
+!Not possible (for the moment): arrays have been deallocated after ini_aircraft: WRITE(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+!Not possible (for the moment): arrays have been deallocated after ini_balloon:  WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS)
 !
 !
 !
@@ -623,10 +640,10 @@ IF (NVERB >= 5) THEN
 !
 #endif
 !
-IF (LBLAZE) THEN
-  WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')")
-  WRITE(UNIT=ILUOUT,NML=NAM_FIRE)
-END IF
+    IF ( LBLAZE ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_FIRE)
+    END IF
 !
     WRITE(UNIT=ILUOUT,FMT="('********** CONDSAMP****************************')")
     WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP)
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 8175eb1d84072a822001f956ec6483e7b8551023..3a45d50f964deaf38dedd0ac2fc9c6909110f20b 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-2023 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -90,32 +90,34 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields,       &
 !  P. Wautelet 11/03/2021: remove ptrajx/y/z optional dummy arguments of Write_diachro
 !                          + get the trajectory data for LFI files differently
 !  P. Wautelet 01/09/2021: allow NMNHDIM_LEVEL and NMNHDIM_LEVEL_W simultaneously
+!  P. Wautelet    06/2022: reorganize flyers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-use modd_aircraft_balloon, only: flyer
+use modd_aircraft_balloon, only: tflyerdata
 use modd_budget,           only: tbudiachrometadata
 use modd_conf,             only: lpack
-use modd_field,            only: tfield_metadata_base
-use modd_io,               only: tfiledata
+use modd_field,            only: tfieldmetadata_base
+use modd_io,               only: gsmonoproc, tfiledata
 use modd_type_date,        only: date_time
 !
 IMPLICIT NONE
 !
 !*       0.1   Dummy arguments
 !              ---------------
-TYPE(TFILEDATA),                                     INTENT(IN)           :: TPDIAFILE    ! file to write
-type(tbudiachrometadata),                            intent(in)           :: tpbudiachro
-class(tfield_metadata_base), dimension(:),           intent(in)           :: tpfields
-type(date_time),             dimension(:),           intent(in)           :: tpdates  !Used only for LFI files
-REAL,                        DIMENSION(:,:,:,:,:,:), INTENT(IN)           :: PVAR
-logical,                                             intent(in), optional :: osplit
-type(flyer),                                         intent(in), optional :: tpflyer
+TYPE(TFILEDATA),                                    INTENT(IN)           :: TPDIAFILE    ! file to write
+type(tbudiachrometadata),                           intent(in)           :: tpbudiachro
+class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfields
+type(date_time),            dimension(:),           intent(in)           :: tpdates  !Used only for LFI files
+REAL,                       DIMENSION(:,:,:,:,:,:), INTENT(IN)           :: PVAR
+logical,                                            intent(in), optional :: osplit
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 !
 !*       0.1   Local variables
 !              ---------------
+logical :: omonoproc_save ! Copy of true value of gsmonoproc
 logical :: gpack
 !------------------------------------------------------------------------------
 
@@ -124,6 +126,15 @@ call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro', 'called' )
 gpack = lpack
 lpack = .false.
 
+if ( present( tpflyer ) ) then
+  ! Save gsmonoproc value
+  omonoproc_save = gsmonoproc
+
+  ! Force gsmonoproc to true to allow IO_Field_write on only 1 process! (not very clean hack)
+  ! This is necessary for flyers because their data is local to 1 one process (and has been copied on the master rank of the file)
+  gsmonoproc = .true.
+end if
+
 #ifdef MNH_IOLFI
 if ( tpdiafile%cformat == 'LFI' .or. tpdiafile%cformat == 'LFICDF4' ) &
   call Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar,         tpflyer )
@@ -136,18 +147,24 @@ if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) &
 
 lpack = gpack
 
+if ( present( tpflyer ) ) then
+  ! Restore correct value of gsmonoproc
+  gsmonoproc = omonoproc_save
+end if
+
+! end subroutine Write_diachro_1
 end subroutine Write_diachro
 
 #ifdef MNH_IOLFI
 !-----------------------------------------------------------------------------
 subroutine Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, tpflyer )
 
-use modd_aircraft_balloon, only: flyer
+use modd_aircraft_balloon, only: tflyerdata
 use modd_budget,         only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, nbutshift, nbusubwrite, tbudiachrometadata
 use modd_field,          only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_BUDGET_LES_MASK, &
                                NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, &
                                TYPECHAR, TYPEINT, TYPEREAL,                           &
-                               tfield_metadata_base, tfielddata
+                               tfieldmetadata_base, tfieldmetadata
 use modd_io,             only: tfiledata
 use modd_les,            only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, &
                                nles_k, xles_current_z
@@ -162,12 +179,12 @@ use mode_menu_diachro,   only: Menu_diachro
 use mode_tools_ll,       only: Get_globaldims_ll
 
 
-type(tfiledata),                                     intent(in)           :: tpdiafile        ! File to write
-type(tbudiachrometadata),                            intent(in)           :: tpbudiachro
-class(tfield_metadata_base), dimension(:),           intent(in)           :: tpfields
-type(date_time),             dimension(:),           intent(in)           :: tpdates
-real,                        dimension(:,:,:,:,:,:), intent(in)           :: pvar
-type(flyer),                                         intent(in), optional :: tpflyer
+type(tfiledata),                                    intent(in)           :: tpdiafile        ! File to write
+type(tbudiachrometadata),                           intent(in)           :: tpbudiachro
+class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfields
+type(date_time),            dimension(:),           intent(in)           :: tpdates
+real,                       dimension(:,:,:,:,:,:), intent(in)           :: pvar
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 
 integer, parameter :: LFITITLELGT = 100
 integer, parameter :: LFIUNITLGT = 100
@@ -197,7 +214,7 @@ logical   :: gdistributed
 real, dimension(:,:), allocatable :: ztimes
 real, dimension(:,:), allocatable :: zdatime
 real, dimension(:,:,:), allocatable :: ztrajz
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 type(tfiledata)  :: tzfile
 
 call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro_lfi', 'called' )
@@ -364,7 +381,7 @@ ITTRAJX=0; ITTRAJY=0; ITTRAJZ=0
 INTRAJX=0; INTRAJY=0; INTRAJZ=0
 IF ( PRESENT( tpflyer ) ) THEN
   IKTRAJX = 1
-  ITTRAJX = SIZE( tpflyer%x )
+  ITTRAJX = SIZE( tpflyer%xx )
   INTRAJX = 1
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
   IKTRAJX = 1
@@ -373,7 +390,7 @@ ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == '
 ENDIF
 IF ( PRESENT( tpflyer ) ) THEN
   IKTRAJY = 1
-  ITTRAJY = SIZE( tpflyer%y )
+  ITTRAJY = SIZE( tpflyer%xy )
   INTRAJY = 1
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
   IKTRAJY = 1
@@ -382,7 +399,7 @@ ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == '
 ENDIF
 IF ( PRESENT( tpflyer ) ) THEN
   IKTRAJZ = 1
-  ITTRAJZ = SIZE( tpflyer%z )
+  ITTRAJZ = SIZE( tpflyer%xz )
   INTRAJZ = 1
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
   IKTRAJZ = IK
@@ -409,30 +426,32 @@ ILENCOMMENT = LFICOMMENTLGT
 !
 ! 1er enregistrement TYPE
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TYPE'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TYPE'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPECHAR
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(             &
+  CMNHNAME   = TRIM(ygroup)//'.TYPE', &
+  CSTDNAME   = '',                    &
+  CLONGNAME  = TRIM(ygroup)//'.TYPE', &
+  CUNITS     = '',                    &
+  CDIR       = '--',                  &
+  CCOMMENT   = TRIM(YCOMMENT),        &
+  NGRID      = tpfields(1)%ngrid,     &
+  NTYPE      = TYPECHAR,              &
+  NDIMS      = 0,                     &
+  LTIMEDEP   = .FALSE.                )
 CALL IO_Field_write(tzfile,TZFIELD,YTYPE)
 !
 ! 2eme  enregistrement DIMENSIONS des MATRICES et LONGUEUR des TABLEAUX de CARACTERES et FLAGS de COMPRESSION sur les DIFFERENTS AXES
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.DIM'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.DIM'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPEINT
-TZFIELD%NDIMS      = 1
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(            &
+  CMNHNAME   = TRIM(ygroup)//'.DIM', &
+  CSTDNAME   = '',                   &
+  CLONGNAME  = TRIM(ygroup)//'.DIM', &
+  CUNITS     = '',                   &
+  CDIR       = '--',                 &
+  CCOMMENT   = TRIM(YCOMMENT),       &
+  NGRID      = tpfields(1)%ngrid,    &
+  NTYPE      = TYPEINT,              &
+  NDIMS      = 1,                    &
+  LTIMEDEP   = .FALSE.               )
 SELECT CASE(YTYPE)
   CASE('CART','MASK','SPXY')
     if ( iil < 0 .or. iih < 0 .or. ijl < 0 .or. ijh < 0 .or. ikl < 0 .or. ikh < 0 ) then
@@ -489,16 +508,17 @@ END SELECT
 !
 ! 3eme enregistrement TITRE
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TITRE'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TITRE'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPECHAR
-TZFIELD%NDIMS      = 1
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(              &
+  CMNHNAME   = TRIM(ygroup)//'.TITRE', &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = TRIM(ygroup)//'.TITRE', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = TRIM(YCOMMENT),         &
+  NGRID      = tpfields(1)%ngrid,      &
+  NTYPE      = TYPECHAR,               &
+  NDIMS      = 1,                      &
+  LTIMEDEP   = .FALSE.                 )
 allocate( ytitles( ip ) )
 ytitles(:) = tpfields(1 : ip)%cmnhname
 CALL IO_Field_write(tzfile,TZFIELD,ytitles(:))
@@ -506,16 +526,17 @@ deallocate( ytitles )
 !
 ! 4eme enregistrement UNITE
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.UNITE'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.UNITE'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPECHAR
-TZFIELD%NDIMS      = 1
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(              &
+  CMNHNAME   = TRIM(ygroup)//'.UNITE', &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = TRIM(ygroup)//'.UNITE', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = TRIM(YCOMMENT),         &
+  NGRID      = tpfields(1)%ngrid,      &
+  NTYPE      = TYPECHAR,               &
+  NDIMS      = 1,                      &
+  LTIMEDEP   = .FALSE.                 )
 allocate( yunits( ip ) )
 yunits(:) = tpfields(1 : ip)%cunits
 CALL IO_Field_write(tzfile,TZFIELD,yunits(:))
@@ -523,16 +544,17 @@ deallocate( yunits )
 !
 ! 5eme enregistrement COMMENT
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.COMMENT'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.COMMENT'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPECHAR
-TZFIELD%NDIMS      = 1
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(                &
+  CMNHNAME   = TRIM(ygroup)//'.COMMENT', &
+  CSTDNAME   = '',                       &
+  CLONGNAME  = TRIM(ygroup)//'.COMMENT', &
+  CUNITS     = '',                       &
+  CDIR       = '--',                     &
+  CCOMMENT   = TRIM(YCOMMENT),           &
+  NGRID      = tpfields(1)%ngrid,        &
+  NTYPE      = TYPECHAR,                 &
+  NDIMS      = 1,                        &
+  LTIMEDEP   = .FALSE.                   )
 allocate( ycomments( ip ) )
 ycomments(:) = tpfields(1 : ip)%ccomment
 CALL IO_Field_write(tzfile,TZFIELD,ycomments(:))
@@ -565,30 +587,32 @@ DO J = 1,IP
           WRITE(YJ,'(I3)')J
   ENDIF
   IF ( gdistributed ) THEN
-    TZFIELD%CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = tpfields(j)%cunits
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')'
-    TZFIELD%NGRID      = tpfields(j)%ngrid
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 5
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ, &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = TRIM(ygroup)//'.PROC'//YJ, &
+      CUNITS     = tpfields(j)%cunits,        &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')', &
+      NGRID      = tpfields(j)%ngrid,         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 5,                         &
+      LTIMEDEP   = .FALSE.                    )
 
     CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), &
                             iil+JPHEXT,iih+JPHEXT,ijl+JPHEXT,ijh+JPHEXT)
   ELSE
-    TZFIELD%CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = tpfields(j)%cunits
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')'
-    TZFIELD%NGRID      = tpfields(j)%ngrid
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 5
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ, &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = TRIM(ygroup)//'.PROC'//YJ, &
+      CUNITS     = tpfields(j)%cunits,        &
+      CDIR       = '--',                      &
+      CCOMMENT   = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')', &
+      NGRID      = tpfields(j)%ngrid,         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 5,                         &
+      LTIMEDEP   = .FALSE.                    )
 
     CALL IO_Field_write(tzfile,TZFIELD,PVAR(:,:,:,:,:,J))
   ENDIF
@@ -597,16 +621,17 @@ ENDDO
 !
 ! 7eme enregistrement TRAJT
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJT'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJT'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 2
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(              &
+  CMNHNAME   = TRIM(ygroup)//'.TRAJT', &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = TRIM(ygroup)//'.TRAJT', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = TRIM(YCOMMENT),         &
+  NGRID      = tpfields(1)%ngrid,      &
+  NTYPE      = TYPEREAL,               &
+  NDIMS      = 2,                      &
+  LTIMEDEP   = .FALSE.                 )
 
 !NMNHDIM_FLYER_TIME excluded because created only in netCDF/HDF groups (local to each flyer)
 if ( tpfields(1)%ndimlist(4) /= NMNHDIM_UNKNOWN .and. tpfields(1)%ndimlist(4) /= NMNHDIM_UNUSED &
@@ -636,28 +661,30 @@ deallocate( ztimes )
 ! 8eme enregistrement TRAJX
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJX'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) )
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJX', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJX', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
+  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xx, [1, Size( tpflyer%xx), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJX'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJX', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJX', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
   !TRAJX is given in extended domain coordinates (=> +jphext) for backward compatibility
   CALL IO_Field_write(tzfile,TZFIELD, Real( Reshape( &
                        Spread( source = ( nles_current_iinf + nles_current_isup) / 2 + jphext, dim = 1, ncopies = IN ), &
@@ -667,28 +694,30 @@ ENDIF
 ! 9eme enregistrement TRAJY
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJY'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJY'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) )
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJY', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJY', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
+  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xy, [1, Size( tpflyer%xy), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJY'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJY'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJY', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJY', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
   !TRAJY is given in extended domain coordinates (=> +jphext) for backward compatibility
   CALL IO_Field_write(tzfile,TZFIELD, Real( Reshape( &
                        Spread( source = ( nles_current_jinf + nles_current_jsup) / 2 + jphext, dim = 1, ncopies = IN ), &
@@ -698,28 +727,30 @@ ENDIF
 ! 10eme enregistrement TRAJZ
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJZ'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJZ'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) )
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJZ', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJZ', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
+  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xz, [1, Size( tpflyer%xz), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJZ'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJZ'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-  TZFIELD%NGRID      = tpfields(1)%ngrid
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = TRIM(ygroup)//'.TRAJZ', &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = TRIM(ygroup)//'.TRAJZ', &
+    CUNITS     = '',                     &
+    CDIR       = '--',                   &
+    CCOMMENT   = TRIM(YCOMMENT),         &
+    NGRID      = tpfields(1)%ngrid,      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .FALSE.                 )
 
   Allocate( ztrajz(IK, 1, IN) )
   do jj = 1, IK
@@ -731,16 +762,17 @@ ENDIF
 !
 ! 11eme enregistrement PDATIME
 !
-TZFIELD%CMNHNAME   = TRIM(ygroup)//'.DATIM'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(ygroup)//'.DATIM'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
-TZFIELD%NGRID      = tpfields(1)%ngrid
-TZFIELD%NTYPE      = TYPEREAL
-TZFIELD%NDIMS      = 2
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(              &
+  CMNHNAME   = TRIM(ygroup)//'.DATIM', &
+  CSTDNAME   = '',                     &
+  CLONGNAME  = TRIM(ygroup)//'.DATIM', &
+  CUNITS     = '',                     &
+  CDIR       = '--',                   &
+  CCOMMENT   = TRIM(YCOMMENT),         &
+  NGRID      = tpfields(1)%ngrid,      &
+  NTYPE      = TYPEREAL,               &
+  NDIMS      = 2,                      &
+  LTIMEDEP   = .FALSE.                 )
 
 !Reconstitute old diachro format
 allocate( zdatime( 16, size(tpdates) ) )
@@ -777,7 +809,7 @@ subroutine Write_diachro_nc4( tpdiafile, tpbudiachro, tpfields, pvar, osplit, tp
 
 use NETCDF,                only: NF90_DEF_DIM, NF90_INQ_DIMID, NF90_INQUIRE_DIMENSION, NF90_NOERR
 
-use modd_aircraft_balloon, only: flyer
+use modd_aircraft_balloon, only: tflyerdata
 use modd_budget,           only: CNCGROUPNAMES,                                                      &
                                  NMAXLEVELS, NLVL_ROOT, NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, &
                                  NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK,                     &
@@ -793,12 +825,12 @@ use modd_type_date,        only: date_time
 use mode_io_field_write,   only: IO_Field_create, IO_Field_write, IO_Field_write_box
 use mode_io_tools_nc4,     only: IO_Err_handle_nc4
 
-type(tfiledata),                                     intent(in)           :: tpdiafile        ! File to write
-type(tbudiachrometadata),                            intent(in)           :: tpbudiachro
-class(tfield_metadata_base), dimension(:),           intent(in)           :: tpfields
-real,                        dimension(:,:,:,:,:,:), intent(in)           :: pvar
-logical,                                             intent(in), optional :: osplit
-type(flyer),                                         intent(in), optional :: tpflyer
+type(tfiledata),                                    intent(in)           :: tpdiafile        ! File to write
+type(tbudiachrometadata),                           intent(in)           :: tpbudiachro
+class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfields
+real,                       dimension(:,:,:,:,:,:), intent(in)           :: pvar
+logical,                                            intent(in), optional :: osplit
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 
 character(len=:), allocatable :: ycategory
 character(len=:), allocatable :: ylevelname
@@ -820,7 +852,7 @@ integer(kind=CDFINT), dimension(0:NMAXLEVELS) :: ilevelids ! ids of the differen
 logical                                       :: gdistributed
 logical                                       :: gsplit
 logical,              dimension(0:NMAXLEVELS) :: gleveldefined ! Are the different groups/levels already defined in the netCDF file
-type(tfielddata)                              :: tzfield
+type(tfieldmetadata)                          :: tzfield
 type(tfiledata)                               :: tzfile
 
 call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro_nc4', 'called' )
@@ -1477,33 +1509,33 @@ select case ( idims )
 end select
 
 !Write X and Y position of the flyer
-if ( Present( tpflyer ) ) then
+if ( Present( tpflyer ) .and. yshape == 'Point' ) then
   if ( lcartesian ) then
     ystdnameprefix = 'plane'
   else
     ystdnameprefix = 'projection'
   endif
 
-  tzfield%cmnhname   = 'X'
-  tzfield%cstdname   = Trim( ystdnameprefix ) // '_x_coordinate'
-  tzfield%clongname  = 'x-position of the flyer'
-  tzfield%cunits     = 'm'
-  tzfield%cdir       = '--'
-  tzfield%ccomment   = ''
-  tzfield%ngrid      = 0
-  tzfield%ntype      = TYPEREAL
-  tzfield%ltimedep   = .false.
-  tzfield%ndims      = 1
-  tzfield%ndimlist(1)  = NMNHDIM_FLYER_TIME
-  tzfield%ndimlist(2:) = NMNHDIM_UNUSED
-
-  call IO_Field_write( tzfile, tzfield, tpflyer%x )
+  tzfield = tfieldmetadata(                                 &
+    cmnhname   = 'X',                                       &
+    cstdname   = Trim( ystdnameprefix ) // '_x_coordinate', &
+    clongname  = 'x-position of the flyer',                 &
+    cunits     = 'm',                                       &
+    cdir       = '--',                                      &
+    ccomment   = '',                                        &
+    ngrid      = 0,                                         &
+    ntype      = TYPEREAL,                                  &
+    ndims      = 1,                                         &
+    ndimlist   = [ NMNHDIM_FLYER_TIME ],                    &
+    ltimedep   = .false.                                    )
+
+  call IO_Field_write( tzfile, tzfield, tpflyer%xx )
 
   tzfield%cmnhname   = 'Y'
   tzfield%cstdname   = Trim( ystdnameprefix ) // '_y_coordinate'
   tzfield%clongname  = 'y-position of the flyer'
 
-  call IO_Field_write( tzfile, tzfield, tpflyer%y )
+  call IO_Field_write( tzfile, tzfield, tpflyer%xy )
 end if
 
 end  subroutine Write_diachro_nc4
@@ -1512,22 +1544,22 @@ end  subroutine Write_diachro_nc4
 subroutine Diachro_one_field_write_nc4( tpfile, tpbudiachro, tpfield, pvar, kdims, osplit, odistributed, &
                                         kil, kih, kjl, kjh, kkl, kkh )
 use modd_budget,      only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbutshift, nbusubwrite, tbudiachrometadata
-use modd_field,       only: tfielddata, tfield_metadata_base
+use modd_field,       only: tfieldmetadata, tfieldmetadata_base
 use modd_io,          only: isp, tfiledata
 use modd_parameters,  only: jphext
 
 use mode_io_field_write, only: IO_Field_create, IO_Field_write, IO_Field_write_box
 
-type(tfiledata),                                     intent(in)  :: tpfile        !File to write
-type(tbudiachrometadata),                            intent(in)  :: tpbudiachro
-class(tfield_metadata_base),                         intent(in)  :: tpfield
-real,                        dimension(:,:,:,:,:,:), intent(in)  :: pvar
-integer, dimension(:),                               intent(in)  :: kdims        !List of indices of dimensions to use
-logical,                                             intent(in)  :: osplit
-logical,                                             intent(in)  :: odistributed !.T. if data is distributed among all processes
-integer,                                             intent(in), optional :: kil, kih
-integer,                                             intent(in), optional :: kjl, kjh
-integer,                                             intent(in), optional :: kkl, kkh
+type(tfiledata),                                    intent(in)  :: tpfile        !File to write
+type(tbudiachrometadata),                           intent(in)  :: tpbudiachro
+class(tfieldmetadata_base),                         intent(in)  :: tpfield
+real,                       dimension(:,:,:,:,:,:), intent(in)  :: pvar
+integer, dimension(:),                              intent(in)  :: kdims        !List of indices of dimensions to use
+logical,                                            intent(in)  :: osplit
+logical,                                            intent(in)  :: odistributed !.T. if data is distributed among all processes
+integer,                                            intent(in), optional :: kil, kih
+integer,                                            intent(in), optional :: kjl, kjh
+integer,                                            intent(in), optional :: kkl, kkh
 
 integer                                                    :: idims
 integer                                                    :: ibutimepos
@@ -1541,28 +1573,28 @@ real,             dimension(:,:),              allocatable :: zdata2d
 real,             dimension(:,:,:),            allocatable :: zdata3d
 real,             dimension(:,:,:,:),          allocatable :: zdata4d
 real,             dimension(:,:,:,:,:),        allocatable :: zdata5d
-type(tfielddata)                                           :: tzfield
+type(tfieldmetadata)                                       :: tzfield
 
 idims = Size( kdims )
 
 if ( odistributed ) then
   if ( idims /= 2 .and. idims /= 3 )                                                                 &
     call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4',                                &
-                   'odistributed=.true. not allowed for dims/=3, field: ' //Trim( tzfield%cmnhname ) )
+                   'odistributed=.true. not allowed for dims/=3, field: ' //Trim( tpfield%cmnhname ) )
 
-  if ( tpbudiachro%clevels(NLVL_SHAPE) /= 'Cartesian' )                                                                    &
+  if ( tpbudiachro%clevels(NLVL_SHAPE) /= 'Cartesian' )                                                       &
     call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4',                                         &
-                   'odistributed=.true. not allowed for shape/=cartesian, field: ' //Trim( tzfield%cmnhname ) )
+                   'odistributed=.true. not allowed for shape/=cartesian, field: ' //Trim( tpfield%cmnhname ) )
 end if
 
 if ( osplit ) then
   if ( idims > 3 )                                                                                          &
     call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4',                                       &
-                                 'osplit=.true. not allowed for dims>3, field: ' //Trim( tzfield%cmnhname ) )
+                                 'osplit=.true. not allowed for dims>3, field: ' //Trim( tpfield%cmnhname ) )
 
-  if ( tpbudiachro%clevels(NLVL_CATEGORY) /= 'Budgets' )                                                  &
+  if ( tpbudiachro%clevels(NLVL_CATEGORY) /= 'Budgets' )                                                 &
     call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4',                                    &
-                    'osplit=.true. not allowed for category/=budget, field: ' //Trim( tzfield%cmnhname ) )
+                    'osplit=.true. not allowed for category/=budget, field: ' //Trim( tpfield%cmnhname ) )
 end if
 
 Allocate( isizes(idims) )
@@ -1759,14 +1791,14 @@ end subroutine Diachro_one_field_write_nc4
 
 
 subroutine Prepare_diachro_write( tpfieldin, tpfieldout, kdims, osplit, odistributed, kbutimepos )
-use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfielddata, tfield_metadata_base
-
-class(tfield_metadata_base), intent(in)  :: tpfieldin
-type(tfielddata),            intent(out) :: tpfieldout
-integer, dimension(:),       intent(in)  :: kdims ! List of indices of dimensions to use
-logical,                     intent(in)  :: osplit
-logical,                     intent(in)  :: odistributed ! .true. if data is distributed among all the processes
-integer,                     intent(out) :: kbutimepos
+use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfieldmetadata, tfieldmetadata_base
+
+class(tfieldmetadata_base), intent(in)  :: tpfieldin
+type(tfieldmetadata),       intent(out) :: tpfieldout
+integer, dimension(:),      intent(in)  :: kdims ! List of indices of dimensions to use
+logical,                    intent(in)  :: osplit
+logical,                    intent(in)  :: odistributed ! .true. if data is distributed among all the processes
+integer,                    intent(out) :: kbutimepos
 
 integer :: idims
 integer :: jdim
diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90
index 74f56e63cbd956f50ef7992ef52b3b2fbaebfce9..c3e6096e080d00f316bfea2feaa87ea904664598 100644
--- a/src/MNH/write_dummy_gr_fieldn.f90
+++ b/src/MNH/write_dummy_gr_fieldn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-2021 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.
@@ -63,7 +63,7 @@ END MODULE MODI_WRITE_DUMMY_GR_FIELD_n
 !
 USE MODD_DUMMY_GR_FIELD_n, ONLY: NDUMMY_GR_NBR, CDUMMY_GR_NAME,    &
                                  CDUMMY_GR_AREA, XDUMMY_GR_FIELDS
-use modd_field,            only: tfielddata, TYPEINT, TYPEREAL
+use modd_field,            only: tfieldmetadata, TYPEINT, TYPEREAL
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_PARAMETERS,       ONLY: NMNHNAMELGTMAX
 !
@@ -87,7 +87,7 @@ CHARACTER(LEN=3)              :: YSTRING03
 !
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D
 !
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -104,16 +104,17 @@ ALLOCATE(ZWORK2D(SIZE(XDUMMY_GR_FIELDS,1),SIZE(XDUMMY_GR_FIELDS,2)))
 !*       3.     Dummy fields :
 !               ------------
 !
-TZFIELD%CMNHNAME   = 'DUMMY_GR_NBR'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = 'DUMMY_GR_NBR'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = 'number of dummy pgd fields chosen by user'
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPEINT
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(                                   &
+  CMNHNAME   = 'DUMMY_GR_NBR',                              &
+  CSTDNAME   = '',                                          &
+  CLONGNAME  = 'DUMMY_GR_NBR',                              &
+  CUNITS     = '',                                          &
+  CDIR       = '--',                                        &
+  CCOMMENT   = 'number of dummy pgd fields chosen by user', &
+  NGRID      = 0,                                           &
+  NTYPE      = TYPEINT,                                     &
+  NDIMS      = 0,                                           &
+  LTIMEDEP   = .FALSE.                                      )
 CALL IO_Field_write(TPFILE,TZFIELD,NDUMMY_GR_NBR)
 !
 DO JDUMMY=1,NDUMMY_GR_NBR
@@ -121,16 +122,17 @@ DO JDUMMY=1,NDUMMY_GR_NBR
   YSTRING20=CDUMMY_GR_NAME(JDUMMY)
   YSTRING03=CDUMMY_GR_AREA(JDUMMY)
   !
-  TZFIELD%CMNHNAME   = TRIM(YRECFM)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(YRECFM)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_'//YRECFM//YSTRING20//YSTRING03
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                            &
+    CMNHNAME   = TRIM(YRECFM),                         &
+    CSTDNAME   = '',                                   &
+    CLONGNAME  = TRIM(YRECFM),                         &
+    CUNITS     = '',                                   &
+    CDIR       = 'XY',                                 &
+    CCOMMENT   = 'X_Y_'//YRECFM//YSTRING20//YSTRING03, &
+    NGRID      = 4,                                    &
+    NTYPE      = TYPEREAL,                             &
+    NDIMS      = 2,                                    &
+    LTIMEDEP   = .TRUE.                                )
   !
   ZWORK2D(:,:) = XDUMMY_GR_FIELDS(:,:,JDUMMY)
   !
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 3e00b993e7f48e0116a9a0977ca1bbf0c2e92eb3..c7cd8db0a1369886f3794a3d25eb3cbbe3664a68 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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.
@@ -78,52 +78,38 @@ END MODULE MODI_WRITE_LB_n
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  S. Bielli      02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 10/03/2021: use scalar variable names for dust and salt
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_DIM_n
-USE MODD_DYN_n
-USE MODD_CONF_n
+USE MODD_CH_AEROSOL,     ONLY: JP_CH_CO, LAERINIT, LDEPOS_AER, LORILAM, NSP
+USE MODD_CONF,           ONLY: CPROGRAM
+USE MODD_CONF_n,         ONLY: LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, NRR
+USE MODD_DUST,           ONLY: LDEPOS_DST, LDSTCAMS, LDSTINIT, LDUST
+USE MODD_DYN_n,          ONLY: LHORELAX_RV, LHORELAX_RC, LHORELAX_RR, LHORELAX_RI, LHORELAX_RS,        &
+                               LHORELAX_RG, LHORELAX_RH, LHORELAX_SV, LHORELAX_TKE, LHORELAX_UVWTH,    &
+                               NRIMX, NRIMY,                                                           &
+                               NSIZELBX_ll, NSIZELBXR_ll, NSIZELBXSV_ll, NSIZELBXTKE_ll, NSIZELBXU_ll, &
+                               NSIZELBY_ll, NSIZELBYR_ll, NSIZELBYSV_ll, NSIZELBYTKE_ll, NSIZELBYV_ll
+use modd_field,          only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL
+USE MODD_GRID_n,         ONLY: XZZ
+USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LSFIELD_n
-USE MODD_LUNIT_n
-USE MODD_PARAM_n
-USE MODD_TURB_n
 USE MODD_NSV
-USE MODD_PARAM_LIMA
-USE MODD_PARAM_n
-!
+USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT, NLONGNAMELGTMAX, NMNHNAMELGTMAX
+USE MODD_PARAM_n,        ONLY: CTURB
+USE MODD_REF,            ONLY: XRHODREFZ
+USE MODD_SALT,           ONLY: LDEPOS_SLT, LSALT, LSLTCAMS, LSLTINIT
+
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb
-USE MODE_ll
-USE MODE_MSG
-USE MODE_MODELN_HANDLER
-USE MODE_TOOLS, ONLY: UPCASE
-!
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_CH_AEROSOL
-USE MODD_CH_AERO_n
+USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX
+
 USE MODI_CH_AER_REALLFI_n
-USE MODD_CONF
-USE MODD_REF,   ONLY : XRHODREFZ
-USE MODD_CONF,  ONLY : CPROGRAM
-USE MODD_GRID_n, ONLY : XZZ
-USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT
-USE MODD_DUST
-USE MODD_SALT
 USE MODI_DUSTLFI_n
 USE MODI_SALTLFI_n
-USE MODD_PARAMETERS,      ONLY: JPHEXT
-USE MODD_IO, ONLY: TFILEDATA
-use modd_field, only: tfielddata, TYPELOG, TYPEREAL
-!
-!
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
@@ -132,46 +118,36 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 !
 !*       0.2   Declarations of local variables
 !
-INTEGER            :: ILUOUT        ! logical unit
-!
 INTEGER            :: IRR           ! Index for moist variables
 INTEGER            :: JRR,JSV       ! loop index for moist and scalar variables
 ! 
 LOGICAL            :: GHORELAX_R, GHORELAX_SV   ! global hor. relax. informations
-INTEGER            :: IRIMX,IRIMY   ! size of the RIM zone
 CHARACTER (LEN=1), DIMENSION (7) :: YC    ! array with the prefix of the moist variables
 LOGICAL, DIMENSION (7)           :: GUSER ! array with the use indicator of the moist variables
 REAL,    DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODREFX
 REAL,    DIMENSION(SIZE(XLBYSVM, 1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZRHODREFY
 INTEGER            :: JK
 INTEGER            :: IMI    ! Current model index
-CHARACTER(LEN=2)   :: INDICE ! to index CCN and IFN fields of LIMA scheme
-INTEGER           :: I
 INTEGER           :: ILBX,ILBY
 INTEGER           :: IIB, IIE, IJB, IJE, IKB, IKE
-INTEGER           :: IIU, IJU, IKU
 REAL, DIMENSION(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZLBXZZ
 REAL, DIMENSION(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZLBYZZ
-CHARACTER(LEN=100) :: YMSG
-TYPE(TFIELDDATA)   :: TZFIELD
+CHARACTER(LEN=NMNHNAMELGTMAX)  :: YMNHNAME_BASE
+CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.    SOME INITIALIZATIONS
 !              --------------------
 !
-ILUOUT = TLUOUT%NLU
-!
 IMI = GET_CURRENT_MODEL_INDEX()
 
 IIB=JPHEXT+1
 IIE=SIZE(XZZ,1)-JPHEXT
-IIU=SIZE(XZZ,1)
 IJB=JPHEXT+1
 IJE=SIZE(XZZ,2)-JPHEXT
-IJU=SIZE(XZZ,2)
 IKB=JPVEXT+1
 IKE=SIZE(XZZ,3)-JPVEXT
-IKU=SIZE(XZZ,3)
 !
 !        2.  WRITE THE DIMENSION OF LB FIELDS
 !            --------------------------------
@@ -213,17 +189,18 @@ IF (NRR >=1) THEN
                LHORELAX_RI .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. &
                LHORELAX_RH
   !
-  TZFIELD%CMNHNAME   = 'HORELAX_R'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HORELAX_R'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Switch to activate the HOrizontal RELAXation'
-  TZFIELD%CLBTYPE    = 'NONE'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                                      &
+    CMNHNAME   = 'HORELAX_R',                                    &
+    CSTDNAME   = '',                                             &
+    CLONGNAME  = 'HORELAX_R',                                    &
+    CUNITS     = '',                                             &
+    CDIR       = '--',                                           &
+    CCOMMENT   = 'Switch to activate the HOrizontal RELAXation', &
+    CLBTYPE    = 'NONE',                                         &
+    NGRID      = 1,                                              &
+    NTYPE      = TYPELOG,                                        &
+    NDIMS      = 0,                                              &
+    LTIMEDEP   = .FALSE.                                         )
   !
   CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_R)
   !
@@ -231,13 +208,14 @@ IF (NRR >=1) THEN
   YC(:)=(/"V","C","R","I","S","G","H"/)
   IRR=0
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA( &
+    CUNITS     = 'kg kg-1', &
+    CDIR       = '',        &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
+
   ! Loop on moist variables
   DO JRR=1,7
     IF (GUSER(JRR)) THEN
@@ -268,600 +246,110 @@ END IF
 IF (NSV >=1) THEN
   GHORELAX_SV=ANY ( LHORELAX_SV )
 !
-  TZFIELD%CMNHNAME   = 'HORELAX_SV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HORELAX_SV'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%CLBTYPE    = 'NONE'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
-  CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_SV)
-!
-  IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2
-  IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2
-  IF (NSV_USER>0) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = 1,NSV_USER
-      IF(NSIZELBXSV_ll /= 0) THEN
-        WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-  !
-  IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm-3'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C2R2BEG,NSV_C2R2END
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-  !
-  IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm-3'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C1R3BEG,NSV_C1R3END
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'HORELAX_SV', &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'HORELAX_SV', &
+    CUNITS     = '',           &
+    CDIR       = '--',         &
+    CCOMMENT   = '',           &
+    CLBTYPE    = 'NONE',       &
+    NGRID      = 0,            &
+    NTYPE      = TYPELOG,      &
+    NDIMS      = 0,            &
+    LTIMEDEP   = .FALSE.       )
+  CALL IO_Field_write( TPFILE, TZFIELD, GHORELAX_SV )
+
+  IF ( LORILAM .OR. LDUST .OR. LSALT ) THEN
+    DO JK = 1, SIZE( XLBXSVM, 3 )
+      ZRHODREFX(:,:,JK) =  XRHODREFZ(JK)
     END DO
+    DO JK = 1, SIZE( XLBYSVM, 3 )
+      ZRHODREFY(:,:,JK) =  XRHODREFZ(JK)
+    ENDDO
   END IF
-!
-! LIMA: CCN and IFN scalar variables
-!
-  IF (CCLOUD=='LIMA' ) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-    !
-    DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
+
+  IF ( LORILAM ) THEN
+    IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. )
+    IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. )
+    IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) &
+        XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. )
+    IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) &
+        XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. )
+    IF ( LAERINIT ) THEN ! GRIBEX CASE (aerosols initialization)
+      IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) &
+        CALL CH_AER_REALLFI_n( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFX )
+      IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) &
+        CALL CH_AER_REALLFI_n( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFY )
+    END IF
   END IF
-!
-! ELEC
-!
-  IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_ELECBEG,NSV_ELECEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
+
+  IF ( LDUST ) THEN
+    IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. )
+    IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. )
+    IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) &
+        XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. )
+    IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) &
+        XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. )
+    IF ( LDSTINIT .AND. .NOT.LDSTCAMS ) THEN ! GRIBEX case (dust initialization)
+      IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) &
+        CALL DUSTLFI_n( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX )
+      IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) &
+        CALL DUSTLFI_n( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY )
+    END IF
   END IF
-  !
-  !
-  IF (LORILAM) THEN
-    DO JK=1,SIZE(XLBXSVM,3)
-       ZRHODREFX(:,:,JK) =  XRHODREFZ(JK)
-       ZRHODREFY(:,:,JK) =  XRHODREFZ(JK)
-    ENDDO
-    !
-    IF (NSIZELBXSV_ll /= 0) &
-      XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.)
-    IF (NSIZELBYSV_ll /= 0) &
-      XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.)
-    IF (LDEPOS_AER(IMI).AND.(NSIZELBXSV_ll /= 0)) &
-        XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.)      
-    IF (LDEPOS_AER(IMI).AND.(NSIZELBYSV_ll /= 0)) &
-        XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.)      
-    IF (LAERINIT) THEN ! GRIBEX CASE (aerosols initialization)
-    IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL  ').AND.(NSP > 1)) &
-      CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX)
-    IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL  ').AND.(NSP > 1)) &
-      CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY)
-    IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) &
-      CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX)
-    IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) & 
-      CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY)
+
+  IF ( LSALT ) THEN
+    IF ( SIZE( ZLBXZZ ) > 0 ) THEN
+      ILBX = SIZE( ZLBXZZ, 1 ) / 2 - 1
+      ZLBXZZ(1:ILBX+1,:,:)         = XZZ(IIB-1:IIB-1+ILBX,:,:)
+      ZLBXZZ(ILBX+2:2*ILBX+2,:,:)  = XZZ(IIE+1-ILBX:IIE+1,:,:)
+    ENDIF
+    IF ( SIZE( ZLBYZZ ) > 0 ) THEN
+      ILBY = SIZE( ZLBYZZ, 2 ) / 2 - 1
+      ZLBYZZ(:,1:ILBY+1,:)        = XZZ(:,IJB-1:IJB-1+ILBY,:)
+      ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:)
+    ENDIF
+    IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. )
+    IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. )
+    IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) &
+        XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. )
+    IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) &
+        XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. )
+    IF ( LSLTINIT .AND. .NOT.LSLTCAMS ) THEN ! GRIBEX case (dust initialization)
+      IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) &
+        CALL SALTLFI_n( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ )
+      IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) &
+        CALL SALTLFI_n( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ )
     END IF
-    !
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_AERBEG,NSV_AEREND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-    !
-    IF (LDEPOS_AER(IMI)) THEN
-      DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
-        IF(NSIZELBXSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-        END IF             
-        !
-        IF(NSIZELBYSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-        END IF             
-      END DO      
-    END IF  
   END IF
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CHEMBEG,NSV_CHEMEND
+
+  DO JSV = 1, NSV
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CDIR = ''
+    TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
+    YMNHNAME_BASE  = TRIM( TZFIELD%CMNHNAME )
+    YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME )
+
     IF(NSIZELBXSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CLBTYPE    = 'LBX'
+      TZFIELD%CMNHNAME  = 'LBX_' // TRIM( YMNHNAME_BASE )
+      TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE )
       WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-    END IF
-    !
-    IF(NSIZELBYSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CLBTYPE    = 'LBY'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-    END IF
-  END DO
-  !
-  DO JSV = NSV_CHICBEG,NSV_CHICEND
-    IF(NSIZELBXSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
       TZFIELD%CLBTYPE    = 'LBX'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
+      CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBXSV_ll, XLBXSVM(:,:,:,JSV) )
     END IF
-    !
+
     IF(NSIZELBYSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CLBTYPE    = 'LBY'
+      TZFIELD%CMNHNAME  = 'LBY_' // TRIM( YMNHNAME_BASE )
+      TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE )
       WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-    END IF
-  END DO
-  !
-  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-    IF(NSIZELBXSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBX_LINOX'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CLBTYPE    = 'LBX'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-    END IF
-    !
-    IF(NSIZELBYSV_ll /= 0) THEN
-      TZFIELD%CMNHNAME   = 'LBY_LINOX'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
       TZFIELD%CLBTYPE    = 'LBY'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-      CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
+      CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBYSV_ll, XLBYSVM(:,:,:,JSV) )
     END IF
   END DO
-  !
-  IF (LDUST) THEN
-    DO JK=1,size(XLBXSVM,3)
-       ZRHODREFX(:,:,JK) =  XRHODREFZ(JK)
-    ENDDO
-    DO JK=1,size(XLBYSVM,3)
-      ZRHODREFY(:,:,JK) =  XRHODREFZ(JK)
-    ENDDO
-    IF (NSIZELBXSV_ll /= 0) &
-      XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.)
-    IF (NSIZELBYSV_ll /= 0) &
-      XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.)
-    IF (LDEPOS_DST(IMI).AND.(NSIZELBXSV_ll /= 0)) &
-        XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.)      
-    IF (LDEPOS_DST(IMI).AND.(NSIZELBYSV_ll /= 0)) &
-        XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.)      
-    IF ((LDSTINIT).AND.(.NOT.LDSTCAMS)) THEN ! GRIBEX case (dust initialization)
-      IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN
-        CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX)
-      END IF
-      IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN
-        CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY)
-      END IF
-      IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) &
-        CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX)
-      IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) &
-        CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY)
-    END IF
-    !
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_DSTBEG,NSV_DSTEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-    IF (LDEPOS_DST(IMI)) THEN
-      DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
-        IF(NSIZELBXSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-        END IF
-        !
-        IF(NSIZELBYSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-        END IF
-      END DO
-    END IF
-  ENDIF
-  !
-  IF (LSALT) THEN
-    DO JK=1,size(XLBXSVM,3)
-      ZRHODREFX(:,:,JK) =  XRHODREFZ(JK)
-    ENDDO
-    DO JK=1,size(XLBYSVM,3)
-      ZRHODREFY(:,:,JK) =  XRHODREFZ(JK)
-    ENDDO
-    IIU  = SIZE(XZZ,1)
-    IJU  = SIZE(XZZ,2)
-    IKU  = SIZE(XZZ,3)
-    IF (SIZE(ZLBXZZ) .NE. 0 ) THEN
-      ILBX=SIZE(ZLBXZZ,1)/2-1
-      ZLBXZZ(1:ILBX+1,:,:)         = XZZ(IIB-1:IIB-1+ILBX,:,:)
-      ZLBXZZ(ILBX+2:2*ILBX+2,:,:)  = XZZ(IIE+1-ILBX:IIE+1,:,:)
-    ENDIF
-    IF (SIZE(ZLBYZZ) .NE. 0 ) THEN
-      ILBY=SIZE(ZLBYZZ,2)/2-1
-      ZLBYZZ(:,1:ILBY+1,:)        = XZZ(:,IJB-1:IJB-1+ILBY,:)
-      ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:)
-    ENDIF
-    IF (NSIZELBXSV_ll /= 0) &
-      XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.)
-    IF (NSIZELBYSV_ll /= 0) &
-      XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.)
-    IF (LDEPOS_SLT(IMI).AND.(NSIZELBXSV_ll /= 0)) &
-        XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.)      
-    IF (LDEPOS_SLT(IMI).AND.(NSIZELBYSV_ll /= 0)) &
-        XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.)      
-    IF ((LSLTINIT).AND.(.NOT.LSLTCAMS)) THEN ! GRIBEX case (dust initialization)
-      IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN
-        CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ)
-      END IF
-      IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN
-        CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ)
-      END IF
-      IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN
-        CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ)
-      END IF
-      IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN
-        CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ)
-      END IF
-    END IF
-    !
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_SLTBEG,NSV_SLTEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-    IF (LDEPOS_SLT(IMI)) THEN
-      DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
-        IF(NSIZELBXSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-        END IF
-        !
-        IF(NSIZELBYSV_ll /= 0) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-        END IF
-      END DO
-    END IF
-  ENDIF   
-  !
-  ! lagrangian variables
-  IF (NSV_LGEND>=NSV_LGBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LGBEG,NSV_LGEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-!
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-  ! passive pollutants
-  IF (NSV_PPEND>=NSV_PPBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_PPBEG,NSV_PPEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_PP'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_PP'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-  ! conditional sampling
-  IF (NSV_CSEND>=NSV_CSBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_CSBEG,NSV_CSEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_CS'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_CS'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-#ifdef MNH_FOREFIRE
-  ! ForeFire scalar variables
-  IF (NSV_FFEND>=NSV_FFBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_FFBEG,NSV_FFEND
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_FF'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_FF'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
-      END IF
-    END DO
-  END IF
-#endif
 END IF
 !
 !-------------------------------------------------------------------------------
 !
 !
-END SUBROUTINE WRITE_LB_n  
+END SUBROUTINE WRITE_LB_n
diff --git a/src/MNH/write_les_budgetn.f90 b/src/MNH/write_les_budgetn.f90
index 7827ba184b18d710839d63155d807c186b67eb01..cb76368d557662da8392476b6585bb55c43b34b8 100644
--- a/src/MNH/write_les_budgetn.f90
+++ b/src/MNH/write_les_budgetn.f90
@@ -44,7 +44,7 @@ subroutine  Write_les_budget_n( tpdiafile )
 !!      Original   07/02/00
 !!                 06/11/02 (V. Masson) new LES budgets
 !  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfield_metadata_base type
+!  P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type
 !  JL Redelsperger 03/21 modif buoyancy flix for OCEAN LES case  
 ! --------------------------------------------------------------------------
 !
@@ -56,7 +56,7 @@ use modd_cst,         only: xg, xalphaoc
 use modd_dyn_n,       only: locean
 use modd_field,       only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, &
                             NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED,               &
-                            tfield_metadata_base, TYPEREAL
+                            tfieldmetadata_base, TYPEREAL
 use modd_io,          only: tfiledata
 use modd_les,         only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling
 use modd_les_n,       only: nles_times,                                                                                   &
@@ -105,9 +105,9 @@ character(len=:), allocatable          :: ygroupcomment
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET
 !
-logical                    :: gdoavg  ! Compute and store time average
-logical                    :: gdonorm ! Compute and store normalized field
-type(tfield_metadata_base) :: tzfield
+logical                   :: gdoavg  ! Compute and store time average
+logical                   :: gdonorm ! Compute and store normalized field
+type(tfieldmetadata_base) :: tzfield
 !-------------------------------------------------------------------------------
 !
 !*          Initializations
diff --git a/src/MNH/write_les_rt_budgetn.f90 b/src/MNH/write_les_rt_budgetn.f90
index 114d39cda70bc47d713bcfbddc3f550c9a27d491..66df13adebabdf556d771123572774257abae163 100644
--- a/src/MNH/write_les_rt_budgetn.f90
+++ b/src/MNH/write_les_rt_budgetn.f90
@@ -43,7 +43,7 @@ subroutine  Write_les_rt_budget_n( tpdiafile )
 !!    -------------
 !!      Original         06/11/02
 !  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfield_metadata_base type
+!  P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -52,7 +52,7 @@ subroutine  Write_les_rt_budget_n( tpdiafile )
 use modd_cst,         only: xg
 use modd_field,       only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, &
                             NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED,               &
-                            tfield_metadata_base, TYPEREAL
+                            tfieldmetadata_base, TYPEREAL
 use modd_io,          only: tfiledata
 use modd_les,         only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling
 use modd_les_n,       only: nles_times,                                                                                   &
@@ -98,9 +98,9 @@ character(len=:),   allocatable          :: ygroupcomment
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET
 !
-logical                    :: gdoavg  ! Compute and store time average
-logical                    :: gdonorm ! Compute and store normalized field
-type(tfield_metadata_base) :: tzfield
+logical                   :: gdoavg  ! Compute and store time average
+logical                   :: gdonorm ! Compute and store normalized field
+type(tfieldmetadata_base) :: tzfield
 !-------------------------------------------------------------------------------
 !
 !*          Initializations
diff --git a/src/MNH/write_les_sv_budgetn.f90 b/src/MNH/write_les_sv_budgetn.f90
index 6a3997964fff08e950d3de7c18fa1603f5e392ad..8a412845f16ad91b5122ef961529ff316a551f09 100644
--- a/src/MNH/write_les_sv_budgetn.f90
+++ b/src/MNH/write_les_sv_budgetn.f90
@@ -43,7 +43,7 @@ subroutine Write_les_sv_budget_n( tpdiafile )
 !!    -------------
 !!      Original         06/11/02
 !  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet 14/10/2020: restructure Les_diachro calls to use tfield_metadata_base type
+!  P. Wautelet 14/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -53,7 +53,7 @@ use modd_conf_n,      only: luserv
 use modd_cst,         only: xg
 use modd_field,       only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_SV, &
                             NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED,                                      &
-                            tfield_metadata_base, TYPEREAL
+                            tfieldmetadata_base, TYPEREAL
 use modd_io,          only: tfiledata
 use modd_les,         only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling
 use modd_les_n,       only: nles_times,                                                                     &
@@ -99,9 +99,9 @@ character(len=:),   allocatable          :: ygroupcomment
 !
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZLES_BUDGET
 !
-logical                    :: gdoavg  ! Compute and store time average
-logical                    :: gdonorm ! Compute and store normalized field
-type(tfield_metadata_base) :: tzfield
+logical                   :: gdoavg  ! Compute and store time average
+logical                   :: gdonorm ! Compute and store normalized field
+type(tfieldmetadata_base) :: tzfield
 !-------------------------------------------------------------------------------
 !
 !*          Initializations
diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90
index 9b6b326bc92ca2ebae7d62a7019a319903edebc4..2e18f72adf934925770b2fd3bd323df5a37274c7 100644
--- a/src/MNH/write_lesn.f90
+++ b/src/MNH/write_lesn.f90
@@ -7,7 +7,7 @@
 module mode_write_les_n
 !######################
 
-use modd_field, only: tfield_metadata_base
+use modd_field, only: tfieldmetadata_base
 
 implicit none
 
@@ -22,9 +22,9 @@ character(len=:), allocatable :: cgroupcomment
 logical :: ldoavg    ! Compute and store time average
 logical :: ldonorm   ! Compute and store normalized field
 
-type(tfield_metadata_base) :: tfield
-type(tfield_metadata_base) :: tfieldx
-type(tfield_metadata_base) :: tfieldy
+type(tfieldmetadata_base) :: tfield
+type(tfieldmetadata_base) :: tfieldx
+type(tfieldmetadata_base) :: tfieldy
 
 interface Les_diachro_write
   module procedure Les_diachro_write_1D, Les_diachro_write_2D, Les_diachro_write_3D, Les_diachro_write_4D
@@ -71,7 +71,7 @@ subroutine  Write_les_n( tpdiafile )
 !  P. Wautelet 12/10/2020: remove HLES_AVG dummy argument and group all 4 calls
 !  P. Wautelet 13/10/2020: bugfix: correct some names for LES_DIACHRO_2PT diagnostics (Ri)
 !  P. Wautelet 26/10/2020: bugfix: correct some comments and conditions + add missing RES_RTPZ
-!  P. Wautelet 26/10/2020: restructure subroutines to use tfield_metadata_base type
+!  P. Wautelet 26/10/2020: restructure subroutines to use tfieldmetadata_base type
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 7630a9363ae435202b69b151a44a141087196581..3b14e62c4a20b8dd47be2ee4b0b68ec0a63cd3cb 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -1,4 +1,4 @@
-!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.
@@ -145,115 +145,99 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG
 !  P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed
 !  S  Bielli      02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 18/03/2020: remove ICE2 option
-!      B. Vie          06/2020 Add prognostic supersaturation for LIMA
+!  B. Vie         06/2020: Add prognostic supersaturation for LIMA
 !  P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL
 !  J.L Redelsperger 03/2021 Adding OCEAN LES Case and Autocoupled O-A LES 
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_DIM_n
-USE MODD_CONF
-USE MODD_CONF_n
-use modd_field,           only: tfielddata, tfieldlist, TYPEINT, TYPEREAL
-USE MODD_GRID
-USE MODD_GRID_n
-USE MODD_IO, ONLY : TFILEDATA
-USE MODD_METRICS_n
-USE MODD_TIME
-USE MODD_TIME_n
-USE MODD_DYN_n
-USE MODD_FIELD_n
-USE MODD_GR_FIELD_n
-USE MODD_LSFIELD_n
-USE MODD_PARAM_n
-USE MODD_CURVCOR_n
-USE MODD_REF
-USE MODD_REF_n
-USE MODD_LUNIT, ONLY : TLUOUT0
-USE MODD_LUNIT_n
-USE MODD_TURB_n
-USE MODD_RADIATIONS_n
-USE MODD_FRC
-USE MODD_PRECIP_n
-USE MODD_CST
-USE MODD_CLOUDPAR
-USE MODD_DEEP_CONVECTION_n
-USE MODD_PARAM_KAFR_n
-USE MODD_NESTING
-USE MODD_PARAMETERS
+USE MODD_BLOWSNOW,          ONLY: LBLOWSNOW, NBLOWSNOW3D
+USE MODD_BLOWSNOW_n,        ONLY: XSNWSUBL3D
+USE MODD_CH_AERO_n,         ONLY: XN3D, XRG3D, XSIG3D
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n,           ONLY: NEQAQ
+USE MODD_CH_MNHC_n,         ONLY: LCH_CONV_LINOX, LUSECHEM, XRTMIN_AQ
+USE MODD_CONDSAMP,          ONLY: LCONDSAMP
+USE MODD_CONF,              ONLY: CBIBUSER, CEQNSYS, CPROGRAM, L1D, L2D, LCARTESIAN, LFORCING, LPACK, LTHINSHELL, NBUGFIX, NMASDEV
+USE MODD_CONF_n,            ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT, &
+                                  LUSERV,  LUSERC,  LUSERR,  LUSERI,  LUSERS,  LUSERG,  LUSERH,  &
+                                  LUSECI, NRR, NRRI, NRRL
+USE MODD_CST,               ONLY: XALPI, XAVOGADRO, XBETAI, XCI, XCL, XCPD, XCPV, XG, XGAMI, XLSTT, XLVTT, &
+                                  XMD, XMV, XP00, XPI, XRADIUS, XRHOLW, XRD, XRV, XTT
+USE MODD_CSTS_DUST,         ONLY: XDENSITY_DUST, XM3TOUM3, XMOLARWEIGHT_DUST
+USE MODD_CURVCOR_n,         ONLY: XCORIOZ
+USE MODD_DEEP_CONVECTION_n, ONLY: XCG_RATE, XCG_TOTAL_NUMBER, XIC_RATE, XIC_TOTAL_NUMBER, XPACCONV, XPRCONV, XPRSCONV
 USE MODD_DIAG_FLAG
+USE MODD_DIM_n,             ONLY: NIMAX_ll, NJMAX_ll, NKMAX
+USE MODD_DUST,              ONLY: LDEPOS_DST, LDUST, NMODE_DST
+USE MODD_DYN_n,             ONLY: LOCEAN
+use modd_field,             only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
+USE MODD_FIELD_n,           ONLY: XCIT, XCLDFR, XICEFR, XPABSM, XPABST, XRT, XSIGS, XSRCT, XSVT, XTHT, XTKET, XUT, XVT, XWT, XZWS
+USE MODD_FRC,               ONLY: NFRC, XGXTHFRC, XGYTHFRC, XPGROUNDFRC, XRVFRC, XTENDRVFRC, XTENDTHFRC, XTHFRC, XUFRC, XVFRC, XWFRC
+USE MODD_GRID,              ONLY: XBETA, XLAT0, XLATORI, XLON0, XLONORI, XRPK
+USE MODD_GRID_n,            only: LSLEVE, NEXTE_XMIN, NEXTE_YMIN, XHATM_BOUND, &
+                                  XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ
+USE MODD_IO,                ONLY: TFILEDATA
+USE MODD_LSFIELD_n,         ONLY: XLSRVM, XLSTHM, XLSUM, XLSVM, XLSWM
+USE MODD_LUNIT,             ONLY: TLUOUT0
+USE MODD_METRICS_n,         ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
+USE MODD_MPIF
+USE MODD_NESTING,           ONLY: NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL
 USE MODD_NSV
-USE MODD_CH_M9_n,         ONLY : CNAMES, NEQAQ
-USE MODD_RAIN_C2R2_DESCR, ONLY : C2R2NAMES
-USE MODD_ICE_C1R3_DESCR,  ONLY : C1R3NAMES
-USE MODD_ELEC_DESCR, ONLY : CELECNAMES
-USE MODD_RAIN_C2R2_KHKO_PARAM
-USE MODD_ICE_C1R3_PARAM
-USE MODD_PARAM_ICE,       ONLY : LSEDIC
-USE MODD_PARAM_LIMA,      ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,&
-                                 LSCAV, LHHONI, LAERO_MASS,                    &
-                                 LLIMA_DIAG,                                   &
-                                 NSPECIE, XMDIAM_IFN, XSIGMA_IFN, ZFRAC=>XFRAC,&
-                                 XR_MEAN_CCN, XLOGSIG_CCN, NMOM_S, NMOM_G, NMOM_H 
-USE MODD_PARAM_LIMA_WARM, ONLY : CLIMA_WARM_CONC, CAERO_MASS
-USE MODD_PARAM_LIMA_COLD, ONLY : CLIMA_COLD_CONC
-USE MODD_LG,              ONLY : CLGNAMES
-USE MODD_PASPOL,          ONLY : LPASPOL
-USE MODD_CONDSAMP,        ONLY : LCONDSAMP
-!
-USE MODD_DIAG_FLAG
-USE MODD_RADAR, ONLY: XLAT_RAD,XELEV,&
-     XSTEP_RAD,NBRAD,NBELEV,NBAZIM,NBSTEPMAX,&
-     NCURV_INTERPOL,LATT,LCART_RAD,NPTS_H,NPTS_V,XGRID,&
-     LREFR,LDNDZ,NMAX,CNAME_RAD,NDIFF,&
-     XLON_RAD,XALT_RAD,XLAM_RAD,XDT_RAD,LWBSCS,LWREFL
-use modd_precision,       only: MNHREAL_MPI
-!
-USE MODI_RADAR_SIMULATOR
-!
-USE MODD_DUST
-USE MODD_CSTS_DUST
-USE MODD_SALT
-USE MODD_BLOWSNOW
-USE MODD_CH_AEROSOL
-USE MODD_CH_AERO_n
-USE MODD_CH_MNHC_n
-USE MODE_DUST_PSD
-USE MODE_SALT_PSD
-USE MODE_BLOWSNOW_PSD
-USE MODE_AERO_PSD
+USE MODD_PARAMETERS,        ONLY: JPHEXT, JPVEXT, XUNDEF
+USE MODD_PARAM_LIMA_COLD,   ONLY: CLIMA_COLD_CONC
+USE MODD_PARAM_LIMA,        ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, &
+                                  LSCAV, LLIMA_DIAG, NMOM_S, NMOM_G, NMOM_H
+USE MODD_PARAM_LIMA_WARM,   ONLY: CLIMA_WARM_CONC, CAERO_MASS
+USE MODD_PARAM_n,           ONLY: CCLOUD, CDCONV, CELEC, CSURF, CTURB
+USE MODD_PASPOL,            ONLY: LPASPOL
+USE MODD_PRECIP_n,          ONLY: XACDEP, XACPRC, XACPRG, XACPRH, XACPRR, XACPRS, XEVAP3D, &
+                                  XINDEP, XINPRC, XINPRG, XINPRH, XINPRR, XINPRR3D, XINPRS
+use modd_precision,         only: MNHREAL_MPI
+USE MODD_RADAR,             ONLY: CNAME_RAD, LATT, LCART_RAD, LDNDZ, LREFR, LWBSCS, LWREFL,                      &
+                                  NBAZIM, NBELEV, NBRAD, NBSTEPMAX, NCURV_INTERPOL, NDIFF, NMAX, NPTS_H, NPTS_V, &
+                                  XALT_RAD, XDT_RAD, XELEV, XGRID, XLAM_RAD, XLAT_RAD, XLON_RAD, XSTEP_RAD
+USE MODD_REF,               ONLY: LBOUSS, LCOUPLES, XEXNTOP, XEXNTOPO, XRHODREFZ, XRHODREFZO, XTHVREFZ, XTHVREFZO
+USE MODD_REF_n,             ONLY: XEXNREF, XRHODREF, XTHVREF
+USE MODD_SALT,              ONLY: LDEPOS_SLT, LSALT, NMODE_SLT
+USE MODD_TIME,              ONLY: TDTEXP, TDTSEG
+USE MODD_TIME_n,            ONLY: TDTCUR, TDTMOD
+USE MODD_TURB_n,            only: CTOM, XBL_DEPTH
+USE MODD_VAR_ll,            ONLY: NMNH_COMM_WORLD
+
+USE MODE_AERO_PSD,          ONLY: PPP2AERO
+USE MODE_BLOWSNOW_PSD,      ONLY: PPP2SNOW
+USE MODE_DUST_PSD,          ONLY: PPP2DUST
+use mode_field,             only: Find_field_id_from_mnhname
+USE MODE_GRIDPROJ,          ONLY: SM_LATLON
+USE MODE_IO_FIELD_WRITE,    only: IO_Field_write
+USE MODE_IO_FILE,           only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT,  only: IO_File_add2list
+USE MODE_MODELN_HANDLER,    only: GET_CURRENT_MODEL_INDEX
+use mode_msg
+USE MODE_SALT_PSD,          ONLY: PPP2SALT
+USE MODE_THERMO,            ONLY: QSAT, SM_FOES
+USE MODE_TOOLS,             ONLY: UPCASE
+USE MODE_TOOLS_ll,          ONLY: GET_DIM_EXT_ll, GET_INDICE_ll
+
+USE MODI_CALCSOUND
+USE MODI_CLUSTERING
+USE MODI_COMPUTE_MEAN_PRECIP
+USE MODI_CONTRAV
+USE MODI_GPS_ZENITH
 USE MODI_GRADIENT_M
-USE MODI_GRADIENT_W
 USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
-USE MODI_SHUMAN
-USE MODI_RADAR_RAIN_ICE
+USE MODI_GRADIENT_W
 USE MODI_INI_RADAR
-USE MODI_COMPUTE_MEAN_PRECIP
-USE MODI_UV_TO_ZONAL_AND_MERID
-USE MODI_CALCSOUND
-USE MODI_FREE_ATM_PROFILE
-USE MODI_GPS_ZENITH
-USE MODI_CONTRAV
-!
-use mode_field,            only: Find_field_id_from_mnhname
-USE MODE_GRIDPROJ
-USE MODE_GATHER_ll
-USE MODE_IO_FIELD_WRITE,   only: IO_Field_write
-USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
-USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
-USE MODE_ll
-use mode_msg
-USE MODE_THERMO
-USE MODE_TOOLS,            ONLY: UPCASE
-USE MODE_MODELN_HANDLER
 USE MODI_LIDAR
-USE MODI_CLUSTERING
-!
-USE MODD_MPIF
-USE MODD_VAR_ll
+USE MODI_RADAR_RAIN_ICE
+USE MODI_RADAR_SIMULATOR
+USE MODI_SHUMAN
+USE MODI_UV_TO_ZONAL_AND_MERID
 !
 IMPLICIT NONE
 !
@@ -279,11 +263,6 @@ REAL :: ZRV_OV_RD !  XRV / XRD
 REAL :: ZGAMREF   ! Standard atmosphere lapse rate (K/m)
 REAL :: ZX0D      ! work real scalar  
 REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point
-REAL :: ZXHATM, ZYHATM ! conformal    coordinates of 1st mass point
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
-                                                 ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
-                                                 ! plane (array on the complete domain)
 !
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZTEMP
@@ -303,8 +282,8 @@ INTEGER, DIMENSION(:,:), ALLOCATABLE                    :: IWORK1
 integer :: ICURR,INBOUT,IERR
 !
 REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA
-REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_DST*2):: ZSDSTDEP
-REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_SLT*2):: ZSSLTDEP
+REAL,DIMENSION(:,:,:,:), POINTER :: ZSDSTDEP
+REAL,DIMENSION(:,:,:,:), POINTER :: ZSSLTDEP
 REAL,DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSIG_DST, ZRG_DST, ZN0_DST
 REAL,DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSIG_SLT, ZRG_SLT, ZN0_SLT
 REAL,DIMENSION(:,:,:), ALLOCATABLE    :: ZBET_SNW, ZRG_SNW
@@ -332,8 +311,9 @@ CHARACTER(LEN=5)  :: YVIEW   ! Upward or Downward integration
 INTEGER           :: IACCMODE
 !
 !-------------------------------------------------------------------------------
-INTEGER :: IAUX ! work variable 
-REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36, ZW1, ZW2, ZW3
+INTEGER :: IAUX ! work variable
+REAL, DIMENSION(:,:,:), ALLOCATABLE                    :: ZW1, ZW2, ZW3
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2))              :: ZWORK25,ZWORK26
 REAL    :: ZEAU ! Mean precipitable water
 INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2))          ::IKTOP ! level in which is the altitude 3000m
@@ -343,8 +323,8 @@ INTEGER :: ILUOUT0 ! Logical unit number for output-listing
 CHARACTER(LEN=2)  :: INDICE
 CHARACTER(LEN=100) :: YMSG
 INTEGER           :: IID
-TYPE(TFIELDDATA)              :: TZFIELD
-TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2
+TYPE(TFIELDMETADATA)               :: TZFIELD
+TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2
 !
 ! LIMA LIDAR
 REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
@@ -414,13 +394,7 @@ IF (.NOT.LCARTESIAN) THEN
 ! 
 !* diagnostic of 1st mass point
 !
-  ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !//
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !//
-  ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2))
-  ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2))
-  CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
+  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR )
 !
   CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
   CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
@@ -511,16 +485,17 @@ ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
 ZPOVO(:,:,1)  =-1.E+11
 ZPOVO(:,:,IKU)=-1.E+11
 IF (INDEX(CISO,'EV') /= 0) THEN
-  TZFIELD%CMNHNAME   = 'POVOT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'POVOT'
-  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_POtential VOrticity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'POVOT',                     &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = 'POVOT',                     &
+    CUNITS     = 'PVU',                       & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                        &
+    CCOMMENT   = 'X_Y_Z_POtential VOrticity', &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
   CALL IO_Field_write(TPFILE,TZFIELD,ZPOVO)
 END IF
 !
@@ -530,27 +505,29 @@ IF (LVAR_RS) THEN
   CALL IO_Field_write(TPFILE,'VT',XVT)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1)%CMNHNAME   = 'UM_ZM'
-    TZFIELD2(1)%CSTDNAME   = ''
-    TZFIELD2(1)%CLONGNAME  = 'UM_ZM'
-    TZFIELD2(1)%CUNITS     = 'm s-1'
-    TZFIELD2(1)%CDIR       = 'XY'
-    TZFIELD2(1)%CCOMMENT   = 'Zonal component of horizontal wind'
-    TZFIELD2(1)%NGRID      = 2
-    TZFIELD2(1)%NTYPE      = TYPEREAL
-    TZFIELD2(1)%NDIMS      = 3
-    TZFIELD2(1)%LTIMEDEP   = .TRUE.
+    TZFIELD2(1) = TFIELDMETADATA(                        &
+      CMNHNAME   = 'UM_ZM',                              &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'UM_ZM',                              &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'Zonal component of horizontal wind', &
+      NGRID      = 2,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 3,                                    &
+      LTIMEDEP   = .TRUE.                                )
     !
-    TZFIELD2(2)%CMNHNAME   = 'VM_ZM'
-    TZFIELD2(2)%CSTDNAME   = ''
-    TZFIELD2(2)%CLONGNAME  = 'VM_ZM'
-    TZFIELD2(2)%CUNITS     = 'm s-1'
-    TZFIELD2(2)%CDIR       = 'XY'
-    TZFIELD2(2)%CCOMMENT   = 'Meridian component of horizontal wind'
-    TZFIELD2(2)%NGRID      = 3
-    TZFIELD2(2)%NTYPE      = TYPEREAL
-    TZFIELD2(2)%NDIMS      = 3
-    TZFIELD2(2)%LTIMEDEP   = .TRUE.
+    TZFIELD2(2) = TFIELDMETADATA(                           &
+      CMNHNAME   = 'VM_ZM',                                 &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'VM_ZM',                                 &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'Meridian component of horizontal wind', &
+      NGRID      = 3,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
     !
     CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   END IF
@@ -600,7 +577,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
   ! explicit species
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6)
   !
@@ -608,7 +585,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
   CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D)
   !
   CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm'
   CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3)
   !
@@ -616,56 +593,56 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
       CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN 
     IF (SIZE(XINPRC) /= 0 ) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm hour-1'
       CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6)
       !
       CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm'
       CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3)
     END IF 
     IF (SIZE(XINDEP) /= 0 ) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm hour-1'
       CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6)
       !
       CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm'
       CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3)
     END IF 
   END IF 
   IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3)
   !
     IF (SIZE(XINPRH) /= 0 ) THEN
       CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm hour-1'
       CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6)
       !
       CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
-      TZFIELD = TFIELDLIST(IID)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
       TZFIELD%CUNITS = 'mm'
       CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3)
     ENDIF
@@ -676,7 +653,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
     IF (SIZE(XINPRH) /= 0 ) &       
       ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:)
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*3.6E6)
   !
@@ -687,7 +664,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
       ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:)
   !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*1.0E3)
   !
@@ -697,17 +674,17 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
   !
   IF (CDCONV /= 'NONE') THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3)
     !
     CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6)
   END IF
@@ -737,16 +714,17 @@ IF (LVAR_PR ) THEN
     ZWORK23(:,:) = 0.
   END DO
   !* Precipitable water in kg/m**2
-  TZFIELD%CMNHNAME   = 'PRECIP_WAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'PRECIP_WAT'
-  TZFIELD%CUNITS     = 'kg m-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'PRECIP_WAT', &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'PRECIP_WAT', &
+    CUNITS     = 'kg m-2',     &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 1,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
 ENDIF
 !
@@ -815,153 +793,165 @@ IF (LHU_FLX) THEN
     ENDDO
   ENDIF
   ! Ecriture
-  !  composantes U et V du flux surfacique d'humidite 
-  TZFIELD%CMNHNAME   = 'UM90'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'UM90'
-  TZFIELD%CUNITS     = 'kg s-1 m-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 2
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  !  composantes U et V du flux surfacique d'humidite
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'UM90',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'UM90',       &
+    CUNITS     = 'kg s-1 m-2', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 2,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 3,            &
+    LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   !  
-  TZFIELD%CMNHNAME   = 'VM90'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'VM90'
-  TZFIELD%CUNITS     = 'kg s-1 m-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 3
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'VM90',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'VM90',       &
+    CUNITS     = 'kg s-1 m-2', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 3,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 3,            &
+    LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
   !  composantes U et V du flux d'humidite integre sur 3000 metres
-  TZFIELD%CMNHNAME   = 'UM91'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'UM91'
-  TZFIELD%CUNITS     = 'kg s-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 2
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'UM91',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'UM91',       &
+    CUNITS     = 'kg s-1 m-1', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 2,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   !
-  TZFIELD%CMNHNAME   = 'VM91'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'VM91'
-  TZFIELD%CUNITS     = 'kg s-1 m-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = ''
-  TZFIELD%NGRID      = 3
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'VM91',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'VM91',       &
+    CUNITS     = 'kg s-1 m-1', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 3,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   !   Convergence d'humidite
-  TZFIELD%CMNHNAME   = 'HMCONV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HMCONV'
-  TZFIELD%CUNITS     = 'kg s-1 m-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                     &
+    CMNHNAME   = 'HMCONV',                                      &
+    CSTDNAME   = '',                                            &
+    CLONGNAME  = 'HMCONV',                                      &
+    CUNITS     = 'kg s-1 m-3',                                  &
+    CDIR       = 'XY',                                          &
+    CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux', &
+    NGRID      = 1,                                             &
+    NTYPE      = TYPEREAL,                                      &
+    NDIMS      = 3,                                             &
+    LTIMEDEP   = .TRUE.                                         )
   CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35)
   !
   !   Convergence d'humidite integre sur 3000 metres
-  TZFIELD%CMNHNAME   = 'HMCONV3000'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HMCONV3000'
-  TZFIELD%CUNITS     = 'kg s-1 m-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                     &
+    CMNHNAME   = 'HMCONV3000',                                  &
+    CSTDNAME   = '',                                            &
+    CLONGNAME  = 'HMCONV3000',                                  &
+    CUNITS     = 'kg s-1 m-3',                                  &
+    CDIR       = 'XY',                                          &
+    CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux', &
+    NGRID      = 1,                                             &
+    NTYPE      = TYPEREAL,                                      &
+    NDIMS      = 2,                                             &
+    LTIMEDEP   = .TRUE.                                         )
   CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK25)
   !
   IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
     !  composantes U et V du flux surfacique d'hydrometeores  
-    TZFIELD%CMNHNAME   = 'UM92'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'UM92'
-    TZFIELD%CUNITS     = 'kg s-1 m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'UM92',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'UM92',       &
+      CUNITS     = 'kg s-1 m-2', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 2,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     ! 
-    TZFIELD%CMNHNAME   = 'VM92'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VM92'
-    TZFIELD%CUNITS     = 'kg s-1 m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'VM92',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'VM92',       &
+      CUNITS     = 'kg s-1 m-2', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 3,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
     !  composantes U et V du flux d'hydrometeores integre sur 3000 metres
-    TZFIELD%CMNHNAME   = 'UM93'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'UM93'
-    TZFIELD%CUNITS     = 'kg s-1 m-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'UM93',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'UM93',       &
+      CUNITS     = 'kg s-1 m-1', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 2,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 2,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
     ! 
-    TZFIELD%CMNHNAME   = 'VM93'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VM93'
-    TZFIELD%CUNITS     = 'kg s-1 m-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'VM93',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'VM93',       &
+      CUNITS     = 'kg s-1 m-1', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 3,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 2,            &
+      LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24)
     !   Convergence d'hydrometeores
-    TZFIELD%CMNHNAME   = 'HMCONV_TT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'HMCONV_TT'
-    TZFIELD%CUNITS     = 'kg s-1 m-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'HMCONV_TT',                                      &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'HMCONV_TT',                                      &
+      CUNITS     = 'kg s-1 m-3',                                     &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux', &
+      NGRID      = 1,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 3,                                                &
+      LTIMEDEP   = .TRUE.                                            )
     CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36)
     !   Convergence d'hydrometeores integre sur 3000 metres
-    TZFIELD%CMNHNAME   = 'HMCONV3000_TT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'HMCONV3000_TT'
-    TZFIELD%CUNITS     = 'kg s-1 m-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'HMCONV3000_TT',                                  &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'HMCONV3000_TT',                                  &
+      CUNITS     = 'kg s-1 m-3',                                     &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux', &
+      NGRID      = 1,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 2,                                                &
+      LTIMEDEP   = .TRUE.                                            )
     CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK26)
   ENDIF
 ENDIF
@@ -971,12 +961,14 @@ ENDIF
 IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
   IF (NRR >=1) THEN
     ! Moist variables are written individually in file
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                     &
+      CMNHNAME   = 'generic for moist variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                            &
+      CDIR       = 'XY',                          &
+      NGRID      = 1,                             &
+      NTYPE      = TYPEREAL,                      &
+      NDIMS      = 3,                             &
+      LTIMEDEP   = .TRUE.                         )
     IF (LUSERV) THEN
       TZFIELD%CMNHNAME   = 'MRV'
       TZFIELD%CLONGNAME  = 'MRV'
@@ -993,7 +985,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
 !
       TZFIELD%CMNHNAME   = 'VRC'
       TZFIELD%CLONGNAME  = 'VRC'
-      TZFIELD%CUNITS     = '1' !vol/vol
+      TZFIELD%CUNITS     = 'ppv' !vol/vol
       TZFIELD%CCOMMENT   = 'X_Y_Z_VRC (vol/vol)'
       CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3)
     END IF
@@ -1006,7 +998,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
 !
       TZFIELD%CMNHNAME   = 'VRR'
       TZFIELD%CLONGNAME  = 'VRR'
-      TZFIELD%CUNITS     = '1' !vol/vol
+      TZFIELD%CUNITS     = 'ppv' !vol/vol
       TZFIELD%CCOMMENT   = 'X_Y_Z_VRR (vol/vol)'
       CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3)
     END IF
@@ -1050,143 +1042,118 @@ END IF
 ! User scalar variables
 ! individually in the file
 IF (LVAR_MRSV) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'g kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
   DO JSV = 1,NSV_USER
-    WRITE(TZFIELD%CMNHNAME,'(A4,I3.3)')'MRSV',JSV
+    TZFIELD = TSVLIST(JSV)
+    WRITE( TZFIELD%CMNHNAME, '( A4, I3.3 )' ) 'MRSV', JSV
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E3)
+    TZFIELD%CUNITS     = 'g kg-1'
+    WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' ) 'Mixing Ratio for user Scalar Variable', JSV
+    CALL IO_Field_write( TPFILE, TZFIELD, XSVT(:,:,:,JSV) * 1.E3 )
   END DO
 END IF
 ! microphysical C2R2 scheme scalar variables
 IF(LVAR_MRW) THEN
-  IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C2R2BEG,NSV_C2R2END
-      TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      IF (JSV < NSV_C2R2END) THEN
-        TZFIELD%CUNITS     = 'cm-3'
-        ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6
-      ELSE
-        TZFIELD%CUNITS     = 'l-1'
-        ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3
-      END IF
-      WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-    END DO
-  END IF
+  DO JSV = NSV_C2R2BEG,NSV_C2R2END
+    TZFIELD = TSVLIST(JSV)
+   IF (JSV < NSV_C2R2END) THEN
+      TZFIELD%CUNITS     = 'cm-3'
+      ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6
+    ELSE
+      TZFIELD%CUNITS     = 'l-1'
+      ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3
+    END IF
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
   ! microphysical C3R5 scheme additional scalar variables
-  IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-    TZFIELD%CSTDNAME   = ''
+  DO JSV = NSV_C1R3BEG,NSV_C1R3END
+    TZFIELD = TSVLIST(JSV)
     TZFIELD%CUNITS     = 'l-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C1R3BEG,NSV_C1R3END
-      TZFIELD%CMNHNAME   = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3)
-    END DO
-  END IF
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3)
+  END DO
 END IF
 !
 ! microphysical LIMA scheme scalar variables
 !
 IF (LLIMA_DIAG) THEN
   IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(           &
+      CMNHNAME   = 'generic LIMA diag', & !Temporary name to ease identification
+      CDIR       = 'XY',                &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 3,                   &
+      LTIMEDEP   = .TRUE.               )
   END IF
   !
   DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
+!PW: bases sur CLIMA_*_CONC et pas CLIMA_*_NAMES !!!
     !
     TZFIELD%CUNITS     = 'cm-3'
     WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
     !
 ! Nc
     IF (JSV .EQ. NSV_LIMA_NC) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(1))
     END IF
 ! Nr
     IF (JSV .EQ. NSV_LIMA_NR) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(2))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(2))
     END IF
 ! N CCN free
     IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(3))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(3))//INDICE
     END IF
 ! N CCN acti
     IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(4))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(4))//INDICE
     END IF
 ! Scavenging
     IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))
       TZFIELD%CUNITS     = 'kg cm-3'
     END IF
 ! Ni
     IF (JSV .EQ. NSV_LIMA_NI) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(1))
     END IF
 ! Ns
     IF (JSV .EQ. NSV_LIMA_NS) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(2))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(2))
     END IF
 ! Ng
     IF (JSV .EQ. NSV_LIMA_NG) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(3))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(3))
     END IF
 ! Nh
     IF (JSV .EQ. NSV_LIMA_NH) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(4))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(4))
     END IF
 ! N IFN free
     IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))//INDICE
     END IF
 ! N IFN nucl
     IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(6))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(6))//INDICE
     END IF
 ! N IMM nucl
     IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
       WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(7))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(7))//INDICE
     END IF
 ! Hom. freez. of CCN
     IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(8))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(8))
     END IF
     !
-! Supersaturation          
+! Supersaturation
     IF (JSV .EQ. NSV_LIMA_SPRO) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(5))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(5))
     END IF
     !
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
@@ -1195,66 +1162,143 @@ IF (LLIMA_DIAG) THEN
   END DO
 !
   IF (LUSERC) THEN
-    TZFIELD%CMNHNAME   = 'LWC'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWC'
-    TZFIELD%CUNITS     = 'g m-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_LWC'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'LWC',        &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'LWC',        &
+      CUNITS     = 'g m-3',      &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_LWC',  &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
     ZWORK31(:,:,:)=XRT(:,:,:,2)*1.E3*XRHODREF(:,:,:)
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
 !
   IF (LUSERI) THEN
-    TZFIELD%CMNHNAME   = 'IWC'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'IWC'
-    TZFIELD%CUNITS     = 'g m-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_MRI'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(   &
+      CMNHNAME   = 'IWC',       &
+      CSTDNAME   = '',          &
+      CLONGNAME  = 'IWC',       &
+      CUNITS     = 'g m-3',     &
+      CDIR       = 'XY',        &
+      CCOMMENT   = 'X_Y_Z_MRI', &
+      NGRID      = 1,           &
+      NTYPE      = TYPEREAL,    &
+      NDIMS      = 3,           &
+      LTIMEDEP   = .TRUE.       )
     ZWORK31(:,:,:)=XRT(:,:,:,4)*1.E3*XRHODREF(:,:,:)
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
 !
 END IF
+!PW: TODO: a documenter
+IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN
+  DO JSV = NSV_ELECBEG,NSV_ELECEND
+    TZFIELD = TSVLIST(JSV)
+    IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN
+      TZFIELD%CUNITS = 'C m-3'
+      WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
+    ELSE
+      TZFIELD%CUNITS = 'm-3'
+      WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)'
+    END IF
+    ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:)  ! C/kg --> C/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+END IF
+!
+! Lagrangian variables
+IF (LTRAJ) THEN
+  DO JSV = NSV_LGBEG, NSV_LGEND
+    TZFIELD = TSVLIST(JSV)
+    WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
+  END DO
+
+  ! X coordinate
+  DO JK=1,IKU
+    DO JJ=1,IJU
+      ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:)
+    END DO
+  END DO
+
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = 'X',                  &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = 'X',                  &
+    CUNITS     = 'km',                 &
+    CDIR       = 'XY',                 &
+    CCOMMENT   = 'X_Y_Z_X coordinate', &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
+
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+
+  ! Y coordinate
+  DO JK=1,IKU
+    DO JI=1,IIU
+      ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:)
+    END DO
+  END DO
+
+  TZFIELD%CMNHNAME   = 'Y'
+  TZFIELD%CLONGNAME  = 'Y'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_Y coordinate'
+
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+END IF
+!
+! Passive polluant scalar variables
+IF (LPASPOL) THEN
+  ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
+  ALLOCATE(ZTMP(  SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
+!
+!* Density
+!
+  ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD)))
+!
+!* Conversion g/m3.
 !
-! chemical scalar variables in gas phase ppbv
+  ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0
+  !
+  DO JSV = NSV_PPBEG, NSV_PPEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS     = 'g m-3'
+
+    ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTMP)
+  END DO
+
+  DEALLOCATE(ZTMP)
+  DEALLOCATE(ZRHOT)
+END IF
+! Conditional sampling variables
+IF (LCONDSAMP) THEN
+!PW: TODO: a documenter!!!
+  DO JSV = NSV_CSBEG, NSV_CSEND
+    TZFIELD = TSVLIST(JSV)
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
+  END DO
+END IF
+! chemical scalar variables in gas phase ppb
 IF (LCHEMDIAG) THEN
   DO JSV = NSV_CHGSBEG,NSV_CHGSEND
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ppbv'
-    TZFIELD%CDIR       = 'XY'
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
   END DO
 END IF
 IF (LCHAQDIAG) THEN    !aqueous concentration in M
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'M'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
   ZWORK31(:,:,:)=0.
   DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2   !cloud water
-    TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV
     WHERE(((XRT(:,:,:,2)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
       ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,2))
@@ -1264,17 +1308,22 @@ IF (LCHAQDIAG) THEN    !aqueous concentration in M
   !
   ZWORK31(:,:,:)=0.
   DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND    !rain water
-    TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV
     WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
       ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3))
     ENDWHERE
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END DO
+
+
+
+!PW: TODO: LCHICDIAG n'existe pas => les variables correspondantes ne sont pas ecrites...
+
 !  ZWORK31(:,:,:)=0.
 !  DO JSV = NSV_CHICBEG,NSV_CHICEND   ! ice phase
-!    TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
+!    TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))
 !    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
 !    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHIC',JSV,' (M)'
 !    WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
@@ -1283,317 +1332,222 @@ IF (LCHAQDIAG) THEN    !aqueous concentration in M
 !    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !  END DO
 END IF
-
-! Passive polluant scalar variables
-IF (LPASPOL) THEN
-  ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
-  ALLOCATE(ZTMP(  SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
-!
-!*	Density                                          
-!
-  ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD)))
-!
-!*	Conversion g/m3.
-!
-  ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'g m-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = 1,NSV_PP
-    ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV+NSV_PPBEG-1)*ZRHOT(:,:,:) )
-    WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'PPT',JSV
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_write(TPFILE,TZFIELD,ZTMP)
-  END DO
-  DEALLOCATE(ZTMP)
-  DEALLOCATE(ZRHOT)
-END IF
-! Conditional sampling variables
-IF (LCONDSAMP) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_CSBEG,NSV_CSEND
-    WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'CST',JSV
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-  END DO
-END IF
-!
-!  Blowing snow variables
-!
-IF(LBLOWSNOW) THEN
-  TZFIELD%CMNHNAME   = 'SNWSUBL3D'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'kg m-3 s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_INstantaneous 3D Drifting snow sublimation flux'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:))
-  !
-  ZWORK21(:,:) = 0.
-  DO JK = IKB,IKE
-    ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * &
-                  (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24
+! Aerosol
+IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
+  DO JSV = NSV_AERBEG, NSV_AEREND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
   END DO
-  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
-  !
-  TZFIELD%CMNHNAME   = 'COL_SNWSUBL'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'mm day-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Column Sublimation Rate (mmSWE/day)'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
-  !
-  IF(.NOT.ALLOCATED(ZBET_SNW)) &
-        ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
-  IF(.NOT.ALLOCATED(ZRG_SNW))  &
-    ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
-  IF(.NOT.ALLOCATED(ZMA_SNW))  &
-    ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D))
-  !
-  CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,&
-               PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW)
-  !
-  TZFIELD%CMNHNAME   = 'SNWRGA'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'RG (mean) SNOW'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:))
-  !
-  TZFIELD%CMNHNAME   = 'SNWBETA'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'BETA SNOW'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:))
-  !
-  TZFIELD%CMNHNAME   = 'SNWNOA'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'm-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'NUM CONC SNOW (#/m3)'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1))
-  !
-  TZFIELD%CMNHNAME   = 'SNWMASS'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'kg m-3'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'MASS CONC SNOW'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2))
   !
-  ZWORK21(:,:) = 0.
-  DO JK = IKB,IKE
-    ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * &
-                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
-  END DO
-  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
-  TZFIELD%CMNHNAME   = 'THDS'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = 'mm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_THickness of Drifting Snow (mm SWE)'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
-END IF
-! Lagrangian variables
-IF (LTRAJ) THEN
-  TZFIELD%CSTDNAME   = ''
-  !PW TODO: check units
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  IF (.NOT.(ASSOCIATED(XN3D)))   &
+    ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XRG3D)))  &
+    ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XSIG3D))) &
+    ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
   !
-  DO JSV = NSV_LGBEG,NSV_LGEND
-    TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
+  CALL  PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, &
+                 PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA)
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for aerosol modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  DO JJ=1,JPMODE
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV,' (M)'
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-  END DO
-  ! X coordinate
-  DO JK=1,IKU
-    DO JJ=1,IJU
-      DO JI=1,IIU-1
-       ZWORK31(JI,JJ,JK)=0.5*(XXHAT(JI)+XXHAT(JI+1))
-      END DO
-      ZWORK31(IIU,JJ,JK)=2.*ZWORK31(IIU-1,JJ,JK) - ZWORK31(IIU-2,JJ,JK)
-    END DO
-  END DO
-  TZFIELD%CMNHNAME   = 'X'
-  TZFIELD%CLONGNAME  = 'X'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_X coordinate'
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-  ! Y coordinate
-  DO JK=1,IKU
-    DO JI=1,IIU
-      DO JJ=1,IJU-1
-        ZWORK31(JI,JJ,JK)=0.5*(XYHAT(JJ)+XYHAT(JJ+1))
-      END DO
-      ZWORK31(JI,IJU,JK)=2.*ZWORK31(JI,IJU-1,JK) - ZWORK31(JI,IJU-2,JK)
-    END DO
-  END DO
-  TZFIELD%CMNHNAME   = 'Y'
-  TZFIELD%CLONGNAME  = 'Y'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Y coordinate'
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-END IF
-! linox scalar variables
-IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
-  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-    TZFIELD%CMNHNAME   = 'LINOXT'
-    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ppbv'
-    TZFIELD%CDIR       = 'XY'
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','LNOX',JSV
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
-  END DO
-END IF
-IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_ELECBEG,NSV_ELECEND
-    TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ
+    ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN 
-      TZFIELD%CUNITS     = 'C m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-    ELSE
-      TZFIELD%CUNITS     = 'm-3'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
+    TZFIELD%CUNITS     = 'cm-3'
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = '1'
+    WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ))
+    !
+    IF (NSOA .EQ. 10) THEN
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ))
     END IF
-    ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:)  ! C/kg --> C/m3
-    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-  END DO
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ))
+  ENDDO
 END IF
-! Sea Salt variables
-IF (LSALT) THEN
-  IF(.NOT.ALLOCATED(ZSIG_SLT)) &
-    ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
-  IF(.NOT.ALLOCATED(ZRG_SLT))  &
-    ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
-  IF(.NOT.ALLOCATED(ZN0_SLT))  &
-    ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+! Dust variables
+IF (LDUST) THEN
+  IF(.NOT.ALLOCATED(ZSIG_DST)) &
+    ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
+  IF(.NOT.ALLOCATED(ZRG_DST))  &
+    ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
+  IF(.NOT.ALLOCATED(ZN0_DST))  &
+    ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
   !
-  DO JSV = NSV_SLTBEG,NSV_SLTEND
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALT',JSV
+  DO JSV = NSV_DSTBEG, NSV_DSTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
   END DO
   !
-  CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,&
-               PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT)
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JJ=1,NMODE_SLT
-    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ
+  CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,&
+               PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST)
+
+  TZFIELD = TFIELDMETADATA(                &
+    CMNHNAME   = 'generic for dust modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 3,                        &
+    LTIMEDEP   = .TRUE.                    )
+
+  DO JJ=1,NMODE_DST
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ))
+    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ
-    ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2))
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ
+    ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !
-    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'm-3'
-    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ))
+    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = '1'
-    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ))
-    !SALT MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ))
+    !DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'ug m-3'
     WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ
-    ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
-       * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 &  !um-->m
-       * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+    ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
+       * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 &  !um-->m
+       * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-    !SALT BURDEN (g/m2)
+    !DUST BURDEN (g/m2)
     ZWORK21(:,:)=0.0
     DO JK=IKB,IKE
       ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK))      &
@@ -1606,7 +1560,7 @@ IF (LSALT) THEN
         ENDDO
       ENDDO
     ENDDO
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'g m-2'
     WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ
@@ -1616,33 +1570,33 @@ IF (LSALT) THEN
     TZFIELD%NDIMS      = 3
   ENDDO
 END IF
-IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
-  !
-  ZSSLTDEP=XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND)
+IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
+  DO JSV = NSV_DSTBEG, NSV_DSTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  ZSDSTDEP => XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND)
   !
-  DO JSV = 1,NSV_SLTDEP
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CDESLTNAMES(JSV)))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALTDEP',JSV
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSSLTDEP(:,:,:,JSV)*1.E9)
-  END DO
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for dustdep modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
   !
-  DO JJ=1,NMODE_SLT
+  DO JJ=1,NMODE_DST
     ! FOR CLOUDS
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ
     TZFIELD%CUNITS     = 'm-3'
     ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
-    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
+    ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
                      *(XMOLARWEIGHT_DUST/XMD)   &!==>kg_{aer}/kg_{air}
                      *XRHODREF(:,:,:)           &!==>kg_{aer}/m3_{air}
                      /XDENSITY_DUST             &!==>m3_{aer}/m3_{air}
@@ -1650,45 +1604,45 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
                      /(XPI*4./3.)                !==>um3_{aer}/m3_{air}
             !==>volume 3rd moment
     !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
-    ZWORK31(:,:,:) =  ZWORK31(:,:,:)/                        &
-                      ((ZRG_SLT(:,:,:,JJ)**3)*               &
-                      EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
+    ZWORK31(:,:,:)=  ZWORK31(:,:,:)/      &
+                    ((ZRG_DST(:,:,:,JJ)**3)*      &
+                    EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
     !CLOUD: RETURN TO CONCENTRATION #/m3
     ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
-                    (XAVOGADRO*XRHODREF(:,:,:))
+                     (XAVOGADRO*XRHODREF(:,:,:))
     !CLOUD:  Get number concentration (#/molec_{air}==>#/m3)
-    ZWORK31(:,:,:)=                   &
-                    ZWORK31(:,:,:)    & !#/molec_{air}
-                    * XAVOGADRO       & !==>#/mole
-                    / XMD             & !==>#/kg_{air}
-                    * XRHODREF(:,:,:)   !==>#/m3
+    ZWORK31(:,:,:)=                         &
+                    ZWORK31(:,:,:)                  & !#/molec_{air}
+                    * XAVOGADRO                     & !==>#/mole
+                    / XMD                           & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)                 !==>#/m3
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     ! CLOUD:   DUST MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ
     TZFIELD%CUNITS     = 'ug m-3'
     ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
-                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
-                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+          * (ZRG_DST(:,:,:,JJ)**3)*1.d-18               &  !um-->m
+          * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !   FOR RAIN DROPS
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST
     TZFIELD%CUNITS     = 'm-3'
     ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
-    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT)  &!==>molec_{aer}/molec_{air}
-                     *(XMOLARWEIGHT_DUST/XMD)      &!==>kg_{aer}/kg_{air}
-                     *XRHODREF(:,:,:)              &!==>kg_{aer}/m3_{air}
-                     /XDENSITY_DUST                &!==>m3_{aer}/m3_{air}
-                     *XM3TOUM3                     &!==>um3_{aer}/m3_{air}
-                     /(XPI*4./3.)                   !==>um3_{aer}/m3_{air}
-            !==>volume 3rd moment   
+    ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST)  &!==>molec_{aer}/molec_{air}
+            *(XMOLARWEIGHT_DUST/XMD)             &!==>kg_{aer}/kg_{air}
+            *XRHODREF(:,:,:)                     &!==>kg_{aer}/m3_{air}
+            *(1.d0/XDENSITY_DUST)                &!==>m3_{aer}/m3_{air}
+            *XM3TOUM3                            &!==>um3_{aer}/m3_{air}
+            /(XPI*4./3.)                          !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
     !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
-    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                        &
-                    ((ZRG_SLT(:,:,:,JJ)**3)*               &
-                    EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                 &
+             ((ZRG_DST(:,:,:,JJ)**3)*               &
+              EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
     !RAIN: RETURN TO CONCENTRATION #/m3
     ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
                     (XAVOGADRO*XRHODREF(:,:,:))
@@ -1700,78 +1654,82 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
                     * XRHODREF(:,:,:)   !==>#/m3
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     ! RAIN:   DUST MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST
     TZFIELD%CUNITS     = 'ug m-3'
     ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
-                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
-                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+                    * (ZRG_DST(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END DO
+
+  ZSDSTDEP => NULL()
 !
 END IF
-! Dust variables
-IF (LDUST) THEN
-  IF(.NOT.ALLOCATED(ZSIG_DST)) &
-    ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
-  IF(.NOT.ALLOCATED(ZRG_DST))  &
-    ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
-  IF(.NOT.ALLOCATED(ZN0_DST))  &
-    ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
-  !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+! Sea Salt variables
+IF (LSALT) THEN
+  IF(.NOT.ALLOCATED(ZSIG_SLT)) &
+    ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
+  IF(.NOT.ALLOCATED(ZRG_SLT))  &
+    ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
+  IF(.NOT.ALLOCATED(ZN0_SLT))  &
+    ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
   !
-  DO JSV = NSV_DSTBEG,NSV_DSTEND
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV
+  DO JSV = NSV_SLTBEG, NSV_SLTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
   END DO
   !
-  CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,&
-               PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST)
-  DO JJ=1,NMODE_DST
-    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ
+  CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,&
+               PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT)
+  !
+  TZFIELD = TFIELDMETADATA(                &
+    CMNHNAME   = 'generic for salt modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 3,                        &
+    LTIMEDEP   = .TRUE.                    )
+  !
+  DO JJ=1,NMODE_SLT
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ))
+    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ
-    ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2))
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ
+    ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !
-    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'm-3'
-    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ))
+    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ))
     !
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = '1'
-    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ))
-    !DUST MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ))
+    !SALT MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'ug m-3'
     WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ
-    ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
-       * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 &  !um-->m
-       * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+    ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
+       * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 &  !um-->m
+       * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-    !DUST BURDEN (g/m2)
+    !SALT BURDEN (g/m2)
     ZWORK21(:,:)=0.0
     DO JK=IKB,IKE
       ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK))      &
@@ -1784,7 +1742,7 @@ IF (LDUST) THEN
         ENDDO
       ENDDO
     ENDDO
-    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = 'g m-2'
     WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ
@@ -1794,33 +1752,34 @@ IF (LDUST) THEN
     TZFIELD%NDIMS      = 3
   ENDDO
 END IF
-IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
+IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
   !
-  ZSDSTDEP=XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND)
+  DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  ZSSLTDEP => XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND)
   !
-  DO JSV = 1,NSV_DSTDEP
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CDEDSTNAMES(JSV)))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUSTDEP',JSV
-    CALL IO_Field_write(TPFILE,TZFIELD,ZSDSTDEP(:,:,:,JSV)*1.E9)
-  END DO
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for saltdep modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
   !
-  DO JJ=1,NMODE_DST
+  DO JJ=1,NMODE_SLT
     ! FOR CLOUDS
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ
     TZFIELD%CUNITS     = 'm-3'
     ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
-    ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
+    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
                      *(XMOLARWEIGHT_DUST/XMD)   &!==>kg_{aer}/kg_{air}
                      *XRHODREF(:,:,:)           &!==>kg_{aer}/m3_{air}
                      /XDENSITY_DUST             &!==>m3_{aer}/m3_{air}
@@ -1828,45 +1787,45 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
                      /(XPI*4./3.)                !==>um3_{aer}/m3_{air}
             !==>volume 3rd moment
     !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
-    ZWORK31(:,:,:)=  ZWORK31(:,:,:)/      &
-                    ((ZRG_DST(:,:,:,JJ)**3)*      &
-                    EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
+    ZWORK31(:,:,:) =  ZWORK31(:,:,:)/                        &
+                      ((ZRG_SLT(:,:,:,JJ)**3)*               &
+                      EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
     !CLOUD: RETURN TO CONCENTRATION #/m3
     ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
-                     (XAVOGADRO*XRHODREF(:,:,:))
+                    (XAVOGADRO*XRHODREF(:,:,:))
     !CLOUD:  Get number concentration (#/molec_{air}==>#/m3)
-    ZWORK31(:,:,:)=                         &
-                    ZWORK31(:,:,:)                  & !#/molec_{air}
-                    * XAVOGADRO                     & !==>#/mole
-                    / XMD                           & !==>#/kg_{air}
-                    * XRHODREF(:,:,:)                 !==>#/m3  
+    ZWORK31(:,:,:)=                   &
+                    ZWORK31(:,:,:)    & !#/molec_{air}
+                    * XAVOGADRO       & !==>#/mole
+                    / XMD             & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)   !==>#/m3
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     ! CLOUD:   DUST MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ
     TZFIELD%CUNITS     = 'ug m-3'
     ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
-          * (ZRG_DST(:,:,:,JJ)**3)*1.d-18               &  !um-->m
-          * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !   FOR RAIN DROPS
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT
     TZFIELD%CUNITS     = 'm-3'
     ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
-    ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST)  &!==>molec_{aer}/molec_{air}
-            *(XMOLARWEIGHT_DUST/XMD)             &!==>kg_{aer}/kg_{air}
-            *XRHODREF(:,:,:)                     &!==>kg_{aer}/m3_{air}
-            *(1.d0/XDENSITY_DUST)                &!==>m3_{aer}/m3_{air}
-            *XM3TOUM3                            &!==>um3_{aer}/m3_{air}
-            /(XPI*4./3.)                          !==>um3_{aer}/m3_{air}
-            !==>volume 3rd moment   
+    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT)  &!==>molec_{aer}/molec_{air}
+                     *(XMOLARWEIGHT_DUST/XMD)      &!==>kg_{aer}/kg_{air}
+                     *XRHODREF(:,:,:)              &!==>kg_{aer}/m3_{air}
+                     /XDENSITY_DUST                &!==>m3_{aer}/m3_{air}
+                     *XM3TOUM3                     &!==>um3_{aer}/m3_{air}
+                     /(XPI*4./3.)                   !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
     !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
-    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                 &
-             ((ZRG_DST(:,:,:,JJ)**3)*               &
-              EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                        &
+                    ((ZRG_SLT(:,:,:,JJ)**3)*               &
+                    EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
     !RAIN: RETURN TO CONCENTRATION #/m3
     ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
                     (XAVOGADRO*XRHODREF(:,:,:))
@@ -1878,167 +1837,146 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
                     * XRHODREF(:,:,:)   !==>#/m3
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     ! RAIN:   DUST MASS CONCENTRATION
-    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT
     TZFIELD%CUNITS     = 'ug m-3'
     ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
-                    * (ZRG_DST(:,:,:,JJ)**3)*1.d-18     &  !um-->m
-                    * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END DO
+
+  ZSSLTDEP => NULL()
 !
 END IF
-! Aerosol
-IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+!
+!  Blowing snow variables
+!
+IF(LBLOWSNOW) THEN
+!PW:TODO?:variables scalaires XSVT pas ecrites ici. Voulu?
+  TZFIELD = TFIELDMETADATA(                                             &
+    CMNHNAME   = 'SNWSUBL3D',                                           &
+    CSTDNAME   = '',                                                    &
+    CLONGNAME  = 'SNWSUBL3D',                                           &
+    CUNITS     = 'kg m-3 s-1',                                          &
+    CDIR       = 'XY',                                                  &
+    CCOMMENT   = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', &
+    NGRID      = 1,                                                     &
+    NTYPE      = TYPEREAL,                                              &
+    NDIMS      = 3,                                                     &
+    LTIMEDEP   = .TRUE.                                                 )
+  CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:))
   !
-  DO JSV = NSV_AERBEG,NSV_AEREND
-    TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  ZWORK21(:,:) = 0.
+  DO JK = IKB,IKE
+    ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * &
+                  (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24
   END DO
+  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
   !
-  IF (.NOT.(ASSOCIATED(XN3D)))   &
-    ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
-  IF (.NOT.(ASSOCIATED(XRG3D)))  &
-    ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
-  IF (.NOT.(ASSOCIATED(XSIG3D))) &
-    ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'COL_SNWSUBL',                             &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'COL_SNWSUBL',                             &
+    CUNITS     = 'mm day-1',                                &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_Column Sublimation Rate (mmSWE/day)', &
+    NGRID      = 4,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
   !
-  CALL  PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, &
-                 PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) 
-  DO JJ=1,JPMODE
-    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ
-    TZFIELD%CLONGNAME  = 'RGA'
-    TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ
-    TZFIELD%CLONGNAME  = 'RGAM'
-    TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ
-    ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2))
-    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'cm-3'
-    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6)
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = '1'
-    WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ))
-    !
-    IF (NSOA .EQ. 10) THEN
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ))
-      !
-      WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ug m-3'
-      WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ
-      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ))
-    END IF
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ))
-    !
-    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ug m-3'
-    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ))
-  ENDDO
+  IF(.NOT.ALLOCATED(ZBET_SNW)) &
+        ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
+  IF(.NOT.ALLOCATED(ZRG_SNW))  &
+    ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
+  IF(.NOT.ALLOCATED(ZMA_SNW))  &
+    ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D))
+  !
+  CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,&
+               PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW)
+  !
+  TZFIELD = TFIELDMETADATA(        &
+    CMNHNAME   = 'SNWRGA',         &
+    CSTDNAME   = '',               &
+    CLONGNAME  = 'SNWRGA',         &
+    CUNITS     = 'm',              &
+    CDIR       = 'XY',             &
+    CCOMMENT   = 'RG (mean) SNOW', &
+    NGRID      = 1,                &
+    NTYPE      = TYPEREAL,         &
+    NDIMS      = 3,                &
+    LTIMEDEP   = .TRUE.            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:))
+  !
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'SNWBETA',   &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'SNWBETA',   &
+    CUNITS     = 'm',         &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'BETA SNOW', &
+    NGRID      = 1,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .TRUE.       )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:))
+  !
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = 'SNWNOA',               &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = 'SNWNOA',               &
+    CUNITS     = 'm-3',                  &
+    CDIR       = 'XY',                   &
+    CCOMMENT   = 'NUM CONC SNOW (#/m3)', &
+    NGRID      = 1,                      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .TRUE.                  )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1))
+  !
+  TZFIELD = TFIELDMETADATA(        &
+    CMNHNAME   = 'SNWMASS',        &
+    CSTDNAME   = '',               &
+    CLONGNAME  = 'SNWMASS',        &
+    CUNITS     = 'kg m-3',         &
+    CDIR       = 'XY',             &
+    CCOMMENT   = 'MASS CONC SNOW', &
+    NGRID      = 1,                &
+    NTYPE      = TYPEREAL,         &
+    NDIMS      = 3,                &
+    LTIMEDEP   = .TRUE.            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2))
+  !
+  ZWORK21(:,:) = 0.
+  DO JK = IKB,IKE
+    ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+  END DO
+  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'THDS',                                    &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'THDS',                                    &
+    CUNITS     = 'mm',                                      &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_THickness of Drifting Snow (mm SWE)', &
+    NGRID      = 4,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
+END IF
+! linox scalar variables
+IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
+  DO JSV = NSV_LNOXBEG, NSV_LNOXEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
 END IF
 !
 !* Large Scale variables
@@ -2048,27 +1986,29 @@ IF (LVAR_LS) THEN
   CALL IO_Field_write(TPFILE,'LSVM', XLSVM)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1)%CMNHNAME   = 'LSUM_ZM'
-    TZFIELD2(1)%CSTDNAME   = ''
-    TZFIELD2(1)%CLONGNAME  = 'LSUM_ZM'
-    TZFIELD2(1)%CUNITS     = 'm s-1'
-    TZFIELD2(1)%CDIR       = 'XY'
-    TZFIELD2(1)%CCOMMENT   = 'Large Scale Zonal component of horizontal wind'
-    TZFIELD2(1)%NGRID      = 2
-    TZFIELD2(1)%NTYPE      = TYPEREAL
-    TZFIELD2(1)%NDIMS      = 3
-    TZFIELD2(1)%LTIMEDEP   = .TRUE.
+    TZFIELD2(1) = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'LSUM_ZM',                                        &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'LSUM_ZM',                                        &
+      CUNITS     = 'm s-1',                                          &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'Large Scale Zonal component of horizontal wind', &
+      NGRID      = 2,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 3,                                                &
+      LTIMEDEP   = .TRUE.                                            )
     !
-    TZFIELD2(2)%CMNHNAME   = 'LSVM_ZM'
-    TZFIELD2(2)%CSTDNAME   = ''
-    TZFIELD2(2)%CLONGNAME  = 'LSVM_ZM'
-    TZFIELD2(2)%CUNITS     = 'm s-1'
-    TZFIELD2(2)%CDIR       = 'XY'
-    TZFIELD2(2)%CCOMMENT   = 'Large Scale Meridian component of horizontal wind'
-    TZFIELD2(2)%NGRID      = 3
-    TZFIELD2(2)%NTYPE      = TYPEREAL
-    TZFIELD2(2)%NDIMS      = 3
-    TZFIELD2(2)%LTIMEDEP   = .TRUE.
+    TZFIELD2(2) = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'LSVM_ZM',                                           &
+      CSTDNAME   = '',                                                  &
+      CLONGNAME  = 'LSVM_ZM',                                           &
+      CUNITS     = 'm s-1',                                             &
+      CDIR       = 'XY',                                                &
+      CCOMMENT   = 'Large Scale Meridian component of horizontal wind', &
+      NGRID      = 3,                                                   &
+      NTYPE      = TYPEREAL,                                            &
+      NDIMS      = 3,                                                   &
+      LTIMEDEP   = .TRUE.                                               )
     !
     CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ENDIF
@@ -2078,7 +2018,7 @@ IF (LVAR_LS) THEN
 !
   IF (LUSERV) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'g kg-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XLSRVM(:,:,:)*1.E3)
   END IF
@@ -2091,124 +2031,134 @@ IF (LVAR_FRC .AND. LFORCING) THEN
   DO JT=1,NFRC
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD%CMNHNAME   = 'UFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Zonal component of horizontal forcing wind'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'UFRC'//YFRC,                                 &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'UFRC'//YFRC,                                 &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = '--',                                         &
+      CCOMMENT   = 'Zonal component of horizontal forcing wind', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 1,                                            &
+      LTIMEDEP   = .FALSE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'VFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Meridian component of horizontal forcing wind'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'VFRC'//YFRC,                                    &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'VFRC'//YFRC,                                    &
+      CUNITS     = 'm s-1',                                         &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Meridian component of horizontal forcing wind', &
+      NGRID      = 1,                                               &
+      NTYPE      = TYPEREAL,                                        &
+      NDIMS      = 1,                                               &
+      LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'WFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Vertical forcing wind'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'WFRC'//YFRC,            &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'WFRC'//YFRC,            &
+      CUNITS     = 'm s-1',                 &
+      CDIR       = '--',                    &
+      CCOMMENT   = 'Vertical forcing wind', &
+      NGRID      = 4,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 1,                       &
+      LTIMEDEP   = .FALSE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'THFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'THFRC'//YFRC,                   &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'THFRC'//YFRC,                   &
+      CUNITS     = 'K',                             &
+      CDIR       = '--',                            &
+      CCOMMENT   = 'Forcing potential temperature', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 1,                               &
+      LTIMEDEP   = .FALSE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'RVFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing vapor mixing ratio'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'RVFRC'//YFRC,                &
+      CSTDNAME   = '',                           &
+      CLONGNAME  = 'RVFRC'//YFRC,                &
+      CUNITS     = 'kg kg-1',                    &
+      CDIR       = '--',                         &
+      CCOMMENT   = 'Forcing vapor mixing ratio', &
+      NGRID      = 1,                            &
+      NTYPE      = TYPEREAL,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .FALSE.                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
+      CUNITS     = 'K s-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature tendency for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDRVFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1 s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                             &
+      CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
+      CSTDNAME   = '',                                                    &
+      CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
+      CUNITS     = 'kg kg-1 s-1',                                         &
+      CDIR       = '--',                                                  &
+      CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing', &
+      NGRID      = 1,                                                     &
+      NTYPE      = TYPEREAL,                                              &
+      NDIMS      = 1,                                                     &
+      LTIMEDEP   = .FALSE.                                                )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'GXTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K m-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature gradient for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'GYTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K m-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature gradient for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'PGROUNDFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'Pa'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing ground pressure'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
+      CUNITS     = 'Pa',                      &
+      CDIR       = '--',                      &
+      CCOMMENT   = 'Forcing ground pressure', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 0,                         &
+      LTIMEDEP   = .FALSE.                    )
     CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT))
 !
   END DO
@@ -2221,23 +2171,24 @@ END IF
 IF (LTPZH .OR. LCOREF) THEN
 !
 !* Temperature in celsius
-  TZFIELD%CMNHNAME   = 'TEMP'
-  TZFIELD%CSTDNAME   = 'air_temperature'
-  TZFIELD%CLONGNAME  = 'TEMP'
-  TZFIELD%CUNITS     = 'celsius'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_TEMPerature'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'TEMP',              &
+    CSTDNAME   = 'air_temperature',   &
+    CLONGNAME  = 'TEMP',              &
+    CUNITS     = 'celsius',           &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_TEMPerature', &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
   ZWORK31(:,:,:)=ZTEMP(:,:,:) - XTT
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
 !* Pressure in hPa        
   CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
-  TZFIELD%CMNHNAME   = 'PRES'
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'PRES'
   TZFIELD%CUNITS = 'hPa'
   CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2)
 !
@@ -2260,28 +2211,30 @@ IF (LTPZH .OR. LCOREF) THEN
       END WHERE
     END IF
     !
-    TZFIELD%CMNHNAME   = 'REHU'
-    TZFIELD%CSTDNAME   = 'relative_humidity'
-    TZFIELD%CLONGNAME  = 'REHU'
-    TZFIELD%CUNITS     = 'percent'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_RElative HUmidity'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'REHU',                    &
+      CSTDNAME   = 'relative_humidity',       &
+      CLONGNAME  = 'REHU',                    &
+      CUNITS     = 'percent',                 &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Z_RElative HUmidity', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      LTIMEDEP   = .TRUE.                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
-    TZFIELD%CMNHNAME   = 'VPRES'
-    TZFIELD%CSTDNAME   = 'water_vapor_partial_pressure_in_air'
-    TZFIELD%CLONGNAME  = 'VPRES'
-    TZFIELD%CUNITS     = 'hPa'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Vapor PRESsure'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'VPRES',                               &
+      CSTDNAME   = 'water_vapor_partial_pressure_in_air', &
+      CLONGNAME  = 'VPRES',                               &
+      CUNITS     = 'hPa',                                 &
+      CDIR       = 'XY',                                  &
+      CCOMMENT   = 'X_Y_Z_Vapor PRESsure',                &
+      NGRID      = 1,                                     &
+      NTYPE      = TYPEREAL,                              &
+      NDIMS      = 3,                                     &
+      LTIMEDEP   = .TRUE.                                 )
     ZWORK33(:,:,:)=ZWORK33(:,:,:)*ZWORK32(:,:,:)*1E-4
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     !
@@ -2289,29 +2242,31 @@ IF (LTPZH .OR. LCOREF) THEN
       ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2                &
                             +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) &
                       -6*ZWORK33(:,:,:)                        )/ZTEMP(:,:,:)
-      TZFIELD%CMNHNAME   = 'COREF'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = 'COREF'
-      TZFIELD%CUNITS     = '1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_REFraction COindex (N-units)'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                            &
+        CMNHNAME   = 'COREF',                              &
+        CSTDNAME   = '',                                   &
+        CLONGNAME  = 'COREF',                              &
+        CUNITS     = '1',                                  &
+        CDIR       = 'XY',                                 &
+        CCOMMENT   = 'X_Y_Z_REFraction COindex (N-units)', &
+        NGRID      = 1,                                    &
+        NTYPE      = TYPEREAL,                             &
+        NDIMS      = 3,                                    &
+        LTIMEDEP   = .TRUE.                                )
       CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
       !
       ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS
-      TZFIELD%CMNHNAME   = 'MCOREF'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = 'MCOREF'
-      TZFIELD%CUNITS     = '1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_Modified REFraction COindex (M-units)'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                                     &
+        CMNHNAME   = 'MCOREF',                                      &
+        CSTDNAME   = '',                                            &
+        CLONGNAME  = 'MCOREF',                                      &
+        CUNITS     = '1',                                           &
+        CDIR       = 'XY',                                          &
+        CCOMMENT   = 'X_Y_Z_Modified REFraction COindex (M-units)', &
+        NGRID      = 1,                                             &
+        NTYPE      = TYPEREAL,                                      &
+        NDIMS      = 3,                                             &
+        LTIMEDEP   = .TRUE.                                         )
       CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     END IF
   ELSE
@@ -2343,16 +2298,17 @@ IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN
 !
   IF (LMOIST_V .AND. NRR > 0) THEN
 ! Virtual potential temperature
-    TZFIELD%CMNHNAME   = 'THETAV'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THETAV'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Virtual potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'THETAV',                              &
+      CSTDNAME   = '',                                    &
+      CLONGNAME  = 'THETAV',                              &
+      CUNITS     = 'K',                                   &
+      CDIR       = 'XY',                                  &
+      CCOMMENT   = 'X_Y_Z_Virtual potential temperature', &
+      NGRID      = 1,                                     &
+      NTYPE      = TYPEREAL,                              &
+      NDIMS      = 3,                                     &
+      LTIMEDEP   = .TRUE.                                 )
     CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAV)
   END IF
 !
@@ -2376,16 +2332,17 @@ IF (LVISI) THEN
      ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000.
     END WHERE
 ! Visibity Kunkel                     
-    TZFIELD%CMNHNAME   = 'VISIKUN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VISIKUN'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Visibility Kunkel'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'VISIKUN',                 &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'VISIKUN',                 &
+      CUNITS     = 'm',                       &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Z_Visibility Kunkel', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      LTIMEDEP   = .TRUE.                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZVISIKUN)
 !
     IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN
@@ -2396,28 +2353,30 @@ IF (LVISI) THEN
        ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000.
       END WHERE
 ! Visibity Gultepe                    
-      TZFIELD%CMNHNAME   = 'VISIGUL'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = 'VISIGUL'
-      TZFIELD%CUNITS     = 'm'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_Visibility Gultepe'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                  &
+        CMNHNAME   = 'VISIGUL',                  &
+        CSTDNAME   = '',                         &
+        CLONGNAME  = 'VISIGUL',                  &
+        CUNITS     = 'm',                        &
+        CDIR       = 'XY',                       &
+        CCOMMENT   = 'X_Y_Z_Visibility Gultepe', &
+        NGRID      = 1,                          &
+        NTYPE      = TYPEREAL,                   &
+        NDIMS      = 3,                          &
+      LTIMEDEP   = .TRUE.                        )
       CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL)
 ! Visibity Zhang                      
-      TZFIELD%CMNHNAME   = 'VISIZHA'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = 'VISIZHA'
-      TZFIELD%CUNITS     = 'm'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Z_Visibility Zhang'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                &
+        CMNHNAME   = 'VISIZHA',                &
+        CSTDNAME   = '',                       &
+        CLONGNAME  = 'VISIZHA',                &
+        CUNITS     = 'm',                      &
+        CDIR       = 'XY',                     &
+        CCOMMENT   = 'X_Y_Z_Visibility Zhang', &
+        NGRID      = 1,                        &
+        NTYPE      = TYPEREAL,                 &
+        NDIMS      = 3,                        &
+      LTIMEDEP   = .TRUE.                      )
       CALL IO_Field_write(TPFILE,TZFIELD,ZVISIZHA)
 !
       DEALLOCATE(ZVISIGUL,ZVISIZHA)
@@ -2443,16 +2402,17 @@ IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN
                  *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
 !
   IF (LMOIST_E) THEN
-    TZFIELD%CMNHNAME   = 'THETAE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THETAE'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Equivalent potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'THETAE',                                 &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'THETAE',                                 &
+      CUNITS     = 'K',                                      &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_Equivalent potential temperature', &
+      NGRID      = 1,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
     CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAE)
   END IF
 END IF
@@ -2469,16 +2429,17 @@ IF (LMOIST_ES .AND. (NRR>0)) THEN
        -4.805   )    ) + 55.
   ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54)  &
                *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
-  TZFIELD%CMNHNAME   = 'THETAES'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'THETAES'
-  TZFIELD%CUNITS     = 'K'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Equivalent Saturated potential temperature'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                          &
+    CMNHNAME   = 'THETAES',                                          &
+    CSTDNAME   = '',                                                 &
+    CLONGNAME  = 'THETAES',                                          &
+    CUNITS     = 'K',                                                &
+    CDIR       = 'XY',                                               &
+    CCOMMENT   = 'X_Y_Z_Equivalent Saturated potential temperature', &
+    NGRID      = 1,                                                  &
+    NTYPE      = TYPEREAL,                                           &
+    NDIMS      = 3,                                                  &
+    LTIMEDEP   = .TRUE.                                              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAES)
 ENDIF
 !
@@ -2520,16 +2481,17 @@ IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN
 !
   IF (LMOIST_L .AND. NRR > 0) THEN
     ! Liquid-Water potential temperature
-    TZFIELD%CMNHNAME   = 'THETAL'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THETAL'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Liquid water potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                  &
+      CMNHNAME   = 'THETAL',                                   &
+      CSTDNAME   = '',                                         &
+      CLONGNAME  = 'THETAL',                                   &
+      CUNITS     = 'K',                                        &
+      CDIR       = 'XY',                                       &
+      CCOMMENT   = 'X_Y_Z_Liquid water potential temperature', &
+      NGRID      = 1,                                          &
+      NTYPE      = TYPEREAL,                                   &
+      NDIMS      = 3,                                          &
+      LTIMEDEP   = .TRUE.                                      )
     CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAL)
   END IF
 !
@@ -2575,30 +2537,32 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN
   END IF
   IF (LMOIST_S1) THEN
 ! The Moist-air Entropy potential temperature (1st order)
-    TZFIELD%CMNHNAME   = 'THETAS1'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THETAS1'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Moist air Entropy (1st order) potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                                   &
+      CMNHNAME   = 'THETAS1',                                                   &
+      CSTDNAME   = '',                                                          &
+      CLONGNAME  = 'THETAS1',                                                   &
+      CUNITS     = 'K',                                                         &
+      CDIR       = 'XY',                                                        &
+      CCOMMENT   = 'X_Y_Z_Moist air Entropy (1st order) potential temperature', &
+      NGRID      = 1,                                                           &
+      NTYPE      = TYPEREAL,                                                    &
+      NDIMS      = 3,                                                           &
+      LTIMEDEP   = .TRUE.                                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS1)
   END IF
   IF (LMOIST_S2) THEN
 ! The Moist-air Entropy potential temperature (2nd order)
-    TZFIELD%CMNHNAME   = 'THETAS2'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THETAS2'
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                                   &
+      CMNHNAME   = 'THETAS2',                                                   &
+      CSTDNAME   = '',                                                          &
+      CLONGNAME  = 'THETAS2',                                                   &
+      CUNITS     = 'K',                                                         &
+      CDIR       = 'XY',                                                        &
+      CCOMMENT   = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature', &
+      NGRID      = 1,                                                           &
+      NTYPE      = TYPEREAL,                                                    &
+      NDIMS      = 3,                                                           &
+      LTIMEDEP   = .TRUE.                                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS2)  
   END IF
 !
@@ -2612,84 +2576,90 @@ END IF
 IF (LVORT) THEN
 ! Vorticity x
   ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:))))
-  TZFIELD%CMNHNAME   = 'UM1'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'UM1'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_x component of vorticity'
-  TZFIELD%NGRID      = 2
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'UM1',                            &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'UM1',                            &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_x component of vorticity', &
+    NGRID      = 2,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !    
 ! Vorticity y
   ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:))))
-  TZFIELD%CMNHNAME   = 'VM1'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'VM1'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_y component of vorticity'
-  TZFIELD%NGRID      = 3
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'VM1',                            &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'VM1',                            &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_y component of vorticity', &
+    NGRID      = 3,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1)%CMNHNAME   = 'UM1_ZM'
-    TZFIELD2(1)%CSTDNAME   = ''
-    TZFIELD2(1)%CLONGNAME  = 'UM1_ZM'
-    TZFIELD2(1)%CUNITS     = 'm s-1'
-    TZFIELD2(1)%CDIR       = 'XY'
-    TZFIELD2(1)%CCOMMENT   = 'Zonal component of horizontal vorticity'
-    TZFIELD2(1)%NGRID      = 2
-    TZFIELD2(1)%NTYPE      = TYPEREAL
-    TZFIELD2(1)%NDIMS      = 3
-    TZFIELD2(1)%LTIMEDEP   = .TRUE.
+    TZFIELD2(1) = TFIELDMETADATA(                             &
+      CMNHNAME   = 'UM1_ZM',                                  &
+      CSTDNAME   = '',                                        &
+      CLONGNAME  = 'UM1_ZM',                                  &
+      CUNITS     = 'm s-1',                                   &
+      CDIR       = 'XY',                                      &
+      CCOMMENT   = 'Zonal component of horizontal vorticity', &
+      NGRID      = 2,                                         &
+      NTYPE      = TYPEREAL,                                  &
+      NDIMS      = 3,                                         &
+      LTIMEDEP   = .TRUE.                                     )
     !
-    TZFIELD2(2)%CMNHNAME   = 'VM1_ZM'
-    TZFIELD2(2)%CSTDNAME   = ''
-    TZFIELD2(2)%CLONGNAME  = 'VM1_ZM'
-    TZFIELD2(2)%CUNITS     = 'm s-1'
-    TZFIELD2(2)%CDIR       = 'XY'
-    TZFIELD2(2)%CCOMMENT   = 'Meridian component of horizontal vorticity'
-    TZFIELD2(2)%NGRID      = 3
-    TZFIELD2(2)%NTYPE      = TYPEREAL
-    TZFIELD2(2)%NDIMS      = 3
-    TZFIELD2(2)%LTIMEDEP   = .TRUE.
+    TZFIELD2(2) = TFIELDMETADATA(                                &
+      CMNHNAME   = 'VM1_ZM',                                     &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'VM1_ZM',                                     &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'Meridian component of horizontal vorticity', &
+      NGRID      = 3,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.                                        )
     !
     CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ENDIF
 !    
 ! Vorticity z
   ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:))))
-  TZFIELD%CMNHNAME   = 'WM1'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'WM1'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_relative vorticity'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                  &
+    CMNHNAME   = 'WM1',                      &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'WM1',                      &
+    CUNITS     = 's-1',                      &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_relative vorticity', &
+    NGRID      = 4,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
 ! Absolute Vorticity 
   ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)
-  TZFIELD%CMNHNAME   = 'ABVOR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ABVOR'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_z ABsolute VORticity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'ABVOR',                      &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'ABVOR',                      &
+    CUNITS     = 's-1',                        &
+    CDIR       = 'XY',                         &
+    CCOMMENT   = 'X_Y_Z_z ABsolute VORticity', &
+    NGRID      = 1,                            &
+    NTYPE      = TYPEREAL,                     &
+    NDIMS      = 3,                            &
+    LTIMEDEP   = .TRUE.                        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
 END IF
@@ -2713,16 +2683,17 @@ IF ( LMEAN_POVO ) THEN
     END WHERE
   END DO
   WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-  TZFIELD%CMNHNAME   = 'MEAN_POVO'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'MEAN_POVO'
-  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_MEAN of POtential VOrticity'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'MEAN_POVO',                         &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'MEAN_POVO',                         &
+    CUNITS     = 'PVU',                               & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_MEAN of POtential VOrticity', &
+    NGRID      = 4,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 2,                                   &
+    LTIMEDEP   = .TRUE.                               )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 END IF
 !
@@ -2735,16 +2706,17 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN
                + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD%CMNHNAME   = 'POVOV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'POVOV'
-  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Virtual POtential VOrticity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'POVOV',                             &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'POVOV',                             &
+    CUNITS     = 'PVU',                               & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_Virtual POtential VOrticity', &
+    NGRID      = 1,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 3,                                   &
+    LTIMEDEP   = .TRUE.                               )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
 !
   IF (LMEAN_POVO) THEN
@@ -2757,16 +2729,17 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN
       END WHERE
     END DO
     WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-    TZFIELD%CMNHNAME   = 'MEAN_POVOV'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'MEAN_POVOV'
-    TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_MEAN of Virtual POtential VOrticity'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'MEAN_POVOV',                                &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'MEAN_POVOV',                                &
+      CUNITS     = 'PVU',                                       & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_MEAN of Virtual POtential VOrticity', &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 2,                                           &
+      LTIMEDEP   = .TRUE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
 END IF
@@ -2781,16 +2754,17 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN
                 + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                 + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD%CMNHNAME   = 'POVOE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'POVOE'
-  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Equivalent POtential VOrticity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                              &
+    CMNHNAME   = 'POVOE',                                &
+    CSTDNAME   = '',                                     &
+    CLONGNAME  = 'POVOE',                                &
+    CUNITS     = 'PVU',                                  & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                   &
+    CCOMMENT   = 'X_Y_Z_Equivalent POtential VOrticity', &
+    NGRID      = 1,                                      &
+    NTYPE      = TYPEREAL,                               &
+    NDIMS      = 3,                                      &
+    LTIMEDEP   = .TRUE.                                  )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
 !
   IF (LMEAN_POVO) THEN
@@ -2803,16 +2777,17 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN
       END WHERE
     END DO
     WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-    TZFIELD%CMNHNAME   = 'MEAN_POVOE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'MEAN_POVOE'
-    TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_MEAN of Equivalent POtential VOrticity'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                      &
+      CMNHNAME   = 'MEAN_POVOE',                                   &
+      CSTDNAME   = '',                                             &
+      CLONGNAME  = 'MEAN_POVOE',                                   &
+      CUNITS     = 'PVU',                                          & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+      CDIR       = 'XY',                                           &
+      CCOMMENT   = 'X_Y_Z_MEAN of Equivalent POtential VOrticity', &
+      NGRID      = 4,                                              &
+      NTYPE      = TYPEREAL,                                       &
+      NDIMS      = 2,                                              &
+      LTIMEDEP   = .TRUE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
     DEALLOCATE(IWORK1)
   END IF 
@@ -2828,16 +2803,17 @@ IF (LMOIST_ES .AND. (NRR>0) ) THEN
                 + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                 + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD%CMNHNAME   = 'POVOES'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'POVOES'
-  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Equivalent Saturated POtential VOrticity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                        &
+    CMNHNAME   = 'POVOES',                                         &
+    CSTDNAME   = '',                                               &
+    CLONGNAME  = 'POVOES',                                         &
+    CUNITS     = 'PVU',                                            & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                             &
+    CCOMMENT   = 'X_Y_Z_Equivalent Saturated POtential VOrticity', &
+    NGRID      = 1,                                                &
+    NTYPE      = TYPEREAL,                                         &
+    NDIMS      = 3,                                                &
+    LTIMEDEP   = .TRUE.                                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
 ENDIF
 !
@@ -2849,29 +2825,31 @@ ENDIF
 IF (LDIV) THEN
 !
   ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY)
-  TZFIELD%CMNHNAME   = 'HDIV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HDIV'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Horizontal DIVergence'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'HDIV',                        &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'HDIV',                        &
+    CUNITS     = 's-1',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_Horizontal DIVergence', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
   IF (LUSERV) THEN
-    TZFIELD%CMNHNAME   = 'HMDIV'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'HMDIV'
-    TZFIELD%CUNITS     = 'kg m-3 s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'HMDIV',                                      &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'HMDIV',                                      &
+      CUNITS     = 'kg m-3 s-1',                                 &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.                                        )
     ZWORK31=MXM(XRHODREF*XRT(:,:,:,1))*XUT
     ZWORK32=MYM(XRHODREF*XRT(:,:,:,1))*XVT
     ZWORK33=GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY)
@@ -2897,40 +2875,43 @@ IF (LCLSTR) THEN
   CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE)
   PRINT *,'GOT OUT OF CLUSTERING'
   !
-  TZFIELD%CMNHNAME   = 'CLUSTERID'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CLUSTERID'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_CLUSTER (ID NUMBER)'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'CLUSTERID',                 &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = 'CLUSTERID',                 &
+    CUNITS     = '',                          &
+    CDIR       = 'XY',                        &
+    CCOMMENT   = 'X_Y_Z_CLUSTER (ID NUMBER)', &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEINT,                     &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
   CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID)
   !
-  TZFIELD%CMNHNAME   = 'CLUSTERLV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CLUSTERLV'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'CLUSTERLV',                         &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'CLUSTERLV',                         &
+    CUNITS     = '',                                  &
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)', &
+    NGRID      = 1,                                   &
+    NTYPE      = TYPEINT,                             &
+    NDIMS      = 3,                                   &
+    LTIMEDEP   = .TRUE.                               )
   CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV)
   !
-  TZFIELD%CMNHNAME   = 'CLDSIZE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CLDSIZE'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_CLDSIZE (HOR. SECTION)'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'CLDSIZE',                      &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'CLDSIZE',                      &
+    CUNITS     = '',                             &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Z_CLDSIZE (HOR. SECTION)', &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
   CALL IO_Field_write(TPFILE,TZFIELD,ZCLDSIZE)
 END IF
 !
@@ -2974,59 +2955,63 @@ IF (LGEO .OR. LAGEO) THEN
   DEALLOCATE(ZPHI)
 !
   IF (LGEO) THEN 
-    TZFIELD%CMNHNAME   = 'UM88'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'UM88'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_U component of GEOstrophic wind'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                               &
+      CMNHNAME   = 'UM88',                                  &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'UM88',                                  &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'X_Y_Z_U component of GEOstrophic wind', &
+      NGRID      = 2,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 ! 
-    TZFIELD%CMNHNAME   = 'VM88'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VM88'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_V component of GEOstrophic wind'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                               &
+      CMNHNAME   = 'VM88',                                  &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'VM88',                                  &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'X_Y_Z_V component of GEOstrophic wind', &
+      NGRID      = 3,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
     IF (LWIND_ZM) THEN
-      TZFIELD2(1)%CMNHNAME   = 'UM88_ZM'
-      TZFIELD2(1)%CSTDNAME   = ''
-      TZFIELD2(1)%CLONGNAME  = 'UM88_ZM'
-      TZFIELD2(1)%CUNITS     = 'm s-1'
-      TZFIELD2(1)%CDIR       = 'XY'
-      TZFIELD2(1)%CCOMMENT   = 'Zonal component of GEOstrophic wind'
-      TZFIELD2(1)%NGRID      = 2
-      TZFIELD2(1)%NTYPE      = TYPEREAL
-      TZFIELD2(1)%NDIMS      = 3
-      TZFIELD2(1)%LTIMEDEP   = .TRUE.
+      TZFIELD2(1) = TFIELDMETADATA(                         &
+        CMNHNAME   = 'UM88_ZM',                             &
+        CSTDNAME   = '',                                    &
+        CLONGNAME  = 'UM88_ZM',                             &
+        CUNITS     = 'm s-1',                               &
+        CDIR       = 'XY',                                  &
+        CCOMMENT   = 'Zonal component of GEOstrophic wind', &
+        NGRID      = 2,                                     &
+        NTYPE      = TYPEREAL,                              &
+        NDIMS      = 3,                                     &
+        LTIMEDEP   = .TRUE.                                 )
       !
-      TZFIELD2(2)%CMNHNAME   = 'VM88_ZM'
-      TZFIELD2(2)%CSTDNAME   = ''
-      TZFIELD2(2)%CLONGNAME  = 'VM88_ZM'
-      TZFIELD2(2)%CUNITS     = 'm s-1'
-      TZFIELD2(2)%CDIR       = 'XY'
-      TZFIELD2(2)%CCOMMENT   = 'Meridian component of GEOstrophic wind'
-      TZFIELD2(2)%NGRID      = 3
-      TZFIELD2(2)%NTYPE      = TYPEREAL
-      TZFIELD2(2)%NDIMS      = 3
-      TZFIELD2(2)%LTIMEDEP   = .TRUE.
+      TZFIELD2(2) = TFIELDMETADATA(                            &
+        CMNHNAME   = 'VM88_ZM',                                &
+        CSTDNAME   = '',                                       &
+        CLONGNAME  = 'VM88_ZM',                                &
+        CUNITS     = 'm s-1',                                  &
+        CDIR       = 'XY',                                     &
+        CCOMMENT   = 'Meridian component of GEOstrophic wind', &
+        NGRID      = 3,                                        &
+        NTYPE      = TYPEREAL,                                 &
+        NDIMS      = 3,                                        &
+        LTIMEDEP   = .TRUE.                                    )
       !
       CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
     ENDIF
 !
 ! wm necessary to plot vertical cross sections of wind vectors
     CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME  = 'WM88'
     TZFIELD%CLONGNAME = 'WM88'
     CALL IO_Field_write(TPFILE,TZFIELD,XWT)
@@ -3036,59 +3021,63 @@ IF (LGEO .OR. LAGEO) THEN
     ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:)
     ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:)
     !
-    TZFIELD%CMNHNAME   = 'UM89'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'UM89'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_U component of AGEOstrophic wind'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'UM89',                                   &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'UM89',                                   &
+      CUNITS     = 'm s-1',                                  &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_U component of AGEOstrophic wind', &
+      NGRID      = 2,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !
-    TZFIELD%CMNHNAME   = 'VM89'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VM89'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_V component of AGEOstrophic wind'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'VM89',                                   &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'VM89',                                   &
+      CUNITS     = 'm s-1',                                  &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_V component of AGEOstrophic wind', &
+      NGRID      = 3,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
     IF (LWIND_ZM) THEN
-      TZFIELD2(1)%CMNHNAME   = 'UM89_ZM'
-      TZFIELD2(1)%CSTDNAME   = ''
-      TZFIELD2(1)%CLONGNAME  = 'UM89_ZM'
-      TZFIELD2(1)%CUNITS     = 'm s-1'
-      TZFIELD2(1)%CDIR       = 'XY'
-      TZFIELD2(1)%CCOMMENT   = 'Zonal component of AGEOstrophic wind'
-      TZFIELD2(1)%NGRID      = 2
-      TZFIELD2(1)%NTYPE      = TYPEREAL
-      TZFIELD2(1)%NDIMS      = 3
-      TZFIELD2(1)%LTIMEDEP   = .TRUE.
+      TZFIELD2(1) = TFIELDMETADATA(                          &
+        CMNHNAME   = 'UM89_ZM',                              &
+        CSTDNAME   = '',                                     &
+        CLONGNAME  = 'UM89_ZM',                              &
+        CUNITS     = 'm s-1',                                &
+        CDIR       = 'XY',                                   &
+        CCOMMENT   = 'Zonal component of AGEOstrophic wind', &
+        NGRID      = 2,                                      &
+        NTYPE      = TYPEREAL,                               &
+        NDIMS      = 3,                                      &
+        LTIMEDEP   = .TRUE.                                  )
       !
-      TZFIELD2(2)%CMNHNAME   = 'VM89_ZM'
-      TZFIELD2(2)%CSTDNAME   = ''
-      TZFIELD2(2)%CLONGNAME  = 'VM89_ZM'
-      TZFIELD2(2)%CUNITS     = 'm s-1'
-      TZFIELD2(2)%CDIR       = 'XY'
-      TZFIELD2(2)%CCOMMENT   = 'Meridian component of AGEOstrophic wind'
-      TZFIELD2(2)%NGRID      = 3
-      TZFIELD2(2)%NTYPE      = TYPEREAL
-      TZFIELD2(2)%NDIMS      = 3
-      TZFIELD2(2)%LTIMEDEP   = .TRUE.
+      TZFIELD2(2) = TFIELDMETADATA(                             &
+        CMNHNAME   = 'VM89_ZM',                                 &
+        CSTDNAME   = '',                                        &
+        CLONGNAME  = 'VM89_ZM',                                 &
+        CUNITS     = 'm s-1',                                   &
+        CDIR       = 'XY',                                      &
+        CCOMMENT   = 'Meridian component of AGEOstrophic wind', &
+        NGRID      = 3,                                         &
+        NTYPE      = TYPEREAL,                                  &
+        NDIMS      = 3,                                         &
+        LTIMEDEP   = .TRUE.                                     )
       !
       CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
     ENDIF
 !
 ! wm necessary to plot vertical cross sections of wind vectors
     CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME  = 'WM89'
     TZFIELD%CLONGNAME = 'WM89'
     CALL IO_Field_write(TPFILE,TZFIELD,XWT)
@@ -3105,16 +3094,17 @@ IF(LWIND_CONTRAV) THEN!$
   CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, &
                 ZWORK31,ZWORK32,ZWORK33,2)
   !
-  TZFIELD%CMNHNAME   = 'WNORM'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'WNORM'
-  TZFIELD%CUNITS     = 'm s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_W surface normal wind'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'WNORM',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'WNORM',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_W surface normal wind', &
+    NGRID      = 4,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
 END IF
 !-------------------------------------------------------------------------------
@@ -3138,16 +3128,17 @@ IF (LMSLP) THEN
 !  sea level pressure (hPa)
   ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:)))
 !
-  TZFIELD%CMNHNAME   = 'MSLP'
-  TZFIELD%CSTDNAME   = 'air_pressure_at_sea_level'
-  TZFIELD%CLONGNAME  = 'MSLP'
-  TZFIELD%CUNITS     = 'hPa'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Mean Sea Level Pressure'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'MSLP',                        &
+    CSTDNAME   = 'air_pressure_at_sea_level',   &
+    CLONGNAME  = 'MSLP',                        &
+    CUNITS     = 'hPa',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Mean Sea Level Pressure', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 2,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
 END IF
 !-------------------------------------------------------------------------------
@@ -3163,16 +3154,17 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
-    TZFIELD%CMNHNAME   = 'THVW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THVW'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of Vapor Water'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                      &
+      CMNHNAME   = 'THVW',                         &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = 'THVW',                         &
+      CUNITS     = 'mm',                           &
+      CDIR       = 'XY',                           &
+      CCOMMENT   = 'X_Y_THickness of Vapor Water', &
+      NGRID      = 1,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 2,                              &
+      LTIMEDEP   = .TRUE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3183,16 +3175,17 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit
-    TZFIELD%CMNHNAME   = 'THCW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THCW'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of Cloud Water'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                      &
+      CMNHNAME   = 'THCW',                         &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = 'THCW',                         &
+      CUNITS     = 'mm',                           &
+      CDIR       = 'XY',                           &
+      CCOMMENT   = 'X_Y_THickness of Cloud Water', &
+      NGRID      = 1,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 2,                              &
+      LTIMEDEP   = .TRUE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3203,16 +3196,17 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit
-    TZFIELD%CMNHNAME   = 'THRW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THRW'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of Rain Water'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                     &
+      CMNHNAME   = 'THRW',                        &
+      CSTDNAME   = '',                            &
+      CLONGNAME  = 'THRW',                        &
+      CUNITS     = 'mm',                          &
+      CDIR       = 'XY',                          &
+      CCOMMENT   = 'X_Y_THickness of Rain Water', &
+      NGRID      = 1,                             &
+      NTYPE      = TYPEREAL,                      &
+      NDIMS      = 2,                             &
+      LTIMEDEP   = .TRUE.                         )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3223,16 +3217,17 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! ice thickness in mm unit
-    TZFIELD%CMNHNAME   = 'THIC'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THIC'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of ICe'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(              &
+      CMNHNAME   = 'THIC',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'THIC',                 &
+      CUNITS     = 'mm',                   &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'X_Y_THickness of ICe', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3243,16 +3238,17 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! snow thickness in mm unit
-    TZFIELD%CMNHNAME   = 'THSN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THSN'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of SNow'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'THSN',                  &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'THSN',                  &
+      CUNITS     = 'mm',                    &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_THickness of SNow', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 2,                       &
+      LTIMEDEP   = .TRUE.                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3263,16 +3259,17 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! graupel thickness in mm unit
-    TZFIELD%CMNHNAME   = 'THGR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THGR'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of GRaupel'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                  &
+      CMNHNAME   = 'THGR',                     &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = 'THGR',                     &
+      CUNITS     = 'mm',                       &
+      CDIR       = 'XY',                       &
+      CCOMMENT   = 'X_Y_THickness of GRaupel', &
+      NGRID      = 1,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 2,                          &
+      LTIMEDEP   = .TRUE.                      )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
@@ -3283,16 +3280,17 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! hail thickness in mm unit
-    TZFIELD%CMNHNAME   = 'THHA'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'THHA'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_THickness of HAil'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'THHA',                  &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'THHA',                  &
+      CUNITS     = 'mm',                    &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_THickness of HAil', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 2,                       &
+      LTIMEDEP   = .TRUE.                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
 END IF
@@ -3324,16 +3322,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
   END IF
   IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
                   CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN
-    TZFIELD%CMNHNAME   = 'ACTOPR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'ACTOPR'
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_ACccumulated TOtal Precipitation Rate'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'ACTOPR',                                    &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'ACTOPR',                                    &
+      CUNITS     = 'mm',                                        &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_ACccumulated TOtal Precipitation Rate', &
+      NGRID      = 1,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 2,                                           &
+      LTIMEDEP   = .TRUE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   ELSE
     PRINT * ,'YOU WANT TO COMPUTE THE ACCUMULATED RAIN'
@@ -3343,15 +3342,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
   ! calculation of the mean accumulated precipitations in the mesh-grid of a 
   !large-scale model
   IF (LMEAN_PR .AND. LUSERR) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'mm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate'
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                               &
+      CMNHNAME   = 'generic LS_ACTOPR',                                     & !Temporary name to ease identification
+      CUNITS     = 'mm',                                                    &
+      CDIR       = 'XY',                                                    &
+      CCOMMENT   = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', &
+      NGRID      = 1,                                                       &
+      NTYPE      = TYPEREAL,                                                &
+      NDIMS      = 2,                                                       &
+      LTIMEDEP   = .TRUE.                                                   )
     !
-    DO JK=1,SIZE(XMEAN_PR),2      
+    DO JK=1,SIZE(XMEAN_PR),2
       IF (XMEAN_PR(JK) .NE. XUNDEF .AND. XMEAN_PR(JK+1) .NE. XUNDEF) THEN
         PRINT * ,'MEAN accumulated RAIN: GRID ', XMEAN_PR(JK), XMEAN_PR(JK+1)
         CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR(JK:JK+1),ZWORK22,TZFIELD%NGRID)
@@ -3389,16 +3390,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
   END IF
   IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
                   CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN
-    TZFIELD%CMNHNAME   = 'INTOPR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'INTOPR'
-    TZFIELD%CUNITS     = 'mm hour-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_INstantaneous TOtal Precipitation Rate'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'INTOPR',                                     &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'INTOPR',                                     &
+      CUNITS     = 'mm hour-1',                                  &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'X_Y_INstantaneous TOtal Precipitation Rate', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 2,                                            &
+      LTIMEDEP   = .TRUE.                                        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   ELSE
     PRINT * ,'YOU WANT TO COMPUTE THE RAIN RATE'
@@ -3410,15 +3412,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
   IF (LMEAN_PR .AND. LUSERR) THEN
     CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR,ZWORK22,TZFIELD%NGRID)
 !
-    TZFIELD%CMNHNAME   = 'LS_INTOPR'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LS_INTOPR'
-    TZFIELD%CUNITS     = 'mm hour-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate'
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'LS_INTOPR',                                              &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'LS_INTOPR',                                              &
+      CUNITS     = 'mm hour-1',                                              &
+      CDIR       = 'XY',                                                     &
+      CCOMMENT   = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 2,                                                        &
+      LTIMEDEP   = .TRUE.                                                    )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   END IF
 !
@@ -3438,65 +3442,70 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
                    ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE),          &
                    ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22                )
   !
-  TZFIELD%CMNHNAME   = 'CAPEMAX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CAPEMAX'
-  TZFIELD%CUNITS     = 'J kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_MAX of Convective Available Potential Energy'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                          &
+    CMNHNAME   = 'CAPEMAX',                                          &
+    CSTDNAME   = '',                                                 &
+    CLONGNAME  = 'CAPEMAX',                                          &
+    CUNITS     = 'J kg-1',                                           &
+    CDIR       = 'XY',                                               &
+    CCOMMENT   = 'X_Y_MAX of Convective Available Potential Energy', &
+    NGRID      = 1,                                                  &
+    NTYPE      = TYPEREAL,                                           &
+    NDIMS      = 2,                                                  &
+    LTIMEDEP   = .TRUE.                                              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   !
-  TZFIELD%CMNHNAME   = 'CINMAX'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'CINMAX'
-  TZFIELD%CUNITS     = 'J kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_MAX of Convective INhibition energy'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'CINMAX',                                  &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'CINMAX',                                  &
+    CUNITS     = 'J kg-1',                                  &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_MAX of Convective INhibition energy', &
+    NGRID      = 1,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   IF (NCAPE >=1) THEN
-    TZFIELD%CMNHNAME   = 'CAPE3D'
-    TZFIELD%CSTDNAME   = 'atmosphere_convective_available_potential_energy'
-    TZFIELD%CLONGNAME  = 'CAPE3D'
-    TZFIELD%CUNITS     = 'J kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Convective Available Potential Energy'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                          &
+      CMNHNAME   = 'CAPE3D',                                           &
+      CSTDNAME   = 'atmosphere_convective_available_potential_energy', &
+      CLONGNAME  = 'CAPE3D',                                           &
+      CUNITS     = 'J kg-1',                                           &
+      CDIR       = 'XY',                                               &
+      CCOMMENT   = 'X_Y_Z_Convective Available Potential Energy',      &
+      NGRID      = 1,                                                  &
+      NTYPE      = TYPEREAL,                                           &
+      NDIMS      = 3,                                                  &
+      LTIMEDEP   = .TRUE.                                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
-    TZFIELD%CMNHNAME   = 'CIN3D'
-    TZFIELD%CSTDNAME   = 'atmosphere_convective_inhibition'
-    TZFIELD%CLONGNAME  = 'CIN3D'
-    TZFIELD%CUNITS     = 'J kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Convective INhibition energy'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'CIN3D',                              &
+      CSTDNAME   = 'atmosphere_convective_inhibition',   &
+      CLONGNAME  = 'CIN3D',                              &
+      CUNITS     = 'J kg-1',                             &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'X_Y_Z_Convective INhibition energy', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 3,                                    &
+      LTIMEDEP   = .TRUE.                                )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     !
-    TZFIELD%CMNHNAME   = 'DCAPE3D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DCAPE3D'
-    TZFIELD%CUNITS     = 'J kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA( &
+      CMNHNAME   = 'DCAPE3D', &
+      CSTDNAME   = '',        &
+      CLONGNAME  = 'DCAPE3D', &
+      CUNITS     = 'J kg-1',  &
+      CDIR       = 'XY',      &
+      CCOMMENT   = '',        &
+      NGRID      = 1,         &
+      NTYPE      = TYPEREAL,  &
+      NDIMS      = 3,         &
+      LTIMEDEP   = .TRUE.     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
   END IF
   !
@@ -3505,16 +3514,17 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
     ZWORK31(:,:,IKU)    = 0.
     ZWORK31=0.5*ZWORK31**2
     !
-    TZFIELD%CMNHNAME   = 'VKE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VKE'
-    TZFIELD%CUNITS     = 'J kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Vertical Kinetic Energy'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'VKE',                           &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'VKE',                           &
+      CUNITS     = 'J kg-1',                        &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_Vertical Kinetic Energy', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
 ENDIF
@@ -3537,16 +3547,17 @@ IF (LBV_FR) THEN
    ENDDO
   ENDDO
   !
-  TZFIELD%CMNHNAME   = 'BV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'BV'
-  TZFIELD%CUNITS     = 's-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Brunt-Vaissala frequency'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'BV',                             &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'BV',                             &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_Brunt-Vaissala frequency', &
+    NGRID      = 4,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !  
   IF (NRR > 0) THEN
@@ -3563,16 +3574,17 @@ IF (LBV_FR) THEN
      ENDDO
     ENDDO
 !
-    TZFIELD%CMNHNAME   = 'BVE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'BVE'
-    TZFIELD%CUNITS     = 's-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Equivalent Brunt-Vaissala frequency'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'BVE',                                       &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'BVE',                                       &
+      CUNITS     = 's-1',                                       &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_Equivalent Brunt-Vaissala frequency', &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
 END IF
@@ -3591,41 +3603,44 @@ IF ( NGPS>=0 ) THEN
   YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS')
   CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24)    
   !
-  TZFIELD%CMNHNAME   = 'ZTD'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ZTD'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Zenithal Total Delay'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'ZTD',                        &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'ZTD',                        &
+    CUNITS     = 'm',                          &
+    CDIR       = 'XY',                         &
+    CCOMMENT   = 'X_Y_Z_Zenithal Total Delay', &
+    NGRID      = 1,                            &
+    NTYPE      = TYPEREAL,                     &
+    NDIMS      = 2,                            &
+    LTIMEDEP   = .TRUE.                        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   IF (NGPS>=1) THEN
-    TZFIELD%CMNHNAME   = 'ZHD'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'ZHD'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Zenithal Hydrostatic Delay'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'ZHD',                              &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'ZHD',                              &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_Zenithal Hydrostatic Delay', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 2,                                  &
+      LTIMEDEP   = .TRUE.                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
     !
-    TZFIELD%CMNHNAME   = 'ZWD'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'ZWD'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Zenithal Wet Delay'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                  &
+      CMNHNAME   = 'ZWD',                      &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = 'ZWD',                      &
+      CUNITS     = 'm',                        &
+      CDIR       = 'XY',                       &
+      CCOMMENT   = 'X_Y_Z_Zenithal Wet Delay', &
+      NGRID      = 1,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 2,                          &
+      LTIMEDEP   = .TRUE.                      )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24)
     !
   END IF
@@ -3649,68 +3664,76 @@ IF(LRADAR .AND. LUSERR) THEN
     XCIT(:,:,:)=XSVT(:,:,:,NSV_LIMA_NI)
     CALL INI_RADAR('PLAT')
   END IF
-! 
-  IF (NMOM_S.GE.2) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS)
-  IF (NMOM_G.GE.2) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG)
-  IF (NMOM_H.GE.2) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH)
+!       
   IF (NVERSION_RAD == 1) THEN 
 ! original version of radar diagnostics 
       WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine'
     IF (CCLOUD=='LIMA') THEN
-        CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, &
-                         ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR),         &
-                         ZW1(:,:,:),ZW2(:,:,:),ZW3(:,:,:) )
+      ALLOCATE( ZW1(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      ALLOCATE( ZW2(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      ALLOCATE( ZW3(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      IF ( NMOM_S >= 2 ) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS)
+      IF ( NMOM_G >= 2 ) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG)
+      IF ( NMOM_H >= 2 ) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH)
+      CALL RADAR_RAIN_ICE( XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, &
+                           ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR),     &
+                           ZW1(:,:,:), ZW2(:,:,:), ZW3(:,:,:) )
+      DEALLOCATE( ZW1, ZW2, ZW3 )
     ELSE          
       CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, &
                                                          ZWORK33, ZWORK34 )
   ENDIF 
 !
-  TZFIELD%CMNHNAME   = 'RARE'
-  TZFIELD%CSTDNAME   = 'equivalent_reflectivity_factor'
-  TZFIELD%CLONGNAME  = 'RARE'
-  TZFIELD%CUNITS     = 'dBZ'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_RAdar REflectivity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'RARE',                           &
+    CSTDNAME   = 'equivalent_reflectivity_factor', &
+    CLONGNAME  = 'RARE',                           &
+    CUNITS     = 'dBZ',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_RAdar REflectivity',       &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
-  TZFIELD%CMNHNAME   = 'VDOP'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'VDOP'
-  TZFIELD%CUNITS     = 'm s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_radar DOPpler fall speed'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'VDOP',                           &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'VDOP',                           &
+    CUNITS     = 'm s-1',                          &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_radar DOPpler fall speed', &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
 !
-  TZFIELD%CMNHNAME   = 'ZDR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ZDR'
-  TZFIELD%CUNITS     = 'dBZ'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Differential polar Reflectivity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'ZDR',                                   &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'ZDR',                                   &
+    CUNITS     = 'dBZ',                                   &
+    CDIR       = 'XY',                                    &
+    CCOMMENT   = 'X_Y_Z_Differential polar Reflectivity', &
+    NGRID      = 1,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 3,                                       &
+    LTIMEDEP   = .TRUE.                                   )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
 !
-  TZFIELD%CMNHNAME   = 'KDP'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'KDP'
-  TZFIELD%CUNITS     = 'degree km-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Differential Phase Reflectivity'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'KDP',                                   &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'KDP',                                   &
+    CUNITS     = 'degree km-1',                           &
+    CDIR       = 'XY',                                    &
+    CCOMMENT   = 'X_Y_Z_Differential Phase Reflectivity', &
+    NGRID      = 1,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 3,                                       &
+    LTIMEDEP   = .TRUE.                                   )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
 !
    ELSE 
@@ -4009,28 +4032,30 @@ IF (LLIDAR) THEN
   IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3)
   IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4)
 !
-  TZFIELD%CMNHNAME   = 'LIDAR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'LIDAR'
-  TZFIELD%CUNITS     = 'm-1 sr-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Normalized_Lidar_Profile'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'LIDAR',                          &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'LIDAR',                          &
+    CUNITS     = 'm-1 sr-1',                       &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_Normalized_Lidar_Profile', &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
-  TZFIELD%CMNHNAME   = 'LIPAR'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'LIPAR'
-  TZFIELD%CUNITS     = 'm-1 sr-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_Particle_Lidar_Profile'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'LIPAR',                        &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'LIPAR',                        &
+    CUNITS     = 'm-1 sr-1',                     &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Z_Particle_Lidar_Profile', &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
 !
 END IF
@@ -4065,16 +4090,17 @@ IF (CBLTOP == 'THETA') THEN
   ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
   ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0)
   !
-  TZFIELD%CMNHNAME   = 'HBLTOP'
-  TZFIELD%CSTDNAME   = 'atmosphere_boundary_layer_thickness'
-  TZFIELD%CLONGNAME  = 'HBLTOP'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'Height of Boundary Layer TOP'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                             &
+    CMNHNAME   = 'HBLTOP',                              &
+    CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
+    CLONGNAME  = 'HBLTOP',                              &
+    CUNITS     = 'm',                                   &
+    CDIR       = 'XY',                                  &
+    CCOMMENT   = 'Height of Boundary Layer TOP',        &
+    NGRID      = 1,                                     &
+    NTYPE      = TYPEREAL,                              &
+    NDIMS      = 2,                                     &
+    LTIMEDEP   = .TRUE.                                 )
   CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX)
   !
   DEALLOCATE(ZSHMIX)
@@ -4109,26 +4135,21 @@ ELSEIF (CBLTOP == 'RICHA') THEN
   END DO
   ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
   !
-  TZFIELD%CMNHNAME   = 'HBLTOP'
-  TZFIELD%CSTDNAME   = 'atmosphere_boundary_layer_thickness'
-  TZFIELD%CLONGNAME  = 'HBLTOP'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'Height of Boundary Layer TOP'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                             &
+    CMNHNAME   = 'HBLTOP',                              &
+    CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
+    CLONGNAME  = 'HBLTOP',                              &
+    CUNITS     = 'm',                                   &
+    CDIR       = 'XY',                                  &
+    CCOMMENT   = 'Height of Boundary Layer TOP',        &
+    NGRID      = 1,                                     &
+    NTYPE      = TYPEREAL,                              &
+    NDIMS      = 2,                                     &
+    LTIMEDEP   = .TRUE.                                 )
   CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX)
   !
   DEALLOCATE(ZRIB,ZSHMIX)
 ENDIF
-  ! used before 5-3-1 version
-  !
-  !ZGAMREF=3.5E-3 ! K/m
-  !ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
-  !ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2)
-  !CALL FREE_ATM_PROFILE(ZTHETAV,ZWORK31,XZS,XZSMT,ZGAMREF,ZWORK32,ZWORK33)
 !
 IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV)
 !
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 93ea1f7f17519fe5a0b47e0e23d70796f0f1489c..c0dcea59bbb086159a4290dcf47fe29f1e5e593c 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
@@ -90,65 +90,53 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!      J.-P. Chaboureau 07/2018 bug fix on XEMIS when calling CALL_RTTOVxx
 !!      J.-P. Chaboureau 09/04/2021 add the call to RTTOV13
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_ll
-USE MODD_CST
-use modd_field,           only: tfielddata, tfieldlist, TYPEINT, TYPEREAL
-USE MODD_IO, ONLY: TFILEDATA
-USE MODD_PARAMETERS
-USE MODD_CONF_n
-USE MODD_CONF
-USE MODD_DEEP_CONVECTION_n
-USE MODD_DIM_n
-USE MODD_FIELD_n
-USE MODD_GRID_n
-USE MODD_LUNIT_n
-USE MODD_PARAM_n
-USE MODD_PARAM_KAFR_n
-USE MODD_PARAM_RAD_n
-USE MODD_RADIATIONS_n
-USE MODD_TIME_n
-USE MODD_TURB_n
-USE MODD_REF_n, ONLY: XRHODREF
-USE MODD_DIAG_FLAG
-USE MODD_NSV, ONLY : NSV,NSV_USER,NSV_C2R2BEG,NSV_C2R2END,             &
-                     NSV_C1R3BEG, NSV_C1R3END,NSV_ELECBEG,NSV_ELECEND, &
-                     NSV_CHEMBEG, NSV_CHEMEND,NSV_LGBEG,  NSV_LGEND
-USE MODD_CH_M9_n,         ONLY: CNAMES
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_DUST,            ONLY: LDUST
-USE MODD_SALT,            ONLY: LSALT
-USE MODD_CH_AEROSOL,      ONLY: LORILAM
-USE MODD_CH_MNHC_n
-USE MODD_CH_BUDGET_n
-USE MODD_CH_PRODLOSSTOT_n
+USE MODD_CH_AEROSOL,        ONLY: LORILAM
+USE MODD_CH_BUDGET_n,       ONLY: CNAMES_BUDGET, NEQ_BUDGET, XTCHEM
 USE MODD_CH_FLX_n,          ONLY: XCHFLX
-USE MODD_RAD_TRANSF
-USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M,XCURRENT_MER10M,           &
-                            XCURRENT_SFCO2,XCURRENT_SWD, XCURRENT_LWD, &
-                            XCURRENT_SWU, XCURRENT_LWU
-!
-USE MODD_DYN_n
-USE MODD_CURVCOR_n
-USE MODD_METRICS_n
-USE MODD_DIAG_BLANK
-USE MODI_PINTER
-USE MODI_ZINTER
-USE MODI_GRADIENT_M
-USE MODI_GRADIENT_W
-USE MODI_GRADIENT_U
-USE MODI_GRADIENT_V
-USE MODI_GRADIENT_UV
-!
-USE MODI_SHUMAN
-USE MODE_NEIGHBORAVG
+USE MODD_CH_PRODLOSSTOT_n,  ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD
+USE MODD_CST,               ONLY: XCPD, XP00, XRD, XTT
+USE MODD_CURVCOR_n,         ONLY: XCORIOZ
+USE MODD_DIAG_IN_RUN,       ONLY: XCURRENT_ZON10M, XCURRENT_MER10M,           &
+                                  XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, &
+                                  XCURRENT_SWU, XCURRENT_LWU
+USE MODD_DUST,              ONLY: LDUST
+use modd_field,             only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
+USE MODD_IO,                ONLY: TFILEDATA
+USE MODD_CONF,              ONLY: LCARTESIAN
+USE MODD_CONF_n,            ONLY: LUSERC, LUSERI, NRR
+USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, &
+                                  XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV
+USE MODD_DIAG_FLAG,         ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, &
+                                  NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH
+USE MODD_FIELD_n,           ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT
+USE MODD_GRID_n,            ONLY: XZHAT, XZZ
+USE MODD_METRICS_n,         ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
+USE MODD_NSV,               ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST
+USE MODD_PARAMETERS,        ONLY: JPVEXT, NUNDEF, XUNDEF
+USE MODD_PARAM_KAFR_n,      ONLY: LCHTRANS
+USE MODD_PARAM_n,           ONLY: CRAD, CSURF
+USE MODD_PARAM_RAD_n,       only: NRAD_COLNBR
+USE MODD_RADIATIONS_N,      ONLY: NCLEARCOL_TM1, NDLON, NFLEV, NSTATM,                                  &
+                                  XAER, XAZIM, XCCO2, XDIR_ALB, XDIRFLASWD, XDIRSRFSWD, XDTHRAD, XEMIS, &
+                                  XFLALWD, XSCA_ALB, XSCAFLASWD, XSTATM, XTSRAD, XZENITH
+USE MODD_RAD_TRANSF,        ONLY: JPGEOST
+USE MODD_REF_n,             ONLY: XRHODREF
+USE MODD_SALT,              ONLY: LSALT
+USE MODD_TIME_n,            ONLY: TDTCUR
+USE MODD_TURB_n,            ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT
+
+use mode_field,             only: Find_field_id_from_mnhname
+USE MODE_IO_FIELD_WRITE,    only: IO_Field_write
+USE MODE_MSG
+USE MODE_NEIGHBORAVG,       ONLY: BLOCKAVG, MOVINGAVG
+USE MODE_TOOLS_LL,          ONLY: GET_INDICE_ll
+
 #ifdef MNH_RTTOV_8
 USE MODI_CALL_RTTOV8
 #endif
@@ -158,14 +146,18 @@ USE MODI_CALL_RTTOV11
 #ifdef MNH_RTTOV_13
 USE MODI_CALL_RTTOV13
 #endif
+USE MODI_GET_SURF_UNDEF
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_U
+USE MODI_GRADIENT_UV
+USE MODI_GRADIENT_V
+USE MODI_GRADIENT_W
+USE MODI_PINTER
+USE MODI_SHUMAN
 USE MODI_RADTR_SATEL
 USE MODI_UV_TO_ZONAL_AND_MERID
-!
-use mode_field,          only: Find_field_id_from_mnhname
-USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-!
-USE MODI_GET_SURF_UNDEF
-!
+USE MODI_ZINTER
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
@@ -208,8 +200,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZTH
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZVOX,ZVOY,ZVOZ
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZCORIOZ
-TYPE(TFIELDDATA)              :: TZFIELD
-TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2
+TYPE(TFIELDMETADATA)               :: TZFIELD
+TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2
 !
 ! variables needed for altitude interpolation                                 
 INTEGER :: IAL
@@ -246,7 +238,6 @@ ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
 !* Diagnostic variables related to deep convection
 !
 IF (NCONV_KF >= 0) THEN
-!
   CALL IO_Field_write(TPFILE,'CAPE',XCAPE)
 !
   ! top height (km) of convective clouds
@@ -256,16 +247,17 @@ IF (NCONV_KF >= 0) THEN
       IF (NCLTOPCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLTOPCONV(JI,JJ))/1.E3
     END DO
   END DO
-  TZFIELD%CMNHNAME   = 'CLTOPCONV'
-  TZFIELD%CSTDNAME   = 'convective_cloud_top_altitude'
-  TZFIELD%CLONGNAME  = 'CLTOPCONV'
-  TZFIELD%CUNITS     = 'km'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Top of Convective Cloud'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME   = 'CLTOPCONV',                     &
+    CSTDNAME   = 'convective_cloud_top_altitude', &
+    CLONGNAME  = 'CLTOPCONV',                     &
+    CUNITS     = 'km',                            &
+    CDIR       = 'XY',                            &
+    CCOMMENT   = 'X_Y_Top of Convective Cloud',   &
+    NGRID      = 4,                               &
+    NTYPE      = TYPEREAL,                        &
+    NDIMS      = 2,                               &
+    LTIMEDEP   = .TRUE.                           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 !
   ! base height (km) of convective clouds
@@ -275,132 +267,47 @@ IF (NCONV_KF >= 0) THEN
       IF (NCLBASCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLBASCONV(JI,JJ))/1.E3
     END DO
   END DO
-  TZFIELD%CMNHNAME   = 'CLBASCONV'
-  TZFIELD%CSTDNAME   = 'convective_cloud_base_altitude'
-  TZFIELD%CLONGNAME  = 'CLBASCONV'
-  TZFIELD%CUNITS     = 'km'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Base of Convective Cloud'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'CLBASCONV',                      &
+    CSTDNAME   = 'convective_cloud_base_altitude', &
+    CLONGNAME  = 'CLBASCONV',                      &
+    CUNITS     = 'km',                             &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Base of Convective Cloud',   &
+    NGRID      = 4,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 2,                                &
+    LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
-!
 END IF
+
 IF (NCONV_KF >= 1) THEN
-!
   CALL IO_Field_write(TPFILE,'DTHCONV',XDTHCONV)
   CALL IO_Field_write(TPFILE,'DRVCONV',XDRVCONV)
   CALL IO_Field_write(TPFILE,'DRCCONV',XDRCCONV)
   CALL IO_Field_write(TPFILE,'DRICONV',XDRICONV)
-!  
+!
   IF ( LCHTRANS .AND. NSV > 0 ) THEN
-    ! User scalar variables
-    IF (NSV_USER>0) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = 1, NSV_USER
-        WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A2,I3.3,A20)')'X_Y_Z_','SV',JSV,' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    ! microphysical C2R2 scheme scalar variables
-    IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_C2R2BEG, NSV_C2R2END
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    ! microphysical C3R5 scheme additional scalar variables
-    IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_C1R3BEG,NSV_C1R3END
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    ! electrical scalar variables
-    IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_ELECBEG,NSV_ELECEND
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    ! chemical scalar variables
-    IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    ! lagrangian variables
-    IF (NSV_LGEND>=NSV_LGBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 's-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_LGBEG,NSV_LGEND
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//' CONVective tendency'
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
+   ! scalar variables are recorded
+   ! individually in the file
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'generic for DSVCONV', & !Temporary name to ease identification
+      CUNITS     = 's-1',         &
+      CDIR       = 'XY',          &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .TRUE.         )
+
+    DO JSV = 1, NSV
+      TZFIELD%CMNHNAME   = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      TZFIELD%CLONGNAME  = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+      TZFIELD%CCOMMENT   = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) )
+    END DO
   END IF
-!
 END IF
+
 IF (NCONV_KF >= 2) THEN
   CALL IO_Field_write(TPFILE,'PRLFLXCONV',XPRLFLXCONV)
   CALL IO_Field_write(TPFILE,'PRSFLXCONV',XPRSFLXCONV)
@@ -456,16 +363,17 @@ IF (LCLD_COV .AND. LUSERC) THEN
                                                   ! 0 if there is no cloud
   ZWORK21(:,:)=ZWORK21(:,:)/1.E3            ! height (km) of explicit clouds
 !
-  TZFIELD%CMNHNAME   = 'HECL'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'HECL'
-  TZFIELD%CUNITS     = 'km'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Height of Explicit CLoud top'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                          &
+    CMNHNAME   = 'HECL',                             &
+    CSTDNAME   = '',                                 &
+    CLONGNAME  = 'HECL',                             &
+    CUNITS     = 'km',                               &
+    CDIR       = 'XY',                               &
+    CCOMMENT   = 'X_Y_Height of Explicit CLoud top', &
+    NGRID      = 4,                                  &
+    NTYPE      = TYPEREAL,                           &
+    NDIMS      = 2,                                  &
+    LTIMEDEP   = .TRUE.                              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 !
 !  Higher top of the different species of clouds
@@ -493,29 +401,31 @@ IF (LCLD_COV .AND. LUSERC) THEN
                                                          ! 0 if there is no cloud
     ZWORK21(:,:)=ZWORK21(:,:)/1.E3                 ! max. cloud height (km)
 !
-    TZFIELD%CMNHNAME   = 'HCL'
-    TZFIELD%CSTDNAME   = 'cloud_top_altitude'
-    TZFIELD%CLONGNAME  = 'HCL'
-    TZFIELD%CUNITS     = 'km'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Height of CLoud top'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'HCL',                     &
+      CSTDNAME   = 'cloud_top_altitude',      &
+      CLONGNAME  = 'HCL',                     &
+      CUNITS     = 'km',                      &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Height of CLoud top', &
+      NGRID      = 4,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 2,                         &
+      LTIMEDEP   = .TRUE.                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   ENDIF
 !
-  TZFIELD%CMNHNAME   = 'TCL'
-  TZFIELD%CSTDNAME   = 'air_temperature_at_cloud_top'
-  TZFIELD%CLONGNAME  = 'TCL'
-  TZFIELD%CUNITS     = 'celsius'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Height of CLoud top'
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'TCL',                          &
+    CSTDNAME   = 'air_temperature_at_cloud_top', &
+    CLONGNAME  = 'TCL',                          &
+    CUNITS     = 'celsius',                      &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Height of CLoud top',      &
+    NGRID      = 4,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 2,                              &
+    LTIMEDEP   = .TRUE.                          )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
 !
   CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR)
@@ -528,16 +438,17 @@ IF (LCLD_COV .AND. LUSERC) THEN
     ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88)
   END WHERE
 !
-  TZFIELD%CMNHNAME   = 'VISI_HOR'
-  TZFIELD%CSTDNAME   = 'visibility_in_air'
-  TZFIELD%CLONGNAME  = 'VISI_HOR'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Z_VISI_HOR'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'VISI_HOR',          &
+    CSTDNAME   = 'visibility_in_air', &
+    CLONGNAME  = 'VISI_HOR',          &
+    CUNITS     = 'm',                 &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_VISI_HOR',    &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
   DEALLOCATE(IWORK1,IWORK2,ICL_HE_ST,GMASK2,ZWORK22)
@@ -563,8 +474,10 @@ IF (NRAD_3D >= 0) THEN
     !
     CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM1_FOR_DIAG_SUPP','EMIS: writing only first band')
     CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%NDIMS = 2
+    TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4)
+    TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED
     CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1))
     !
     CALL IO_Field_write(TPFILE,'TSRAD',       XTSRAD)
@@ -581,16 +494,17 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)
     END DO
-    TZFIELD%CMNHNAME   = 'DSTAOD3D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DSTAOD3D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DuST Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'DSTAOD3D',                         &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'DSTAOD3D',                         &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_DuST Aerosol Optical Depth', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 3,                                  &
+      LTIMEDEP   = .TRUE.                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !Dust optical depth
     ZWORK21(:,:)=0.0
@@ -602,32 +516,34 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD%CMNHNAME   = 'DSTAOD2D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DSTAOD2D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_DuST Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'DSTAOD2D',                       &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'DSTAOD2D',                       &
+      CUNITS     = 'm',                              &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_DuST Aerosol Optical Depth', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 2,                                &
+      LTIMEDEP   = .TRUE.                            )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 !Dust extinction (optical depth per km)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD%CMNHNAME   = 'DSTEXT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'DSTEXT'
-    TZFIELD%CUNITS     = 'km-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_DuST EXTinction'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'DSTEXT',                &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'DSTEXT',                &
+      CUNITS     = 'km-1',                  &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_Z_DuST EXTinction', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 3,                       &
+      LTIMEDEP   = .TRUE.                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
   IF (LSALT) THEN
@@ -637,16 +553,17 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)
     END DO
-    TZFIELD%CMNHNAME   = 'SLTAOD3D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SLTAOD3D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Salt Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'SLTAOD3D',                         &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'SLTAOD3D',                         &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_Salt Aerosol Optical Depth', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 3,                                  &
+      LTIMEDEP   = .TRUE.                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !Salt optical depth
     ZWORK21(:,:)=0.0
@@ -658,32 +575,34 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD%CMNHNAME   = 'SLTAOD2D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SLTAOD2D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Salt Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'SLTAOD2D',                       &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'SLTAOD2D',                       &
+      CUNITS     = 'm',                              &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_Salt Aerosol Optical Depth', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 2,                                &
+      LTIMEDEP   = .TRUE.                            )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 !Salt extinction (optical depth per km)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD%CMNHNAME   = 'SLTEXT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SLTEXT'
-    TZFIELD%CUNITS     = 'km-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Salt EXTinction'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'SLTEXT',                &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'SLTEXT',                &
+      CUNITS     = 'km-1',                  &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_Z_Salt EXTinction', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 3,                       &
+      LTIMEDEP   = .TRUE.                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
   IF (LORILAM) THEN
@@ -693,16 +612,17 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)
     END DO
-    TZFIELD%CMNHNAME   = 'AERAOD3D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'AERAOD3D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Anthropogenic Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'AERAOD3D',                                  &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'AERAOD3D',                                  &
+      CUNITS     = 'm',                                         &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_Anthropogenic Aerosol Optical Depth', &
+      NGRID      = 1,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !Orilam anthropogenic optical depth
     ZWORK21(:,:)=0.0
@@ -714,54 +634,54 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD%CMNHNAME   = 'AERAOD2D'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'AERAOD2D'
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Anthropogenic Aerosol Optical Depth'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                 &
+      CMNHNAME   = 'AERAOD2D',                                &
+      CSTDNAME   = '',                                        &
+      CLONGNAME  = 'AERAOD2D',                                &
+      CUNITS     = 'm',                                       &
+      CDIR       = 'XY',                                      &
+      CCOMMENT   = 'X_Y_Anthropogenic Aerosol Optical Depth', &
+      NGRID      = 1,                                         &
+      NTYPE      = TYPEREAL,                                  &
+      NDIMS      = 2,                                         &
+      LTIMEDEP   = .TRUE.                                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
 !Orilam anthropogenic extinction (optical depth per km)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD%CMNHNAME   = 'AEREXT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'AEREXT'
-    TZFIELD%CUNITS     = 'km-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_Anthropogenic EXTinction'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'AEREXT',                         &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'AEREXT',                         &
+      CUNITS     = 'km-1',                           &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_Z_Anthropogenic EXTinction', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 3,                                &
+      LTIMEDEP   = .TRUE.                            )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   END IF
 END IF
 !
 !-------------------------------------------------------------------------------
 ! Net surface gaseous fluxes
-!print*,'LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND=',&
-!LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND
-
 IF (LCHEMDIAG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppb m s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'generic for net chemical flux', & !Temporary name to ease identification
+    CUNITS     = 'ppb m s-1',   &
+    CDIR       = 'XY',          &
+    NGRID      = 1,             &
+    NTYPE      = TYPEREAL,      &
+    NDIMS      = 2,             &
+    LTIMEDEP   = .TRUE.         )
   !
   DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-    TZFIELD%CMNHNAME   = 'FLX_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM(CNAMES(JSV-NSV_CHEMBEG+1)),' Net chemical flux'
+    TZFIELD%CMNHNAME  = 'FLX_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+    TZFIELD%CLONGNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+    WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM( TSVLIST(JSV)%CMNHNAME ),' Net chemical flux'
     CALL IO_Field_write(TPFILE,TZFIELD,XCHFLX(:,:,JSV-NSV_CHEMBEG+1) * 1E9)
   END DO
 END IF
@@ -813,28 +733,30 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
                       LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,               &
                       INDGEO(JI), VSIGQSAT                                    )
     !
-    TZFIELD%CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                               &
+      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
+      CSTDNAME   = '',                                                      &
+      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
+      CUNITS     = 'K',                                                     &
+      CDIR       = 'XY',                                                    &
+      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature', &
+      NGRID      = 1,                                                       &
+      NTYPE      = TYPEREAL,                                                &
+      NDIMS      = 2,                                                       &
+      LTIMEDEP   = .TRUE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT)
     !
-    TZFIELD%CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                                 &
+      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
+      CSTDNAME   = '',                                                        &
+      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
+      CUNITS     = 'K',                                                       &
+      CDIR       = 'XY',                                                      &
+      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature', &
+      NGRID      = 1,                                                         &
+      NTYPE      = TYPEREAL,                                                  &
+      NDIMS      = 2,                                                         &
+      LTIMEDEP   = .TRUE.                                                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWVBT)
   END DO
   DEALLOCATE(ZIRBT,ZWVBT)
@@ -900,138 +822,148 @@ IF (CSURF=='EXTE') THEN
   ! in this case (argument KGRID=0), input winds are ZONal and MERidian 
   !          and, output ones are in MesoNH grid   
   IF (.NOT. LCARTESIAN) THEN
-    TZFIELD2(1)%CMNHNAME   = 'UM10'
-    TZFIELD2(1)%CSTDNAME   = ''
-    TZFIELD2(1)%CLONGNAME  = 'UM10'
-    TZFIELD2(1)%CUNITS     = 'm s-1'
-    TZFIELD2(1)%CDIR       = 'XY'
-    TZFIELD2(1)%CCOMMENT   = 'Zonal wind at 10m'
-    TZFIELD2(1)%NGRID      = 1
-    TZFIELD2(1)%NTYPE      = TYPEREAL
-    TZFIELD2(1)%NDIMS      = 2
-    TZFIELD2(1)%LTIMEDEP   = .TRUE.
+    TZFIELD2(1) = TFIELDMETADATA(       &
+      CMNHNAME   = 'UM10',              &
+      CSTDNAME   = '',                  &
+      CLONGNAME  = 'UM10',              &
+      CUNITS     = 'm s-1',             &
+      CDIR       = 'XY',                &
+      CCOMMENT   = 'Zonal wind at 10m', &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 2,                   &
+      LTIMEDEP   = .TRUE.               )
     !
-    TZFIELD2(2)%CMNHNAME   = 'VM10'
-    TZFIELD2(2)%CSTDNAME   = ''
-    TZFIELD2(2)%CLONGNAME  = 'VM10'
-    TZFIELD2(2)%CUNITS     = 'm s-1'
-    TZFIELD2(2)%CDIR       = 'XY'
-    TZFIELD2(2)%CCOMMENT   = 'Meridian wind at 10m'
-    TZFIELD2(2)%NGRID      = 1
-    TZFIELD2(2)%NTYPE      = TYPEREAL
-    TZFIELD2(2)%NDIMS      = 2
-    TZFIELD2(2)%LTIMEDEP   = .TRUE.
+    TZFIELD2(2) = TFIELDMETADATA(          &
+      CMNHNAME   = 'VM10',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'VM10',                 &
+      CUNITS     = 'm s-1',                &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'Meridian wind at 10m', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
     !
     CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ELSE
-    TZFIELD%CMNHNAME   = 'UM10'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'UM10'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'Zonal wind at 10m'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(           &
+      CMNHNAME   = 'UM10',              &
+      CSTDNAME   = '',                  &
+      CLONGNAME  = 'UM10',              &
+      CUNITS     = 'm s-1',             &
+      CDIR       = 'XY',                &
+      CCOMMENT   = 'Zonal wind at 10m', &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 2,                   &
+      LTIMEDEP   = .TRUE.               )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M)
     !
-    TZFIELD%CMNHNAME   = 'VM10'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'VM10'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'Meridian wind at 10m'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(              &
+      CMNHNAME   = 'VM10',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'VM10',                 &
+      CUNITS     = 'm s-1',                &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'Meridian wind at 10m', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_MER10M)
   ENDIF
   !
   IF (SIZE(XTKET)>0) THEN
     ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
     ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
-    TZFIELD%CMNHNAME   = 'FF10MAX'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'FF10MAX'
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_FF10MAX'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'FF10MAX',     &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'FF10MAX',     &
+      CUNITS     = 'm s-1',       &
+      CDIR       = 'XY',          &
+      CCOMMENT   = 'X_Y_FF10MAX', &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 2,             &
+      LTIMEDEP   = .TRUE.         )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   END IF
   !
   IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN
-    TZFIELD%CMNHNAME   = 'SFCO2'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SFCO2'
-    TZFIELD%CUNITS     = 'mg m-2 s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'CO2 Surface flux'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(          &
+      CMNHNAME   = 'SFCO2',            &
+      CSTDNAME   = '',                 &
+      CLONGNAME  = 'SFCO2',            &
+      CUNITS     = 'mg m-2 s-1',       &
+      CDIR       = 'XY',               &
+      CCOMMENT   = 'CO2 Surface flux', &
+      NGRID      = 1,                  &
+      NTYPE      = TYPEREAL,           &
+      NDIMS      = 2,                  &
+      LTIMEDEP   = .TRUE.              )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SFCO2)
   END IF
   !
   IF(ANY(XCURRENT_SWD/=XUNDEF))THEN
-    TZFIELD%CMNHNAME   = 'SWD'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWD'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'incoming ShortWave at the surface'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                           &
+      CMNHNAME   = 'SWD',                               &
+      CSTDNAME   = '',                                  &
+      CLONGNAME  = 'SWD',                               &
+      CUNITS     = 'W m-2',                             &
+      CDIR       = 'XY',                                &
+      CCOMMENT   = 'incoming ShortWave at the surface', &
+      NGRID      = 1,                                   &
+      NTYPE      = TYPEREAL,                            &
+      NDIMS      = 2,                                   &
+      LTIMEDEP   = .TRUE.                               )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWD)
   END IF
   !
   IF(ANY(XCURRENT_SWU/=XUNDEF))THEN
-    TZFIELD%CMNHNAME   = 'SWU'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'SWU'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'outcoming ShortWave at the surface'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'SWU',                                &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'SWU',                                &
+      CUNITS     = 'W m-2',                              &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'outcoming ShortWave at the surface', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 2,                                    &
+      LTIMEDEP   = .TRUE.                                )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWU)
   END IF
 !
   IF(ANY(XCURRENT_LWD/=XUNDEF))THEN
-    TZFIELD%CMNHNAME   = 'LWD'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWD'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'incoming LongWave at the surface'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'LWD',                              &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'LWD',                              &
+      CUNITS     = 'W m-2',                            &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'incoming LongWave at the surface', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 2,                                  &
+      LTIMEDEP   = .TRUE.                              )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD)
   END IF
 !
   IF(ANY(XCURRENT_LWU/=XUNDEF))THEN
-    TZFIELD%CMNHNAME   = 'LWU'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'LWU'
-    TZFIELD%CUNITS     = 'W m-2'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'outcoming LongWave at the surface'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                           &
+      CMNHNAME   = 'LWU',                               &
+      CSTDNAME   = '',                                  &
+      CLONGNAME  = 'LWU',                               &
+      CUNITS     = 'W m-2',                             &
+      CDIR       = 'XY',                                &
+      CCOMMENT   = 'outcoming LongWave at the surface', &
+      NGRID      = 1,                                   &
+      NTYPE      = TYPEREAL,                            &
+      NDIMS      = 2,                                   &
+      LTIMEDEP   = .TRUE.                               )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU)
   END IF
 END IF
@@ -1071,12 +1003,14 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   END DO
   PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:)
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(&
+    CMNHNAME   = 'variables at pressure levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
   !
 !
 !*       Standard Variables
@@ -1176,12 +1110,14 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
 
   PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:)
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(&
+    CMNHNAME   = 'variables at pot. temp. levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
   !
 !
 !*       Standard Variables
@@ -1278,16 +1214,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
 ! *********************
 ! Altitude
 ! *********************
-  TZFIELD%CMNHNAME   = 'ALT_ALT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_ALT'
-  TZFIELD%CUNITS     = 'm'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Z_alt ALT'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'ALT_ALT',   &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'ALT_ALT',   &
+    CUNITS     = 'm',         &
+    CDIR       = '--',        &
+    CCOMMENT   = 'Z_alt ALT', &
+    NGRID      = 0,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 1,           &
+    LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPFILE,TZFIELD,ZAL)
 !
 !*       Standard Variables
@@ -1301,16 +1238,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
   ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3
   CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_CLOUD'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_CLOUD'
-  TZFIELD%CUNITS     = 'g kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_cloud ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'ALT_CLOUD',     &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'ALT_CLOUD',     &
+    CUNITS     = 'g kg-1',        &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_cloud ALT', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Precipitation
@@ -1323,48 +1261,51 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
   ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3
   CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_PRECIP'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_PRECIP'
-  TZFIELD%CUNITS     = 'g kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_precipitation ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(               &
+    CMNHNAME   = 'ALT_PRECIP',            &
+    CSTDNAME   = '',                      &
+    CLONGNAME  = 'ALT_PRECIP',            &
+    CUNITS     = 'g kg-1',                &
+    CDIR       = 'XY',                    &
+    CCOMMENT   = 'X_Y_precipitation ALT', &
+    NGRID      = 1,                       &
+    NTYPE      = TYPEREAL,                &
+    NDIMS      = 3,                       &
+    LTIMEDEP   = .TRUE.                   )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Potential temperature
 ! *********************
   CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_THETA'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_THETA'
-  TZFIELD%CUNITS     = 'K'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_potential temperature ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME   = 'ALT_THETA',                     &
+    CSTDNAME   = '',                              &
+    CLONGNAME  = 'ALT_THETA',                     &
+    CUNITS     = 'K',                             &
+    CDIR       = 'XY',                            &
+    CCOMMENT   = 'X_Y_potential temperature ALT', &
+    NGRID      = 1,                               &
+    NTYPE      = TYPEREAL,                        &
+    NDIMS      = 3,                               &
+    LTIMEDEP   = .TRUE.                           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Pressure
 ! *********************
   CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_PRESSURE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_PRESSURE'
-  TZFIELD%CUNITS     = 'Pa'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_pressure ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'ALT_PRESSURE',     &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = 'ALT_PRESSURE',     &
+    CUNITS     = 'Pa',               &
+    CDIR       = 'XY',               &
+    CCOMMENT   = 'X_Y_pressure ALT', &
+    NGRID      = 1,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 3,                  &
+    LTIMEDEP   = .TRUE.              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Potential Vorticity
@@ -1388,16 +1329,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
   ZPOVO(:,:,IKU)=-1.E+11
   CALL ZINTER(ZPOVO, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_PV'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_PV'
-  TZFIELD%CUNITS     = 'PVU'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_Potential Vorticity ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_PV',                      &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_PV',                      &
+    CUNITS     = 'PVU',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Potential Vorticity ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Wind
@@ -1405,31 +1347,33 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
   ZWORK31(:,:,:) = MXF(XUT(:,:,:))
   CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_U'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_U'
-  TZFIELD%CUNITS     = 'm s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_U component of wind ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_U',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_U',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_U component of wind ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
   !
   ZWORK31(:,:,:) = MYF(XVT(:,:,:))
   CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD%CMNHNAME   = 'ALT_V'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'ALT_V'
-  TZFIELD%CUNITS     = 'm s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'X_Y_V component of wind ALT'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_V',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_V',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_V component of wind ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
 ! *********************
 ! Dust extinction (optical depth per km)
@@ -1441,16 +1385,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
     ENDDO
     CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
     WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-    TZFIELD%CMNHNAME   = 'ALT_DSTEXT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'ALT_DSTEXT'
-    TZFIELD%CUNITS     = 'km-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_DuST EXTinction ALT'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'ALT_DSTEXT',              &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'ALT_DSTEXT',              &
+      CUNITS     = 'km-1',                    &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_DuST EXTinction ALT', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      LTIMEDEP   = .TRUE.                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
   END IF
 !
@@ -1483,16 +1428,17 @@ IF (LCOARSE) THEN
   CALL BLOCKAVG(XTKET,IDX,IDX,ZWORK31)
   ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31
   WRITE (YDX,FMT='(I3.3)') IDX
-  TZFIELD%CMNHNAME   = 'TKEBAVG'//YDX
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'TKEBAVG'//YDX
-  TZFIELD%CUNITS     = 'm2 s-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'TKE_BLOCKAVG'//YDX
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'TKEBAVG'//YDX,      &
+    CSTDNAME   = '',                  &
+    CLONGNAME  = 'TKEBAVG'//YDX,      &
+    CUNITS     = 'm2 s-2',            &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'TKE_BLOCKAVG'//YDX, &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !---------------------------------
 ! MOVING AVERAGE OF TKE OVER IDX+1 POINTS
@@ -1513,16 +1459,17 @@ IF (LCOARSE) THEN
   CALL MOVINGAVG(XTKET,IDX,IDX,ZWORK31)
   ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31
   WRITE (YDX,FMT='(I3.3)') 2*IDX+1
-  TZFIELD%CMNHNAME   = 'TKEMAVG'//YDX
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'TKEMAVG'//YDX
-  TZFIELD%CUNITS     = 'm2 s-2'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = 'TKE_MOVINGAVG'//YDX
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = 'TKEMAVG'//YDX,       &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = 'TKEMAVG'//YDX,       &
+    CUNITS     = 'm2 s-2',             &
+    CDIR       = 'XY',                 &
+    CCOMMENT   = 'TKE_MOVINGAVG'//YDX, &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 END IF
 !
@@ -1532,14 +1479,15 @@ END IF
 !               -------------------------------
 !
 IF (NEQ_BUDGET>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  !
-  TZFIELD%CUNITS     = 'ppp s-1'
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 4
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for CNAMES_BUDGET', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CUNITS     = 'ppv s-1',                   &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 4,                           &
+    LTIMEDEP   = .TRUE.                       )
   !
   DO JSV = 1, NEQ_BUDGET
     TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
@@ -1548,9 +1496,15 @@ IF (NEQ_BUDGET>0) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%XB_REAC(:,:,:,:))
   END DO
   !
-  TZFIELD%CUNITS     = ''
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 1
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for reaction list', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CUNITS     = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEINT,                     &
+    NDIMS      = 1,                           &
+    LTIMEDEP   = .TRUE.                       )
   !
   DO JSV=1, NEQ_BUDGET
     TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST'
@@ -1563,13 +1517,15 @@ END IF
 !
 ! chemical prod/loss terms
 IF (NEQ_PLT>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp s-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'generic for CNAMES_PRODLOSST', & !Temporary name to ease identification
+    CSTDNAME   = '',                             &
+    CUNITS     = 'ppv s-1',                      &
+    CDIR       = 'XY',                           &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
   !
   DO JSV = 1, NEQ_PLT
     TZFIELD%CMNHNAME   = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90
index d6c6ba317f2e39677d1aa0befe5efbebf1116e54..a46115d97b8cc1dae8b453bcfb91fc43b38b880f 100644
--- a/src/MNH/write_lfifmn_fordiachron.f90
+++ b/src/MNH/write_lfifmn_fordiachron.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2019 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.
@@ -109,7 +109,6 @@ USE MODD_TYPE_DATE
 USE MODD_NESTING
 USE MODD_IO, ONLY: TFILEDATA
 !
-USE MODE_GATHER_ll
 USE MODE_GRIDPROJ
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 USE MODE_ll
@@ -127,11 +126,6 @@ INTEGER                           :: IRESP          ! return-code!
 LOGICAL                           :: GPACK
 !
 REAL                              :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point
-REAL                              :: ZXHATM, ZYHATM ! conformal    coordinates of 1st mass point
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll       !  Position x in the conformal
-                                                    ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll       !   Position y in the conformal
-                                                    ! plane (array on the complete domain)
 !
 !-------------------------------------------------------------------------------
 !
@@ -163,13 +157,7 @@ IF (.NOT.LCARTESIAN) THEN
   !
   !* diagnostic of 1st mass point
   !
-  ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !//
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !//
-  ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2))
-  ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2))
-  CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
+  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR )
 !
   CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
   CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index dd96607f1733505d37f5e5a40a110a1f5729cec1..a2847e0dc87f690592925e98ee6686562766266d 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.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.
@@ -153,14 +153,12 @@ END MODULE MODI_WRITE_LFIFM_n
 !!       M.Tomasini    06/12 2D west african monsoon: nesting for ADV forcing writing
 !!       Pialat/Tulet  15/02/2012 add ForeFire variables
 !!       J. Escobar    Mars 2014 , missing YDIR="XY" in 1.6 for tendencies fields 
-!!       J.escobar & M.Leriche 23/06/2014 Pb with JSA increment versus ini_nsv order initialization 
 !!       P. Tulet      Nov 2014 accumulated moles of aqueous species that fall at the surface
 !!       M.Faivre      2014
 !!       C.Lac         Dec.2014 writing past wind fields for centred advection
 !!       J.-P. Pinty   Jan 2015 add LNOx and flash map diagnostics
 !!       J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
 !!       P. Tulet & M. Leriche    Nov 2015 add mean pH value in the rain at the surface
-!!       J.escobar     04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization
 !!       Modification    01/2016  (JP Pinty) Add LIMA
 !!       M.Mazoyer     04/16 : Add supersaturation fields
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
@@ -173,132 +171,114 @@ END MODULE MODI_WRITE_LFIFM_n
 !  S. Bielli      02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Tulet       02/2020: correction for dust and sea salts
-!!      B. Vie          06/2020 Add prognostic supersaturation for LIMA
-!  PA. Joulin    12/2020: add wind turbine outputs
-!  F. Auguste    02/2021: add IBM
-!  T. Nagel      02/2021: add turbulence recycling
+!  B. Vie         06/2020: add prognostic supersaturation for LIMA
+!  PA. Joulin     12/2020: add wind turbine outputs
+!  F. Auguste     02/2021: add IBM
+!  T. Nagel       02/2021: add turbulence recycling
 !  P. Wautelet 10/03/2021: use scalar variable names for dust and salt
 !  P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL
 !  J.L. Redelsperger 03/2021: add OCEAN and auto-coupled O-A LES cases
 !  A. Costes      12/2021: add Blaze fire model
-!  E. Jezequel 11/2022 : add covariances from MEAN fields
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!  E. Jezequel    11/2022: add covariances from MEAN fields
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_DIM_n
+USE MODD_2D_FRC
+USE MODD_ADVFRC_n
+USE MODD_ADV_n,            ONLY: CUVW_ADV_SCHEME, XRTKEMS, CTEMP_SCHEME, LSPLIT_CFL
+USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n
+USE MODD_CH_MNHC_n,       ONLY: LUSECHEM,LCH_CONV_LINOX, &
+                                LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT
+USE MODD_CH_PH_n
+USE MODD_CLOUDPAR
+USE MODD_CONDSAMP
 USE MODD_CONF
 USE MODD_CONF_n
-use modd_field,       only: tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
-USE MODD_GRID
-USE MODD_GRID_n
-USE MODD_TIME
-USE MODD_TIME_n
-USE MODD_FIELD_n
-USE MODD_MEAN_FIELD
-USE MODD_MEAN_FIELD_n
+USE MODD_CST
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DEF_EDDY_FLUX_n
+USE MODD_DEF_EDDYUV_FLUX_n
+USE MODD_DIM_n
 USE MODD_DUMMY_GR_FIELD_n
-USE MODD_LSFIELD_n
+USE MODD_DUST
 USE MODD_DYN_n
-USE MODD_PARAM_n
-USE MODD_REF
-USE MODD_LUNIT_n
-USE MODD_TURB_n
-USE MODD_RADIATIONS_n,   ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, &
-                                XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, &
-                                XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM
-USE MODD_REF_n,  ONLY : XRHODREF
-USE MODD_FRC
-USE MODD_PRECIP_n
+USE MODD_ELEC_DESCR,      ONLY: LLNOX_EXPLICIT
+USE MODD_ELEC_FLASH
 USE MODD_ELEC_n
-USE MODD_CST
-USE MODD_CLOUDPAR
-USE MODD_DEEP_CONVECTION_n
-USE MODD_PARAM_KAFR_n
-USE MODD_NESTING
-USE MODD_PARAMETERS
+USE MODD_EOL_ADNR
+USE MODD_EOL_ALM
+USE MODD_EOL_MAIN
+USE MODD_EOL_SHARED_IO
+USE MODD_FIELD_n
+use modd_field,       only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
+USE MODD_FIRE
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_FRC
 USE MODD_GR_FIELD_n
-USE MODD_CH_MNHC_n,       ONLY: LUSECHEM,LCH_CONV_LINOX, &
-                                LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT
-USE MODD_CH_PH_n
-USE MODD_CH_M9_n
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES, LLNOX_EXPLICIT
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_NSV
-USE MODD_AIRCRAFT_BALLOON
+USE MODD_GRID
+USE MODD_GRID_n
 USE MODD_HURR_CONF, ONLY: LFILTERING,CFILTERING,NDIAG_FILT
 USE MODD_HURR_FIELD_n
-USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D
-USE MODD_DUST
-USE MODD_SALT
+USE MODD_IBM_LSF,         ONLY: LIBM_LSF
+USE MODD_IBM_PARAM_n,     ONLY: LIBM, XIBM_LS
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_LATZ_EDFLX
+USE MODD_LIMA_PRECIP_SCAVENGING_n
+USE MODD_LSFIELD_n
+USE MODD_LUNIT_n
+USE MODD_MEAN_FIELD_n
+USE MODD_NESTING
+USE MODD_NSV
 USE MODD_OCEANH
+USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
+USE MODD_PARAMETERS
+USE MODD_PARAM_KAFR_n,      ONLY: LCHTRANS
+USE MODD_PARAM_LIMA,     ONLY: LSCAV, LAERO_MASS
+USE MODD_PARAM_n
 USE MODD_PASPOL
-#ifdef MNH_FOREFIRE
-USE MODD_FOREFIRE
-#endif
-USE MODD_CONDSAMP
-USE MODD_CH_AEROSOL
-USE MODD_CH_AERO_n
-USE MODE_AERO_PSD
-USE MODD_BLOWSNOW
-USE MODD_BLOWSNOW_n
 USE MODD_PAST_FIELD_n
-USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME,XRTKEMS,CTEMP_SCHEME,LSPLIT_CFL
-USE MODD_ELEC_FLASH
-!
-USE MODD_PARAM_LIMA     , ONLY: NMOD_CCN, LSCAV, LAERO_MASS,                &
-                                NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_LIMA_PRECIP_SCAVENGING_n
-!
-USE MODE_IO_FILE,        only: IO_File_close
-USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-USE MODE_ll
-USE MODD_IO, ONLY: TFILEDATA
+USE MODD_PRECIP_n
+USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D
+USE MODD_RADIATIONS_n,   ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, &
+                                XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, &
+                                XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM
+USE MODD_RECYCL_PARAM_n
+USE MODD_REF
+USE MODD_REF_n,  ONLY : XRHODREF
+USE MODD_RELFRC_n
+USE MODD_SALT
+USE MODD_TIME
+USE MODD_TIME_n
+USE MODD_TURB_n
+
+USE MODE_EXTRAPOL
 use mode_field, only: Find_field_id_from_mnhname
-USE MODE_GATHER_ll
 USE MODE_GRIDPROJ
-USE MODE_MSG
+USE MODE_IO_FIELD_WRITE, only: IO_Field_write
+USE MODE_IO_FILE,        only: IO_File_close
+USE MODE_ll
 USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_MSG
 USE MODE_TOOLS, ONLY: UPCASE
-!
-USE MODI_WRITE_LB_n
-USE MODI_WRITE_BALLOON_n
-USE MODI_DUSTLFI_n
-USE MODI_SALTLFI_n
+USE MODE_WRITE_BALLOON_n, ONLY: WRITE_BALLOON_n
+
 USE MODI_CH_AER_REALLFI_n
-USE MODI_SALT_FILTER
 USE MODI_DUST_FILTER
-!
-!20131128
-USE MODE_MPPDB
-USE MODE_EXTRAPOL
-! Modif Eddy fluxes
-USE MODD_DEF_EDDY_FLUX_n       ! Ajout PP
-USE MODD_DEF_EDDYUV_FLUX_n     ! Ajout PP
-USE MODD_LATZ_EDFLX            ! Ajout PP
-!
-USE MODD_2D_FRC                  ! Ajout PP
-USE MODD_ADVFRC_n              ! Modif PP ADV FRC
-USE MODD_RELFRC_n
-!
-USE MODD_PARAM_C2R2
-!
-USE MODD_EOL_MAIN
-USE MODD_EOL_SHARED_IO
-USE MODD_EOL_ADNR
-USE MODD_EOL_ALM
-!
-USE MODD_RECYCL_PARAM_n
-USE MODD_IBM_PARAM_n,     ONLY: LIBM, XIBM_LS
-USE MODD_IBM_LSF,         ONLY: LIBM_LSF
-!
-USE MODD_FIRE
-! 
+USE MODI_DUSTLFI_n
+USE MODI_SALT_FILTER
+USE MODI_SALTLFI_n
+USE MODI_WRITE_LB_n
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
@@ -313,9 +293,7 @@ INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
                                     !in LFI subroutines at the open of the file              
 !
 INTEGER           :: JSV            ! loop index for scalar variables
-INTEGER           :: JSA            ! beginning of chemical-aerosol variables
-
-! 
+!
 CHARACTER(LEN=3)  :: YFRC           ! to mark the time of the forcing
 INTEGER           :: JT             ! loop index
 !
@@ -323,25 +301,15 @@ REAL,DIMENSION(:,:), ALLOCATABLE  :: ZWORK2D     ! Working array
 REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZWORK3D     ! Working array
 !
 REAL                              :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point
-REAL                              :: ZXHATM, ZYHATM ! conformal    coordinates of 1st mass point
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
-                                                 ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
-                                                 ! plane (array on the complete domain)
 INTEGER :: IMI ! Current model index
 !
-INTEGER           :: ICH_NBR        ! to write number and names of scalar 
-INTEGER,DIMENSION(:),ALLOCATABLE :: ICH_NAMES !(chem+aero+dust) variables
-CHARACTER(LEN=NMNHNAMELGTMAX),DIMENSION(:),ALLOCATABLE :: YDSTNAMES,YCHNAMES, YSLTNAMES
-INTEGER           :: ILREC,ILENG    !in NSV.DIM and NSV.TITRE
 INTEGER           :: INFO_ll
-INTEGER :: IKRAD
 INTEGER           :: JI,JJ,JK   ! loop index
 INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
 !
-CHARACTER(LEN=2)  :: INDICE
-INTEGER           :: IID
-TYPE(TFIELDDATA)  :: TZFIELD
+INTEGER              :: IDX
+INTEGER              :: IID
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*	0. Initialization
@@ -349,6 +317,8 @@ TYPE(TFIELDDATA)  :: TZFIELD
 IMI = GET_CURRENT_MODEL_INDEX()
 !
 ILUOUT=TLUOUT%NLU
+
+IDX = 1
 !
 ALLOCATE(ZWORK2D(SIZE(XTHT,1),SIZE(XTHT,2)))
 ALLOCATE(ZWORK3D(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
@@ -393,13 +363,7 @@ IF (.NOT.LCARTESIAN) THEN
 ! 
 !* diagnostic of 1st mass point
 !
-  ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !//
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !//
-  ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2))
-  ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2))
-  CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
+  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR )
 !
   CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
   CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
@@ -452,15 +416,17 @@ CALL IO_Field_write(TPFILE,'SURF',     CSURF)
 CALL IO_Field_write(TPFILE,'CPL_AROME',LCPL_AROME)
 CALL IO_Field_write(TPFILE,'COUPLING', LCOUPLING)
 !
-TZFIELD%CMNHNAME   = 'RECYCLING'
-TZFIELD%CLONGNAME  = 'RECYCLING'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%NGRID      = 1
-TZFIELD%NTYPE      = TYPELOG
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .FALSE. 
+TZFIELD = TFIELDMETADATA(   &
+  CMNHNAME   = 'RECYCLING', &
+  CLONGNAME  = 'RECYCLING', &
+  CSTDNAME   = '',          &
+  CUNITS     = '',          &
+  CDIR       = '--',        &
+  CCOMMENT   = '',          &
+  NGRID      = 1,           &
+  NTYPE      = TYPELOG,     &
+  NDIMS      = 0,           &
+  LTIMEDEP   = .FALSE.      )
 CALL IO_Field_write(TPFILE,TZFIELD,LRECYCL)
 !
 !*       1.4    Prognostic variables :
@@ -484,6 +450,7 @@ CALL IO_Field_write(TPFILE,'VT',XVT)
 CALL IO_Field_write(TPFILE,'WT',XWT)
 !
 CALL IO_Field_write(TPFILE,'THT',XTHT)
+!
 IF (LBLAZE) THEN
   CALL IO_Field_write( TPFILE, 'LSPHI', XLSPHI )
   CALL IO_Field_write( TPFILE, 'BMAP', XBMAP )
@@ -517,16 +484,17 @@ END IF
 !
 IF (LIBM .OR. LIBM_LSF) THEN
   !
-  TZFIELD%CMNHNAME  = 'LSFP'
-  TZFIELD%CLONGNAME = 'LSFP'
-  TZFIELD%CSTDNAME  = ''
-  TZFIELD%CUNITS    = 'm'
-  TZFIELD%CDIR      = 'XY'
-  TZFIELD%NGRID     = 1
-  TZFIELD%NTYPE     = TYPEREAL
-  TZFIELD%NDIMS     = 3
-  TZFIELD%LTIMEDEP  = .TRUE.
-  TZFIELD%CCOMMENT  = 'Level Set Function at mass node'
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME  = 'LSFP',                           &
+    CLONGNAME = 'LSFP',                           &
+    CSTDNAME  = '',                               &
+    CUNITS    = 'm',                              &
+    CDIR      = 'XY',                             &
+    NGRID     = 1,                                &
+    NTYPE     = TYPEREAL,                         &
+    NDIMS     = 3,                                &
+    LTIMEDEP  = .TRUE.,                           &
+    CCOMMENT  = 'Level Set Function at mass node' )
   !
   CALL IO_Field_write(TPFILE,TZFIELD,XIBM_LS(:,:,:,1))
   !
@@ -534,189 +502,204 @@ ENDIF
 !
 IF (LRECYCL) THEN
   !
-  TZFIELD%CMNHNAME   = 'RCOUNT'
-  TZFIELD%CLONGNAME  = 'RCOUNT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .TRUE.
-  TZFIELD%CCOMMENT   = 'Incremental counter for averaging purpose'
+  TZFIELD = TFIELDMETADATA(                                  &
+    CMNHNAME   = 'RCOUNT',                                   &
+    CLONGNAME  = 'RCOUNT',                                   &
+    CSTDNAME   = '',                                         &
+    CUNITS     = '',                                         &
+    CDIR       = '--',                                       &
+    NGRID      = 1,                                          &
+    NTYPE      = TYPEINT,                                    &
+    NDIMS      = 0,                                          &
+    LTIMEDEP   = .TRUE.,                                     &
+    CCOMMENT   = 'Incremental counter for averaging purpose' )
   CALL IO_Field_write(TPFILE,TZFIELD,NR_COUNT)
   !
   IF (LRECYCLW) THEN
-    TZFIELD%CMNHNAME   = 'URECYCLW'
-    TZFIELD%CLONGNAME  = 'URECYCLW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'UMEAN-WEST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'URECYCLW',                                  &
+      CLONGNAME  = 'URECYCLW',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 2,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'UMEAN-WEST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANW(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'VRECYCLW'
-    TZFIELD%CLONGNAME  = 'VRECYCLW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'VMEAN-WEST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'VRECYCLW',                                  &
+      CLONGNAME  = 'VRECYCLW',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 3,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'VMEAN-WEST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANW(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'WRECYCLW'
-    TZFIELD%CLONGNAME  = 'WRECYCLW'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'WMEAN-WEST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'WRECYCLW',                                  &
+      CLONGNAME  = 'WRECYCLW',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'WMEAN-WEST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XWMEANW(:,:,:))
     !
   ENDIF  
   IF (LRECYCLN) THEN
-    TZFIELD%CMNHNAME   = 'URECYCLN'
-    TZFIELD%CLONGNAME  = 'URECYCLN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'UMEAN-NORTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'URECYCLN',                                   &
+      CLONGNAME  = 'URECYCLN',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 2,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'UMEAN-NORTH side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANN(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'VRECYCLN'
-    TZFIELD%CLONGNAME  = 'VRECYCLN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'VMEAN-NORTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'VRECYCLN',                                   &
+      CLONGNAME  = 'VRECYCLN',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 3,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'VMEAN-NORTH side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANN(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'WRECYCLN'
-    TZFIELD%CLONGNAME  = 'WRECYCLN'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'WMEAN-NORTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'WRECYCLN',                                   &
+      CLONGNAME  = 'WRECYCLN',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 4,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'WMEAN-NORTH side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XWMEANN(:,:,:))
     !
   ENDIF
   IF (LRECYCLE) THEN
-    TZFIELD%CMNHNAME   = 'URECYCLE'
-    TZFIELD%CLONGNAME  = 'URECYCLE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'UMEAN-EAST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'URECYCLE',                                  &
+      CLONGNAME  = 'URECYCLE',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 2,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'UMEAN-EAST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANE(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'VRECYCLE'
-    TZFIELD%CLONGNAME  = 'VRECYCLE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'VMEAN-EAST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'VRECYCLE',                                  &
+      CLONGNAME  = 'VRECYCLE',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 3,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'VMEAN-EAST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANE(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'WRECYCLE'
-    TZFIELD%CLONGNAME  = 'WRECYCLE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'WMEAN-EAST side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'WRECYCLE',                                  &
+      CLONGNAME  = 'WRECYCLE',                                  &
+      CSTDNAME   = '',                                          &
+      CUNITS     = 'm s-1',                                     &
+      CDIR       = 'XY',                                        &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.,                                      &
+      CCOMMENT   = 'WMEAN-EAST side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XWMEANE(:,:,:))
     !
   ENDIF
   IF (LRECYCLS) THEN
-    TZFIELD%CMNHNAME   = 'URECYCLS'
-    TZFIELD%CLONGNAME  = 'URECYCLS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'UMEAN-SOUTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'URECYCLS',                                   &
+      CLONGNAME  = 'URECYCLS',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 2,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'UMEAN-SOUTH side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANS(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'VRECYCLS'
-    TZFIELD%CLONGNAME  = 'VRECYCLS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'VMEAN-SOUTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'VRECYCLS',                                   &
+      CLONGNAME  = 'VRECYCLS',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 3,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'VMEAN-SOUTH side plan for recycling purpose' )
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANS(:,:,:))
     !
-    TZFIELD%CMNHNAME   = 'WRECYCLS'
-    TZFIELD%CLONGNAME  = 'WRECYCLS'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    TZFIELD%CCOMMENT   = 'WMEAN-SOUTH side plan for recycling purpose'
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'WRECYCLS',                                   &
+      CLONGNAME  = 'WRECYCLS',                                   &
+      CSTDNAME   = '',                                           &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      NGRID      = 4,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.,                                       &
+      CCOMMENT   = 'WMEAN-SOUTH side plan for recycling purpose' )
     !
   ENDIF  
 ENDIF
 !
 IF (MEAN_COUNT /= 0) THEN
 !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+  TZFIELD = TFIELDMETADATA(                          &
+    CMNHNAME   = 'generic for mean_count variables', & !Temporary name to ease identification
+    CSTDNAME   = '',                                 &
+    CDIR       = 'XY',                               &
+    NTYPE      = TYPEREAL,                           &
+    NDIMS      = 3,                                  &
+    LTIMEDEP   = .TRUE.                              )
 !
   TZFIELD%NGRID      = 2
 !
@@ -938,149 +921,42 @@ IF (NRR >=1) THEN
   IF (LUSERH) CALL IO_Field_write(TPFILE,'RHT',XRT(:,:,:,IDX_RHT))
 END IF
 !
-IF (NSV >=1) THEN
-  JSA=0
-  ! User scalar variables
-  IF (NSV_USER>0) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = 1,NSV_USER
-      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
-  END IF
-  ! microphysical C2R2 scheme scalar variables
-  IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C2R2BEG,NSV_C2R2END
-      TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
+IF (NSV >= 1 ) THEN
+  ! aerosol scalar variables
+  IF ( LORILAM ) THEN
+    IF ((CPROGRAM == 'REAL  ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT))  &
+      CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF)
+    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1))  &
+      CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),  XRHODREF)
   END IF
-  ! microphysical C3R5 scheme additional scalar variables
-  IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm-3'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_C1R3BEG,NSV_C1R3END
-      TZFIELD%CMNHNAME   = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
+
+  ! dust scalar variables
+  IF ( LDUST ) THEN
+    IF ((CPROGRAM == 'REAL  ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT).AND.(.NOT.LDSTCAMS)) &
+      CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
+    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) &
+      CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
+    !At this point, we have the tracer array in order of importance, i.e.
+    !if mode 2 is most important it will occupy place 1-3 of XSVT
+    CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
   END IF
-!
-! microphysical LIMA variables
-!
-  IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+
+  ! sea salt scalar variables
+  IF ( LSALT ) THEN
+    IF ((CPROGRAM == 'REAL  ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT).AND.(.NOT.LSLTCAMS)) &
+      CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ)
+    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) &
+      CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ)
+    !At this point, we have the tracer array in order of importance, i.e.
+    !if mode 2 is most important it will occupy place 1-3 of XSVT
+    CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF)
   END IF
-  !
-  DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
-    !
-    TZFIELD%CUNITS     = 'kg-1'
-    WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-    !
-! Nc
-    IF (JSV .EQ. NSV_LIMA_NC) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(1))//'T'
-    END IF
-! Nr
-    IF (JSV .EQ. NSV_LIMA_NR) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(2))//'T'
-    END IF
-! N CCN free
-    IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
-    END IF
-! N CCN acti
-    IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
-    END IF
-! Scavenging
-    IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
-      TZFIELD%CUNITS     = 'kg kg-1'
-    END IF
-! Ni
-    IF (JSV .EQ. NSV_LIMA_NI) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(1))//'T'
-    END IF
-! Ns                                                                                
-    IF (JSV .EQ. NSV_LIMA_NS) THEN                                                  
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(2))//'T'                           
-    END IF
-! Ng
-    IF (JSV .EQ. NSV_LIMA_NG) THEN                                                  
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(3))//'T'                           
-    END IF                                                                          
-! Nh
-    IF (JSV .EQ. NSV_LIMA_NH) THEN                                                  
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//'T'                           
-    END IF 
-! N IFN free
-    IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T'
-    END IF
-! N IFN nucl
-    IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
-      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T'
-    END IF
-! N IMM nucl
-    IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-      WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T'
-    END IF
-! Hom. freez. of CCN
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(8))//'T'
-    END IF
-    !
-! Supersaturation     
-    IF (JSV .EQ. NSV_LIMA_SPRO) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(5))//'T'
-    END IF
-    !
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-!
-    JSA=JSA+1
+
+  !Store all scalar variables
+  DO JSV = 1, NSV
+    CALL IO_Field_write( TPFILE, TSVLIST(JSV), XSVT(:,:,:,JSV) )
   END DO
-!
+
   IF (LSCAV .AND. LAERO_MASS) THEN
   IF (ASSOCIATED(XINPAP)) THEN
   IF (SIZE(XINPAP) /= 0 ) THEN
@@ -1088,84 +964,61 @@ IF (NSV >=1) THEN
     !
     ZWORK2D(:,:)  = XRHOLW*XINPRR(:,:)*XSVT(:,:,2,NSV_LIMA_SCAVMASS)/ &
                                         max( 1.e-20,XRT(:,:,2,3) ) !~2=at ground level
-    TZFIELD%CMNHNAME   = 'INPBP'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'INPBP'
-    TZFIELD%CUNITS     = 'kg m-2 s-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_INstantaneous Precipitating Aerosol Rate'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                                      &
+      CMNHNAME   = 'INPBP',                                        &
+      CSTDNAME   = '',                                             &
+      CLONGNAME  = 'INPBP',                                        &
+      CUNITS     = 'kg m-2 s-1',                                   &
+      CDIR       = 'XY',                                           &
+      CCOMMENT   = 'X_Y_INstantaneous Precipitating Aerosol Rate', &
+      NGRID      = 1,                                              &
+      NTYPE      = TYPEREAL,                                       &
+      NDIMS      = 2,                                              &
+      LTIMEDEP   = .TRUE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D)
     !
     CALL IO_Field_write(TPFILE,'ACPAP',XACPAP)
   END IF
   END IF
   END IF
-!
-!
+
   ! electrical scalar variables
-  IF (NSV_ELECEND>=NSV_ELECBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_ELECBEG,NSV_ELECEND
-      TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN 
-        TZFIELD%CUNITS     = 'C m-3'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      ELSE
-        TZFIELD%CUNITS     = 'm-3'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
-      END IF
-      ZWORK3D(:,:,:) = XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3
-      CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D)
-      JSA=JSA+1
-    END DO
-  END IF
-  !
   IF (CELEC /= 'NONE') THEN
     CALL IO_Field_write(TPFILE,'EFIELDU',XEFIELDU)
     CALL IO_Field_write(TPFILE,'EFIELDV',XEFIELDV)
     CALL IO_Field_write(TPFILE,'EFIELDW',XEFIELDW)
  !
-    TZFIELD%CMNHNAME   = 'EMODULE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'V m-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(       &
+      CMNHNAME   = 'EMODULE',       &
+      CSTDNAME   = '',              &
+      CLONGNAME  = 'EMODULE',       &
+      CUNITS     = 'V m-1',         &
+      CDIR       = 'XY',            &
+      CCOMMENT   = 'X_Y_Z_EMODULE', &
+      NGRID      = 1,               &
+      NTYPE      = TYPEREAL,        &
+      NDIMS      = 3,               &
+      LTIMEDEP   = .TRUE.           )
     ZWORK3D(:,:,:) = (XEFIELDU**2 + XEFIELDV**2 + XEFIELDW**2)**0.5
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D)
  !
     CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'pC m-3 s-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XNI_IAGGS*1.E12)
  !
     CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'pC m-3 s-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XNI_IDRYG*1.E12)
  !
     CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'pC m-3 s-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XNI_SDRYG*1.E12)
  !
     CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'pC m-3 s-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XIND_RATE*1.E12)
  !
@@ -1175,57 +1028,6 @@ IF (NSV >=1) THEN
     CALL IO_Field_write(TPFILE,'AREA_IC',   NMAP_2DAREA_IC)
     CALL IO_Field_write(TPFILE,'FLASH_3DCG',NMAP_3DCG)
     CALL IO_Field_write(TPFILE,'FLASH_3DIC',NMAP_3DIC)
- !
-    IF (LLNOX_EXPLICIT) THEN
-      TZFIELD%CMNHNAME   = 'LINOX'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'mol mol-1'
-      TZFIELD%CDIR       = 'XY'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,NSV_LNOXEND))
-      JSA=JSA+1
-    END IF
-  END IF
-  ! lagrangian variables
-  IF (NSV_LGEND>=NSV_LGBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LGBEG,NSV_LGEND
-      TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
-  END IF
-  ! Passive scalar variables        
-  IF (LPASPOL) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_PPBEG,NSV_PPEND
-      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
   END IF
 !
   IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN
@@ -1237,149 +1039,18 @@ IF (NSV >=1) THEN
     CALL IO_Field_write(TPFILE,'NPRO', XNPRO(:,:,:))
   END IF
 !
-#ifdef MNH_FOREFIRE
-  ! ForeFire scalar variables
-  IF ( LFOREFIRE ) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_FFBEG,NSV_FFEND
-      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
-  END IF
-#endif
-! Blaze scalar variables
-IF ( LBLAZE ) THEN
-  TZFIELD%CSTDNAME   = 'fire smoke'
-  TZFIELD%CUNITS     = 'kg kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
-  !
-  DO JSV = NSV_FIREBEG,NSV_FIREEND
-    WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-    JSA=JSA+1
-  END DO
-END IF
-! Blowing snow variables
-  IF (LBLOWSNOW) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    DO JSV = NSV_SNWBEG,NSV_SNWEND
-      TZFIELD%CMNHNAME=TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
-    DO JSV = 1,(NSV_SNW)
-      WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)')'X_Y_Z_','SNOWCANO',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSNWCANO(:,:,JSV))
-      JSA=JSA+1
-    END DO
-  ENDIF
-  ! Conditional sampling variables  
-  IF (LCONDSAMP) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_CSBEG,NSV_CSEND
-      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      JSA=JSA+1
-    END DO
-  !
-  END IF
-  ! number of chemical variables (chem+aero+dust)
-  ICH_NBR = 0
-  IF (LUSECHEM) ICH_NBR = ICH_NBR +NSV_CHEMEND-NSV_CHEMBEG+1 
-  IF (LUSECHIC) ICH_NBR = ICH_NBR +NSV_CHICEND-NSV_CHICBEG+1
-  IF (.NOT.LUSECHEM.AND.LCH_CONV_LINOX) ICH_NBR = ICH_NBR + &
-                                                  NSV_LNOXEND-NSV_LNOXBEG+1 
-  IF (LORILAM)  ICH_NBR = ICH_NBR +NSV_AEREND -NSV_AERBEG+1 
-  IF (LDUST)    ICH_NBR = ICH_NBR +NSV_DSTEND -NSV_DSTBEG+1
-  IF (LDEPOS_DST(IMI))  ICH_NBR = ICH_NBR +NSV_DSTDEPEND -NSV_DSTDEPBEG+1 
-  IF (LDEPOS_SLT(IMI))  ICH_NBR = ICH_NBR +NSV_SLTDEPEND -NSV_SLTDEPBEG+1 
-  IF (LDEPOS_AER(IMI))  ICH_NBR = ICH_NBR +NSV_AERDEPEND -NSV_AERDEPBEG+1 
-  IF (LSALT)    ICH_NBR = ICH_NBR +NSV_SLTEND -NSV_SLTBEG+1
-  IF (ICH_NBR /=0) ALLOCATE(YCHNAMES(ICH_NBR))
-  ! chemical scalar variables
   IF (LUSECHEM) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-      TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ppp'
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      !
-      YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without T
-    END DO
-    !
-    IF (LUSECHIC) THEN
-      DO JSV = NSV_CHICBEG,NSV_CHICEND
-        TZFIELD%CMNHNAME   = TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CUNITS     = 'ppp'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-        !
-        YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without M
-      END DO
-    ENDIF
-    IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol i/m2) 
-      TZFIELD%NDIMS = 2
-      DO JSV = NSV_CHACBEG+NSV_CHAC/2,NSV_CHACEND
-        TZFIELD%CMNHNAME   = 'ACPR_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CUNITS     = 'mol i m-2'
+    IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol/m2)
+      DO JSV = NSV_CHACBEG + NSV_CHAC / 2, NSV_CHACEND
+        TZFIELD = TSVLIST(JSV)
+        TZFIELD%CMNHNAME   = 'ACPR_' // TRIM( TZFIELD%CMNHNAME )
+        TZFIELD%CLONGNAME  = 'ACPR_' // TRIM( TZFIELD%CLONGNAME )
+        TZFIELD%CUNITS     = 'mol m-2'
         TZFIELD%CCOMMENT   = 'X_Y_Accumulated moles of aqueous species at the surface'
+        TZFIELD%NDIMS      = 2
         ZWORK2D(:,:)  = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1)
         CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D)
       END DO
-      TZFIELD%NDIMS = 3
     END IF
     IF (LUSECHAQ.AND.LCH_PH) THEN  ! pH values in cloud
       CALL IO_Field_write(TPFILE,'PHC',XPHC)
@@ -1388,7 +1059,7 @@ END IF
         ! compute mean pH in accumulated surface water
         !ZWORK2D(:,:) = 10**(-XCH_PHINIT)
         WHERE (XACPRR > 0.)
-          ZWORK2D(:,:) =  XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water 
+          ZWORK2D(:,:) =  XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water
         ELSE WHERE
           ZWORK2D(:,:) = XUNDEF
         END WHERE
@@ -1404,238 +1075,41 @@ END IF
         TZFIELD%NGRID      = 1
         TZFIELD%NTYPE      = TYPEREAL
         TZFIELD%NDIMS      = 2
+        TZFIELD%LTIMEDEP = .TRUE.
         CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D)
       ENDIF
     ENDIF
-  ELSE IF (LCH_CONV_LINOX) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-      TZFIELD%CMNHNAME   = 'LINOXT'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-    END DO
-  ENDIF  
-  ! aerosol scalar variables
-  IF (LORILAM) THEN
-    IF ((CPROGRAM == 'REAL  ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT))  &
-      CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF)
-    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1))  &
-      CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),  XRHODREF)
-    IF (NSV_AEREND>=NSV_AERBEG) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_AERBEG,NSV_AEREND
-        TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-        IF (JSV==NSV_AERBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERBEG ',JSV
-        IF (JSV==NSV_AEREND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AEREND ',JSV
-        YCHNAMES(JSV-JSA)=  TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-      END DO
-        IF (.NOT.(ASSOCIATED(XN3D)))   &
-          ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
-        IF (.NOT.(ASSOCIATED(XRG3D)))  &
-          ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
-        IF (.NOT.(ASSOCIATED(XSIG3D))) &
-          ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
-          CALL  PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, &
-                     PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D)
-        
-    END IF
-    IF (LDEPOS_AER(IMI)) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-        IF (JSV==NSV_AERDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPBEG ',JSV
-        IF (JSV==NSV_AERDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPEND ',JSV
-        YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-      END DO   ! Loop on aq dust scalar variables      
-    ENDIF
-  END IF
-  ! dust scalar variables
-  IF (LDUST) THEN
-!    IF ((CPROGRAM == 'REAL  ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) &
-    IF ((CPROGRAM == 'REAL  ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT).AND.(.NOT.LDSTCAMS)) &
-!UPG*PT
-      CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
-    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) &
-      CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
-    !At this point, we have the tracer array in order of importance, i.e.
-    !if mode 2 is most important it will occupy place 1-3 of XSVT  
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
-    DO JSV = NSV_DSTBEG,NSV_DSTEND
-      TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV
-      IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV
-      YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-    END DO   ! Loop on dust scalar variables
-
-    IF (LDEPOS_DST(IMI)) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-        IF (JSV==NSV_DSTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPBEG ',JSV
-        IF (JSV==NSV_DSTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPEND ',JSV
-        YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-      END DO   ! Loop on aq dust scalar variables
-    ENDIF
   ENDIF
-  ! sea salt scalar variables
-  IF (LSALT) THEN
-!UPG*PT
-!    IF ((CPROGRAM == 'REAL  ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) &
-    IF ((CPROGRAM == 'REAL  ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT).AND.(.NOT.LSLTCAMS)) &
-!UPG*PT
-      CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ)
-    IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) &
-      CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ)
-    !At this point, we have the tracer array in order of importance, i.e.
-    !if mode 2 is most important it will occupy place 1-3 of XSVT  
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF)
-    DO JSV = NSV_SLTBEG,NSV_SLTEND
-      TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-      IF (JSV==NSV_SLTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTBEG ',JSV
-      IF (JSV==NSV_SLTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTEND ',JSV
-      YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-    END DO   ! Loop on sea salt scalar variables
-
-    IF (LDEPOS_SLT(IMI)) THEN        
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
-      !
-      DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
-        TZFIELD%CMNHNAME   = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-        IF (JSV==NSV_SLTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPBEG ',JSV
-        IF (JSV==NSV_SLTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPEND ',JSV
-        YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
-      END DO   ! Loop on aq dust scalar variables      
-    ENDIF
-  ENDIF  
-  !
-  DO JSV=1,ICH_NBR
-    WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV))
-  END DO
-  TZFIELD%CMNHNAME   = 'NSV.DIM'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'NSV.DIM'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Number of chemical variables'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
-  CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR)
   !
-  IF (ICH_NBR/=0) THEN
-    TZFIELD%CMNHNAME   = 'NSV.TITRE'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'NSV.TITRE'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEINT
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
-    ILREC=LEN(YCHNAMES(1))
-    ILENG=ILREC*ICH_NBR
-    ALLOCATE(ICH_NAMES(ILENG))
-    DO JSV = 1,ICH_NBR
-      DO JT = 1,ILREC
-        ICH_NAMES(ILREC*(JSV-1)+JT) = ICHAR(YCHNAMES(JSV)(JT:JT))
-      ENDDO
-    ENDDO
-    CALL IO_Field_write(TPFILE,TZFIELD,ICH_NAMES)
-    DEALLOCATE(YCHNAMES,ICH_NAMES)
-  END IF 
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'NSVCHEM',                      &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'NSVCHEM',                      &
+    CUNITS     = '',                             &
+    CDIR       = '--',                           &
+    CCOMMENT   = 'Number of chemical variables', &
+    NGRID      = 0,                              &
+    NTYPE      = TYPEINT,                        &
+    NDIMS      = 0,                              &
+    LTIMEDEP   = .FALSE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,NSV_CHEM_LIST)
   !
-  ! lagrangian variables
-  IF (NSV_LGEND>=NSV_LGBEG) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'm'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = NSV_LGBEG,NSV_LGEND
-      TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-    END DO
+  IF ( NSV_CHEM_LIST > 0 ) THEN
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'SV_CHEM_LIST',               &
+      CSTDNAME   = '',                           &
+      CLONGNAME  = 'SV_CHEM_LIST',               &
+      CUNITS     = '',                           &
+      CDIR       = '--',                         &
+      CCOMMENT   = 'List of chemical variables', &
+      NGRID      = 0,                            &
+      NTYPE      = TYPECHAR,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .FALSE.                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,CSV_CHEM_LIST)
   END IF
 END IF
 !
-!
 CALL IO_Field_write(TPFILE,'LSUM', XLSUM)
 CALL IO_Field_write(TPFILE,'LSVM', XLSVM)
 CALL IO_Field_write(TPFILE,'LSWM', XLSWM)
@@ -1709,29 +1183,31 @@ END IF
 ! IF (NSV >=1) THEN
 !    DO JSV = NSV_C2R2BEG,NSV_C2R2END
 !     IF (JSV == NSV_C2R2BEG ) THEN
-!       TZFIELD%CMNHNAME   = 'RSVS_CLD1'
-!       TZFIELD%CSTDNAME   = ''
-!       TZFIELD%CLONGNAME  = 'RSVS_CLD1'
-!       TZFIELD%CUNITS     = '1'
-!       TZFIELD%CDIR       = 'XY'
-!       TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
-!       TZFIELD%NGRID      = 1
-!       TZFIELD%NTYPE      = TYPEREAL
-!       TZFIELD%NDIMS      = 3
-!       TZFIELD%LTIMEDEP   = .TRUE.
+!       TZFIELD = TFIELDMETADATA(       &
+!         CMNHNAME   = 'RSVS_CLD1',     &
+!         CSTDNAME   = '',              &
+!         CLONGNAME  = 'RSVS_CLD1',     &
+!         CUNITS     = '1',             &
+!         CDIR       = 'XY',            &
+!         CCOMMENT   = 'X_Y_Z_RHS_CLD', &
+!         NGRID      = 1,               &
+!         NTYPE      = TYPEREAL,        &
+!         NDIMS      = 3,               &
+!         LTIMEDEP   = .TRUE.           )
 !       CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR))
 !     END IF
 !     IF (JSV == NSV_C2R2END ) THEN
-!       TZFIELD%CMNHNAME   = 'RSVS_CLD2'
-!       TZFIELD%CSTDNAME   = ''
-!       TZFIELD%CLONGNAME  = 'RSVS_CLD2'
-!       TZFIELD%CUNITS     = '1'
-!       TZFIELD%CDIR       = 'XY'
-!       TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
-!       TZFIELD%NGRID      = 1
-!       TZFIELD%NTYPE      = TYPEREAL
-!       TZFIELD%NDIMS      = 3
-!       TZFIELD%LTIMEDEP   = .TRUE.
+!       TZFIELD = TFIELDMETADATA(       &
+!         CMNHNAME   = 'RSVS_CLD2',     &
+!         CSTDNAME   = '',              &
+!         CLONGNAME  = 'RSVS_CLD2',     &
+!         CUNITS     = '1',             &
+!         CDIR       = 'XY',            &
+!         CCOMMENT   = 'X_Y_Z_RHS_CLD', &
+!         NGRID      = 1,               &
+!         NTYPE      = TYPEREAL,        &
+!         NDIMS      = 3,               &
+!         LTIMEDEP   = .TRUE.           )
 !       CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR))
 !     END IF
 !    END DO
@@ -1758,8 +1234,10 @@ IF (CRAD /= 'NONE') THEN
   !
   CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM_n','EMIS: writing only first band')
   CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%NDIMS = 2
+  TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4)
+  TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED
   CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1))
   !
   CALL IO_Field_write(TPFILE,'TSRAD',       XTSRAD)
@@ -1787,17 +1265,17 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   CALL IO_Field_write(TPFILE,'DRICONV',  XDRICONV)
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6)
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm'
   CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3)
 !
   CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6)
 !
@@ -1811,95 +1289,20 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   IF ( LCHTRANS .AND. NSV > 0 ) THEN
    ! scalar variables are recorded
    ! individually in the file
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 's-1'
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .TRUE.
-    !
-    DO JSV = 1, NSV_USER
-      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_C2R2BEG, NSV_C2R2END
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_C1R3BEG, NSV_C1R3END
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_ELECBEG, NSV_ELECEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_PPBEG, NSV_PPEND
-      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-#ifdef MNH_FOREFIRE
-    IF (LFOREFIRE) THEN
-      DO JSV = NSV_FFBEG, NSV_FFEND
-        WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-#endif
-    IF (LUSECHEM) THEN
-      DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-      IF (LORILAM) THEN
-        DO JSV = NSV_AERBEG, NSV_AEREND
-          TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-          CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-        END DO
-      END IF
-! linox scalar variables
-    ELSE IF (LCH_CONV_LINOX) THEN
-      DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-        TZFIELD%CMNHNAME   = 'DSVCONV_LINOX'
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-        CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-      END DO
-    END IF
-    DO JSV = NSV_LGBEG, NSV_LGEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_DSTBEG, NSV_DSTEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
-    END DO
-    DO JSV = NSV_SLTBEG, NSV_SLTEND
-      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
-      CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV))
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'generic for DSVCONV', & !Temporary name to ease identification
+      CUNITS     = 's-1',         &
+      CDIR       = 'XY',          &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .TRUE.         )
+
+    DO JSV = 1, NSV
+      TZFIELD%CMNHNAME   = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      TZFIELD%CLONGNAME  = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+      TZFIELD%CCOMMENT   = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) )
     END DO
   END IF
 !
@@ -1912,12 +1315,12 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINPRC)) THEN
   IF (SIZE(XINPRC) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3)
 !
@@ -1927,12 +1330,12 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINDEP)) THEN
   IF (SIZE(XINDEP) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3)
 !
@@ -1942,7 +1345,7 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINPRR)) THEN
   IF (SIZE(XINPRR) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6)
 !
@@ -1950,7 +1353,7 @@ IF (CPROGRAM /= 'IDEAL') THEN
     CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3)
 !
@@ -1960,12 +1363,12 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINPRS)) THEN
   IF (SIZE(XINPRS) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3)
   END IF
@@ -1974,12 +1377,12 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINPRG)) THEN
   IF (SIZE(XINPRG) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3)
   END IF
@@ -1988,12 +1391,12 @@ IF (CPROGRAM /= 'IDEAL') THEN
   IF (ASSOCIATED(XINPRH)) THEN
   IF (SIZE(XINPRH) /= 0 ) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6)
 !
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3)
   ENDIF
@@ -2006,7 +1409,7 @@ IF (CPROGRAM /= 'IDEAL') THEN
     IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XINPRH
     IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XINPRC
     CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm hour-1'
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D*3.6E6)
 !
@@ -2015,7 +1418,7 @@ IF (CPROGRAM /= 'IDEAL') THEN
     IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XACPRH
     IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XACPRC
     CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CUNITS = 'mm'
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D*1.0E3)
   END IF
@@ -2026,16 +1429,17 @@ END IF
 IF(LBLOWSNOW) THEN
   IF (ASSOCIATED(XSNWSUBL3D)) THEN
     IF (SIZE(XSNWSUBL3D) /= 0 ) THEN
-      TZFIELD%CMNHNAME   = 'SNWSUBL3D'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'kg m-3 s-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_INstantaneous 3D Drifting snow sublimation flux'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                                             &
+        CMNHNAME   = 'SNWSUBL3D',                                           &
+        CSTDNAME   = '',                                                    &
+        CLONGNAME  = 'SNWSUBL3D',                                           &
+        CUNITS     = 'kg m-3 s-1',                                          &
+        CDIR       = 'XY',                                                  &
+        CCOMMENT   = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', &
+        NGRID      = 1,                                                     &
+        NTYPE      = TYPEREAL,                                              &
+        NDIMS      = 3,                                                     &
+        LTIMEDEP   = .TRUE.                                                 )
       CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:))
       ZWORK2D(:,:) = 0.
       DO JK = IKB,IKE
@@ -2044,16 +1448,17 @@ IF(LBLOWSNOW) THEN
       END DO
       ZWORK2D(:,:) = ZWORK2D(:,:)*1000. ! vapor water in mm unit
       !
-      TZFIELD%CMNHNAME   = 'COL_SNWSUBL'
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'mm day-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%CCOMMENT   = 'X_Y_Column Sublimation Rate (mmSWE/day)'
-      TZFIELD%NGRID      = 4
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 2
-      TZFIELD%LTIMEDEP   = .TRUE.
+      TZFIELD = TFIELDMETADATA(                                 &
+        CMNHNAME   = 'COL_SNWSUBL',                             &
+        CSTDNAME   = '',                                        &
+        CLONGNAME  = 'COL_SNWSUBL',                             &
+        CUNITS     = 'mm day-1',                                &
+        CDIR       = 'XY',                                      &
+        CCOMMENT   = 'X_Y_Column Sublimation Rate (mmSWE/day)', &
+        NGRID      = 4,                                         &
+        NTYPE      = TYPEREAL,                                  &
+        NDIMS      = 2,                                         &
+        LTIMEDEP   = .TRUE.                                     )
       CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D(:,:))
     END IF
   END IF
@@ -2065,52 +1470,56 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN
   CALL IO_Field_write(TPFILE,'NFRCLT',NFRCLT)
   CALL IO_Field_write(TPFILE,'NINFRT',NINFRT)
   !
-  TZFIELD%CMNHNAME   = 'SSUFL_T'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'SSUFL'
-  TZFIELD%CUNITS     = 'kg m-1 s-1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'sfc stress along U to force ocean LES'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'SSUFL_T',                               &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'SSUFL',                                 &
+    CUNITS     = 'kg m-1 s-1',                            &
+    CDIR       = '--',                                    &
+    CCOMMENT   = 'sfc stress along U to force ocean LES', &
+    NGRID      = 0,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 1,                                       &
+    LTIMEDEP   = .FALSE.                                  )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSUFL_T(:))
   !
-  TZFIELD%CMNHNAME   = 'SSVFL_T'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'SSVFL'
-  TZFIELD%CUNITS     = 'kg m-1 s-1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'sfc stress along V to force ocean LES'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'SSVFL_T',                               &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'SSVFL',                                 &
+    CUNITS     = 'kg m-1 s-1',                            &
+    CDIR       = '--',                                    &
+    CCOMMENT   = 'sfc stress along V to force ocean LES', &
+    NGRID      = 0,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 1,                                       &
+    LTIMEDEP   = .FALSE.                                  )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSVFL_T(:))
   !
-  TZFIELD%CMNHNAME   = 'SSTFL_T'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'SSTFL'
-  TZFIELD%CUNITS     = 'kg m3 K m s-1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'sfc total heat flux to force ocean LES'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                                &
+    CMNHNAME   = 'SSTFL_T',                                &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = 'SSTFL',                                  &
+    CUNITS     = 'kg m3 K m s-1',                          &
+    CDIR       = '--',                                     &
+    CCOMMENT   = 'sfc total heat flux to force ocean LES', &
+    NGRID      = 0,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 1,                                        &
+    LTIMEDEP   = .FALSE.                                   )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSTFL_T(:))
   !
-  TZFIELD%CMNHNAME   = 'SSOLA_T'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'SSOLA'
-  TZFIELD%CUNITS     = 'kg m3 K m s-1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'sfc solar flux to force ocean LES'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'SSOLA_T',                           &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'SSOLA',                             &
+    CUNITS     = 'kg m3 K m s-1',                     &
+    CDIR       = '--',                                &
+    CCOMMENT   = 'sfc solar flux to force ocean LES', &
+    NGRID      = 0,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 1,                                   &
+    LTIMEDEP   = .FALSE.                              )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSOLA_T(:))
   !
 END IF ! ocean sfc forcing end    
@@ -2125,160 +1534,173 @@ IF (LFORCING) THEN
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD%CMNHNAME   = 'DTFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Date of forcing profile '//YFRC
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEDATE
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'DTFRC'//YFRC,                         &
+      CSTDNAME   = '',                                    &
+      CLONGNAME  = 'DTFRC'//YFRC,                         &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+      CDIR       = '--',                                  &
+      CCOMMENT   = 'Date of forcing profile '//YFRC,      &
+      NGRID      = 0,                                     &
+      NTYPE      = TYPEDATE,                              &
+      NDIMS      = 0,                                     &
+      LTIMEDEP   = .FALSE.                                )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTFRC(JT))
 !
-    TZFIELD%CMNHNAME   = 'UFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Zonal component of horizontal forcing wind'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'UFRC'//YFRC,                                 &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'UFRC'//YFRC,                                 &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = '--',                                         &
+      CCOMMENT   = 'Zonal component of horizontal forcing wind', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 1,                                            &
+      LTIMEDEP   = .FALSE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'VFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Meridian component of horizontal forcing wind'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'VFRC'//YFRC,                                    &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'VFRC'//YFRC,                                    &
+      CUNITS     = 'm s-1',                                         &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Meridian component of horizontal forcing wind', &
+      NGRID      = 1,                                               &
+      NTYPE      = TYPEREAL,                                        &
+      NDIMS      = 1,                                               &
+      LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'WFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Vertical forcing wind'
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'WFRC'//YFRC,            &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'WFRC'//YFRC,            &
+      CUNITS     = 'm s-1',                 &
+      CDIR       = '--',                    &
+      CCOMMENT   = 'Vertical forcing wind', &
+      NGRID      = 4,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 1,                       &
+      LTIMEDEP   = .FALSE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'THFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing potential temperature'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'THFRC'//YFRC,                   &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'THFRC'//YFRC,                   &
+      CUNITS     = 'K',                             &
+      CDIR       = '--',                            &
+      CCOMMENT   = 'Forcing potential temperature', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 1,                               &
+      LTIMEDEP   = .FALSE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'RVFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing vapor mixing ratio'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'RVFRC'//YFRC,                &
+      CSTDNAME   = '',                           &
+      CLONGNAME  = 'RVFRC'//YFRC,                &
+      CUNITS     = 'kg kg-1',                    &
+      CDIR       = '--',                         &
+      CCOMMENT   = 'Forcing vapor mixing ratio', &
+      NGRID      = 1,                            &
+      NTYPE      = TYPEREAL,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .FALSE.                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
+      CUNITS     = 'K s-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature tendency for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDRVFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1 s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                             &
+      CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
+      CSTDNAME   = '',                                                    &
+      CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
+      CUNITS     = 'kg kg-1 s-1',                                         &
+      CDIR       = '--',                                                  &
+      CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing', &
+      NGRID      = 1,                                                     &
+      NTYPE      = TYPEREAL,                                              &
+      NDIMS      = 1,                                                     &
+      LTIMEDEP   = .FALSE.                                                )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'GXTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K m-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature gradient for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'GYTHFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K m-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale potential temperature gradient for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'PGROUNDFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'Pa'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Forcing ground pressure'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
+      CUNITS     = 'Pa',                      &
+      CDIR       = '--',                      &
+      CCOMMENT   = 'Forcing ground pressure', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 0,                         &
+      LTIMEDEP   = .FALSE.                    )
     CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDUFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale U tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'TENDUFRC'//YFRC,                     &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'TENDUFRC'//YFRC,                     &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = '--',                                 &
+      CCOMMENT   = 'Large-scale U tendency for forcing', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 1,                                    &
+      LTIMEDEP   = .FALSE.                               )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDUFRC(:,JT))
 !
-    TZFIELD%CMNHNAME   = 'TENDVFRC'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'm s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Large-scale V tendency for forcing'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'TENDVFRC'//YFRC,                     &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'TENDVFRC'//YFRC,                     &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = '--',                                 &
+      CCOMMENT   = 'Large-scale V tendency for forcing', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 1,                                    &
+      LTIMEDEP   = .FALSE.                               )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDVFRC(:,JT))
 !
   END DO
@@ -2289,56 +1711,60 @@ END IF
 ! -------------------------------------------------------------------------
 IF ( L2D_ADV_FRC ) THEN
 !
-  TZFIELD%CMNHNAME   = 'NADVFRC1'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'NADVFRC1'
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Number of forcing profiles'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'NADVFRC1',                   &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'NADVFRC1',                   &
+    CUNITS     = '1',                          &
+    CDIR       = '--',                         &
+    CCOMMENT   = 'Number of forcing profiles', &
+    NGRID      = 0,                            &
+    NTYPE      = TYPEINT,                      &
+    NDIMS      = 0,                            &
+    LTIMEDEP   = .FALSE.                       )
   CALL IO_Field_write(TPFILE,TZFIELD,NADVFRC)
 !
   DO JT=1,NADVFRC
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD%CMNHNAME   = 'DTADV'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Date and time of the advecting forcing '//YFRC
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEDATE
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'DTADV'//YFRC,                                   &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'DTADV'//YFRC,                                   &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',           &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Date and time of the advecting forcing '//YFRC, &
+      NGRID      = 0,                                               &
+      NTYPE      = TYPEDATE,                                        &
+      NDIMS      = 0,                                               &
+      LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTADVFRC(JT))
-!                                                                
-    TZFIELD%CMNHNAME   = 'TH_ADV'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .FALSE.
+!
+    TZFIELD = TFIELDMETADATA(      &
+      CMNHNAME   = 'TH_ADV'//YFRC, &
+      CSTDNAME   = '',             &
+      CLONGNAME  = 'TH_ADV'//YFRC, &
+      CUNITS     = 'K s-1',        &
+      CDIR       = '--',           &
+      CCOMMENT   = '',             &
+      NGRID      = 1,              &
+      NTYPE      = TYPEREAL,       &
+      NDIMS      = 3,              &
+      LTIMEDEP   = .FALSE.         )
     CALL IO_Field_write(TPFILE,TZFIELD,XDTHFRC(:,:,:,JT))
 !    
-    TZFIELD%CMNHNAME   = 'Q_ADV'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1 s-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'Q_ADV'//YFRC, &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'Q_ADV'//YFRC, &
+      CUNITS     = 'kg kg-1 s-1', &
+      CDIR       = '--',          &
+      CCOMMENT   = '',            &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .FALSE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,XDRVFRC(:,:,:,JT))
 !
   ENDDO
@@ -2346,56 +1772,60 @@ ENDIF
 !
 IF ( L2D_REL_FRC ) THEN
 !
-  TZFIELD%CMNHNAME   = 'NRELFRC1'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'NRELFRC1'
-  TZFIELD%CUNITS     = '1'
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = 'Number of forcing profiles'
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'NRELFRC1',                   &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'NRELFRC1',                   &
+    CUNITS     = '1',                          &
+    CDIR       = '--',                         &
+    CCOMMENT   = 'Number of forcing profiles', &
+    NGRID      = 0,                            &
+    NTYPE      = TYPEINT,                      &
+    NDIMS      = 0,                            &
+    LTIMEDEP   = .FALSE.                       )
   CALL IO_Field_write(TPFILE,TZFIELD,NRELFRC)
 !
   DO JT=1,NRELFRC
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD%CMNHNAME   = 'DTREL'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = 'Date and time of the relaxation forcing '//YFRC
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPEDATE
-    TZFIELD%NDIMS      = 0
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'DTREL'//YFRC,                                    &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'DTREL'//YFRC,                                    &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',            &
+      CDIR       = '--',                                             &
+      CCOMMENT   = 'Date and time of the relaxation forcing '//YFRC, &
+      NGRID      = 0,                                                &
+      NTYPE      = TYPEDATE,                                         &
+      NDIMS      = 0,                                                &
+      LTIMEDEP   = .FALSE.                                           )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTRELFRC(JT))
 !                                                                
-    TZFIELD%CMNHNAME   = 'TH_REL'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'K'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(      &
+      CMNHNAME   = 'TH_REL'//YFRC, &
+      CSTDNAME   = '',             &
+      CLONGNAME  = 'TH_REL'//YFRC, &
+      CUNITS     = 'K',            &
+      CDIR       = '--',           &
+      CCOMMENT   = '',             &
+      NGRID      = 1,              &
+      NTYPE      = TYPEREAL,       &
+      NDIMS      = 3,              &
+      LTIMEDEP   = .FALSE.         )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHREL(:,:,:,JT))
 !    
-    TZFIELD%CMNHNAME   = 'Q_REL'//YFRC
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'kg kg-1'
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = ''
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
-    TZFIELD%LTIMEDEP   = .FALSE.
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'Q_REL'//YFRC, &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'Q_REL'//YFRC, &
+      CUNITS     = 'kg kg-1',     &
+      CDIR       = '--',          &
+      CCOMMENT   = '',            &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .FALSE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,XRVREL(:,:,:,JT))
 !
   ENDDO
@@ -2413,6 +1843,7 @@ IF ( LUV_FLX) CALL IO_Field_write(TPFILE,'VU_FLX',XVU_FLUX_M)
 !*       1.14   Balloon variables
 !
 !
+! Write balloon coordinates in backup file to allow restart with current balloon position
 IF (LFLYER) CALL WRITE_BALLOON_n(TPFILE)
 !
 !
@@ -2464,19 +1895,21 @@ IF ( CPROGRAM=='REAL  ' ) THEN
 !*       1.16    Dummy variables in PREP_REAL_CASE
 !
   IF (ALLOCATED(CDUMMY_2D)) THEN
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 2
-    TZFIELD%LTIMEDEP   = .TRUE.
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'generic for CDUMMY_2D variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                                &
+      CUNITS     = '',                                &
+      CDIR       = 'XY',                              &
+      NGRID      = 1,                                 &
+      NTYPE      = TYPEREAL,                          &
+      NDIMS      = 2,                                 &
+      LTIMEDEP   = .TRUE.                             )
     !
-    DO JSA=1,SIZE(XDUMMY_2D,3)
-      TZFIELD%CMNHNAME   = ADJUSTL(CDUMMY_2D(JSA))
+    DO JI = 1, SIZE( XDUMMY_2D, 3 )
+      TZFIELD%CMNHNAME   = ADJUSTL(CDUMMY_2D(JI))
       TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
       TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JSA))
+      CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JI))
     END DO
   END IF
 !
@@ -2487,11 +1920,15 @@ END IF
 !             i) Main
 !
 IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CUNITS     = 'N'
+  TZFIELD = TFIELDMETADATA(                            &
+    CMNHNAME   = 'generic for wind turbine variables', & !Temporary name to ease identification
+    CSTDNAME   = '',                                   &
+    CUNITS     = 'N',                                  &
+    CDIR       = 'XY',                                 &
+    NGRID      = 1,                                    &
+    NTYPE      = TYPEREAL,                             &
+    NDIMS      = 3,                                    &
+    LTIMEDEP   = .TRUE.                                )
 !
   TZFIELD%CMNHNAME   = 'FX_RG'
   TZFIELD%CLONGNAME  = 'FX_RG'
@@ -2530,11 +1967,15 @@ SELECT CASE(CMETH_EOL)
 !
   CASE('ADNR') ! Actuator Disc Non-Rotating
 !
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CUNITS     = '1'
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'generic for ADNR variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                           &
+      CUNITS     = '1',                          &
+      CDIR       = '--',                         &
+      NGRID      = 1,                            &
+      NTYPE      = TYPEREAL,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .TRUE.                        )
 !
     TZFIELD%CMNHNAME   = 'A_INDU'
     TZFIELD%CLONGNAME  = 'INDUCTION_FACTOR'
@@ -2566,9 +2007,13 @@ SELECT CASE(CMETH_EOL)
 !
   CASE('ALM') ! Actuator Line Method
 !
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%CDIR       = '--'
+    TZFIELD = TFIELDMETADATA(                   &
+      CMNHNAME   = 'generic for ALM variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                          &
+      CDIR       = '--',                        &
+      NGRID      = 1,                           &
+      NTYPE      = TYPEREAL,                    &
+      LTIMEDEP   = .TRUE.                       )
 !
     TZFIELD%NDIMS      = 1
 !
@@ -2632,9 +2077,13 @@ SELECT CASE(CMETH_EOL)
 !
     IF (MEAN_COUNT /= 0) THEN
 !
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%CDIR       = '--'
+      TZFIELD = TFIELDMETADATA(                        &
+        CMNHNAME   = 'generic for ALM mean variables', & !Temporary name to ease identification
+        CSTDNAME   = '',                               &
+        CDIR       = '--',                             &
+        NGRID      = 1,                                &
+        NTYPE      = TYPEREAL,                         &
+        LTIMEDEP   = .TRUE.                            )
 !
       TZFIELD%NDIMS      = 1
 !
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index 6b26649a2c78a0d5ab28a1c057a44dae2df15ffa..62264efabac858636ac5d392a24bd886aa440f36 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-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.
@@ -10,7 +10,6 @@
 !  G. Delautier      2016: LIMA
 !  C. Lac         10/2016: add visibility diagnostics for fog
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
-!  J. Escobar  16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1)
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields
 !  P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro)
@@ -19,38 +18,54 @@
 !  M. Taufour     07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE
 !  P. Wautelet 01/09/2021: fix: correct vertical dimension for ALT and W
 !  P. Wautelet 19/11/2021: bugfix in units for LIMA variables
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!  P. Wautelet    04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs
 !-----------------------------------------------------------------
 !      ###########################
 MODULE MODE_WRITE_PROFILER_n
 !      ###########################
-!
+
+use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+
 implicit none
 
 private
 
 public :: WRITE_PROFILER_n
 
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CUNIT    ! physical unit
+CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE   ! title
+CHARACTER(LEN=NUNITLGTMAX),    DIMENSION(:), ALLOCATABLE :: CUNIT    ! physical unit
 
 REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6   ! contains temporal serie
 
 contains
 !
-!#####################################
-SUBROUTINE WRITE_PROFILER_n(TPDIAFILE)
-!#####################################
+!#######################################
+SUBROUTINE WRITE_PROFILER_n( TPDIAFILE )
+!#######################################
 !
 !
-!****  *WRITE_PROFILER* - write the balloon and aircraft trajectories and records
-!                      in the diachronic file
+!****  *WRITE_PROFILER* - write the profilers records in the diachronic file
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_IO,         ONLY: TFILEDATA
-use MODD_PROFILER_n, only: NUMBPROFILER
+USE MODD_CONF_n,          ONLY: NRR
+USE MODD_DIM_n,           ONLY: NKMAX
+USE MODD_IO,              ONLY: ISNPROC, ISP, TFILEDATA
+USE MODD_DIAG_IN_RUN,     ONLY: LDIAG_IN_RUN
+USE MODD_MPIF
+USE MODD_NSV,             ONLY: NSV
+USE MODD_PARAMETERS,      ONLY: JPVEXT
+USE MODD_PARAM_n,         ONLY: CCLOUD, CRAD, CTURB
+USE MODD_PRECISION,       ONLY: MNHINT_MPI, MNHREAL_MPI
+USE MODD_PROFILER_n,      only: NUMBPROFILER_LOC, TPROFILERS, tprofilers_time
+USE MODD_RADIATIONS_n,    ONLY: NAER
+USE MODD_TYPE_STATPROF,   ONLY: TPROFILERDATA
+!
+USE MODE_MSG
+USE MODE_STATPROF_TOOLS,  ONLY: PROFILER_ALLOCATE
 !
 IMPLICIT NONE
 !
@@ -63,231 +78,408 @@ TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE ! diachronic file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: JI
+INTEGER, PARAMETER :: ITAG = 100
+INTEGER :: IERR
+INTEGER :: IKU
+INTEGER :: JP, JS
+INTEGER :: IDX
+INTEGER :: INUMPROF  ! Total number of profilers (for the current model)
+INTEGER :: IPACKSIZE ! Size of the ZPACK buffer
+INTEGER :: IPOS      ! Position in the ZPACK buffer
+INTEGER :: ISTORE
+INTEGER, DIMENSION(:), ALLOCATABLE :: INPROFPRC    ! Array to store the number of profilers per process (for the current model)
+INTEGER, DIMENSION(:), ALLOCATABLE :: IPROFIDS     ! Intermediate array for MPI communication
+INTEGER, DIMENSION(:), ALLOCATABLE :: IPROFPRCRANK ! Array to store the ranks of the processes where the profilers are
+INTEGER, DIMENSION(:), ALLOCATABLE :: IDS          ! Array to store the profiler number to send
+INTEGER, DIMENSION(:), ALLOCATABLE :: IDISP        ! Array to store the displacements for MPI communications
+REAL,    DIMENSION(:), ALLOCATABLE :: ZPACK        ! Buffer to store raw data of a profiler (used for MPI communication)
+TYPE(TPROFILERDATA) :: TZPROFILER
 !
 !----------------------------------------------------------------------------
 !
-DO JI = 1, NUMBPROFILER
-  CALL PROFILER_DIACHRO_n( TPDIAFILE, JI )
-ENDDO
-!
-!----------------------------------------------------------------------------
+IKU = NKMAX + 2 * JPVEXT
+
+ALLOCATE( INPROFPRC(ISNPROC) )
+ALLOCATE( IDS(NUMBPROFILER_LOC) )
+
+!Gather number of profiler present on each process
+CALL MPI_ALLGATHER( NUMBPROFILER_LOC, 1, MNHINT_MPI, INPROFPRC, 1, MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR )
+
+!Store the identification number of local profilers (these numbers are globals)
+DO JS = 1, NUMBPROFILER_LOC
+  IDS(JS) = TPROFILERS(JS)%NID
+END DO
+
+ALLOCATE( IDISP(ISNPROC) )
+IDISP(1) = 0
+DO JP = 2, ISNPROC
+  IDISP(JP) = IDISP(JP-1) + INPROFPRC(JP-1)
+END DO
+
+INUMPROF = SUM( INPROFPRC(:) )
+ALLOCATE( IPROFIDS(INUMPROF) )
+ALLOCATE( IPROFPRCRANK(INUMPROF) )
+
+!Gather the list of all the profilers of all processes
+CALL MPI_ALLGATHERV( IDS(:), NUMBPROFILER_LOC, MNHINT_MPI, IPROFIDS(:), INPROFPRC(:), &
+                     IDISP(:), MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR )
+
+!Store the rank of each process corresponding to a given profiler
+IDX = 1
+IPROFPRCRANK(:) = -1
+DO JP = 1, ISNPROC
+  DO JS = 1, INPROFPRC(JP)
+    IPROFPRCRANK(IPROFIDS(IDX)) = JP
+    IDX = IDX + 1
+  END DO
+END DO
+
+CALL PROFILER_ALLOCATE( TZPROFILER, SIZE( tprofilers_time%tpdates ) )
+
+!Determine the size of the ZPACK buffer used to transfer profiler data in 1 MPI communication
+IF ( ISNPROC > 1 ) THEN
+  ISTORE = SIZE( TPROFILERS_TIME%TPDATES )
+  IPACKSIZE = 6
+  IPACKSIZE = IPACKSIZE + ISTORE * IKU * ( 14 + NRR + NSV + NAER )
+  IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' )  IPACKSIZE = IPACKSIZE + ISTORE * IKU !VISIGUL
+  IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU !VISIKUN
+  IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE * IKU !Tke term
+  IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU  !CIZ term
+  IPACKSIZE = IPACKSIZE + 4 * ISTORE
+  IF ( LDIAG_IN_RUN ) THEN
+    IPACKSIZE = IPACKSIZE + ISTORE * 10
+    IF ( CRAD /= 'NONE' )  IPACKSIZE = IPACKSIZE + ISTORE * 4
+    IPACKSIZE = IPACKSIZE + ISTORE * IKU !XTKE_DISS term
+  END IF
+
+  ALLOCATE( ZPACK(IPACKSIZE) )
+END IF
+
+IDX = 1
+
+PROFILER: DO JS = 1, INUMPROF
+  IF ( IPROFPRCRANK(JS) == TPDIAFILE%NMASTER_RANK ) THEN
+    !No communication necessary, the profiler data is already on the writer process
+    IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+      TZPROFILER = TPROFILERS(IDX)
+      IDX = IDX + 1
+    END IF
+  ELSE
+    !The profiler data is not on the writer process
+    IF ( ISP == IPROFPRCRANK(JS) ) THEN
+      ! This process has the data and needs to send it to the writer process
+      IPOS = 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%NID;  IPOS = IPOS + 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%XX;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%XY;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%XZ;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%XLON; IPOS = IPOS + 1
+      ZPACK(IPOS) = TPROFILERS(IDX)%XLAT; IPOS = IPOS + 1
+
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XZON(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XMER(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XFF(:,:),  [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XDD(:,:),  [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XW(:,:),   [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XP(:,:),   [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XZZ(:,:),  [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CTURB == 'TKEL') THEN
+        ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTH(:,:),        [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTHV(:,:),       [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN
+        ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIGUL(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN
+        ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCRARE(:,:),     [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCRARE_ATT(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN
+        ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCIZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XLWCZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XIWCZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XRHOD(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+
+      ZPACK(IPOS:IPOS+ISTORE*IKU*NRR-1)  = RESHAPE( TPROFILERS(IDX)%XR(:,:,:),   [ISTORE*IKU*NRR]  )
+      IPOS = IPOS + ISTORE * IKU * NRR
+      ZPACK(IPOS:IPOS+ISTORE*IKU*NSV-1)  = RESHAPE( TPROFILERS(IDX)%XSV(:,:,:),  [ISTORE*IKU*NSV]  )
+      IPOS = IPOS + ISTORE * IKU * NSV
+      ZPACK(IPOS:IPOS+ISTORE*IKU*NAER-1) = RESHAPE( TPROFILERS(IDX)%XAER(:,:,:), [ISTORE*IKU*NAER] )
+      IPOS = IPOS + ISTORE * IKU * NAER
+
+      ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XIWV(:); IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZTD(:); IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZWD(:); IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZHD(:); IPOS = IPOS + ISTORE
+
+      IF ( LDIAG_IN_RUN ) THEN
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XT2M;    IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XQ2M;    IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XHU2M;   IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZON10M; IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XMER10M; IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XRN;     IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XH;      IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLE;     IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XGFLUX;  IPOS = IPOS + ISTORE
+        ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLEI;    IPOS = IPOS + ISTORE
+        IF ( CRAD /= 'NONE' ) THEN
+          ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWD;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWU;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWD;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWU;    IPOS = IPOS + ISTORE
+        END IF
+        ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE_DISS(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. )
+
+      CALL MPI_SEND( TPROFILERS(IDX)%CNAME, LEN(TPROFILERS(IDX)%CNAME), MPI_CHARACTER, TPDIAFILE%NMASTER_RANK - 1, &
+                     ITAG, TPDIAFILE%NMPICOMM, IERR )
+      CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, TPDIAFILE%NMASTER_RANK - 1, ITAG, TPDIAFILE%NMPICOMM, IERR )
+
+      IDX = IDX + 1
+
+    ELSE IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+      ! This process is the writer and will receive the profiler data from its owner
+      CALL MPI_RECV( TZPROFILER%CNAME, LEN(TZPROFILER%CNAME), MPI_CHARACTER, &
+                                                    IPROFPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR )
+      CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, IPROFPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR )
+
+      IPOS = 1
+      TZPROFILER%NID  = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+      TZPROFILER%XX   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZPROFILER%XY   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZPROFILER%XZ   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZPROFILER%XLON = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZPROFILER%XLAT = ZPACK(IPOS);         IPOS = IPOS + 1
+
+      TZPROFILER%XZON(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XMER(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XFF(:,:)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XDD(:,:)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XW(:,:)   = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XP(:,:)   = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XZZ(:,:)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CTURB == 'TKEL') THEN
+         TZPROFILER%XTKE(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      TZPROFILER%XTH(:,:)        = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XTHV(:,:)       = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN
+        TZPROFILER%XVISIGUL(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN
+        TZPROFILER%XVISIKUN(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      TZPROFILER%XCRARE(:,:)     = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XCRARE_ATT(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN
+        TZPROFILER%XCIZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+      TZPROFILER%XLWCZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XIWCZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XRHOD(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+
+      TZPROFILER%XR(:,:,:)   = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NRR-1),  [ ISTORE, IKU, NRR ] )
+      IPOS = IPOS + ISTORE * IKU * NRR
+      TZPROFILER%XSV(:,:,:)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NSV-1),  [ ISTORE, IKU, NSV ] )
+      IPOS = IPOS + ISTORE * IKU * NSV
+      TZPROFILER%XAER(:,:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NAER-1), [ ISTORE, IKU, NAER ] )
+      IPOS = IPOS + ISTORE * IKU * NAER
+
+      TZPROFILER%XIWV(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+      TZPROFILER%XZTD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+      TZPROFILER%XZWD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+      TZPROFILER%XZHD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+
+      IF ( LDIAG_IN_RUN ) THEN
+        TZPROFILER%XT2M    = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XQ2M    = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XHU2M   = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XZON10M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XMER10M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XRN     = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XH      = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XLE     = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XGFLUX  = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        TZPROFILER%XLEI    = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        IF ( CRAD /= 'NONE' ) THEN
+          TZPROFILER%XSWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+          TZPROFILER%XSWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+          TZPROFILER%XLWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+          TZPROFILER%XLWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE
+        END IF
+        TZPROFILER%XTKE_DISS(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      END IF
+
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
+    END IF
+  END IF
+
+  CALL PROFILER_DIACHRO_n( TPDIAFILE, TZPROFILER )
+
+END DO PROFILER
+
+
 END SUBROUTINE WRITE_PROFILER_n
-!----------------------------------------------------------------------------
 
 
-!----------------------------------------------------------------------------
-SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, KI )
+! ####################################################
+SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, TPPROFILER )
+! ####################################################
 
 use modd_budget,          only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
                                 tbudiachrometadata
-USE MODD_DIAG_IN_RUN,     only: LDIAG_IN_RUN
-USE MODD_DUST,            ONLY: CDUSTNAMES, LDUST, NMODE_DST
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, LORILAM, JPMODE
-USE MODD_CH_M9_n,         ONLY: CNAMES
+USE MODD_CH_AEROSOL,      ONLY: LORILAM, JPMODE
+USE MODD_CONF_n,          ONLY: NRR
 USE MODD_CST,             ONLY: XRV
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
+USE MODD_DIAG_IN_RUN,     only: LDIAG_IN_RUN
+USE MODD_DUST,            ONLY: LDUST, NMODE_DST
+USE MODD_DIM_n,           ONLY: NKMAX
 use modd_field,           only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, &
-                                tfield_metadata_base, TYPEREAL
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
+                                tfieldmetadata_base, TYPEREAL
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_NSV
-USE MODD_PARAMETERS,      ONLY: XUNDEF
-USE MODD_PARAM_LIMA,      ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM
-USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
-USE MODD_PARAM_n,         ONLY: CRAD
+USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend
+USE MODD_PARAMETERS,      ONLY: JPVEXT, XUNDEF
+USE MODD_PARAM_n,         ONLY: CCLOUD, CRAD, CTURB
 USE MODD_PROFILER_n
 USE MODD_RADIATIONS_n,    ONLY: NAER
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_SALT,            ONLY: CSALTNAMES, LSALT
-USE MODD_TYPE_PROFILER
+USE MODD_SALT,            ONLY: LSALT
+USE MODD_TYPE_STATPROF
 !
 USE MODE_AERO_PSD
 USE MODE_DUST_PSD
 use mode_write_diachro,   only: Write_diachro
 !
-TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE ! diachronic file to write
-INTEGER,          INTENT(IN) :: KI
+TYPE(TFILEDATA),     INTENT(IN) :: TPDIAFILE ! diachronic file to write
+TYPE(TPROFILERDATA), INTENT(IN) :: TPPROFILER
 !
 !*      0.2  declaration of local variables for diachro
 !
-character(len=2)                                      :: yidx
-character(len=100)                                    :: ycomment
-character(len=100)                                    :: yname
-character(len=40)                                     :: yunits
-CHARACTER(LEN=:),                         allocatable :: YGROUP   ! group title
-INTEGER                                               :: IKU
-INTEGER                                               :: IPROC    ! number of variables records
-INTEGER                                               :: JPROC
-integer                                               :: jproc_alt, jproc_w
-INTEGER                                               :: JRR      ! loop counter
-INTEGER                                               :: JSV      ! loop counter
-integer                                               :: ji
-integer                                               :: irr !Number of moist variables
-REAL, DIMENSION(:,:,:),                   ALLOCATABLE :: ZRHO
-REAL, DIMENSION(:,:,:,:),                 ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
-type(tbudiachrometadata)                              :: tzbudiachro
-type(tfield_metadata_base), dimension(:), allocatable :: tzfields
+character(len=NMNHNAMELGTMAX)                        :: yname
+character(len=NUNITLGTMAX)                           :: yunits
+INTEGER                                              :: IKU
+INTEGER                                              :: IPROC    ! number of variables records
+INTEGER                                              :: JPROC
+integer                                              :: jproc_alt, jproc_w
+INTEGER                                              :: JRR      ! loop counter
+INTEGER                                              :: JSV      ! loop counter
+integer                                              :: ji
+INTEGER                                              :: ISTORE
+REAL, DIMENSION(:,:,:),                  ALLOCATABLE :: ZRHO
+REAL, DIMENSION(:,:),                    ALLOCATABLE :: ZWORK
+REAL, DIMENSION(:,:,:,:),                ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
+type(tbudiachrometadata)                             :: tzbudiachro
+type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
-!
-IF (TPROFILER%X(KI)==XUNDEF) RETURN
-IF (TPROFILER%Y(KI)==XUNDEF) RETURN
-!
-IKU = SIZE(TPROFILER%W,2) !Number of vertical levels
+
+IKU = NKMAX + 2 * JPVEXT !Number of vertical levels
 !
 !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values
-IPROC = 25 + SIZE(TPROFILER%R,4) + SIZE(TPROFILER%SV,4)
+IPROC = 25 + NRR + NSV
 IF (LDIAG_IN_RUN) IPROC = IPROC + 15
 IF (LORILAM) IPROC = IPROC + JPMODE*3
 IF (LDUST) IPROC = IPROC + NMODE_DST*3
 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER
-IF (SIZE(TPROFILER%TKE  )>0) IPROC = IPROC + 1
-!
-ALLOCATE (XWORK6(1,1,IKU,size(tprofiler%tpdates),1,IPROC))
-ALLOCATE (CCOMMENT(IPROC))
-ALLOCATE (CTITLE  (IPROC))
-ALLOCATE (CUNIT   (IPROC))
-!
-YGROUP = TPROFILER%NAME(KI)
+IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1
+
+ISTORE = SIZE( TPROFILERS_TIME%TPDATES )
+
+ALLOCATE ( XWORK6(1, 1, IKU, ISTORE, 1, IPROC) )
+ALLOCATE ( CCOMMENT(IPROC) )
+ALLOCATE ( CTITLE  (IPROC) )
+ALLOCATE ( CUNIT   (IPROC) )
 !
 !----------------------------------------------------------------------------
 !Treat vertical profiles
 jproc = 0
 
-call Add_profile( 'Th',       'Potential temperature',         'K',      tprofiler%th        )
-call Add_profile( 'Thv',      'Virtual Potential temperature', 'K',      tprofiler%thv       )
-call Add_profile( 'VISI',     'Visibility',                    'km',     tprofiler%visi      )
-call Add_profile( 'VISIKUN',  'Visibility Kunkel',             'km',     tprofiler%visikun   )
-call Add_profile( 'RARE',     'Radar reflectivity',            'dBZ',    tprofiler%crare     )
-call Add_profile( 'RAREatt',  'Radar attenuated reflectivity', 'dBZ',    tprofiler%crare_att )
-call Add_profile( 'P',        'Pressure',                      'Pa',     tprofiler%p         )
-call Add_profile( 'ALT',      'Altitude',                      'm',      tprofiler%zz        )
+call Add_profile( 'Th',       'Potential temperature',         'K',      tpprofiler%xth        )
+call Add_profile( 'Thv',      'Virtual Potential temperature', 'K',      tpprofiler%xthv       )
+if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' ) &
+  call Add_profile( 'VISIGUL', 'Visibility Gultepe',           'km',     tpprofiler%xvisigul   )
+if ( ccloud /= 'NONE' .and. ccloud /= 'REVE' ) &
+  call Add_profile( 'VISIKUN', 'Visibility Kunkel',            'km',     tpprofiler%xvisikun   )
+call Add_profile( 'RARE',     'Radar reflectivity',            'dBZ',    tpprofiler%xcrare     )
+call Add_profile( 'RAREatt',  'Radar attenuated reflectivity', 'dBZ',    tpprofiler%xcrare_att )
+call Add_profile( 'P',        'Pressure',                      'Pa',     tpprofiler%xp         )
+call Add_profile( 'ALT',      'Altitude',                      'm',      tpprofiler%xzz        )
 !Store position of ALT in the field list. Useful because it is not computed on the same Arakawa-grid points
 jproc_alt = jproc
-call Add_profile( 'ZON_WIND', 'Zonal wind',                    'm s-1',  tprofiler%zon       )
-call Add_profile( 'MER_WIND', 'Meridional wind',               'm s-1',  tprofiler%mer       )
-call Add_profile( 'FF',       'Wind intensity',                'm s-1',  tprofiler%ff        )
-call Add_profile( 'DD',       'Wind direction',                'degree', tprofiler%dd        )
-call Add_profile( 'W',        'Air vertical speed',            'm s-1',  tprofiler%w         )
+call Add_profile( 'ZON_WIND', 'Zonal wind',                    'm s-1',  tpprofiler%xzon       )
+call Add_profile( 'MER_WIND', 'Meridional wind',               'm s-1',  tpprofiler%xmer       )
+call Add_profile( 'FF',       'Wind intensity',                'm s-1',  tpprofiler%xff        )
+call Add_profile( 'DD',       'Wind direction',                'degree', tpprofiler%xdd        )
+call Add_profile( 'W',        'Air vertical speed',            'm s-1',  tpprofiler%xw         )
 !Store position of W in the field list. Useful because it is not computed on the same Arakawa-grid points
 jproc_w = jproc
 
 if ( ldiag_in_run ) &
-  call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tprofiler% tke_diss )
-
-if ( Size( tprofiler%ciz, 1 ) > 0 ) &
-  call Add_profile( 'CIT',      'Ice concentration',    'kg-3',   tprofiler%ciz )
-
-irr = Size( tprofiler%r )
-if ( irr >= 1 ) call Add_profile( 'Rv', 'Water vapor mixing ratio',        'kg kg-1', tprofiler%r(:,:,:,1) )
-if ( irr >= 2 ) call Add_profile( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,2) )
-if ( irr >= 3 ) call Add_profile( 'Rr', 'Rain water mixing ratio',         'kg kg-1', tprofiler%r(:,:,:,3) )
-if ( irr >= 4 ) call Add_profile( 'Ri', 'Ice cloud water mixing ratio',    'kg kg-1', tprofiler%r(:,:,:,4) )
-if ( irr >= 5 ) call Add_profile( 'Rs', 'Snow mixing ratio',               'kg kg-1', tprofiler%r(:,:,:,5) )
-if ( irr >= 6 ) call Add_profile( 'Rg', 'Graupel mixing ratio',            'kg kg-1', tprofiler%r(:,:,:,6) )
-if ( irr >= 7 ) call Add_profile( 'Rh', 'Hail mixing ratio',               'kg kg-1', tprofiler%r(:,:,:,7) )
-
-call Add_profile( 'Rhod', 'Density of dry air in moist', 'kg m-3', tprofiler%rhod )
-if ( Size( tprofiler%tke, 1 ) > 0 ) &
-  call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke )
-
-if ( Size( tprofiler%sv, 4 ) > 0  ) then
-  ! User scalar variables
-  do jsv = 1, nsv_user
-    Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv
-    call Add_profile( yname, '', 'kg kg-1', tprofiler%sv(:,:,:,jsv) )
-  end do
- ! Passive pollutant  scalar variables
-  do jsv = nsv_ppbeg, nsv_ppend
-    Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv
-    call Add_profile( yname, '', '1', tprofiler%sv(:,:,:,jsv) )
-  end do
- ! microphysical C2R2 scheme scalar variables
-  do jsv = nsv_ppbeg, nsv_ppend
-    call Add_profile( Trim( c2r2names(jsv - nsv_c2r2beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) )
-  end do
-  ! microphysical C3R5 scheme additional scalar variables
-  do jsv = nsv_c1r3beg, nsv_c1r3end
-    call Add_profile( Trim( c1r3names(jsv - nsv_c1r3beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) )
-  end do
-  ! LIMA variables
-  do jsv = nsv_lima_beg, nsv_lima_end
-    yunits = 'kg-1'
-    if ( jsv == nsv_lima_nc ) then
-      yname = Trim( clima_warm_names(1) ) // 'T'
-    else if ( jsv == nsv_lima_nr ) then
-      yname = Trim( clima_warm_names(2) ) // 'T'
-    else if ( jsv >= nsv_lima_ccn_free .and. jsv < nsv_lima_ccn_free + nmod_ccn ) then
-      Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ccn_free + 1
-      yname = Trim( clima_warm_names(3) ) // yidx // 'T'
-    else if ( jsv >= nsv_lima_ccn_acti .and. jsv < nsv_lima_ccn_acti + nmod_ccn ) then
-      Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ccn_acti + 1
-      yname = Trim( clima_warm_names(4) ) // yidx // 'T'
-    else if ( jsv == nsv_lima_scavmass ) then
-      yname = Trim( caero_mass(1) ) // 'T'
-      yunits = 'kg kg-1'
-    else if ( jsv == nsv_lima_ni ) then
-      yname = Trim( clima_cold_names(1) ) // 'T'
-    else if ( jsv == nsv_lima_ns ) then
-      yname = Trim( clima_cold_names(2) ) // 'T'
-    else if ( jsv == nsv_lima_ng ) then
-      yname = Trim( clima_cold_names(3) ) // 'T'
-    else if ( jsv == nsv_lima_nh ) then
-      yname = Trim( clima_cold_names(4) ) // 'T'
-    else if ( jsv >= nsv_lima_ifn_free .and. jsv < nsv_lima_ifn_free + nmod_ifn ) then
-      Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ifn_free + 1
-      yname = Trim( clima_cold_names(5) ) // yidx // 'T'
-    else if ( jsv >= nsv_lima_ifn_nucl .and. jsv < nsv_lima_ifn_nucl + nmod_ifn ) then
-      Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ifn_nucl + 1
-      yname = Trim( clima_cold_names(6) ) // yidx // 'T'
-    else if ( jsv >= nsv_lima_imm_nucl .and. jsv < nsv_lima_imm_nucl + nmod_imm ) then
-      write( yidx, '( i2.2 )' ) nindice_ccn_imm(jsv - nsv_lima_imm_nucl + 1)
-      yname = Trim( clima_cold_names(7) ) // yidx // 'T'
-    else if ( jsv == nsv_lima_hom_haze ) then
-      yname = Trim( clima_cold_names(8) ) // 'T'
-    else if ( jsv == nsv_lima_spro ) then
-      yname = Trim( clima_warm_names(5) ) // 'T'
+  call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss )
+
+if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) &
+  call Add_profile( 'CIT',      'Ice concentration',    'kg-3',   tpprofiler%xciz )
+
+if ( nrr >= 1 ) call Add_profile( 'Rv', 'Water vapor mixing ratio',        'kg kg-1', tpprofiler%xr(:,:,1) )
+if ( nrr >= 2 ) call Add_profile( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,2) )
+if ( nrr >= 3 ) call Add_profile( 'Rr', 'Rain water mixing ratio',         'kg kg-1', tpprofiler%xr(:,:,3) )
+if ( nrr >= 4 ) call Add_profile( 'Ri', 'Ice cloud water mixing ratio',    'kg kg-1', tpprofiler%xr(:,:,4) )
+if ( nrr >= 5 ) call Add_profile( 'Rs', 'Snow mixing ratio',               'kg kg-1', tpprofiler%xr(:,:,5) )
+if ( nrr >= 6 ) call Add_profile( 'Rg', 'Graupel mixing ratio',            'kg kg-1', tpprofiler%xr(:,:,6) )
+if ( nrr >= 7 ) call Add_profile( 'Rh', 'Hail mixing ratio',               'kg kg-1', tpprofiler%xr(:,:,7) )
+
+call Add_profile( 'Rhod', 'Density of dry air in moist', 'kg m-3', tpprofiler%xrhod )
+if ( cturb == 'TKEL') &
+  call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpprofiler%xtke )
+
+if ( nsv > 0  ) then
+  ! Scalar variables
+  Allocate( zwork, mold = tpprofiler%xsv(:,:,1) )
+  do jsv = 1, nsv
+    if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then
+      yunits = 'ppb'
+      zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb
+    else
+      yunits = Trim( tsvlist(jsv)%cunits )
+      zwork = tpprofiler%xsv(:,:,jsv)
     end if
-    call Add_profile( yname, '', yunits, tprofiler%sv(:,:,:,jsv) )
-  end do
-  ! electrical scalar variables
-  do jsv = nsv_elecbeg, nsv_elecend
-    call Add_profile( Trim( celecnames(jsv - nsv_elecbeg + 1) ), '', 'C', tprofiler%sv(:,:,:,jsv) )
+    call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zwork )
   end do
-  ! chemical scalar variables
-  do jsv = nsv_chembeg, nsv_chemend
-    Write( ycomment, '( a5, a3, i3.3 )' ) 'T(s) ', 'SVT', jsv
-    call Add_profile( Trim( cnames(jsv - nsv_chembeg + 1) ), ycomment, 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 )
-  end do
-  IF ( LORILAM .AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.)) ) THEN
-    ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_AER))
-    ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates)))
-    ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),JPMODE))
-    ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),JPMODE))
-    ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),JPMODE))
+  Deallocate( zwork )
+
+  IF ( LORILAM .AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.)) ) THEN
+    ALLOCATE (ZSV (1,iku,ISTORE,NSV_AER))
+    ALLOCATE (ZRHO(1,iku,ISTORE))
+    ALLOCATE (ZN0 (1,iku,ISTORE,JPMODE))
+    ALLOCATE (ZRG (1,iku,ISTORE,JPMODE))
+    ALLOCATE (ZSIG(1,iku,ISTORE,JPMODE))
     do ji = 1, iku
-      ZSV(1,ji,:,1:NSV_AER) = TPROFILER%SV(:,ji,KI,NSV_AERBEG:NSV_AEREND)
+      ZSV(1,ji,:,1:NSV_AER) = TPPROFILER%XSV(:,ji,NSV_AERBEG:NSV_AEREND)
     end do
-    IF (SIZE(TPROFILER%R,4) >0) THEN
+    IF ( NRR  > 0) THEN
       ZRHO(1,:,:) = 0.
       do ji = 1, iku
-        DO JRR=1,SIZE(TPROFILER%R,4)
-          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPROFILER%R(:,ji,KI,JRR)
+        DO JRR = 1, NRR
+          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(:,ji,JRR)
         ENDDO
-        ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) )  &
+        ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) * ( 1. + XRV/XRD*TPPROFILER%XR(:,ji,1) )  &
                                              / ( 1. + ZRHO(1,ji,:)                )
       end do
     ELSE
       do ji = 1, iku
-        ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI)
+        ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji)
       end do
     ENDIF
     do ji = 1, iku
-      ZRHO(1,ji,:) =  TPROFILER%P(:,ji,KI) / &
-                      (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) )
+      ZRHO(1,ji,:) =  TPPROFILER%XP(:,ji) / &
+                      (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(:,ji)/XP00)**(XRD/XCPD)) )
     end do
     CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,JPMODE
@@ -319,36 +511,32 @@ if ( Size( tprofiler%sv, 4 ) > 0  ) then
     DEALLOCATE (ZSV,ZRHO)
     DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  ! dust scalar variables
-  do jsv = nsv_dstbeg, nsv_dstend
-    call Add_profile( Trim( cdustnames(jsv - nsv_dstbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 )
-  end do
-  IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.))) THEN
-    ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_DST))
-    ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates)))
-    ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),NMODE_DST))
-    ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),NMODE_DST))
-    ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),NMODE_DST))
+  IF ((LDUST).AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.))) THEN
+    ALLOCATE (ZSV (1,iku,ISTORE,NSV_DST))
+    ALLOCATE (ZRHO(1,iku,ISTORE))
+    ALLOCATE (ZN0 (1,iku,ISTORE,NMODE_DST))
+    ALLOCATE (ZRG (1,iku,ISTORE,NMODE_DST))
+    ALLOCATE (ZSIG(1,iku,ISTORE,NMODE_DST))
     do ji = 1, iku
-      ZSV(1,ji,:,1:NSV_DST) = TPROFILER%SV(:,ji,KI,NSV_DSTBEG:NSV_DSTEND)
+      ZSV(1,ji,:,1:NSV_DST) = TPPROFILER%XSV(:,ji,NSV_DSTBEG:NSV_DSTEND)
     end do
-    IF (SIZE(TPROFILER%R,4) >0) THEN
+    IF ( NRR > 0 ) THEN
       ZRHO(1,:,:) = 0.
       do ji = 1, iku
-        DO JRR=1,SIZE(TPROFILER%R,4)
-          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPROFILER%R(:,ji,KI,JRR)
+        DO JRR = 1, NRR
+          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(:,ji,JRR)
         ENDDO
-        ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) )  &
+        ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) * ( 1. + XRV/XRD*TPPROFILER%XR(:,ji,1) )  &
                                              / ( 1. + ZRHO(1,ji,:)                )
       end do
     ELSE
       do ji = 1, iku
-        ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI)
+        ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji)
       end do
     ENDIF
     do ji = 1, iku
-      ZRHO(1,ji,:) =  TPROFILER%P(:,ji,KI) / &
-                     (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) )
+      ZRHO(1,ji,:) =  TPPROFILER%XP(:,ji) / &
+                     (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(:,ji)/XP00)**(XRD/XCPD)) )
     end do
     CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,NMODE_DST
@@ -380,14 +568,10 @@ if ( Size( tprofiler%sv, 4 ) > 0  ) then
     DEALLOCATE (ZSV,ZRHO)
     DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  ! sea salt scalar variables
-  do jsv = nsv_sltbeg, nsv_sltend
-    call Add_profile( Trim( csaltnames(jsv - nsv_sltbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 )
-  end do
   if ( ldust .or. lorilam .or. lsalt ) then
     do jsv = 1, naer
       Write( yname, '( a, i1 )' ) 'AEREXT', jsv
-      call Add_profile( yname, 'Aerosol Extinction', '1', tprofiler%aer(:,:,:,jsv) )
+      call Add_profile( yname, 'Aerosol Extinction', '1', tpprofiler%xaer(:,:,jsv) )
     end do
   end if
 end if
@@ -420,12 +604,12 @@ tzbudiachro%clevels  (NLVL_SUBCATEGORY) = ''
 tzbudiachro%ccomments(NLVL_SUBCATEGORY) = ''
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
-tzbudiachro%clevels  (NLVL_GROUP)       = ygroup
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Data at position of profiler ' // Trim( ygroup )
+tzbudiachro%clevels  (NLVL_GROUP)       = tpprofiler%cname
+tzbudiachro%ccomments(NLVL_GROUP)       = 'Data at position of profiler ' // Trim( tpprofiler%cname )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
 tzbudiachro%clevels  (NLVL_SHAPE)       = 'Vertical_profile'
-tzbudiachro%ccomments(NLVL_SHAPE)       = 'Vertical profiles at position of profiler ' // Trim( ygroup )
+tzbudiachro%ccomments(NLVL_SHAPE)       = 'Vertical profiles at position of profiler ' // Trim( tpprofiler%cname )
 
 tzbudiachro%lleveluse(NLVL_TIMEAVG)     = .false.
 tzbudiachro%clevels  (NLVL_TIMEAVG)     = 'Not_time_averaged'
@@ -461,7 +645,7 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = iku
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) )
 
 Deallocate( tzfields )
 Deallocate( xwork6 )
@@ -469,33 +653,33 @@ Deallocate( xwork6 )
 !----------------------------------------------------------------------------
 !Treat point values
 
-ALLOCATE (XWORK6(1,1,1,size(tprofiler%tpdates),1,IPROC))
+ALLOCATE ( XWORK6(1, 1, 1, ISTORE, 1, IPROC) )
 
 jproc = 0
 
 if ( ldiag_in_run ) then
-  call Add_point( 'T2m',    '2-m temperature',               'K',       tprofiler%t2m    )
-  call Add_point( 'Q2m',    '2-m humidity',                  'kg kg-1', tprofiler%q2m    )
-  call Add_point( 'HU2m',   '2-m relative humidity',         'percent', tprofiler%hu2m   )
-  call Add_point( 'zon10m', '10-m zonal wind',               'm s-1',   tprofiler%zon10m )
-  call Add_point( 'mer10m', '10-m meridian wind',            'm s-1',   tprofiler%mer10m )
-  call Add_point( 'RN',     'Net radiation',                 'W m-2',   tprofiler%rn     )
-  call Add_point( 'H',      'Sensible heat flux',            'W m-2',   tprofiler%h      )
-  call Add_point( 'LE',     'Total Latent heat flux',        'W m-2',   tprofiler%le     )
-  call Add_point( 'G',      'Storage heat flux',             'W m-2',   tprofiler%gflux  )
+  call Add_point( 'T2m',    '2-m temperature',               'K',       tpprofiler%xt2m    )
+  call Add_point( 'Q2m',    '2-m humidity',                  'kg kg-1', tpprofiler%xq2m    )
+  call Add_point( 'HU2m',   '2-m relative humidity',         'percent', tpprofiler%xhu2m   )
+  call Add_point( 'zon10m', '10-m zonal wind',               'm s-1',   tpprofiler%xzon10m )
+  call Add_point( 'mer10m', '10-m meridian wind',            'm s-1',   tpprofiler%xmer10m )
+  call Add_point( 'RN',     'Net radiation',                 'W m-2',   tpprofiler%xrn     )
+  call Add_point( 'H',      'Sensible heat flux',            'W m-2',   tpprofiler%xh      )
+  call Add_point( 'LE',     'Total Latent heat flux',        'W m-2',   tpprofiler%xle     )
+  call Add_point( 'G',      'Storage heat flux',             'W m-2',   tpprofiler%xgflux  )
   if ( crad /= 'NONE' ) then
-    call Add_point( 'SWD',  'Downward short-wave radiation', 'W m-2',   tprofiler%swd    )
-    call Add_point( 'SWU',  'Upward short-wave radiation',   'W m-2',   tprofiler%swu    )
-    call Add_point( 'LWD',  'Downward long-wave radiation',  'W m-2',   tprofiler%lwd    )
-    call Add_point( 'LWU',  'Upward long-wave radiation',    'W m-2',   tprofiler%lwu    )
+    call Add_point( 'SWD',  'Downward short-wave radiation', 'W m-2',   tpprofiler%xswd    )
+    call Add_point( 'SWU',  'Upward short-wave radiation',   'W m-2',   tpprofiler%xswu    )
+    call Add_point( 'LWD',  'Downward long-wave radiation',  'W m-2',   tpprofiler%xlwd    )
+    call Add_point( 'LWU',  'Upward long-wave radiation',    'W m-2',   tpprofiler%xlwu    )
   end if
-  call Add_point( 'LEI',    'Solid Latent heat flux',        'W m-2',   tprofiler%lei    )
+  call Add_point( 'LEI',    'Solid Latent heat flux',        'W m-2',   tpprofiler%xlei    )
 end if
 
-call Add_point( 'IWV', 'Integrated Water Vapour',   'kg m-2', tprofiler%iwv )
-call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm',      tprofiler%ztd )
-call Add_point( 'ZWD', 'Zenith Wet Delay',          'm',      tprofiler%zwd )
-call Add_point( 'ZHD', 'Zenith Hydrostatic Delay',  'm',      tprofiler%zhd )
+call Add_point( 'IWV', 'Integrated Water Vapour',   'kg m-2', tpprofiler%xiwv )
+call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm',      tpprofiler%xztd )
+call Add_point( 'ZWD', 'Zenith Wet Delay',          'm',      tpprofiler%xzwd )
+call Add_point( 'ZHD', 'Zenith Hydrostatic Delay',  'm',      tpprofiler%xzhd )
 
 Allocate( tzfields( jproc ) )
 
@@ -523,12 +707,12 @@ tzbudiachro%clevels  (NLVL_SUBCATEGORY) = ''
 tzbudiachro%ccomments(NLVL_SUBCATEGORY) = ''
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
-tzbudiachro%clevels  (NLVL_GROUP)       = ygroup
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Data at position of profiler ' // Trim( ygroup )
+tzbudiachro%clevels  (NLVL_GROUP)       = tpprofiler%cname
+tzbudiachro%ccomments(NLVL_GROUP)       = 'Data at position of profiler ' // Trim( tpprofiler%cname )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
 tzbudiachro%clevels  (NLVL_SHAPE)       = 'Point'
-tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of profiler ' // Trim( ygroup )
+tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of profiler ' // Trim( tpprofiler%cname )
 
 tzbudiachro%lleveluse(NLVL_TIMEAVG)     = .false.
 tzbudiachro%clevels  (NLVL_TIMEAVG)     = 'Not_time_averaged'
@@ -560,7 +744,7 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = 1
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) )
 
 Deallocate( tzfields )
 
@@ -574,13 +758,13 @@ JPROC = JPROC + 1
 CTITLE   (JPROC) = 'LON'
 CUNIT    (JPROC) = 'degree'
 CCOMMENT (JPROC) = 'Longitude'
-XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LON(KI)
+XWORK6 (1,1,1,:,1,JPROC) = TPPROFILER%XLON
 
 JPROC = JPROC + 1
 CTITLE   (JPROC) = 'LAT'
 CUNIT    (JPROC) = 'degree'
 CCOMMENT (JPROC) = 'Latitude'
-XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LAT(KI)
+XWORK6 (1,1,1,:,1,JPROC) = TPPROFILER%XLAT
 
 Allocate( tzfields( jproc ) )
 
@@ -599,7 +783,7 @@ tzfields(:)%ndimlist(4) = NMNHDIM_UNUSED
 tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED
 tzfields(:)%ndimlist(6) = NMNHDIM_PROFILER_PROC
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) )
 
 
 !Necessary because global variables (private inside module)
@@ -608,7 +792,6 @@ Deallocate (ccomment)
 Deallocate (ctitle  )
 Deallocate (cunit   )
 
-
 contains
 
 
@@ -616,23 +799,23 @@ subroutine Add_profile( htitle, hcomment, hunits, pfield )
 
 use mode_msg
 
-character(len=*),       intent(in) :: htitle
-character(len=*),       intent(in) :: hcomment
-character(len=*),       intent(in) :: hunits
-real, dimension(:,:,:), intent(in) :: pfield
+character(len=*),     intent(in) :: htitle
+character(len=*),     intent(in) :: hcomment
+character(len=*),     intent(in) :: hunits
+real, dimension(:,:), intent(in) :: pfield
 
 integer :: jk
 
 jproc = jproc + 1
 
-if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' )
+if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more processes than expected' )
 
-ctitle(jproc)   = Trim( htitle)
+ctitle(jproc)   = Trim( htitle )
 ccomment(jproc) = Trim( hcomment )
 cunit(jproc)    = Trim( hunits )
 
 do jk = 1, iku
-  xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk, ki)
+  xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk)
 end do
 
 end subroutine Add_profile
@@ -642,22 +825,22 @@ subroutine Add_point( htitle, hcomment, hunits, pfield )
 
 use mode_msg
 
-character(len=*),     intent(in) :: htitle
-character(len=*),     intent(in) :: hcomment
-character(len=*),     intent(in) :: hunits
-real, dimension(:,:), intent(in) :: pfield
+character(len=*),   intent(in) :: htitle
+character(len=*),   intent(in) :: hcomment
+character(len=*),   intent(in) :: hunits
+real, dimension(:), intent(in) :: pfield
 
 integer :: jk
 
 jproc = jproc + 1
 
-if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' )
+if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' )
 
 ctitle(jproc)   = Trim( htitle)
 ccomment(jproc) = Trim( hcomment )
 cunit(jproc)    = Trim( hunits )
 
-xwork6(1, 1, 1, :, 1, jproc) = pfield(:, ki)
+xwork6(1, 1, 1, :, 1, jproc) = pfield(:)
 
 end subroutine Add_point
 
diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90
index 54ed6c7c8cc5667860dc1c0bc285787c09f76772..62999fff5f6b00cc7cc4939150669c14894f29a3 100644
--- a/src/MNH/write_seriesn.f90
+++ b/src/MNH/write_seriesn.f90
@@ -74,7 +74,7 @@ use modd_budget,        only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_
 use modd_field,         only: NMNHDIM_NI, NMNHDIM_NI_U,                                                               &
                               NMNHDIM_SERIES_LEVEL, NMNHDIM_SERIES_LEVEL_W, NMNHDIM_SERIES_TIME, NMNHDIM_SERIES_PROC, &
                               NMNHDIM_UNUSED,                                                                         &
-                              tfield_metadata_base, TYPEREAL
+                              tfieldmetadata_base, TYPEREAL
 USE MODD_IO,            ONLY: NGEN_VERB, TFILEDATA
 USE MODD_LUNIT_n,       ONLY: TLUOUT
 USE MODD_PARAMETERS
@@ -117,9 +117,9 @@ INTEGER  :: INFO_ll   ! Return code of FM-routines
 INTEGER :: ISER,INAV
 REAL :: ZSIZEHB
 CHARACTER(LEN=100) :: YMSG
-type(tbudiachrometadata)                              :: tzbudiachro
-type(tfield_metadata_base), dimension(:), allocatable :: tzfields
-type(tfiledata)                                       :: tzfile
+type(tbudiachrometadata)                             :: tzbudiachro
+type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
+type(tfiledata)                                      :: tzfile
 !----------------------------------------------------------------------------
 !
 !*    1.     INITIALIZATION
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 7efb9adaa863a844ec485d803cec0a409b8b69e6..309b4eb21b6f089d388f11b2e4808bfe637cbf15 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -1,97 +1,61 @@
-!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!      ###########################
-MODULE MODI_WRITE_STATION_n
-!      ###########################
-!
-INTERFACE
-!
-      SUBROUTINE WRITE_STATION_n(TPDIAFILE)
-!
-USE MODD_IO, ONLY: TFILEDATA
-!
-TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE ! diachronic file to write
-!
-END SUBROUTINE WRITE_STATION_n
-!
-END INTERFACE
-!
-END MODULE MODI_WRITE_STATION_n
-!
-!     ##########################################
-      SUBROUTINE WRITE_STATION_n(TPDIAFILE)
-!     ##########################################
+! Author:
+!  P. Tulet    15/02/2002
 !
-!
-!!****  *WRITE_STATION* - write the balloon and aircraft trajectories and records
-!!                      in the diachronic file
-!!
-!!    PURPOSE
-!!    -------
-!
-!
-!!**  METHOD
-!!    ------
-!!    
-!!
-!!
-!!
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      Pierre TULET             * Meteo-France *
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 15/02/2002
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  Modifications
+!  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields
 !  P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro)
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 ! --------------------------------------------------------------------------
+!      ###########################
+MODULE MODE_WRITE_STATION_n
+!      ###########################
+
+use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+
+implicit none
+
+private
+
+public :: WRITE_STATION_n
+
+CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE   ! title
+CHARACTER(LEN=NUNITLGTMAX),    DIMENSION(:), ALLOCATABLE :: CUNIT    ! physical unit
+
+REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6   ! contains temporal serie
+
+contains
+!
+! #####################################
+SUBROUTINE WRITE_STATION_n( TPDIAFILE )
+! #####################################
+!
+!
+!****  *WRITE_STATION* - write the stations records in the diachronic file
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-use MODD_BUDGET,          ONLY: tbudiachrometadata
-USE MODD_CH_M9_n,         ONLY: CNAMES
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, LORILAM, JPMODE
-USE MODD_CONF
-USE MODD_CST
-USE MODD_DIAG_IN_RUN
-USE MODD_DIM_n
-USE MODD_DUST,            ONLY: CDUSTNAMES, LDUST, NMODE_DST
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-USE MODD_GRID_n
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_LUNIT
-USE MODD_NSV
-USE MODD_PARAMETERS
-USE MODD_PARAM_n,         ONLY: CRAD, CSURF
-USE MODD_PASPOL
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_SALT,            ONLY: CSALTNAMES, LSALT, NMODE_SLT
-USE MODD_STATION_n
 USE MODD_ALLSTATION_n,    ONLY: LDIAG_SURFRAD
-!
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-USE MODE_SALT_PSD
-use MODE_WRITE_DIACHRO,   ONLY: Write_diachro
+USE MODD_CONF_n,          ONLY: NRR
+USE MODD_IO,              ONLY: ISNPROC, ISP, TFILEDATA
+USE MODD_MPIF
+USE MODD_NSV,             ONLY: nsv
+USE MODD_PARAM_n,         ONLY: CRAD, CSURF, CTURB
+USE MODD_PRECISION,       ONLY: MNHINT_MPI, MNHREAL_MPI
+USE MODD_STATION_n,       only: NUMBSTAT_LOC, TSTATIONS, tstations_time
+USE MODD_TYPE_STATPROF,   ONLY: TSTATIONDATA
+!
+USE MODE_MSG
+USE MODE_STATPROF_TOOLS,  ONLY: STATION_ALLOCATE
 !
 IMPLICIT NONE
 !
@@ -104,653 +68,569 @@ TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE ! diachronic file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER     ::  II  ! loop
-INTEGER     ::  K   ! loop
-!
-!----------------------------------------------------------------------------
-!
-DO II=1,NUMBSTAT
-CALL STATION_DIACHRO_n(TSTATION, II)
-ENDDO
+INTEGER, PARAMETER :: ITAG = 100
+INTEGER :: IERR
+INTEGER :: JP, JS
+INTEGER :: IDX
+INTEGER :: INUMSTAT  ! Total number of stations (for the current model)
+INTEGER :: IPACKSIZE ! Size of the ZPACK buffer
+INTEGER :: IPOS      ! Position in the ZPACK buffer
+INTEGER :: ISTORE
+INTEGER, DIMENSION(:), ALLOCATABLE :: INSTATPRC    ! Array to store the number of stations per process (for the current model)
+INTEGER, DIMENSION(:), ALLOCATABLE :: ISTATIDS     ! Intermediate array for MPI communication
+INTEGER, DIMENSION(:), ALLOCATABLE :: ISTATPRCRANK ! Array to store the ranks of the processes where the stations are
+INTEGER, DIMENSION(:), ALLOCATABLE :: IDS          ! Array to store the station number to send
+INTEGER, DIMENSION(:), ALLOCATABLE :: IDISP        ! Array to store the displacements for MPI communications
+REAL,    DIMENSION(:), ALLOCATABLE :: ZPACK        ! Buffer to store raw data of a station (used for MPI communication)
+TYPE(TSTATIONDATA) :: TZSTATION
 !
 !----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-!----------------------------------------------------------------------------
-SUBROUTINE STATION_DIACHRO_n(TSTATION,II)
 
-use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK
-use modd_field,  only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, &
-                       tfield_metadata_base, TYPEREAL
+ALLOCATE( INSTATPRC(ISNPROC) )
+ALLOCATE( IDS(NUMBSTAT_LOC) )
+
+!Gather number of station present on each process
+CALL MPI_ALLGATHER( NUMBSTAT_LOC, 1, MNHINT_MPI, INSTATPRC, 1, MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR )
+
+!Store the identification number of local stations (these numbers are globals)
+DO JS = 1, NUMBSTAT_LOC
+  IDS(JS) = TSTATIONS(JS)%NID
+END DO
+
+ALLOCATE( IDISP(ISNPROC) )
+IDISP(1) = 0
+DO JP = 2, ISNPROC
+  IDISP(JP) = IDISP(JP-1) + INSTATPRC(JP-1)
+END DO
+
+INUMSTAT = SUM( INSTATPRC(:) )
+ALLOCATE( ISTATIDS(INUMSTAT) )
+ALLOCATE( ISTATPRCRANK(INUMSTAT) )
+
+!Gather the list of all the stations of all processes
+CALL MPI_ALLGATHERV( IDS(:), NUMBSTAT_LOC, MNHINT_MPI, ISTATIDS(:), INSTATPRC(:), &
+                     IDISP(:), MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR )
+
+!Store the rank of each process corresponding to a given station
+IDX = 1
+ISTATPRCRANK(:) = -1
+DO JP = 1, ISNPROC
+  DO JS = 1, INSTATPRC(JP)
+    ISTATPRCRANK(ISTATIDS(IDX)) = JP
+    IDX = IDX + 1
+  END DO
+END DO
+
+CALL STATION_ALLOCATE( TZSTATION, SIZE( tstations_time%tpdates ) )
+
+!Determine the size of the ZPACK buffer used to transfer station data in 1 MPI communication
+IF ( ISNPROC > 1 ) THEN
+  ISTORE = SIZE( TSTATIONS_TIME%TPDATES )
+  IPACKSIZE = 7
+  IPACKSIZE = IPACKSIZE + ISTORE * ( 5 + NRR + NSV )
+  IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE !Tke term
+  IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE !XTSRAD term
+  IF ( LDIAG_SURFRAD ) THEN
+    IF ( CSURF == 'EXTE' ) IPACKSIZE = IPACKSIZE + ISTORE * 10
+    IF ( CRAD /= 'NONE' )  IPACKSIZE = IPACKSIZE + ISTORE * 7
+    IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term
+  END IF
+
+  ALLOCATE( ZPACK(IPACKSIZE) )
+END IF
+
+IDX = 1
 
-TYPE(STATION),        INTENT(IN)       :: TSTATION
-INTEGER,              INTENT(IN)       :: II
+STATION: DO JS = 1, INUMSTAT
+  IF ( ISTATPRCRANK(JS) == TPDIAFILE%NMASTER_RANK ) THEN
+    !No communication necessary, the station data is already on the writer process
+    IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+      TZSTATION = TSTATIONS(IDX)
+      IDX = IDX + 1
+    END IF
+  ELSE
+    !The station data is not on the writer process
+    IF ( ISP == ISTATPRCRANK(JS) ) THEN
+      ! This process has the data and needs to send it to the writer process
+      IPOS = 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%NID;  IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XX;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XY;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XZ;   IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XLON; IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XLAT; IPOS = IPOS + 1
+      ZPACK(IPOS) = TSTATIONS(IDX)%XZS;  IPOS = IPOS + 1
+      ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XZON(:); IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XMER(:); IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XW(:);   IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XP(:);   IPOS = IPOS + ISTORE
+      IF ( CTURB == 'TKEL') THEN
+        ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTKE(:); IPOS = IPOS + ISTORE
+      END IF
+      ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTH(:);  IPOS = IPOS + ISTORE
+      ZPACK(IPOS:IPOS+ISTORE*NRR-1) = RESHAPE( TSTATIONS(IDX)%XR(:,:),  [ISTORE*NRR] ); IPOS = IPOS + ISTORE * NRR
+      ZPACK(IPOS:IPOS+ISTORE*NSV-1) = RESHAPE( TSTATIONS(IDX)%XSV(:,:), [ISTORE*NSV] ); IPOS = IPOS + ISTORE * NSV
+      IF ( CRAD /= 'NONE' ) THEN
+        ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTSRAD(:); IPOS = IPOS + ISTORE
+      END IF
+      IF ( LDIAG_SURFRAD ) THEN
+        IF ( CSURF == 'EXTE') THEN
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XT2M;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XQ2M;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XHU2M;   IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XZON10M; IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XMER10M; IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XRN;     IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XH;      IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLE;     IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XGFLUX;  IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLEI;    IPOS = IPOS + ISTORE
+        END IF
+        IF ( CRAD /= 'NONE' ) THEN
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWD;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWU;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLWD;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLWU;    IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIR;  IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIFF; IPOS = IPOS + ISTORE
+          ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XDSTAOD; IPOS = IPOS + ISTORE
+        END IF
+        ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2;    IPOS = IPOS + ISTORE
+      END IF
+
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. )
+
+      CALL MPI_SEND( TSTATIONS(IDX)%CNAME, LEN(TSTATIONS(IDX)%CNAME), MPI_CHARACTER, TPDIAFILE%NMASTER_RANK - 1, &
+                     ITAG, TPDIAFILE%NMPICOMM, IERR )
+      CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, TPDIAFILE%NMASTER_RANK - 1, ITAG, TPDIAFILE%NMPICOMM, IERR )
+
+      IDX = IDX + 1
+
+    ELSE IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN
+      ! This process is the writer and will receive the station data from its owner
+      CALL MPI_RECV( TZSTATION%CNAME, LEN(TZSTATION%CNAME), MPI_CHARACTER, &
+                                                    ISTATPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR )
+      CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, ISTATPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR )
+
+      IPOS = 1
+      TZSTATION%NID  = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
+      TZSTATION%XX   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XY   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XZ   = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XLON = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XLAT = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XZS  = ZPACK(IPOS);         IPOS = IPOS + 1
+      TZSTATION%XZON(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      TZSTATION%XMER(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      TZSTATION%XW(:)   = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      TZSTATION%XP(:)   = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      IF ( CTURB == 'TKEL') THEN
+        TZSTATION%XTKE(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      END IF
+      TZSTATION%XTH(:) = ZPACK(IPOS:IPOS+ISTORE-1);  IPOS = IPOS + ISTORE
+      TZSTATION%XR(:,:)  = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*NRR-1), [ ISTORE, NRR ] ); IPOS = IPOS + ISTORE * NRR
+      TZSTATION%XSV(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*NSV-1), [ ISTORE, NSV ] ); IPOS = IPOS + ISTORE * NSV
+      IF ( CRAD /= 'NONE' ) THEN
+        TZSTATION%XTSRAD(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      END IF
+      IF ( LDIAG_SURFRAD ) THEN
+        IF ( CSURF == 'EXTE' ) THEN
+          TZSTATION%XT2M    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XQ2M    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XHU2M   = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XZON10M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XMER10M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XRN     = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XH      = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XLE     = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XGFLUX  = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XLEI    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+        END IF
+        IF ( CRAD /= 'NONE' ) THEN
+          TZSTATION%XSWD    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XSWU    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XLWD    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XLWU    = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XSWDIR  = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XSWDIFF = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+          TZSTATION%XDSTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+        END IF
+        TZSTATION%XSFCO2 =    ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
+      END IF
+
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
+    END IF
+  END IF
+
+  CALL STATION_DIACHRO_n( TPDIAFILE, TZSTATION )
+
+END DO STATION
+
+END SUBROUTINE WRITE_STATION_n
+
+! ##################################################
+SUBROUTINE STATION_DIACHRO_n( TPDIAFILE, TPSTATION )
+! ##################################################
+
+USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
+use modd_budget,        only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
+                              tbudiachrometadata
+USE MODD_CONF,          ONLY: LCARTESIAN
+USE MODD_CST,           ONLY: XRV
+use modd_field,         only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, &
+                              tfieldmetadata_base, TYPEREAL
+USE MODD_IO,            ONLY: TFILEDATA
+USE MODD_NSV,           ONLY: nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
+                              nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend, &
+                              tsvlist
+USE MODD_PARAM_n,       ONLY: CRAD, CSURF, CTURB
+use modd_station_n,     only: tstations_time
+use modd_type_statprof, only: tstationdata
+
+USE MODE_AERO_PSD
+USE MODE_DUST_PSD
+USE MODE_SALT_PSD
+use MODE_WRITE_DIACHRO, ONLY: Write_diachro
+
+TYPE(TFILEDATA),    INTENT(IN) :: TPDIAFILE ! diachronic file to write
+TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION
 !
 !*      0.2  declaration of local variables for diachro
 !
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal series
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6    ! contains temporal series to write
+REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal series
 REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
-REAL, DIMENSION(:,:,:,:,:),     ALLOCATABLE :: ZPTOTA
+REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
 REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
 !
-INTEGER, DIMENSION(:),            ALLOCATABLE :: IGRID    ! grid indicator
-CHARACTER(LEN=  8)                            :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT    ! physical unit
+CHARACTER(LEN=NCOMMENTLGTMAX)     :: YCOMMENT ! comment string
+CHARACTER(LEN=NMNHNAMELGTMAX)     :: YTITLE   ! title
 !
 !!! do not forget to increment the IPROC value if you add diagnostic !!!
 INTEGER :: IPROC    ! number of variables records
 !!! do not forget to increment the JPROC value if you add diagnostic !!!
+INTEGER :: ISTORE
 INTEGER :: JPROC    ! loop counter
 INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
-type(tbudiachrometadata)                              :: tzbudiachro
-type(tfield_metadata_base), dimension(:), allocatable :: tzfields
+type(tbudiachrometadata)                             :: tzbudiachro
+type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
-IF (TSTATION%X(II)==XUNDEF) RETURN
-IF (TSTATION%Y(II)==XUNDEF) RETURN
 !
-IPROC = 8 + SIZE(TSTATION%R,3) + SIZE(TSTATION%SV,3)
+IPROC = 8 + SIZE(TPSTATION%XR,2) + SIZE(TPSTATION%XSV,2)
 
-IF (TSTATION%X(II)==XUNDEF) IPROC = IPROC + 2
-IF (SIZE(TSTATION%TKE  )>0) IPROC = IPROC + 1
+IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1
 IF (LDIAG_SURFRAD) THEN
   IF(CSURF=="EXTE") IPROC = IPROC + 10
   IF(CRAD/="NONE")  IPROC = IPROC + 7
+  IPROC = IPROC + 1 ! XSFCO2 term
 END IF
 IF (LORILAM) IPROC = IPROC + JPMODE*(3+NSOA+NCARB+NSP)
 IF (LDUST) IPROC = IPROC + NMODE_DST*3
 IF (LSALT) IPROC = IPROC + NMODE_SLT*3
-IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF))  IPROC = IPROC + 1
-IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF))  IPROC = IPROC + 1
+IF ( CRAD /= 'NONE' )  IPROC = IPROC + 1
 !
-ALLOCATE (ZWORK6(1,1,1,SIZE(tstation%tpdates),1,IPROC))
-ALLOCATE (YCOMMENT(IPROC))
-ALLOCATE (YTITLE  (IPROC))
-ALLOCATE (YUNIT   (IPROC))
-ALLOCATE (IGRID   (IPROC))
+ISTORE = SIZE( TSTATIONS_TIME%TPDATES )
+
+ALLOCATE( XWORK6(1, 1, 1, ISTORE, 1, IPROC) )
+ALLOCATE( CCOMMENT(IPROC) )
+ALLOCATE( CTITLE  (IPROC) )
+ALLOCATE( CUNIT   (IPROC) )
 !
-IGRID  = 1
-YGROUP = TSTATION%NAME(II)
 JPROC = 0
 !
 !----------------------------------------------------------------------------
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZS'
-YUNIT    (JPROC) = 'm'
-YCOMMENT (JPROC) = 'Orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZS(II)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'P'
-YUNIT    (JPROC) = 'Pa'
-YCOMMENT (JPROC) = 'Pressure' 
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%P(:,II)
-!
-!JPROC = JPROC + 1
-!YTITLE   (JPROC) = 'Z'
-!YUNIT    (JPROC) = 'm'
-!YCOMMENT (JPROC) = 'Z Pos'
-!ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Z(II)
-!
-IF (LCARTESIAN) THEN
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'X'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'X Pos'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%X(II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'Y'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'Y Pos'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Y(II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'U'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Axial velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'V'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Transversal velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II)
-ELSE
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LON'
-  YUNIT    (JPROC) = 'degree'
-  YCOMMENT (JPROC) = 'Longitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LON(II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LAT'
-  YUNIT    (JPROC) = 'degree'
-  YCOMMENT (JPROC) = 'Latitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LAT(II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'ZON_WIND'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Zonal wind'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'MER_WIND'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Meridional wind'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II)
-ENDIF
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'W'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'Air vertical speed' 
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%W(:,II)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'Th'
-YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'Potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TH(:,II)
-!
-IF (LDIAG_SURFRAD) THEN
-  IF (CSURF=="EXTE") THEN
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'T2m'
-    YUNIT    (JPROC) = 'K'
-    YCOMMENT (JPROC) = '2-m temperature' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%T2M(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'Q2m'
-    YUNIT    (JPROC) = 'kg kg-1'
-    YCOMMENT (JPROC) = '2-m humidity' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Q2M(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'HU2m'
-    YUNIT    (JPROC) = 'percent'
-    YCOMMENT (JPROC) = '2-m relative humidity' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%HU2M(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'zon10m'
-    YUNIT    (JPROC) = 'm s-1'
-    YCOMMENT (JPROC) = '10-m zonal wind' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON10M(:,II)
-    !       
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'mer10m'
-    YUNIT    (JPROC) = 'm s-1'
-    YCOMMENT (JPROC) = '10-m meridian wind' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER10M(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'RN'  
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Net radiation'         
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%RN(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'H'   
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Sensible heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%H(:,II)
-    !       
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LE'  
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Total Latent heat flux'   
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LE(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'G'    
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Storage heat flux'     
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%GFLUX(:,II)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LEI'  
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Solid Latent heat flux'   
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LEI(:,II)
-  END IF
- IF (CRAD /= 'NONE') THEN
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWD'   
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWD(:,II)
-  !       
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWU'   
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Upward short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWU(:,II)
-  !       
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWD'  
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWD(:,II)
-  !       
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWU'  
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Upward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWU(:,II)
-  JPROC = JPROC + 1
-  !
-  YTITLE   (JPROC) = 'SWDIR'   
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward direct short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIR(:,II)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWDIFF'   
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIFF(:,II)  
-  !       
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'DSTAOD'  
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'Dust aerosol optical depth'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%DSTAOD(:,II)
-  !
- END IF
-ENDIF
-!
-DO JRR=1,SIZE(TSTATION%R,3)
-  JPROC = JPROC+1
-  YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%R(:,II,JRR)
-  IF (JRR==1) THEN
-    YTITLE   (JPROC) = 'Rv'
-    YCOMMENT (JPROC) = 'Water vapor mixing ratio' 
-  ELSE IF (JRR==2) THEN
-    YTITLE   (JPROC) = 'Rc'
-    YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' 
-  ELSE IF (JRR==3) THEN
-    YTITLE   (JPROC) = 'Rr'
-    YCOMMENT (JPROC) = 'Rain water mixing ratio' 
-  ELSE IF (JRR==4) THEN
-    YTITLE   (JPROC) = 'Ri'
-    YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' 
-  ELSE IF (JRR==5) THEN
-    YTITLE   (JPROC) = 'Rs'
-    YCOMMENT (JPROC) = 'Snow mixing ratio' 
-  ELSE IF (JRR==6) THEN
-    YTITLE   (JPROC) = 'Rg'
-    YCOMMENT (JPROC) = 'Graupel mixing ratio' 
-  ELSE IF (JRR==7) THEN
-    YTITLE   (JPROC) = 'Rh'
-    YCOMMENT (JPROC) = 'Hail mixing ratio' 
-  END IF
-END DO
-!
-IF (SIZE(TSTATION%TKE,1)>0) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'Turbulent kinetic energy'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TKE(:,II)
-END IF
-!
-!
-IF (LPASPOL) THEN
-    JSV=1
-    JPROC = JPROC+1
-    WRITE (YTITLE(JPROC),FMT='(A2,I3.3)')   'Sv',JSV
-    YUNIT    (JPROC) = 'kg kg-1'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
-ENDIF
-!
-IF (SIZE(TSTATION%SV,3)>=1) THEN
-  ! User scalar variables
-  DO JSV = 1,NSV_USER
-    JPROC = JPROC+1
-    WRITE (YTITLE(JPROC),FMT='(A2,I3.3)')   'Sv',JSV
-    YUNIT    (JPROC) = 'kg kg-1'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
-  END DO
-  ! microphysical C2R2 scheme scalar variables
-  DO JSV = NSV_C2R2BEG,NSV_C2R2END
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-    YUNIT    (JPROC) = 'm-3'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
-  END DO
-  ! microphysical C3R5 scheme additional scalar variables
-  DO JSV = NSV_C1R3BEG,NSV_C1R3END
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-    YUNIT    (JPROC) = 'm-3'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
-  END DO
-  ! electrical scalar variables
-  DO JSV = NSV_ELECBEG,NSV_ELECEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-    YUNIT    (JPROC) = 'C'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
-  END DO
-  ! chemical scalar variables
-  DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    WRITE(YCOMMENT (JPROC),'(A5,A3,I3.3)') 'T(s) ','SVT',JSV
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9
-  END DO
-  ! LiNOX passive tracer
-  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-    JPROC = JPROC+1
-    WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx'
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9
-  END DO
-  ! aerosol scalar variables
-  DO JSV = NSV_AERBEG,NSV_AEREND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9
+call Add_point( 'ZS', 'Orography', 'm',  SPREAD( tpstation%xzs, 1, istore ) )
+call Add_point( 'P',  'Pressure',  'Pa', tpstation%xp(:) )
+! call Add_point( 'Z', 'Z Pos', 'm', SPREAD( tpstation%xz, 1, istore ) )
+
+if ( lcartesian ) then
+  call Add_point( 'X', 'X Pos', 'm', SPREAD( tpstation%xx, 1, istore ) )
+  call Add_point( 'Y', 'Y Pos', 'm', SPREAD( tpstation%xy, 1, istore ) )
+  call Add_point( 'U', 'Axial velocity',       'm s-1', tpstation%xzon(:) )
+  call Add_point( 'V', 'Transversal velocity', 'm s-1', tpstation%xmer(:) )
+else
+  call Add_point( 'LON', 'Longitude', 'degree', SPREAD( tpstation%xlon, 1, istore ) )
+  call Add_point( 'LAT', 'Latitude',  'degree', SPREAD( tpstation%xlat, 1, istore ) )
+  call Add_point( 'ZON_WIND', 'Zonal wind',      'm s-1', tpstation%xzon(:) )
+  call Add_point( 'MER_WIND', 'Meridional wind', 'm s-1', tpstation%xmer(:) )
+end if
+
+call Add_point( 'W',  'Air vertical speed',    'm s-1', tpstation%xw(:)  )
+call Add_point( 'Th', 'Potential temperature', 'K',     tpstation%xth(:) )
+
+if ( ldiag_surfrad ) then
+  if ( csurf == "EXTE" ) then
+    call Add_point( 'T2m',    '2-m temperature',        'K',       tpstation%xt2m(:)    )
+    call Add_point( 'Q2m',    '2-m humidity',           'kg kg-1', tpstation%xq2m(:)    )
+    call Add_point( 'HU2m',   '2-m relative humidity',  'percent', tpstation%xhu2m(:)   )
+    call Add_point( 'zon10m', '10-m zonal wind',        'm s-1',   tpstation%xzon10m(:) )
+    call Add_point( 'mer10m', '10-m meridian wind',     'm s-1',   tpstation%xmer10m(:) )
+    call Add_point( 'RN',     'Net radiation',          'W m-2',   tpstation%xrn(:)     )
+    call Add_point( 'H',      'Sensible heat flux',     'W m-2',   tpstation%xh(:)      )
+    call Add_point( 'LE',     'Total Latent heat flux', 'W m-2',   tpstation%xle(:)     )
+    call Add_point( 'G',      'Storage heat flux',      'W m-2',   tpstation%xgflux(:)  )
+    call Add_point( 'LEI',    'Solid Latent heat flux', 'W m-2',   tpstation%xlei(:)    )
+  end if
+  if ( crad /= 'NONE' ) then
+    call Add_point( 'SWD',    'Downward short-wave radiation',         'W m-2', tpstation%xswd(:)    )
+    call Add_point( 'SWU',    'Upward short-wave radiation',           'W m-2', tpstation%xswu(:)    )
+    call Add_point( 'LWD',    'Downward long-wave radiation',          'W m-2', tpstation%xlwd(:)    )
+    call Add_point( 'LWU',    'Upward long-wave radiation',            'W m-2', tpstation%xlwu(:)    )
+    call Add_point( 'SWDIR',  'Downward direct short-wave radiation',  'W m-2', tpstation%xswdir(:)  )
+    call Add_point( 'SWDIFF', 'Downward diffuse short-wave radiation', 'W m-2', tpstation%xswdiff(:) )
+    call Add_point( 'DSTAOD', 'Dust aerosol optical depth',            'm',     tpstation%xdstaod(:) )
+  end if
+end if
+
+do jrr = 1, SIZE( tpstation%xr, 2 )
+  select case( jrr )
+    case (1)
+      call Add_point( 'Rv', 'Water vapor mixing ratio',        'kg kg-1', tpstation%xr(:,jrr) )
+    case (2)
+      call Add_point( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) )
+    case (3)
+      call Add_point( 'Rr', 'Rain water mixing ratio',         'kg kg-1', tpstation%xr(:,jrr) )
+    case (4)
+      call Add_point( 'Ri', 'Ice cloud water mixing ratio',    'kg kg-1', tpstation%xr(:,jrr) )
+    case (5)
+      call Add_point( 'Rs', 'Snow mixing ratio',               'kg kg-1', tpstation%xr(:,jrr) )
+    case (6)
+      call Add_point( 'Rg', 'Graupel mixing ratio',            'kg kg-1', tpstation%xr(:,jrr) )
+    case (7)
+      call Add_point( 'Rh', 'Hail mixing ratio',               'kg kg-1', tpstation%xr(:,jrr) )
+  end select
+end do
+
+if ( cturb == 'TKEL' ) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpstation%xtke(:) )
+
+if ( nsv > 0 ) then
+  ! Scalar variables
+  DO JSV = 1, NSV
+    IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
+      !*1e9 for conversion ppv->ppb
+      call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', 'ppb', TPSTATION%XSV(:,JSV) * 1.e9 )
+    ELSE
+      call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', TSVLIST(JSV)%CUNITS, TPSTATION%XSV(:,JSV) )
+    END IF
   END DO
 
-  IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_AER))
-    ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),JPMODE))
-    ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),JPMODE))
-    ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),JPMODE))
-    ALLOCATE (ZPTOTA(1,1,SIZE(tstation%tpdates),NSP+NCARB+NSOA,JPMODE))
-    ZSV(1,1,:,1:NSV_AER) = TSTATION%SV(:,II,NSV_AERBEG:NSV_AEREND)
-    IF (SIZE(TSTATION%R,3) >0) THEN
+  IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
+    ALLOCATE (ZSV(1,1,ISTORE,NSV_AER))
+    ALLOCATE (ZRHO(1,1,ISTORE))
+    ALLOCATE (ZN0(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZRG(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZSIG(1,1,ISTORE,JPMODE))
+    ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE))
+    ZSV(1,1,:,1:NSV_AER) = TPSTATION%XSV(:,NSV_AERBEG:NSV_AEREND)
+    IF (SIZE(TPSTATION%XR,2) >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TSTATION%R,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR)
+      DO JRR=1,SIZE(TPSTATION%XR,2)
+        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR)
       ENDDO
-      ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                ) 
+      ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) )  &
+                                      / ( 1. + ZRHO(1,1,:)                )
     ELSE
-      ZRHO(1,1,:) = TSTATION%TH(:,II)
+      ZRHO(1,1,:) = TPSTATION%XTH(:)
     ENDIF
-    ZRHO(1,1,:) =  TSTATION%P(:,II) / &
-                  (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) )
+    ZRHO(1,1,:) =  TPSTATION%XP(:) / &
+                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) )
 
-
-   CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA)
+    CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA)
 
     DO JSV=1,JPMODE
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(YTITLE,'(A6,I1)')'AERRGA',JSV
+      WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV
+      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) )
+
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV
+      WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV
+      call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) )
+
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MOC  ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS OC   AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_OC,JSV)
+      WRITE(YTITLE,'(A6,I1)')'AERN0A',JSV
+      WRITE(YCOMMENT,'(A13,I1)')'N0 AERO MODE ',JSV
+      call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) )
 
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MBC  ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS BC   AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_BC,JSV)
+      WRITE(YTITLE,'(A5,I1)')'MOC  ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS OC   AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) )
 
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MDST  ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS DST   AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_DST,JSV)
+      WRITE(YTITLE,'(A5,I1)')'MBC  ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS BC   AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) )
 
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSO4 ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SO4  AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SO4,JSV)
+      WRITE(YTITLE,'(A5,I1)')'MDST  ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS DST   AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) )
 
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MNO3 ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS NO3  AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_NO3,JSV)
+      WRITE(YTITLE,'(A5,I1)')'MSO4 ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS SO4  AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) )
 
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MH2O ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS H2O  AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_H2O,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MNH3 ',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS NH3  AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_NH3,JSV)
-      JPROC = JPROC+1
-      IF (NSOA == 10) THEN
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA1',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA1,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA2',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA2,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA3',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA3,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA4',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA4,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA5',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA5,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA6',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA6,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA7',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA7,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA8',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA8,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA9',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA9,JSV)
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'MSOA10',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA10,JSV)
+      WRITE(YTITLE,'(A5,I1)')'MNO3 ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS NO3  AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) )
+
+      WRITE(YTITLE,'(A5,I1)')'MH2O ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS H2O  AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) )
+
+      WRITE(YTITLE,'(A5,I1)')'MNH3 ',JSV
+      WRITE(CCOMMENT,'(A23,I1)')'MASS NH3  AEROSOL MODE ',JSV
+      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) )
+
+      IF ( NSOA == 10 ) THEN
+        WRITE(YTITLE,'(A5,I1)')'MSOA1',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA2',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA3',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA4',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA5',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA6',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA7',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA8',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) )
+
+        WRITE(YTITLE,'(A5,I1)')'MSOA9',JSV
+        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) )
+
+        WRITE(YTITLE,'(A6,I1)')'MSOA10',JSV
+        WRITE(CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV
+        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) )
       END IF
-      ENDDO
+    END DO
 
-    DEALLOCATE (ZSV,ZRHO) 
-    DEALLOCATE (ZN0,ZRG,ZSIG) 
+    DEALLOCATE (ZSV,ZRHO)
+    DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  ! dust scalar variables
-  DO JSV = NSV_DSTBEG,NSV_DSTEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9
-  END DO
-  IF ((LDUST).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_DST))
-    ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_DST))
-    ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_DST))
-    ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_DST))
-    ZSV(1,1,:,1:NSV_DST) = TSTATION%SV(:,II,NSV_DSTBEG:NSV_DSTEND)
-    IF (SIZE(TSTATION%R,3) >0) THEN
+
+  IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
+    ALLOCATE (ZSV(1,1,ISTORE,NSV_DST))
+    ALLOCATE (ZRHO(1,1,ISTORE))
+    ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST))
+    ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST))
+    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST))
+    ZSV(1,1,:,1:NSV_DST) = TPSTATION%XSV(:,NSV_DSTBEG:NSV_DSTEND)
+    IF (SIZE(TPSTATION%XR,2) >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TSTATION%R,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR)
+      DO JRR=1,SIZE(TPSTATION%XR,2)
+        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR)
       ENDDO
-      ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                ) 
+      ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) )  &
+                                      / ( 1. + ZRHO(1,1,:)                )
     ELSE
-      ZRHO(1,1,:) = TSTATION%TH(:,II)
+      ZRHO(1,1,:) = TPSTATION%XTH(:)
     ENDIF
-    ZRHO(1,1,:) =  TSTATION%P(:,II) / &
-                  (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) )
+    ZRHO(1,1,:) =  TPSTATION%XP(:) / &
+                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) )
     CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,NMODE_DST
       ! mean radius
       JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV
+      CUNIT    (JPROC) = 'um'
+      WRITE(CCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV
+      XWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
       ! standard deviation
       JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV
+      CUNIT    (JPROC) = '  '
+      WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
+      XWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
       ! particles number
       JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV
+      CUNIT    (JPROC) = 'm-3'
+      WRITE(CCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
+      XWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
     ENDDO
-    DEALLOCATE (ZSV,ZRHO) 
-    DEALLOCATE (ZN0,ZRG,ZSIG) 
+    DEALLOCATE (ZSV,ZRHO)
+    DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  ! sea salt scalar variables
-  DO JSV = NSV_SLTBEG,NSV_SLTEND
-    JPROC = JPROC+1
-    YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-    YUNIT    (JPROC) = 'ppb'
-    YCOMMENT (JPROC) = ' '
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9
-  END DO
-ENDIF
-!
-  IF ((LSALT).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_SLT))
-    ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_SLT))
-    ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_SLT))
-    ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_SLT))
-    ZSV(1,1,:,1:NSV_SLT) = TSTATION%SV(:,II,NSV_SLTBEG:NSV_SLTEND)
-    IF (SIZE(TSTATION%R,3) >0) THEN
+
+  IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
+    ALLOCATE (ZSV(1,1,ISTORE,NSV_SLT))
+    ALLOCATE (ZRHO(1,1,ISTORE))
+    ALLOCATE (ZN0(1,1,ISTORE,NMODE_SLT))
+    ALLOCATE (ZRG(1,1,ISTORE,NMODE_SLT))
+    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_SLT))
+    ZSV(1,1,:,1:NSV_SLT) = TPSTATION%XSV(:,NSV_SLTBEG:NSV_SLTEND)
+    IF (SIZE(TPSTATION%XR,2) >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TSTATION%R,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR)
+      DO JRR=1,SIZE(TPSTATION%XR,2)
+        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR)
       ENDDO
-      ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                ) 
+      ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) )  &
+                                      / ( 1. + ZRHO(1,1,:)                )
     ELSE
-      ZRHO(1,1,:) = TSTATION%TH(:,II)
+      ZRHO(1,1,:) = TPSTATION%XTH(:)
     ENDIF
-    ZRHO(1,1,:) =  TSTATION%P(:,II) / &
-                  (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) )
+    ZRHO(1,1,:) =  TPSTATION%XP(:) / &
+                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) )
     CALL PPP2SALT(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,NMODE_SLT
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'SLTRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) SALT MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A6,I1)')'SLTRGA',JSV
+      WRITE(CCOMMENT(JPROC),'(A18,I1)')'RG (nb) SALT MODE ',JSV
+      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) )
+
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'SLTSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A7,I1)')'SLTSIGA',JSV
+      WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
+      call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) )
+
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'SLTN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(CTITLE(JPROC),'(A6,I1)')'SLTN0A',JSV
+      WRITE(CCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
+      call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) )
     ENDDO
-    DEALLOCATE (ZSV,ZRHO) 
-    DEALLOCATE (ZN0,ZRG,ZSIG) 
+    DEALLOCATE (ZSV,ZRHO)
+    DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
+end if
 
-IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tsrad'
-  YUNIT    (JPROC) = 'K'
-  YCOMMENT (JPROC) = 'Radiative Surface Temperature'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TSRAD(:,II)
-END IF
-!
-IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF)) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'SFCO2'
-  YUNIT    (JPROC) = 'mg m-2 s-1'
-  YCOMMENT (JPROC) = 'CO2 Surface Flux'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SFCO2(:,II)
-END IF
+if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpstation%xtsrad(:) )
+
+if ( ldiag_surfrad ) call Add_point( 'SFCO2', 'CO2 Surface Flux', 'mg m-2 s-1', tpstation%xsfco2(:) )
 !
 !----------------------------------------------------------------------------
 !
 !
-ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC))
-ZW6 = ZWORK6(:,:,:,:,:,:JPROC)
-DEALLOCATE(ZWORK6)
-!
 allocate( tzfields( jproc ) )
 
-tzfields(:)%cmnhname  = ytitle(1 : jproc)
+tzfields(:)%cmnhname  = ctitle(1 : jproc)
 tzfields(:)%cstdname  = ''
-tzfields(:)%clongname = ytitle(1 : jproc)
-tzfields(:)%cunits    = yunit(1 : jproc)
-tzfields(:)%ccomment  = ycomment(1 : jproc)
+tzfields(:)%clongname = ctitle(1 : jproc)
+tzfields(:)%cunits    = cunit(1 : jproc)
+tzfields(:)%ccomment  = ccomment(1 : jproc)
 tzfields(:)%ngrid     = 0
 tzfields(:)%ntype     = TYPEREAL
 tzfields(:)%ndims     = 2
@@ -770,12 +650,12 @@ tzbudiachro%clevels  (NLVL_SUBCATEGORY) = ''
 tzbudiachro%ccomments(NLVL_SUBCATEGORY) = ''
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
-tzbudiachro%clevels  (NLVL_GROUP)       = ygroup
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Values at position of station ' // Trim( ygroup )
+tzbudiachro%clevels  (NLVL_GROUP)       = tpstation%cname
+tzbudiachro%ccomments(NLVL_GROUP)       = 'Values at position of station ' // Trim( tpstation%cname )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .false.
 tzbudiachro%clevels  (NLVL_SHAPE)       = 'Point'
-tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of station ' // Trim( ygroup )
+tzbudiachro%ccomments(NLVL_SHAPE)       = 'Values at position of station ' // Trim( tpstation%cname )
 
 tzbudiachro%lleveluse(NLVL_TIMEAVG)     = .false.
 tzbudiachro%clevels  (NLVL_TIMEAVG)     = 'Not_time_averaged'
@@ -807,18 +687,45 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = 1
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstation%tpdates, zw6 )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstations_time%tpdates, xwork6(:,:,:,:,:,:jproc) )
 
 deallocate( tzfields )
 
-DEALLOCATE (ZW6)
-DEALLOCATE (YCOMMENT)
-DEALLOCATE (YTITLE  )
-DEALLOCATE (YUNIT   )
-DEALLOCATE (IGRID   )
+!Necessary because global variables (private inside module)
+Deallocate( xwork6  )
+Deallocate (ccomment)
+Deallocate (ctitle  )
+Deallocate (cunit   )
+
 !----------------------------------------------------------------------------
+
+contains
+
+! ######################################################
+subroutine Add_point( htitle, hcomment, hunits, pfield )
+! ######################################################
+
+use mode_msg
+
+character(len=*),   intent(in) :: htitle
+character(len=*),   intent(in) :: hcomment
+character(len=*),   intent(in) :: hunits
+real, dimension(:), intent(in) :: pfield
+
+integer :: jk
+
+jproc = jproc + 1
+
+if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' )
+
+ctitle(jproc)   = Trim( htitle)
+ccomment(jproc) = Trim( hcomment )
+cunit(jproc)    = Trim( hunits )
+
+xwork6(1, 1, 1, :, 1, jproc) = pfield(:)
+
+end subroutine Add_point
+
 END SUBROUTINE STATION_DIACHRO_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-END SUBROUTINE WRITE_STATION_n
+
+END MODULE MODE_WRITE_STATION_n
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 58e08d8dc9a0d7189d1b0a6b53f3b0b5ae157b48..ca3d3d1244620687fdcbc69d5c32d8c458aac39f 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1997-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.
@@ -11,7 +11,7 @@ CONTAINS
 
 SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
 !
-use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPELOG
+use modd_field, only: tfieldmetadata, tfieldlist
 
 use mode_field, only: Find_field_id_from_mnhname
 USE MODE_MSG
@@ -23,7 +23,7 @@ INTEGER,                INTENT(IN)  :: KGRID    ! Localization on the model grid
 INTEGER,                INTENT(IN)  :: KTYPE    ! Datatype
 INTEGER,                INTENT(IN)  :: KDIMS    ! Number of dimensions
 CHARACTER(LEN=*),       INTENT(IN)  :: HSUBR    ! name of the subroutine calling
-TYPE(TFIELDDATA),       INTENT(OUT) :: TPFIELD  ! metadata of field
+TYPE(TFIELDMETADATA),   INTENT(OUT) :: TPFIELD  ! metadata of field
 !
 CHARACTER(LEN=32) :: YTXT
 INTEGER           :: IDX,IID, IRESP
@@ -31,7 +31,7 @@ LOGICAL           :: GWARN
 !
 CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.)
 IF (IRESP==0) THEN
-  TPFIELD = TFIELDLIST(IID)
+  TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   !Modify and check CLONGNAME
   IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC)) THEN
     CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CLONGNAME different ('//TRIM(TPFIELD%CLONGNAME) &
@@ -99,23 +99,23 @@ IF (IRESP==0) THEN
   END IF
 ELSE
   CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata')
-  TPFIELD%CMNHNAME   = TRIM(HREC)
-  TPFIELD%CSTDNAME   = ''
-  TPFIELD%CLONGNAME  = TRIM(HREC)
-  TPFIELD%CUNITS     = ''
-  TPFIELD%CDIR       = HDIR
-  TPFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TPFIELD%NGRID      = KGRID
-  TPFIELD%NTYPE      = KTYPE
-  TPFIELD%NDIMS      = KDIMS
+  TPFIELD = TFIELDMETADATA(      &
+    CMNHNAME   = TRIM(HREC),     &
+    CSTDNAME   = '',             &
+    CLONGNAME  = TRIM(HREC),     &
+    CUNITS     = '',             &
+    CDIR       = HDIR,           &
+    CCOMMENT   = TRIM(HCOMMENT), &
+    NGRID      = KGRID,          &
+    NTYPE      = KTYPE,          &
+    NDIMS      = KDIMS,          &
+    LTIMEDEP   = .FALSE.         )
 #if 0
   IF (TPFIELD%NDIMS==0 .OR. TPFIELD%NTYPE==TYPECHAR .OR. TPFIELD%NTYPE==TYPEDATE .OR. TPFIELD%NTYPE==TYPELOG) THEN
     TPFIELD%LTIMEDEP   = .FALSE.
   ELSE
     TPFIELD%LTIMEDEP   = .TRUE.
   END IF
-#else
-  TPFIELD%LTIMEDEP   = .FALSE.
 #endif
 END IF
 !
@@ -175,7 +175,7 @@ END MODULE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF,           ONLY: CPROGRAM
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata,TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_GRID
 USE MODD_IO,             ONLY: TFILE_SURFEX
 
@@ -194,9 +194,9 @@ CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-CHARACTER(LEN=5) :: YMSG
-INTEGER          :: IID, IRESP
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+INTEGER              :: IID, IRESP
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -285,8 +285,8 @@ END SUBROUTINE WRITE_SURFX0_MNH
 !             ------------
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
-use modd_field,         only: tfielddata, tfieldlist, TYPEREAL
-USE MODD_GRID_n,        ONLY: XXHAT, XYHAT
+use modd_field,         only: tfieldmetadata, tfieldlist, TYPEREAL
+USE MODD_GRID_n,        ONLY: XXHAT, XXHATM, XYHAT, XYHATM
 USE MODD_IO,            ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,   ONLY :NMASK, CMASK,                          &
                               NIU, NJU, NIB, NJB, NIE, NJE,          &
@@ -297,6 +297,7 @@ USE MODD_PARAMETERS,    ONLY: XUNDEF, JPHEXT
 use mode_field,          only: Find_field_id_from_mnhname
 use MODE_IO_FIELD_WRITE, only: IO_Field_write
 USE MODE_MSG
+USE MODE_SET_GRID,       only: INTERP_HORGRID_1DIR_TO_MASSPOINTS
 USE MODE_TOOLS_ll
 USE MODE_WRITE_SURF_MNH_TOOLS
 
@@ -334,8 +335,8 @@ INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fie
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
 REAL              :: ZUNDEF                       ! undefined value in SURFEX
 !
-CHARACTER(LEN=5) :: YMSG
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -437,7 +438,7 @@ IF (      (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
 !
   IF (HDIR=='A') THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CDIR  = '--'
     CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)
   END IF
@@ -447,7 +448,11 @@ IF (      (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
     IF (.NOT. (ASSOCIATED(XXHAT))) THEN
       !Store XXHAT if not yet done (necessary for PREP_PGD program when writing netCDF files)
       ALLOCATE(XXHAT(IIU-2*NHALO))
+      ALLOCATE(XXHATM(IIU-2*NHALO))
       XXHAT(:) = ZW1D(1+NHALO:IIU-NHALO)
+
+      ! Interpolations of positions to mass points
+      CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', XXHAT, XXHATM )
     END IF
   END IF
   DEALLOCATE(ZW1D)
@@ -468,7 +473,7 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
   END IF
   IF (HDIR=='A') THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
-    TZFIELD = TFIELDLIST(IID)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CDIR  = '--'
     CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)
   END IF
@@ -478,7 +483,11 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
     IF (.NOT. (ASSOCIATED(XYHAT))) THEN
       !Store XYHAT if not yet done (necessary for PREP_PGD program when writing netCDF files)
       ALLOCATE(XYHAT(IJU-2*NHALO))
+      ALLOCATE(XYHATM(IJU-2*NHALO))
       XYHAT(:) = ZW1D(1+NHALO:IJU-NHALO)
+
+      ! Interpolations of positions to mass points
+      CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', XYHAT, XYHATM )
     END IF
   END IF
   DEALLOCATE(ZW1D)
@@ -549,7 +558,7 @@ END SUBROUTINE WRITE_SURFX1_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPELOG, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPELOG, TYPEREAL
 USE MODD_DATA_COVER_PAR, ONLY: JPCOVER
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NMASK, CMASK,                          &
@@ -603,8 +612,8 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
 !JUANZ
 LOGICAL           :: GCOVER_PACKED   ! .T. if cover fields are all packed together
 !
-CHARACTER(LEN=5)  :: YMSG
-TYPE(TFIELDDATA)  :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2COV_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -641,16 +650,17 @@ END IF
 !GCOVER_PACKED = ( NB_PROCIO_W /= 1 )
 GCOVER_PACKED = .FALSE.
 !
-TZFIELD%CMNHNAME   = 'COVER_PACKED'
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = 'COVER_PACKED'
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = ''
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPELOG
-TZFIELD%NDIMS      = 0
-TZFIELD%LTIMEDEP   = .FALSE.
+TZFIELD = TFIELDMETADATA(      &
+  CMNHNAME   = 'COVER_PACKED', &
+  CSTDNAME   = '',             &
+  CLONGNAME  = 'COVER_PACKED', &
+  CUNITS     = '',             &
+  CDIR       = '--',           &
+  CCOMMENT   = '',             &
+  NGRID      = 0,              &
+  NTYPE      = TYPELOG,        &
+  NDIMS      = 0,              &
+  LTIMEDEP   = .FALSE.         )
 CALL IO_Field_write(TFILE_SURFEX,TZFIELD,GCOVER_PACKED,KRESP)
 !
 IF (KRESP /=0) THEN
@@ -671,17 +681,19 @@ END DO
 !
 IF (.NOT. GCOVER_PACKED) THEN
   ICOVER=0
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'generic for COVER variables', & !Temporary name to ease identification
+    CSTDNAME   = '',                            &
+    CUNITS     = '',                            &
+    CDIR       = YDIR,                          &
+    NGRID      = 4,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 2,                             &
+    LTIMEDEP   = .FALSE.                        )
   DO JL2=1,SIZE(OFLAG)
     WRITE(YREC,'(A5,I3.3)') 'COVER',JL2
     TZFIELD%CMNHNAME   = TRIM(YREC)
     TZFIELD%CLONGNAME  = TRIM(YREC)
-    TZFIELD%CDIR       = YDIR
     TZFIELD%CCOMMENT   = 'X_Y_'//TRIM(YREC)
     IF (OFLAG(JL2)) THEN
       ICOVER=ICOVER+1
@@ -751,7 +763,7 @@ END SUBROUTINE WRITE_SURFX2COV_MNH
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
 USE MODD_DATA_COVER_PAR, ONLY: JPCOVER
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NMASK, CMASK,                          &
                                NIU, NJU, NIB, NJB, NIE, NJE,          &
@@ -794,8 +806,8 @@ INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fie
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
 REAL              :: ZUNDEF                       ! undefined value in SURFEX
 !
-CHARACTER(LEN=5)  :: YMSG
-TYPE(TFIELDDATA)  :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -901,7 +913,7 @@ END SUBROUTINE WRITE_SURFX2_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPEINT
+use modd_field,          only: tfieldmetadata, TYPEINT
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NIU_ALL, NJU_ALL
 USE MODD_PARAMETERS,     ONLY: JPHEXT
@@ -921,9 +933,9 @@ CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER          :: IFIELD
-TYPE(TFIELDDATA) :: TZFIELD
-CHARACTER(LEN=5) :: YMSG
+INTEGER              :: IFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -995,7 +1007,7 @@ END SUBROUTINE WRITE_SURFN0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,          only: tfielddata, TYPEINT
+use modd_field,          only: tfieldmetadata, TYPEINT
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NMASK, CMASK, &
                                NIU, NJU, NIB, NJB, NIE, NJE
@@ -1025,8 +1037,8 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array written in the file
 !
-CHARACTER(LEN=5) :: YMSG
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -1099,7 +1111,7 @@ END SUBROUTINE WRITE_SURFN1_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPECHAR, TYPELOG
+use modd_field,          only: tfieldmetadata, TYPECHAR, TYPELOG
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NIU_ALL, NJU_ALL
 
@@ -1118,9 +1130,9 @@ CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-LOGICAL          :: GCARTESIAN
-TYPE(TFIELDDATA) :: TZFIELD
-CHARACTER(LEN=5) :: YMSG
+LOGICAL              :: GCARTESIAN
+TYPE(TFIELDMETADATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFC0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -1195,7 +1207,7 @@ END SUBROUTINE WRITE_SURFC0_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPEINT, TYPELOG
+use modd_field,          only: tfieldmetadata, TYPEINT, TYPELOG
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: NMASK, CMASK, &
                                NIU, NJU, NIB, NJB, NIE, NJE
@@ -1225,8 +1237,8 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK  ! work array written in the file
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array written in the file
 !
-CHARACTER(LEN=5) :: YMSG
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -1310,7 +1322,7 @@ END SUBROUTINE WRITE_SURFL1_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPELOG
+use modd_field,          only: tfieldmetadata, TYPELOG
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,    ONLY: CMASK
 
@@ -1329,8 +1341,8 @@ CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-CHARACTER(LEN=5) :: YMSG
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)     :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
 !
@@ -1393,7 +1405,7 @@ END SUBROUTINE WRITE_SURFL0_MNH
 !             ------------
 !
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
-use modd_field,          only: tfielddata, TYPEDATE
+use modd_field,          only: tfieldmetadata, TYPEDATE
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_TYPE_DATE
 
@@ -1417,11 +1429,11 @@ CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
 !*      0.2   Declarations of local variables
 !
 !
-CHARACTER(LEN=LEN_HREC)      :: YRECFM    ! Name of the article to be written
-INTEGER, DIMENSION(3)  :: ITDATE
-CHARACTER(LEN=5) :: YMSG
-TYPE (DATE_TIME) :: TZDATA
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=LEN_HREC) :: YRECFM    ! Name of the article to be written
+INTEGER, DIMENSION(3)   :: ITDATE
+CHARACTER(LEN=5)        :: YMSG
+TYPE (DATE_TIME)        :: TZDATA
+TYPE(TFIELDMETADATA)    :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -1487,7 +1499,7 @@ END SUBROUTINE WRITE_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,          only: tfielddata, TYPEINT, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEINT, TYPEREAL
 USE MODD_IO,             ONLY: TFILE_SURFEX
 USE MODD_CONF_n,         ONLY: CSTORAGE_TYPE
 
@@ -1511,9 +1523,9 @@ CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
 !*      0.2   Declarations of local variables
 !
 !
-INTEGER, DIMENSION(3,KL1)  :: ITDATE
-CHARACTER(LEN=5) :: YMSG
-TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5)          :: YMSG
+INTEGER, DIMENSION(3,KL1) :: ITDATE
+TYPE(TFIELDMETADATA)      :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
@@ -1527,16 +1539,17 @@ ELSE
   ITDATE(2,:) = KMONTH (:)
   ITDATE(3,:) = KDAY   (:)
   !
-  TZFIELD%CMNHNAME   = TRIM(HREC)//'%TDATE'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = TRIM(HREC)//'%TDATE', &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = TRIM(HREC)//'%TDATE', &
+    CUNITS     = '',                   &
+    CDIR       = '--',                 &
+    CCOMMENT   = TRIM(HCOMMENT),       &
+    NGRID      = 0,                    &
+    NTYPE      = TYPEINT,              &
+    NDIMS      = 2,                    &
+    LTIMEDEP   = .FALSE.               )
   !
   CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ITDATE(:,:),KRESP)
   !
@@ -1545,16 +1558,17 @@ ELSE
     CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
   END IF
   !
-  TZFIELD%CMNHNAME   = TRIM(HREC)//'%xtime'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = TRIM(HREC)//'%xtime', &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = TRIM(HREC)//'%xtime', &
+    CUNITS     = '',                   &
+    CDIR       = '--',                 &
+    CCOMMENT   = TRIM(HCOMMENT),       &
+    NGRID      = 0,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 1,                    &
+    LTIMEDEP   = .FALSE.               )
   !
   CALL IO_Field_write(TFILE_SURFEX,TZFIELD,PTIME(:),KRESP)
 !
diff --git a/src/MNH/write_ts1d.f90 b/src/MNH/write_ts1d.f90
index 440d7303ff4f9f56889afa15d364373aa129129c..4ffad8b5fe05581fc7a394cc4beefbd94708a242 100644
--- a/src/MNH/write_ts1d.f90
+++ b/src/MNH/write_ts1d.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-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.
@@ -375,7 +375,7 @@ DO JN=1,NBPROF
     DO JL = 1, NSV
       IF (JL>=NSV_CHEMBEG .AND. JL<=NSV_CHEMEND) THEN
         DO JK = NKMAX + JPVEXT , JPVEXT + 1, -1
-        ! convert ppp to ppt
+        ! convert ppv to ppt
           CALL WRITECLIP ( XSVT(IINDEX,JINDEX,JK,JL) * 1E12 )
         ENDDO
       ELSE
diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90
index f8782a519e3cbe897bd676f5b72d5334b5559ee6..4537388a16dd24a541a507d24512bbaca8c2c4b6 100644
--- a/src/MNH/xy_to_latlon.f90
+++ b/src/MNH/xy_to_latlon.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1996-2021 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.
@@ -131,7 +131,7 @@ CALL IO_Init()
 !
 CALL INI_CST()
 !
-CALL INI_FIELD_LIST(1)
+CALL INI_FIELD_LIST()
 !
 !*    2.     Reading of namelist file
 !            ------------------------
diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90
index b7c97c10a8e1faffcd9225f65eb62b282cc8273e..3aea708e68726cdae989f5b7320123247ef02daa 100644
--- a/src/MNH/zsmt_pgd.f90
+++ b/src/MNH/zsmt_pgd.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2005-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2005-2021 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.
@@ -67,7 +67,7 @@ END MODULE MODI_ZSMT_PGD
 !
 !*       0.    DECLARATIONS
 !
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,         ONLY : TFILEDATA
 USE MODD_PARAMETERS, ONLY : JPHEXT, XUNDEF
 !
@@ -122,7 +122,7 @@ INTEGER                          :: INFO_ll                ! error return code
 INTEGER :: IIB,IIE,IJB,IJE
 REAL, DIMENSION(:), ALLOCATABLE  :: ZXHAT
 REAL, DIMENSION(:), ALLOCATABLE  :: ZYHAT
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.    Read orography in the file
@@ -333,41 +333,44 @@ IF(OHSLOP) THEN
    END DO
  END DO
  !
- ! Writes filtred orography and slopes along i and j
- TZFIELD%CMNHNAME   = 'ZSLOPEX'
- TZFIELD%CSTDNAME   = ''
- TZFIELD%CLONGNAME  = 'ZSLOPEX'
- TZFIELD%CUNITS     = ''
- TZFIELD%CDIR       = 'XY'
- TZFIELD%CCOMMENT   = 'orography slope along x'
- TZFIELD%NGRID      = 4
- TZFIELD%NTYPE      = TYPEREAL
- TZFIELD%NDIMS      = 2
- TZFIELD%LTIMEDEP   = .FALSE.
+  ! Writes filtred orography and slopes along i and j
+  TZFIELD = TFIELDMETADATA(                 &
+    CMNHNAME   = 'ZSLOPEX',                 &
+    CSTDNAME   = '',                        &
+    CLONGNAME  = 'ZSLOPEX',                 &
+    CUNITS     = '',                        &
+    CDIR       = 'XY',                      &
+    CCOMMENT   = 'orography slope along x', &
+    NGRID      = 4,                         &
+    NTYPE      = TYPEREAL,                  &
+    NDIMS      = 2,                         &
+    LTIMEDEP   = .FALSE.                    )
  CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEX)
  !
- TZFIELD%CMNHNAME   = 'ZSLOPEY'
- TZFIELD%CSTDNAME   = ''
- TZFIELD%CLONGNAME  = 'ZSLOPEY'
- TZFIELD%CUNITS     = ''
- TZFIELD%CDIR       = 'XY'
- TZFIELD%CCOMMENT   = 'orography slope along y'
- TZFIELD%NGRID      = 4
- TZFIELD%NTYPE      = TYPEREAL
- TZFIELD%NDIMS      = 2
- TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(                 &
+    CMNHNAME   = 'ZSLOPEY',                 &
+    CSTDNAME   = '',                        &
+    CLONGNAME  = 'ZSLOPEY',                 &
+    CUNITS     = '',                        &
+    CDIR       = 'XY',                      &
+    CCOMMENT   = 'orography slope along y', &
+    NGRID      = 4,                         &
+    NTYPE      = TYPEREAL,                  &
+    NDIMS      = 2,                         &
+    LTIMEDEP   = .FALSE.                    )
  CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEY)
  !
- TZFIELD%CMNHNAME   = 'ZS_FILTR'
- TZFIELD%CSTDNAME   = ''
- TZFIELD%CLONGNAME  = 'ZS_FILTR'
- TZFIELD%CUNITS     = 'm'
- TZFIELD%CDIR       = 'XY'
- TZFIELD%CCOMMENT   = 'filtred orography'
- TZFIELD%NGRID      = 4
- TZFIELD%NTYPE      = TYPEREAL
- TZFIELD%NDIMS      = 2
- TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'ZS_FILTR',          &
+    CSTDNAME   = '',                  &
+    CLONGNAME  = 'ZS_FILTR',          &
+    CUNITS     = 'm',                 &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'filtred orography', &
+    NGRID      = 4,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 2,                   &
+    LTIMEDEP   = .FALSE.              )
  CALL IO_Field_write(TPFILE,TZFIELD,ZSMOOTH_ZSINI-ZFINE_ZS)
 END IF
 !-------------------------------------------------------------------------------
diff --git a/src/Makefile b/src/Makefile
index 29752361f40dec77111d5e7c66db036a0f1a873f..2539d55dd293aaa515e01fe6d73e091ceb8aa384 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -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.
@@ -342,7 +342,7 @@ NETCDF_OPT ?= ${OPT_BASE_I4:-$OPT_BASE}
 #
 cdf : $(CDF_MOD)
 $(CDF_MOD) :
-	cd ${DIR_LIBAEC} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 CC="$(CC)" CFLAGS="$(HDF_OPT)" && \
+	cd ${DIR_LIBAEC} && autoreconf -i && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 CC="$(CC)" CFLAGS="$(HDF_OPT)" && \
 	$(MAKE) && $(MAKE) install && $(MAKE) clean
 	cd ${DIR_HDF} && ./configure --enable-fortran --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --with-szlib=${CDF_PATH}/include,${CDF_PATH}/lib64 \
 	CC="$(CC)" CFLAGS="$(HDF_OPT)" FC="$(FC)" FCFLAGS="$(NETCDF_OPT)" LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lsz -laec -lz -ldl " && \
diff --git a/src/PHYEX/aux/modd_budget.f90 b/src/PHYEX/aux/modd_budget.f90
index 1f052f57816156c74cb71cd7363b82aa3bb1114c..0270f474a0e5b53d71ccc86620c9c9bcafefd866 100644
--- a/src/PHYEX/aux/modd_budget.f90
+++ b/src/PHYEX/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/PHYEX/aux/modd_cst.f90 b/src/PHYEX/aux/modd_cst.f90
index 544c754648621b3c66d725c261c57bedf412b244..cb0aed25e632bec67853d370ac79198d944051e4 100644
--- a/src/PHYEX/aux/modd_cst.f90
+++ b/src/PHYEX/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/PHYEX/aux/mode_io_field_write.f90 b/src/PHYEX/aux/mode_io_field_write.f90
index a4a6a28c0f76c12701db46b997a5cf1cc96fbb80..e513093ca60097b15caa167b738b12576ebc5a8e 100644
--- a/src/PHYEX/aux/mode_io_field_write.f90
+++ b/src/PHYEX/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/PHYEX/micro/c2r2_adjust.f90 b/src/PHYEX/micro/c2r2_adjust.f90
index b97914d1af619016ef85478e6aa2c275eb31421c..c5e9d27bcd264a39895284056bb1fdaa9c22b715 100644
--- a/src/PHYEX/micro/c2r2_adjust.f90
+++ b/src/PHYEX/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/PHYEX/micro/lima_adjust.f90 b/src/PHYEX/micro/lima_adjust.f90
index 189fe45146155c66740f559f4db5c9e2bd006a29..54b749e8be0e1166ef23eda588f09ffb95cc164b 100644
--- a/src/PHYEX/micro/lima_adjust.f90
+++ b/src/PHYEX/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/PHYEX/micro/lima_adjust_split.f90 b/src/PHYEX/micro/lima_adjust_split.f90
index 9482c616c1ab714ffb485cf24867d399e5f362b2..724b835b9729e2f9a6ac930affaa28ced1ad815c 100644
--- a/src/PHYEX/micro/lima_adjust_split.f90
+++ b/src/PHYEX/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/PHYEX/micro/lima_ccn_activation.f90 b/src/PHYEX/micro/lima_ccn_activation.f90
index fa0a276ebcc591f7dc6dbdbdaf505f044d97c6ba..bac576fa00f953074ced8034ceeb6e1271f3aadb 100644
--- a/src/PHYEX/micro/lima_ccn_activation.f90
+++ b/src/PHYEX/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/PHYEX/micro/lima_notadjust.f90 b/src/PHYEX/micro/lima_notadjust.f90
index 42a0b33d59f64b1be5a978b25edc8970fd9b4331..ddd221297382b329637fea4589002845dcf4a696 100644
--- a/src/PHYEX/micro/lima_notadjust.f90
+++ b/src/PHYEX/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/PHYEX/micro/lima_warm_nucl.f90 b/src/PHYEX/micro/lima_warm_nucl.f90
index cf5382b50799966e699e28adabb1054c237fddb6..8591b848e0ade496014c0816624fb589b36b7804 100644
--- a/src/PHYEX/micro/lima_warm_nucl.f90
+++ b/src/PHYEX/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/PHYEX/micro/rain_c2r2_khko.f90 b/src/PHYEX/micro/rain_c2r2_khko.f90
index 5708c0d4c4742afee013137bff42bc0fc1d51c48..cc19dbbf0cc7dc6aa5a287f8dec73f6ba3b46952 100644
--- a/src/PHYEX/micro/rain_c2r2_khko.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_ibm_mixinglength.f90 b/src/PHYEX/turb/mode_ibm_mixinglength.f90
index 7f74c571a60118414f48f509d1f3b7f95e3d5e26..bc584c94082a6a3b64adb527556d6373f11e944b 100644
--- a/src/PHYEX/turb/mode_ibm_mixinglength.f90
+++ b/src/PHYEX/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
   !
diff --git a/src/PHYEX/turb/mode_prandtl.f90 b/src/PHYEX/turb/mode_prandtl.f90
index 120b784a5e170829bae52f188ff7f2b49a1501ce..9a0d77c6dd45218aecc31b142635e444bbb1d2c4 100644
--- a/src/PHYEX/turb/mode_prandtl.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_tke_eps_sources.f90 b/src/PHYEX/turb/mode_tke_eps_sources.f90
index 516d4e6896a51f3b007965a5f8cae6dae742175b..f7f6a5082ae0c68b332cc8b4fed22347fbd2bfd1 100644
--- a/src/PHYEX/turb/mode_tke_eps_sources.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_dyn_corr.f90 b/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90
index 6bfd6f98ef8d968586fcd46d5bea23844f4855f1..32270e64e5176722c2eaf993ef9376614878d4e9 100644
--- a/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_sv_flux.f90 b/src/PHYEX/turb/mode_turb_hor_sv_flux.f90
index ae50bb870a833b4b7553d7eb95c33ba992679fcd..db1b033eb0a08f2670ba8cc52706c4b97b8bf8f1 100644
--- a/src/PHYEX/turb/mode_turb_hor_sv_flux.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90
index 6c00603eac98ae37d90ce1b495ed6df6a695eaf3..268f923931607513832a9af54690e02638893bde 100644
--- a/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90
index 93313669a3ffc01ca0ddf57ed8b0a999e541259f..0654ed9918e6e044ccc1c1ee87988a1e6d9e674c 100644
--- a/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_uv.f90 b/src/PHYEX/turb/mode_turb_hor_uv.f90
index cd9a3f32a3147c77477cbd5c035ad92d62a56d75..717ef59073695384a958d49e2c3a1ff00090ec2b 100644
--- a/src/PHYEX/turb/mode_turb_hor_uv.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_uw.f90 b/src/PHYEX/turb/mode_turb_hor_uw.f90
index b13acfaa287d3038bec942634f4c1b85dcde385a..1885d3d9eda92940af4df9714b87cb8cf6db225a 100644
--- a/src/PHYEX/turb/mode_turb_hor_uw.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_hor_vw.f90 b/src/PHYEX/turb/mode_turb_hor_vw.f90
index 196734ea63a19cd4b31ef7e735e9fc2a50c89104..2fe089f60f8dc098787ad3c5dea9dd9b858fa9d2 100644
--- a/src/PHYEX/turb/mode_turb_hor_vw.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_ver.f90 b/src/PHYEX/turb/mode_turb_ver.f90
index ddc28851ffc77d70ccf07113d61a243b2297a583..9cc0ef405d29fc3304612ef0d308c516265045ef 100644
--- a/src/PHYEX/turb/mode_turb_ver.f90
+++ b/src/PHYEX/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
@@ -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
@@ -386,8 +387,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
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
@@ -613,42 +614,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/PHYEX/turb/mode_turb_ver_dyn_flux.f90 b/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90
index f68fc2d2377fd6263dac088a2fc9570162bf782f..17f8d55009e8e4a0c251bc3f79d9b715a4ebcf6c 100644
--- a/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_ver_sv_flux.f90 b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
index 99e56fa5845abff67b6ed71aecbd6f12492654b6..dc1ad272ad4b53b52f7f50c015527e05db19662c 100644
--- a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
@@ -1,7 +1,8 @@
-!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
@@ -201,35 +202,36 @@ 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_AIRCRAFT_BALLOON, ONLY: LFLYER
+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_NSV,              ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND
+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
@@ -302,13 +304,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 +432,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 ( LFLYER ) 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/PHYEX/turb/mode_turb_ver_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90
index 6d71d9196a2fb302dd634267dfcd024065342357..56c4e01d7c54ac8f2e02d8f7a272f356846a767a 100644
--- a/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90
+++ b/src/PHYEX/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/PHYEX/turb/mode_turb_ver_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
index 97366b22aef729e9d8007ddaf0108e881367d009..6e1935f3e560aeead72b1474e76b743e8e9d1694 100644
--- a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
@@ -1,7 +1,8 @@
-!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
@@ -222,34 +223,33 @@ 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_AIRCRAFT_BALLOON, ONLY: LFLYER
+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 +263,35 @@ 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)   ::  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 ( LFLYER ) 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 ( LFLYER ) 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/PHYEX/turb/shallow_mf.f90 b/src/PHYEX/turb/shallow_mf.f90
index ec3a76764d15e02c60fa00531c59a39a99fb6bad..898883076890bc04c938b2339d1c956b653fff5c 100644
--- a/src/PHYEX/turb/shallow_mf.f90
+++ b/src/PHYEX/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/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90
index e0713fcd3a642d3f4888df1f9548d6769958e08a..dd5029524d292cc0350d5121c4a5c42984aef2d2 100644
--- a/src/PHYEX/turb/turb.f90
+++ b/src/PHYEX/turb/turb.f90
@@ -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
 !
@@ -500,7 +499,7 @@ REAL                :: ZALPHA       ! work coefficient :
 !                                   !   BL89 mixing length near the surface
 !
 REAL :: ZTIME1, ZTIME2
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !*      1.PRELIMINARIES
 !         -------------
@@ -641,28 +640,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
 !
@@ -1239,46 +1240,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 +1977,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 +2012,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/SURFEX/build_emisstabn.F90 b/src/SURFEX/build_emisstabn.F90
index 48b4dc5b2e46c4bb736f171a7542a52e3c517c6a..5a8ecc2a0d7992b508c58f8d6a6c34edec795240 100644
--- a/src/SURFEX/build_emisstabn.F90
+++ b/src/SURFEX/build_emisstabn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -110,13 +110,13 @@ ALLOCATE (PCONVERSION(SIZE(PRHODREF,1)))
 ! determine the conversion factor
   PCONVERSION(:) = 1.
 SELECT CASE (YUNIT)
-CASE ('MIX') ! flux given ppp*m/s,  conversion to molec/m2/s
-! where 1 molecule/cm2/s = (224.14/6.022136E23) ppp*m/s
+CASE ('MIX') ! flux given ppv*m/s,  conversion to molec/m2/s
+! where 1 molecule/cm2/s = (224.14/6.022136E23) ppv*m/s
   PCONVERSION(:) = XAVOGADRO * PRHODREF(:) / XMD
 CASE ('CON') ! flux given in molecules/cm2/s, conversion to molec/m2/s 
   PCONVERSION(:) =  1E4
 CASE ('MOL') ! flux given in microMol/m2/day, conversion to molec/m2/s  
-! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppp*m/s
+! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppv*m/s
   !XCONVERSION(:) = (22.414/86.400)*1E-12 * XAVOGADRO * PRHODREF(:) / XMD
   PCONVERSION(:) = 1E-6 * XAVOGADRO / 86400.
 
diff --git a/src/SURFEX/ch_aer_emission.F90 b/src/SURFEX/ch_aer_emission.F90
index 3aba32d7f500bb6e5fa41848dc9aeab6e61ea643..eb3ad3af3bada4e17ab3dd090f7352d798c9c821 100644
--- a/src/SURFEX/ch_aer_emission.F90
+++ b/src/SURFEX/ch_aer_emission.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -249,7 +249,7 @@ ZFM(:,3) = ZFM(:,1) * (ZEMISRADIUSI**6) *EXP(18 *(LOG(XEMISSIGI))**2)
 !
 ZFM(:,6) = ZFM(:,4) * (ZEMISRADIUSJ**6) *EXP(18 *(LOG(XEMISSIGJ))**2)
 !
-!*       1.4    conversion en ppp.m.s-1
+!*       1.4    conversion en ppv.m.s-1
 !
 ! conversion in atmospheric unit only for moments 0 and 6 
 PFLUX(:,I_CH_M0i) = ZFM(:,1) * 1E-6 / (ZDEN2MOL * PRHODREF(:))
@@ -275,7 +275,7 @@ PFLUX(:,I_CH_BCj) = PFLUX(:,I_CH_BCj) * ZCONVERSION(:) / (ZMI(JP_AER_BC)*1E-3)
 PFLUX(:,I_CH_DSTi) = PFLUX(:,I_CH_DSTi) * ZCONVERSION(:) / (ZMI(JP_AER_DST)*1E-3)
 PFLUX(:,I_CH_DSTj) = PFLUX(:,I_CH_DSTj) * ZCONVERSION(:) / (ZMI(JP_AER_DST)*1E-3)
 !
-! conversion M0 and M6  ppp.m.s-1 into  molecules.m-2.s-1
+! conversion M0 and M6  ppv.m.s-1 into  molecules.m-2.s-1
 PFLUX(:,I_CH_M0i) = PFLUX(:,I_CH_M0i) * ZCONVERSION(:)
 PFLUX(:,I_CH_M0j) = PFLUX(:,I_CH_M0j) * ZCONVERSION(:)
 !
diff --git a/src/SURFEX/ch_bvocemn.F90 b/src/SURFEX/ch_bvocemn.F90
index 0b3504e362d4855d14cc85bbd7b25260d8703b46..ac823459dca56febcf85dd91076c861cecb1587c 100644
--- a/src/SURFEX/ch_bvocemn.F90
+++ b/src/SURFEX/ch_bvocemn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -190,7 +190,7 @@ ENDIF
 !3.Summation of different contribution for fluxes 
 !------------------------------------------------
 !
-!isoprene in ppp.m.s-1
+!isoprene in ppv.m.s-1
 GB%XFISO (:)=(3.0012E-10/3600.) * ( ZFISO_FOR (:) + ZFISO_GRASS(:) + ZFISO_CROP(:) ) + 1E-17
 !monoterpenes
 GB%XFMONO(:)=(1.5006E-10/3600.) * ( ZFMONO_FOR(:) + ZFMONO_GRASS(:)+ ZFMONO_CROP(:) ) + 1E-17
diff --git a/src/SURFEX/ch_conversion_factor.F90 b/src/SURFEX/ch_conversion_factor.F90
index 31cdb9b3729a95ea5935a27b81a48459f81da491..89d59dea0c33db390ac70e692b429714f226d6d5 100644
--- a/src/SURFEX/ch_conversion_factor.F90
+++ b/src/SURFEX/ch_conversion_factor.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -57,7 +57,7 @@ IF (LHOOK) CALL DR_HOOK('CH_CONVERSION_FACTOR',0,ZHOOK_HANDLE)
 ! determine the conversion factor
 PCONVERSION(:) = 1.
 SELECT CASE (HCONVERSION)
-  CASE ('MIX') ! flux given ppp*m/s,  conversion to molec/m2/s
+  CASE ('MIX') ! flux given ppv*m/s,  conversion to molec/m2/s
     PCONVERSION(:) = XAVOGADRO * PRHOA(:) / XMD
   CASE ('CON') ! flux given in molecules/cm2/s, conversion to molec/m2/s 
     PCONVERSION(:) =  1E4
diff --git a/src/SURFEX/ch_emission_fluxn.F90 b/src/SURFEX/ch_emission_fluxn.F90
index f9eae54518a9396b0c73cce922894b0fad2493f7..f12a9bae34ddbff5a878fddb134e34f7e9f039ce 100644
--- a/src/SURFEX/ch_emission_fluxn.F90
+++ b/src/SURFEX/ch_emission_fluxn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -80,7 +80,7 @@ TYPE(CH_SURF_t), INTENT(INOUT) :: CHU
 REAL,               INTENT(IN)  :: PSIMTIME    ! time of simulation in sec UTC
                                                ! (counting from midnight of
                                                ! the current day)
-REAL,DIMENSION(:,:),  INTENT(INOUT) :: PSFSV   ! emission flux in ppp*m/s
+REAL,DIMENSION(:,:),  INTENT(INOUT) :: PSFSV   ! emission flux in ppv*m/s
 REAL, DIMENSION(:),   INTENT(IN)    :: PRHOA     ! air density (kg/m3)
 REAL,                 INTENT(IN)    :: PTSTEP    ! atmospheric time-step                 (s)
 INTEGER,              INTENT(IN)    :: KNBTS_MAX !max size of TEMISS%NETIMES
diff --git a/src/SURFEX/modd_gr_biog_gardenn.F90 b/src/SURFEX/modd_gr_biog_gardenn.F90
index 1849ecf631f149accf16225a5a965bef1d7cefbd..55097e16b670746f9360ce0ee21127fcca169ac4 100644
--- a/src/SURFEX/modd_gr_biog_gardenn.F90
+++ b/src/SURFEX/modd_gr_biog_gardenn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -44,8 +44,8 @@ TYPE GR_BIOG_GARDEN_t
 !* Radiation at different level(cf Gauss) in the canopy
   REAL, DIMENSION(:,:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch
 !
-!* XFISO  = isoprene emission flux (ppp.m.s-1)
-!  XFMONO = monoterpenes emission flux (ppp m s-1)
+!* XFISO  = isoprene emission flux (ppv.m.s-1)
+!  XFMONO = monoterpenes emission flux (ppv m s-1)
   REAL, DIMENSION(:), POINTER :: XFISO, XFMONO
 !
 !
diff --git a/src/SURFEX/modd_gr_biog_greenroofn.F90 b/src/SURFEX/modd_gr_biog_greenroofn.F90
index 4f861e10e9044d568beb0d13f9eb7dd19a8232c8..6b87cb20d822fb60ec72d377827adcfd16f48d1d 100644
--- a/src/SURFEX/modd_gr_biog_greenroofn.F90
+++ b/src/SURFEX/modd_gr_biog_greenroofn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -45,8 +45,8 @@ TYPE GR_BIOG_GREENROOF_t
   REAL, DIMENSION(:), POINTER :: XP_IACAN !pack radiation
   REAL, DIMENSION(:,:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch
 !
-!* XFISO  = isoprene emission flux (ppp.m.s-1)
-!  XFMONO = monoterpenes emission flux (ppp m s-1)
+!* XFISO  = isoprene emission flux (ppv.m.s-1)
+!  XFMONO = monoterpenes emission flux (ppv m s-1)
   REAL, DIMENSION(:), POINTER :: XFISO, XFMONO
 !
 !
diff --git a/src/SURFEX/modd_gr_biogn.F90 b/src/SURFEX/modd_gr_biogn.F90
index 9090cc3f7f2b6108d597a5a04b1b00f992ed7dd5..a6c1477d4840f8be83da27b8fdfabc0faeb56c04 100644
--- a/src/SURFEX/modd_gr_biogn.F90
+++ b/src/SURFEX/modd_gr_biogn.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -44,8 +44,8 @@ TYPE GR_BIOG_t
 !* Radiation at different level(cf Gauss) in the canopy
   REAL, DIMENSION(:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch
 !
-!* XFISO  = isoprene emission flux (ppp.m.s-1)
-!  XFMONO = monoterpenes emission flux (ppp m s-1)
+!* XFISO  = isoprene emission flux (ppv.m.s-1)
+!  XFMONO = monoterpenes emission flux (ppv m s-1)
   REAL, DIMENSION(:), POINTER :: XFISO, XFMONO
 !SOILNOX
   REAL, DIMENSION(:), POINTER :: XNOFLUX
diff --git a/src/SURFEX/mode_aer_surf.F90 b/src/SURFEX/mode_aer_surf.F90
index a23ac0cdb8bb8f53f88d4f3148a08d0dead73d78..e70fa26ef78a32266aef76bd2bcf6960f48960a1 100644
--- a/src/SURFEX/mode_aer_surf.F90
+++ b/src/SURFEX/mode_aer_surf.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -7,7 +7,7 @@ MODULE MODE_AER_SURF
 !!   ########################
 !!
 !! MODULE DUST PSD (Particle Size Distribution)
-!! Purpose: Contains subroutines to convert from transported variables (ppp)
+!! Purpose: Contains subroutines to convert from transported variables (ppv)
 !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n}
 !-------------------------------------------------------------------------------
 !!    MODIFICATIONS
@@ -147,7 +147,7 @@ END SUBROUTINE INIT_VAR
 !
 !!   ############################################################
 SUBROUTINE PPP2AERO_SURF(             &
-          PSVT,                       &!I [ppp] input scalar variables (moment of distribution)
+          PSVT,                       &!I [ppv] input scalar variables (moment of distribution)
           PRHODREF,                   &!I [kg/m3] density of air       
           PSIG1D,                     &!O [-] standard deviation of aerosol distribution
           PRG1D,                      &!O [um] number median diameter of aerosol distribution
@@ -160,7 +160,7 @@ SUBROUTINE PPP2AERO_SURF(             &
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !! 
 !!    CALLING STRUCTURE NOTE: OPTIONAL VARIABLES
@@ -353,7 +353,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_AER_SURF:PPP2AERO_SURF',1,ZHOOK_HANDLE)
 END SUBROUTINE PPP2AERO_SURF
 !!   ############################################################
 SUBROUTINE AERO2PPP_SURF(    &
-            PSVT,            &!IO [ppp] input scalar variables (moment of distribution)
+            PSVT,            &!IO [ppv] input scalar variables (moment of distribution)
             PRHODREF,        &!I [kg/m3] density of air       
             PSIG1D,          &!I [-] standard deviation of aerosol distribution
             PRG1D            &!I [um] number median diameter of aerosol distribution
@@ -363,7 +363,7 @@ SUBROUTINE AERO2PPP_SURF(    &
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the aerosol Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppp 
+!!    Translate the aerosol Mass, RG and SIGMA in the  three moments M0, M3 and M6 given in ppv 
 !!
 !!    REFERENCE
 !!    ---------
@@ -440,7 +440,7 @@ ZM(:,4)= ZM(:,5)/ ( (PRG1D(:,2)**3)*EXP(4.5 * LOG(PSIG1D(:,2))**2) )
 ZM(:,3) = ZM(:,1)*(PRG1D(:,1)**6) * EXP(18 *(LOG(PSIG1D(:,1)))**2)  
 ZM(:,6) = ZM(:,4)*(PRG1D(:,2)**6) * EXP(18 *(LOG(PSIG1D(:,2)))**2)  
 !
-!*       6    return to ppp
+!*       6    return to ppv
 !
 PSVT(:,JP_CH_M0i) = ZM(:,1) * 1E-6 
 PSVT(:,JP_CH_M0j) = ZM(:,4) * 1E-6
diff --git a/src/SURFEX/mode_dslt_surf.F90 b/src/SURFEX/mode_dslt_surf.F90
index 408f179f1c2fea06682802fac0b1df65a26c53c1..742a4de2fc6c6e5e2d21e1d66052f1df15156b82 100644
--- a/src/SURFEX/mode_dslt_surf.F90
+++ b/src/SURFEX/mode_dslt_surf.F90
@@ -1,4 +1,4 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
@@ -188,7 +188,7 @@ SUBROUTINE DSLTMOMENT2SIZE(       &
 !!
 !!    PURPOSE
 !!    -------
-!!    Translate the three moments M0, M3 and M6 given in ppp into
+!!    Translate the three moments M0, M3 and M6 given in ppv into
 !!    Values which can be understood more easily (R, sigma, N, M)
 !!    At this point, M3 is in kg/m3, M0 in #/m3*(kg_{dst}/mole), M6 in um6/m3*1.d6*(kg_{dst}/mole)
 !!
@@ -225,7 +225,7 @@ IMPLICIT NONE
 !*      0.1    declarations of arguments
 !
 !INPUT
-REAL,       DIMENSION(:,:),  INTENT(IN)     :: PSVT      !I [ppp] moments in surface units
+REAL,       DIMENSION(:,:),  INTENT(IN)     :: PSVT      !I [ppv] moments in surface units
 REAL,       DIMENSION(:),    INTENT(IN)     :: PRHODREF  !I [kg/m3] density of air
 REAL,       DIMENSION(:),    INTENT(IN)     :: PEMISSIG  
 REAL,       DIMENSION(:),    INTENT(IN)     :: PEMISRADIUS
diff --git a/src/configure b/src/configure
index 534c5abb9260b94cad7daa6b66f06f90207be928..b2bbc76148429ecfecd650f28b698bd619b61455 100755
--- a/src/configure
+++ b/src/configure
@@ -1,5 +1,5 @@
 #!/bin/bash
-#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.
@@ -12,11 +12,11 @@ export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-5}
 export VERSION_BUG=${VERSION_BUG:-1}
 export VERSION_XYZ=${VERSION_XYZ:-${VERSION_MASTER}-${VERSION_BUG}${VER_OASIS:+-${VER_OASIS}}}
 export VERSION_DATE=${VERSION_DATE:-"19/03/2021"}
-export VERSION_LIBAEC=${VERSION_LIBAEC:-"0.3.4"}
-export VERSION_HDF=${VERSION_HDF:-"1.12.0"}
-export VERSION_CDFC=${VERSION_CDFC:-"4.7.4"}
+export VERSION_LIBAEC=${VERSION_LIBAEC:-"v1.0.6"}
+export VERSION_HDF=${VERSION_HDF:-"1.14.0"}
+export VERSION_CDFC=${VERSION_CDFC:-"4.9.0"}
 export VERSION_CDFCXX=${VERSION_CDFCXX:-"4.3.1"}
-export VERSION_CDFF=${VERSION_CDFF:-"4.5.3"}
+export VERSION_CDFF=${VERSION_CDFF:-"4.6.0"}
 export VERSION_GRIBAPI=${VERSION_GRIBAPI:-"1.26.0-Source"}
 export VERSION_ECCODES=${VERSION_ECCODES:-"2.18.0"}
 export ECCODES_DEFINITION_PATH=${ECCODES_DEFINITION_PATH:-${SRC_MESONH}/src/LIB/eccodes-${VERSION_ECCODES}"/definitions/"}