From 0e0491f953386d36fc70edae14a7d2e7bd2e8278 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 24 Sep 2021 13:59:51 +0200
Subject: [PATCH 001/157] Philippe 24/09/2021: add NLONGNAMELGTMAX and
 NUNITLGTMAX parameters + use them

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 14 +++++++-------
 src/MNH/ini_budget.f90               |  8 ++++----
 src/MNH/modd_parameters.f90          | 21 ++++++++++++---------
 3 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index b81b59f1f..9c7f50c90 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.
@@ -15,7 +15,7 @@
 !-----------------------------------------------------------------
 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
@@ -179,11 +179,11 @@ TYPE TFIELDPTR_T1D
 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)
+  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
diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index 3152cb6e5..cff4e82db 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -4148,7 +4148,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
 
@@ -4159,9 +4159,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/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index c21c6e709..f4849d401 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-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.
@@ -39,10 +39,11 @@
 !!      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
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -78,10 +79,12 @@ 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 :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name
 INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI)
-- 
GitLab


From 2e828589e08c35cca36c63ed5cdf4ba1907de215 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 24 Sep 2021 14:25:47 +0200
Subject: [PATCH 002/157] Philippe 24/09/2021: add Fill_tfielddata and use it
 as a custom constructor for tfielddata type

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 245 +++++++++++++++++++++++++++
 1 file changed, 245 insertions(+)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 9c7f50c90..fbcd3d35e 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -12,6 +12,7 @@
 !  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 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
 !-----------------------------------------------------------------
 module modd_field
 
@@ -211,6 +212,8 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA
   CHARACTER(LEN=4)   :: CLBTYPE   = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV)
   LOGICAL            :: LTIMEDEP  = .FALSE. !Is the field time-dependent?
   !
+  INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated
+  !
   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,4 +241,246 @@ integer, save :: NMODEL_ALLOCATED
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
 TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST
 
+interface TFIELDDATA
+  module procedure :: Fill_tfielddata
+end interface TFIELDDATA
+
+contains
+
+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=*),                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
+
+  ! cmnhname
+  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 ) )
+
+  ! 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( cmnhname ) )
+  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( cmnhname ) )
+  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( cmnhname ) )
+  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( cmnhname ) )
+    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( cmnhname ) )
+  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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' of type TYPEDATE' )
+      case default
+        call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
+                        'invalid value of ntype for variable ' // Trim( cmnhname ) )
+
+    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( cmnhname ) )
+
+    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 == 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( cmnhname ) )
+        end if
+      else
+        call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( cmnhname ) )
+      end if
+    else
+      call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( cmnhname ) )
+    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( cmnhname ) )
+      !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( cmnhname ) )
+    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( cmnhname ) )
+    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( cmnhname ) )
+    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( cmnhname ) )
+    if ( Present( nvalidmin ) ) then
+      if ( nvalidmax < nvalidmin ) &
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( cmnhname ) )
+    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( cmnhname ) )
+    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( cmnhname ) )
+    if ( Present( xvalidmin ) ) then
+      if ( xvalidmax < xvalidmin ) &
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( cmnhname ) )
+    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( cmnhname ) )
+    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( cmnhname ) )
+    end if
+  end if
+
+  ! ltimedep
+  if ( Present( ltimedep ) ) tpfield%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.
+  tpfield%nmodelmax = 0
+end function Fill_tfielddata
+
 end module modd_field
-- 
GitLab


From e964ab16aa4bf4ec4bb30332021c647e30f1cd1e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 24 Sep 2021 15:49:00 +0200
Subject: [PATCH 003/157] Philippe 24/09/2021: add Goto_model_1field generic
 procedure + procedure for real 3D arrays

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 56 ++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 97466a414..37299698a 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -15,6 +15,7 @@
 !  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 24/09/2021: add Goto_model_1field generic procedure
 !-----------------------------------------------------------------
 module mode_field
 
@@ -36,6 +37,10 @@ public :: Fieldlist_goto_model
 public :: Fieldlist_nmodel_resize
 public :: Ini_field_scalars
 
+interface Goto_model_1field
+  module procedure :: Goto_model_1field_x3d
+end interface
+
 contains
 
 SUBROUTINE INI_FIELD_LIST(KMODEL)
@@ -4606,6 +4611,57 @@ END IF !KFROM/=KTO
 END SUBROUTINE FIELDLIST_GOTO_MODEL
 
 
+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
+integer :: isize
+integer :: ji
+type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d
+
+call Find_field_id_from_mnhname( hname, iid, iresp )
+
+isize = Max( kfrom, kto )
+
+if ( tfieldlist(iid)%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
+  tfieldlist(iid)%nmodelmax = Size( tfieldlist(iid)%tfield_x3d )
+end if
+
+if ( isize > tfieldlist(iid)%nmodelmax ) then
+  if ( tfieldlist(iid)%nmodelmax == 0 ) then
+    Allocate( tfieldlist(iid)%tfield_x3d(isize) )
+    do ji = 1, isize
+      tfieldlist(iid)%tfield_x3d(ji)%data => null()
+    end do
+  else
+    Allocate( tzfield_x3d(isize) )
+    do ji = 1, Size( tfieldlist(iid)%tfield_x3d)
+      tzfield_x3d(ji)%data => tfieldlist(iid)%tfield_x3d(ji)%data
+    end do
+    do ji = Size( tfieldlist(iid)%tfield_x3d) + 1, isize
+      tzfield_x3d(ji)%data => null()
+    end do
+    call Move_alloc( from = tzfield_x3d, to = tfieldlist(iid)%tfield_x3d )
+  end if
+  tfieldlist(iid)%nmodelmax = isize
+end if
+
+tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata
+if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data
+
+end subroutine Goto_model_1field_x3d
+
+
 subroutine Fieldlist_nmodel_resize( kmodelnew )
 
 implicit none
-- 
GitLab


From 4d9ee7c4abc6220ef673ba3455a9b31e38dd6435 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 11:21:28 +0200
Subject: [PATCH 004/157] Philippe 08/10/2021: add 2 new dimensions: LW_bands
 and SW_bands

---
 src/LIB/SURCOUCHE/src/modd_field.f90        | 68 +++++++++++----------
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 10 ++-
 2 files changed, 45 insertions(+), 33 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index fbcd3d35e..24272038d 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -13,6 +13,7 @@
 !  P. Wautelet 14/09/2020: add ndimlist field to tfield_metadata_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)
 !-----------------------------------------------------------------
 module modd_field
 
@@ -43,49 +44,52 @@ integer, parameter :: NMNHDIM_TIME                = 9
 
 integer, parameter :: NMNHDIM_ONE                 = 10
 
-integer, parameter :: NMNHDIM_LASTDIM_NODIACHRO   = 10  ! Index of the last defined dimension for non-diachronic files
+integer, parameter :: NMNHDIM_NSWB                = 11
+integer, parameter :: NMNHDIM_NLWB                = 12
 
-integer, parameter :: NMNHDIM_COMPLEX             = 11
+integer, parameter :: NMNHDIM_LASTDIM_NODIACHRO   = 12 ! Index of the last defined dimension for non-diachronic files
 
-integer, parameter :: NMNHDIM_BUDGET_CART_NI      = 12
-integer, parameter :: NMNHDIM_BUDGET_CART_NJ      = 13
-integer, parameter :: NMNHDIM_BUDGET_CART_NI_U    = 14
-integer, parameter :: NMNHDIM_BUDGET_CART_NJ_U    = 15
-integer, parameter :: NMNHDIM_BUDGET_CART_NI_V    = 16
-integer, parameter :: NMNHDIM_BUDGET_CART_NJ_V    = 17
-integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL   = 18
-integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL_W = 19
+integer, parameter :: NMNHDIM_COMPLEX             = 13
 
-integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL   = 20
-integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL_W = 21
-integer, parameter :: NMNHDIM_BUDGET_MASK_NBUMASK = 22
+integer, parameter :: NMNHDIM_BUDGET_CART_NI      = 14
+integer, parameter :: NMNHDIM_BUDGET_CART_NJ      = 15
+integer, parameter :: NMNHDIM_BUDGET_CART_NI_U    = 16
+integer, parameter :: NMNHDIM_BUDGET_CART_NJ_U    = 17
+integer, parameter :: NMNHDIM_BUDGET_CART_NI_V    = 18
+integer, parameter :: NMNHDIM_BUDGET_CART_NJ_V    = 19
+integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL   = 20
+integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL_W = 21
 
-integer, parameter :: NMNHDIM_BUDGET_TIME         = 23
+integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL   = 22
+integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL_W = 23
+integer, parameter :: NMNHDIM_BUDGET_MASK_NBUMASK = 24
 
-integer, parameter :: NMNHDIM_BUDGET_LES_TIME     = 24
-integer, parameter :: NMNHDIM_BUDGET_LES_AVG_TIME = 25
-integer, parameter :: NMNHDIM_BUDGET_LES_LEVEL    = 26
-integer, parameter :: NMNHDIM_BUDGET_LES_SV       = 27
-integer, parameter :: NMNHDIM_BUDGET_LES_PDF      = 28
+integer, parameter :: NMNHDIM_BUDGET_TIME         = 25
+
+integer, parameter :: NMNHDIM_BUDGET_LES_TIME     = 26
+integer, parameter :: NMNHDIM_BUDGET_LES_AVG_TIME = 27
+integer, parameter :: NMNHDIM_BUDGET_LES_LEVEL    = 28
+integer, parameter :: NMNHDIM_BUDGET_LES_SV       = 29
+integer, parameter :: NMNHDIM_BUDGET_LES_PDF      = 30
 integer, parameter :: NMNHDIM_BUDGET_LES_MASK     = 100 ! This is not a true dimension
 
-integer, parameter :: NMNHDIM_SPECTRA_2PTS_NI     = 29
-integer, parameter :: NMNHDIM_SPECTRA_2PTS_NJ     = 30
-integer, parameter :: NMNHDIM_SPECTRA_SPEC_NI     = 31
-integer, parameter :: NMNHDIM_SPECTRA_SPEC_NJ     = 32
-integer, parameter :: NMNHDIM_SPECTRA_LEVEL       = 33
+integer, parameter :: NMNHDIM_SPECTRA_2PTS_NI     = 31
+integer, parameter :: NMNHDIM_SPECTRA_2PTS_NJ     = 32
+integer, parameter :: NMNHDIM_SPECTRA_SPEC_NI     = 33
+integer, parameter :: NMNHDIM_SPECTRA_SPEC_NJ     = 34
+integer, parameter :: NMNHDIM_SPECTRA_LEVEL       = 35
 
-integer, parameter :: NMNHDIM_SERIES_LEVEL        = 34
-integer, parameter :: NMNHDIM_SERIES_LEVEL_W      = 35
-integer, parameter :: NMNHDIM_SERIES_TIME         = 36  ! Time dimension for time series
+integer, parameter :: NMNHDIM_SERIES_LEVEL        = 36
+integer, parameter :: NMNHDIM_SERIES_LEVEL_W      = 37
+integer, parameter :: NMNHDIM_SERIES_TIME         = 38  ! Time dimension for time series
 
-integer, parameter :: NMNHDIM_FLYER_TIME          = 37  ! Time dimension for aircraft/balloon (dimension local to each flyer)
-integer, parameter :: NMNHDIM_PROFILER_TIME       = 38  ! Time dimension for profilers
-integer, parameter :: NMNHDIM_STATION_TIME        = 39  ! Time dimension for stations
+integer, parameter :: NMNHDIM_FLYER_TIME          = 39  ! Time dimension for aircraft/balloon (dimension local to each flyer)
+integer, parameter :: NMNHDIM_PROFILER_TIME       = 40  ! Time dimension for profilers
+integer, parameter :: NMNHDIM_STATION_TIME        = 41  ! Time dimension for stations
 
-integer, parameter :: NMNHDIM_PAIR                = 40  ! For values coming by pair (ie boundaries)
+integer, parameter :: NMNHDIM_PAIR                = 42  ! For values coming by pair (ie boundaries)
 
-integer, parameter :: NMNHDIM_LASTDIM_DIACHRO     = 40  ! Index of the last defined dimension for diachronic files
+integer, parameter :: NMNHDIM_LASTDIM_DIACHRO     = 42  ! Index of the last defined dimension for diachronic files
 
 integer, parameter :: NMNHDIM_BUDGET_NGROUPS      = 101 ! This is not a true dimension
 integer, parameter :: NMNHDIM_FLYER_PROC          = 102 ! This is not a true dimension
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 477c389db..50412e8c0 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -19,6 +19,7 @@
 !  P. Wautelet 18/03/2021: workaround for an intel compiler bug
 !  P. Wautelet 04/05/2021: improve IO_Vdims_fill_nc4 if l2d and lpack
 !  P. Wautelet 27/05/2021: improve IO_Mnhname_clean to autocorrect names to be CF compliant
+!  P. Wautelet 08/10/2021: add 2 new dimensions: LW_bands and SW_bands
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_tools_nc4
@@ -254,7 +255,7 @@ use modd_dyn,           only: xseglen
 use modd_dyn_n,         only: xtstep
 use modd_field,         only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V,   &
                               NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME,                                     &
-                              NMNHDIM_ONE,  NMNHDIM_COMPLEX,                                                    &
+                              NMNHDIM_ONE,  NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX,                        &
                               NMNHDIM_BUDGET_CART_NI, NMNHDIM_BUDGET_CART_NJ, NMNHDIM_BUDGET_CART_NI_U,         &
                               NMNHDIM_BUDGET_CART_NJ_U, NMNHDIM_BUDGET_CART_NI_V, NMNHDIM_BUDGET_CART_NJ_V,     &
                               NMNHDIM_BUDGET_CART_LEVEL, NMNHDIM_BUDGET_CART_LEVEL_W,                           &
@@ -274,7 +275,9 @@ use modd_les,           only: lles_pdf, nles_k, npdf, nspectra_k, xles_temp_mean
 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_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
@@ -336,6 +339,11 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' .or. ( lpack .and. l2d ) ) then
   call IO_Add_dim_nc4( tpfile, NMNHDIM_ONE, 'one', 1 )
 end if
 
+if ( tpfile%ctype /= 'MNHDIACHRONIC' .and. crad /= 'NONE' ) then
+  call IO_Add_dim_nc4( tpfile, NMNHDIM_NSWB, 'SW_bands', nswb_mnh ) !number of SW bands practically used
+  call IO_Add_dim_nc4( tpfile, NMNHDIM_NLWB, 'LW_bands', nlwb_mnh ) !number of LW bands practically used
+end if
+
 !Write dimensions used in diachronic files
 if ( tpfile%ctype == 'MNHDIACHRONIC' ) then
   !Dimension of size 2 used for NMNHDIM_COMPLEX
-- 
GitLab


From ee3962e07e096fd95c4b77af0c0993518b0def9e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 15:02:05 +0200
Subject: [PATCH 005/157] Philippe 08/10/2021: add Goto_model_1field +
 Extend_1field_* procedures

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 1086 +++++++++++++++++++++++++-
 1 file changed, 1063 insertions(+), 23 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 37299698a..b224d123e 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -15,7 +15,7 @@
 !  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 24/09/2021: add Goto_model_1field generic procedure
+!  P. Wautelet 08/10/2021: add Goto_model_1field procedures
 !-----------------------------------------------------------------
 module mode_field
 
@@ -38,9 +38,26 @@ 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)
@@ -4611,7 +4628,312 @@ END IF !KFROM/=KTO
 END SUBROUTINE FIELDLIST_GOTO_MODEL
 
 
-subroutine Goto_model_1field_x3d(hname, kfrom, kto, pdata)
+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
 
@@ -4622,44 +4944,762 @@ real,    dimension(:,:,:), pointer, intent(inout) :: pdata
 
 integer :: iid
 integer :: iresp
-integer :: isize
-integer :: ji
-type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d
 
 call Find_field_id_from_mnhname( hname, iid, iresp )
 
-isize = Max( kfrom, kto )
+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
+
+type(tfielddata), intent(inout) :: tpfield
+integer,          intent(in)    :: ksize
 
-if ( tfieldlist(iid)%nmodelmax < 0 ) then
+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
-  tfieldlist(iid)%nmodelmax = Size( tfieldlist(iid)%tfield_x3d )
+  tpfield%nmodelmax = Size( tpfield%tfield_c0d )
 end if
 
-if ( isize > tfieldlist(iid)%nmodelmax ) then
-  if ( tfieldlist(iid)%nmodelmax == 0 ) then
-    Allocate( tfieldlist(iid)%tfield_x3d(isize) )
-    do ji = 1, isize
-      tfieldlist(iid)%tfield_x3d(ji)%data => null()
+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
   else
-    Allocate( tzfield_x3d(isize) )
-    do ji = 1, Size( tfieldlist(iid)%tfield_x3d)
-      tzfield_x3d(ji)%data => tfieldlist(iid)%tfield_x3d(ji)%data
+    Allocate( tzfield_c0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_c0d)
+      tzfield_c0d(ji)%data => tpfield%tfield_c0d(ji)%data
     end do
-    do ji = Size( tfieldlist(iid)%tfield_x3d) + 1, isize
-      tzfield_x3d(ji)%data => null()
+    do ji = Size( tpfield%tfield_c0d) + 1, ksize
+      tzfield_c0d(ji)%data => null()
     end do
-    call Move_alloc( from = tzfield_x3d, to = tfieldlist(iid)%tfield_x3d )
+    call Move_alloc( from = tzfield_c0d, to = tpfield%tfield_c0d )
   end if
-  tfieldlist(iid)%nmodelmax = isize
+  tpfield%nmodelmax = ksize
 end if
 
-tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata
-if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data
+end subroutine Extend_1field_c0d
 
-end subroutine Goto_model_1field_x3d
+
+subroutine Extend_1field_c1d( tpfield, ksize )
+
+implicit none
+
+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
+  else
+    Allocate( tzfield_c1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_c1d)
+      tzfield_c1d(ji)%data => tpfield%tfield_c1d(ji)%data
+    end do
+    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
+
+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
+  else
+    Allocate( tzfield_l0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_l0d)
+      tzfield_l0d(ji)%data => tpfield%tfield_l0d(ji)%data
+    end do
+    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
+
+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
+  else
+    Allocate( tzfield_l1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_l1d)
+      tzfield_l1d(ji)%data => tpfield%tfield_l1d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_n0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n0d)
+      tzfield_n0d(ji)%data => tpfield%tfield_n0d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_n1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n1d)
+      tzfield_n1d(ji)%data => tpfield%tfield_n1d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_n2d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n2d)
+      tzfield_n2d(ji)%data => tpfield%tfield_n2d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_n3d(ksize) )
+    do ji = 1, Size( tpfield%tfield_n3d)
+      tzfield_n3d(ji)%data => tpfield%tfield_n3d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_t0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_t0d)
+      tzfield_t0d(ji)%data => tpfield%tfield_t0d(ji)%data
+    end do
+    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 ( 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
+  else
+    Allocate( tzfield_t1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_t1d)
+      tzfield_t1d(ji)%data => tpfield%tfield_t1d(ji)%data
+    end do
+    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
+
+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
+  else
+    Allocate( tzfield_x0d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x0d)
+      tzfield_x0d(ji)%data => tpfield%tfield_x0d(ji)%data
+    end do
+    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 )
+
+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
+  else
+    Allocate( tzfield_x1d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x1d)
+      tzfield_x1d(ji)%data => tpfield%tfield_x1d(ji)%data
+    end do
+    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 )
+
+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
+  else
+    Allocate( tzfield_x2d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x2d)
+      tzfield_x2d(ji)%data => tpfield%tfield_x2d(ji)%data
+    end do
+    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 )
+
+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
+  else
+    Allocate( tzfield_x3d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x3d)
+      tzfield_x3d(ji)%data => tpfield%tfield_x3d(ji)%data
+    end do
+    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 )
+
+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
+  else
+    Allocate( tzfield_x4d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x4d)
+      tzfield_x4d(ji)%data => tpfield%tfield_x4d(ji)%data
+    end do
+    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 )
+
+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
+  else
+    Allocate( tzfield_x5d(ksize) )
+    do ji = 1, Size( tpfield%tfield_x5d)
+      tzfield_x5d(ji)%data => tpfield%tfield_x5d(ji)%data
+    end do
+    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 )
+
+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
+
+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 Extend_1field_x6d
 
 
 subroutine Fieldlist_nmodel_resize( kmodelnew )
-- 
GitLab


From a1ae3363aeca142fd66569e56afb28ab76156b68 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 15:11:26 +0200
Subject: [PATCH 006/157] Philippe 08/10/2021: add Add_field2list subroutine +
 use it for tfieldlist variables

---
 src/LIB/SURCOUCHE/src/modd_field.f90   |    3 +-
 src/LIB/SURCOUCHE/src/mode_field.f90   | 6403 +++++++++++-------------
 src/MNH/write_lfifm1_for_diag_supp.f90 |    4 +-
 src/MNH/write_lfin.f90                 |    4 +-
 4 files changed, 2998 insertions(+), 3416 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 24272038d..81aef5eb5 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -241,7 +241,8 @@ 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 :: NMODEL_ALLOCATED = 0
+integer, save :: NFIELDS_USED = 0
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
 TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST
 
diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index b224d123e..deba33040 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -15,7 +15,7 @@
 !  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 procedures
+!  P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures
 !-----------------------------------------------------------------
 module mode_field
 
@@ -68,7 +68,7 @@ USE MODD_CONF, ONLY: NMODEL
 !
 INTEGER,INTENT(IN),OPTIONAL :: KMODEL
 !
-INTEGER :: IDX, IMODEL
+INTEGER :: IMODEL
 CHARACTER(LEN=42) :: YMSG
 !
 !F90/95: TFIELDLIST(1) = TFIELDDATA('UT','x_wind','m s-1','XY','X_Y_Z_U component of wind',2)
@@ -102,3468 +102,3025 @@ 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'
+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',           &
 !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'
+  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',           &
 !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'
+  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   = '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   = '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  = '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  = '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  = '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  = '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   = ''
-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  = '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.           ) )
+
+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   = '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   = '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
-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   = '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   = '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_Nact',     &
+  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   = '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   = '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   = '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) /= '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,MAXFIELDS
 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)
@@ -4628,6 +4185,26 @@ END IF !KFROM/=KTO
 END SUBROUTINE FIELDLIST_GOTO_MODEL
 
 
+subroutine Add_field2list( tpfield )
+
+implicit none
+
+type(tfielddata) :: tpfield
+
+CHARACTER(LEN=42) :: YMSG
+
+if ( nfields_used >= MAXFIELDS ) then
+  WRITE(YMSG,'( "nfields_used>=MAXFIELDS (",I5,")" )') MAXFIELDS
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',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
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 1bb11e435..94887adeb 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -97,7 +97,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
 !
 USE MODE_ll
 USE MODD_CST
-use modd_field,           only: tfielddata, tfieldlist, TYPEINT, TYPEREAL
+use modd_field,           only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEINT, TYPEREAL
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_PARAMETERS
 USE MODD_CONF_n
@@ -564,6 +564,8 @@ IF (NRAD_3D >= 0) THEN
     CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
     TZFIELD = 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)
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index ea08bd41d..fdc5c4767 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -188,7 +188,7 @@ END MODULE MODI_WRITE_LFIFM_n
 USE MODD_DIM_n
 USE MODD_CONF
 USE MODD_CONF_n
-use modd_field,       only: tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
+use modd_field,       only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_TIME
@@ -1661,6 +1661,8 @@ IF (CRAD /= 'NONE') THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
   TZFIELD = 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)
-- 
GitLab


From 23981265e14c3773e89f914e5547edfb51ed2b7e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 15:17:53 +0200
Subject: [PATCH 007/157] Philippe 08/10/2021: use Goto_model_1field

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 969 ++++++++-------------------
 1 file changed, 279 insertions(+), 690 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index deba33040..05c5d892c 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -3244,109 +3244,93 @@ 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
+  call Goto_model_1field( 'LEN2', 1, 1, 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
+  call Goto_model_1field( 'DTMOD', 1, 1, 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
+  call Goto_model_1field( 'DTCUR', 1, 1, 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
+  call Goto_model_1field( 'DTRAD_FULL', 1, 1, 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
+  call Goto_model_1field( 'DTRAD_CLLY', 1, 1, 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
+  call Goto_model_1field( 'DTDCONV', 1, 1, 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 = ''
+  call Goto_model_1field( 'SURF', 1, 1, 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
+  call Goto_model_1field( 'DRYMASST', 1, 1, XDRYMASST )
 END IF
 !
 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('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)
+  call Goto_model_1field( 'RIMY', 1, 1, 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)
+  call Goto_model_1field( 'HORELAX_UVWTH', 1, 1, 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)
+  call Goto_model_1field( 'HORELAX_TKE', 1, 1, 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
 !
@@ -3430,758 +3414,363 @@ END IF
 !
 ! 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
-
+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); 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
+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('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
-  !
+  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)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RVT)
+    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('RCS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RCT)
+    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('RRS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RRT)
+    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('RIS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RIT)
+    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('RSS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RST)
+    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('RGS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RGT)
+    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('RHS_CLD',IID,IRESP)
-    TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
+    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('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR
-  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
-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); 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
-END IF
-!
-! MODD_GR_FIELD_n variables
-!
-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
-!
-! MODD_PRECIP_n variables
-!
-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
-!
-! MODD_DEF_EDDY_FLUX_n variables
-!
-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
-!
-! MODD_DEF_EDDYUV_FLUX_n variables
-!
-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
-!
-! MODD_HURR_FIELD_n variables
-!
-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
-END IF
-!
-!
-!
-!
-! Current model is set to model KTO
-!
-!
-!
-!
-IF( KFROM/=KTO) THEN
-!
-! 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
-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
-!
-IF (CPROGRAM == 'MESONH') THEN
-  !
-  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)
-  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)
-  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)
-  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)
-  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)
-  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)
-  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)
-  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('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( '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
+  call Goto_model_1field( 'LSRVM', kfrom, kto, XLSRVM )
 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 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 )
 !
 ! 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( 'ZHAT',  kfrom, kto, XZHAT  )
+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 )
 !
 ! 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_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
+  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
 
 
-- 
GitLab


From f54e38463c18c0da670e6003676e9e9de4824f98 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 15:18:53 +0200
Subject: [PATCH 008/157] Philippe 08/10/2021: remove unnecessary stage in
 FIELDLIST_GOTO_MODEL

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 24 ------------------------
 1 file changed, 24 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 05c5d892c..fac837573 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -3388,30 +3388,6 @@ 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 Goto_model_1field( 'ZWS',   kfrom, kto, xzws   )
-- 
GitLab


From 754627f25295af187d784840a3b7684f6b3a6a59 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Oct 2021 15:25:35 +0200
Subject: [PATCH 009/157] Philippe 08/10/2021: remove Fieldlist_nmodel_resize
 (not useful anymore because reallocation are automatically done in
 Goto_model)

---
 src/LIB/SURCOUCHE/src/modd_field.f90 |   1 -
 src/LIB/SURCOUCHE/src/mode_field.f90 | 439 +--------------------------
 src/MNH/ini_segn.f90                 |   8 +-
 3 files changed, 3 insertions(+), 445 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 81aef5eb5..277e8ad08 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -241,7 +241,6 @@ 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 = 0
 integer, save :: NFIELDS_USED = 0
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
 TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST
diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index fac837573..42b139e95 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -15,7 +15,7 @@
 !  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
+!  P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures + remove Fieldlist_nmodel_resize
 !-----------------------------------------------------------------
 module mode_field
 
@@ -34,7 +34,6 @@ 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
@@ -89,7 +88,6 @@ 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
 !
@@ -100,8 +98,6 @@ if ( imodel > JPMODELMAX ) &
 WRITE(YMSG,'("allocating fields for up to ",I4," model(s)")') IMODEL
 CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST',YMSG)
 !
-NMODEL_ALLOCATED = IMODEL
-!
 call Add_field2list( TFIELDDATA( &
   CMNHNAME   = 'MNHVERSION',     &
   CSTDNAME   = '',               &
@@ -3385,9 +3381,6 @@ IF (.NOT.LFIELDLIST_ISINIT) THEN
   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' )
-!
 ! MODD_FIELD_n variables
 !
 call Goto_model_1field( 'ZWS',   kfrom, kto, xzws   )
@@ -4843,434 +4836,4 @@ end if
 
 end subroutine Extend_1field_x6d
 
-
-subroutine Fieldlist_nmodel_resize( kmodelnew )
-
-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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-  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
-    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()
-    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
-    end do
-  end if
-
-end do
-
-nmodel_allocated = kmodelnew
-
-end subroutine Fieldlist_nmodel_resize
-
 end module mode_field
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 590efa55c..660947da4 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
@@ -181,7 +181,7 @@ USE MODD_PARAM_n,          ONLY: CSURF
 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
@@ -457,10 +457,6 @@ CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC,                 &
                 YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS,  &
                 PTSTEP_ALL,CSTORAGE_TYPE,CINIFILEPGD_n                      )
 !
-if ( cprogram == 'MESONH' .and. kmi == 1 ) then !Do this only once
-  call Fieldlist_nmodel_resize(NMODEL)
-end if
-!
 IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  '      &
      .OR. CPROGRAM=='REAL  ') THEN
   CINIFILE_n    = YINIFILE
-- 
GitLab


From 189ccba1e7e2176397e86730134dbfadecf976e8 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 14 Oct 2021 10:16:42 +0200
Subject: [PATCH 010/157] Philippe 14/10/2021: dynamically allocate tfieldlist
 (+ reallocate if necessary)

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 11 ++++++++---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 26 +++++++++++++++-----------
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 277e8ad08..8eecb7d3e 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -14,6 +14,7 @@
 !  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)
 !-----------------------------------------------------------------
 module modd_field
 
@@ -26,9 +27,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
@@ -115,6 +118,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
@@ -216,7 +221,7 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA
   CHARACTER(LEN=4)   :: CLBTYPE   = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV)
   LOGICAL            :: LTIMEDEP  = .FALSE. !Is the field time-dependent?
   !
-  INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated
+  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)
@@ -243,7 +248,7 @@ END TYPE TFIELDDATA
 !
 integer, save :: NFIELDS_USED = 0
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
-TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST
+TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST
 
 interface TFIELDDATA
   module procedure :: Fill_tfielddata
diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 42b139e95..326562a42 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -16,6 +16,7 @@
 !  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)
 !-----------------------------------------------------------------
 module mode_field
 
@@ -70,17 +71,14 @@ INTEGER,INTENT(IN),OPTIONAL :: KMODEL
 INTEGER :: IMODEL
 CHARACTER(LEN=42) :: YMSG
 !
-!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')
   RETURN
 END IF
 LFIELDLIST_ISINIT = .TRUE.
+Allocate( tfieldlist(NMAXFIELDINIT) )
+NMAXFIELDS = NMAXFIELDINIT
 !
 IF (PRESENT(KMODEL)) THEN
   IMODEL = KMODEL
@@ -3098,7 +3096,7 @@ call Add_field2list( TFIELDDATA( &
   LTIMEDEP   = .FALSE.           ) )
 !
 !
-WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') nfields_used-1,MAXFIELDS
+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
@@ -3749,11 +3747,17 @@ implicit none
 
 type(tfielddata) :: tpfield
 
-CHARACTER(LEN=42) :: YMSG
-
-if ( nfields_used >= MAXFIELDS ) then
-  WRITE(YMSG,'( "nfields_used>=MAXFIELDS (",I5,")" )') MAXFIELDS
-  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',TRIM(YMSG))
+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
-- 
GitLab


From 4ddf3ee0a29bec6471abdbb7ac3bcc06a320f9fc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 14 Oct 2021 10:19:04 +0200
Subject: [PATCH 011/157] Philippe 14/10/2021: improve slightly
 FIND_FIELD_ID_FROM_MNHNAME

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 326562a42..89d2b8d16 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -3151,14 +3151,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 
+  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
@@ -3172,8 +3170,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
-- 
GitLab


From a309c489646d0bca24ea471965fd3ec92f56ce6c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 14 Oct 2021 10:44:38 +0200
Subject: [PATCH 012/157] Philippe 14/10/2021: INI_FIELD_LIST: remove KMODEL
 dummy argument (not used anymore)

---
 LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 |  4 ++--
 src/LIB/SURCOUCHE/src/mode_field.f90   | 31 ++++++--------------------
 src/MNH/ini_segn.f90                   |  8 +++----
 src/MNH/latlon_to_xy.f90               |  4 ++--
 src/MNH/mnh2lpdm.f90                   |  4 ++--
 src/MNH/prep_ideal_case.f90            |  2 +-
 src/MNH/prep_nest_pgd.f90              |  2 +-
 src/MNH/prep_pgd.f90                   |  2 +-
 src/MNH/prep_real_case.f90             |  2 +-
 src/MNH/prep_surfex.f90                |  2 +-
 src/MNH/xy_to_latlon.f90               |  4 ++--
 11 files changed, 23 insertions(+), 42 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 39bb56a69..106804883 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/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 89d2b8d16..b8674cc39 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -60,42 +60,25 @@ 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 :: IMODEL
-CHARACTER(LEN=42) :: YMSG
-!
+
+CHARACTER(LEN=64) :: YMSG
+
 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')
   RETURN
 END IF
+
 LFIELDLIST_ISINIT = .TRUE.
+
 Allocate( tfieldlist(NMAXFIELDINIT) )
 NMAXFIELDS = NMAXFIELDINIT
-!
-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
-  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)
-!
+
 call Add_field2list( TFIELDDATA( &
   CMNHNAME   = 'MNHVERSION',     &
   CSTDNAME   = '',               &
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 660947da4..7cd8620da 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -369,13 +369,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
diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90
index 972999064..98b134a36 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/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90
index d7ed74c74..deb8dda23 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/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 370e21412..0a4aa09b9 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -712,7 +712,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()
 !
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index 80b493fbc..e894cd407 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 046ddde78..2df254d5e 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 2796da451..7014fc3b2 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -638,7 +638,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()
 !
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index 68ec7b3a8..547f5b1bc 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/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90
index f8782a519..4537388a1 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
 !            ------------------------
-- 
GitLab


From 89c4f1772cac04ee9f2b30a254d7c1548df99517 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Oct 2021 14:11:10 +0200
Subject: [PATCH 013/157] Philippe 22/10/2021: Fill_tfielddata: cmnhname is now
 optional

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 73 ++++++++++++++++------------
 1 file changed, 41 insertions(+), 32 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 8eecb7d3e..a192ac851 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -263,7 +263,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
 
   use mode_msg
 
-  character(len=*),                intent(in) :: cmnhname
+  character(len=*),      optional, intent(in) :: cmnhname
   character(len=*),      optional, intent(in) :: cstdname
   character(len=*),      optional, intent(in) :: clongname
   character(len=*),      optional, intent(in) :: cunits
@@ -283,11 +283,18 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   character(len=*),      optional, intent(in) :: clbtype
   logical,               optional, intent(in) :: ltimedep
 
+  character(len=:), allocatable :: ymnhname
+
   ! cmnhname
-  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 ) )
+  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
@@ -295,7 +302,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
     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( cmnhname ) )
+                      // ' for variable ' // Trim( ymnhname ) )
   end if
 
   ! clongname
@@ -304,7 +311,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
     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( cmnhname ) )
+                      // ' for variable ' // Trim( ymnhname ) )
   end if
 
   ! cunits
@@ -313,7 +320,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, 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( cmnhname ) )
+                      // ' for variable ' // Trim( ymnhname ) )
   end if
 
   ! ccomment
@@ -328,7 +335,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   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( cmnhname ) )
+                      'invalid value of ngrid for variable ' // Trim( ymnhname ) )
     else
       tpfield%ngrid = ngrid
     end if
@@ -337,7 +344,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   ! ntype
   if ( All( ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) )    &
     call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
-                    'invalid value of ntype for variable ' // Trim( cmnhname ) )
+                    'invalid value of ntype for variable ' // Trim( ymnhname ) )
   tpfield%ntype = ntype
 
   ! ndims
@@ -346,26 +353,26 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
       case ( TYPECHAR )
         if ( ndims < 0 .or. ndims > 1 )                                                                 &
           call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' &
-                          // Trim( cmnhname ) // ' of type TYPECHAR' )
+                          // 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( cmnhname ) // ' of type TYPELOG' )
+                          // 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( cmnhname ) // ' of type TYPEINT' )
+                          // 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( cmnhname ) // ' of type TYPEREAL' )
+                          // 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( cmnhname ) // ' of type TYPEDATE' )
+                          // Trim( ymnhname ) // ' of type TYPEDATE' )
       case default
         call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                     &
-                        'invalid value of ntype for variable ' // Trim( cmnhname ) )
+                        'invalid value of ntype for variable ' // Trim( ymnhname ) )
 
     end select
     tpfield%ndims = ndims
@@ -374,7 +381,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   ! 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( cmnhname ) )
+      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
@@ -382,23 +389,25 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
     !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 == 3 ) 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( cmnhname ) )
+          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( cmnhname ) )
+        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( cmnhname ) )
+      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( cmnhname ) )
+                        '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
@@ -412,7 +421,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( nfillvalue ) ) then
     if ( ntype /= TYPEINT )                                                                   &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                                &
-                      'nfillvalue provided for the non-integer variable ' // Trim( cmnhname ) )
+                      'nfillvalue provided for the non-integer variable ' // Trim( ymnhname ) )
     tpfield%nfillvalue = nfillvalue
   end if
 
@@ -420,7 +429,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( xfillvalue ) ) then
     if ( ntype /= TYPEREAL )                                                               &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                             &
-                      'xfillvalue provided for the non-real variable ' // Trim( cmnhname ) )
+                      'xfillvalue provided for the non-real variable ' // Trim( ymnhname ) )
     tpfield%xfillvalue = xfillvalue
   end if
 
@@ -428,7 +437,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( nvalidmin ) ) then
     if ( ntype /= TYPEINT )                                                                  &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                               &
-                      'nvalidmin provided for the non-integer variable ' // Trim( cmnhname ) )
+                      'nvalidmin provided for the non-integer variable ' // Trim( ymnhname ) )
     tpfield%nvalidmin = nvalidmin
   end if
 
@@ -436,10 +445,10 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( nvalidmax ) ) then
     if ( ntype /= TYPEINT )                                                                  &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                               &
-                      'nvalidmax provided for the non-integer variable ' // Trim( cmnhname ) )
+                      '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( cmnhname ) )
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( ymnhname ) )
     end if
     tpfield%nvalidmax = nvalidmax
   end if
@@ -448,7 +457,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( xvalidmin ) ) then
     if ( ntype /= TYPEREAL )                                                              &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                            &
-                      'xvalidmin provided for the non-real variable ' // Trim( cmnhname ) )
+                      'xvalidmin provided for the non-real variable ' // Trim( ymnhname ) )
     tpfield%xvalidmin = xvalidmin
   end if
 
@@ -456,10 +465,10 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
   if ( Present( xvalidmax ) ) then
     if ( ntype /= TYPEREAL )                                                              &
       call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata',                            &
-                      'xvalidmax provided for the non-real variable ' // Trim( cmnhname ) )
+                      '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( cmnhname ) )
+        call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( ymnhname ) )
     end if
     tpfield%xvalidmax = xvalidmax
   end if
@@ -470,7 +479,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
       tpfield%cdir = cdir
     else
       call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                                             &
-                      'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( cmnhname ) )
+                      'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( ymnhname ) )
     end if
   end if
 
@@ -480,7 +489,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
       tpfield%clbtype = clbtype
     else
       call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata',                                                   &
-                      'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( cmnhname ) )
+                      'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( ymnhname ) )
     end if
   end if
 
-- 
GitLab


From b3f0e4f9348028800041363e25db72b8d3797092 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Oct 2021 14:40:03 +0200
Subject: [PATCH 014/157] Philippe 22/10/2021: use the custom constructor for
 tfielddata type

---
 src/LIB/SURCOUCHE/src/mode_io_tools.f90 |   23 +-
 src/MNH/advection_metsv.f90             |   84 +-
 src/MNH/c2r2_adjust.f90                 |   21 +-
 src/MNH/call_rttov11.f90                |   27 +-
 src/MNH/call_rttov13.f90                |   31 +-
 src/MNH/call_rttov8.f90                 |  115 +-
 src/MNH/compute_r00.f90                 |  139 +-
 src/MNH/free_atm_profile.f90            |   91 +-
 src/MNH/ini_aircraft_balloon.f90        |  107 +-
 src/MNH/ini_deep_convection.f90         |   17 +-
 src/MNH/ini_lb.f90                      |   37 +-
 src/MNH/khko_notadjust.f90              |   42 +-
 src/MNH/lima_adjust.f90                 |   42 +-
 src/MNH/lima_adjust_split.f90           |   42 +-
 src/MNH/lima_ccn_activation.f90         |   42 +-
 src/MNH/lima_notadjust.f90              |   21 +-
 src/MNH/lima_warm_nucl.f90              |   42 +-
 src/MNH/menu_diachro.f90                |   84 +-
 src/MNH/mnh2lpdm_ech.f90                |   87 +-
 src/MNH/mnh2lpdm_ini.f90                |   19 +-
 src/MNH/paspol.f90                      |   26 +-
 src/MNH/prandtl.f90                     |  105 +-
 src/MNH/radiations.f90                  |  804 +++-----
 src/MNH/rain_c2r2_khko.f90              |   84 +-
 src/MNH/read_dummy_gr_fieldn.f90        |   48 +-
 src/MNH/read_surf_mnh.f90               |  190 +-
 src/MNH/shallow_mf_pack.f90             |  105 +-
 src/MNH/tke_eps_sources.f90             |   84 +-
 src/MNH/turb.f90                        |  169 +-
 src/MNH/turb_cloud_index.f90            |  168 +-
 src/MNH/turb_hor_dyn_corr.f90           |   63 +-
 src/MNH/turb_hor_sv_flux.f90            |   45 +-
 src/MNH/turb_hor_thermo_corr.f90        |   63 +-
 src/MNH/turb_hor_thermo_flux.f90        |  126 +-
 src/MNH/turb_hor_uv.f90                 |   21 +-
 src/MNH/turb_hor_uw.f90                 |   21 +-
 src/MNH/turb_hor_vw.f90                 |   21 +-
 src/MNH/turb_ver.f90                    |   58 +-
 src/MNH/turb_ver_dyn_flux.f90           |   63 +-
 src/MNH/turb_ver_sv_flux.f90            |   23 +-
 src/MNH/turb_ver_thermo_corr.f90        |   63 +-
 src/MNH/turb_ver_thermo_flux.f90        |   63 +-
 src/MNH/ver_thermo.f90                  |   23 +-
 src/MNH/write_balloonn.f90              |  107 +-
 src/MNH/write_budget.f90                |  103 +-
 src/MNH/write_diachro.f90               |  339 ++--
 src/MNH/write_dummy_gr_fieldn.f90       |   44 +-
 src/MNH/write_lbn.f90                   |   46 +-
 src/MNH/write_lfifm1_for_diag.f90       | 2297 ++++++++++++-----------
 src/MNH/write_lfifm1_for_diag_supp.f90  |  826 ++++----
 src/MNH/write_lfin.f90                  | 1085 ++++++-----
 src/MNH/write_surf_mnh.f90              |  105 +-
 src/MNH/zsmt_pgd.f90                    |   67 +-
 53 files changed, 4341 insertions(+), 4227 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
index 42236655f..193083863 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.
@@ -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 = tfielddata(            &
+      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/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index cd93fe4fa..107970bb1 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -366,54 +366,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 = TFIELDDATA(        &
+      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 = TFIELDDATA(        &
+      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 = TFIELDDATA(        &
+      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 = TFIELDDATA(       &
+      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/c2r2_adjust.f90 b/src/MNH/c2r2_adjust.f90
index b97914d1a..0112cd87a 100644
--- a/src/MNH/c2r2_adjust.f90
+++ b/src/MNH/c2r2_adjust.f90
@@ -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 = TFIELDDATA(       &
+    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/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90
index e9eda58c8..e6a43b03e 100644
--- a/src/MNH/call_rttov11.f90
+++ b/src/MNH/call_rttov11.f90
@@ -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 = TFIELDDATA(                              &
+      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 97ccf20af..5c427dce7 100644
--- a/src/MNH/call_rttov13.f90
+++ b/src/MNH/call_rttov13.f90
@@ -262,6 +262,7 @@ 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
 !-------------------------------------------------------------------------------
@@ -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 = TFIELDDATA(                          &
+      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 946021f40..d38a71c2b 100644
--- a/src/MNH/call_rttov8.f90
+++ b/src/MNH/call_rttov8.f90
@@ -686,6 +686,7 @@ 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)
 
+CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT
 TYPE(TFIELDDATA) :: TZFIELD
 
 ! - End of header --------------------------------------------------------
@@ -1567,16 +1568,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 = TFIELDDATA(                &
+      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 +1621,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 = TFIELDDATA(            &
+      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 = TFIELDDATA(              &
+        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 +1727,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 = TFIELDDATA(                                  &
+        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 = TFIELDDATA(                                  &
+        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/compute_r00.f90 b/src/MNH/compute_r00.f90
index 692fb3a1e..85f43d0d2 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.
@@ -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
@@ -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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(    &
+      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/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90
index 50496da72..34fefa20a 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.
@@ -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 = TFIELDDATA(                                 &
+    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 = TFIELDDATA(                                                    &
+    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 = TFIELDDATA(                      &
+    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 = TFIELDDATA(            &
+    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/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 0b22d3403..f5938cbc1 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.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.
@@ -474,69 +474,74 @@ END IF
 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.
+  TZFIELD = TFIELDDATA(                      &
+    CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = TRIM(TPFLYER%TITLE)//'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
     WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE
   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.
+    TZFIELD = TFIELDDATA(                      &
+      CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
+      CUNITS     = 'degree',                   &
+      CDIR       = '--',                       &
+      CCOMMENT   = '',                         &
+      NGRID      = 0,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 0,                          &
+      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.
+    TZFIELD = TFIELDDATA(                      &
+      CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT', &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
+      CUNITS     = 'm',                        &
+      CDIR       = '--',                       &
+      CCOMMENT   = '',                         &
+      NGRID      = 0,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 0,                          &
+      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.
+    TZFIELD = TFIELDDATA(                          &
+      CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
+      CUNITS     = 'm s-1',                        &
+      CDIR       = '--',                           &
+      CCOMMENT   = '',                             &
+      NGRID      = 0,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 0,                              &
+      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.
+    TZFIELD = TFIELDDATA(                      &
+      CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO', &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
+      CUNITS     = 'kg m-3',                   &
+      CDIR       = '--',                       &
+      CCOMMENT   = '',                         &
+      NGRID      = 0,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 0,                          &
+      LTIMEDEP   = .TRUE.                      )
     CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO)
     !
     CALL SM_XYHAT(PLATOR,PLONOR,&
diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index f4747410b..447fac0b0 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-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.
@@ -260,13 +260,14 @@ ELSE
 !
  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.
+    TZFIELD = TFIELDDATA(         &
+      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
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index b4d44b50a..b91b85868 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -361,17 +361,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 = TFIELDDATA(                                          &
+    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 +390,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 = TFIELDDATA(     &
+    CUNITS     = 'kg kg-1', &
+    CDIR       = '',        &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
   !
   IRR=0
   JRR=1
diff --git a/src/MNH/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90
index 344c2e976..b69b6a18a 100644
--- a/src/MNH/khko_notadjust.f90
+++ b/src/MNH/khko_notadjust.f90
@@ -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 = TFIELDDATA(       &
+    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 = TFIELDDATA(       &
+    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/lima_adjust.f90 b/src/MNH/lima_adjust.f90
index 31ea1fefa..0a7f2a4de 100644
--- a/src/MNH/lima_adjust.f90
+++ b/src/MNH/lima_adjust.f90
@@ -1187,16 +1187,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 = TFIELDDATA(       &
+    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
 !
@@ -1242,16 +1243,17 @@ IF ( tpfile%lopened ) THEN
   ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:)
   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 = TFIELDDATA(       &
+    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/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90
index 6f7dbb738..67eefa30b 100644
--- a/src/MNH/lima_adjust_split.f90
+++ b/src/MNH/lima_adjust_split.f90
@@ -726,16 +726,17 @@ IF ( OSUBG_COND ) THEN
 END IF ! fin test OSUBG_COND
 
 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 = TFIELDDATA(       &
+     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
 !
@@ -781,16 +782,17 @@ IF ( tpfile%lopened ) THEN
    ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:)
    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 = TFIELDDATA(       &
+     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/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90
index b7786ea4f..2c2902a37 100644
--- a/src/MNH/lima_ccn_activation.f90
+++ b/src/MNH/lima_ccn_activation.f90
@@ -488,28 +488,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 = TFIELDDATA(        &
+    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 = TFIELDDATA(        &
+    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/MNH/lima_notadjust.f90 b/src/MNH/lima_notadjust.f90
index 94ea1f4fd..e1eb550e4 100644
--- a/src/MNH/lima_notadjust.f90
+++ b/src/MNH/lima_notadjust.f90
@@ -566,16 +566,17 @@ END IF
 !
 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 = TFIELDDATA(        &
+    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/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90
index 549a5fc84..8f50a8798 100644
--- a/src/MNH/lima_warm_nucl.f90
+++ b/src/MNH/lima_warm_nucl.f90
@@ -513,28 +513,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 = TFIELDDATA(        &
+    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 = TFIELDDATA(        &
+    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/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90
index 7c4fcea5a..88149a569 100644
--- a/src/MNH/menu_diachro.f90
+++ b/src/MNH/menu_diachro.f90
@@ -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 = TFIELDDATA(             &
+    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 = TFIELDDATA(         &
+    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 = TFIELDDATA(             &
+    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 = TFIELDDATA(         &
+    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/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90
index 67eb3ed1c..62d3d9939 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.
@@ -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 = tfielddata(          &
+  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 = tfielddata(    &
+  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 = tfielddata(       &
+  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 = tfielddata(       &
+  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 = tfielddata(       &
+  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 a430219a2..52a31e084 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.
@@ -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 = tfielddata(   &
+  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/paspol.f90 b/src/MNH/paspol.f90
index b3043a864..19ef98129 100644
--- a/src/MNH/paspol.f90
+++ b/src/MNH/paspol.f90
@@ -141,7 +141,7 @@ 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
@@ -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 = TFIELDDATA(    &
+    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/prandtl.f90 b/src/MNH/prandtl.f90
index fbfe0a762..370e025c4 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -538,68 +538,73 @@ END IF ! end of HTURBDIM if-block
 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 = TFIELDDATA(           &
+    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(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 = TFIELDDATA(          &
+    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(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 = TFIELDDATA(            &
+    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(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 = TFIELDDATA(           &
+    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(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 = TFIELDDATA(             &
+    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(TPFILE,TZFIELD,PRED2THR3)
   !
 END IF
diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90
index e0bda3fca..b6151ba3f 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.f90
@@ -535,7 +535,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(TFIELDDATA) :: TZFIELD2D, TZFIELD3D
 !
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST
 REAL :: ZMINVAL
@@ -2684,6 +2684,24 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
   ZSTORE_3D2(:,:,:) = 0.0
   ZSTORE_2D(:,:)   = 0.0
   !
+  TZFIELD2D = TFIELDDATA(                     &
+    CMNHNAME   = 'generic 2D for radiations', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 2,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  TZFIELD3D = TFIELDDATA(                     &
+    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
@@ -2698,17 +2716,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
@@ -2719,17 +2731,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
@@ -2740,17 +2746,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
@@ -2761,17 +2761,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
@@ -2782,17 +2776,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
@@ -2803,17 +2791,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
@@ -2822,17 +2804,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
@@ -2841,17 +2817,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
@@ -2859,17 +2829,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
@@ -2877,17 +2841,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
@@ -2895,17 +2853,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
   !
   !
@@ -2919,17 +2871,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
@@ -2940,17 +2886,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
@@ -2961,17 +2901,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
@@ -2982,17 +2916,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
@@ -3003,17 +2931,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
@@ -3024,17 +2946,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
@@ -3045,17 +2961,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
@@ -3066,17 +2976,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
@@ -3084,17 +2988,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
@@ -3102,17 +3000,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
@@ -3120,17 +3012,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
   !
   !
@@ -3141,17 +3027,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
@@ -3159,17 +3039,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
@@ -3177,17 +3051,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
@@ -3195,17 +3063,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
@@ -3213,17 +3075,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
@@ -3231,17 +3087,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
@@ -3257,17 +3107,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
@@ -3278,17 +3122,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
@@ -3299,17 +3137,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
@@ -3320,17 +3152,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
@@ -3341,17 +3167,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
@@ -3362,17 +3182,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
@@ -3383,17 +3197,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
@@ -3404,17 +3212,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
@@ -3431,41 +3233,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
@@ -3478,17 +3262,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
@@ -3499,17 +3277,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
@@ -3520,17 +3292,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
   !
@@ -3548,17 +3314,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 !      
@@ -3579,17 +3339,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
@@ -3608,17 +3362,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
@@ -3637,17 +3385,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
@@ -3666,17 +3408,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
@@ -3695,17 +3431,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
@@ -3724,17 +3454,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/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90
index 5708c0d4c..2aa49c4a4 100644
--- a/src/MNH/rain_c2r2_khko.f90
+++ b/src/MNH/rain_c2r2_khko.f90
@@ -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 = TFIELDDATA(         &
+!     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 = TFIELDDATA(        &
+    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 = TFIELDDATA(            &
+    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 = TFIELDDATA(            &
+    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/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90
index 80f9ceefd..7aa4136af 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.
@@ -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 = TFIELDDATA(                                       &
+    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 = TFIELDDATA(        &
+    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_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index f051ed739..881e58362 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.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.
@@ -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: tfielddata, tfieldlist
 use mode_field, only: Find_field_id_from_mnhname
 !
 CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
@@ -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 = TFIELDDATA(      &
+    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
@@ -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 = TFIELDDATA(          &
+    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 = TFIELDDATA(    &
+    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)
@@ -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 = TFIELDDATA(          &
+    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       = YDIR1
-  TZFIELD%CCOMMENT   = 'X_Y_'//TRIM(YREC)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-  TZFIELD%LTIMEDEP   = .FALSE.
+  TZFIELD = TFIELDDATA(              &
+    CMNHNAME   = TRIM(YREC),         &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = TRIM(YREC),         &
+    CUNITS     = '',                 &
+    CDIR       = YDIR1,              &
+    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' )
@@ -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 = TFIELDDATA(         &
+    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
@@ -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 = TFIELDDATA(         &
+    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 = TFIELDDATA(                &
+  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 = TFIELDDATA(                &
+  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/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90
index d5c0bbdfe..b898b4bda 100644
--- a/src/MNH/shallow_mf_pack.f90
+++ b/src/MNH/shallow_mf_pack.f90
@@ -395,72 +395,77 @@ end if
 IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   ! stores the conservative potential temperature vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) )
-  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 = TFIELDDATA(              &
+    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,ZWORK)
   !
   ! stores the conservative mixing ratio vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) )
-  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 = TFIELDDATA(                 &
+      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,ZWORK)
   !
   ! 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 = TFIELDDATA(               &
+    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 (OMIXUV) THEN
   ! stores the U momentum vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) )
-  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 = TFIELDDATA(             &
+    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,ZWORK)
   !
   ! stores the V momentum vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) )
-  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 = TFIELDDATA(             &
+    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,ZWORK)
   !
  END IF
diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90
index 4efe246be..40a902d17 100644
--- a/src/MNH/tke_eps_sources.f90
+++ b/src/MNH/tke_eps_sources.f90
@@ -415,58 +415,62 @@ IF ( OTURB_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 = TFIELDDATA(      &
+    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(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 = TFIELDDATA(      &
+    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(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 = TFIELDDATA(      &
+    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(TPFILE,TZFIELD,PTR)
 !
 ! 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 = TFIELDDATA(        &
+    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(TPFILE,TZFIELD,PDISS)
 END IF
 !
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 228241e2c..44178ca88 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -699,28 +699,30 @@ IF (KRRL >=1) THEN
 !
 !
   IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(          &
+      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(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 = TFIELDDATA(          &
+      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(TPFILE,TZFIELD,ZAMOIST)
   END IF
 !
@@ -1152,46 +1154,49 @@ IF ( OTURB_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 = TFIELDDATA(           &
+    CMNHNAME   = 'LM',            &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'LM',            &
+    CUNITS     = 'm',             &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'Mixing length', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,PLEM)
 !
   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 = TFIELDDATA(                              &
+    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(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 = TFIELDDATA(                    &
+    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(TPFILE,TZFIELD,PRT(:,:,:,1))
    END IF
 END IF
@@ -1820,16 +1825,17 @@ ENDIF
 !
 ! Impression before modification of the mixing length
 IF ( OTURB_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 = TFIELDDATA(                &
+    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(TPFILE,TZFIELD,PLEM)
 ENDIF
 !
@@ -1846,27 +1852,30 @@ WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:)
 !              ----------
 !
 IF ( OTURB_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 = TFIELDDATA(             &
+    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(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 = TFIELDDATA(            &
+    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(TPFILE,TZFIELD,ZLM_CLOUD)
   !
 ENDIF
diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90
index c194db611..44392d8fa 100644
--- a/src/MNH/turb_cloud_index.f90
+++ b/src/MNH/turb_cloud_index.f90
@@ -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 = TFIELDDATA(       &
+    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 = TFIELDDATA(           &
+    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 = TFIELDDATA(           &
+    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 = TFIELDDATA(          &
+    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 = TFIELDDATA(           &
+    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 = TFIELDDATA(           &
+    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 = TFIELDDATA(              &
+    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 = TFIELDDATA(             &
+    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/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 2a4a3e98d..a0c5ad948 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -371,16 +371,17 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) -  ZFLX(:,:,IKB)
 CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll)
 IF ( tpfile%lopened .AND. OTURB_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.
+  TZFIELD = TFIELDDATA(         &
+    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
 !
@@ -466,16 +467,17 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll)
 !
 IF ( tpfile%lopened .AND. OTURB_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.
+  TZFIELD = TFIELDDATA(         &
+    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
 !
@@ -553,16 +555,17 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB)
 !
 IF ( tpfile%lopened .AND. OTURB_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.
+  TZFIELD = TFIELDDATA(         &
+    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
 !
diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90
index 163ee3d02..de501f779 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -185,6 +185,7 @@ 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
 REAL :: ZTIME1, ZTIME2
@@ -248,16 +249,18 @@ DO JSV=1,ISV
   !
   ! stores  <U SVth>
   IF ( tpfile%lopened .AND. OTURB_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.
+    WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV
+    TZFIELD = TFIELDDATA(                        &
+      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
 !
@@ -299,16 +302,18 @@ DO JSV=1,ISV
   !
   ! stores  <V SVth>
     IF ( tpfile%lopened .AND. OTURB_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.
+      WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV
+    TZFIELD = TFIELDDATA(                            &
+      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
 !
diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90
index b61948676..d5102212b 100644
--- a/src/MNH/turb_hor_thermo_corr.f90
+++ b/src/MNH/turb_hor_thermo_corr.f90
@@ -266,16 +266,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
   !
   ! stores <THl THl>
   IF ( OTURB_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 = TFIELDDATA(            &
+      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
 !
@@ -354,16 +355,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
     !
     ! stores <THl Rnp>
     IF ( OTURB_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 = TFIELDDATA(             &
+        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
 !
@@ -422,16 +424,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
     !
     ! stores <Rnp Rnp>
     IF ( OTURB_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 = TFIELDDATA(          &
+        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/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90
index 90d189a2b..a4dd3bdee 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -311,16 +311,17 @@ END IF
 !
 ! stores the horizontal  <U THl>
 IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(            &
+    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
 !
@@ -414,16 +415,17 @@ IF (KRR/=0) THEN
   !
   ! stores the horizontal  <U Rnp>
   IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(           &
+      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
   !
@@ -463,16 +465,17 @@ END IF
 !!  !
 !!  ! stores the horizontal  <U VPT>
 !!  IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(            &
+!!      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
 !!!
@@ -566,16 +569,17 @@ END IF
 !
 ! stores the horizontal  <V THl>
 IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(            &
+    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
 !
@@ -678,16 +682,17 @@ IF (KRR/=0) THEN
   !
   ! stores the horizontal  <V Rnp>
   IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(           &
+      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
   !
@@ -731,16 +736,17 @@ END IF
 !!  !
 !!  ! stores the horizontal  <V VPT>
 !!  IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(            &
+!!      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/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90
index 3fcecc20e..112c60c85 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -270,16 +270,17 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) )  &
 !     
 ! stores  <U V>
 IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(          &
+    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/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90
index d19c68bae..f1289d73a 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -220,16 +220,17 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1)
 !
 ! stores  <U W>
 IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(         &
+  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/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index df888c2c7..48f5be9bc 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -222,16 +222,17 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1)
 !
 ! stores  <V W>
 IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA(           &
+    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/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90
index 4117d8191..d7b0f4800 100644
--- a/src/MNH/turb_ver.f90
+++ b/src/MNH/turb_ver.f90
@@ -696,42 +696,46 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) 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 = TFIELDDATA(                      &
+    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(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 = TFIELDDATA(                      &
+    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(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 = TFIELDDATA(                        &
+    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,NSV
     WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90
index 51bc4e7e1..ad27b69f2 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -541,16 +541,17 @@ END IF
 !
 IF ( OTURB_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 = TFIELDDATA(                            &
+    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(TPFILE,TZFIELD,ZFLXZ)
 END IF
 !
@@ -769,16 +770,17 @@ END IF
 !
 IF ( OTURB_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 = TFIELDDATA(                            &
+    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(TPFILE,TZFIELD,ZFLXZ)
 END IF
 !
@@ -906,16 +908,17 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '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 = TFIELDDATA(          &
+    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(TPFILE,TZFIELD,ZFLXZ)
 END IF
 !
diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90
index 23d8bee03..08491bc73 100644
--- a/src/MNH/turb_ver_sv_flux.f90
+++ b/src/MNH/turb_ver_sv_flux.f90
@@ -359,6 +359,7 @@ REAL :: ZTIME1, ZTIME2
 REAL :: ZCSVP = 4.0  ! constant for scalar flux presso-correlation (RS81)
 REAL :: ZCSV          !constant for the scalar flux
 !
+CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME
 TYPE(TFIELDDATA)  :: TZFIELD
 !----------------------------------------------------------------------------
 !
@@ -453,17 +454,19 @@ DO JSV=1,ISV
   !
   IF (OTURB_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 = TFIELDDATA(                        &
+      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(TPFILE,TZFIELD,ZFLXZ)
   END IF
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index bdd074e5c..0175f76c9 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -568,16 +568,17 @@ END IF
   !
   ! stores <THl THl>  
   IF ( OTURB_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 = TFIELDDATA(            &
+      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(TPFILE,TZFIELD,ZFLXZ)
   END IF
 !
@@ -695,16 +696,17 @@ END IF
     END IF
     ! stores <THl Rnp>   
     IF ( OTURB_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 = TFIELDDATA(                 &
+        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(TPFILE,TZFIELD,ZFLXZ)
     END IF
 !
@@ -802,16 +804,17 @@ END IF
     END IF
     ! stores <Rnp Rnp>    
     IF ( OTURB_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 = TFIELDDATA(             &
+        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(TPFILE,TZFIELD,ZFLXZ)
     END IF
     !
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index cf539984e..816cb9a4e 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -753,16 +753,17 @@ END IF
 !
 IF ( OTURB_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 = TFIELDDATA(                                             &
+   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(TPFILE,TZFIELD,ZFLXZ)
 END IF
 !
@@ -989,16 +990,17 @@ IF (KRR /= 0) THEN
   !
   IF ( OTURB_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 = TFIELDDATA(                                     &
+      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(TPFILE,TZFIELD,ZFLXZ)
   END IF
   !
@@ -1078,16 +1080,17 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN
   !                 
   ! store the liquid water mixing ratio vertical flux
   IF ( OTURB_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 = TFIELDDATA(                                     &
+      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(TPFILE,TZFIELD,ZFLXZ)
   END IF
   !  
diff --git a/src/MNH/ver_thermo.f90 b/src/MNH/ver_thermo.f90
index d926e6c26..d7462dd35 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-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.
@@ -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 = TFIELDDATA(       &
+    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
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index f0c790ddd..cc6d8269c 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2001-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-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.
@@ -113,64 +113,69 @@ 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.
+TZFIELD = TFIELDDATA(                      &
+  CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = TRIM(TPFLYER%TITLE)//'LAT', &
+  CUNITS     = 'degree',                   &
+  CDIR       = '--',                       &
+  CCOMMENT   = '',                         &
+  NGRID      = 0,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 0,                          &
+  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.
+TZFIELD = TFIELDDATA(                      &
+  CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
+  CUNITS     = 'degree',                   &
+  CDIR       = '--',                       &
+  CCOMMENT   = '',                         &
+  NGRID      = 0,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 0,                          &
+  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.
+TZFIELD = TFIELDDATA(                      &
+  CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT', &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
+  CUNITS     = 'm',                        &
+  CDIR       = '--',                       &
+  CCOMMENT   = '',                         &
+  NGRID      = 0,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 0,                          &
+  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.
+TZFIELD = TFIELDDATA(                          &
+  CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
+  CSTDNAME   = '',                             &
+  CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
+  CUNITS     = 'm s-1',                        &
+  CDIR       = '--',                           &
+  CCOMMENT   = '',                             &
+  NGRID      = 0,                              &
+  NTYPE      = TYPEREAL,                       &
+  NDIMS      = 0,                              &
+  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.
+TZFIELD = TFIELDDATA(                      &
+  CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO', &
+  CSTDNAME   = '',                         &
+  CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
+  CUNITS     = 'kg m-3',                   &
+  CDIR       = '--',                       &
+  CCOMMENT   = '',                         &
+  NGRID      = 0,                          &
+  NTYPE      = TYPEREAL,                   &
+  NDIMS      = 0,                          &
+  LTIMEDEP   = .TRUE.                      )
 CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO)
 !
 !
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 767541ad9..9f82ff30c 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -108,7 +108,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
                                  tfielddata, 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
@@ -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 = TFIELDDATA(       &
+    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 = TFIELDDATA(       &
+    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 = tfielddata(             &
+          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 = tfielddata(                    &
+          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 )
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 8ad7c4538..46984a2c5 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -408,30 +408,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 = TFIELDDATA(                 &
+  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 = TFIELDDATA(                &
+  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
@@ -488,16 +490,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 = TFIELDDATA(                  &
+  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(:))
@@ -505,16 +508,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 = TFIELDDATA(                  &
+  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(:))
@@ -522,16 +526,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 = TFIELDDATA(                    &
+  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(:))
@@ -564,30 +569,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 = TFIELDDATA(                     &
+      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 = TFIELDDATA(                     &
+      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
@@ -596,16 +603,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 = TFIELDDATA(                  &
+  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 &
@@ -635,28 +643,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.
+  TZFIELD = TFIELDDATA(                  &
+    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%x, [1, Size( tpflyer%x), 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 = TFIELDDATA(                  &
+    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 ), &
@@ -666,28 +676,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.
+  TZFIELD = TFIELDDATA(                  &
+    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%y, [1, Size( tpflyer%y), 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 = TFIELDDATA(                  &
+    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 ), &
@@ -697,28 +709,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.
+  TZFIELD = TFIELDDATA(                  &
+    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%z, [1, Size( tpflyer%z), 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 = TFIELDDATA(                  &
+    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
@@ -730,16 +744,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 = TFIELDDATA(                  &
+  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) ) )
@@ -1480,18 +1495,18 @@ if ( Present( tpflyer ) ) then
     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
+  tzfield = tfielddata(                                     &
+    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%x )
 
diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90
index 74f56e63c..6b9aa7949 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.
@@ -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 = TFIELDDATA(                                       &
+  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 = TFIELDDATA(                                &
+    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 dc3fd036f..f3614c14a 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -213,17 +213,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 = TFIELDDATA(                                          &
+    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)
   !
@@ -268,17 +269,18 @@ 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.
+  TZFIELD = TFIELDDATA(        &
+    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)
 !
   IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 60240e9ca..6f4d6d5c4 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -511,16 +511,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 = TFIELDDATA(                       &
+    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 +531,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) = TFIELDDATA(                            &
+      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) = TFIELDDATA(                               &
+      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
@@ -737,16 +740,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 = TFIELDDATA(              &
+    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
 !
@@ -816,152 +820,164 @@ IF (LHU_FLX) THEN
   ENDIF
   ! Ecriture
   !  composantes U et V du flux surfacique d'humidit�  
-  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.
+  TZFIELD = TFIELDDATA(        &
+    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 = TFIELDDATA(        &
+    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'humidit� int�gr� 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 = TFIELDDATA(        &
+    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 = TFIELDDATA(        &
+    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'humidit�
-  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 = TFIELDDATA(                                         &
+    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'humidit� int�gr� sur 3000 m�tres
-  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 = TFIELDDATA(                                         &
+    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'hydrom�t�ores  
-    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 = TFIELDDATA(        &
+      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 = TFIELDDATA(        &
+      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'hydrom�t�ores int�gr� 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 = TFIELDDATA(        &
+      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 = TFIELDDATA(        &
+      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'hydrom�t�ores
-    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 = TFIELDDATA(                                            &
+      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'hydrom�t�ores int�gr� sur 3000 m�tres
-    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 = TFIELDDATA(                                            &
+      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 +987,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 = TFIELDDATA(                         &
+      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'
@@ -1050,13 +1068,15 @@ 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.
+  TZFIELD = TFIELDDATA(                          &
+    CMNHNAME   = 'generic for scalar variables', & !Temporary name to ease identification
+    CSTDNAME   = '',                             &
+    CUNITS     = 'g kg-1',                       &
+    CDIR       = 'XY',                           &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
   !
   DO JSV = 1,NSV_USER
     WRITE(TZFIELD%CMNHNAME,'(A4,I3.3)')'MRSV',JSV
@@ -1183,31 +1203,33 @@ 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 = TFIELDDATA(        &
+      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 = TFIELDDATA(       &
+      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
@@ -1324,16 +1346,17 @@ 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.
+  TZFIELD = TFIELDDATA(                                                 &
+    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(:,:,:))
   !
   ZWORK21(:,:) = 0.
@@ -1343,16 +1366,17 @@ IF(LBLOWSNOW) THEN
   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.
+  TZFIELD = TFIELDDATA(                                     &
+    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(:,:))
   !
   IF(.NOT.ALLOCATED(ZBET_SNW)) &
@@ -1365,52 +1389,56 @@ IF(LBLOWSNOW) THEN
   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.
+  TZFIELD = TFIELDDATA(            &
+    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%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.
+  TZFIELD = TFIELDDATA(       &
+    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%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.
+  TZFIELD = TFIELDDATA(                  &
+    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%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.
+  TZFIELD = TFIELDDATA(            &
+    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.
@@ -1419,16 +1447,17 @@ IF(LBLOWSNOW) THEN
                    (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.
+  TZFIELD = TFIELDDATA(                                     &
+    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
 ! Lagrangian variables
@@ -1478,6 +1507,7 @@ END IF
 ! linox scalar variables
 IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
   DO JSV = NSV_LNOXBEG,NSV_LNOXEND
+!PW:BUG?: same name for all variables
     TZFIELD%CMNHNAME   = 'LINOXT'
     TZFIELD%CSTDNAME   = ''
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
@@ -2036,27 +2066,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) = TFIELDDATA(                                        &
+      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) = TFIELDDATA(                                           &
+      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
@@ -2079,124 +2111,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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                           &
+      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 = TFIELDDATA(                   &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                        &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                                                 &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                     &
+      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
@@ -2209,23 +2251,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 = TFIELDDATA(               &
+    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%CMNHNAME = 'PRES'
   TZFIELD%CUNITS = 'hPa'
   CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2)
 !
@@ -2248,28 +2291,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 = TFIELDDATA(                     &
+      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 = TFIELDDATA(                                 &
+      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)
     !
@@ -2277,29 +2322,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 = TFIELDDATA(                                &
+        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 = TFIELDDATA(                                         &
+        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
@@ -2331,16 +2378,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 = TFIELDDATA(                                 &
+      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
 !
@@ -2364,16 +2412,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 = TFIELDDATA(                     &
+      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
@@ -2384,28 +2433,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 = TFIELDDATA(                      &
+        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 = TFIELDDATA(                    &
+        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)
@@ -2431,16 +2482,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 = TFIELDDATA(                                    &
+      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
@@ -2457,16 +2509,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 = TFIELDDATA(                                              &
+    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
 !
@@ -2508,16 +2561,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 = TFIELDDATA(                                      &
+      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
 !
@@ -2563,30 +2617,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 = TFIELDDATA(                                                       &
+      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 = TFIELDDATA(                                                       &
+      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
 !
@@ -2600,84 +2656,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 = TFIELDDATA(                            &
+    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 = TFIELDDATA(                            &
+    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) = TFIELDDATA(                                 &
+      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) = TFIELDDATA(                                    &
+      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 = TFIELDDATA(                      &
+    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 = TFIELDDATA(                        &
+    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
@@ -2700,16 +2762,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 = TFIELDDATA(                               &
+    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
 !
@@ -2722,16 +2785,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 = TFIELDDATA(                               &
+    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
@@ -2744,16 +2808,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 = TFIELDDATA(                                       &
+      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
@@ -2768,16 +2833,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 = TFIELDDATA(                                  &
+    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
@@ -2790,16 +2856,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 = TFIELDDATA(                                          &
+      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 
@@ -2815,16 +2882,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 = TFIELDDATA(                                            &
+    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
 !
@@ -2836,29 +2904,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 = TFIELDDATA(                         &
+    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 = TFIELDDATA(                                        &
+      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)
@@ -2884,40 +2954,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 = TFIELDDATA(                       &
+    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 = TFIELDDATA(                               &
+    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 = TFIELDDATA(                          &
+    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
 !
@@ -2961,52 +3034,56 @@ 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 = TFIELDDATA(                                   &
+      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 = TFIELDDATA(                                   &
+      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) = TFIELDDATA(                             &
+        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) = TFIELDDATA(                                &
+        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
@@ -3023,52 +3100,56 @@ 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 = TFIELDDATA(                                    &
+      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 = TFIELDDATA(                                    &
+      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) = TFIELDDATA(                              &
+        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) = TFIELDDATA(                                 &
+        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
@@ -3092,16 +3173,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 = TFIELDDATA(                         &
+    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
 !-------------------------------------------------------------------------------
@@ -3125,16 +3207,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 = TFIELDDATA(                         &
+    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
 !-------------------------------------------------------------------------------
@@ -3150,16 +3233,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 = TFIELDDATA(                          &
+      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
   !
@@ -3170,16 +3254,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 = TFIELDDATA(                          &
+      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
   !
@@ -3190,16 +3275,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 = TFIELDDATA(                         &
+      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
   !
@@ -3210,16 +3296,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 = TFIELDDATA(                  &
+      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
   !
@@ -3230,16 +3317,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 = TFIELDDATA(                   &
+      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
   !
@@ -3250,16 +3338,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 = TFIELDDATA(                      &
+      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
   !
@@ -3270,16 +3359,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 = TFIELDDATA(                   &
+      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
@@ -3311,16 +3401,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 = TFIELDDATA(                                       &
+      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'
@@ -3330,15 +3421,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 = TFIELDDATA(                                                   &
+      CSTDNAME   = '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)
@@ -3376,16 +3469,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 = TFIELDDATA(                                        &
+      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'
@@ -3397,15 +3491,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 = TFIELDDATA(                                                    &
+      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
 !
@@ -3425,65 +3521,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 = TFIELDDATA(                                              &
+    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 = TFIELDDATA(                                     &
+    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 = TFIELDDATA(                                              &
+      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 = TFIELDDATA(                                &
+      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 = TFIELDDATA(     &
+      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
   !
@@ -3492,16 +3593,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 = TFIELDDATA(                           &
+      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
@@ -3524,16 +3626,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 = TFIELDDATA(                            &
+    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
@@ -3550,16 +3653,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 = TFIELDDATA(                                       &
+      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
@@ -3578,41 +3682,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 = TFIELDDATA(                        &
+    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 = TFIELDDATA(                              &
+      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 = TFIELDDATA(                      &
+      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
@@ -3648,52 +3755,56 @@ IF(LRADAR .AND. LUSERR) THEN
                                                          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 = TFIELDDATA(                            &
+    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 = TFIELDDATA(                            &
+    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 = TFIELDDATA(                                   &
+    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 = TFIELDDATA(                                   &
+    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 
@@ -3992,28 +4103,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 = TFIELDDATA(                            &
+    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 = TFIELDDATA(                          &
+    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
@@ -4048,16 +4161,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 = TFIELDDATA(                                 &
+    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)
@@ -4092,16 +4206,17 @@ 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 = TFIELDDATA(                                 &
+    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)
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 94887adeb..456337d78 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -256,16 +256,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 = TFIELDDATA(                           &
+    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,16 +276,17 @@ 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 = TFIELDDATA(                            &
+    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
@@ -456,16 +458,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 = TFIELDDATA(                              &
+    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 +496,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 = TFIELDDATA(                     &
+      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 = TFIELDDATA(                          &
+    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)
@@ -527,16 +532,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 = TFIELDDATA(               &
+    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)
@@ -582,16 +588,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 = TFIELDDATA(                              &
+      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
@@ -603,32 +610,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 = TFIELDDATA(                            &
+      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 = TFIELDDATA(                   &
+      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
@@ -638,16 +647,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 = TFIELDDATA(                              &
+      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
@@ -659,32 +669,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 = TFIELDDATA(                            &
+      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 = TFIELDDATA(                   &
+      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
@@ -694,16 +706,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 = TFIELDDATA(                                       &
+      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
@@ -715,32 +728,34 @@ 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 = TFIELDDATA(                                     &
+      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 = TFIELDDATA(                            &
+      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
@@ -814,28 +829,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 = TFIELDDATA(                                                   &
+      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 = TFIELDDATA(                                                     &
+      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)
@@ -901,138 +918,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) = TFIELDDATA(           &
+      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) = TFIELDDATA(              &
+      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 = TFIELDDATA(               &
+      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 = TFIELDDATA(                  &
+      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 = TFIELDDATA(         &
+      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 = TFIELDDATA(              &
+      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 = TFIELDDATA(                               &
+      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 = TFIELDDATA(                                &
+      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 = TFIELDDATA(                              &
+      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 = TFIELDDATA(                               &
+      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_LWD)
   END IF
 END IF
@@ -1072,12 +1099,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 = TFIELDDATA(    &
+    CMNHNAME   = 'variables at pressure levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
   !
 !
 !*       Standard Variables
@@ -1177,12 +1206,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 = TFIELDDATA(    &
+    CMNHNAME   = 'variables at pot. temp. levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
   !
 !
 !*       Standard Variables
@@ -1279,16 +1310,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 = TFIELDDATA(       &
+    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
@@ -1302,16 +1334,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 = TFIELDDATA(           &
+    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
@@ -1324,48 +1357,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 = TFIELDDATA(                   &
+    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 = TFIELDDATA(                           &
+    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 = TFIELDDATA(              &
+    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
@@ -1389,16 +1425,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 = TFIELDDATA(                         &
+    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
@@ -1406,31 +1443,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 = TFIELDDATA(                         &
+    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 = TFIELDDATA(                         &
+    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)
@@ -1442,16 +1481,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 = TFIELDDATA(                     &
+      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
 !
@@ -1484,16 +1524,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 = TFIELDDATA(               &
+    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
@@ -1514,16 +1555,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 = TFIELDDATA(                &
+    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
 !
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index fdc5c4767..4e80261f8 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -445,15 +445,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 = TFIELDDATA(       &
+  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 :
@@ -491,16 +493,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 = TFIELDDATA(                           &
+    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))
   !
@@ -508,189 +511,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 = TFIELDDATA(                                      &
+    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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                       &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                              &
+    CMNHNAME   = 'generic for mean_count variables', & !Temporary name to ease identification
+    CSTDNAME   = '',                                 &
+    CDIR       = 'XY',                               &
+    NTYPE      = TYPEREAL,                           &
+    NDIMS      = 3,                                  &
+    LTIMEDEP   = .TRUE.                              )
 !
   TZFIELD%NGRID      = 2
 !
@@ -1026,16 +1044,17 @@ 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 = TFIELDDATA(                                          &
+      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)
@@ -1074,16 +1093,17 @@ IF (NSV >=1) THEN
     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 = TFIELDDATA(           &
+      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)
  !
@@ -1487,29 +1507,31 @@ IF (NSV >=1) THEN
   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.
+  TZFIELD = TFIELDDATA(                          &
+    CMNHNAME   = 'NSV.DIM',                      &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'NSV.DIM',                      &
+    CUNITS     = '',                             &
+    CDIR       = '--',                           &
+    CCOMMENT   = 'Number of chemical variables', &
+    NGRID      = 0,                              &
+    NTYPE      = TYPEINT,                        &
+    NDIMS      = 0,                              &
+    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.
+    TZFIELD = TFIELDDATA(       &
+      CMNHNAME   = 'NSV.TITRE', &
+      CSTDNAME   = '',          &
+      CLONGNAME  = 'NSV.TITRE', &
+      CUNITS     = '',          &
+      CDIR       = '--',        &
+      CCOMMENT   = '',          &
+      NGRID      = 0,           &
+      NTYPE      = TYPEINT,     &
+      NDIMS      = 1,           &
+      LTIMEDEP   = .FALSE.      )
     ILREC=LEN(YCHNAMES(1))
     ILENG=ILREC*ICH_NBR
     ALLOCATE(ICH_NAMES(ILENG))
@@ -1610,29 +1632,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 = TFIELDDATA(           &
+!         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 = TFIELDDATA(           &
+!         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
@@ -1928,16 +1952,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 = TFIELDDATA(                                                 &
+        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
@@ -1946,16 +1971,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 = TFIELDDATA(                                     &
+        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
@@ -1967,52 +1993,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 = TFIELDDATA(                                   &
+    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 = TFIELDDATA(                                   &
+    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 = TFIELDDATA(                                    &
+    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 = TFIELDDATA(                               &
+    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    
@@ -2027,160 +2057,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 = TFIELDDATA(                                 &
+      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 = TFIELDDATA(                                        &
+      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 = TFIELDDATA(                                           &
+      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 = TFIELDDATA(                   &
+      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 = TFIELDDATA(                           &
+      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 = TFIELDDATA(                        &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                                                 &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                                                    &
+      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 = TFIELDDATA(                     &
+      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 = TFIELDDATA(                                &
+      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 = TFIELDDATA(                                &
+      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
@@ -2191,56 +2234,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 = TFIELDDATA(                        &
+    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 = TFIELDDATA(                                           &
+      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 = TFIELDDATA(          &
+      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 = TFIELDDATA(         &
+      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
@@ -2248,56 +2295,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 = TFIELDDATA(                        &
+    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 = TFIELDDATA(                                            &
+      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 = TFIELDDATA(          &
+      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 = TFIELDDATA(         &
+      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
@@ -2366,13 +2417,15 @@ 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 = TFIELDDATA(                           &
+      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))
@@ -2389,11 +2442,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 = TFIELDDATA(                                &
+    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'
@@ -2432,11 +2489,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 = TFIELDDATA(                        &
+      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'
@@ -2468,9 +2529,13 @@ SELECT CASE(CMETH_EOL)
 !
   CASE('ALM') ! Actuator Line Method
 !
-    TZFIELD%NGRID      = 1
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%CDIR       = '--'
+    TZFIELD = TFIELDDATA(                       &
+      CMNHNAME   = 'generic for ALM variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                          &
+      CDIR       = '--',                        &
+      NGRID      = 1,                           &
+      NTYPE      = TYPEREAL,                    &
+      LTIMEDEP   = .TRUE.                       )
 !
     TZFIELD%NDIMS      = 1
 !
@@ -2534,9 +2599,13 @@ SELECT CASE(CMETH_EOL)
 !
     IF (MEAN_COUNT /= 0) THEN
 !
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%CDIR       = '--'
+      TZFIELD = TFIELDDATA(                            &
+        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_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 58e08d8dc..21ac274af 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-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.
@@ -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: tfielddata, tfieldlist
 
 use mode_field, only: Find_field_id_from_mnhname
 USE MODE_MSG
@@ -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 = TFIELDDATA(          &
+    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
 !
@@ -641,16 +641,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 = TFIELDDATA(          &
+  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 +672,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 = TFIELDDATA(                         &
+    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
@@ -1527,16 +1530,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 = TFIELDDATA(                &
+    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 +1549,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 = TFIELDDATA(                &
+    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/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90
index b7c97c10a..c6c85422f 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.
@@ -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 = TFIELDDATA(                     &
+    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 = TFIELDDATA(                     &
+    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 = TFIELDDATA(               &
+    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
 !-------------------------------------------------------------------------------
-- 
GitLab


From aaf10ccdcffbe83d906d80022cc1957d70b5333d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 4 Nov 2021 09:14:37 +0100
Subject: [PATCH 015/157] Philippe 04/11/2021: add tfieldmetadata type

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 95 +++++++++++++++++++++++++---
 1 file changed, 85 insertions(+), 10 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index a192ac851..75901ba3d 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -15,6 +15,7 @@
 !  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
 
@@ -215,12 +216,14 @@ type :: tfield_metadata_base
   REAL               :: XVALIDMAX  =  1.E36 !Maximum valid value for real fields
 end type tfield_metadata_base
 
-!Structure describing the characteristics of a field
-TYPE, extends( tfield_metadata_base ) :: TFIELDDATA
+TYPE, extends( tfield_metadata_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)
@@ -250,16 +253,20 @@ integer, save :: NFIELDS_USED = 0
 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE.
 TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST
 
+interface TFIELDMETADATA
+  module procedure :: Fill_tfieldmetadata
+end interface TFIELDMETADATA
+
 interface TFIELDDATA
   module procedure :: Fill_tfielddata
 end interface TFIELDDATA
 
 contains
 
-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)
+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
 
@@ -495,10 +502,78 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits
 
   ! ltimedep
   if ( Present( ltimedep ) ) tpfield%ltimedep = ltimedep
+end function Fill_tfieldmetadata
+
+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()              )
 
-  ! 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.
-  tpfield%nmodelmax = 0
 end function Fill_tfielddata
 
 end module modd_field
-- 
GitLab


From e3e78ff5a77e63f47cbb8d092c4b59d5fb0a3bf0 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 4 Nov 2021 09:55:47 +0100
Subject: [PATCH 016/157] Philippe 04/11/2021: rename tfield_metadata_base ->
 tfieldmetadata_base

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 10 ++--
 src/MNH/les_specn.f90                | 10 ++--
 src/MNH/modd_budget.f90              | 11 ++--
 src/MNH/mode_les_diachro.f90         | 90 ++++++++++++++--------------
 src/MNH/write_aircraft_balloon.f90   |  4 +-
 src/MNH/write_diachro.f90            | 80 ++++++++++++-------------
 src/MNH/write_les_budgetn.f90        | 10 ++--
 src/MNH/write_les_rt_budgetn.f90     | 10 ++--
 src/MNH/write_les_sv_budgetn.f90     | 10 ++--
 src/MNH/write_lesn.f90               | 10 ++--
 src/MNH/write_profilern.f90          | 32 +++++-----
 src/MNH/write_seriesn.f90            |  8 +--
 src/MNH/write_stationn.f90           |  6 +-
 13 files changed, 146 insertions(+), 145 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 75901ba3d..1fa797e41 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -9,8 +9,8 @@
 !  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)
@@ -189,7 +189,7 @@ TYPE TFIELDPTR_T1D
   TYPE(DATE_TIME), DIMENSION(:), POINTER :: DATA => NULL()
 END TYPE TFIELDPTR_T1D
 !
-type :: tfield_metadata_base
+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)
@@ -214,9 +214,9 @@ 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
 
-TYPE, extends( tfield_metadata_base ) :: TFIELDMETADATA
+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?
diff --git a/src/MNH/les_specn.f90 b/src/MNH/les_specn.f90
index 9be8e1f80..7bbdadc48 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/modd_budget.f90 b/src/MNH/modd_budget.f90
index 7442dfd3e..39366e022 100644
--- a/src/MNH/modd_budget.f90
+++ b/src/MNH/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/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index f56b2ce0f..a9dda2c89 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
 !-----------------------------------------------------------------
@@ -658,18 +658,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
 
@@ -703,18 +703,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
 
@@ -760,11 +760,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
@@ -774,7 +774,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
 
@@ -858,11 +858,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
@@ -872,7 +872,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
 
@@ -962,7 +962,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
@@ -971,25 +971,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 )
@@ -1242,7 +1242,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
@@ -1253,8 +1253,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
 !-------------------------------------------------------------------------------
@@ -1277,7 +1277,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
@@ -1286,7 +1286,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
 
@@ -1301,7 +1301,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
 !            ----------------------------------------------------------
@@ -1450,14 +1450,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
 
@@ -1473,7 +1473,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, &
@@ -1486,7 +1486,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
@@ -1500,7 +1500,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/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index e132daa83..cd693d89c 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -179,7 +179,7 @@ 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
+                       tfieldmetadata_base, TYPEREAL
 
 use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
@@ -217,7 +217,7 @@ INTEGER :: IKU, IK
 CHARACTER(LEN=2)  :: INDICE
 INTEGER :: JLOOP
 type(tbudiachrometadata) :: tzbudiachro
-type(tfield_metadata_base), dimension(:), allocatable :: tzfields
+type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 46984a2c5..9265bd855 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -97,7 +97,7 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields,       &
 use modd_aircraft_balloon, only: flyer
 use modd_budget,           only: tbudiachrometadata
 use modd_conf,             only: lpack
-use modd_field,            only: tfield_metadata_base
+use modd_field,            only: tfieldmetadata_base
 use modd_io,               only: tfiledata
 use modd_type_date,        only: date_time
 !
@@ -105,13 +105,13 @@ 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
+type(flyer),                                        intent(in), optional :: tpflyer
 !
 !*       0.1   Local variables
 !              ---------------
@@ -146,7 +146,7 @@ use modd_budget,         only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, n
 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, tfielddata
 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
@@ -161,12 +161,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
+type(flyer),                                        intent(in), optional :: tpflyer
 
 integer, parameter :: LFITITLELGT = 100
 integer, parameter :: LFIUNITLGT = 100
@@ -807,12 +807,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
+type(flyer),                                        intent(in), optional :: tpflyer
 
 character(len=:), allocatable :: ycategory
 character(len=:), allocatable :: ylevelname
@@ -1523,22 +1523,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: tfielddata, 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
@@ -1770,14 +1770,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, tfielddata, tfieldmetadata_base
+
+class(tfieldmetadata_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
 
 integer :: idims
 integer :: jdim
diff --git a/src/MNH/write_les_budgetn.f90 b/src/MNH/write_les_budgetn.f90
index 7827ba184..cb76368d5 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 114d39cda..66df13ade 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 6a3997964..8a412845f 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 e4adb2045..b090d3312 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_profilern.f90 b/src/MNH/write_profilern.f90
index 486978e1c..13d9e1a8e 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -86,7 +86,7 @@ USE MODD_CH_M9_n,         ONLY: CNAMES
 USE MODD_CST,             ONLY: XRV
 USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
 use modd_field,           only: NMNHDIM_LEVEL, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, &
-                                tfield_metadata_base, TYPEREAL
+                                tfieldmetadata_base, TYPEREAL
 USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_LG,              ONLY: CLGNAMES
@@ -111,21 +111,21 @@ INTEGER,          INTENT(IN) :: KI
 !
 !*      0.2  declaration of local variables for diachro
 !
-character(len=2)                                      :: yidx
-character(len=100)                                    :: ycomment
-character(len=100)                                    :: yname
-CHARACTER(LEN=:),                         allocatable :: YGROUP   ! group title
-INTEGER                                               :: IKU
-INTEGER                                               :: IPROC    ! number of variables records
-INTEGER                                               :: JPROC
-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=2)                                     :: yidx
+character(len=100)                                   :: ycomment
+character(len=100)                                   :: yname
+CHARACTER(LEN=:),                        allocatable :: YGROUP   ! group title
+INTEGER                                              :: IKU
+INTEGER                                              :: IPROC    ! number of variables records
+INTEGER                                              :: JPROC
+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(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90
index 54ed6c7c8..62999fff5 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 7efb9adaa..972805565 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -126,7 +126,7 @@ 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
+                       tfieldmetadata_base, TYPEREAL
 
 TYPE(STATION),        INTENT(IN)       :: TSTATION
 INTEGER,              INTENT(IN)       :: II
@@ -151,8 +151,8 @@ INTEGER :: IPROC    ! number of variables records
 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
-- 
GitLab


From 875229abfdf2956a380e93badc4568d7cf2ac86b Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 4 Nov 2021 16:30:42 +0100
Subject: [PATCH 017/157] Philippe 04/11/2021: IO: use field classes (instead
 of type(tfielddata)) for I/O subroutines

---
 src/LIB/SURCOUCHE/src/mode_io_field_read.f90  | 203 +++++++++---------
 src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 154 ++++++-------
 src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90    | 128 +++++------
 src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90    |  96 ++++-----
 src/LIB/SURCOUCHE/src/mode_io_tools.f90       |   6 +-
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90   |   8 +-
 src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90   |  46 ++--
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90   | 167 +++++++-------
 8 files changed, 392 insertions(+), 416 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
index 15bb499d2..f0eb696c9 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_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index b48a37b26..da3889629 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/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
@@ -81,10 +82,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
@@ -177,13 +178,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
@@ -311,14 +312,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 ) )
 
@@ -340,7 +341,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 ) // ': ' &
@@ -443,8 +444,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
@@ -529,7 +530,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 
     !
@@ -632,7 +633,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
@@ -762,7 +763,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
@@ -790,7 +791,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
@@ -821,8 +822,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
@@ -839,7 +840,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
@@ -854,8 +854,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
@@ -871,7 +871,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
@@ -1021,7 +1020,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
@@ -1064,7 +1063,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()
@@ -1102,8 +1101,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)
@@ -1120,7 +1119,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
@@ -1134,8 +1132,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)
@@ -1153,7 +1151,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
@@ -1486,7 +1483,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
@@ -1509,7 +1506,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
@@ -1539,8 +1536,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)
@@ -1559,7 +1556,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
@@ -1574,8 +1570,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)
@@ -1595,7 +1591,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
@@ -1701,7 +1696,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 
     !
@@ -1721,7 +1716,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
@@ -1746,8 +1741,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)
@@ -1760,7 +1755,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
@@ -1770,8 +1764,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)
@@ -1784,7 +1778,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 )
@@ -1874,7 +1867,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 
     !
@@ -1985,7 +1978,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 
     !
@@ -2077,7 +2070,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 
     !
@@ -2189,7 +2182,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 
     !
@@ -2212,7 +2205,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
@@ -2238,8 +2231,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
@@ -2249,7 +2242,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
@@ -2259,8 +2251,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
@@ -2270,7 +2262,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
@@ -2370,7 +2361,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 
     !
@@ -2392,7 +2383,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
@@ -2418,8 +2409,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)
@@ -2430,7 +2421,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
@@ -2440,8 +2430,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)
@@ -2452,7 +2442,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 )
@@ -2548,7 +2537,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
@@ -2571,7 +2560,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
@@ -2601,8 +2590,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)
@@ -2621,7 +2610,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
@@ -2636,8 +2624,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)
@@ -2657,7 +2645,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
@@ -2757,7 +2744,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 
     !
@@ -2849,7 +2836,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 
     !
@@ -2956,7 +2943,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 
     !
@@ -3036,7 +3023,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 
     !
@@ -3140,7 +3127,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 
     !
@@ -3217,7 +3204,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
     !
@@ -3297,7 +3284,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 
@@ -3326,7 +3313,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
@@ -3361,8 +3348,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)
@@ -3373,7 +3360,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 )
@@ -3457,7 +3443,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   !
@@ -3551,7 +3537,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   !
@@ -3645,7 +3631,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   !
@@ -3739,7 +3725,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   ! 
@@ -4249,7 +4235,7 @@ IMPLICIT NONE
 !
 TYPE(TOUTBAK),    INTENT(IN)  :: TPOUTPUT !Output structure
 !
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 #if 0
 INTEGER          :: IKB
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
index f98999c1e..66aab0cef 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 a257e66b8..248257734 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -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
@@ -260,10 +260,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 +315,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 +382,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 +464,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 +536,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 +610,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 +687,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 +765,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 +822,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 +890,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 +972,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 +1042,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 +1112,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 +1199,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 +1268,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 193083863..7346177c4 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
@@ -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,7 +123,7 @@ subroutine IO_Mnhversion_get(tpfile)
   if ( .not. associated( tpfile%tmainfile ) ) then
     imnhversion(:) = 0
     !use tzfield because tfieldlist could be not initialised
-    tzfield = tfielddata(            &
+    tzfield = tfieldmetadata(        &
       cmnhname   = 'MNHVERSION',     &
       cstdname   = '',               &
       clongname  = 'MesoNH version', &
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 50412e8c0..a7d7604f2 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
@@ -253,6 +253,8 @@ USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
 use modd_dyn,           only: xseglen
 use modd_dyn_n,         only: xtstep
+
+!PW: check if all parameters are used...
 use modd_field,         only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V,   &
                               NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME,                                     &
                               NMNHDIM_ONE,  NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX,                        &
@@ -515,7 +517,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 430f06ccf..588ac539b 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 53053069c..4019f6346 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -32,7 +32,7 @@
 #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
@@ -87,7 +87,7 @@ use modd_parameters, only: jphext
 use mode_tools_ll,   only: Get_globaldims_ll
 
 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
@@ -177,7 +177,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
@@ -373,7 +373,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)
@@ -525,7 +525,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
 !
@@ -548,7 +548,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
 !
@@ -574,19 +574,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
 !
@@ -610,7 +610,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
 !
@@ -636,7 +636,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
 !
@@ -662,7 +662,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
 !
@@ -688,7 +688,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
 !
@@ -723,7 +723,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
 !
@@ -773,7 +773,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
 !
@@ -799,7 +799,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
 !
@@ -825,7 +825,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
 !
@@ -851,7 +851,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
 !
@@ -877,7 +877,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
 !
@@ -908,7 +908,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
 !
@@ -942,7 +942,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
 !
@@ -980,7 +980,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
 !
@@ -1017,22 +1017,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.
@@ -1071,24 +1071,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.
@@ -1128,7 +1128,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
@@ -1165,20 +1165,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
 
@@ -1211,7 +1211,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
@@ -1248,7 +1248,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
@@ -1285,20 +1285,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
 
@@ -1331,20 +1331,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
 
@@ -1377,20 +1377,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
 
@@ -2454,8 +2454,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
@@ -2469,9 +2469,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
-- 
GitLab


From 7e2f7f91384e2a856890a2475f10663d2a55ffa5 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 5 Nov 2021 09:16:13 +0100
Subject: [PATCH 018/157] Philippe 05/11/2021: add
 Fill_tfieldmetadata_from_tfielddata constructor

---
 src/LIB/SURCOUCHE/src/modd_field.f90 | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90
index 1fa797e41..2c91243c5 100644
--- a/src/LIB/SURCOUCHE/src/modd_field.f90
+++ b/src/LIB/SURCOUCHE/src/modd_field.f90
@@ -255,6 +255,7 @@ TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST
 
 interface TFIELDMETADATA
   module procedure :: Fill_tfieldmetadata
+  module procedure :: Fill_tfieldmetadata_from_tfielddata
 end interface TFIELDMETADATA
 
 interface TFIELDDATA
@@ -504,6 +505,32 @@ type(tfieldmetadata) function Fill_tfieldmetadata( cmnhname, cstdname, clongname
   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, &
-- 
GitLab


From 0c5bb7c0d4078891eb090d31b866c2ab6a2a1aa6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 5 Nov 2021 11:28:41 +0100
Subject: [PATCH 019/157] Philippe 05/11/2021: IO: use tfieldmetadata instead
 of tfielddata when possible

---
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 |   8 +-
 src/MNH/advection_metsv.f90              |  20 +-
 src/MNH/c2r2_adjust.f90                  |  12 +-
 src/MNH/call_rttov11.f90                 |   6 +-
 src/MNH/call_rttov13.f90                 |   6 +-
 src/MNH/call_rttov8.f90                  |  13 +-
 src/MNH/compare_dad.f90                  |  14 +-
 src/MNH/compute_r00.f90                  |  16 +-
 src/MNH/free_atm_profile.f90             |  12 +-
 src/MNH/ini_aircraft_balloon.f90         |  14 +-
 src/MNH/ini_deep_convection.f90          |  18 +-
 src/MNH/ini_lb.f90                       |  10 +-
 src/MNH/ini_prog_var.f90                 |   4 +-
 src/MNH/ini_size_spawn.f90               |  10 +-
 src/MNH/ini_surf_rad.f90                 |  10 +-
 src/MNH/khko_notadjust.f90               |  10 +-
 src/MNH/lima_adjust.f90                  |   8 +-
 src/MNH/lima_adjust_split.f90            |   8 +-
 src/MNH/lima_ccn_activation.f90          |   9 +-
 src/MNH/lima_notadjust.f90               |   6 +-
 src/MNH/lima_warm_nucl.f90               |   8 +-
 src/MNH/menu_diachro.f90                 |  12 +-
 src/MNH/mnh2lpdm_ech.f90                 |  14 +-
 src/MNH/mnh2lpdm_ini.f90                 |  22 +-
 src/MNH/paspol.f90                       |  22 +-
 src/MNH/prandtl.f90                      |  14 +-
 src/MNH/radiations.f90                   |   8 +-
 src/MNH/rain_c2r2_khko.f90               |  12 +-
 src/MNH/read_dummy_gr_fieldn.f90         |   8 +-
 src/MNH/read_field.f90                   |  30 +--
 src/MNH/read_hgrid.f90                   |  10 +-
 src/MNH/read_hgridn.f90                  |  26 +--
 src/MNH/read_precip_field.f90            |  34 +--
 src/MNH/read_surf_mnh.f90                | 146 ++++++------
 src/MNH/set_grid.f90                     |  10 +-
 src/MNH/shallow_mf_pack.f90              |  14 +-
 src/MNH/spawn_field2.f90                 |   4 +-
 src/MNH/tke_eps_sources.f90              |  12 +-
 src/MNH/turb.f90                         |  20 +-
 src/MNH/turb_cloud_index.f90             |  20 +-
 src/MNH/turb_hor_dyn_corr.f90            |  10 +-
 src/MNH/turb_hor_sv_flux.f90             |   8 +-
 src/MNH/turb_hor_thermo_corr.f90         |  10 +-
 src/MNH/turb_hor_thermo_flux.f90         |  16 +-
 src/MNH/turb_hor_uv.f90                  |   6 +-
 src/MNH/turb_hor_uw.f90                  |   6 +-
 src/MNH/turb_hor_vw.f90                  |   6 +-
 src/MNH/turb_ver.f90                     |  10 +-
 src/MNH/turb_ver_dyn_flux.f90            |  10 +-
 src/MNH/turb_ver_sv_flux.f90             |   6 +-
 src/MNH/turb_ver_thermo_corr.f90         |  10 +-
 src/MNH/turb_ver_thermo_flux.f90         |  10 +-
 src/MNH/uv_to_zonal_and_merid.f90        |  82 +++----
 src/MNH/ver_thermo.f90                   |   6 +-
 src/MNH/write_balloonn.f90               |  18 +-
 src/MNH/write_budget.f90                 |  14 +-
 src/MNH/write_diachro.f90                |  46 ++--
 src/MNH/write_dummy_gr_fieldn.f90        |   8 +-
 src/MNH/write_lbn.f90                    |  10 +-
 src/MNH/write_lfifm1_for_diag.f90        | 268 +++++++++++------------
 src/MNH/write_lfifm1_for_diag_supp.f90   |  88 ++++----
 src/MNH/write_lfin.f90                   | 160 +++++++-------
 src/MNH/write_surf_mnh.f90               |  98 ++++-----
 src/MNH/zsmt_pgd.f90                     |  10 +-
 64 files changed, 788 insertions(+), 788 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 5bca2401c..d60a7fc79 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/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 107970bb1..ec9b54f0c 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -152,7 +152,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
@@ -275,11 +275,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,7 +366,7 @@ 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 = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'CFLU',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'CFLU',       &
@@ -380,7 +380,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU)
 !
   IF (.NOT. L2D) THEN
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'CFLV',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'CFLV',       &
@@ -394,7 +394,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV)
   END IF
 !
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'CFLW',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'CFLW',       &
@@ -407,7 +407,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN
       LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW)
 !
-    TZFIELD = TFIELDDATA(       &
+    TZFIELD = TFIELDMETADATA(   &
       CMNHNAME   = 'CFL',       &
       CSTDNAME   = '',          &
       CLONGNAME  = 'CFL',       &
diff --git a/src/MNH/c2r2_adjust.f90 b/src/MNH/c2r2_adjust.f90
index 0112cd87a..c5e9d27bc 100644
--- a/src/MNH/c2r2_adjust.f90
+++ b/src/MNH/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,7 +405,7 @@ IF ( HRAD /= 'NONE' ) THEN
 END IF
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'NEB',       &
     CSTDNAME   = '',          &
     CLONGNAME  = 'NEB',       &
diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90
index e6a43b03e..c949ca4eb 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,7 +585,7 @@ DO JSAT=1,IJSAT ! loop over sensors
       YEND=YTWO//YCHAN
     END IF
 
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
       CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
       CSTDNAME   = '',                                 &
       CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90
index 5c427dce7..90526ac29 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
@@ -264,7 +264,7 @@ 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
@@ -705,7 +705,7 @@ DO JSAT=1,IJSAT ! loop over sensors
       YUNITS     = '-'
       YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor'
     END IF
-    TZFIELD = TFIELDDATA(                          &
+    TZFIELD = TFIELDMETADATA(                      &
       CMNHNAME   = TRIM( YMNHNAME ),               &
       CSTDNAME   = '',                             &
       CLONGNAME  = 'MesoNH: ' // TRIM( YMNHNAME ), &
diff --git a/src/MNH/call_rttov8.f90 b/src/MNH/call_rttov8.f90
index d38a71c2b..ab370816e 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
@@ -687,7 +688,7 @@ REAL(Kind=jprb), PARAMETER :: o3_mixratio_to_ppmv = 6.03504e+5_JPRB
 INTEGER(Kind=jpim) :: alloc_status(40)
 
 CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 
 ! - End of header --------------------------------------------------------
 !!!----------------------------------------------------------------------------
@@ -1568,7 +1569,7 @@ 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 = TFIELDDATA(                &
+    TZFIELD = TFIELDMETADATA(            &
       CMNHNAME   = TRIM(YINST)//'_ANGL', &
       CSTDNAME   = '',                   &
       CLONGNAME  = TRIM(YINST)//'_ANGL', &
@@ -1629,7 +1630,7 @@ DO JSAT=1,IJSAT ! loop over sensors
       YUNITS     = 'K'
       YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT'
     ENDIF
-    TZFIELD = TFIELDDATA(            &
+    TZFIELD = TFIELDMETADATA(        &
       CMNHNAME   = TRIM( YMNHNAME ), &
       CSTDNAME   = '',               &
       CLONGNAME  = TRIM( YMNHNAME ), &
@@ -1645,7 +1646,7 @@ DO JSAT=1,IJSAT ! loop over sensors
          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 = TFIELDDATA(              &
+      TZFIELD = TFIELDMETADATA(          &
         CMNHNAME   = TRIM(YBEG)//'_UTH', &
         CSTDNAME   = '',                 &
         CLONGNAME  = TRIM(YBEG)//'_UTH', &
@@ -1727,7 +1728,7 @@ DO JSAT=1,IJSAT ! loop over sensors
         END DO
       END DO
       !
-      TZFIELD = TFIELDDATA(                                  &
+      TZFIELD = TFIELDMETADATA(                              &
         CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
         CSTDNAME   = '',                                     &
         CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
@@ -1743,7 +1744,7 @@ DO JSAT=1,IJSAT ! loop over sensors
            MAXVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF)
       CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPK(:,:,:))
       !
-      TZFIELD = TFIELDDATA(                                  &
+      TZFIELD = TFIELDMETADATA(                              &
         CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
         CSTDNAME   = '',                                     &
         CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
diff --git a/src/MNH/compare_dad.f90 b/src/MNH/compare_dad.f90
index fe145cee4..983eb5188 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 85f43d0d2..727b230ff 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -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
@@ -114,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
 !
 !-------------------------------------------------------------------------------
@@ -277,7 +277,7 @@ DO JFILECUR=1,NFILES
   IF (GSTART) THEN
     PRINT *,'INBR_START',INBR_START,' NBRFILES(JFILECUR)',NBRFILES(JFILECUR)
     WRITE(YMNHNAME,'(A2,I2.2)')'X0',INBR_START
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = TRIM( YMNHNAME ),                &
       CSTDNAME   = '',                              &
       CLONGNAME  = TRIM( YMNHNAME ),                &
@@ -292,7 +292,7 @@ DO JFILECUR=1,NFILES
     CALL IO_Field_write(TPFILE,TZFIELD,ZX00(:,:,:))
     !
     WRITE(YMNHNAME,'(A2,I2.2)')'Y0',INBR_START
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = TRIM( YMNHNAME ),                &
       CSTDNAME   = '',                              &
       CLONGNAME  = TRIM(TZFIELD%CMNHNAME),          &
@@ -307,7 +307,7 @@ DO JFILECUR=1,NFILES
     CALL IO_Field_write(TPFILE,TZFIELD,ZY00(:,:,:))
     !
     WRITE(YMNHNAME,'(A2,I2.2)')'Z0',INBR_START
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = TRIM( YMNHNAME ),                &
       CSTDNAME   = '',                              &
       CLONGNAME  = TRIM( YMNHNAME ),                &
@@ -338,7 +338,7 @@ DO JFILECUR=1,NFILES
   IF (GSTART) THEN
     !
     WRITE(YMNHNAME,'(A3,I2.2)')'TH0',INBR_START
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = TRIM( YMNHNAME ),                &
       CSTDNAME   = '',                              &
       CLONGNAME  = TRIM( YMNHNAME ),                &
@@ -353,7 +353,7 @@ DO JFILECUR=1,NFILES
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK1(:,:,:))
     !
     WRITE(YMNHNAME,'(A3,I2.2)')'RV0',INBR_START
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = TRIM( YMNHNAME ),                &
       CSTDNAME   = '',                              &
       CLONGNAME  = TRIM( YMNHNAME ),                &
@@ -370,7 +370,7 @@ DO JFILECUR=1,NFILES
 !*       4.4   compute the origin of the particules using one more segment
 !
   IF (JFILECUR /= NFILES) THEN
-    TZFIELD = TFIELDDATA(    &
+    TZFIELD = TFIELDMETADATA(&
       CMNHNAME   = 'LGXT',   &
       CSTDNAME   = '',       &
       CLONGNAME  = 'LGXT',   &
diff --git a/src/MNH/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90
index 34fefa20a..572dd91d8 100644
--- a/src/MNH/free_atm_profile.f90
+++ b/src/MNH/free_atm_profile.f90
@@ -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,7 +468,7 @@ 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 = TFIELDDATA(                                 &
+  TZFIELD = TFIELDMETADATA(                             &
     CMNHNAME   = 'HBLTOP',                              &
     CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
     CLONGNAME  = 'HBLTOP',                              &
@@ -484,7 +484,7 @@ IF (CPROGRAM == 'DIAG  ' ) THEN
 !*      11.2  Writing of level of boundary layer top
 !             --------------------------------------
 !
-  TZFIELD = TFIELDDATA(                                                    &
+  TZFIELD = TFIELDMETADATA(                                                &
     CMNHNAME   = 'KBLTOP',                                                 &
     CSTDNAME   = 'model_level_number_at_top_of_atmosphere_boundary_layer', &
     CLONGNAME  = 'KBLTOP',                                                 &
@@ -503,7 +503,7 @@ IF (CPROGRAM /= 'DIAG  ' .AND. CPROGRAM /= 'IDEAL ' ) THEN
 !*      11.3  Writing of free atmosphere gradient
 !             -----------------------------------
 !
-  TZFIELD = TFIELDDATA(                      &
+  TZFIELD = TFIELDMETADATA(                  &
     CMNHNAME   = 'FREE_ATM_GR',              &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'FREE_ATM_GR',              &
@@ -525,7 +525,7 @@ 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 = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'THV_FREE',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'THV_FREE',       &
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index f5938cbc1..5d9ea3a67 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -89,7 +89,7 @@ USE MODD_AIRCRAFT_BALLOON
 USE MODD_CONF
 USE MODD_DIAG_FLAG
 USE MODD_DYN_n
-use modd_field,      only: tfielddata, TYPEREAL
+use modd_field,      only: tfieldmetadata, TYPEREAL
 USE MODD_GRID
 USE MODD_IO,         ONLY: TFILEDATA
 USE MODD_LUNIT_n,    ONLY: TLUOUT
@@ -128,7 +128,7 @@ INTEGER :: ISTORE ! number of storage instants
 INTEGER :: ILUOUT ! logical unit
 INTEGER :: IRESP  ! return code
 INTEGER :: JSEG   ! loop counter
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !----------------------------------------------------------------------------
 !
@@ -474,7 +474,7 @@ END IF
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
   ! read the current location in the FM_FILE
   !
-  TZFIELD = TFIELDDATA(                      &
+  TZFIELD = TFIELDMETADATA(                  &
     CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
     CSTDNAME   = '',                         &
     CLONGNAME  = TRIM(TPFLYER%TITLE)//'LAT', &
@@ -490,7 +490,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
   IF ( IRESP /= 0 ) THEN
     WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE
   ELSE
-    TZFIELD = TFIELDDATA(                      &
+    TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
       CSTDNAME   = '',                         &
       CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
@@ -503,7 +503,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
       LTIMEDEP   = .TRUE.                      )
     CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON)
     !
-    TZFIELD = TFIELDDATA(                      &
+    TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT', &
       CSTDNAME   = '',                         &
       CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
@@ -518,7 +518,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
     !
     TPFLYER%P_CUR   = XUNDEF
     !
-    TZFIELD = TFIELDDATA(                          &
+    TZFIELD = TFIELDMETADATA(                      &
       CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
       CSTDNAME   = '',                             &
       CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
@@ -531,7 +531,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
       LTIMEDEP   = .TRUE.                          )
     CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT)
     !
-    TZFIELD = TFIELDDATA(                      &
+    TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO', &
       CSTDNAME   = '',                         &
       CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index 447fac0b0..695d39a4d 100644
--- a/src/MNH/ini_deep_convection.f90
+++ b/src/MNH/ini_deep_convection.f90
@@ -120,7 +120,7 @@ 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_field,           only: tfieldmetadata, tfieldlist, TYPEREAL
 USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_LG,              ONLY: CLGNAMES
@@ -180,10 +180,10 @@ 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
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -233,19 +233,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
@@ -260,7 +260,7 @@ ELSE
 !
  SELECT CASE(HGETSVCONV)
   CASE('READ')
-    TZFIELD = TFIELDDATA(         &
+    TZFIELD = TFIELDMETADATA(     &
       CMNHNAME   = 'generic for ini_deep_convection', & !Temporary name to ease identification
       CUNITS     = 's-1',         &
       CDIR       = 'XY',          &
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index b91b85868..3c610aa2d 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -145,7 +145,7 @@ USE MODD_CTURB
 USE MODD_CONF
 USE MODD_DUST
 USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-use modd_field,           only: tfielddata, TYPELOG, TYPEREAL
+use modd_field,           only: tfieldmetadata, TYPELOG, TYPEREAL
 USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_LG,              ONLY: CLGNAMES
@@ -231,8 +231,8 @@ LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation
 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=2)     :: INDICE ! to index CCN and IFN fields of LIMA scheme
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !
@@ -361,7 +361,7 @@ END SELECT
 !*        2.5 LB-Rx
 !
 IF(KSIZELBXR_ll  > 0 ) THEN
-  TZFIELD = TFIELDDATA(                                          &
+  TZFIELD = TFIELDMETADATA(                                      &
     CMNHNAME   = 'HORELAX_R',                                    &
     CSTDNAME   = '',                                             &
     CLONGNAME  = 'HORELAX_R',                                    &
@@ -390,7 +390,7 @@ IF(KSIZELBXR_ll  > 0 ) THEN
     IL3DY=2*JPHEXT ! 2
   END IF
   !
-  TZFIELD = TFIELDDATA(     &
+  TZFIELD = TFIELDMETADATA( &
     CUNITS     = 'kg kg-1', &
     CDIR       = '',        &
     NGRID      = 1,         &
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 1f099672e..216426209 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -113,7 +113,7 @@ USE MODD_CONF_n
 USE MODD_DIM_n
 USE MODD_DUST
 USE MODD_DYN_n
-use modd_field,            only: TFIELDDATA, TYPEREAL
+use modd_field,            only: TFIELDMETADATA, TYPEREAL
 USE MODD_FIELD_n
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LSFIELD_n
@@ -163,7 +163,7 @@ 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
+TYPE(TFIELDMETADATA)    :: TZFIELD
 TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL()
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90
index 0de2efdb4..abab91578 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-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 @@ 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)
     !
diff --git a/src/MNH/ini_surf_rad.f90 b/src/MNH/ini_surf_rad.f90
index be7c6f342..19b5f8df6 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/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90
index b69b6a18a..74be8f433 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,7 +389,7 @@ END IF
   PNPRO(:,:,:) = ZACT(:,:,:) 
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'SURSAT',    &
     CSTDNAME   = '',          &
     CLONGNAME  = 'SURSAT',    &
@@ -402,7 +402,7 @@ IF ( tpfile%lopened ) THEN
     LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
   !
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'ACT_OD',    &
     CSTDNAME   = '',          &
     CLONGNAME  = 'ACT_OD',    &
diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90
index 0a7f2a4de..d6338d3bf 100644
--- a/src/MNH/lima_adjust.f90
+++ b/src/MNH/lima_adjust.f90
@@ -149,7 +149,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
@@ -284,7 +284,7 @@ INTEGER                           :: JL       ! and PACK intrinsics
 INTEGER                           :: JMOD, JMOD_IFN, JMOD_IMM
 !
 INTEGER , DIMENSION(3) :: BV
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA)  :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -1187,7 +1187,7 @@ IF ( SIZE(PSRCS,3) /= 0 ) THEN
 END IF
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'NEB',       &
     CSTDNAME   = '',          &
     CLONGNAME  = 'NEB',       &
@@ -1243,7 +1243,7 @@ IF ( tpfile%lopened ) THEN
   ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:)
   ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0
 
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'SSI',       &
     CSTDNAME   = '',          &
     CLONGNAME  = 'SSI',       &
diff --git a/src/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90
index 67eefa30b..b1ea3ad39 100644
--- a/src/MNH/lima_adjust_split.f90
+++ b/src/MNH/lima_adjust_split.f90
@@ -153,7 +153,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
@@ -309,7 +309,7 @@ INTEGER                           :: JL       ! and PACK intrinsics
 INTEGER                           :: JMOD, JMOD_IFN, JMOD_IMM
 !
 INTEGER , DIMENSION(3) :: BV
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA)  :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -726,7 +726,7 @@ IF ( OSUBG_COND ) THEN
 END IF ! fin test OSUBG_COND
 
 IF ( tpfile%lopened ) THEN
-   TZFIELD = TFIELDDATA(       &
+   TZFIELD = TFIELDMETADATA(   &
      CMNHNAME   = 'NEB',       &
      CSTDNAME   = '',          &
      CLONGNAME  = 'NEB',       &
@@ -782,7 +782,7 @@ IF ( tpfile%lopened ) THEN
    ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:)
    ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0
    
-   TZFIELD = TFIELDDATA(       &
+   TZFIELD = TFIELDMETADATA(   &
      CMNHNAME   = 'SSI',       &
      CSTDNAME   = '',          &
      CLONGNAME  = 'SSI',       &
diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90
index 2c2902a37..2cbaf374d 100644
--- a/src/MNH/lima_ccn_activation.f90
+++ b/src/MNH/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
@@ -487,8 +487,7 @@ IF ( tpfile%lopened ) THEN
     ZW (:,:,:) = 0.
     ZW2(:,:,:) = 0.
   END IF
-
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'SMAX',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'SMAX',       &
@@ -501,7 +500,7 @@ IF ( tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZW)
   !
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'NACT',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'NACT',       &
diff --git a/src/MNH/lima_notadjust.f90 b/src/MNH/lima_notadjust.f90
index e1eb550e4..9f43f46d0 100644
--- a/src/MNH/lima_notadjust.f90
+++ b/src/MNH/lima_notadjust.f90
@@ -81,7 +81,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
@@ -164,7 +164,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
@@ -566,7 +566,7 @@ END IF
 !
 IF ( tpfile%lopened ) THEN
   ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:)
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'NACT',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'NACT',       &
diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90
index 8f50a8798..ce103114d 100644
--- a/src/MNH/lima_warm_nucl.f90
+++ b/src/MNH/lima_warm_nucl.f90
@@ -110,7 +110,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
@@ -202,7 +202,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
@@ -513,7 +513,7 @@ IF ( tpfile%lopened ) THEN
     ZW2(:,:,:) = 0.
   END IF
 
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'SMAX',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'SMAX',       &
@@ -526,7 +526,7 @@ IF ( tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZW)
   !
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'NACT',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'NACT',       &
diff --git a/src/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90
index 88149a569..f6d0ff1c9 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,7 +115,7 @@ IF(HGROUP == 'END')THEN
 
   ILENG=NMNHNAMELGTMAX*IGROUP
 
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'MENU_BUDGET.DIM', &
     CSTDNAME   = '',                &
     CLONGNAME  = 'MENU_BUDGET.DIM', &
@@ -135,7 +135,7 @@ IF(HGROUP == 'END')THEN
     ENDDO
   ENDDO
 
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'MENU_BUDGET', &
     CSTDNAME   = '',            &
     CLONGNAME  = 'MENU_BUDGET', &
@@ -156,7 +156,7 @@ ELSE IF(HGROUP == 'READ')THEN
   tzfile = tpdiafile
   tzfile%cformat = 'LFI'
 
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'MENU_BUDGET.DIM', &
     CSTDNAME   = '',                &
     CLONGNAME  = 'MENU_BUDGET.DIM', &
@@ -175,7 +175,7 @@ ELSE IF(HGROUP == 'READ')THEN
   ENDIF
 
   ALLOCATE(ITABCHAR(ILENG))
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'MENU_BUDGET', &
     CSTDNAME   = '',            &
     CLONGNAME  = 'MENU_BUDGET', &
diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90
index 62d3d9939..37bd578e9 100644
--- a/src/MNH/mnh2lpdm_ech.f90
+++ b/src/MNH/mnh2lpdm_ech.f90
@@ -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,7 +110,7 @@ CALL IO_Field_read(TPFILE,'WT',     XWT)
 CALL IO_Field_read(TPFILE,'THT',    XTHT)
 CALL IO_Field_read(TPFILE,'TKET',   XTKET)
 
-tzfield = tfielddata(          &
+tzfield = tfieldmetadata(      &
   cmnhname  = 'LM',            &
   clongname = '',              &
   cunits    = 'm',             &
@@ -121,7 +121,7 @@ tzfield = tfielddata(          &
   ndims     = 3                )
 CALL IO_Field_read(TPFILE, tzfield, XLM)
 
-tzfield = tfielddata(    &
+tzfield = tfieldmetadata(&
   cmnhname  = 'THW_FLX', &
   clongname = '',        &
   cunits    = 'K s-1',   & !correct?
@@ -132,7 +132,7 @@ tzfield = tfielddata(    &
   ndims     = 3          )
 CALL IO_Field_read(TPFILE, tzfield, XWPTHP)
 
-tzfield = tfielddata(       &
+tzfield = tfieldmetadata(   &
   cmnhname  = 'DISS',       &
   clongname = '',           &
   cunits    = '',           & !TODO: set units
@@ -143,7 +143,7 @@ tzfield = tfielddata(       &
   ndims     = 3             )
 CALL IO_Field_read(TPFILE, tzfield, XDISSIP)
 
-tzfield = tfielddata(       &
+tzfield = tfieldmetadata(   &
   cmnhname  = 'FMU',        &
   clongname = '',           &
   cunits    = 'kg m-1 s-2', &
@@ -154,7 +154,7 @@ tzfield = tfielddata(       &
   ndims     = 2             )
 CALL IO_Field_read(TPFILE, tzfield, XSFU)
 
-tzfield = tfielddata(       &
+tzfield = tfieldmetadata(   &
   cmnhname  = 'FMV',        &
   clongname = '',           &
   cunits    = 'kg m-1 s-2', &
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index 52a31e084..4993f4c29 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -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,15 +207,15 @@ CALL IO_Field_read(TPFILE1,'ZS',XZS)
 !
 !*	2.8 Rugosite Z0. 
 !
-tzfield = tfielddata(   &
-  cmnhname  = 'Z0',     &
-  clongname = '',       &
-  cunits    = 'm',      &
-  cdir      = 'XY',     &
-  ccomment  = 'X_Y_Z0', &
-  ngrid     = 4,        &
-  ntype     = TYPEREAL, &
-  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/paspol.f90 b/src/MNH/paspol.f90
index 19ef98129..7287cb0b4 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
@@ -143,8 +143,8 @@ REAL    :: ZP, ZTH, ZT, ZRHO, ZMASAIR
 REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZRHOM  ! 
 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,15 +579,15 @@ END DO
 !*	3.4 Ecriture conditionnelle.
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(    &
+  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.    )
+    CSTDNAME   = '',                   &
+    CUNITS     = 'm-3',                &
+    CDIR       = 'XY',                 &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
   !
   DO JSV=1,NSV_PP
     WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index 370e025c4..01e4320f2 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -197,7 +197,7 @@ USE MODD_CST
 USE MODD_CONF
 USE MODD_CTURB
 USE MODD_DYN_n,          ONLY: LOCEAN
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_PARAMETERS
 !
@@ -270,7 +270,7 @@ INTEGER::  JSV                      ! loop index for the scalar variables
 
 INTEGER :: JLOOP
 REAL    :: ZMINVAL
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 ! ---------------------------------------------------------------------------
 !
 !*      1.  DEFAULT VALUES,  1D REDELSPERGER NUMBERS 
@@ -538,7 +538,7 @@ END IF ! end of HTURBDIM if-block
 IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
   !
   ! stores the RED_TH1
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'RED_TH1',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'RED_TH1',       &
@@ -552,7 +552,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1)
   !
   ! stores the RED_R1
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'RED_R1',       &
     CSTDNAME   = '',             &
     CLONGNAME  = 'RED_R1',       &
@@ -566,7 +566,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,PREDR1)
   !
   ! stores the RED2_TH3
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'RED2_TH3',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'RED2_TH3',       &
@@ -580,7 +580,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3)
   !
   ! stores the RED2_R3
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'RED2_R3',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'RED2_R3',       &
@@ -594,7 +594,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3)
   !
   ! stores the RED2_THR3
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'RED2_THR3',       &
     CSTDNAME   = '',                &
     CLONGNAME  = 'RED2_THR3',       &
diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90
index b6151ba3f..809d0d6f0 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.f90
@@ -133,7 +133,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
@@ -535,7 +535,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) :: TZFIELD2D, TZFIELD3D
+TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D
 !
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST
 REAL :: ZMINVAL
@@ -2684,7 +2684,7 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
   ZSTORE_3D2(:,:,:) = 0.0
   ZSTORE_2D(:,:)   = 0.0
   !
-  TZFIELD2D = TFIELDDATA(                     &
+  TZFIELD2D = TFIELDMETADATA(                 &
     CMNHNAME   = 'generic 2D for radiations', & !Temporary name to ease identification
     CSTDNAME   = '',                          &
     CDIR       = 'XY',                        &
@@ -2693,7 +2693,7 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
     NDIMS      = 2,                           &
     LTIMEDEP   = .TRUE.                       )
 
-  TZFIELD3D = TFIELDDATA(                     &
+  TZFIELD3D = TFIELDMETADATA(                 &
     CMNHNAME   = 'generic 3D for radiations', & !Temporary name to ease identification
     CSTDNAME   = '',                          &
     CDIR       = 'XY',                        &
diff --git a/src/MNH/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90
index 2aa49c4a4..cc19dbbf0 100644
--- a/src/MNH/rain_c2r2_khko.f90
+++ b/src/MNH/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,7 +595,7 @@ end if
 !!
 !!
 ! IF ( tpfile%lopened ) THEN
-!   TZFIELD = TFIELDDATA(         &
+!   TZFIELD = TFIELDMETADATA(     &
 !     CMNHNAME   = 'ZCHEN',       &
 !     CSTDNAME   = '',            &
 !     CLONGNAME  = 'ZCHEN',       &
@@ -879,7 +879,7 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:))
 ! END IF
 !                      
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'SMAX',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'SMAX',       &
@@ -1898,7 +1898,7 @@ DO JN = 1 , KSPLITR
   END IF
 !   
  IF ( OSEDC .AND. tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'SEDFLUXC',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'SEDFLUXC',       &
@@ -1911,7 +1911,7 @@ DO JN = 1 , KSPLITR
     LTIMEDEP   = .TRUE.            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC)
   !
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'SEDFLUXR',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'SEDFLUXR',       &
diff --git a/src/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90
index 7aa4136af..edb10fbbf 100644
--- a/src/MNH/read_dummy_gr_fieldn.f90
+++ b/src/MNH/read_dummy_gr_fieldn.f90
@@ -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,7 +147,7 @@ END IF
 !
 !
 IF (TPINIFILE%NMNHVERSION(1)>=4) THEN
-  TZFIELD = TFIELDDATA(                                       &
+  TZFIELD = TFIELDMETADATA(                                   &
     CMNHNAME   = 'DUMMY_GR_NBR',                              &
     CSTDNAME   = '',                                          &
     CLONGNAME  = 'DUMMY_GR_NBR',                              &
@@ -177,7 +177,7 @@ 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 = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = TRIM(YRECFM), &
     CSTDNAME   = '',           &
     CLONGNAME  = TRIM(YRECFM), &
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 1f8d4b3ca..90b6c3552 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -274,7 +274,7 @@ USE MODD_CTURB
 USE MODD_DUST
 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
@@ -424,7 +424,7 @@ CHARACTER(LEN=2)             :: INDICE
 CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
 CHARACTER(LEN=15)            :: YVAL
 REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
-TYPE(TFIELDDATA)             :: TZFIELD
+TYPE(TFIELDMETADATA)         :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -443,27 +443,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
@@ -478,7 +478,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
@@ -512,7 +512,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
@@ -526,7 +526,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
@@ -540,7 +540,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
@@ -554,7 +554,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
@@ -568,7 +568,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
@@ -582,7 +582,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
@@ -596,7 +596,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
diff --git a/src/MNH/read_hgrid.f90 b/src/MNH/read_hgrid.f90
index c695be83b..30a92650b 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 41385f588..d75ca9bba 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-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.
@@ -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
@@ -106,21 +106,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
 !
@@ -279,12 +279,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 b8181b6d3..798985578 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(PINPRC) /= 0 .AND. (LDEPOSC .OR. LDEPOC .OR. MDEPOC) ) 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 881e58362..17648717d 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
+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,7 +71,7 @@ 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 = TFIELDDATA(      &
+  TPFIELD = TFIELDMETADATA(  &
     CMNHNAME   = TRIM(HREC), &
     CSTDNAME   = '',         &
     CLONGNAME  = TRIM(HREC), &
@@ -140,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
@@ -164,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))
@@ -202,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)
       !
@@ -290,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,    &
@@ -336,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))
@@ -391,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
@@ -411,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
@@ -431,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
@@ -451,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
@@ -580,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
@@ -610,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))
@@ -716,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,    &
@@ -765,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))
@@ -809,7 +809,7 @@ CALL IO_Field_read(TPINFILE,'BUG',    IBUGFIX)
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'COVER_PACKED', &
     CSTDNAME   = '',             &
     CLONGNAME  = 'COVER_PACKED', &
@@ -825,7 +825,7 @@ END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
   ICOVER=0
-  TZFIELD = TFIELDDATA(    &
+  TZFIELD = TFIELDMETADATA(&
     CMNHNAME   = 'generic no COVER_PACKED', & !Temporary name to ease identification
     CSTDNAME   = '',       &
     CUNITS     = '',       &
@@ -913,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,    &
@@ -961,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))
@@ -1006,7 +1006,7 @@ CALL IO_Field_read(TPINFILE,'BUG',    IBUGFIX)
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'COVER_PACKED', &
     CSTDNAME   = '',             &
     CLONGNAME  = 'COVER_PACKED', &
@@ -1022,7 +1022,7 @@ END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
   WRITE(YREC,'(A5,I3.3)') 'COVER',KCOVER
-  TZFIELD = TFIELDDATA(              &
+  TZFIELD = TFIELDMETADATA(          &
     CMNHNAME   = TRIM(YREC),         &
     CSTDNAME   = '',                 &
     CLONGNAME  = TRIM(YREC),         &
@@ -1098,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
 
@@ -1118,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
 !
 !-------------------------------------------------------------------------------
 !
@@ -1193,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
 !
@@ -1224,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))
@@ -1302,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
 
@@ -1323,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
 !----------------------------------------------------------------------------
@@ -1457,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
 !
@@ -1483,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))
 !
@@ -1573,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
@@ -1592,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))
 !
@@ -1669,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
 
@@ -1697,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))
@@ -1710,7 +1710,7 @@ 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 = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'STORAGETYPE', &
     CSTDNAME   = '',            &
     CLONGNAME  = 'STORAGETYPE', &
@@ -1793,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
@@ -1822,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))
@@ -1834,7 +1834,7 @@ 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 = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'STORAGETYPE', &
     CSTDNAME   = '',            &
     CLONGNAME  = 'STORAGETYPE', &
@@ -1858,7 +1858,7 @@ END IF
 !  RETURN
 !END IF
 !
-TZFIELD = TFIELDDATA(                &
+TZFIELD = TFIELDMETADATA(            &
   CMNHNAME   = TRIM(HREC)//'%TDATE', &
   CSTDNAME   = '',                   &
   CLONGNAME  = TRIM(HREC)//'%TDATE', &
@@ -1884,7 +1884,7 @@ IF (KRESP /=0) THEN
   WRITE(ILUOUT,*) ' '
 ENDIF
 !
-TZFIELD = TFIELDDATA(                &
+TZFIELD = TFIELDMETADATA(            &
   CMNHNAME   = TRIM(HREC)//'%xtime', &
   CSTDNAME   = '',                   &
   CLONGNAME  = TRIM(HREC)//'%xtime', &
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index 80b75a187..3945848c8 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.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.
@@ -214,7 +214,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
@@ -299,7 +299,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
@@ -336,12 +336,12 @@ IF (.NOT.LCARTESIAN) THEN
   !
   ELSE                     
     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)
     !
diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90
index b898b4bda..47816c603 100644
--- a/src/MNH/shallow_mf_pack.f90
+++ b/src/MNH/shallow_mf_pack.f90
@@ -129,7 +129,7 @@ use modd_budget,          only: lbudget_u, lbudget_v, lbudget_th, lbudget_rv, lb
 USE MODD_CONF
 USE MODD_CST
 USE MODD_IO,              ONLY: TFILEDATA
-use modd_field,           only: tfielddata, TYPEREAL
+use modd_field,           only: tfieldmetadata, TYPEREAL
 USE MODD_NSV
 USE MODD_PARAMETERS
 USE MODD_PARAM_ICE,       ONLY: CFRAC_ICE_SHALLOW_MF
@@ -258,7 +258,7 @@ REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT
 INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV  
 INTEGER :: JK,JRR,JSV                          ! Loop counters
 
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !------------------------------------------------------------------------
 
 !!! 1. Initialisation
@@ -395,7 +395,7 @@ end if
 IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   ! stores the conservative potential temperature vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) )
-  TZFIELD = TFIELDDATA(              &
+  TZFIELD = TFIELDMETADATA(          &
     CMNHNAME   = 'MF_THW_FLX',       &
     CSTDNAME   = '',                 &
     CLONGNAME  = 'MF_THW_FLX',       &
@@ -410,7 +410,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   !
   ! stores the conservative mixing ratio vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) )
-    TZFIELD = TFIELDDATA(                 &
+    TZFIELD = TFIELDMETADATA(             &
       CMNHNAME   = 'MF_RCONSW_FLX',       &
       CSTDNAME   = '',                    &
       CLONGNAME  = 'MF_RCONSW_FLX',       &
@@ -424,7 +424,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
   !
   ! stores the theta_v vertical flux
-  TZFIELD = TFIELDDATA(               &
+  TZFIELD = TFIELDMETADATA(           &
     CMNHNAME   = 'MF_THVW_FLX',       &
     CSTDNAME   = '',                  &
     CLONGNAME  = 'MF_THVW_FLX',       &
@@ -440,7 +440,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN
  IF (OMIXUV) THEN
   ! stores the U momentum vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) )
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'MF_UW_FLX',       &
     CSTDNAME   = '',                &
     CLONGNAME  = 'MF_UW_FLX',       &
@@ -455,7 +455,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN
   !
   ! stores the V momentum vertical flux
   ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) )
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'MF_VW_FLX',       &
     CSTDNAME   = '',                &
     CLONGNAME  = 'MF_VW_FLX',       &
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 44aa7c3ce..360cb0e0e 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -172,7 +172,7 @@ USE MODD_CST
 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
@@ -279,7 +279,7 @@ LOGICAL :: GUSERV
 !
 CHARACTER(LEN=15) :: YVAL
 CHARACTER(LEN=2)  :: INDICE
-TYPE(TFIELDDATA)             :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90
index 40a902d17..d2df4fcf7 100644
--- a/src/MNH/tke_eps_sources.f90
+++ b/src/MNH/tke_eps_sources.f90
@@ -177,7 +177,7 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_CTURB
 USE MODD_DIAG_IN_RUN,    ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES
 USE MODD_PARAMETERS
@@ -255,7 +255,7 @@ INTEGER             :: IIU,IJU,IKU  ! array size in the 3 dimensions
 !
 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
 !
 !----------------------------------------------------------------------------
 NULLIFY(TZFIELDDISS_ll)
@@ -415,7 +415,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the dynamic production 
 !
-  TZFIELD = TFIELDDATA(      &
+  TZFIELD = TFIELDMETADATA(  &
     CMNHNAME   = 'DP',       &
     CSTDNAME   = '',         &
     CLONGNAME  = 'DP',       &
@@ -430,7 +430,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the thermal production 
 !
-  TZFIELD = TFIELDDATA(      &
+  TZFIELD = TFIELDMETADATA(  &
     CMNHNAME   = 'TP',       &
     CSTDNAME   = '',         &
     CLONGNAME  = 'TP',       &
@@ -445,7 +445,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the whole turbulent transport
 !
-  TZFIELD = TFIELDDATA(      &
+  TZFIELD = TFIELDMETADATA(  &
     CMNHNAME   = 'TR',       &
     CSTDNAME   = '',         &
     CLONGNAME  = 'TR',       &
@@ -460,7 +460,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the dissipation of TKE 
 !
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'DISS',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'DISS',       &
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 44178ca88..639cd19a0 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -360,7 +360,7 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_CTURB
 USE MODD_DYN_n, ONLY : LOCEAN
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_LES
 USE MODD_NSV
@@ -557,7 +557,7 @@ REAL                :: ZALPHA       ! work coefficient :
 REAL :: ZTIME1, ZTIME2
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3))::  ZSHEAR, ZDUDZ, ZDVDZ
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !------------------------------------------------------------------------------------------
 ALLOCATE (                                                        &
@@ -699,7 +699,7 @@ IF (KRRL >=1) THEN
 !
 !
   IF ( tpfile%lopened .AND. OTURB_DIAG ) THEN
-    TZFIELD = TFIELDDATA(          &
+    TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'ATHETA',       &
       CSTDNAME   = '',             &
       CLONGNAME  = 'ATHETA',       &
@@ -712,7 +712,7 @@ IF (KRRL >=1) THEN
       LTIMEDEP   = .TRUE.          )
     CALL IO_Field_write(TPFILE,TZFIELD,ZATHETA)
 !
-    TZFIELD = TFIELDDATA(          &
+    TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'AMOIST',       &
       CSTDNAME   = '',             &
       CLONGNAME  = 'AMOIST',       &
@@ -1154,7 +1154,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 ! 
 ! stores the mixing length
 ! 
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'LM',            &
     CSTDNAME   = '',              &
     CLONGNAME  = 'LM',            &
@@ -1171,7 +1171,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the conservative potential temperature
 !
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
     CMNHNAME   = 'THLM',                               &
     CSTDNAME   = '',                                   &
     CLONGNAME  = 'THLM',                               &
@@ -1186,7 +1186,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
 !
 ! stores the conservative mixing ratio
 !
-    TZFIELD = TFIELDDATA(                    &
+    TZFIELD = TFIELDMETADATA(                &
     CMNHNAME   = 'RNPM',                     &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'RNPM',                     &
@@ -1825,7 +1825,7 @@ ENDIF
 !
 ! Impression before modification of the mixing length
 IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(                &
+  TZFIELD = TFIELDMETADATA(            &
     CMNHNAME   = 'LM_CLEAR_SKY',       &
     CSTDNAME   = '',                   &
     CLONGNAME  = 'LM_CLEAR_SKY',       &
@@ -1852,7 +1852,7 @@ WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:)
 !              ----------
 !
 IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'COEF_AMPL',       &
     CSTDNAME   = '',                &
     CLONGNAME  = 'COEF_AMPL',       &
@@ -1865,7 +1865,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.             )
   CALL IO_Field_write(TPFILE,TZFIELD,ZCOEF_AMPL)
   !
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'LM_CLOUD',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'LM_CLOUD',       &
diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90
index 44392d8fa..18c0e8ffb 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,7 +244,7 @@ ENDDO
 !*       2.5    Writing
 !
 IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'RVCI',      &
     CSTDNAME   = '',          &
     CLONGNAME  = 'RVCI',      &
@@ -257,7 +257,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.       )
   CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI)
   !
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'GX_RVCI',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'GX_RVCI',       &
@@ -270,7 +270,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1))
   !
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'GY_RVCI',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'GY_RVCI',       &
@@ -283,7 +283,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2))
   !
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'GNORM_RVCI',   &
     CSTDNAME   = '',             &
     CLONGNAME  = 'GNORM_RVCI',   &
@@ -296,7 +296,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.          )
   CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI)
   !
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'QX_RVCI',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'QX_RVCI',       &
@@ -309,7 +309,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1))
   !
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'QY_RVCI',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'QY_RVCI',       &
@@ -322,7 +322,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.           )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2))
   !
-  TZFIELD = TFIELDDATA(              &
+  TZFIELD = TFIELDMETADATA(          &
     CMNHNAME   = 'QNORM_RVCI',       &
     CSTDNAME   = '',                 &
     CLONGNAME  = 'QNORM_RVCI',       &
@@ -335,7 +335,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN
     LTIMEDEP   = .TRUE.              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI)
   !
-  TZFIELD = TFIELDDATA(             &
+  TZFIELD = TFIELDMETADATA(         &
     CMNHNAME   = 'CEI',             &
     CSTDNAME   = '',                &
     CLONGNAME  = 'CEI',             &
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index a0c5ad948..8c9cb916f 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -144,7 +144,7 @@ USE MODD_ARGSLIST_ll,    ONLY: LIST_ll
 USE MODD_CST
 USE MODD_CONF
 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
@@ -256,7 +256,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
@@ -371,7 +371,7 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) -  ZFLX(:,:,IKB)
 CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll)
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
   ! stores <U U>  
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'U_VAR',       &
     CSTDNAME   = '',            &
     CLONGNAME  = 'U_VAR',       &
@@ -467,7 +467,7 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll)
 !
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
   ! stores <V V>  
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'V_VAR',       &
     CSTDNAME   = '',            &
     CLONGNAME  = 'V_VAR',       &
@@ -555,7 +555,7 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB)
 !
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
   ! stores <W W>  
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
     CMNHNAME   = 'W_VAR',       &
     CSTDNAME   = '',            &
     CLONGNAME  = 'W_VAR',       &
diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90
index de501f779..c7db4b4b9 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -113,7 +113,7 @@ END MODULE MODI_TURB_HOR_SV_FLUX
 USE MODD_CST
 USE MODD_CONF
 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_NSV,            ONLY: NSV_LGBEG, NSV_LGEND
@@ -187,7 +187,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF
 !
 CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME
 INTEGER :: IKU
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 REAL :: ZTIME1, ZTIME2
 ! ---------------------------------------------------------------------------
 !
@@ -250,7 +250,7 @@ DO JSV=1,ISV
   ! stores  <U SVth>
   IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
     WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV
-    TZFIELD = TFIELDDATA(                        &
+    TZFIELD = TFIELDMETADATA(                    &
       CMNHNAME   = TRIM( YMNHNAME ),             &
       CSTDNAME   = '',                           &
       CLONGNAME  = TRIM( YMNHNAME ),             &
@@ -303,7 +303,7 @@ DO JSV=1,ISV
   ! stores  <V SVth>
     IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
       WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV
-    TZFIELD = TFIELDDATA(                            &
+    TZFIELD = TFIELDMETADATA(                        &
       CMNHNAME   = TRIM( YMNHNAME ),                 &
       CSTDNAME   = '',                               &
       CLONGNAME  = TRIM(TZFIELD%CMNHNAME),           &
diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90
index d5102212b..a59829330 100644
--- a/src/MNH/turb_hor_thermo_corr.f90
+++ b/src/MNH/turb_hor_thermo_corr.f90
@@ -121,7 +121,7 @@ END MODULE MODI_TURB_HOR_THERMO_CORR
 USE MODD_CST
 USE MODD_CONF
 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
@@ -197,7 +197,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
 !
 ! ---------------------------------------------------------------------------
 !
@@ -266,7 +266,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
   !
   ! stores <THl THl>
   IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-    TZFIELD = TFIELDDATA(            &
+    TZFIELD = TFIELDMETADATA(        &
       CMNHNAME   = 'THL_HVAR',       &
       CSTDNAME   = '',               &
       CLONGNAME  = 'THL_HVAR',       &
@@ -355,7 +355,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
     !
     ! stores <THl Rnp>
     IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-      TZFIELD = TFIELDDATA(             &
+      TZFIELD = TFIELDMETADATA(         &
         CMNHNAME   = 'THLR_HCOR',       &
         CSTDNAME   = '',                &
         CLONGNAME  = 'THLR_HCOR',       &
@@ -424,7 +424,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) &
     !
     ! stores <Rnp Rnp>
     IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-      TZFIELD = TFIELDDATA(          &
+      TZFIELD = TFIELDMETADATA(      &
         CMNHNAME   = 'R_HVAR',       &
         CSTDNAME   = '',             &
         CLONGNAME  = 'R_HVAR',       &
diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90
index a4dd3bdee..66191d4f5 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -130,7 +130,7 @@ END MODULE MODI_TURB_HOR_THERMO_FLUX
 USE MODD_CST
 USE MODD_CONF
 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
@@ -214,7 +214,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
@@ -311,7 +311,7 @@ END IF
 !
 ! stores the horizontal  <U THl>
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'UTHL_FLX',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'UTHL_FLX',       &
@@ -415,7 +415,7 @@ IF (KRR/=0) THEN
   !
   ! stores the horizontal  <U Rnp>
   IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-    TZFIELD = TFIELDDATA(           &
+    TZFIELD = TFIELDMETADATA(       &
       CMNHNAME   = 'UR_FLX',        &
       CSTDNAME   = '',              &
       CLONGNAME  = 'UR_FLX',        &
@@ -465,7 +465,7 @@ END IF
 !!  !
 !!  ! stores the horizontal  <U VPT>
 !!  IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-!!    TZFIELD = TFIELDDATA(            &
+!!    TZFIELD = TFIELDMETADATA(        &
 !!      CMNHNAME   = 'UVPT_FLX',       &
 !!      CSTDNAME   = '',               &
 !!      CLONGNAME  = 'UVPT_FLX',       &
@@ -569,7 +569,7 @@ END IF
 !
 ! stores the horizontal  <V THl>
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'VTHL_FLX',       &
     CSTDNAME   = '',               &
     CLONGNAME  = 'VTHL_FLX',       &
@@ -682,7 +682,7 @@ IF (KRR/=0) THEN
   !
   ! stores the horizontal  <V Rnp>
   IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-    TZFIELD = TFIELDDATA(           &
+    TZFIELD = TFIELDMETADATA(       &
       CMNHNAME   = 'VR_FLX',        &
       CSTDNAME   = '',              &
       CLONGNAME  = 'VR_FLX',        &
@@ -736,7 +736,7 @@ END IF
 !!  !
 !!  ! stores the horizontal  <V VPT>
 !!  IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-!!    TZFIELD = TFIELDDATA(            &
+!!    TZFIELD = TFIELDMETADATA(        &
 !!      CMNHNAME   = 'VVPT_FLX',       &
 !!      CSTDNAME   = '',               &
 !!      CLONGNAME  = 'VVPT_FLX',       &
diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90
index 112c60c85..6c09be2ea 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -126,7 +126,7 @@ END MODULE MODI_TURB_HOR_UV
 USE MODD_CST
 USE MODD_CONF
 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
@@ -208,7 +208,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
@@ -270,7 +270,7 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) )  &
 !     
 ! stores  <U V>
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'UV_FLX',       &
     CSTDNAME   = '',             &
     CLONGNAME  = 'UV_FLX',       &
diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90
index f1289d73a..9f467784e 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -117,7 +117,7 @@ END MODULE MODI_TURB_HOR_UW
 USE MODD_CST
 USE MODD_CONF
 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
@@ -187,7 +187,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
@@ -220,7 +220,7 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1)
 !
 ! stores  <U W>
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-  TZFIELD = TFIELDDATA(         &
+  TZFIELD = TFIELDMETADATA(     &
   CMNHNAME   = 'UW_HFLX',       &
   CSTDNAME   = '',              &
   CLONGNAME  = 'UW_HFLX',       &
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 48f5be9bc..92939a549 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -113,7 +113,7 @@ END MODULE MODI_TURB_HOR_VW
 USE MODD_CST
 USE MODD_CONF
 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
@@ -182,7 +182,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
@@ -222,7 +222,7 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1)
 !
 ! stores  <V W>
 IF ( tpfile%lopened .AND. OTURB_FLX ) THEN
-  TZFIELD = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'VW_HFLX',       &
     CSTDNAME   = '',              &
     CLONGNAME  = 'VW_HFLX',       &
diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90
index d7b0f4800..f701567c8 100644
--- a/src/MNH/turb_ver.f90
+++ b/src/MNH/turb_ver.f90
@@ -320,7 +320,7 @@ END MODULE MODI_TURB_VER
 USE MODD_CST
 USE MODD_CTURB
 USE MODD_DYN_n,          ONLY: LOCEAN
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_PARAMETERS
 USE MODD_LES
@@ -475,7 +475,7 @@ INTEGER :: IKB,IKE   ! index value for the Beginning
 INTEGER :: JSV       ! loop counter on scalar variables
 REAL    :: ZTIME1
 REAL    :: ZTIME2
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !----------------------------------------------------------------------------
 ALLOCATE (      ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))    ,&
        ZSQRT_TKE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& 
@@ -696,7 +696,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
 !
 ! stores the Turbulent Prandtl number
 ! 
-  TZFIELD = TFIELDDATA(                      &
+  TZFIELD = TFIELDMETADATA(                  &
     CMNHNAME   = 'PHI3',                     &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'PHI3',                     &
@@ -711,7 +711,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
 !
 ! stores the Turbulent Schmidt number
 ! 
-  TZFIELD = TFIELDDATA(                      &
+  TZFIELD = TFIELDMETADATA(                  &
     CMNHNAME   = 'PSI3',                     &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'PSI3',                     &
@@ -727,7 +727,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
 !
 ! stores the Turbulent Schmidt number for the scalar variables
 ! 
-  TZFIELD = TFIELDDATA(                        &
+  TZFIELD = TFIELDMETADATA(                    &
     CMNHNAME   = 'generic for SV in turb_ver', & !Temporary name to ease identification
     CSTDNAME   = '',                           &
     CUNITS     = '1',                          &
diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90
index ad27b69f2..fcf13abe7 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -290,7 +290,7 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_CTURB
 USE MODD_DYN_n,          ONLY: LOCEAN
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES
 USE MODD_NSV
@@ -404,7 +404,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, &
 INTEGER             :: IIU,IJU      ! size of array in x,y,z directions
 !
 REAL :: ZTIME1, ZTIME2
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !----------------------------------------------------------------------------
 !
 !*       1.   PRELIMINARIES
@@ -541,7 +541,7 @@ END IF
 !
 IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
   ! stores the U wind component vertical flux
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'UW_VFLX',                        &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'UW_VFLX',                        &
@@ -770,7 +770,7 @@ END IF
 !
 IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
   ! stores the V wind component vertical flux
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'VW_VFLX',                        &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'VW_VFLX',                        &
@@ -908,7 +908,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN
   ! to be tested &
   !   +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) 
   ! stores the W variance
-  TZFIELD = TFIELDDATA(          &
+  TZFIELD = TFIELDMETADATA(      &
     CMNHNAME   = 'W_VVAR',       &
     CSTDNAME   = '',             &
     CLONGNAME  = 'W_VVAR',       &
diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90
index 08491bc73..8a742e185 100644
--- a/src/MNH/turb_ver_sv_flux.f90
+++ b/src/MNH/turb_ver_sv_flux.f90
@@ -270,7 +270,7 @@ END MODULE MODI_TURB_VER_SV_FLUX
 !
 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
@@ -360,7 +360,7 @@ REAL :: ZCSVP = 4.0  ! constant for scalar flux presso-correlation (RS81)
 REAL :: ZCSV          !constant for the scalar flux
 !
 CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME
-TYPE(TFIELDDATA)  :: TZFIELD
+TYPE(TFIELDMETADATA)  :: TZFIELD
 !----------------------------------------------------------------------------
 !
 !*       1.   PRELIMINARIES
@@ -455,7 +455,7 @@ DO JSV=1,ISV
   IF (OTURB_FLX .AND. tpfile%lopened) THEN
     ! stores the JSVth vertical flux
     WRITE(YMNHNAME,'("WSV_FLX_",I3.3)') JSV
-    TZFIELD = TFIELDDATA(                        &
+    TZFIELD = TFIELDMETADATA(                    &
       CMNHNAME   = TRIM( YMNHNAME ),             &
       CSTDNAME   = '',                           &
       CLONGNAME  = TRIM( YMNHNAME ),             &
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index 0175f76c9..031c9cd2f 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -312,7 +312,7 @@ END MODULE MODI_TURB_VER_THERMO_CORR
 !
 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_CONF
@@ -439,7 +439,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
@@ -568,7 +568,7 @@ END IF
   !
   ! stores <THl THl>  
   IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-    TZFIELD = TFIELDDATA(            &
+    TZFIELD = TFIELDMETADATA(        &
       CMNHNAME   = 'THL_VVAR',       &
       CSTDNAME   = '',               &
       CLONGNAME  = 'THL_VVAR',       &
@@ -696,7 +696,7 @@ END IF
     END IF
     ! stores <THl Rnp>   
     IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-      TZFIELD = TFIELDDATA(                 &
+      TZFIELD = TFIELDMETADATA(             &
         CMNHNAME   = 'THLRCONS_VCOR',       &
         CSTDNAME   = '',                    &
         CLONGNAME  = 'THLRCONS_VCOR',       &
@@ -804,7 +804,7 @@ END IF
     END IF
     ! stores <Rnp Rnp>    
     IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-      TZFIELD = TFIELDDATA(             &
+      TZFIELD = TFIELDMETADATA(         &
         CMNHNAME   = 'RTOT_VVAR',       &
         CSTDNAME   = '',                &
         CLONGNAME  = 'RTOT_VVAR',       &
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index 816cb9a4e..aa53f0822 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -338,7 +338,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX
 !
 USE MODD_CST
 USE MODD_CTURB
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODD_GRID_n,         ONLY: XZS, XXHAT, XYHAT
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_METRICS_n,      ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
@@ -522,7 +522,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
@@ -753,7 +753,7 @@ END IF
 !
 IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
   ! stores the conservative potential temperature vertical flux
-  TZFIELD = TFIELDDATA(                                             &
+  TZFIELD = TFIELDMETADATA(                                         &
    CMNHNAME   = 'THW_FLX',                                          &
    CSTDNAME   = '',                                                 &
    CLONGNAME  = 'THW_FLX',                                          &
@@ -990,7 +990,7 @@ IF (KRR /= 0) THEN
   !
   IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
     ! stores the conservative mixing ratio vertical flux
-    TZFIELD = TFIELDDATA(                                     &
+    TZFIELD = TFIELDMETADATA(                                 &
       CMNHNAME   = 'RCONSW_FLX',                              &
       CSTDNAME   = '',                                        &
       CLONGNAME  = 'RCONSW_FLX',                              &
@@ -1080,7 +1080,7 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN
   !                 
   ! store the liquid water mixing ratio vertical flux
   IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-    TZFIELD = TFIELDDATA(                                     &
+    TZFIELD = TFIELDMETADATA(                                 &
       CMNHNAME   = 'RCW_FLX',                                 &
       CSTDNAME   = '',                                        &
       CLONGNAME  = 'RCW_FLX',                                 &
diff --git a/src/MNH/uv_to_zonal_and_merid.f90 b/src/MNH/uv_to_zonal_and_merid.f90
index 6ce72b8c2..95d768766 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_thermo.f90 b/src/MNH/ver_thermo.f90
index d7462dd35..a4e8ee654 100644
--- a/src/MNH/ver_thermo.f90
+++ b/src/MNH/ver_thermo.f90
@@ -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,7 +295,7 @@ DO JRR=1,SIZE(XRT,4)
 END DO
 !
 IF (NVERB>=10) THEN
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'THV',       &
     CSTDNAME   = '',          &
     CLONGNAME  = 'THV',       &
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index cc6d8269c..8d20985f5 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -96,7 +96,7 @@ CONTAINS
 !-------------------------------------------------------------------------------
 SUBROUTINE WRITE_LFI_BALLOON(TPFLYER)
 !
-use modd_field,          only: tfielddata, TYPEREAL
+use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 !
 TYPE(FLYER),        INTENT(IN)       :: TPFLYER
@@ -104,16 +104,16 @@ 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
+REAL                 :: ZLAT          ! latitude of the balloon
+REAL                 :: ZLON          ! longitude of the balloon
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !
 CALL SM_LATLON(XLATORI,XLONORI,  &
      TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON)
 !
 !
-TZFIELD = TFIELDDATA(                      &
+TZFIELD = TFIELDMETADATA(                  &
   CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
   CSTDNAME   = '',                         &
   CLONGNAME  = TRIM(TPFLYER%TITLE)//'LAT', &
@@ -126,7 +126,7 @@ TZFIELD = TFIELDDATA(                      &
   LTIMEDEP   = .TRUE.                      )
 CALL IO_Field_write(TPFILE,TZFIELD,ZLAT)
 !
-TZFIELD = TFIELDDATA(                      &
+TZFIELD = TFIELDMETADATA(                  &
   CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
   CSTDNAME   = '',                         &
   CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
@@ -139,7 +139,7 @@ TZFIELD = TFIELDDATA(                      &
   LTIMEDEP   = .TRUE.                      )
 CALL IO_Field_write(TPFILE,TZFIELD,ZLON)
 !
-TZFIELD = TFIELDDATA(                      &
+TZFIELD = TFIELDMETADATA(                  &
   CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT', &
   CSTDNAME   = '',                         &
   CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
@@ -152,7 +152,7 @@ TZFIELD = TFIELDDATA(                      &
   LTIMEDEP   = .TRUE.                      )
 CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR)
 !
-TZFIELD = TFIELDDATA(                          &
+TZFIELD = TFIELDMETADATA(                      &
   CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
   CSTDNAME   = '',                             &
   CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
@@ -165,7 +165,7 @@ TZFIELD = TFIELDDATA(                          &
   LTIMEDEP   = .TRUE.                          )
 CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT)
 !
-TZFIELD = TFIELDDATA(                      &
+TZFIELD = TFIELDMETADATA(                  &
   CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO', &
   CSTDNAME   = '',                         &
   CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 9f82ff30c..3f09ddc78 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -105,7 +105,7 @@ 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: NCOMMENTLGTMAX, NMNHNAMELGTMAX
@@ -135,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
   !
   !-------------------------------------------------------------------------------
   !
@@ -147,7 +147,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
   !* Write TSTEP and BULEN
   !  ---------------------
   !
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'TSTEP',     &
     CSTDNAME   = '',          &
     CLONGNAME  = 'TSTEP',     &
@@ -160,7 +160,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
     LTIMEDEP   = .FALSE.      )
   CALL IO_Field_write(TPDIAFILE,TZFIELD,PTSTEP)
   !
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'BULEN',     &
     CSTDNAME   = '',          &
     CLONGNAME  = 'BULEN',     &
@@ -251,7 +251,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
 
         Write( ymnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift
         Write( ycomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift
-        tzfield = tfielddata(             &
+        tzfield = tfieldmetadata(         &
           cmnhname   = Trim( ymnhname ),  &
           cstdname   = '',                &
           clongname  = Trim( ymnhname ),  &
@@ -276,7 +276,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv )
         tzfile = tpdiafile
         tzfile%cformat = 'NETCDF4'
 
-        tzfield = tfielddata(                    &
+        tzfield = tfieldmetadata(                &
           cmnhname   = CMASK_VARNAME,            &
           cstdname   = '',                       &
           clongname  = CMASK_VARNAME,            &
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 9265bd855..955030068 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -146,7 +146,7 @@ use modd_budget,         only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, n
 use modd_field,          only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_BUDGET_LES_MASK, &
                                NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, &
                                TYPECHAR, TYPEINT, TYPEREAL,                           &
-                               tfieldmetadata_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
@@ -196,7 +196,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' )
@@ -408,7 +408,7 @@ ILENCOMMENT = LFICOMMENTLGT
 !
 ! 1er enregistrement TYPE
 !
-TZFIELD = TFIELDDATA(                 &
+TZFIELD = TFIELDMETADATA(             &
   CMNHNAME   = TRIM(ygroup)//'.TYPE', &
   CSTDNAME   = '',                    &
   CLONGNAME  = TRIM(ygroup)//'.TYPE', &
@@ -423,7 +423,7 @@ 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 = TFIELDDATA(                &
+TZFIELD = TFIELDMETADATA(            &
   CMNHNAME   = TRIM(ygroup)//'.DIM', &
   CSTDNAME   = '',                   &
   CLONGNAME  = TRIM(ygroup)//'.DIM', &
@@ -490,7 +490,7 @@ END SELECT
 !
 ! 3eme enregistrement TITRE
 !
-TZFIELD = TFIELDDATA(                  &
+TZFIELD = TFIELDMETADATA(              &
   CMNHNAME   = TRIM(ygroup)//'.TITRE', &
   CSTDNAME   = '',                     &
   CLONGNAME  = TRIM(ygroup)//'.TITRE', &
@@ -508,7 +508,7 @@ deallocate( ytitles )
 !
 ! 4eme enregistrement UNITE
 !
-TZFIELD = TFIELDDATA(                  &
+TZFIELD = TFIELDMETADATA(              &
   CMNHNAME   = TRIM(ygroup)//'.UNITE', &
   CSTDNAME   = '',                     &
   CLONGNAME  = TRIM(ygroup)//'.UNITE', &
@@ -526,7 +526,7 @@ deallocate( yunits )
 !
 ! 5eme enregistrement COMMENT
 !
-TZFIELD = TFIELDDATA(                    &
+TZFIELD = TFIELDMETADATA(                &
   CMNHNAME   = TRIM(ygroup)//'.COMMENT', &
   CSTDNAME   = '',                       &
   CLONGNAME  = TRIM(ygroup)//'.COMMENT', &
@@ -569,7 +569,7 @@ DO J = 1,IP
           WRITE(YJ,'(I3)')J
   ENDIF
   IF ( gdistributed ) THEN
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ, &
       CSTDNAME   = '',                        &
       CLONGNAME  = TRIM(ygroup)//'.PROC'//YJ, &
@@ -584,7 +584,7 @@ DO J = 1,IP
     CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), &
                             iil+JPHEXT,iih+JPHEXT,ijl+JPHEXT,ijh+JPHEXT)
   ELSE
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ, &
       CSTDNAME   = '',                        &
       CLONGNAME  = TRIM(ygroup)//'.PROC'//YJ, &
@@ -603,7 +603,7 @@ ENDDO
 !
 ! 7eme enregistrement TRAJT
 !
-TZFIELD = TFIELDDATA(                  &
+TZFIELD = TFIELDMETADATA(              &
   CMNHNAME   = TRIM(ygroup)//'.TRAJT', &
   CSTDNAME   = '',                     &
   CLONGNAME  = TRIM(ygroup)//'.TRAJT', &
@@ -643,7 +643,7 @@ deallocate( ztimes )
 ! 8eme enregistrement TRAJX
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJX', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJX', &
@@ -656,7 +656,7 @@ IF(PRESENT(tpflyer))THEN
     LTIMEDEP   = .FALSE.                 )
   CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJX', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJX', &
@@ -676,7 +676,7 @@ ENDIF
 ! 9eme enregistrement TRAJY
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJY', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJY', &
@@ -689,7 +689,7 @@ IF(PRESENT(tpflyer))THEN
     LTIMEDEP   = .FALSE.                 )
   CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJY', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJY', &
@@ -709,7 +709,7 @@ ENDIF
 ! 10eme enregistrement TRAJZ
 !
 IF(PRESENT(tpflyer))THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJZ', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJZ', &
@@ -722,7 +722,7 @@ IF(PRESENT(tpflyer))THEN
     LTIMEDEP   = .FALSE.                 )
   CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) )
 ELSE IF ( ycategory == 'LES_budgets' .and.  tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJZ', &
     CSTDNAME   = '',                     &
     CLONGNAME  = TRIM(ygroup)//'.TRAJZ', &
@@ -744,7 +744,7 @@ ENDIF
 !
 ! 11eme enregistrement PDATIME
 !
-TZFIELD = TFIELDDATA(                  &
+TZFIELD = TFIELDMETADATA(              &
   CMNHNAME   = TRIM(ygroup)//'.DATIM', &
   CSTDNAME   = '',                     &
   CLONGNAME  = TRIM(ygroup)//'.DATIM', &
@@ -834,7 +834,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' )
@@ -1495,7 +1495,7 @@ if ( Present( tpflyer ) ) then
     ystdnameprefix = 'projection'
   endif
 
-  tzfield = tfielddata(                                     &
+  tzfield = tfieldmetadata(                                 &
     cmnhname   = 'X',                                       &
     cstdname   = Trim( ystdnameprefix ) // '_x_coordinate', &
     clongname  = 'x-position of the flyer',                 &
@@ -1523,7 +1523,7 @@ 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, tfieldmetadata_base
+use modd_field,       only: tfieldmetadata, tfieldmetadata_base
 use modd_io,          only: isp, tfiledata
 use modd_parameters,  only: jphext
 
@@ -1552,7 +1552,7 @@ 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 )
 
@@ -1770,10 +1770,10 @@ 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, tfieldmetadata_base
+use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfieldmetadata, tfieldmetadata_base
 
 class(tfieldmetadata_base), intent(in)  :: tpfieldin
-type(tfielddata),           intent(out) :: tpfieldout
+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
diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90
index 6b9aa7949..c3e6096e0 100644
--- a/src/MNH/write_dummy_gr_fieldn.f90
+++ b/src/MNH/write_dummy_gr_fieldn.f90
@@ -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,7 +104,7 @@ ALLOCATE(ZWORK2D(SIZE(XDUMMY_GR_FIELDS,1),SIZE(XDUMMY_GR_FIELDS,2)))
 !*       3.     Dummy fields :
 !               ------------
 !
-TZFIELD = TFIELDDATA(                                       &
+TZFIELD = TFIELDMETADATA(                                   &
   CMNHNAME   = 'DUMMY_GR_NBR',                              &
   CSTDNAME   = '',                                          &
   CLONGNAME  = 'DUMMY_GR_NBR',                              &
@@ -122,7 +122,7 @@ DO JDUMMY=1,NDUMMY_GR_NBR
   YSTRING20=CDUMMY_GR_NAME(JDUMMY)
   YSTRING03=CDUMMY_GR_AREA(JDUMMY)
   !
-  TZFIELD = TFIELDDATA(                                &
+  TZFIELD = TFIELDMETADATA(                            &
     CMNHNAME   = TRIM(YRECFM),                         &
     CSTDNAME   = '',                                   &
     CLONGNAME  = TRIM(YRECFM),                         &
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index f3614c14a..001d85f1d 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -121,7 +121,7 @@ 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
+use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL
 !
 !
 IMPLICIT NONE
@@ -152,8 +152,8 @@ 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=100)   :: YMSG
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.    SOME INITIALIZATIONS
@@ -213,7 +213,7 @@ IF (NRR >=1) THEN
                LHORELAX_RI .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. &
                LHORELAX_RH
   !
-  TZFIELD = TFIELDDATA(                                          &
+  TZFIELD = TFIELDMETADATA(                                      &
     CMNHNAME   = 'HORELAX_R',                                    &
     CSTDNAME   = '',                                             &
     CLONGNAME  = 'HORELAX_R',                                    &
@@ -269,7 +269,7 @@ END IF
 IF (NSV >=1) THEN
   GHORELAX_SV=ANY ( LHORELAX_SV )
 !
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'HORELAX_SV', &
     CSTDNAME   = '',           &
     CLONGNAME  = 'HORELAX_SV', &
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 6f4d6d5c4..e94351e1e 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -156,7 +156,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG
 USE MODD_DIM_n
 USE MODD_CONF
 USE MODD_CONF_n
-use modd_field,           only: tfielddata, tfieldlist, TYPEINT, TYPEREAL
+use modd_field,           only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_IO, ONLY : TFILEDATA
@@ -343,8 +343,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
@@ -511,7 +511,7 @@ ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
 ZPOVO(:,:,1)  =-1.E+11
 ZPOVO(:,:,IKU)=-1.E+11
 IF (INDEX(CISO,'EV') /= 0) THEN
-  TZFIELD = TFIELDDATA(                       &
+  TZFIELD = TFIELDMETADATA(                   &
     CMNHNAME   = 'POVOT',                     &
     CSTDNAME   = '',                          &
     CLONGNAME  = 'POVOT',                     &
@@ -531,7 +531,7 @@ IF (LVAR_RS) THEN
   CALL IO_Field_write(TPFILE,'VT',XVT)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1) = TFIELDDATA(                            &
+    TZFIELD2(1) = TFIELDMETADATA(                        &
       CMNHNAME   = 'UM_ZM',                              &
       CSTDNAME   = '',                                   &
       CLONGNAME  = 'UM_ZM',                              &
@@ -543,7 +543,7 @@ IF (LVAR_RS) THEN
       NDIMS      = 3,                                    &
       LTIMEDEP   = .TRUE.                                )
     !
-    TZFIELD2(2) = TFIELDDATA(                               &
+    TZFIELD2(2) = TFIELDMETADATA(                           &
       CMNHNAME   = 'VM_ZM',                                 &
       CSTDNAME   = '',                                      &
       CLONGNAME  = 'VM_ZM',                                 &
@@ -603,7 +603,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)
   !
@@ -611,7 +611,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)
   !
@@ -619,56 +619,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
@@ -679,7 +679,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)
   !
@@ -690,7 +690,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)
   !
@@ -700,17 +700,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
@@ -740,7 +740,7 @@ IF (LVAR_PR ) THEN
     ZWORK23(:,:) = 0.
   END DO
   !* Precipitable water in kg/m**2
-  TZFIELD = TFIELDDATA(              &
+  TZFIELD = TFIELDMETADATA(          &
     CMNHNAME   = 'PRECIP_WAT', &
     CSTDNAME   = '',           &
     CLONGNAME  = 'PRECIP_WAT', &
@@ -820,7 +820,7 @@ IF (LHU_FLX) THEN
   ENDIF
   ! Ecriture
   !  composantes U et V du flux surfacique d'humidit�  
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'UM90',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'UM90',       &
@@ -833,7 +833,7 @@ IF (LHU_FLX) THEN
     LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
   !  
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'VM90',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'VM90',       &
@@ -846,7 +846,7 @@ IF (LHU_FLX) THEN
     LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
   !  composantes U et V du flux d'humidit� int�gr� sur 3000 metres
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'UM91',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'UM91',       &
@@ -859,7 +859,7 @@ IF (LHU_FLX) THEN
     LTIMEDEP   = .TRUE.        )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   !
-  TZFIELD = TFIELDDATA(        &
+  TZFIELD = TFIELDMETADATA(    &
     CMNHNAME   = 'VM91',       &
     CSTDNAME   = '',           &
     CLONGNAME  = 'VM91',       &
@@ -873,7 +873,7 @@ IF (LHU_FLX) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   !   Convergence d'humidit�
-  TZFIELD = TFIELDDATA(                                         &
+  TZFIELD = TFIELDMETADATA(                                     &
     CMNHNAME   = 'HMCONV',                                      &
     CSTDNAME   = '',                                            &
     CLONGNAME  = 'HMCONV',                                      &
@@ -887,7 +887,7 @@ IF (LHU_FLX) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35)
   !
   !   Convergence d'humidit� int�gr� sur 3000 m�tres
-  TZFIELD = TFIELDDATA(                                         &
+  TZFIELD = TFIELDMETADATA(                                     &
     CMNHNAME   = 'HMCONV3000',                                  &
     CSTDNAME   = '',                                            &
     CLONGNAME  = 'HMCONV3000',                                  &
@@ -902,7 +902,7 @@ IF (LHU_FLX) THEN
   !
   IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
     !  composantes U et V du flux surfacique d'hydrom�t�ores  
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'UM92',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'UM92',       &
@@ -915,7 +915,7 @@ IF (LHU_FLX) THEN
       LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     ! 
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'VM92',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'VM92',       &
@@ -928,7 +928,7 @@ IF (LHU_FLX) THEN
       LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
     !  composantes U et V du flux d'hydrom�t�ores int�gr� sur 3000 metres
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'UM93',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'UM93',       &
@@ -941,7 +941,7 @@ IF (LHU_FLX) THEN
       LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
     ! 
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'VM93',       &
       CSTDNAME   = '',           &
       CLONGNAME  = 'VM93',       &
@@ -954,7 +954,7 @@ IF (LHU_FLX) THEN
       LTIMEDEP   = .TRUE.        )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24)
     !   Convergence d'hydrom�t�ores
-    TZFIELD = TFIELDDATA(                                            &
+    TZFIELD = TFIELDMETADATA(                                        &
       CMNHNAME   = 'HMCONV_TT',                                      &
       CSTDNAME   = '',                                               &
       CLONGNAME  = 'HMCONV_TT',                                      &
@@ -967,7 +967,7 @@ IF (LHU_FLX) THEN
       LTIMEDEP   = .TRUE.                                            )
     CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36)
     !   Convergence d'hydrom�t�ores int�gr� sur 3000 m�tres
-    TZFIELD = TFIELDDATA(                                            &
+    TZFIELD = TFIELDMETADATA(                                        &
       CMNHNAME   = 'HMCONV3000_TT',                                  &
       CSTDNAME   = '',                                               &
       CLONGNAME  = 'HMCONV3000_TT',                                  &
@@ -987,7 +987,7 @@ ENDIF
 IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
   IF (NRR >=1) THEN
     ! Moist variables are written individually in file
-    TZFIELD = TFIELDDATA(                         &
+    TZFIELD = TFIELDMETADATA(                     &
       CMNHNAME   = 'generic for moist variables', & !Temporary name to ease identification
       CSTDNAME   = '',                            &
       CDIR       = 'XY',                          &
@@ -1068,7 +1068,7 @@ END IF
 ! User scalar variables
 ! individually in the file
 IF (LVAR_MRSV) THEN
-  TZFIELD = TFIELDDATA(                          &
+  TZFIELD = TFIELDMETADATA(                      &
     CMNHNAME   = 'generic for scalar variables', & !Temporary name to ease identification
     CSTDNAME   = '',                             &
     CUNITS     = 'g kg-1',                       &
@@ -1203,7 +1203,7 @@ IF (LLIMA_DIAG) THEN
   END DO
 !
   IF (LUSERC) THEN
-    TZFIELD = TFIELDDATA(        &
+    TZFIELD = TFIELDMETADATA(    &
       CMNHNAME   = 'LWC',        &
       CSTDNAME   = '',           &
       CLONGNAME  = 'LWC',        &
@@ -1219,7 +1219,7 @@ IF (LLIMA_DIAG) THEN
   END IF
 !
   IF (LUSERI) THEN
-    TZFIELD = TFIELDDATA(       &
+    TZFIELD = TFIELDMETADATA(   &
       CMNHNAME   = 'IWC',       &
       CSTDNAME   = '',          &
       CLONGNAME  = 'IWC',       &
@@ -1346,7 +1346,7 @@ END IF
 !  Blowing snow variables
 !
 IF(LBLOWSNOW) THEN
-  TZFIELD = TFIELDDATA(                                                 &
+  TZFIELD = TFIELDMETADATA(                                             &
     CMNHNAME   = 'SNWSUBL3D',                                           &
     CSTDNAME   = '',                                                    &
     CLONGNAME  = 'SNWSUBL3D',                                           &
@@ -1366,7 +1366,7 @@ IF(LBLOWSNOW) THEN
   END DO
   ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
   !
-  TZFIELD = TFIELDDATA(                                     &
+  TZFIELD = TFIELDMETADATA(                                 &
     CMNHNAME   = 'COL_SNWSUBL',                             &
     CSTDNAME   = '',                                        &
     CLONGNAME  = 'COL_SNWSUBL',                             &
@@ -1389,7 +1389,7 @@ IF(LBLOWSNOW) THEN
   CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,&
                PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW)
   !
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'SNWRGA',         &
     CSTDNAME   = '',               &
     CLONGNAME  = 'SNWRGA',         &
@@ -1402,7 +1402,7 @@ IF(LBLOWSNOW) THEN
     LTIMEDEP   = .TRUE.            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:))
   !
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'SNWBETA',   &
     CSTDNAME   = '',          &
     CLONGNAME  = 'SNWBETA',   &
@@ -1415,7 +1415,7 @@ IF(LBLOWSNOW) THEN
     LTIMEDEP   = .TRUE.       )
   CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:))
   !
-  TZFIELD = TFIELDDATA(                  &
+  TZFIELD = TFIELDMETADATA(              &
     CMNHNAME   = 'SNWNOA',               &
     CSTDNAME   = '',                     &
     CLONGNAME  = 'SNWNOA',               &
@@ -1428,7 +1428,7 @@ IF(LBLOWSNOW) THEN
     LTIMEDEP   = .TRUE.                  )
   CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1))
   !
-  TZFIELD = TFIELDDATA(            &
+  TZFIELD = TFIELDMETADATA(        &
     CMNHNAME   = 'SNWMASS',        &
     CSTDNAME   = '',               &
     CLONGNAME  = 'SNWMASS',        &
@@ -1447,7 +1447,7 @@ IF(LBLOWSNOW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
   END DO
   ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
-  TZFIELD = TFIELDDATA(                                     &
+  TZFIELD = TFIELDMETADATA(                                 &
     CMNHNAME   = 'THDS',                                    &
     CSTDNAME   = '',                                        &
     CLONGNAME  = 'THDS',                                    &
@@ -2066,7 +2066,7 @@ IF (LVAR_LS) THEN
   CALL IO_Field_write(TPFILE,'LSVM', XLSVM)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1) = TFIELDDATA(                                        &
+    TZFIELD2(1) = TFIELDMETADATA(                                    &
       CMNHNAME   = 'LSUM_ZM',                                        &
       CSTDNAME   = '',                                               &
       CLONGNAME  = 'LSUM_ZM',                                        &
@@ -2078,7 +2078,7 @@ IF (LVAR_LS) THEN
       NDIMS      = 3,                                                &
       LTIMEDEP   = .TRUE.                                            )
     !
-    TZFIELD2(2) = TFIELDDATA(                                           &
+    TZFIELD2(2) = TFIELDMETADATA(                                       &
       CMNHNAME   = 'LSVM_ZM',                                           &
       CSTDNAME   = '',                                                  &
       CLONGNAME  = 'LSVM_ZM',                                           &
@@ -2098,7 +2098,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
@@ -2111,7 +2111,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
   DO JT=1,NFRC
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'UFRC'//YFRC,                                 &
       CSTDNAME   = '',                                           &
       CLONGNAME  = 'UFRC'//YFRC,                                 &
@@ -2124,7 +2124,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                           &
+    TZFIELD = TFIELDMETADATA(                                       &
       CMNHNAME   = 'VFRC'//YFRC,                                    &
       CSTDNAME   = '',                                              &
       CLONGNAME  = 'VFRC'//YFRC,                                    &
@@ -2137,7 +2137,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'WFRC'//YFRC,            &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'WFRC'//YFRC,            &
@@ -2150,7 +2150,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = 'THFRC'//YFRC,                   &
       CSTDNAME   = '',                              &
       CLONGNAME  = 'THFRC'//YFRC,                   &
@@ -2163,7 +2163,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                        &
+    TZFIELD = TFIELDMETADATA(                    &
       CMNHNAME   = 'RVFRC'//YFRC,                &
       CSTDNAME   = '',                           &
       CLONGNAME  = 'RVFRC'//YFRC,                &
@@ -2176,7 +2176,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
@@ -2189,7 +2189,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                 &
+    TZFIELD = TFIELDMETADATA(                                             &
       CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
       CSTDNAME   = '',                                                    &
       CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
@@ -2202,7 +2202,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
@@ -2215,7 +2215,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
@@ -2228,7 +2228,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
       CSTDNAME   = '',                        &
       CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
@@ -2251,7 +2251,7 @@ END IF
 IF (LTPZH .OR. LCOREF) THEN
 !
 !* Temperature in celsius
-  TZFIELD = TFIELDDATA(               &
+  TZFIELD = TFIELDMETADATA(           &
     CMNHNAME   = 'TEMP',              &
     CSTDNAME   = 'air_temperature',   &
     CLONGNAME  = 'TEMP',              &
@@ -2267,7 +2267,7 @@ IF (LTPZH .OR. LCOREF) THEN
 !
 !* Pressure in hPa        
   CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
-  TZFIELD = TFIELDLIST(IID)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
   TZFIELD%CMNHNAME = 'PRES'
   TZFIELD%CUNITS = 'hPa'
   CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2)
@@ -2291,7 +2291,7 @@ IF (LTPZH .OR. LCOREF) THEN
       END WHERE
     END IF
     !
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'REHU',                    &
       CSTDNAME   = 'relative_humidity',       &
       CLONGNAME  = 'REHU',                    &
@@ -2304,7 +2304,7 @@ IF (LTPZH .OR. LCOREF) THEN
       LTIMEDEP   = .TRUE.                     )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
-    TZFIELD = TFIELDDATA(                                 &
+    TZFIELD = TFIELDMETADATA(                             &
       CMNHNAME   = 'VPRES',                               &
       CSTDNAME   = 'water_vapor_partial_pressure_in_air', &
       CLONGNAME  = 'VPRES',                               &
@@ -2322,7 +2322,7 @@ IF (LTPZH .OR. LCOREF) THEN
       ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2                &
                             +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) &
                       -6*ZWORK33(:,:,:)                        )/ZTEMP(:,:,:)
-      TZFIELD = TFIELDDATA(                                &
+      TZFIELD = TFIELDMETADATA(                            &
         CMNHNAME   = 'COREF',                              &
         CSTDNAME   = '',                                   &
         CLONGNAME  = 'COREF',                              &
@@ -2336,7 +2336,7 @@ IF (LTPZH .OR. LCOREF) THEN
       CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
       !
       ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS
-      TZFIELD = TFIELDDATA(                                         &
+      TZFIELD = TFIELDMETADATA(                                     &
         CMNHNAME   = 'MCOREF',                                      &
         CSTDNAME   = '',                                            &
         CLONGNAME  = 'MCOREF',                                      &
@@ -2378,7 +2378,7 @@ IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN
 !
   IF (LMOIST_V .AND. NRR > 0) THEN
 ! Virtual potential temperature
-    TZFIELD = TFIELDDATA(                                 &
+    TZFIELD = TFIELDMETADATA(                             &
       CMNHNAME   = 'THETAV',                              &
       CSTDNAME   = '',                                    &
       CLONGNAME  = 'THETAV',                              &
@@ -2412,7 +2412,7 @@ IF (LVISI) THEN
      ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000.
     END WHERE
 ! Visibity Kunkel                     
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'VISIKUN',                 &
       CSTDNAME   = '',                        &
       CLONGNAME  = 'VISIKUN',                 &
@@ -2433,7 +2433,7 @@ IF (LVISI) THEN
        ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000.
       END WHERE
 ! Visibity Gultepe                    
-      TZFIELD = TFIELDDATA(                      &
+      TZFIELD = TFIELDMETADATA(                  &
         CMNHNAME   = 'VISIGUL',                  &
         CSTDNAME   = '',                         &
         CLONGNAME  = 'VISIGUL',                  &
@@ -2446,7 +2446,7 @@ IF (LVISI) THEN
       LTIMEDEP   = .TRUE.                        )
       CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL)
 ! Visibity Zhang                      
-      TZFIELD = TFIELDDATA(                    &
+      TZFIELD = TFIELDMETADATA(                &
         CMNHNAME   = 'VISIZHA',                &
         CSTDNAME   = '',                       &
         CLONGNAME  = 'VISIZHA',                &
@@ -2482,7 +2482,7 @@ IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN
                  *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
 !
   IF (LMOIST_E) THEN
-    TZFIELD = TFIELDDATA(                                    &
+    TZFIELD = TFIELDMETADATA(                                &
       CMNHNAME   = 'THETAE',                                 &
       CSTDNAME   = '',                                       &
       CLONGNAME  = 'THETAE',                                 &
@@ -2509,7 +2509,7 @@ IF (LMOIST_ES .AND. (NRR>0)) THEN
        -4.805   )    ) + 55.
   ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54)  &
                *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
-  TZFIELD = TFIELDDATA(                                              &
+  TZFIELD = TFIELDMETADATA(                                          &
     CMNHNAME   = 'THETAES',                                          &
     CSTDNAME   = '',                                                 &
     CLONGNAME  = 'THETAES',                                          &
@@ -2561,7 +2561,7 @@ IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN
 !
   IF (LMOIST_L .AND. NRR > 0) THEN
     ! Liquid-Water potential temperature
-    TZFIELD = TFIELDDATA(                                      &
+    TZFIELD = TFIELDMETADATA(                                  &
       CMNHNAME   = 'THETAL',                                   &
       CSTDNAME   = '',                                         &
       CLONGNAME  = 'THETAL',                                   &
@@ -2617,7 +2617,7 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN
   END IF
   IF (LMOIST_S1) THEN
 ! The Moist-air Entropy potential temperature (1st order)
-    TZFIELD = TFIELDDATA(                                                       &
+    TZFIELD = TFIELDMETADATA(                                                   &
       CMNHNAME   = 'THETAS1',                                                   &
       CSTDNAME   = '',                                                          &
       CLONGNAME  = 'THETAS1',                                                   &
@@ -2632,7 +2632,7 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN
   END IF
   IF (LMOIST_S2) THEN
 ! The Moist-air Entropy potential temperature (2nd order)
-    TZFIELD = TFIELDDATA(                                                       &
+    TZFIELD = TFIELDMETADATA(                                                   &
       CMNHNAME   = 'THETAS2',                                                   &
       CSTDNAME   = '',                                                          &
       CLONGNAME  = 'THETAS2',                                                   &
@@ -2656,7 +2656,7 @@ END IF
 IF (LVORT) THEN
 ! Vorticity x
   ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:))))
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'UM1',                            &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'UM1',                            &
@@ -2671,7 +2671,7 @@ IF (LVORT) THEN
 !    
 ! Vorticity y
   ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:))))
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'VM1',                            &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'VM1',                            &
@@ -2685,7 +2685,7 @@ IF (LVORT) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
   !
   IF (LWIND_ZM) THEN
-    TZFIELD2(1) = TFIELDDATA(                                 &
+    TZFIELD2(1) = TFIELDMETADATA(                             &
       CMNHNAME   = 'UM1_ZM',                                  &
       CSTDNAME   = '',                                        &
       CLONGNAME  = 'UM1_ZM',                                  &
@@ -2697,7 +2697,7 @@ IF (LVORT) THEN
       NDIMS      = 3,                                         &
       LTIMEDEP   = .TRUE.                                     )
     !
-    TZFIELD2(2) = TFIELDDATA(                                    &
+    TZFIELD2(2) = TFIELDMETADATA(                                &
       CMNHNAME   = 'VM1_ZM',                                     &
       CSTDNAME   = '',                                           &
       CLONGNAME  = 'VM1_ZM',                                     &
@@ -2714,7 +2714,7 @@ IF (LVORT) THEN
 !    
 ! Vorticity z
   ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:))))
-  TZFIELD = TFIELDDATA(                      &
+  TZFIELD = TFIELDMETADATA(                  &
     CMNHNAME   = 'WM1',                      &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'WM1',                      &
@@ -2729,7 +2729,7 @@ IF (LVORT) THEN
 !
 ! Absolute Vorticity 
   ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)
-  TZFIELD = TFIELDDATA(                        &
+  TZFIELD = TFIELDMETADATA(                    &
     CMNHNAME   = 'ABVOR',                      &
     CSTDNAME   = '',                           &
     CLONGNAME  = 'ABVOR',                      &
@@ -2762,7 +2762,7 @@ IF ( LMEAN_POVO ) THEN
     END WHERE
   END DO
   WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-  TZFIELD = TFIELDDATA(                               &
+  TZFIELD = TFIELDMETADATA(                           &
     CMNHNAME   = 'MEAN_POVO',                         &
     CSTDNAME   = '',                                  &
     CLONGNAME  = 'MEAN_POVO',                         &
@@ -2785,7 +2785,7 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN
                + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD = TFIELDDATA(                               &
+  TZFIELD = TFIELDMETADATA(                           &
     CMNHNAME   = 'POVOV',                             &
     CSTDNAME   = '',                                  &
     CLONGNAME  = 'POVOV',                             &
@@ -2808,7 +2808,7 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN
       END WHERE
     END DO
     WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'MEAN_POVOV',                                &
       CSTDNAME   = '',                                          &
       CLONGNAME  = 'MEAN_POVOV',                                &
@@ -2833,7 +2833,7 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN
                 + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                 + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD = TFIELDDATA(                                  &
+  TZFIELD = TFIELDMETADATA(                              &
     CMNHNAME   = 'POVOE',                                &
     CSTDNAME   = '',                                     &
     CLONGNAME  = 'POVOE',                                &
@@ -2856,7 +2856,7 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN
       END WHERE
     END DO
     WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
-    TZFIELD = TFIELDDATA(                                          &
+    TZFIELD = TFIELDMETADATA(                                      &
       CMNHNAME   = 'MEAN_POVOE',                                   &
       CSTDNAME   = '',                                             &
       CLONGNAME  = 'MEAN_POVOE',                                   &
@@ -2882,7 +2882,7 @@ IF (LMOIST_ES .AND. (NRR>0) ) THEN
                 + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
                 + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
   ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
-  TZFIELD = TFIELDDATA(                                            &
+  TZFIELD = TFIELDMETADATA(                                        &
     CMNHNAME   = 'POVOES',                                         &
     CSTDNAME   = '',                                               &
     CLONGNAME  = 'POVOES',                                         &
@@ -2904,7 +2904,7 @@ ENDIF
 IF (LDIV) THEN
 !
   ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY)
-  TZFIELD = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'HDIV',                        &
     CSTDNAME   = '',                            &
     CLONGNAME  = 'HDIV',                        &
@@ -2918,7 +2918,7 @@ IF (LDIV) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
   IF (LUSERV) THEN
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'HMDIV',                                      &
       CSTDNAME   = '',                                           &
       CLONGNAME  = 'HMDIV',                                      &
@@ -2954,7 +2954,7 @@ IF (LCLSTR) THEN
   CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE)
   PRINT *,'GOT OUT OF CLUSTERING'
   !
-  TZFIELD = TFIELDDATA(                       &
+  TZFIELD = TFIELDMETADATA(                   &
     CMNHNAME   = 'CLUSTERID',                 &
     CSTDNAME   = '',                          &
     CLONGNAME  = 'CLUSTERID',                 &
@@ -2967,7 +2967,7 @@ IF (LCLSTR) THEN
     LTIMEDEP   = .TRUE.                       )
   CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID)
   !
-  TZFIELD = TFIELDDATA(                               &
+  TZFIELD = TFIELDMETADATA(                           &
     CMNHNAME   = 'CLUSTERLV',                         &
     CSTDNAME   = '',                                  &
     CLONGNAME  = 'CLUSTERLV',                         &
@@ -2980,7 +2980,7 @@ IF (LCLSTR) THEN
     LTIMEDEP   = .TRUE.                               )
   CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV)
   !
-  TZFIELD = TFIELDDATA(                          &
+  TZFIELD = TFIELDMETADATA(                      &
     CMNHNAME   = 'CLDSIZE',                      &
     CSTDNAME   = '',                             &
     CLONGNAME  = 'CLDSIZE',                      &
@@ -3034,7 +3034,7 @@ IF (LGEO .OR. LAGEO) THEN
   DEALLOCATE(ZPHI)
 !
   IF (LGEO) THEN 
-    TZFIELD = TFIELDDATA(                                   &
+    TZFIELD = TFIELDMETADATA(                               &
       CMNHNAME   = 'UM88',                                  &
       CSTDNAME   = '',                                      &
       CLONGNAME  = 'UM88',                                  &
@@ -3047,7 +3047,7 @@ IF (LGEO .OR. LAGEO) THEN
       LTIMEDEP   = .TRUE.                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 ! 
-    TZFIELD = TFIELDDATA(                                   &
+    TZFIELD = TFIELDMETADATA(                               &
       CMNHNAME   = 'VM88',                                  &
       CSTDNAME   = '',                                      &
       CLONGNAME  = 'VM88',                                  &
@@ -3061,7 +3061,7 @@ IF (LGEO .OR. LAGEO) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
     IF (LWIND_ZM) THEN
-      TZFIELD2(1) = TFIELDDATA(                             &
+      TZFIELD2(1) = TFIELDMETADATA(                         &
         CMNHNAME   = 'UM88_ZM',                             &
         CSTDNAME   = '',                                    &
         CLONGNAME  = 'UM88_ZM',                             &
@@ -3073,7 +3073,7 @@ IF (LGEO .OR. LAGEO) THEN
         NDIMS      = 3,                                     &
         LTIMEDEP   = .TRUE.                                 )
       !
-      TZFIELD2(2) = TFIELDDATA(                                &
+      TZFIELD2(2) = TFIELDMETADATA(                            &
         CMNHNAME   = 'VM88_ZM',                                &
         CSTDNAME   = '',                                       &
         CLONGNAME  = 'VM88_ZM',                                &
@@ -3090,7 +3090,7 @@ IF (LGEO .OR. LAGEO) THEN
 !
 ! 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)
@@ -3100,7 +3100,7 @@ IF (LGEO .OR. LAGEO) THEN
     ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:)
     ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:)
     !
-    TZFIELD = TFIELDDATA(                                    &
+    TZFIELD = TFIELDMETADATA(                                &
       CMNHNAME   = 'UM89',                                   &
       CSTDNAME   = '',                                       &
       CLONGNAME  = 'UM89',                                   &
@@ -3113,7 +3113,7 @@ IF (LGEO .OR. LAGEO) THEN
       LTIMEDEP   = .TRUE.                                    )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
     !
-    TZFIELD = TFIELDDATA(                                    &
+    TZFIELD = TFIELDMETADATA(                                &
       CMNHNAME   = 'VM89',                                   &
       CSTDNAME   = '',                                       &
       CLONGNAME  = 'VM89',                                   &
@@ -3127,7 +3127,7 @@ IF (LGEO .OR. LAGEO) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
     IF (LWIND_ZM) THEN
-      TZFIELD2(1) = TFIELDDATA(                              &
+      TZFIELD2(1) = TFIELDMETADATA(                          &
         CMNHNAME   = 'UM89_ZM',                              &
         CSTDNAME   = '',                                     &
         CLONGNAME  = 'UM89_ZM',                              &
@@ -3139,7 +3139,7 @@ IF (LGEO .OR. LAGEO) THEN
         NDIMS      = 3,                                      &
         LTIMEDEP   = .TRUE.                                  )
       !
-      TZFIELD2(2) = TFIELDDATA(                                 &
+      TZFIELD2(2) = TFIELDMETADATA(                             &
         CMNHNAME   = 'VM89_ZM',                                 &
         CSTDNAME   = '',                                        &
         CLONGNAME  = 'VM89_ZM',                                 &
@@ -3156,7 +3156,7 @@ IF (LGEO .OR. LAGEO) THEN
 !
 ! 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)
@@ -3173,7 +3173,7 @@ IF(LWIND_CONTRAV) THEN!$
   CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, &
                 ZWORK31,ZWORK32,ZWORK33,2)
   !
-  TZFIELD = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'WNORM',                       &
     CSTDNAME   = '',                            &
     CLONGNAME  = 'WNORM',                       &
@@ -3207,7 +3207,7 @@ IF (LMSLP) THEN
 !  sea level pressure (hPa)
   ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:)))
 !
-  TZFIELD = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'MSLP',                        &
     CSTDNAME   = 'air_pressure_at_sea_level',   &
     CLONGNAME  = 'MSLP',                        &
@@ -3233,7 +3233,7 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
-    TZFIELD = TFIELDDATA(                          &
+    TZFIELD = TFIELDMETADATA(                      &
       CMNHNAME   = 'THVW',                         &
       CSTDNAME   = '',                             &
       CLONGNAME  = 'THVW',                         &
@@ -3254,7 +3254,7 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit
-    TZFIELD = TFIELDDATA(                          &
+    TZFIELD = TFIELDMETADATA(                      &
       CMNHNAME   = 'THCW',                         &
       CSTDNAME   = '',                             &
       CLONGNAME  = 'THCW',                         &
@@ -3275,7 +3275,7 @@ IF (LTHW) THEN
                      (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit
-    TZFIELD = TFIELDDATA(                         &
+    TZFIELD = TFIELDMETADATA(                     &
       CMNHNAME   = 'THRW',                        &
       CSTDNAME   = '',                            &
       CLONGNAME  = 'THRW',                        &
@@ -3296,7 +3296,7 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! ice thickness in mm unit
-    TZFIELD = TFIELDDATA(                  &
+    TZFIELD = TFIELDMETADATA(              &
       CMNHNAME   = 'THIC',                 &
       CSTDNAME   = '',                     &
       CLONGNAME  = 'THIC',                 &
@@ -3317,7 +3317,7 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! snow thickness in mm unit
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'THSN',                  &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'THSN',                  &
@@ -3338,7 +3338,7 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! graupel thickness in mm unit
-    TZFIELD = TFIELDDATA(                      &
+    TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = 'THGR',                     &
       CSTDNAME   = '',                         &
       CLONGNAME  = 'THGR',                     &
@@ -3359,7 +3359,7 @@ IF (LTHW) THEN
                    (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
     END DO
     ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! hail thickness in mm unit
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'THHA',                  &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'THHA',                  &
@@ -3401,7 +3401,7 @@ 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 = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'ACTOPR',                                    &
       CSTDNAME   = '',                                          &
       CLONGNAME  = 'ACTOPR',                                    &
@@ -3421,7 +3421,7 @@ 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 = TFIELDDATA(                                                   &
+    TZFIELD = TFIELDMETADATA(                                               &
       CSTDNAME   = 'generic LS_ACTOPR',                                     & !Temporary name to ease identification
       CUNITS     = 'mm',                                                    &
       CDIR       = 'XY',                                                    &
@@ -3469,7 +3469,7 @@ 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 = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'INTOPR',                                     &
       CSTDNAME   = '',                                           &
       CLONGNAME  = 'INTOPR',                                     &
@@ -3491,7 +3491,7 @@ 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 = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'LS_INTOPR',                                              &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'LS_INTOPR',                                              &
@@ -3521,7 +3521,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
                    ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE),          &
                    ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22                )
   !
-  TZFIELD = TFIELDDATA(                                              &
+  TZFIELD = TFIELDMETADATA(                                          &
     CMNHNAME   = 'CAPEMAX',                                          &
     CSTDNAME   = '',                                                 &
     CLONGNAME  = 'CAPEMAX',                                          &
@@ -3534,7 +3534,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
     LTIMEDEP   = .TRUE.                                              )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   !
-  TZFIELD = TFIELDDATA(                                     &
+  TZFIELD = TFIELDMETADATA(                                 &
     CMNHNAME   = 'CINMAX',                                  &
     CSTDNAME   = '',                                        &
     CLONGNAME  = 'CINMAX',                                  &
@@ -3548,7 +3548,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   IF (NCAPE >=1) THEN
-    TZFIELD = TFIELDDATA(                                              &
+    TZFIELD = TFIELDMETADATA(                                          &
       CMNHNAME   = 'CAPE3D',                                           &
       CSTDNAME   = 'atmosphere_convective_available_potential_energy', &
       CLONGNAME  = 'CAPE3D',                                           &
@@ -3561,7 +3561,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
       LTIMEDEP   = .TRUE.                                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
     !
-    TZFIELD = TFIELDDATA(                                &
+    TZFIELD = TFIELDMETADATA(                            &
       CMNHNAME   = 'CIN3D',                              &
       CSTDNAME   = 'atmosphere_convective_inhibition',   &
       CLONGNAME  = 'CIN3D',                              &
@@ -3574,7 +3574,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
       LTIMEDEP   = .TRUE.                                )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
     !
-    TZFIELD = TFIELDDATA(     &
+    TZFIELD = TFIELDMETADATA( &
       CMNHNAME   = 'DCAPE3D', &
       CSTDNAME   = '',        &
       CLONGNAME  = 'DCAPE3D', &
@@ -3593,7 +3593,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN
     ZWORK31(:,:,IKU)    = 0.
     ZWORK31=0.5*ZWORK31**2
     !
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = 'VKE',                           &
       CSTDNAME   = '',                              &
       CLONGNAME  = 'VKE',                           &
@@ -3626,7 +3626,7 @@ IF (LBV_FR) THEN
    ENDDO
   ENDDO
   !
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'BV',                             &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'BV',                             &
@@ -3653,7 +3653,7 @@ IF (LBV_FR) THEN
      ENDDO
     ENDDO
 !
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'BVE',                                       &
       CSTDNAME   = '',                                          &
       CLONGNAME  = 'BVE',                                       &
@@ -3682,7 +3682,7 @@ IF ( NGPS>=0 ) THEN
   YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS')
   CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24)    
   !
-  TZFIELD = TFIELDDATA(                        &
+  TZFIELD = TFIELDMETADATA(                    &
     CMNHNAME   = 'ZTD',                        &
     CSTDNAME   = '',                           &
     CLONGNAME  = 'ZTD',                        &
@@ -3696,7 +3696,7 @@ IF ( NGPS>=0 ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
   !
   IF (NGPS>=1) THEN
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
       CMNHNAME   = 'ZHD',                              &
       CSTDNAME   = '',                                 &
       CLONGNAME  = 'ZHD',                              &
@@ -3709,7 +3709,7 @@ IF ( NGPS>=0 ) THEN
       LTIMEDEP   = .TRUE.                              )
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
     !
-    TZFIELD = TFIELDDATA(                      &
+    TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = 'ZWD',                      &
       CSTDNAME   = '',                         &
       CLONGNAME  = 'ZWD',                      &
@@ -3755,7 +3755,7 @@ IF(LRADAR .AND. LUSERR) THEN
                                                          ZWORK33, ZWORK34 )
   ENDIF 
 !
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'RARE',                           &
     CSTDNAME   = 'equivalent_reflectivity_factor', &
     CLONGNAME  = 'RARE',                           &
@@ -3768,7 +3768,7 @@ IF(LRADAR .AND. LUSERR) THEN
     LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'VDOP',                           &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'VDOP',                           &
@@ -3781,7 +3781,7 @@ IF(LRADAR .AND. LUSERR) THEN
     LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
 !
-  TZFIELD = TFIELDDATA(                                   &
+  TZFIELD = TFIELDMETADATA(                               &
     CMNHNAME   = 'ZDR',                                   &
     CSTDNAME   = '',                                      &
     CLONGNAME  = 'ZDR',                                   &
@@ -3794,7 +3794,7 @@ IF(LRADAR .AND. LUSERR) THEN
     LTIMEDEP   = .TRUE.                                   )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
 !
-  TZFIELD = TFIELDDATA(                                   &
+  TZFIELD = TFIELDMETADATA(                               &
     CMNHNAME   = 'KDP',                                   &
     CSTDNAME   = '',                                      &
     CLONGNAME  = 'KDP',                                   &
@@ -4103,7 +4103,7 @@ IF (LLIDAR) THEN
   IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3)
   IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4)
 !
-  TZFIELD = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'LIDAR',                          &
     CSTDNAME   = '',                               &
     CLONGNAME  = 'LIDAR',                          &
@@ -4116,7 +4116,7 @@ IF (LLIDAR) THEN
     LTIMEDEP   = .TRUE.                            )
   CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 !
-  TZFIELD = TFIELDDATA(                          &
+  TZFIELD = TFIELDMETADATA(                      &
     CMNHNAME   = 'LIPAR',                        &
     CSTDNAME   = '',                             &
     CLONGNAME  = 'LIPAR',                        &
@@ -4161,7 +4161,7 @@ IF (CBLTOP == 'THETA') THEN
   ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
   ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0)
   !
-  TZFIELD = TFIELDDATA(                                 &
+  TZFIELD = TFIELDMETADATA(                             &
     CMNHNAME   = 'HBLTOP',                              &
     CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
     CLONGNAME  = 'HBLTOP',                              &
@@ -4206,7 +4206,7 @@ ELSEIF (CBLTOP == 'RICHA') THEN
   END DO
   ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
   !
-  TZFIELD = TFIELDDATA(                                 &
+  TZFIELD = TFIELDMETADATA(                             &
     CMNHNAME   = 'HBLTOP',                              &
     CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
     CLONGNAME  = 'HBLTOP',                              &
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 456337d78..f24f10f5b 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -97,7 +97,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
 !
 USE MODE_ll
 USE MODD_CST
-use modd_field,           only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEINT, TYPEREAL
+use modd_field,           only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_PARAMETERS
 USE MODD_CONF_n
@@ -208,8 +208,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
@@ -256,7 +256,7 @@ 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 = TFIELDDATA(                           &
+  TZFIELD = TFIELDMETADATA(                       &
     CMNHNAME   = 'CLTOPCONV',                     &
     CSTDNAME   = 'convective_cloud_top_altitude', &
     CLONGNAME  = 'CLTOPCONV',                     &
@@ -276,7 +276,7 @@ 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 = TFIELDDATA(                            &
+  TZFIELD = TFIELDMETADATA(                        &
     CMNHNAME   = 'CLBASCONV',                      &
     CSTDNAME   = 'convective_cloud_base_altitude', &
     CLONGNAME  = 'CLBASCONV',                      &
@@ -458,7 +458,7 @@ IF (LCLD_COV .AND. LUSERC) THEN
                                                   ! 0 if there is no cloud
   ZWORK21(:,:)=ZWORK21(:,:)/1.E3            ! height (km) of explicit clouds
 !
-  TZFIELD = TFIELDDATA(                              &
+  TZFIELD = TFIELDMETADATA(                          &
     CMNHNAME   = 'HECL',                             &
     CSTDNAME   = '',                                 &
     CLONGNAME  = 'HECL',                             &
@@ -496,7 +496,7 @@ IF (LCLD_COV .AND. LUSERC) THEN
                                                          ! 0 if there is no cloud
     ZWORK21(:,:)=ZWORK21(:,:)/1.E3                 ! max. cloud height (km)
 !
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'HCL',                     &
       CSTDNAME   = 'cloud_top_altitude',      &
       CLONGNAME  = 'HCL',                     &
@@ -510,7 +510,7 @@ IF (LCLD_COV .AND. LUSERC) THEN
     CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
   ENDIF
 !
-  TZFIELD = TFIELDDATA(                          &
+  TZFIELD = TFIELDMETADATA(                      &
     CMNHNAME   = 'TCL',                          &
     CSTDNAME   = 'air_temperature_at_cloud_top', &
     CLONGNAME  = 'TCL',                          &
@@ -532,7 +532,7 @@ IF (LCLD_COV .AND. LUSERC) THEN
     ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88)
   END WHERE
 !
-  TZFIELD = TFIELDDATA(               &
+  TZFIELD = TFIELDMETADATA(           &
     CMNHNAME   = 'VISI_HOR',          &
     CSTDNAME   = 'visibility_in_air', &
     CLONGNAME  = 'VISI_HOR',          &
@@ -568,7 +568,7 @@ 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
@@ -588,7 +588,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)
     END DO
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
       CMNHNAME   = 'DSTAOD3D',                         &
       CSTDNAME   = '',                                 &
       CLONGNAME  = 'DSTAOD3D',                         &
@@ -610,7 +610,7 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD = TFIELDDATA(                            &
+    TZFIELD = TFIELDMETADATA(                        &
       CMNHNAME   = 'DSTAOD2D',                       &
       CSTDNAME   = '',                               &
       CLONGNAME  = 'DSTAOD2D',                       &
@@ -627,7 +627,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'DSTEXT',                &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'DSTEXT',                &
@@ -647,7 +647,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)
     END DO
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
       CMNHNAME   = 'SLTAOD3D',                         &
       CSTDNAME   = '',                                 &
       CLONGNAME  = 'SLTAOD3D',                         &
@@ -669,7 +669,7 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD = TFIELDDATA(                            &
+    TZFIELD = TFIELDMETADATA(                        &
       CMNHNAME   = 'SLTAOD2D',                       &
       CSTDNAME   = '',                               &
       CLONGNAME  = 'SLTAOD2D',                       &
@@ -686,7 +686,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'SLTEXT',                &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'SLTEXT',                &
@@ -706,7 +706,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)
     END DO
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'AERAOD3D',                                  &
       CSTDNAME   = '',                                          &
       CLONGNAME  = 'AERAOD3D',                                  &
@@ -728,7 +728,7 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    TZFIELD = TFIELDDATA(                                     &
+    TZFIELD = TFIELDMETADATA(                                 &
       CMNHNAME   = 'AERAOD2D',                                &
       CSTDNAME   = '',                                        &
       CLONGNAME  = 'AERAOD2D',                                &
@@ -745,7 +745,7 @@ IF (NRAD_3D >= 1) THEN
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    TZFIELD = TFIELDDATA(                            &
+    TZFIELD = TFIELDMETADATA(                        &
       CMNHNAME   = 'AEREXT',                         &
       CSTDNAME   = '',                               &
       CLONGNAME  = 'AEREXT',                         &
@@ -829,7 +829,7 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
                       LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,               &
                       INDGEO(JI), VSIGQSAT                                    )
     !
-    TZFIELD = TFIELDDATA(                                                   &
+    TZFIELD = TFIELDMETADATA(                                               &
       CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
       CSTDNAME   = '',                                                      &
       CLONGNAME  = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
@@ -842,7 +842,7 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
       LTIMEDEP   = .TRUE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT)
     !
-    TZFIELD = TFIELDDATA(                                                     &
+    TZFIELD = TFIELDMETADATA(                                                 &
       CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
       CSTDNAME   = '',                                                        &
       CLONGNAME  = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
@@ -918,7 +918,7 @@ 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) = TFIELDDATA(           &
+    TZFIELD2(1) = TFIELDMETADATA(       &
       CMNHNAME   = 'UM10',              &
       CSTDNAME   = '',                  &
       CLONGNAME  = 'UM10',              &
@@ -930,7 +930,7 @@ IF (CSURF=='EXTE') THEN
       NDIMS      = 2,                   &
       LTIMEDEP   = .TRUE.               )
     !
-    TZFIELD2(2) = TFIELDDATA(              &
+    TZFIELD2(2) = TFIELDMETADATA(          &
       CMNHNAME   = 'VM10',                 &
       CSTDNAME   = '',                     &
       CLONGNAME  = 'VM10',                 &
@@ -944,7 +944,7 @@ IF (CSURF=='EXTE') THEN
     !
     CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ELSE
-    TZFIELD = TFIELDDATA(               &
+    TZFIELD = TFIELDMETADATA(           &
       CMNHNAME   = 'UM10',              &
       CSTDNAME   = '',                  &
       CLONGNAME  = 'UM10',              &
@@ -957,7 +957,7 @@ IF (CSURF=='EXTE') THEN
       LTIMEDEP   = .TRUE.               )
     CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M)
     !
-    TZFIELD = TFIELDDATA(                  &
+    TZFIELD = TFIELDMETADATA(              &
       CMNHNAME   = 'VM10',                 &
       CSTDNAME   = '',                     &
       CLONGNAME  = 'VM10',                 &
@@ -974,7 +974,7 @@ IF (CSURF=='EXTE') THEN
   IF (SIZE(XTKET)>0) THEN
     ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
     ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
-    TZFIELD = TFIELDDATA(         &
+    TZFIELD = TFIELDMETADATA(     &
       CMNHNAME   = 'FF10MAX',     &
       CSTDNAME   = '',            &
       CLONGNAME  = 'FF10MAX',     &
@@ -989,7 +989,7 @@ IF (CSURF=='EXTE') THEN
   END IF
   !
   IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN
-    TZFIELD = TFIELDDATA(              &
+    TZFIELD = TFIELDMETADATA(          &
       CMNHNAME   = 'SFCO2',            &
       CSTDNAME   = '',                 &
       CLONGNAME  = 'SFCO2',            &
@@ -1004,7 +1004,7 @@ IF (CSURF=='EXTE') THEN
   END IF
   !
   IF(ANY(XCURRENT_SWD/=XUNDEF))THEN
-    TZFIELD = TFIELDDATA(                               &
+    TZFIELD = TFIELDMETADATA(                           &
       CMNHNAME   = 'SWD',                               &
       CSTDNAME   = '',                                  &
       CLONGNAME  = 'SWD',                               &
@@ -1019,7 +1019,7 @@ IF (CSURF=='EXTE') THEN
   END IF
   !
   IF(ANY(XCURRENT_SWU/=XUNDEF))THEN
-    TZFIELD = TFIELDDATA(                                &
+    TZFIELD = TFIELDMETADATA(                            &
       CMNHNAME   = 'SWU',                                &
       CSTDNAME   = '',                                   &
       CLONGNAME  = 'SWU',                                &
@@ -1034,7 +1034,7 @@ IF (CSURF=='EXTE') THEN
   END IF
 !
   IF(ANY(XCURRENT_LWD/=XUNDEF))THEN
-    TZFIELD = TFIELDDATA(                              &
+    TZFIELD = TFIELDMETADATA(                          &
       CMNHNAME   = 'LWD',                              &
       CSTDNAME   = '',                                 &
       CLONGNAME  = 'LWD',                              &
@@ -1049,7 +1049,7 @@ IF (CSURF=='EXTE') THEN
   END IF
 !
   IF(ANY(XCURRENT_LWU/=XUNDEF))THEN
-    TZFIELD = TFIELDDATA(                               &
+    TZFIELD = TFIELDMETADATA(                           &
       CMNHNAME   = 'LWU',                               &
       CSTDNAME   = '',                                  &
       CLONGNAME  = 'LWU',                               &
@@ -1099,7 +1099,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   END DO
   PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:)
   !
-  TZFIELD = TFIELDDATA(    &
+  TZFIELD = TFIELDMETADATA(&
     CMNHNAME   = 'variables at pressure levels', & !Temporary name to ease identification
     CSTDNAME   = '',       &
     CDIR       = 'XY',     &
@@ -1206,7 +1206,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
 
   PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:)
   !
-  TZFIELD = TFIELDDATA(    &
+  TZFIELD = TFIELDMETADATA(&
     CMNHNAME   = 'variables at pot. temp. levels', & !Temporary name to ease identification
     CSTDNAME   = '',       &
     CDIR       = 'XY',     &
@@ -1310,7 +1310,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
 ! *********************
 ! Altitude
 ! *********************
-  TZFIELD = TFIELDDATA(       &
+  TZFIELD = TFIELDMETADATA(   &
     CMNHNAME   = 'ALT_ALT',   &
     CSTDNAME   = '',          &
     CLONGNAME  = 'ALT_ALT',   &
@@ -1334,7 +1334,7 @@ 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 = TFIELDDATA(           &
+  TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'ALT_CLOUD',     &
     CSTDNAME   = '',              &
     CLONGNAME  = 'ALT_CLOUD',     &
@@ -1357,7 +1357,7 @@ 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 = TFIELDDATA(                   &
+  TZFIELD = TFIELDMETADATA(               &
     CMNHNAME   = 'ALT_PRECIP',            &
     CSTDNAME   = '',                      &
     CLONGNAME  = 'ALT_PRECIP',            &
@@ -1374,7 +1374,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
 ! *********************
   CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD = TFIELDDATA(                           &
+  TZFIELD = TFIELDMETADATA(                       &
     CMNHNAME   = 'ALT_THETA',                     &
     CSTDNAME   = '',                              &
     CLONGNAME  = 'ALT_THETA',                     &
@@ -1391,7 +1391,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
 ! *********************
   CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD = TFIELDDATA(              &
+  TZFIELD = TFIELDMETADATA(          &
     CMNHNAME   = 'ALT_PRESSURE',     &
     CSTDNAME   = '',                 &
     CLONGNAME  = 'ALT_PRESSURE',     &
@@ -1425,7 +1425,7 @@ 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 = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'ALT_PV',                      &
     CSTDNAME   = '',                            &
     CLONGNAME  = 'ALT_PV',                      &
@@ -1443,7 +1443,7 @@ 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 = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'ALT_U',                       &
     CSTDNAME   = '',                            &
     CLONGNAME  = 'ALT_U',                       &
@@ -1459,7 +1459,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN
   ZWORK31(:,:,:) = MYF(XVT(:,:,:))
   CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
   WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
-  TZFIELD = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'ALT_V',                       &
     CSTDNAME   = '',                            &
     CLONGNAME  = 'ALT_V',                       &
@@ -1481,7 +1481,7 @@ 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 = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'ALT_DSTEXT',              &
       CSTDNAME   = '',                        &
       CLONGNAME  = 'ALT_DSTEXT',              &
@@ -1524,7 +1524,7 @@ 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 = TFIELDDATA(               &
+  TZFIELD = TFIELDMETADATA(           &
     CMNHNAME   = 'TKEBAVG'//YDX,      &
     CSTDNAME   = '',                  &
     CLONGNAME  = 'TKEBAVG'//YDX,      &
@@ -1555,7 +1555,7 @@ 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 = TFIELDDATA(                &
+  TZFIELD = TFIELDMETADATA(            &
     CMNHNAME   = 'TKEMAVG'//YDX,       &
     CSTDNAME   = '',                   &
     CLONGNAME  = 'TKEMAVG'//YDX,       &
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 4e80261f8..6b1823d8c 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -188,7 +188,7 @@ END MODULE MODI_WRITE_LFIFM_n
 USE MODD_DIM_n
 USE MODD_CONF
 USE MODD_CONF_n
-use modd_field,       only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
+use modd_field,       only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
 USE MODD_GRID
 USE MODD_GRID_n
 USE MODD_TIME
@@ -332,9 +332,9 @@ 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
+CHARACTER(LEN=2)     :: INDICE
+INTEGER              :: IID
+TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*	0. Initialization
@@ -445,7 +445,7 @@ CALL IO_Field_write(TPFILE,'SURF',     CSURF)
 CALL IO_Field_write(TPFILE,'CPL_AROME',LCPL_AROME)
 CALL IO_Field_write(TPFILE,'COUPLING', LCOUPLING)
 !
-TZFIELD = TFIELDDATA(       &
+TZFIELD = TFIELDMETADATA(   &
   CMNHNAME   = 'RECYCLING', &
   CLONGNAME  = 'RECYCLING', &
   CSTDNAME   = '',          &
@@ -493,7 +493,7 @@ END IF
 !
 IF (LIBM .OR. LIBM_LSF) THEN
   !
-  TZFIELD = TFIELDDATA(                           &
+  TZFIELD = TFIELDMETADATA(                       &
     CMNHNAME  = 'LSFP',                           &
     CLONGNAME = 'LSFP',                           &
     CSTDNAME  = '',                               &
@@ -511,7 +511,7 @@ ENDIF
 !
 IF (LRECYCL) THEN
   !
-  TZFIELD = TFIELDDATA(                                      &
+  TZFIELD = TFIELDMETADATA(                                  &
     CMNHNAME   = 'RCOUNT',                                   &
     CLONGNAME  = 'RCOUNT',                                   &
     CSTDNAME   = '',                                         &
@@ -525,7 +525,7 @@ IF (LRECYCL) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,NR_COUNT)
   !
   IF (LRECYCLW) THEN
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'URECYCLW',                                  &
       CLONGNAME  = 'URECYCLW',                                  &
       CSTDNAME   = '',                                          &
@@ -539,7 +539,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANW(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'VRECYCLW',                                  &
       CLONGNAME  = 'VRECYCLW',                                  &
       CSTDNAME   = '',                                          &
@@ -553,7 +553,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANW(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'WRECYCLW',                                  &
       CLONGNAME  = 'WRECYCLW',                                  &
       CSTDNAME   = '',                                          &
@@ -569,7 +569,7 @@ IF (LRECYCL) THEN
     !
   ENDIF  
   IF (LRECYCLN) THEN
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'URECYCLN',                                   &
       CLONGNAME  = 'URECYCLN',                                   &
       CSTDNAME   = '',                                           &
@@ -583,7 +583,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANN(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'VRECYCLN',                                   &
       CLONGNAME  = 'VRECYCLN',                                   &
       CSTDNAME   = '',                                           &
@@ -597,7 +597,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANN(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'WRECYCLN',                                   &
       CLONGNAME  = 'WRECYCLN',                                   &
       CSTDNAME   = '',                                           &
@@ -613,7 +613,7 @@ IF (LRECYCL) THEN
     !
   ENDIF
   IF (LRECYCLE) THEN
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'URECYCLE',                                  &
       CLONGNAME  = 'URECYCLE',                                  &
       CSTDNAME   = '',                                          &
@@ -627,7 +627,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANE(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'VRECYCLE',                                  &
       CLONGNAME  = 'VRECYCLE',                                  &
       CSTDNAME   = '',                                          &
@@ -641,7 +641,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANE(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                       &
+    TZFIELD = TFIELDMETADATA(                                   &
       CMNHNAME   = 'WRECYCLE',                                  &
       CLONGNAME  = 'WRECYCLE',                                  &
       CSTDNAME   = '',                                          &
@@ -657,7 +657,7 @@ IF (LRECYCL) THEN
     !
   ENDIF
   IF (LRECYCLS) THEN
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'URECYCLS',                                   &
       CLONGNAME  = 'URECYCLS',                                   &
       CSTDNAME   = '',                                           &
@@ -671,7 +671,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XUMEANS(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'VRECYCLS',                                   &
       CLONGNAME  = 'VRECYCLS',                                   &
       CSTDNAME   = '',                                           &
@@ -685,7 +685,7 @@ IF (LRECYCL) THEN
     !
     CALL IO_Field_write(TPFILE,TZFIELD,XVMEANS(:,:,:))
     !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'WRECYCLS',                                   &
       CLONGNAME  = 'WRECYCLS',                                   &
       CSTDNAME   = '',                                           &
@@ -702,7 +702,7 @@ ENDIF
 !
 IF (MEAN_COUNT /= 0) THEN
 !
-  TZFIELD = TFIELDDATA(                              &
+  TZFIELD = TFIELDMETADATA(                          &
     CMNHNAME   = 'generic for mean_count variables', & !Temporary name to ease identification
     CSTDNAME   = '',                                 &
     CDIR       = 'XY',                               &
@@ -1044,7 +1044,7 @@ IF (NSV >=1) THEN
     !
     ZWORK2D(:,:)  = XRHOLW*XINPRR(:,:)*XSVT(:,:,2,NSV_LIMA_SCAVMASS)/ &
                                         max( 1.e-20,XRT(:,:,2,3) ) !~2=at ground level
-    TZFIELD = TFIELDDATA(                                          &
+    TZFIELD = TFIELDMETADATA(                                      &
       CMNHNAME   = 'INPBP',                                        &
       CSTDNAME   = '',                                             &
       CLONGNAME  = 'INPBP',                                        &
@@ -1093,7 +1093,7 @@ IF (NSV >=1) THEN
     CALL IO_Field_write(TPFILE,'EFIELDV',XEFIELDV)
     CALL IO_Field_write(TPFILE,'EFIELDW',XEFIELDW)
  !
-    TZFIELD = TFIELDDATA(           &
+    TZFIELD = TFIELDMETADATA(       &
       CMNHNAME   = 'EMODULE',       &
       CSTDNAME   = '',              &
       CLONGNAME  = 'EMODULE',       &
@@ -1108,22 +1108,22 @@ IF (NSV >=1) THEN
     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)
  !
@@ -1507,7 +1507,7 @@ IF (NSV >=1) THEN
   DO JSV=1,ICH_NBR
     WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV))
   END DO
-  TZFIELD = TFIELDDATA(                          &
+  TZFIELD = TFIELDMETADATA(                      &
     CMNHNAME   = 'NSV.DIM',                      &
     CSTDNAME   = '',                             &
     CLONGNAME  = 'NSV.DIM',                      &
@@ -1521,7 +1521,7 @@ IF (NSV >=1) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR)
   !
   IF (ICH_NBR/=0) THEN
-    TZFIELD = TFIELDDATA(       &
+    TZFIELD = TFIELDMETADATA(   &
       CMNHNAME   = 'NSV.TITRE', &
       CSTDNAME   = '',          &
       CLONGNAME  = 'NSV.TITRE', &
@@ -1632,7 +1632,7 @@ END IF
 ! IF (NSV >=1) THEN
 !    DO JSV = NSV_C2R2BEG,NSV_C2R2END
 !     IF (JSV == NSV_C2R2BEG ) THEN
-!       TZFIELD = TFIELDDATA(           &
+!       TZFIELD = TFIELDMETADATA(       &
 !         CMNHNAME   = 'RSVS_CLD1',     &
 !         CSTDNAME   = '',              &
 !         CLONGNAME  = 'RSVS_CLD1',     &
@@ -1646,7 +1646,7 @@ END IF
 !       CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR))
 !     END IF
 !     IF (JSV == NSV_C2R2END ) THEN
-!       TZFIELD = TFIELDDATA(           &
+!       TZFIELD = TFIELDMETADATA(       &
 !         CMNHNAME   = 'RSVS_CLD2',     &
 !         CSTDNAME   = '',              &
 !         CLONGNAME  = 'RSVS_CLD2',     &
@@ -1683,7 +1683,7 @@ 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
@@ -1713,17 +1713,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)
 !
@@ -1838,12 +1838,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)
 !
@@ -1853,12 +1853,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)
 !
@@ -1868,7 +1868,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)
 !
@@ -1876,7 +1876,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)
 !
@@ -1886,12 +1886,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
@@ -1900,12 +1900,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
@@ -1914,12 +1914,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
@@ -1932,7 +1932,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)
 !
@@ -1941,7 +1941,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
@@ -1952,7 +1952,7 @@ END IF
 IF(LBLOWSNOW) THEN
   IF (ASSOCIATED(XSNWSUBL3D)) THEN
     IF (SIZE(XSNWSUBL3D) /= 0 ) THEN
-      TZFIELD = TFIELDDATA(                                                 &
+      TZFIELD = TFIELDMETADATA(                                             &
         CMNHNAME   = 'SNWSUBL3D',                                           &
         CSTDNAME   = '',                                                    &
         CLONGNAME  = 'SNWSUBL3D',                                           &
@@ -1971,7 +1971,7 @@ IF(LBLOWSNOW) THEN
       END DO
       ZWORK2D(:,:) = ZWORK2D(:,:)*1000. ! vapor water in mm unit
       !
-      TZFIELD = TFIELDDATA(                                     &
+      TZFIELD = TFIELDMETADATA(                                 &
         CMNHNAME   = 'COL_SNWSUBL',                             &
         CSTDNAME   = '',                                        &
         CLONGNAME  = 'COL_SNWSUBL',                             &
@@ -1993,7 +1993,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN
   CALL IO_Field_write(TPFILE,'NFRCLT',NFRCLT)
   CALL IO_Field_write(TPFILE,'NINFRT',NINFRT)
   !
-  TZFIELD = TFIELDDATA(                                   &
+  TZFIELD = TFIELDMETADATA(                               &
     CMNHNAME   = 'SSUFL_T',                               &
     CSTDNAME   = '',                                      &
     CLONGNAME  = 'SSUFL',                                 &
@@ -2006,7 +2006,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN
     LTIMEDEP   = .FALSE.                                  )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSUFL_T(:))
   !
-  TZFIELD = TFIELDDATA(                                   &
+  TZFIELD = TFIELDMETADATA(                               &
     CMNHNAME   = 'SSVFL_T',                               &
     CSTDNAME   = '',                                      &
     CLONGNAME  = 'SSVFL',                                 &
@@ -2019,7 +2019,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN
     LTIMEDEP   = .FALSE.                                  )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSVFL_T(:))
   !
-  TZFIELD = TFIELDDATA(                                    &
+  TZFIELD = TFIELDMETADATA(                                &
     CMNHNAME   = 'SSTFL_T',                                &
     CSTDNAME   = '',                                       &
     CLONGNAME  = 'SSTFL',                                  &
@@ -2032,7 +2032,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN
     LTIMEDEP   = .FALSE.                                   )
   CALL IO_Field_write(TPFILE,TZFIELD,XSSTFL_T(:))
   !
-  TZFIELD = TFIELDDATA(                               &
+  TZFIELD = TFIELDMETADATA(                           &
     CMNHNAME   = 'SSOLA_T',                           &
     CSTDNAME   = '',                                  &
     CLONGNAME  = 'SSOLA',                             &
@@ -2057,7 +2057,7 @@ IF (LFORCING) THEN
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD = TFIELDDATA(                                 &
+    TZFIELD = TFIELDMETADATA(                             &
       CMNHNAME   = 'DTFRC'//YFRC,                         &
       CSTDNAME   = '',                                    &
       CLONGNAME  = 'DTFRC'//YFRC,                         &
@@ -2070,7 +2070,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTFRC(JT))
 !
-    TZFIELD = TFIELDDATA(                                        &
+    TZFIELD = TFIELDMETADATA(                                    &
       CMNHNAME   = 'UFRC'//YFRC,                                 &
       CSTDNAME   = '',                                           &
       CLONGNAME  = 'UFRC'//YFRC,                                 &
@@ -2083,7 +2083,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                           &
+    TZFIELD = TFIELDMETADATA(                                       &
       CMNHNAME   = 'VFRC'//YFRC,                                    &
       CSTDNAME   = '',                                              &
       CLONGNAME  = 'VFRC'//YFRC,                                    &
@@ -2096,7 +2096,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                   &
+    TZFIELD = TFIELDMETADATA(               &
       CMNHNAME   = 'WFRC'//YFRC,            &
       CSTDNAME   = '',                      &
       CLONGNAME  = 'WFRC'//YFRC,            &
@@ -2109,7 +2109,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                  )
     CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = 'THFRC'//YFRC,                   &
       CSTDNAME   = '',                              &
       CLONGNAME  = 'THFRC'//YFRC,                   &
@@ -2122,7 +2122,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                          )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                        &
+    TZFIELD = TFIELDMETADATA(                    &
       CMNHNAME   = 'RVFRC'//YFRC,                &
       CSTDNAME   = '',                           &
       CLONGNAME  = 'RVFRC'//YFRC,                &
@@ -2135,7 +2135,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                       )
     CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
@@ -2148,7 +2148,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                 &
+    TZFIELD = TFIELDMETADATA(                                             &
       CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
       CSTDNAME   = '',                                                    &
       CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
@@ -2161,7 +2161,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
@@ -2174,7 +2174,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                                    &
+    TZFIELD = TFIELDMETADATA(                                                &
       CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
       CSTDNAME   = '',                                                       &
       CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
@@ -2187,7 +2187,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                                                   )
     CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                     &
+    TZFIELD = TFIELDMETADATA(                 &
       CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
       CSTDNAME   = '',                        &
       CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
@@ -2200,7 +2200,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                    )
     CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT))
 !
-    TZFIELD = TFIELDDATA(                                &
+    TZFIELD = TFIELDMETADATA(                            &
       CMNHNAME   = 'TENDUFRC'//YFRC,                     &
       CSTDNAME   = '',                                   &
       CLONGNAME  = 'TENDUFRC'//YFRC,                     &
@@ -2213,7 +2213,7 @@ IF (LFORCING) THEN
       LTIMEDEP   = .FALSE.                               )
     CALL IO_Field_write(TPFILE,TZFIELD,XTENDUFRC(:,JT))
 !
-    TZFIELD = TFIELDDATA(                                &
+    TZFIELD = TFIELDMETADATA(                            &
       CMNHNAME   = 'TENDVFRC'//YFRC,                     &
       CSTDNAME   = '',                                   &
       CLONGNAME  = 'TENDVFRC'//YFRC,                     &
@@ -2234,7 +2234,7 @@ END IF
 ! -------------------------------------------------------------------------
 IF ( L2D_ADV_FRC ) THEN
 !
-  TZFIELD = TFIELDDATA(                        &
+  TZFIELD = TFIELDMETADATA(                    &
     CMNHNAME   = 'NADVFRC1',                   &
     CSTDNAME   = '',                           &
     CLONGNAME  = 'NADVFRC1',                   &
@@ -2251,7 +2251,7 @@ IF ( L2D_ADV_FRC ) THEN
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD = TFIELDDATA(                                           &
+    TZFIELD = TFIELDMETADATA(                                       &
       CMNHNAME   = 'DTADV'//YFRC,                                   &
       CSTDNAME   = '',                                              &
       CLONGNAME  = 'DTADV'//YFRC,                                   &
@@ -2264,7 +2264,7 @@ IF ( L2D_ADV_FRC ) THEN
       LTIMEDEP   = .FALSE.                                          )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTADVFRC(JT))
 !
-    TZFIELD = TFIELDDATA(          &
+    TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'TH_ADV'//YFRC, &
       CSTDNAME   = '',             &
       CLONGNAME  = 'TH_ADV'//YFRC, &
@@ -2277,7 +2277,7 @@ IF ( L2D_ADV_FRC ) THEN
       LTIMEDEP   = .FALSE.         )
     CALL IO_Field_write(TPFILE,TZFIELD,XDTHFRC(:,:,:,JT))
 !    
-    TZFIELD = TFIELDDATA(         &
+    TZFIELD = TFIELDMETADATA(     &
       CMNHNAME   = 'Q_ADV'//YFRC, &
       CSTDNAME   = '',            &
       CLONGNAME  = 'Q_ADV'//YFRC, &
@@ -2295,7 +2295,7 @@ ENDIF
 !
 IF ( L2D_REL_FRC ) THEN
 !
-  TZFIELD = TFIELDDATA(                        &
+  TZFIELD = TFIELDMETADATA(                    &
     CMNHNAME   = 'NRELFRC1',                   &
     CSTDNAME   = '',                           &
     CLONGNAME  = 'NRELFRC1',                   &
@@ -2312,7 +2312,7 @@ IF ( L2D_REL_FRC ) THEN
 !
     WRITE (YFRC,'(I3.3)') JT
 !
-    TZFIELD = TFIELDDATA(                                            &
+    TZFIELD = TFIELDMETADATA(                                        &
       CMNHNAME   = 'DTREL'//YFRC,                                    &
       CSTDNAME   = '',                                               &
       CLONGNAME  = 'DTREL'//YFRC,                                    &
@@ -2325,7 +2325,7 @@ IF ( L2D_REL_FRC ) THEN
       LTIMEDEP   = .FALSE.                                           )
     CALL IO_Field_write(TPFILE,TZFIELD,TDTRELFRC(JT))
 !                                                                
-    TZFIELD = TFIELDDATA(          &
+    TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'TH_REL'//YFRC, &
       CSTDNAME   = '',             &
       CLONGNAME  = 'TH_REL'//YFRC, &
@@ -2338,7 +2338,7 @@ IF ( L2D_REL_FRC ) THEN
       LTIMEDEP   = .FALSE.         )
     CALL IO_Field_write(TPFILE,TZFIELD,XTHREL(:,:,:,JT))
 !    
-    TZFIELD = TFIELDDATA(         &
+    TZFIELD = TFIELDMETADATA(     &
       CMNHNAME   = 'Q_REL'//YFRC, &
       CSTDNAME   = '',            &
       CLONGNAME  = 'Q_REL'//YFRC, &
@@ -2417,7 +2417,7 @@ IF ( CPROGRAM=='REAL  ' ) THEN
 !*       1.16    Dummy variables in PREP_REAL_CASE
 !
   IF (ALLOCATED(CDUMMY_2D)) THEN
-    TZFIELD = TFIELDDATA(                           &
+    TZFIELD = TFIELDMETADATA(                       &
       CMNHNAME   = 'generic for CDUMMY_2D variables', & !Temporary name to ease identification
       CSTDNAME   = '',                                &
       CUNITS     = '',                                &
@@ -2442,7 +2442,7 @@ END IF
 !             i) Main
 !
 IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN
-  TZFIELD = TFIELDDATA(                                &
+  TZFIELD = TFIELDMETADATA(                            &
     CMNHNAME   = 'generic for wind turbine variables', & !Temporary name to ease identification
     CSTDNAME   = '',                                   &
     CUNITS     = 'N',                                  &
@@ -2489,7 +2489,7 @@ SELECT CASE(CMETH_EOL)
 !
   CASE('ADNR') ! Actuator Disc Non-Rotating
 !
-    TZFIELD = TFIELDDATA(                        &
+    TZFIELD = TFIELDMETADATA(                    &
       CMNHNAME   = 'generic for ADNR variables', & !Temporary name to ease identification
       CSTDNAME   = '',                           &
       CUNITS     = '1',                          &
@@ -2529,7 +2529,7 @@ SELECT CASE(CMETH_EOL)
 !
   CASE('ALM') ! Actuator Line Method
 !
-    TZFIELD = TFIELDDATA(                       &
+    TZFIELD = TFIELDMETADATA(                   &
       CMNHNAME   = 'generic for ALM variables', & !Temporary name to ease identification
       CSTDNAME   = '',                          &
       CDIR       = '--',                        &
@@ -2599,7 +2599,7 @@ SELECT CASE(CMETH_EOL)
 !
     IF (MEAN_COUNT /= 0) THEN
 !
-      TZFIELD = TFIELDDATA(                            &
+      TZFIELD = TFIELDMETADATA(                        &
         CMNHNAME   = 'generic for ALM mean variables', & !Temporary name to ease identification
         CSTDNAME   = '',                               &
         CDIR       = '--',                             &
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 21ac274af..5ede529c5 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -11,7 +11,7 @@ CONTAINS
 
 SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
 !
-use modd_field, only: tfielddata, tfieldlist
+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
@@ -99,7 +99,7 @@ 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 = TFIELDDATA(          &
+  TPFIELD = TFIELDMETADATA(      &
     CMNHNAME   = TRIM(HREC),     &
     CSTDNAME   = '',             &
     CLONGNAME  = TRIM(HREC),     &
@@ -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,7 +285,7 @@ END SUBROUTINE WRITE_SURFX0_MNH
 !             ------------
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
-use modd_field,         only: tfielddata, tfieldlist, TYPEREAL
+use modd_field,         only: tfieldmetadata, tfieldlist, TYPEREAL
 USE MODD_GRID_n,        ONLY: XXHAT, XYHAT
 USE MODD_IO,            ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,   ONLY :NMASK, CMASK,                          &
@@ -334,8 +334,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 +437,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
@@ -468,7 +468,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
@@ -549,7 +549,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 +603,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,7 +641,7 @@ END IF
 !GCOVER_PACKED = ( NB_PROCIO_W /= 1 )
 GCOVER_PACKED = .FALSE.
 !
-TZFIELD = TFIELDDATA(          &
+TZFIELD = TFIELDMETADATA(      &
   CMNHNAME   = 'COVER_PACKED', &
   CSTDNAME   = '',             &
   CLONGNAME  = 'COVER_PACKED', &
@@ -672,7 +672,7 @@ END DO
 !
 IF (.NOT. GCOVER_PACKED) THEN
   ICOVER=0
-  TZFIELD = TFIELDDATA(                         &
+  TZFIELD = TFIELDMETADATA(                     &
     CMNHNAME   = 'generic for COVER variables', & !Temporary name to ease identification
     CSTDNAME   = '',                            &
     CUNITS     = '',                            &
@@ -754,7 +754,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,          &
@@ -797,8 +797,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))
@@ -904,7 +904,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
@@ -924,9 +924,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))
@@ -998,7 +998,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
@@ -1028,8 +1028,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))
@@ -1102,7 +1102,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
 
@@ -1121,9 +1121,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))
@@ -1198,7 +1198,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
@@ -1228,8 +1228,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))
@@ -1313,7 +1313,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
 
@@ -1332,8 +1332,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))
 !
@@ -1396,7 +1396,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
 
@@ -1420,11 +1420,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))
@@ -1490,7 +1490,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
 
@@ -1514,9 +1514,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))
@@ -1530,7 +1530,7 @@ ELSE
   ITDATE(2,:) = KMONTH (:)
   ITDATE(3,:) = KDAY   (:)
   !
-  TZFIELD = TFIELDDATA(                &
+  TZFIELD = TFIELDMETADATA(            &
     CMNHNAME   = TRIM(HREC)//'%TDATE', &
     CSTDNAME   = '',                   &
     CLONGNAME  = TRIM(HREC)//'%TDATE', &
@@ -1549,7 +1549,7 @@ ELSE
     CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
   END IF
   !
-  TZFIELD = TFIELDDATA(                &
+  TZFIELD = TFIELDMETADATA(            &
     CMNHNAME   = TRIM(HREC)//'%xtime', &
     CSTDNAME   = '',                   &
     CLONGNAME  = TRIM(HREC)//'%xtime', &
diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90
index c6c85422f..3aea708e6 100644
--- a/src/MNH/zsmt_pgd.f90
+++ b/src/MNH/zsmt_pgd.f90
@@ -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
@@ -334,7 +334,7 @@ IF(OHSLOP) THEN
  END DO
  !
   ! Writes filtred orography and slopes along i and j
-  TZFIELD = TFIELDDATA(                     &
+  TZFIELD = TFIELDMETADATA(                 &
     CMNHNAME   = 'ZSLOPEX',                 &
     CSTDNAME   = '',                        &
     CLONGNAME  = 'ZSLOPEX',                 &
@@ -347,7 +347,7 @@ IF(OHSLOP) THEN
     LTIMEDEP   = .FALSE.                    )
  CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEX)
  !
-  TZFIELD = TFIELDDATA(                     &
+  TZFIELD = TFIELDMETADATA(                 &
     CMNHNAME   = 'ZSLOPEY',                 &
     CSTDNAME   = '',                        &
     CLONGNAME  = 'ZSLOPEY',                 &
@@ -360,7 +360,7 @@ IF(OHSLOP) THEN
     LTIMEDEP   = .FALSE.                    )
  CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEY)
  !
-  TZFIELD = TFIELDDATA(               &
+  TZFIELD = TFIELDMETADATA(           &
     CMNHNAME   = 'ZS_FILTR',          &
     CSTDNAME   = '',                  &
     CLONGNAME  = 'ZS_FILTR',          &
-- 
GitLab


From fef4c4b57f2d3ac760b8a863bfd95422be2a1007 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 26 Nov 2021 14:05:32 +0100
Subject: [PATCH 020/157] Philippe 26/11/2021: IO: create TSVLIST to store
 metadata of all scalar variables

---
 src/MNH/ini_nsv.f90    | 288 ++++++++++++++++++++++++++++++++++++++++-
 src/MNH/modd_nsv.f90   |  19 ++-
 src/MNH/update_nsv.f90 |  20 ++-
 3 files changed, 317 insertions(+), 10 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index c49362598..eddddd15e 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -70,7 +70,7 @@ END MODULE MODI_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
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -98,6 +98,7 @@ 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
 #ifdef MNH_FOREFIRE
 USE MODD_FOREFIRE
 #endif
@@ -106,6 +107,7 @@ 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, NUNITLGTMAX
 USE MODD_PARAM_LIMA,      ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, &
                                 NMOD_IFN, NMOD_IMM, LHHONI,  &
                                 LWARM, LCOLD, LRAIN, LSPRO
@@ -136,6 +138,8 @@ INTEGER, INTENT(IN)             :: KMI ! model index
 !
 CHARACTER(LEN=2) :: YNUM2
 CHARACTER(LEN=3) :: YNUM3
+CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
+CHARACTER(LEN=NUNITLGTMAX)    :: YUNITS
 INTEGER :: ILUOUT
 INTEGER :: ISV ! total number of scalar variables
 INTEGER :: IMODEIDX, IMOMENTS
@@ -570,7 +574,7 @@ ELSE
   NSV_LNOXEND_A(KMI)= 0
 END IF
 !
-! finale number of NSV variable
+! Final number of NSV variables
 !
 NSV_A(KMI) = ISV
 !
@@ -781,113 +785,393 @@ END IF
 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_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(2) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) // 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(3) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) // 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(4) ) // YNUM2
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) // YNUM2
   ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN
     CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) )
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) )
   ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN
     CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(5) )
+    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 m-3'
+    WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
+  ELSE
+    YUNITS = 'm-3'
+    WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)'
+  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) )
+
+  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     = 'ppp',                                    &
+    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) )
+
+  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     = 'ppp',                                      &
+    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) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppp',                                       &
+    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) )
+
+  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     = 'ppp',                                           &
+    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) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppp',                                       &
+    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) )
+
+  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     = 'ppp',                                           &
+    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) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppp',                                       &
+    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) )
+
+  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     = 'ppp',                                           &
+    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
 
 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
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVLNOX' // YNUM3,          &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVLNOX' // YNUM3,          &
+    CUNITS     = 'ppp',                      &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
 END DO
 
 END SUBROUTINE INI_NSV
diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 7a842a5c1..1f152e85a 100644
--- a/src/MNH/modd_nsv.f90
+++ b/src/MNH/modd_nsv.f90
@@ -30,15 +30,16 @@
 !!       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
 !-------------------------------------------------------------------------------
 !
 !*       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
 !
 IMPLICIT NONE
 SAVE
@@ -47,7 +48,8 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
 !
 LOGICAL :: LINI_NSV = .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=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A   !Names of all the scalar 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+..
@@ -89,7 +91,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
@@ -151,8 +153,11 @@ 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=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES   !Names of all the scalar 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_USER    = 0 ! number of user scalar variables with indices
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index c706bfe90..6e2e7f502 100644
--- a/src/MNH/update_nsv.f90
+++ b/src/MNH/update_nsv.f90
@@ -27,9 +27,11 @@ END MODULE MODI_UPDATE_NSV
 !!         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
 !-------------------------------------------------------------------------------
 !
-USE MODD_CONF, ONLY : NVERB
+USE MODD_CONF,  ONLY: NVERB
+USE MODD_FIELD, ONLY: tfieldmetadata
 USE MODD_NSV
 
 use mode_msg
@@ -40,6 +42,7 @@ INTEGER, INTENT(IN) :: KMI ! Model index
 
 CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP
 INTEGER :: JI, JJ
+TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP
 !
 ! STOP if INI_NSV has not be called yet
 IF (.NOT. LINI_NSV) THEN
@@ -65,6 +68,21 @@ END IF
 
 CSVNAMES => CSVNAMES_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)
 NSV_C2R2    = NSV_C2R2_A(KMI)
-- 
GitLab


From 19b149c1f3369e87d7b6cec2f1accd39ad807f36 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 26 Nov 2021 14:23:06 +0100
Subject: [PATCH 021/157] Philippe 26/11/2021: IO: use TSVLIST for LIMA
 variables

---
 src/MNH/ini_lb.f90                 | 258 ++++++++++++++++-------------
 src/MNH/read_field.f90             |  71 +-------
 src/MNH/spawn_field2.f90           |  72 +-------
 src/MNH/write_aircraft_balloon.f90 |  42 +----
 src/MNH/write_lbn.f90              |  55 +++---
 src/MNH/write_lfin.f90             |  78 +--------
 src/MNH/write_profilern.f90        |  52 ++----
 7 files changed, 206 insertions(+), 422 deletions(-)

diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index 3c610aa2d..710de1454 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1998-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.
@@ -151,10 +151,8 @@ 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_PARAMETERS,      ONLY: JPHEXT, NMNHNAMELGTMAX
+USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IFN
 USE MODD_PARAM_n
 USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
 USE MODD_SALT
@@ -224,14 +222,14 @@ INTEGER             :: JSV,JRR                    ! Loop index for MOIST AND
 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
 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
+CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE
 TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
@@ -676,120 +674,131 @@ 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
-            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_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
+  DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_FREE + NMOD_CCN - 1
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        TZFIELD = TSVLIST(JSV)
+        TZFIELD%CDIR = ''
+        YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
+
+        IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
+
+          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
+            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
+          END IF
+
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          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)
+              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
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBXSVM')
+            ENDIF
           END IF
-          !
-          IF (KSIZELBYSV_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_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
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
+
+          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
+            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
+          END IF
+
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          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)
+              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
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBYSVM')
+            ENDIF
           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
   !
-  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
-            TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-            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
+  DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        TZFIELD = TSVLIST(JSV)
+        TZFIELD%CDIR = ''
+        YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
+
+        IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
+
+          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
+            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
+          END IF
+
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          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)
+              WRITE(ILUOUT,*) 'IFN PLBXSVM   will be initialized to 0'
+            ELSE
 !callabortstop
-                  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
-                ENDIF
-              END IF
-            END IF
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
+            ENDIF
           END IF
-          !
-          IF (KSIZELBYSV_ll  /= 0 ) THEN
-            TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-            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
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
+
+          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
+            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
+          END IF
+
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          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)
+              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
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
+            ENDIF
           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
+        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
 ! ELEC scalar variables
 IF (NSV_ELECEND>=NSV_ELECBEG) THEN
   TZFIELD%CSTDNAME   = ''
@@ -1634,4 +1643,29 @@ IF (OLSOURCE) THEN
 !
 ENDIF
 !
+CONTAINS
+
+  SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME )
+
+    CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME
+
+    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
+
+  END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN
+
 END SUBROUTINE INI_LB
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 90b6c3552..12df351b5 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -289,10 +289,6 @@ USE MODD_NSV
 USE MODD_OCEANH
 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_PARAM_n,         ONLY: CSCONV
 USE MODD_PASPOL
 USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
@@ -420,7 +416,6 @@ 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
 CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
 CHARACTER(LEN=15)            :: YVAL
 REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
@@ -891,70 +886,12 @@ END IF
 !
 ! LIMA variables
 !
-DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
+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
-! 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(2))//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(3))//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(4))//INDICE//'T'
-    END IF
-! Hom. freez. of CCN
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'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)
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
     CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
   CASE ('INIT')
     PSVT(:,:,:,JSV) = 0.
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 360cb0e0e..e774f4c61 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -182,10 +182,6 @@ 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
@@ -278,7 +274,6 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1
 LOGICAL :: GUSERV
 !
 CHARACTER(LEN=15) :: YVAL
-CHARACTER(LEN=2)  :: INDICE
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
@@ -880,69 +875,12 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     ! 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
-      ! 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(2))//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(3))//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(4))//INDICE//'T'
-      END IF
-      ! Hom. freez. of CCN
-      IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'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)
+    DO JSV = NSV_LIMA_BEG, NSV_LIMA_END
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // '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,:)
+      IF ( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :)
     END DO
     !
     ! ELEC Scalar Variables
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index cd693d89c..a8dc25cb4 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -98,9 +98,6 @@ 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
@@ -214,7 +211,6 @@ INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
 INTEGER :: JPT      ! loop counter
 INTEGER :: IKU, IK
-CHARACTER(LEN=2)  :: INDICE
 INTEGER :: JLOOP
 type(tbudiachrometadata) :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
@@ -435,39 +431,13 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
 ! 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 .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(2))//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(3))//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(4))//INDICE//'T'
-    ENDIF
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(5))//'T'
-    IF (JSV .EQ. NSV_LIMA_SPRO)     YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(5))//'T'
+
+    YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
+    YUNIT(JPROC)    = TRIM( TSVLIST(JSV)%CUNITS )
+    YCOMMENT(JPROC) = ' '
+
     ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
-  END DO 
+  END DO
   ! electrical scalar variables
   DO JSV = NSV_ELECBEG,NSV_ELECEND
     JPROC = JPROC+1
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 001d85f1d..4b612a21e 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -91,7 +91,7 @@ USE MODD_LUNIT_n
 USE MODD_PARAM_n
 USE MODD_TURB_n
 USE MODD_NSV
-USE MODD_PARAM_LIMA
+USE MODD_PARAM_LIMA,     ONLY: NMOD_CCN, NMOD_IFN
 USE MODD_PARAM_n
 !
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb
@@ -105,8 +105,6 @@ 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 MODI_CH_AER_REALLFI_n
@@ -119,9 +117,9 @@ USE MODD_DUST
 USE MODD_SALT
 USE MODI_DUSTLFI_n
 USE MODI_SALTLFI_n
-USE MODD_PARAMETERS,      ONLY: JPHEXT
+USE MODD_PARAMETERS,      ONLY: JPHEXT, NMNHNAMELGTMAX
 USE MODD_IO, ONLY: TFILEDATA
-use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL
+use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL
 !
 !
 IMPLICIT NONE
@@ -145,14 +143,13 @@ REAL,    DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODR
 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
+CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE
 TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
@@ -372,48 +369,48 @@ IF (NSV >=1) THEN
 ! 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)
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CDIR = ''
+      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
+      YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
+      !
       IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
+        TZFIELD%CLONGNAME  = 'LBX_' // TRIM( YMNHNAME_BASE )
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV
         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%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
+        TZFIELD%CLONGNAME  = 'LBY_' // TRIM( YMNHNAME_BASE )
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV
         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)
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CDIR = ''
+      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
+      YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
+      !
       IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
+        TZFIELD%CLONGNAME  = 'LBX_' // TRIM( YMNHNAME_BASE )
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV
         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(2))//INDICE)
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
+        TZFIELD%CLONGNAME  = 'LBY_' // TRIM( YMNHNAME_BASE )
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV
         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
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 6b1823d8c..2fdcafd44 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -244,10 +244,7 @@ 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_PARAM_LIMA,     ONLY: LSCAV, LAERO_MASS
 USE MODD_LIMA_PRECIP_SCAVENGING_n
 !
 USE MODE_IO_FILE,        only: IO_File_close
@@ -332,7 +329,6 @@ 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(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
@@ -965,73 +961,11 @@ IF (NSV >=1) THEN
 !
 ! 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.
-  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
-! 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(2))//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(3))//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(4))//INDICE//'T'
-    END IF
-! Hom. freez. of CCN
-    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'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)
+  DO JSV = NSV_LIMA_BEG, NSV_LIMA_END
+
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
 !
     JSA=JSA+1
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index 13d9e1a8e..482a67713 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -21,16 +21,18 @@
 !      ###########################
 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
 
@@ -92,9 +94,6 @@ 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_PROFILER_n
 USE MODD_RADIATIONS_n,    ONLY: NAER
@@ -111,9 +110,9 @@ INTEGER,          INTENT(IN) :: KI
 !
 !*      0.2  declaration of local variables for diachro
 !
-character(len=2)                                     :: yidx
-character(len=100)                                   :: ycomment
-character(len=100)                                   :: yname
+character(len=NCOMMENTLGTMAX)                        :: ycomment
+character(len=NMNHNAMELGTMAX)                        :: yname
+character(len=NUNITLGTMAX)                           :: yunits
 CHARACTER(LEN=:),                        allocatable :: YGROUP   ! group title
 INTEGER                                              :: IKU
 INTEGER                                              :: IPROC    ! number of variables records
@@ -207,35 +206,10 @@ if ( Size( tprofiler%sv, 4 ) > 0  ) then
   end do
   ! LIMA variables
   do jsv = nsv_lima_beg, nsv_lima_end
-    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'
-    else if ( jsv == nsv_lima_ni ) then
-      yname = Trim( clima_cold_names(1) ) // '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(2) ) // 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(3) ) // 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(4) ) // yidx // 'T'
-    else if ( jsv == nsv_lima_hom_haze ) then
-      yname = Trim( clima_cold_names(5) ) // 'T'
-    else if ( jsv == nsv_lima_spro ) then
-      yname = Trim( clima_warm_names(5) ) // 'T'
-    end if
-    call Add_profile( yname, '', 'kg-1', tprofiler%sv(:,:,:,jsv) )
+    yname  = Trim( tsvlist(jsv)%cmnhname )
+    yunits = Trim( tsvlist(jsv)%cunits )
+    ycomment = ''
+    call Add_profile( yname, ycomment, yunits, tprofiler%sv(:,:,:,jsv) )
   end do
   ! electrical scalar variables
   do jsv = nsv_elecbeg, nsv_elecend
-- 
GitLab


From 34076db93350ef3b3a14cd5960c34947363d001a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 11:38:52 +0100
Subject: [PATCH 022/157] Philippe 05/01/2022: replace ppp by ppv (ppp is not a
 valid unit)

---
 src/MNH/aer_monitorn.f90               |  6 +++---
 src/MNH/ch_aer_reallfin.f90            | 13 ++++---------
 src/MNH/ch_convect_scavenging.f90      |  7 ++++---
 src/MNH/ch_emission_flux0d.f90         | 16 ++++++++--------
 src/MNH/ch_field_valuen.f90            |  4 ++--
 src/MNH/ch_model0d.f90                 | 16 ++++++++--------
 src/MNH/ch_monitorn.f90                |  6 +++---
 src/MNH/ch_read_chem.f90               |  6 +++---
 src/MNH/ch_surface0d.f90               |  8 ++++----
 src/MNH/ch_write_chem.f90              |  6 +++---
 src/MNH/effic_aero.f90                 | 12 ++++--------
 src/MNH/effic_dust.f90                 | 10 +++-------
 src/MNH/effic_salt.f90                 | 10 +++-------
 src/MNH/ground_paramn.f90              | 14 +++++++-------
 src/MNH/ini_lb.f90                     | 16 ++++++++--------
 src/MNH/ini_nsv.f90                    | 22 +++++++++++-----------
 src/MNH/modd_ch_flxn.f90               | 11 +++--------
 src/MNH/mode_aero_psd.f90              | 23 +++++++++--------------
 src/MNH/mode_blowsnow_psd.f90          |  6 +++---
 src/MNH/mode_dust_psd.f90              | 24 ++++++++++--------------
 src/MNH/mode_salt_psd.f90              | 24 ++++++++++--------------
 src/MNH/mode_salt_psd_wet.f90          | 24 ++++++++++--------------
 src/MNH/radiations.f90                 |  8 ++++----
 src/MNH/read_all_data_grib_case.f90    |  4 ++--
 src/MNH/read_chem_data_netcdf_case.f90 |  4 ++--
 src/MNH/read_field.f90                 | 18 +++++++++---------
 src/MNH/sedim_blowsnow.f90             |  4 ++--
 src/MNH/sedim_dust.f90                 |  6 +++---
 src/MNH/sedim_salt.f90                 |  6 +++---
 src/MNH/spawn_field2.f90               | 14 +++++++-------
 src/MNH/write_lbn.f90                  |  8 ++++----
 src/MNH/write_lfifm1_for_diag_supp.f90 |  6 +++---
 src/MNH/write_lfin.f90                 | 20 ++++++++++----------
 src/MNH/write_ts1d.f90                 |  4 ++--
 34 files changed, 174 insertions(+), 212 deletions(-)

diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90
index 97faca64c..22d5f69a9 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/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90
index 99b0f8766..505f3acfa 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 a0bfccfd6..dd8a55917 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 540a03306..74b84f6d4 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 0693c28a2..0dcd5670a 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 c2b4fb457..26ff9fe18 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 eee756dfb..5539015c3 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.
@@ -623,7 +623,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
 !
@@ -910,7 +910,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,:)
     ZSIG0(JM+1,:)   = LOG(XSIG3D(JI,JJ,JK,:))
     ZRG0(JM+1,:)    =  XRG3D(JI,JJ,JK,:)  
diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90
index bd3ed06df..29a166440 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 ce3bab6c4..8247ae0b7 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 ecc8a4b1e..a3c05fd66 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/effic_aero.f90 b/src/MNH/effic_aero.f90
index 83d653057..f3d053a49 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 0f3755fcf..a3ba0109e 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 a26367896..6b7f152d2 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/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index b504d4b1b..795d0eb7e 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-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,7 +18,7 @@ INTERFACE
 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)
@@ -195,7 +195,7 @@ IMPLICIT NONE
 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)
@@ -679,7 +679,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
@@ -690,7 +690,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
@@ -700,7 +700,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
@@ -710,7 +710,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
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index 710de1454..2d30bdde0 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.
@@ -913,7 +913,7 @@ END IF
 ! Chemical aqueous phase scalar variables
 IF (NSV_CHACEND>=NSV_CHACBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -969,7 +969,7 @@ END IF
 ! Chemical ice phase scalar variables
 IF (NSV_CHICEND>=NSV_CHICBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1025,7 +1025,7 @@ END IF
 ! Orilam aerosol scalar variables
 IF (NSV_AEREND>=NSV_AERBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1081,7 +1081,7 @@ END IF
 ! Orilam aerosols moist scalar variables
 IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1137,7 +1137,7 @@ END IF
 ! Dust scalar variables
 IF (NSV_DSTEND>=NSV_DSTBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1193,7 +1193,7 @@ END IF
 !
 IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1250,7 +1250,7 @@ END IF
 ! Sea salt scalar variables
 IF (NSV_SLTEND>=NSV_SLTBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = ''
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index eddddd15e..072ec322b 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.
@@ -842,7 +842,7 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
     CMNHNAME   = 'SV LIMA ' // YNUM3,        &
     CSTDNAME   = '',                         &
     CLONGNAME  = '',                         &
-    CUNITS     = 'kg-1',                    &
+    CUNITS     = 'kg-1',                     &
     CDIR       = 'XY',                       &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
     NGRID      = 1,                          &
@@ -1003,7 +1003,7 @@ DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI)
     CMNHNAME   = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                       &
     CLONGNAME  = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                    &
+    CUNITS     = 'ppv',                                    &
     CDIR       = 'XY',                                     &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,               &
     NGRID      = 1,                                        &
@@ -1021,7 +1021,7 @@ DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI)
     CMNHNAME   = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                         &
     CLONGNAME  = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                      &
+    CUNITS     = 'ppv',                                      &
     CDIR       = 'XY',                                       &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                 &
     NGRID      = 1,                                          &
@@ -1039,7 +1039,7 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
     CMNHNAME   = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                          &
     CLONGNAME  = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                       &
+    CUNITS     = 'ppv',                                       &
     CDIR       = 'XY',                                        &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
     NGRID      = 1,                                           &
@@ -1057,7 +1057,7 @@ DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI)
     CMNHNAME   = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                              &
     CLONGNAME  = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                           &
+    CUNITS     = 'ppv',                                           &
     CDIR       = 'XY',                                            &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
     NGRID      = 1,                                               &
@@ -1075,7 +1075,7 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
     CMNHNAME   = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                          &
     CLONGNAME  = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                       &
+    CUNITS     = 'ppv',                                       &
     CDIR       = 'XY',                                        &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
     NGRID      = 1,                                           &
@@ -1093,7 +1093,7 @@ DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI)
     CMNHNAME   = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                              &
     CLONGNAME  = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                           &
+    CUNITS     = 'ppv',                                           &
     CDIR       = 'XY',                                            &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
     NGRID      = 1,                                               &
@@ -1111,7 +1111,7 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
     CMNHNAME   = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                          &
     CLONGNAME  = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                       &
+    CUNITS     = 'ppv',                                       &
     CDIR       = 'XY',                                        &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
     NGRID      = 1,                                           &
@@ -1129,7 +1129,7 @@ DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI)
     CMNHNAME   = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
     CSTDNAME   = '',                                              &
     CLONGNAME  = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppp',                                           &
+    CUNITS     = 'ppv',                                           &
     CDIR       = 'XY',                                            &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
     NGRID      = 1,                                               &
@@ -1165,7 +1165,7 @@ DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
     CMNHNAME   = 'SVLNOX' // YNUM3,          &
     CSTDNAME   = '',                         &
     CLONGNAME  = 'SVLNOX' // YNUM3,          &
-    CUNITS     = 'ppp',                      &
+    CUNITS     = 'ppv',                      &
     CDIR       = 'XY',                       &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
     NGRID      = 1,                          &
diff --git a/src/MNH/modd_ch_flxn.f90 b/src/MNH/modd_ch_flxn.f90
index 47c729a93..4a1e9930f 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/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90
index cb09f5461..9eedf4e47 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
@@ -29,7 +24,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
@@ -43,7 +38,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
@@ -317,7 +312,7 @@ END SUBROUTINE PPP2AERO
 !
 !   ############################################################
   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
@@ -328,7 +323,7 @@ END SUBROUTINE PPP2AERO
 !!
 !!    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
 !!    ---------
@@ -519,7 +514,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
@@ -537,7 +532,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
@@ -551,7 +546,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 71298e331..6e741809b 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_dust_psd.f90 b/src/MNH/mode_dust_psd.f90
index 70e078f5e..3fdff9eb7 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
@@ -324,7 +320,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
@@ -334,7 +330,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
 !!    -------
@@ -539,7 +535,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
@@ -552,7 +548,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
@@ -586,7 +582,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_salt_psd.f90 b/src/MNH/mode_salt_psd.f90
index dc5a8611e..c014096a8 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
@@ -354,7 +350,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
@@ -364,7 +360,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
 !!    -------
@@ -571,7 +567,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
@@ -584,7 +580,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
@@ -618,7 +614,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 cb5af52f8..2a679f193 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/radiations.f90 b/src/MNH/radiations.f90
index 809d0d6f0..3778dd245 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.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.
@@ -897,7 +897,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
@@ -911,7 +911,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
@@ -926,7 +926,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
diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index 841ae62b0..18ac78eda 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.
@@ -1362,7 +1362,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_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90
index 547a55b53..d779c372a 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.
@@ -439,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_field.f90 b/src/MNH/read_field.f90
index a21ac5b41..0264f75c6 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-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.
@@ -977,7 +977,7 @@ END IF
 !
 IF (NSV_CHICEND>=NSV_CHICBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1000,7 +1000,7 @@ END IF
 !
 IF (NSV_SLTEND>=NSV_SLTBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1022,7 +1022,7 @@ END IF
 !
 IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1044,7 +1044,7 @@ END IF
 !
 IF (NSV_DSTEND>=NSV_DSTBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1066,7 +1066,7 @@ END IF
 !
 IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1088,7 +1088,7 @@ END IF
 !
 IF (NSV_AEREND>=NSV_AERBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1110,7 +1110,7 @@ END IF
 !
 IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1241,7 +1241,7 @@ END IF
 !
 IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CUNITS     = 'ppv'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/sedim_blowsnow.f90 b/src/MNH/sedim_blowsnow.f90
index 2cb0f8264..75985a3dc 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 145939e1f..339f4cfa7 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 43e407a88..702737741 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/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index e774f4c61..a36f75467 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.
@@ -912,7 +912,7 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -932,7 +932,7 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     IF (NSV_CHICEND>=NSV_CHICBEG) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -953,7 +953,7 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     IF (NSV_AEREND>=NSV_AERBEG) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -973,7 +973,7 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     IF (NSV_DSTEND>=NSV_DSTBEG) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -993,7 +993,7 @@ IF (PRESENT(TPSONFILE)) THEN
     !
     IF (NSV_SLTEND>=NSV_SLTBEG) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -1035,7 +1035,7 @@ IF (PRESENT(TPSONFILE)) THEN
 !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%CUNITS     = 'ppv' !PW: TODO: not sure (depends if LINOX or LINOXT)
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 4b612a21e..1051579a1 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.
@@ -473,7 +473,7 @@ IF (NSV >=1) THEN
     END IF
     !
     TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CUNITS     = 'ppv'
     TZFIELD%CDIR       = ''
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
@@ -610,7 +610,7 @@ IF (NSV >=1) THEN
     END IF
     !
     TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CUNITS     = 'ppv'
     TZFIELD%CDIR       = ''
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
@@ -699,7 +699,7 @@ IF (NSV >=1) THEN
     END IF
     !
     TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CUNITS     = 'ppv'
     TZFIELD%CDIR       = ''
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index f24f10f5b..72c472fc4 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.
@@ -1579,7 +1579,7 @@ IF (NEQ_BUDGET>0) THEN
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   !
-  TZFIELD%CUNITS     = 'ppp s-1'
+  TZFIELD%CUNITS     = 'ppv s-1'
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 4
   TZFIELD%LTIMEDEP   = .TRUE.
@@ -1607,7 +1607,7 @@ END IF
 ! chemical prod/loss terms
 IF (NEQ_PLT>0) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppp s-1'
+  TZFIELD%CUNITS     = 'ppv s-1'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 3324cac3b..cd875dd96 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-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.
@@ -1225,7 +1225,7 @@ IF (NSV >=1) THEN
     DO JSV = NSV_CHEMBEG,NSV_CHEMEND
       TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T'
       TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
       CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
       !
@@ -1236,7 +1236,7 @@ IF (NSV >=1) 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'
+        TZFIELD%CUNITS     = 'ppv'
         WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
         CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
         !
@@ -1283,7 +1283,7 @@ IF (NSV >=1) THEN
     ENDIF
   ELSE IF (LCH_CONV_LINOX) THEN
     TZFIELD%CSTDNAME   = ''
-    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CUNITS     = 'ppv'
     TZFIELD%CDIR       = 'XY'
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
@@ -1306,7 +1306,7 @@ IF (NSV >=1) THEN
       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%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -1325,7 +1325,7 @@ IF (NSV >=1) THEN
     END IF
     IF (LDEPOS_AER(IMI)) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -1352,7 +1352,7 @@ IF (NSV >=1) THEN
     !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%CUNITS     = 'ppv'
     TZFIELD%CDIR       = 'XY'
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
@@ -1372,7 +1372,7 @@ IF (NSV >=1) THEN
 
     IF (LDEPOS_DST(IMI)) THEN
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
@@ -1399,7 +1399,7 @@ IF (NSV >=1) THEN
     !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%CUNITS     = 'ppv'
     TZFIELD%CDIR       = 'XY'
     TZFIELD%NGRID      = 1
     TZFIELD%NTYPE      = TYPEREAL
@@ -1419,7 +1419,7 @@ IF (NSV >=1) THEN
 
     IF (LDEPOS_SLT(IMI)) THEN        
       TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CUNITS     = 'ppv'
       TZFIELD%CDIR       = 'XY'
       TZFIELD%NGRID      = 1
       TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/write_ts1d.f90 b/src/MNH/write_ts1d.f90
index 440d7303f..4ffad8b5f 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
-- 
GitLab


From 6545fba13ad0d9a11bd381e3da55a98356f5dee6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 11:43:28 +0100
Subject: [PATCH 023/157] Philippe 05/01/2022: SURFEX: replace ppp by ppv (ppp
 is not a valid unit)

---
 src/SURFEX/build_emisstabn.F90         |  8 ++++----
 src/SURFEX/ch_aer_emission.F90         |  6 +++---
 src/SURFEX/ch_bvocemn.F90              |  4 ++--
 src/SURFEX/ch_conversion_factor.F90    |  4 ++--
 src/SURFEX/ch_emission_fluxn.F90       |  4 ++--
 src/SURFEX/modd_gr_biog_gardenn.F90    |  6 +++---
 src/SURFEX/modd_gr_biog_greenroofn.F90 |  6 +++---
 src/SURFEX/modd_gr_biogn.F90           |  6 +++---
 src/SURFEX/mode_aer_surf.F90           | 14 +++++++-------
 src/SURFEX/mode_dslt_surf.F90          |  6 +++---
 10 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/src/SURFEX/build_emisstabn.F90 b/src/SURFEX/build_emisstabn.F90
index 48b4dc5b2..5a8ecc2a0 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 3aba32d7f..eb3ad3af3 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 0b3504e36..ac823459d 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 31cdb9b37..89d59dea0 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 f9eae5451..f12a9bae3 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 1849ecf63..55097e16b 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 4f861e10e..6b87cb20d 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 9090cc3f7..a6c1477d4 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 a23ac0cdb..e70fa26ef 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 408f179f1..742a4de2f 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
-- 
GitLab


From df29957f7f2ea9ed3fad95cd01d7625b824f6b37 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 13:24:16 +0100
Subject: [PATCH 024/157] Philippe 05/01/2022: replace ppbv by ppb for
 homogeneity (ppb is the same as ppbv)

---
 src/MNH/read_field.f90            |  2 +-
 src/MNH/write_lfifm1_for_diag.f90 | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 0264f75c6..4f4051254 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -1241,7 +1241,7 @@ END IF
 !
 IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index e94351e1e..4adbf49c0 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.
@@ -1242,7 +1242,7 @@ IF (LCHEMDIAG) THEN
     TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T'
     TZFIELD%CSTDNAME   = ''
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ppbv'
+    TZFIELD%CUNITS     = 'ppb'
     TZFIELD%CDIR       = 'XY'
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
     TZFIELD%NGRID      = 1
@@ -1511,7 +1511,7 @@ IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
     TZFIELD%CMNHNAME   = 'LINOXT'
     TZFIELD%CSTDNAME   = ''
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-    TZFIELD%CUNITS     = 'ppbv'
+    TZFIELD%CUNITS     = 'ppb'
     TZFIELD%CDIR       = 'XY'
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','LNOX',JSV
     TZFIELD%NGRID      = 1
@@ -1554,7 +1554,7 @@ IF (LSALT) THEN
   !
   TZFIELD%CSTDNAME   = ''
   TZFIELD%CDIR       = 'XY'
-  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 3
@@ -1639,7 +1639,7 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
   ZSSLTDEP=XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND)
   !
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1739,7 +1739,7 @@ IF (LDUST) THEN
     ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
   !
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1817,7 +1817,7 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
   ZSDSTDEP=XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND)
   !
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
@@ -1910,7 +1910,7 @@ END IF
 ! Aerosol
 IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CUNITS     = 'ppb'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
-- 
GitLab


From b1c613b1ed11a8f13970e817547a36cfa7722f30 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 14:14:40 +0100
Subject: [PATCH 025/157] Philippe 05/01/2022: 'M' (molar) replaced by
 equivalent 'mol l-1' (M not known by udunits)

---
 src/MNH/write_lfifm1_for_diag.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 4adbf49c0..70c104339 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-2022 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.
@@ -1254,7 +1254,7 @@ IF (LCHEMDIAG) THEN
 END IF
 IF (LCHAQDIAG) THEN    !aqueous concentration in M
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'M'
+  TZFIELD%CUNITS     = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
-- 
GitLab


From 1b59fdf3b9164b6c89025c8fe17a631b15b0e93d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 14:27:21 +0100
Subject: [PATCH 026/157] Philippe 05/01/2022: units: do not write a warning if
 units in file is ppp instead of ppv or ppbv instead of ppb (they are
 equivalent anyway)

---
 src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index 248257734..8c68aeaf9 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.
@@ -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)')
-- 
GitLab


From e82370968f1f083f27b2934246669b435e647a21 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Jan 2022 15:45:51 +0100
Subject: [PATCH 027/157] Philippe 05/01/2022: 'mol i m-2' => 'mol m-2' (i was
 for species #i)

---
 src/MNH/write_lfin.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index cd875dd96..a6e257254 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -1243,12 +1243,12 @@ IF (NSV >=1) THEN
         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) 
+    IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol/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'
+        TZFIELD%CUNITS     = 'mol m-2'
         TZFIELD%CCOMMENT   = 'X_Y_Accumulated moles of aqueous species at the surface'
         ZWORK2D(:,:)  = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1)
         CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D)
-- 
GitLab


From 5931f1b8fae0f3a843a0b60907e46a21d5adbd89 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 14 Jan 2022 15:44:36 +0100
Subject: [PATCH 028/157] Philippe 14/01/2022: 1 LINI_NSV for each model

---
 src/MNH/ini_nsv.f90    | 2 +-
 src/MNH/modd_nsv.f90   | 4 ++--
 src/MNH/update_nsv.f90 | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 072ec322b..8b50992fb 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -148,7 +148,7 @@ INTEGER :: JMODE, JMOM, JSV_NAME
 !
 !-------------------------------------------------------------------------------
 !
-LINI_NSV = .TRUE.
+LINI_NSV(KMI) = .TRUE.
 
 ILUOUT = TLUOUT%NLU
 !
diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 1f152e85a..6ab654ead 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.
@@ -46,7 +46,7 @@ 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
 TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE, TARGET :: TSVLIST_A !Metadata of all the scalar variables
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index 6e2e7f502..58b3abc9e 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.
@@ -45,7 +45,7 @@ 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
 !
-- 
GitLab


From 651d0baa4b27043400db329398e8964c70228ae1 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 14 Jan 2022 16:17:06 +0100
Subject: [PATCH 029/157] Philippe 14/01/2022: there is only one (or zero)
 NSV_LNOX scalar variable

---
 src/MNH/ini_nsv.f90 | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 8b50992fb..ee054b972 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -1156,15 +1156,20 @@ DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI)
     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) = 'LINOX'
 
-  CSVNAMES_A(JSV,KMI) = 'SVLNOX'//YNUM3
+  WRITE( YNUM3, '( I3.3 )' ) JSV
 
   TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
-    CMNHNAME   = 'SVLNOX' // YNUM3,          &
+    CMNHNAME   = 'LINOX',                    &
     CSTDNAME   = '',                         &
-    CLONGNAME  = 'SVLNOX' // YNUM3,          &
+    CLONGNAME  = 'LINOX',                    &
     CUNITS     = 'ppv',                      &
     CDIR       = 'XY',                       &
     CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
-- 
GitLab


From 939c14ee2c4c08d288923aa3afa28a250c7eb473 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 14 Jan 2022 16:15:30 +0100
Subject: [PATCH 030/157] Philippe 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

---
 src/MNH/ini_nsv.f90    | 45 ++++++++++++++++++++++++++++++++++++++++++
 src/MNH/modd_nsv.f90   | 14 ++++++++++---
 src/MNH/update_nsv.f90 | 22 +++++++++++++++++++--
 3 files changed, 76 insertions(+), 5 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index ee054b972..01d0547f9 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -71,6 +71,8 @@ END MODULE MODI_INI_NSV
 !  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
+!  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
@@ -141,6 +143,7 @@ CHARACTER(LEN=3) :: YNUM3
 CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
 CHARACTER(LEN=NUNITLGTMAX)    :: YUNITS
 INTEGER :: ILUOUT
+INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array
 INTEGER :: ISV ! total number of scalar variables
 INTEGER :: IMODEIDX, IMOMENTS
 INTEGER :: JI, JJ, JSV
@@ -151,6 +154,9 @@ INTEGER :: JMODE, JMOM, JSV_NAME
 LINI_NSV(KMI) = .TRUE.
 
 ILUOUT = TLUOUT%NLU
+
+ICHIDX = 0
+NSV_CHEM_LIST_A(KMI) = 0
 !
 ! Users scalar variables are first considered
 !
@@ -386,6 +392,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
@@ -409,6 +416,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
@@ -447,6 +455,7 @@ 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)
 ELSE
   NSV_AER_A(KMI)   = 0
 ! force First index to be superior to last index
@@ -459,6 +468,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
@@ -484,6 +494,7 @@ IF (LDUST) THEN
   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
@@ -496,6 +507,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
@@ -521,6 +533,7 @@ IF (LSALT) THEN
   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
@@ -533,6 +546,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
@@ -566,6 +580,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
@@ -997,6 +1012,9 @@ 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(                    &
@@ -1015,6 +1033,9 @@ 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(                      &
@@ -1033,6 +1054,9 @@ 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
 
   TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
@@ -1051,6 +1075,9 @@ 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(                           &
@@ -1069,6 +1096,9 @@ 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(                       &
@@ -1087,6 +1117,9 @@ 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(                           &
@@ -1105,6 +1138,9 @@ 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(                       &
@@ -1123,6 +1159,9 @@ 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(                           &
@@ -1164,6 +1203,9 @@ IF ( NSV_LNOX_A(KMI) > 1 ) &
 DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
   CSVNAMES_A(JSV,KMI) = 'LINOX'
 
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX'
+
   WRITE( YNUM3, '( I3.3 )' ) JSV
 
   TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
@@ -1179,4 +1221,7 @@ DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
     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/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 6ab654ead..03631f3fe 100644
--- a/src/MNH/modd_nsv.f90
+++ b/src/MNH/modd_nsv.f90
@@ -31,15 +31,18 @@
 !  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
+!  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_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
+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
@@ -49,10 +52,12 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
 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
 !
@@ -154,12 +159,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
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index 58b3abc9e..a8bbe8e7b 100644
--- a/src/MNH/update_nsv.f90
+++ b/src/MNH/update_nsv.f90
@@ -28,11 +28,13 @@ END MODULE MODI_UPDATE_NSV
 !  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_FIELD, ONLY: tfieldmetadata
+USE MODD_CONF,       ONLY: NVERB
+USE MODD_FIELD,      ONLY: tfieldmetadata
 USE MODD_NSV
+USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX
 
 use mode_msg
 
@@ -41,6 +43,7 @@ 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
 !
@@ -68,6 +71,21 @@ END IF
 
 CSVNAMES => CSVNAMES_A(:,KMI)
 
+! 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 = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A )
+END IF
+
+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
-- 
GitLab


From 4484abb18309a5e51440e3f962a43920c5362689 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 3 Feb 2022 15:18:00 +0100
Subject: [PATCH 031/157] Philippe 03/02/2022: ini_nsv: correct some units

---
 src/MNH/ini_nsv.f90 | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 01d0547f9..b117f3edb 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -351,7 +351,6 @@ ELSE
 END IF
 !
 #ifdef MNH_FOREFIRE
-
 ! ForeFire tracers
 IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN
   NSV_FF_A(KMI)    = NFFSCALARS
@@ -903,6 +902,7 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
     TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) )
   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' )
@@ -915,11 +915,11 @@ 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 m-3'
+    YUNITS = 'C kg-1'
     WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
   ELSE
-    YUNITS = 'm-3'
-    WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)'
+    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(                        &
-- 
GitLab


From 5f392b389e697b36c04f49b9b79f9944fe52c896 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 4 Feb 2022 09:50:33 +0100
Subject: [PATCH 032/157] Philippe 04/02/2022: use TSVLIST everywhere + correct
 old problems in scalar variable treatment (incoherencies, missing writes,
 bugs...) + manage backward compatibility

---
 src/MNH/ini_deep_convection.f90        |  133 +--
 src/MNH/ini_lb.f90                     | 1350 ++++------------------
 src/MNH/ini_prog_var.f90               |  151 +--
 src/MNH/paspol.f90                     |    2 +-
 src/MNH/read_cams_data_netcdf_case.f90 |    4 +-
 src/MNH/read_field.f90                 |  596 ++--------
 src/MNH/spawn_field2.f90               |  402 +------
 src/MNH/write_aircraft_balloon.f90     |  139 +--
 src/MNH/write_lbn.f90                  |  724 ++----------
 src/MNH/write_lfifm1_for_diag.f90      | 1455 ++++++++++++------------
 src/MNH/write_lfifm1_for_diag_supp.f90 |  306 ++---
 src/MNH/write_lfin.f90                 |  801 +++----------
 src/MNH/write_profilern.f90            |   85 +-
 src/MNH/write_stationn.f90             |  144 +--
 14 files changed, 1624 insertions(+), 4668 deletions(-)

diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index 695d39a4d..cd57a04d4 100644
--- a/src/MNH/ini_deep_convection.f90
+++ b/src/MNH/ini_deep_convection.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.
@@ -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: tfieldmetadata, tfieldlist, TYPEREAL
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 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
 !
@@ -183,6 +173,8 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG
 INTEGER              :: IID
 INTEGER              :: IRESP
 INTEGER              :: JSV     ! number of tracers
+LOGICAL              :: GOLDFILEFORMAT
+LOGICAL              :: GREAD
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
@@ -196,6 +188,11 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*       2. INITIALIZE CONVECTIVE TENDENCIES
 !	        --------------------------------
 !
+!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
+GOLDFILEFORMAT = (        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 ) )
+
 PUMFCONV(:,:,:)  = 0.0
 PDMFCONV(:,:,:)  = 0.0
 PMFCONV(:,:,:)   = 0.0  ! warning, restart may be incorrect
@@ -258,8 +255,8 @@ ELSE
   END IF
 !
 !
- SELECT CASE(HGETSVCONV)
-  CASE('READ')
+ GETSVCONV: SELECT CASE(HGETSVCONV)
+  CASE('READ') GETSVCONV
     TZFIELD = TFIELDMETADATA(     &
       CMNHNAME   = 'generic for ini_deep_convection', & !Temporary name to ease identification
       CUNITS     = 's-1',         &
@@ -269,73 +266,39 @@ ELSE
       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.5.1 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_lb.f90 b/src/MNH/ini_lb.f90
index 2d30bdde0..c45c50666 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -131,35 +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: tfieldmetadata, 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_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 MODD_PARAM_n
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_SALT
 !
 USE MODE_IO_FIELD_READ,   only: IO_Field_read, IO_Field_read_lb
 USE MODE_MSG
-USE MODE_TOOLS, ONLY: UPCASE
 !
 IMPLICIT NONE
 !
@@ -221,15 +215,16 @@ 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_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 :: 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=NMNHNAMELGTMAX) :: YMNHNAME_BASE
+CHARACTER(LEN=NMNHNAMELGTMAX)  :: YMNHNAME_BASE
+CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE
 TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
@@ -246,7 +241,10 @@ ENDIF
 !*       1.    SOME INITIALIZATIONS
 !              --------------------
 !
-ILUOUT = TLUOUT%NLU
+!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
+GOLDFILEFORMAT = (        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 ) )
 !
 !
 !-------------------------------------------------------------------------------
@@ -283,37 +281,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
 !
@@ -321,11 +296,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
@@ -431,9 +405,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
@@ -449,9 +422,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
@@ -472,1121 +444,216 @@ 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
-            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
-            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
-            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
-  DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_FREE + NMOD_CCN - 1
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        TZFIELD = TSVLIST(JSV)
-        TZFIELD%CDIR = ''
-        YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
-
-        IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
-
-          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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
-          END IF
-
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          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)
-              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
-        !
-        IF (KSIZELBYSV_ll  /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
 
-          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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
-          END IF
+! 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 )
 
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          TZFIELD%CLBTYPE    = 'LBY'
+      IF ( KSIZELBXSV_ll /= 0 .AND. SIZE( PLBXSVM, 1 ) /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBX_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE )
 
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          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
+        !Some variables were written with an other name in MesoNH < 5.5.1
+        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
+            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.5.1) 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
+#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.5.1) 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
+#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.5.1) 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
-  !
-  DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
-    SELECT CASE(HGETSVM(JSV))
-      CASE ('READ')
-        TZFIELD = TSVLIST(JSV)
-        TZFIELD%CDIR = ''
-        YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
 
-        IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV
+        TZFIELD%CLBTYPE     = 'LBX'
 
-          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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
-          END IF
-
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          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 )
 
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
-          IF (IRESP/=0) THEN
-            IF (PRESENT(PLBXSVMM)) THEN
-              PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-              WRITE(ILUOUT,*) 'IFN PLBXSVM   will be initialized to 0'
+        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.5.1 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
+            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.5.1
+              PLBXSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
             ELSE
-!callabortstop
-              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN')
-            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 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
-
-          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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME )
-          END IF
+      END IF
 
-          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-          TZFIELD%CLBTYPE    = 'LBY'
+      IF ( KSIZELBYSV_ll /= 0 .AND. SIZE( PLBYSVM, 1 ) /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBY_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE )
 
-          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
-          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
-      CASE('INIT')
-        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-! 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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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
-            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
+        !Some variables were written with an other name in MesoNH < 5.5.1
+        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
+            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.5.1) 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
-            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
+          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.5.1) 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
-      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
+          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.5.1) 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_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
-            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.5.1 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.5.1
+              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
@@ -1645,9 +712,10 @@ ENDIF
 !
 CONTAINS
 
-  SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME )
+  SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME )
 
     CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME
+    CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME
 
     INTEGER :: IPOS
     INTEGER :: JI
@@ -1666,6 +734,8 @@ CONTAINS
       YMNHNAME(JI:JI) = ' '
     END DO
 
+    YLONGNAME = TRIM( YMNHNAME )
+
   END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN
 
 END SUBROUTINE INI_LB
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 216426209..2e9702b85 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,42 +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: TFIELDMETADATA, 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
+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
+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
@@ -213,7 +208,6 @@ 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
@@ -266,25 +260,18 @@ 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   
+
+  ! Read scalars in chem file
   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
+    DO JSV = NSV_CHEMBEG, NSV_CHEMEND
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
       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
@@ -298,18 +285,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   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)
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
       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
@@ -318,18 +297,10 @@ 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)
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
         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
@@ -340,18 +311,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   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)
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
       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))
@@ -359,18 +322,10 @@ 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)
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
         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
@@ -381,18 +336,10 @@ 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)
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
       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))
@@ -400,18 +347,10 @@ 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)
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
         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/paspol.f90 b/src/MNH/paspol.f90
index 7287cb0b4..af5da0665 100644
--- a/src/MNH/paspol.f90
+++ b/src/MNH/paspol.f90
@@ -579,7 +579,7 @@ END DO
 !*	3.4 Ecriture conditionnelle.
 !
 IF ( tpfile%lopened ) THEN
-  TZFIELD = TFIELDMetaDATA(            &
+  TZFIELD = TFIELDMETADATA(            &
     CMNHNAME   = 'generic for paspol', & !Temporary name to ease identification
     CSTDNAME   = '',                   &
     CUNITS     = 'm-3',                &
diff --git a/src/MNH/read_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90
index 89ab3518c..a4023d091 100644
--- a/src/MNH/read_cams_data_netcdf_case.f90
+++ b/src/MNH/read_cams_data_netcdf_case.f90
@@ -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
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 4f4051254..34a20049a 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -247,56 +247,48 @@ 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
+!  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
+!  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: tfieldmetadata, 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_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_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
@@ -418,7 +410,9 @@ 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
+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(TFIELDMETADATA)         :: TZFIELD
@@ -431,6 +425,10 @@ TYPE(TFIELDMETADATA)         :: TZFIELD
 GLSOURCE=.FALSE.
 ZWORK = 0.0
 !
+!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
+GOLDFILEFORMAT = (        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 ) )
 !-------------------------------------------------------------------------------
 !
 !*       2.    READ PROGNOSTIC VARIABLES
@@ -811,477 +809,83 @@ ENDIF
 !
 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')
+DO JSV = 1, NSV              ! initialize according to the get indicators
+  SELECT CASE( HGETSVT(JSV) )
+    CASE ('READ')
+      TZFIELD = TSVLIST(JSV)
+
+      IF ( GOLDFILEFORMAT .AND.                               &
+           ( ( 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.5.1
         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(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')
+      ELSE
+        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      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.
-        IF (LSUPSAT .AND. (HGETRVT == 'READ') ) 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*ALOG(ZWORK(:,:,:)))
+          ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:)))
           !rvsat
           ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
-          ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:)
+          ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/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 = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
-    CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
+      END IF
+
   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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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     = 'ppv'
-  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.
+
+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.
-    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
-!
-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
-!
-IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppb'
-  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
-!
-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')
-        PSVT(:,:,:,JSV) = 0.
-    END SELECT
-  END DO
-END IF
-IF (NSV_SNW>=1) THEN
+      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'
@@ -1289,20 +893,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
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index a36f75467..993f0ebd3 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -152,39 +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: 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_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
@@ -194,7 +186,6 @@ USE MODE_MSG
 USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_THERMO
-USE MODE_TOOLS,           ONLY: UPCASE
 !
 IMPLICIT NONE
 !
@@ -265,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
@@ -273,6 +265,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZPABST1,ZHUT1
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1
 LOGICAL :: GUSERV
 !
+CHARACTER(LEN=3)  :: YNUM3
 CHARACTER(LEN=15) :: YVAL
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
@@ -284,6 +277,13 @@ TYPE(TFIELDMETADATA) :: 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.5.1, some variables had different names or were not available
+  GOLDFILEFORMAT = (      TPSONFILE%NMNHVERSION(1) < 5                                                                            &
+                   .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) < 5 )                                      &
+                   .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) == 5  .AND. TPSONFILE%NMNHVERSION(3) < 1 ) )
+END IF
 !
 !*       1.0  recovers logical unit number of output listing
 !
@@ -834,327 +834,51 @@ 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 = TSVLIST(JSV)
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // '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     = 'ppv'
-      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     = 'ppv'
-      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     = 'ppv'
-      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     = 'ppv'
-      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     = 'ppv'
-      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     = 'ppv' !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 .AND.                               &
+         ( ( 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
+           ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) )    ) THEN
+        !Some variables were written with an other name in MesoNH < 5.5.1
+      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
       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_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
-        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      END DO
+      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+    ELSE
+      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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
-    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/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index a8dc25cb4..f957e9f77 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.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.
@@ -71,37 +71,24 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON
 !  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
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST
+USE MODD_CST,             ONLY: XRV
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LUNIT
-USE MODD_PARAMETERS
+USE MODD_PARAMETERS,      ONLY: XUNDEF
 !
 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 MODE_MODELN_HANDLER
-USE MODE_DUST_PSD
+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_DIAG_IN_RUN,     ONLY: LDIAG_IN_RUN
+!
 USE MODE_AERO_PSD
+USE MODE_DUST_PSD
+USE MODE_MODELN_HANDLER,  ONLY: GET_CURRENT_MODEL_INDEX
 use mode_msg
 use mode_write_diachro,   only: Write_diachro
 !
@@ -404,72 +391,21 @@ IF (LDIAG_IN_RUN) THEN
 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
+  ! Scalar variables
+  DO JSV = 1, NSV
+    JPROC = JPROC + 1
 
     YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
-    YUNIT(JPROC)    = TRIM( TSVLIST(JSV)%CUNITS )
-    YCOMMENT(JPROC) = ' '
-
-    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
+    YCOMMENT(JPROC) = ''
+    IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
+      YUNIT(JPROC)  = 'ppb'
+      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+    ELSE
+      YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
+      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
+    END IF
   END DO
+
   IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
 
     ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER))
@@ -485,7 +421,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
-                                  / ( 1. + ZRHO(1,1,:)                ) 
+                                  / ( 1. + ZRHO(1,1,:)                )
     ELSE
       ZRHO(1,1,:) = TPFLYER%TH(:)
     ENDIF
@@ -623,19 +559,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
       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)      
+      ZWORK6(1,1,1,:,1,JPROC) = 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)))
@@ -649,7 +578,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
-                                          / ( 1. + ZRHO(1,1,:)                ) 
+                                          / ( 1. + ZRHO(1,1,:)                )
     ELSE
       ZRHO(1,1,:) = TPFLYER%TH(:)
     ENDIF
@@ -676,17 +605,9 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
       WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
       ZWORK6 (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) = TPFLYER%SV(:,JSV) * 1.E9
-  END DO
 ENDIF
 !
 IF (SIZE(TPFLYER%TSRAD)>0) THEN
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 1051579a1..23cec11a8 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -78,50 +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, LDSTINIT, LDSTPRES, 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,     ONLY: NMOD_CCN, NMOD_IFN
-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, LSLTINIT, LSLTPRES
+
 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_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, NMNHNAMELGTMAX
-USE MODD_IO, ONLY: TFILEDATA
-use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL
-!
-!
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
@@ -130,45 +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
-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=NMNHNAMELGTMAX) :: YMNHNAME_BASE
+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
 !            --------------------------------
@@ -229,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
@@ -278,589 +258,99 @@ IF (NSV >=1) THEN
     NTYPE      = TYPELOG,      &
     NDIMS      = 0,            &
     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
+  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
-    DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
-      TZFIELD = TSVLIST(JSV)
-      TZFIELD%CDIR = ''
-      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
-      YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
-      !
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
-        TZFIELD%CLONGNAME  = 'LBX_' // TRIM( YMNHNAME_BASE )
-        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV
-        TZFIELD%CLBTYPE    = 'LBX'
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
-        TZFIELD%CLONGNAME  = 'LBY_' // TRIM( YMNHNAME_BASE )
-        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV
-        TZFIELD%CLBTYPE    = 'LBY'
-        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
-      TZFIELD = TSVLIST(JSV)
-      TZFIELD%CDIR = ''
-      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
-      YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME )
-      !
-      IF(NSIZELBXSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBX_' // TRIM( YMNHNAME_BASE )
-        TZFIELD%CLONGNAME  = 'LBX_' // TRIM( YMNHNAME_BASE )
-        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV
-        TZFIELD%CLBTYPE    = 'LBX'
-        CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
-      END IF
-      !
-      IF(NSIZELBYSV_ll /= 0) THEN
-        TZFIELD%CMNHNAME   = 'LBY_' // TRIM( YMNHNAME_BASE )
-        TZFIELD%CLONGNAME  = 'LBY_' // TRIM( YMNHNAME_BASE )
-        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV
-        TZFIELD%CLBTYPE    = 'LBY'
-        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 .OR. LDSTPRES ) 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 .OR. LSLTPRES ) 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     = 'ppv'
-    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 )
+!PW: TODO: comment a adapter (a la lecture aussi)
       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).OR.(LDSTPRES)) 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     = 'ppv'
-    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).OR.(LSLTPRES)) 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     = 'ppv'
-    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_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 70c104339..a14c099e6 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: tfieldmetadata, 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, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XYHAT, 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 
-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
+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_GATHER_ll,         only: GATHERALL_FIELD_ll
+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
 !
@@ -303,8 +287,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
@@ -1011,7 +995,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
@@ -1024,7 +1008,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
@@ -1068,76 +1052,52 @@ END IF
 ! User scalar variables
 ! individually in the file
 IF (LVAR_MRSV) THEN
-  TZFIELD = TFIELDMETADATA(                      &
-    CMNHNAME   = 'generic for scalar variables', & !Temporary name to ease identification
-    CSTDNAME   = '',                             &
-    CUNITS     = 'g kg-1',                       &
-    CDIR       = 'XY',                           &
-    NGRID      = 1,                              &
-    NTYPE      = TYPEREAL,                       &
-    NDIMS      = 3,                              &
-    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)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+   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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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
@@ -1192,7 +1152,7 @@ IF (LLIMA_DIAG) THEN
       TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))//'T'
     END IF
     !
-! Supersaturation          
+! Supersaturation
     IF (JSV .EQ. NSV_LIMA_SPRO) THEN
       TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(5))//'T'
     END IF
@@ -1235,36 +1195,127 @@ IF (LLIMA_DIAG) THEN
   END IF
 !
 END IF
+IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN
+  DO JSV = NSV_ELECBEG,NSV_ELECEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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
+      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 = 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*1e-3)
+
+  ! 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*1e-3)
+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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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
+  DO JSV = NSV_CSBEG, NSV_CSEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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     = 'ppb'
-    TZFIELD%CDIR       = 'XY'
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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     = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
-  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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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))
@@ -1274,8 +1325,10 @@ 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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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))
@@ -1293,325 +1346,226 @@ 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
+! Aerosol
+IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
+  DO JSV = NSV_AERBEG, NSV_AEREND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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
   !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'g m-3'
-  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 = 1,NSV_PP
-    ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV+NSV_PPBEG-1)*ZRHOT(:,:,:) )
-    WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'PPT',JSV
+  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)
-    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%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%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 = 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(:,:,:))
-  !
-  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
-  !
-  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(:,:))
-  !
-  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
-! 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.
-  !
-  DO JSV = NSV_LGBEG,NSV_LGEND
-    TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+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)
-    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
-!PW:BUG?: same name for all variables
-    TZFIELD%CMNHNAME   = 'LINOXT'
-    TZFIELD%CSTDNAME   = ''
+    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     = 'ppb'
-    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     = '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)
-    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     = '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     = 'ppb'
-  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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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))      &
@@ -1624,7 +1578,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
@@ -1634,33 +1588,35 @@ 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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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     = 'ppb'
-  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}
@@ -1668,45 +1624,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(:,:,:))
@@ -1718,78 +1674,84 @@ 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     = 'ppb'
-  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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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))      &
@@ -1802,7 +1764,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
@@ -1812,33 +1774,36 @@ 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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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     = 'ppb'
-  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}
@@ -1846,45 +1811,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(:,:,:))
@@ -1896,167 +1861,147 @@ 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     = 'ppb'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
-  TZFIELD%LTIMEDEP   = .TRUE.
+!
+!  Blowing snow variables
+!
+IF(LBLOWSNOW) THEN
+  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
-    TZFIELD%CMNHNAME   = 'RGA'
-    TZFIELD%CLONGNAME  = 'RGA'
-    TZFIELD%CUNITS     = 'um'
-    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ
-    CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ))
-    !
-    TZFIELD%CMNHNAME   = 'RGAM'
-    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%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+    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
@@ -3422,7 +3367,7 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
   !large-scale model
   IF (LMEAN_PR .AND. LUSERR) THEN
     TZFIELD = TFIELDMETADATA(                                               &
-      CSTDNAME   = 'generic LS_ACTOPR',                                     & !Temporary name to ease identification
+      CMNHNAME   = 'generic LS_ACTOPR',                                     & !Temporary name to ease identification
       CUNITS     = 'mm',                                                    &
       CDIR       = 'XY',                                                    &
       CCOMMENT   = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', &
@@ -4221,12 +4166,6 @@ ELSEIF (CBLTOP == 'RICHA') THEN
   !
   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 72c472fc4..fe258339c 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -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: NMNHDIM_UNUSED, tfieldmetadata, 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, 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
@@ -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
@@ -288,121 +279,35 @@ IF (NCONV_KF >= 0) THEN
     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)
@@ -762,22 +667,20 @@ 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
@@ -1575,14 +1478,15 @@ END IF
 !               -------------------------------
 !
 IF (NEQ_BUDGET>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  !
-  TZFIELD%CUNITS     = 'ppv 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'
@@ -1591,9 +1495,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'
@@ -1606,13 +1516,15 @@ END IF
 !
 ! chemical prod/loss terms
 IF (NEQ_PLT>0) THEN
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'ppv 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_lfin.f90 b/src/MNH/write_lfin.f90
index a6e257254..1a6694ce0 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -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
@@ -180,115 +178,105 @@ END MODULE MODI_WRITE_LFIFM_n
 !  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
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       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: NMNHDIM_UNUSED, tfieldmetadata, 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_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
+#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_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: LSCAV, LAERO_MASS
-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 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 MODI_DUSTLFI_n
+USE MODI_SALT_FILTER
+USE MODI_SALTLFI_n
+USE MODI_WRITE_BALLOON_n
+USE MODI_WRITE_LB_n
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
@@ -303,9 +291,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
 !
@@ -320,15 +306,11 @@ 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
 !
+INTEGER              :: IDX
 INTEGER              :: IID
 TYPE(TFIELDMETADATA) :: TZFIELD
 !-------------------------------------------------------------------------------
@@ -338,6 +320,8 @@ TYPE(TFIELDMETADATA) :: 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)))
@@ -902,75 +886,45 @@ 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
+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 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
+
+  ! dust scalar variables
+  IF ( LDUST ) THEN
+    IF ((CPROGRAM == 'REAL  ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) &
+      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 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
+
+  ! sea salt scalar variables
+  IF ( LSALT ) THEN
+    IF ((CPROGRAM == 'REAL  ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) &
+      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
-!
-! microphysical LIMA variables
-!
-  DO JSV = NSV_LIMA_BEG, NSV_LIMA_END
 
+  !Store all scalar variables
+  DO JSV = 1, NSV
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME ) // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
+    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
-!
-    JSA=JSA+1
   END DO
-!
+
   IF (LSCAV .AND. LAERO_MASS) THEN
   IF (ASSOCIATED(XINPAP)) THEN
   IF (SIZE(XINPAP) /= 0 ) THEN
@@ -995,33 +949,8 @@ IF (NSV >=1) THEN
   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)
@@ -1067,57 +996,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
@@ -1129,131 +1007,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
-! 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     = 'ppv'
-      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     = 'ppv'
-        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/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)
+      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)
@@ -1262,7 +1027,7 @@ IF (NSV >=1) THEN
         ! 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
@@ -1278,173 +1043,16 @@ IF (NSV >=1) THEN
         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     = 'ppv'
-    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     = 'ppv'
-      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
-    END IF
-    IF (LDEPOS_AER(IMI)) THEN
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'ppv'
-      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)) &
-      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     = 'ppv'
-    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     = 'ppv'
-      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
-    IF ((CPROGRAM == 'REAL  ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) &
-      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     = 'ppv'
-    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     = 'ppv'
-      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 = TFIELDMETADATA(                      &
-    CMNHNAME   = 'NSV.DIM',                      &
+    CMNHNAME   = 'NSVCHEM',                      &
     CSTDNAME   = '',                             &
-    CLONGNAME  = 'NSV.DIM',                      &
+    CLONGNAME  = 'NSVCHEM',                      &
     CUNITS     = '',                             &
     CDIR       = '--',                           &
     CCOMMENT   = 'Number of chemical variables', &
@@ -1452,52 +1060,24 @@ IF (NSV >=1) THEN
     NTYPE      = TYPEINT,                        &
     NDIMS      = 0,                              &
     LTIMEDEP   = .FALSE.                         )
-  CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR)
-  !
-  IF (ICH_NBR/=0) THEN
-    TZFIELD = TFIELDMETADATA(   &
-      CMNHNAME   = 'NSV.TITRE', &
-      CSTDNAME   = '',          &
-      CLONGNAME  = 'NSV.TITRE', &
-      CUNITS     = '',          &
-      CDIR       = '--',        &
-      CCOMMENT   = '',          &
-      NGRID      = 0,           &
-      NTYPE      = TYPEINT,     &
-      NDIMS      = 1,           &
-      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 
+  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)
@@ -1676,95 +1256,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
 !
@@ -2366,11 +1871,11 @@ IF ( CPROGRAM=='REAL  ' ) THEN
       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
 !
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index 0b8eb5a79..cb9dc945a 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,6 +18,7 @@
 !  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
 !-----------------------------------------------------------------
 !      ###########################
 MODULE MODE_WRITE_PROFILER_n
@@ -84,24 +84,18 @@ SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, KI )
 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_DUST,            ONLY: LDUST, NMODE_DST
+USE MODD_CH_AEROSOL,      ONLY: LORILAM, JPMODE
 USE MODD_CST,             ONLY: XRV
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
 use modd_field,           only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, &
                                 tfieldmetadata_base, TYPEREAL
-USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_NSV
+USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend
 USE MODD_PARAMETERS,      ONLY: XUNDEF
 USE MODD_PARAM_n,         ONLY: CRAD
-USE MODD_PROFILER_n
+USE MODD_PROFILER_n,      ONLY: tprofiler
 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 MODE_AERO_PSD
 USE MODE_DUST_PSD
@@ -112,7 +106,6 @@ INTEGER,          INTENT(IN) :: KI
 !
 !*      0.2  declaration of local variables for diachro
 !
-character(len=NCOMMENTLGTMAX)                        :: ycomment
 character(len=NMNHNAMELGTMAX)                        :: yname
 character(len=NUNITLGTMAX)                           :: yunits
 CHARACTER(LEN=:),                        allocatable :: YGROUP   ! group title
@@ -125,6 +118,8 @@ INTEGER                                              :: JSV      ! loop counter
 integer                                              :: ji
 integer                                              :: irr !Number of moist variables
 REAL, DIMENSION(:,:,:),                  ALLOCATABLE :: ZRHO
+REAL, DIMENSION(:,:,:), TARGET,          ALLOCATABLE :: ZWORK
+REAL, DIMENSION(:,:,:), POINTER                      :: ZDATA
 REAL, DIMENSION(:,:,:,:),                ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 type(tbudiachrometadata)                             :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
@@ -133,7 +128,9 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 IF (TPROFILER%X(KI)==XUNDEF) RETURN
 IF (TPROFILER%Y(KI)==XUNDEF) RETURN
-!
+
+ZDATA => Null()
+
 IKU = SIZE(TPROFILER%W,2) !Number of vertical levels
 !
 !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values
@@ -193,40 +190,22 @@ 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
-    yname  = Trim( tsvlist(jsv)%cmnhname )
-    yunits = Trim( tsvlist(jsv)%cunits )
-    ycomment = ''
-    call Add_profile( yname, ycomment, 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) )
-  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 )
+  ! Scalar variables
+  Allocate( zwork, mold = tprofiler%sv(:,:,:,1) )
+  do jsv = 1, nsv
+    if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then
+      yunits = 'ppb'
+      zwork = tprofiler%sv(:,:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb
+      zdata => zwork
+    else
+      yunits = Trim( tsvlist(jsv)%cunits )
+      zdata => tprofiler%sv(:,:,:,jsv)
+    end if
+    call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata )
+    zdata => Null()
   end do
+  Deallocate( zwork )
+
   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)))
@@ -284,10 +263,6 @@ 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)))
@@ -345,10 +320,6 @@ 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
@@ -592,7 +563,7 @@ jproc = jproc + 1
 
 if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' )
 
-ctitle(jproc)   = Trim( htitle)
+ctitle(jproc)   = Trim( htitle )
 ccomment(jproc) = Trim( hcomment )
 cunit(jproc)    = Trim( hunits )
 
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 972805565..8d6d36ec6 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.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.
@@ -60,33 +60,22 @@ END MODULE MODI_WRITE_STATION_n
 !  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
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
+USE MODD_ALLSTATION_n,    ONLY: LDIAG_SURFRAD
 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_CONF,            ONLY: LCARTESIAN
+USE MODD_CST,             ONLY: XRV
 USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_LUNIT
-USE MODD_NSV
-USE MODD_PARAMETERS
+USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
+                                nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend
 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 MODD_PARAMETERS,      ONLY: XUNDEF
+USE MODD_STATION_n,       only: NUMBSTAT, STATION, TSTATION
 !
 USE MODE_AERO_PSD
 USE MODE_DUST_PSD
@@ -408,72 +397,19 @@ IF (SIZE(TSTATION%TKE,1)>0) THEN
   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
+  ! Scalar variables
+  DO JSV = 1, NSV
+    JPROC = JPROC + 1
+    YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
+    YCOMMENT(JPROC) = ''
+    IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
+      YUNIT(JPROC)  = 'ppb'
+      ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+    ELSE
+      YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
+      ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
+    END IF
   END DO
 
   IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN
@@ -490,15 +426,14 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
         ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR)
       ENDDO
       ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                ) 
+                                      / ( 1. + ZRHO(1,1,:)                )
     ELSE
       ZRHO(1,1,:) = TSTATION%TH(:,II)
     ENDIF
     ZRHO(1,1,:) =  TSTATION%P(:,II) / &
                   (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/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
@@ -611,19 +546,12 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
       WRITE(YCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV
       ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA10,JSV)
       END IF
-      ENDDO
+    ENDDO
 
-    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)))
@@ -637,7 +565,7 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
         ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR)
       ENDDO
       ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                ) 
+                                      / ( 1. + ZRHO(1,1,:)                )
     ELSE
       ZRHO(1,1,:) = TSTATION%TH(:,II)
     ENDIF
@@ -664,19 +592,10 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
       WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
       ZWORK6 (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)))
@@ -720,6 +639,7 @@ ENDIF
     DEALLOCATE (ZSV,ZRHO) 
     DEALLOCATE (ZN0,ZRG,ZSIG) 
   END IF
+END IF
 
 IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN
   JPROC = JPROC+1
-- 
GitLab


From 53c7b2fe6e2f7ddf4dbbeb4fb002e8149b1eb163 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 4 Feb 2022 15:04:02 +0100
Subject: [PATCH 033/157] Philippe 04/02/2022: remove CSVNAMES(_A) variables
 (not used anymore, replaced by TSVLIST)

---
 src/MNH/ini_budget.f90   | 15 ++++++------
 src/MNH/ini_nsv.f90      | 49 +---------------------------------------
 src/MNH/modd_nsv.f90     |  3 ---
 src/MNH/update_nsv.f90   | 16 -------------
 src/MNH/write_budget.f90 |  3 +--
 5 files changed, 9 insertions(+), 77 deletions(-)

diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index cff4e82db..5f3d85d34 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
 
@@ -226,8 +226,7 @@ use modd_dyn,           only: lcorio, xseglen
 use modd_dyn_n,         only: xtstep, locean
 use modd_elec_descr,    only: linductive, lrelax2fw_ion
 use modd_field,         only: TYPEREAL
-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,7 +238,7 @@ use modd_nsv,           only: csvnames,
                               nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, 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
@@ -2887,7 +2886,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'
diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index b117f3edb..299e9f9bd 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -67,7 +67,6 @@ 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
@@ -795,10 +794,9 @@ IF ( LBLOWSNOW ) THEN
   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,             &
@@ -814,8 +812,6 @@ DO JSV = 1, NSV_USER_A(KMI)
 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(                       &
@@ -832,8 +828,6 @@ DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI)
 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(                       &
@@ -865,43 +859,32 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
     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_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(2) ) // YNUM2
     TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) // 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(3) ) // YNUM2
     TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) // 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(4) ) // YNUM2
     TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) // YNUM2
   ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN
-    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) )
     TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) )
   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
@@ -912,8 +895,6 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
 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
@@ -936,8 +917,6 @@ DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI)
 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(                    &
@@ -956,8 +935,6 @@ 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   = '',                         &
@@ -975,8 +952,6 @@ END DO
 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   = '',                         &
@@ -994,8 +969,6 @@ END DO
 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   = '',                         &
@@ -1010,8 +983,6 @@ DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI)
 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) )
 
@@ -1031,8 +1002,6 @@ DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI)
 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) )
 
@@ -1052,8 +1021,6 @@ DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI)
 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) )
 
@@ -1073,8 +1040,6 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
 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) )
 
@@ -1094,8 +1059,6 @@ DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI)
 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) )
 
@@ -1115,8 +1078,6 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
 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) )
 
@@ -1136,8 +1097,6 @@ DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI)
 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) )
 
@@ -1157,8 +1116,6 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
 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) )
 
@@ -1178,8 +1135,6 @@ DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI)
 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(                       &
@@ -1201,8 +1156,6 @@ 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)
-  CSVNAMES_A(JSV,KMI) = 'LINOX'
-
   ICHIDX = ICHIDX + 1
   CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX'
 
diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 03631f3fe..20a50d177 100644
--- a/src/MNH/modd_nsv.f90
+++ b/src/MNH/modd_nsv.f90
@@ -28,7 +28,6 @@
 !!       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
 !  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
@@ -51,7 +50,6 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
 !
 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
 
@@ -158,7 +156,6 @@ 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
 
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index a8bbe8e7b..0bb972eff 100644
--- a/src/MNH/update_nsv.f90
+++ b/src/MNH/update_nsv.f90
@@ -26,7 +26,6 @@ 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
 !-------------------------------------------------------------------------------
@@ -56,21 +55,6 @@ 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)
-    END DO
-  END DO
-  CALL MOVE_ALLOC( FROM = YSVNAMES_TMP, TO = CSVNAMES_A )
-END IF
-
-CSVNAMES => CSVNAMES_A(:,KMI)
-
 ! 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
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 3f09ddc78..50dcb283b 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.
@@ -620,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
 
-- 
GitLab


From 4c466f586f8dfd013c59a8ac9252f759cc3c8d33 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 9 Feb 2022 09:49:00 +0100
Subject: [PATCH 034/157] Philippe 09/02/2022: bugfix: add missing XCURRENT_LEI
 computation

---
 src/MNH/ground_paramn.f90 | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 795d0eb7e..0b3026d15 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -111,6 +111,7 @@ 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
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -335,7 +336,8 @@ REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PET_B_COEF
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PEQ_B_COEF
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_RN        ! net radiation           (W/m2)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_H         ! sensible heat flux      (W/m2)
-REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LE        ! latent heat flux        (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LE        ! Total latent heat flux  (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LEI       ! Solid Latent heat flux  (W/m2)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_GFLUX     ! ground flux             (W/m2)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_T2M       ! Air temperature at 2 meters (K)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZP_Q2M       ! Air humidity at 2 meters    (kg/kg)
@@ -616,9 +618,9 @@ END IF
 !
 IF (CPROGRAM=='DIAG  ' .OR. LDIAG_IN_RUN) THEN
   CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH')
-  CALL  MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PGFLUX=ZP_GFLUX, &
-                           PT2M=ZP_T2M,PQ2M=ZP_Q2M,PHU2M=ZP_HU2M,        &
-                           PZON10M=ZP_ZON10M,PMER10M=ZP_MER10M           )
+  CALL  MNHGET_SURF_PARAM_n( PRN = ZP_RN,         PH = ZP_H,           PLE = ZP_LE,   PLEI = ZP_LEI,   &
+                             PGFLUX = ZP_GFLUX,   PT2M = ZP_T2M,       PQ2M = ZP_Q2M, PHU2M = ZP_HU2M, &
+                             PZON10M = ZP_ZON10M, PMER10M = ZP_MER10M                                  )
 END IF
 !
 ! Transform 1D output fields into 2D:
@@ -841,6 +843,7 @@ ALLOCATE(ZP_QSURF   (KDIM1D))
 ALLOCATE(ZP_RN      (KDIM1D))
 ALLOCATE(ZP_H       (KDIM1D))
 ALLOCATE(ZP_LE      (KDIM1D))
+ALLOCATE(ZP_LEI     (KDIM1D))
 ALLOCATE(ZP_GFLUX   (KDIM1D))
 ALLOCATE(ZP_T2M     (KDIM1D))
 ALLOCATE(ZP_Q2M     (KDIM1D))
@@ -964,6 +967,7 @@ IF (LDIAG_IN_RUN) THEN
   XCURRENT_RN      (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_RN(:),     ISHAPE_2)
   XCURRENT_H       (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_H (:),     ISHAPE_2)
   XCURRENT_LE      (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_LE(:),     ISHAPE_2)
+  XCURRENT_LEI     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_LEI(:),    ISHAPE_2)
   XCURRENT_GFLUX   (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_GFLUX(:),  ISHAPE_2)
   XCURRENT_T2M     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_T2M(:),    ISHAPE_2)
   XCURRENT_Q2M     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_Q2M(:),    ISHAPE_2)
@@ -1012,6 +1016,7 @@ DEALLOCATE(ZP_EMIS    )
 DEALLOCATE(ZP_RN      )
 DEALLOCATE(ZP_H       )
 DEALLOCATE(ZP_LE      )
+DEALLOCATE(ZP_LEI     )
 DEALLOCATE(ZP_GFLUX   )
 DEALLOCATE(ZP_T2M     )
 DEALLOCATE(ZP_Q2M     )
-- 
GitLab


From f78bf485f2a476d7a2167eee9abe7d3c05bb4860 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 9 Feb 2022 10:12:59 +0100
Subject: [PATCH 035/157] Philippe 09/02/2022: profilers: add message when some
 variables not computed + bugfix: put values in variables in this case + move
 some operations outside a do loop

---
 src/MNH/profilern.f90 | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index 433a5c6ef..4424b816f 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/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.
@@ -85,6 +85,9 @@ END MODULE MODI_PROFILER_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 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
 ! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -103,6 +106,7 @@ USE MODD_TIME,           only: tdtexp
 USE MODD_TIME_n,         only: tdtcur
 !
 USE MODE_ll
+USE MODE_MSG
 !
 USE MODI_GPS_ZENITH_GRID
 USE MODI_LIDAR
@@ -515,6 +519,14 @@ IF (GSTORE) THEN
         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)
@@ -881,10 +893,7 @@ IF (GSTORE) THEN
   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))
-  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))
+
   !
   IF (LDIAG_IN_RUN) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE_DISS(IN,JK,I))
   !
@@ -896,6 +905,11 @@ IF (GSTORE) THEN
   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
-- 
GitLab


From d32cbec30e0624c48b3f27d5612d3588543520ae Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 11 Feb 2022 10:02:38 +0100
Subject: [PATCH 036/157] Philippe 11/02/2022: IO: remove T suffix for scalar
 variables + backward compatibility

---
 src/MNH/ini_prog_var.f90          | 50 +++++++++++++++++++---------
 src/MNH/read_field.f90            | 24 +++++++-------
 src/MNH/spawn_field2.f90          | 22 +++++++------
 src/MNH/write_lfifm1_for_diag.f90 | 54 +++++++------------------------
 src/MNH/write_lfin.f90            |  5 +--
 5 files changed, 73 insertions(+), 82 deletions(-)

diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 2e9702b85..3a60efc9a 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -158,6 +158,7 @@ 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
+LOGICAL :: GOLDFILEFORMAT
 TYPE(TFIELDMETADATA)    :: TZFIELD
 TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL()
 !-------------------------------------------------------------------------------
@@ -213,7 +214,12 @@ IF(PRESENT(HCHEMFILE)) THEN
   ! 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.5.1, some variables had different names (or were not available)
+  GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5                                                                              &
+              .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 5 )                                       &
+              .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) == 5  .AND. TZCHEMFILE%NMNHVERSION(3) < 1 ) )
+
   ILUDES = TZCHEMFILE%TDESFILE%NLU
   !
   CALL IO_Field_read(TZCHEMFILE,'IMAX',IIMAX,IRESP)
@@ -270,8 +276,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   IF (.NOT.LDUST) THEN
     DO JSV = NSV_CHEMBEG, NSV_CHEMEND
       TZFIELD = TSVLIST(JSV)
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      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
@@ -287,8 +295,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   IF (LORILAM) THEN
     DO JSV = NSV_AERBEG,NSV_AEREND
       TZFIELD = TSVLIST(JSV)
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      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
@@ -299,8 +309,10 @@ IF(PRESENT(HCHEMFILE)) THEN
     IF (LDEPOS_AER(IMI)) THEN   
       DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
         TZFIELD = TSVLIST(JSV)
-        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        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
@@ -313,8 +325,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   IF (LDUST) THEN
     DO JSV = NSV_DSTBEG, NSV_DSTEND
       TZFIELD = TSVLIST(JSV)
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      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))
@@ -324,8 +338,10 @@ IF(PRESENT(HCHEMFILE)) THEN
     IF (LDEPOS_DST(IMI)) THEN   
       DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
         TZFIELD = TSVLIST(JSV)
-        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        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
@@ -338,8 +354,10 @@ IF(PRESENT(HCHEMFILE)) THEN
   IF (LSALT) THEN
     DO JSV = NSV_SLTBEG, NSV_SLTEND
       TZFIELD = TSVLIST(JSV)
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+      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))
@@ -349,8 +367,10 @@ IF(PRESENT(HCHEMFILE)) THEN
     IF (LDEPOS_SLT(IMI)) THEN
       DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
         TZFIELD = TSVLIST(JSV)
-        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        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/read_field.f90 b/src/MNH/read_field.f90
index 34a20049a..8b72ffd03 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -814,21 +814,23 @@ DO JSV = 1, NSV              ! initialize according to the get indicators
     CASE ('READ')
       TZFIELD = TSVLIST(JSV)
 
-      IF ( GOLDFILEFORMAT .AND.                               &
-           ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+      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.5.1
-        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CSTDNAME   = ''
-        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-      ELSE
-        TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-        TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+             ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
+          !Some variables were written with an other name in MesoNH < 5.5.1
+          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 )
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 993f0ebd3..ccd4ceaea 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -836,21 +836,23 @@ IF (PRESENT(TPSONFILE)) THEN
   !
   DO JSV = 1, NSV
     TZFIELD = TSVLIST(JSV)
-    IF ( GOLDFILEFORMAT .AND.                               &
-         ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+    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
+           ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
         !Some variables were written with an other name in MesoNH < 5.5.1
-      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
-      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
-    ELSE
-      TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-      TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        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( TPSONFILE, TZFIELD, ZWORK3D, IRESP )
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index a14c099e6..08471b0cf 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -1065,8 +1065,6 @@ END IF
 IF(LVAR_MRW) THEN
   DO JSV = NSV_C2R2BEG,NSV_C2R2END
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
    IF (JSV < NSV_C2R2END) THEN
       TZFIELD%CUNITS     = 'cm-3'
       ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6
@@ -1080,8 +1078,6 @@ IF(LVAR_MRW) THEN
   ! microphysical C3R5 scheme additional scalar variables
   DO JSV = NSV_C1R3BEG,NSV_C1R3END
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS     = 'l-1'
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3)
   END DO
@@ -1107,54 +1103,54 @@ IF (LLIMA_DIAG) THEN
     !
 ! 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
 ! 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(2))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(2))//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(3))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(3))//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(4))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(4))//INDICE
     END IF
 ! Hom. freez. of CCN
     IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))
     END IF
     !
 ! 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)
@@ -1198,8 +1194,6 @@ END IF
 IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN
   DO JSV = NSV_ELECBEG,NSV_ELECEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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
@@ -1216,8 +1210,6 @@ END IF
 IF (LTRAJ) THEN
   DO JSV = NSV_LGBEG, NSV_LGEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
   END DO
@@ -1278,8 +1270,6 @@ IF (LPASPOL) THEN
   !
   DO JSV = NSV_PPBEG, NSV_PPEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS     = 'g m-3'
 
     ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) )
@@ -1293,8 +1283,6 @@ END IF
 IF (LCONDSAMP) THEN
   DO JSV = NSV_CSBEG, NSV_CSEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
   END DO
 END IF
@@ -1302,8 +1290,6 @@ END IF
 IF (LCHEMDIAG) THEN
   DO JSV = NSV_CHGSBEG,NSV_CHGSEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
@@ -1313,8 +1299,6 @@ IF (LCHAQDIAG) THEN    !aqueous concentration in M
   ZWORK31(:,:,:)=0.
   DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2   !cloud water
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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)
@@ -1326,8 +1310,6 @@ IF (LCHAQDIAG) THEN    !aqueous concentration in M
   ZWORK31(:,:,:)=0.
   DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND    !rain water
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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)
@@ -1337,7 +1319,7 @@ IF (LCHAQDIAG) THEN    !aqueous concentration in M
   END DO
 !  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)
@@ -1350,8 +1332,6 @@ END IF
 IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
   DO JSV = NSV_AERBEG, NSV_AEREND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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)
@@ -1512,8 +1492,6 @@ IF (LDUST) THEN
   !
   DO JSV = NSV_DSTBEG, NSV_DSTEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     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)
@@ -1591,8 +1569,6 @@ END IF
 IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
   DO JSV = NSV_DSTBEG, NSV_DSTEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
@@ -1698,8 +1674,6 @@ IF (LSALT) THEN
   !
   DO JSV = NSV_SLTBEG, NSV_SLTEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
@@ -1778,8 +1752,6 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
   !
   DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
@@ -1996,8 +1968,6 @@ END IF
 IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
   DO JSV = NSV_LNOXBEG, NSV_LNOXEND
     TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
     TZFIELD%CUNITS    = 'ppb'
     WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV
     CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 1a6694ce0..481840839 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -919,10 +919,7 @@ IF (NSV >= 1 ) THEN
 
   !Store all scalar variables
   DO JSV = 1, NSV
-    TZFIELD = TSVLIST(JSV)
-    TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
-    TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
-    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
+    CALL IO_Field_write( TPFILE, TSVLIST(JSV), XSVT(:,:,:,JSV) )
   END DO
 
   IF (LSCAV .AND. LAERO_MASS) THEN
-- 
GitLab


From b8f0d4892f347b84c7b609c02f530f699f06bf01 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 11 Jan 2022 15:48:24 +0100
Subject: [PATCH 037/157] Philippe 11/01/2022: bugfix: add ONE parameter

(cherry picked from commit ab4a319f8373a9a1d2f8bc9117972257e96b0ef5)
---
 src/MNH/isocom.f | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/MNH/isocom.f b/src/MNH/isocom.f
index f2e6503e6..451c1b485 100644
--- a/src/MNH/isocom.f
+++ b/src/MNH/isocom.f
@@ -1,4 +1,4 @@
-CMNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier
+CMNH_LIC Copyright 1996-2022 CNRS, Meteo-France and Universite Paul Sabatier
 CMNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 CMNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 CMNH_LIC for details. version 1.
@@ -3782,7 +3782,8 @@ C
 C
       IMPLICIT REAL(kind(0.0d0))           (A-H, O-Z)
       PARAMETER (EXPON=1.D0/3.D0,     ZERO=0.D0, THET1=120.D0/180.D0, 
-     &           THET2=240.D0/180.D0, PI=3.14159265358932, EPS=1D-50)
+     &           THET2=240.D0/180.D0, PI=3.14159265358932, EPS=1D-50,
+     &           ONE=1.D0 )
       REAL(kind(0.0d0))            X(3)
 C
 C *** SPECIAL CASE : QUADRATIC*X EQUATION *****************************
-- 
GitLab


From e9ef9a94efa766d60fad1338293c8b9fe7b8409c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 11 Jan 2022 15:49:49 +0100
Subject: [PATCH 038/157] Philippe 11/01/2022: minor bugfix: remove ! at end of
 preprocessor #endif

(cherry picked from commit dc76371906b99beaea24f7ca921c74a65e1df9f9)
---
 src/SURFEX/pgd_grid.F90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/SURFEX/pgd_grid.F90 b/src/SURFEX/pgd_grid.F90
index 5a7158fc1..9c17d153a 100644
--- a/src/SURFEX/pgd_grid.F90
+++ b/src/SURFEX/pgd_grid.F90
@@ -316,7 +316,7 @@ ALLOCATE(UG%XJPDIR       (NL))
  CALL MPPDB_CHECK_SURFEX2D(UG%G%XLAT,"PGD_GRID after LATLON_GRID:XLAT",PRECISION,ILUOUT)
  CALL MPPDB_CHECK_SURFEX2D(UG%G%XLON,"PGD_GRID after LATLON_GRID:XLON",PRECISION,ILUOUT)
  CALL MPPDB_CHECK_SURFEX2D(UG%G%XMESH_SIZE,"PGD_GRID after LATLON_GRID:XMESH_SIZE",PRECISION,ILUOUT)
-#endif!
+#endif
 !------------------------------------------------------------------------------
 !
 !*    7.      Average grid length (in degrees)
-- 
GitLab


From 4da13e98c10507964d4e7fc0255cd7faeac1c0ab Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 11 Feb 2022 16:18:39 +0100
Subject: [PATCH 039/157] Philippe 11/02/2022: add meaning of ppv for AER, DUST
 and SALT variables depending on moment

---
 src/MNH/ini_nsv.f90 | 188 ++++++++++++++++++++++++++++++--------------
 1 file changed, 127 insertions(+), 61 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 299e9f9bd..1a9662857 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -78,8 +78,9 @@ END MODULE MODI_INI_NSV
 !             ------------
 !
 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
@@ -108,7 +109,7 @@ 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, NUNITLGTMAX
+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,  &
                                 LWARM, LCOLD, LRAIN, LSPRO
@@ -141,12 +142,17 @@ 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
 !
 !-------------------------------------------------------------------------------
 !
@@ -483,12 +489,18 @@ 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)
@@ -522,12 +534,18 @@ 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)
@@ -703,26 +721,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
@@ -746,26 +777,39 @@ IF ( LSALT ) THEN
   IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 5 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 5 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
@@ -786,11 +830,10 @@ 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
 
@@ -1026,17 +1069,40 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
 
   WRITE( YNUM3, '( I3.3 )' ) JSV
 
-  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
-    CMNHNAME   = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
-    CSTDNAME   = '',                                          &
-    CLONGNAME  = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppv',                                       &
-    CDIR       = 'XY',                                        &
-    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
-    NGRID      = 1,                                           &
-    NTYPE      = TYPEREAL,                                    &
-    NDIMS      = 3,                                           &
-    LTIMEDEP   = .TRUE.                                       )
+  ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) )
+
+  !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_BCi,  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)
@@ -1064,17 +1130,17 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
 
   WRITE( YNUM3, '( I3.3 )' ) JSV
 
-  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
-    CMNHNAME   = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
-    CSTDNAME   = '',                                          &
-    CLONGNAME  = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppv',                                       &
-    CDIR       = 'XY',                                        &
-    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
-    NGRID      = 1,                                           &
-    NTYPE      = TYPEREAL,                                    &
-    NDIMS      = 3,                                           &
-    LTIMEDEP   = .TRUE.                                       )
+  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)
@@ -1102,17 +1168,17 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
 
   WRITE( YNUM3, '( I3.3 )' ) JSV
 
-  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
-    CMNHNAME   = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
-    CSTDNAME   = '',                                          &
-    CLONGNAME  = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
-    CUNITS     = 'ppv',                                       &
-    CDIR       = 'XY',                                        &
-    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
-    NGRID      = 1,                                           &
-    NTYPE      = TYPEREAL,                                    &
-    NDIMS      = 3,                                           &
-    LTIMEDEP   = .TRUE.                                       )
+  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)
-- 
GitLab


From e9e2eb4338e2524651589e78d2616916425d8d30 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 9 Mar 2022 11:39:56 +0100
Subject: [PATCH 040/157] Philippe 09/03/2022: IO: bugfix: iresp_tmp_*
 varaibles were not initialized (crash in some cases due to random values if
 parallel I/O)

---
 src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index da3889629..07bf78a63 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.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.
@@ -1078,6 +1078,8 @@ end subroutine IO_Ndimlist_reduce
     iresp     = 0
     iresp_lfi = 0
     iresp_nc4 = 0
+    iresp_tmp_lfi = 0
+    iresp_tmp_nc4 = 0
     GALLOC    = .FALSE.
     GALLOC_ll = .FALSE.
     IHEXTOT = 2*JPHEXT+1
-- 
GitLab


From 44d0c84b181959c3f289648531ad9e42a15d6779 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 10 Mar 2022 09:12:41 +0100
Subject: [PATCH 041/157] Philippe 10/03/2022: IO: bugfix: reduce precision was
 not taken into account for Z-split 3D variables in master files

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 4019f6346..2f7836534 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-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.
@@ -86,6 +86,8 @@ use modd_parameters, only: jphext
 
 use mode_tools_ll,   only: Get_globaldims_ll
 
+use NETCDF,          only: NF90_FLOAT
+
 type(tfiledata),       intent(in) :: tpfile
 class(tfieldmetadata), intent(in) :: tpfield
 integer,               intent(in) :: knblocks
@@ -112,7 +114,11 @@ call IO_Mnhname_clean( tpfield%cmnhname, yvarname )
 istatus = NF90_INQ_VARID( incid, yvarname, ivarid )
 if ( istatus /= NF90_NOERR ) then
 
-  istatus = NF90_DEF_VAR( incid, yvarname, MNHREAL_NF90, ivarid)
+  if ( tpfile%lncreduce_float_precision ) then
+    istatus = NF90_DEF_VAR( incid, yvarname, NF90_FLOAT, ivarid )
+  else
+    istatus = NF90_DEF_VAR( incid, yvarname, MNHREAL_NF90, ivarid )
+  end if
 
   if ( tpfield%ndims /= 3 ) call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_header_split_write_nc4', &
                   trim( tpfile%cname )//': '//trim( yvarname )//': NDIMS should be 3' )
-- 
GitLab


From a00ee173e9041a92c094e6fc540c77772d940518 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 16 Mar 2022 11:31:11 +0100
Subject: [PATCH 042/157] Philippe 16/03/2022: IO: bugfix: CDIR was wrong for
 COVERnnn in READ_SURFX2COV_1COV_MNH

---
 src/MNH/read_surf_mnh.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index 17648717d..96693291f 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2003-2021 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 for details. version 1.
@@ -1027,7 +1027,7 @@ IF (.NOT. GCOVER_PACKED) THEN
     CSTDNAME   = '',                 &
     CLONGNAME  = TRIM(YREC),         &
     CUNITS     = '',                 &
-    CDIR       = YDIR1,              &
+    CDIR       = YDIR,               &
     CCOMMENT   = 'X_Y_'//TRIM(YREC), &
     NGRID      = 4,                  &
     NTYPE      = TYPEREAL,           &
-- 
GitLab


From 823802ede5916b0facd815c1d106eb2f5ad53171 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 18 Mar 2022 10:11:58 +0100
Subject: [PATCH 043/157] Philippe 18/03/2022: IO: minor bugfix in
 IO_Bakout_struct_prepare + adapt diagnostics messages (change verbosity level
 and remove some unnecessary warnings)

---
 src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index f7954781f..60cf44de0 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-2021 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 for details. version 1.
@@ -19,6 +19,8 @@
 !  P. Wautelet 11/02/2020: bugfix: TDADFILE was wrongly constructed for output files
 !  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)
 !-----------------------------------------------------------------
 MODULE MODE_IO_MANAGE_STRUCT
 !
@@ -86,8 +88,8 @@ END IF
 DO IMI = 1, NMODEL
   IBAK_NUMB = 0
   IOUT_NUMB = 0
-  ISTEP_MAX = NINT(XSEGLEN/DYN_MODEL(IMI)%XTSTEP)+1
-  IF (IMI == 1) ISTEP_MAX = ISTEP_MAX - KSUP
+  !Reduce XSEGLEN by time added to XSEGLEN for 1st domain (see set_grid subroutine)
+  ISTEP_MAX = NINT( ( XSEGLEN - KSUP * DYN_MODEL(1)%XTSTEP ) / DYN_MODEL(IMI)%XTSTEP ) + 1
   !
   !* Insert regular backups/outputs into XBAK_TIME/XOUT_TIME arrays
   !
@@ -468,7 +470,7 @@ SUBROUTINE FIND_REMOVE_DUPLICATES(KNUMB,KSTEPS)
   DO JOUT = 1,KNUMB
     DO JKLOOP = JOUT+1,KNUMB
       IF ( KSTEPS(JKLOOP) == KSTEPS(JOUT) .AND. KSTEPS(JKLOOP) > 0 ) THEN
-        CALL PRINT_MSG(NVERB_INFO,'IO','FIND_REMOVE_DUPLICATES','found duplicated backup/output step (removed extra one)')
+        CALL PRINT_MSG(NVERB_DEBUG,'IO','FIND_REMOVE_DUPLICATES','found duplicated backup/output step (removed extra one)')
         KSTEPS(JKLOOP) = NNEGUNDEF
       END IF
     END DO
@@ -484,7 +486,8 @@ SUBROUTINE FIND_REMOVE_OUTOFTIMERANGE(KNUMB,KSTEPS)
   !
   DO JOUT = 1,KNUMB
     IF ( KSTEPS(JOUT) < 1 .OR. KSTEPS(JOUT) > ISTEP_MAX ) THEN
-      CALL PRINT_MSG(NVERB_WARNING,'IO','FIND_REMOVE_OUTOFTIMERANGE','found backup/output step outside of time range')
+      IF ( KSTEPS(JOUT) /= NNEGUNDEF ) &
+        CALL PRINT_MSG(NVERB_WARNING,'IO','FIND_REMOVE_OUTOFTIMERANGE','found backup/output step outside of time range')
       KSTEPS(JOUT) = NNEGUNDEF
     END IF
   END DO
-- 
GitLab


From 6dbfd11a0ec7c7608e84586cb228b0f704458235 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 18 Mar 2022 15:51:55 +0100
Subject: [PATCH 044/157] Philippe 18/03/2022: bugfix: correct xseglen by
 removing xtstep of first model

---
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 8 ++++----
 src/MNH/ground_paramn.f90                   | 6 +++---
 src/MNH/ini_aircraft_balloon.f90            | 4 ++--
 src/MNH/ini_lesn.f90                        | 4 ++--
 src/MNH/ini_posprofilern.f90                | 4 ++--
 src/MNH/ini_surfstationn.f90                | 8 ++------
 6 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index a7d7604f2..22fa1c5db 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_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.
@@ -252,7 +252,7 @@ USE MODD_CONF,          ONLY: CPROGRAM, l2d, lpack
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
 use modd_dyn,           only: xseglen
-use modd_dyn_n,         only: xtstep
+use modd_dyn_n,         only: dyn_model
 
 !PW: check if all parameters are used...
 use modd_field,         only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V,   &
@@ -423,13 +423,13 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then
 
   !Dimension for the number of profiler times
   if ( numbprofiler > 0 ) then
-    iprof = Int ( ( xseglen - xtstep ) / tprofiler%step ) + 1
+    iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 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 = Int ( ( xseglen - xtstep ) / tstation%step ) + 1
+    istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1
     call IO_Add_dim_nc4( tpfile, NMNHDIM_STATION_TIME, 'time_station', istation )
   end if
 
diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 0b3026d15..65dfee99c 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -123,7 +123,7 @@ USE MODI_GET_HALO
 USE MODI_MNH_OASIS_RECV
 USE MODI_MNH_OASIS_SEND
 USE MODD_SFX_OASIS, ONLY : LOASIS
-USE MODD_DYN, ONLY : XSEGLEN
+USE MODD_DYN,        ONLY: DYN_MODEL, XSEGLEN
 #endif
 !
 USE MODD_LUNIT_n, ONLY: TLUOUT
@@ -575,7 +575,7 @@ CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC)
 #ifdef CPLOASIS
 IF (LOASIS) THEN
   IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
-    IF ( NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0 ) THEN
+    IF ( NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0 ) THEN
       WRITE(ILUOUT,*) '----------------------------'
       WRITE(ILUOUT,*) ' Reception des champs avec OASIS'
       WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
@@ -605,7 +605,7 @@ CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC,
 #ifdef CPLOASIS
 IF (LOASIS) THEN
   IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
-    IF (NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0) THEN
+    IF (NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0) THEN
       WRITE(ILUOUT,*) '----------------------------'
       WRITE(ILUOUT,*) ' Envoi des champs avec OASIS'
       WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 5d9ea3a67..72f52303a 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.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.
@@ -360,7 +360,7 @@ 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 = INT ( (PSEGLEN-XTSTEP) / TPFLYER%STEP ) + 1
+  ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1
 ENDIF
 !
 IF (TPFLYER%NMODEL == 0) ISTORE=0
diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90
index 45d7b9f9a..05a30c423 100644
--- a/src/MNH/ini_lesn.f90
+++ b/src/MNH/ini_lesn.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.
@@ -321,7 +321,7 @@ XLES_TEMP_SAMPLING = XTSTEP * NLES_DTCOUNT
 !            ----------------------------------------
 !
 !
-NLES_TIMES = ( INT( (XSEGLEN-XTSTEP+1.E-6) / XTSTEP ) ) / NLES_DTCOUNT
+NLES_TIMES = ( NINT( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / XTSTEP ) ) / NLES_DTCOUNT
 !
 !*      3.5  current LES time counter
 !            ------------------------
diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90
index 08b25fba1..00279c8a8 100644
--- a/src/MNH/ini_posprofilern.f90
+++ b/src/MNH/ini_posprofilern.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.
@@ -156,7 +156,7 @@ SUBROUTINE ALLOCATE_PROFILER_n(TPROFILER)
 !
 TYPE(PROFILER), INTENT(INOUT) :: TPROFILER
 !
-ISTORE = INT ( (PSEGLEN-XTSTEP) / TPROFILER%STEP ) + 1
+ISTORE = NINT( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILER%STEP ) + 1
 !
 allocate( tprofiler%tpdates( istore ) )
 ALLOCATE(TPROFILER%ERROR (NUMBPROFILER))
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index f53ee35d1..5b79bb289 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.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.
@@ -171,11 +171,7 @@ if ( tstation%step < xtstep ) then
   tstation%step = xtstep
 end if
 
-IF (KMI==1) THEN
- ISTORE = NINT ( (PSEGLEN-XTSTEP) / TSTATION%STEP ) + 1
-ELSE 
- ISTORE = NINT ( (PSEGLEN-XTSTEP * NDTRATIO(KMI)) / TSTATION%STEP ) + 1
-END IF
+ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATION%STEP ) + 1
 
 allocate( tstation%tpdates( istore ) )
 ALLOCATE(TSTATION%ERROR (NUMBSTAT))
-- 
GitLab


From 1ca4e62cf481d02e29ecf61f39173e05d5a70cec Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 22 Mar 2022 13:52:16 +0100
Subject: [PATCH 045/157] Philippe 22/03/2022: LES budgets: LES averaging
 periods are more reliable (compute with integers instead of reals)

---
 src/MNH/ini_lesn.f90         | 41 ++++++++++++++++++++++++++
 src/MNH/modd_lesn.f90        | 15 +++++++++-
 src/MNH/mode_les_diachro.f90 | 57 ++++++++++--------------------------
 3 files changed, 70 insertions(+), 43 deletions(-)

diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90
index 05a30c423..84f90dba5 100644
--- a/src/MNH/ini_lesn.f90
+++ b/src/MNH/ini_lesn.f90
@@ -40,6 +40,7 @@
 !  P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index
 !  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
 !  P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point)
+!  P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals)
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -342,6 +343,46 @@ IF (NLES_TIMES==0) THEN
   RETURN
 END IF
 !
+!*     3.8  Averaging
+!           ---------
+IF (     XLES_TEMP_MEAN_END   == XUNDEF &
+    .OR. XLES_TEMP_MEAN_START == XUNDEF &
+    .OR. XLES_TEMP_MEAN_STEP  == XUNDEF ) THEN
+  !No LES temporal averaging
+  NLES_MEAN_TIMES = 0
+  NLES_MEAN_STEP  = NNEGUNDEF
+  NLES_MEAN_START = NNEGUNDEF
+  NLES_MEAN_END   = NNEGUNDEF
+ELSE
+  !LES temporal averaging is enabled
+  !Ensure that XLES_TEMP_MEAN_END is not after segment end
+  XLES_TEMP_MEAN_END = MIN( XLES_TEMP_MEAN_END, XSEGLEN - DYN_MODEL(1)%XTSTEP )
+
+  NLES_MEAN_START = NINT( XLES_TEMP_MEAN_START / XTSTEP )
+
+  IF ( MODULO( NLES_MEAN_START, NLES_DTCOUNT ) /= 0 ) THEN
+    CMNHMSG(1) = 'XLES_TEMP_MEAN_START is not a multiple of XLES_TEMP_SAMPLING'
+    CMNHMSG(2) = 'LES averaging periods could be wrong'
+    CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' )
+  END IF
+
+  NLES_MEAN_END = NINT( XLES_TEMP_MEAN_END / XTSTEP )
+
+  NLES_MEAN_STEP = NINT( XLES_TEMP_MEAN_STEP / XTSTEP )
+
+  IF ( NLES_MEAN_STEP < NLES_DTCOUNT ) &
+    CALL Print_msg( NVERB_ERROR, 'IO', 'INI_LES_n', 'XLES_TEMP_MEAN_STEP < XLES_TEMP_SAMPLING not allowed' )
+
+  IF ( MODULO( NLES_MEAN_STEP, NLES_DTCOUNT ) /= 0 ) THEN
+    CMNHMSG(1) = 'XLES_TEMP_MEAN_STEP is not a multiple of XLES_TEMP_SAMPLING'
+    CMNHMSG(2) = 'LES averaging periods could be wrong'
+    CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' )
+  END IF
+
+  NLES_MEAN_TIMES = ( NLES_MEAN_END - NLES_MEAN_START ) / NLES_MEAN_STEP
+  !Add 1 averaging period if the last one is incomplete (for example: start=0., end=10., step=3.)
+  IF ( MODULO( NLES_MEAN_END - NLES_MEAN_START, NLES_MEAN_STEP ) > 0 ) NLES_MEAN_TIMES = NLES_MEAN_TIMES + 1
+END IF
 !-------------------------------------------------------------------------------
 !
 !*      4.   Number of vertical levels for local diagnostics
diff --git a/src/MNH/modd_lesn.f90 b/src/MNH/modd_lesn.f90
index 28db43c4d..c7b54dd8d 100644
--- a/src/MNH/modd_lesn.f90
+++ b/src/MNH/modd_lesn.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.
@@ -42,6 +42,7 @@
 !  P. Wautelet 08/02/2019: add missing NULL association for pointers
 !  C. Lac         02/2019: add rain fraction as a LES diagnostic
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals)
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -61,6 +62,10 @@ TYPE LES_t
   INTEGER :: NLES_TIMES         ! number of LES computations in time
   INTEGER :: NLES_DTCOUNT       ! number of time steps between two LES comp.
   INTEGER :: NLES_TCOUNT        ! current time counter for LES comp.
+  INTEGER :: NLES_MEAN_TIMES    ! Number of LES averaging periods
+  INTEGER :: NLES_MEAN_STEP     ! number of time steps between two LES average comp.
+  INTEGER :: NLES_MEAN_START    ! First time step number taken into account for LES averaging
+  INTEGER :: NLES_MEAN_END      ! Last  time step number taken into account for LES averaging
   INTEGER :: NSPECTRA_NI        ! number of wave lengths in I direction
   INTEGER :: NSPECTRA_NJ        ! number of wave lengths in J direction
 !
@@ -660,6 +665,10 @@ TYPE(LES_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: LES_MODEL
 INTEGER, POINTER :: NLES_TIMES=>NULL()
 INTEGER, POINTER :: NLES_DTCOUNT=>NULL()
 INTEGER, POINTER :: NLES_TCOUNT=>NULL()
+INTEGER, POINTER :: NLES_MEAN_TIMES => NULL()
+INTEGER, POINTER :: NLES_MEAN_STEP  => NULL()
+INTEGER, POINTER :: NLES_MEAN_START => NULL()
+INTEGER, POINTER :: NLES_MEAN_END   => NULL()
 INTEGER, POINTER :: NSPECTRA_NI=>NULL()
 INTEGER, POINTER :: NSPECTRA_NJ=>NULL()
 type(date_time), dimension(:), pointer :: tles_dates => null()
@@ -1509,6 +1518,10 @@ LES_MODEL(KFROM)%XLES_RADEFF=>XLES_RADEFF
 NLES_TIMES=>LES_MODEL(KTO)%NLES_TIMES
 NLES_DTCOUNT=>LES_MODEL(KTO)%NLES_DTCOUNT
 NLES_TCOUNT=>LES_MODEL(KTO)%NLES_TCOUNT
+NLES_MEAN_TIMES => LES_MODEL(KTO)%NLES_MEAN_TIMES
+NLES_MEAN_STEP  => LES_MODEL(KTO)%NLES_MEAN_STEP
+NLES_MEAN_START => LES_MODEL(KTO)%NLES_MEAN_START
+NLES_MEAN_END   => LES_MODEL(KTO)%NLES_MEAN_END
 NSPECTRA_NI=>LES_MODEL(KTO)%NSPECTRA_NI
 NSPECTRA_NJ=>LES_MODEL(KTO)%NSPECTRA_NJ
 tles_dates=>les_model(kto)%tles_dates
diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index a9dda2c89..8f848f4e9 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.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.
@@ -12,6 +12,7 @@
 !  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)
 !-----------------------------------------------------------------
 !#######################
 MODULE MODE_LES_DIACHRO
@@ -524,8 +525,7 @@ END SUBROUTINE LES_TIME_AVG
 subroutine Les_time_avg_4D( pwork4, tpdates, kresp )
 !########################################################
 
-use modd_les,        only: nles_current_times, xles_temp_mean_start, xles_temp_mean_end, xles_temp_mean_step
-use modd_parameters, only: XUNDEF
+use modd_les_n,      only: nles_dtcount, nles_mean_start, nles_mean_end, nles_mean_step, nles_mean_times, nles_times
 use modd_time,       only: tdtseg
 use modd_type_date,  only: date_time
 
@@ -537,60 +537,33 @@ real,            dimension(:,:,:,:), allocatable, intent(inout) :: pwork4 ! cont
 type(date_time), dimension(:),       allocatable, intent(inout) :: tpdates
 integer,                                          intent(out)   :: kresp  ! return code (0 is ok)
 !------------------------------------------------------------------------------
-integer                               :: jt                   ! time counter
-integer                               :: itime                ! nb of avg. points
-integer                               :: iavg                 ! nb of avg. periods
 integer                               :: javg                 ! loop counter on avg. periods
 integer                               :: jk                   ! vertical loop counter
 integer                               :: jp                   ! process loop counter
 integer                               :: jsv                  ! scalar loop counter
-integer                               :: jx                   ! first  spatial or spectral coordinate loop counter
-integer                               :: jy                   ! second spatial or spectral coordinate loop counter
 integer                               :: jtb, jte
-real                                  :: zles_temp_mean_start ! initial and end times
-real                                  :: zles_temp_mean_end   ! of one avergaing preiod
 real, dimension(:,:,:,:), allocatable :: zwork4               ! contains averaged physical field
 !------------------------------------------------------------------------------
 
-if (     xles_temp_mean_end   == XUNDEF &
-    .or. xles_temp_mean_start == XUNDEF &
-    .or. xles_temp_mean_step  == XUNDEF ) then
-  kresp = -1
-  return
-end if
-
-iavg = Int( xles_temp_mean_end - 1.e-10 - xles_temp_mean_start ) / xles_temp_mean_step + 1
-if ( iavg <= 0 ) then
+if ( nles_mean_times == 0 ) then
   kresp = -1
   return
 end if
 
 Deallocate( tpdates )
 
-Allocate( tpdates(iavg) )
-Allocate( zwork4(Size( pwork4, 1 ), iavg, Size( pwork4, 3 ), Size( pwork4, 4 )) )
+Allocate( tpdates(nles_mean_times) )
+Allocate( zwork4(Size( pwork4, 1 ), nles_mean_times, Size( pwork4, 3 ), Size( pwork4, 4 )) )
 
 zwork4(:, :, :, :) = 0.
 
-do javg = 1, iavg
-  zles_temp_mean_start = xles_temp_mean_start + (javg - 1) * xles_temp_mean_step
-  zles_temp_mean_end   = Min( xles_temp_mean_end, zles_temp_mean_start + xles_temp_mean_step )
-
-  jtb = -1
-  jte = -2
-  do jt = 1, nles_current_times
-    if ( xles_times(jt) >= zles_temp_mean_start ) then
-      jtb = jt
-      exit
-    end if
-  end do
-  do jt = jtb, nles_current_times
-    if ( xles_times(jt) <= zles_temp_mean_end ) then
-      jte = jt
-    else
-      exit
-    end if
-  end do
+do javg = 1, nles_mean_times
+  jtb = ( nles_mean_start + ( javg - 1 ) * nles_mean_step ) / nles_dtcount
+  jte = MIN( jtb + nles_mean_step / nles_dtcount, nles_mean_end / nles_dtcount, nles_times )
+  ! jtb could be 0 if nles_mean_start is smaller than the first LES measurement
+  ! For example, it occurs if xles_temp_mean_start is smaller than xles_temp_sampling (if xles_temp_mean_start=0.)
+  ! Do this correction only after computation of jte
+  if ( jtb < 1 ) jtb = 1
 
   do jp = 1, Size( pwork4, 4 )
     do jsv = 1, Size( pwork4, 3 )
@@ -603,12 +576,12 @@ do javg = 1, iavg
   tpdates(javg)%nyear  = tdtseg%nyear
   tpdates(javg)%nmonth = tdtseg%nmonth
   tpdates(javg)%nday   = tdtseg%nday
-  tpdates(javg)%xtime  = tdtseg%xtime + ( zles_temp_mean_start + zles_temp_mean_end ) / 2.
+  tpdates(javg)%xtime  = tdtseg%xtime + ( xles_times(jtb) + xles_times(jte) ) / 2.
   call Datetime_correctdate( tpdates(javg) )
 end do
 
 Deallocate( pwork4 )
-Allocate( pwork4(Size( zwork4, 1 ), iavg, Size( zwork4, 3 ), Size( zwork4, 4 )) )
+Allocate( pwork4(Size( zwork4, 1 ), nles_mean_times, Size( zwork4, 3 ), Size( zwork4, 4 )) )
 
 pwork4 = zwork4
 
-- 
GitLab


From 6ba00360e6d7fb4cffe09d0109baa339418808f3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 22 Mar 2022 14:06:32 +0100
Subject: [PATCH 046/157] Philippe 22/03/2022: correct time_les_avg and
 time_les_avg_bounds coordinates

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 35 +++++++++++----------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 2f7836534..ead87ec69 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -28,6 +28,7 @@
 !  P. Wautelet 14/01/2021: add IO_Field_write_nc4_N4, IO_Field_partial_write_nc4_N2,
 !                          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
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -1450,9 +1451,9 @@ use modd_grid,       only: xlatori, xlonori
 use modd_grid_n,     only: lsleve, xxhat, xyhat, xzhat
 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, xles_temp_mean_start, xles_temp_mean_end, xles_temp_mean_step,        &
-                           xspectra_altitudes
-use modd_les_n,      only: nles_times, nspectra_ni, nspectra_nj, tles_dates
+                           xles_altitudes, xspectra_altitudes
+use modd_les_n,      only: nles_dtcount, nles_mean_end, nles_mean_start, nles_mean_step, nles_mean_times, &
+                           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
@@ -1476,14 +1477,13 @@ character(len=:),                         allocatable :: yprogram
 integer                                               :: iiu, iju, iku
 integer                                               :: id, iid, iresp
 integer                                               :: imi
-integer                                               :: iavg
 integer                                               :: ji
 integer                                               :: jt
+integer                                               :: jtb, jte
 integer(kind=cdfint)                                  :: incid
 logical                                               :: gchangemodel
 logical                                               :: gdealloc
 logical,                         pointer              :: gsleve
-real                                                  :: zles_temp_mean_start, zles_temp_mean_end
 real,            dimension(:),   pointer              :: zxhat, zyhat, zzhat
 real,            dimension(:),            allocatable :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space
 real,            dimension(:),            allocatable :: zles_levels
@@ -1746,31 +1746,34 @@ if ( tpfile%lmaster ) then
       call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_TIME), 'time axis for LES budgets', tles_dates )
 
     !Coordinates for the number of LES budget time averages
-    iavg = int( xles_temp_mean_end - 1.e-10 - xles_temp_mean_start ) / xles_temp_mean_step + 1
     !Condition also on nles_times to not create this coordinate when not used (no time average if nles_times=0)
-    if ( nles_times > 0 .and. iavg > 0 ) then
-      Allocate( tzdates(iavg) )
-      Allocate( tzdates_bound(2, iavg) )
-
-      do jt = 1, iavg
-        zles_temp_mean_start = xles_temp_mean_start + ( jt - 1 ) * xles_temp_mean_step
-        zles_temp_mean_end   = Min( xles_temp_mean_end, zles_temp_mean_start + xles_temp_mean_step )
+    if ( nles_times > 0 .and. nles_mean_times > 0 ) then
+      Allocate( tzdates(nles_mean_times) )
+      Allocate( tzdates_bound(2, nles_mean_times) )
+
+      do jt = 1, nles_mean_times
+        jtb = ( nles_mean_start + ( jt - 1 ) * nles_mean_step ) / nles_dtcount
+        jte = MIN( jtb + nles_mean_step / nles_dtcount, nles_mean_end / nles_dtcount, nles_times )
+        ! jtb could be 0 if nles_mean_start is smaller than the first LES measurement
+        ! For example, it occurs if xles_temp_mean_start is smaller than xles_temp_sampling (if xles_temp_mean_start=0.)
+        ! Do this correction only after computation of jte
+        if ( jtb < 1 ) jtb = 1
 
         tzdates(jt)%nyear  = tdtseg%nyear
         tzdates(jt)%nmonth = tdtseg%nmonth
         tzdates(jt)%nday   = tdtseg%nday
-        tzdates(jt)%xtime        = tdtseg%xtime + ( zles_temp_mean_start + zles_temp_mean_end ) / 2.
+        tzdates(jt)%xtime        = tdtseg%xtime + ( xles_times(jtb) + xles_times(jte) ) / 2.
         !Not necessary:  call Datetime_correctdate( tzdates(jt ) )
 
         tzdates_bound(1, jt)%nyear  = tdtseg%nyear
         tzdates_bound(1, jt)%nmonth = tdtseg%nmonth
         tzdates_bound(1, jt)%nday   = tdtseg%nday
-        tzdates_bound(1, jt)%xtime        = tdtseg%xtime + zles_temp_mean_start
+        tzdates_bound(1, jt)%xtime  = tdtseg%xtime + xles_times(jtb)
 
         tzdates_bound(2, jt)%nyear  = tdtseg%nyear
         tzdates_bound(2, jt)%nmonth = tdtseg%nmonth
         tzdates_bound(2, jt)%nday   = tdtseg%nday
-        tzdates_bound(2, jt)%xtime        = tdtseg%xtime + zles_temp_mean_end
+        tzdates_bound(2, jt)%xtime  = tdtseg%xtime + xles_times(jte)
       end do
       call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_AVG_TIME), 'time axis for LES budget time averages', &
                              tzdates, tzdates_bound )
-- 
GitLab


From 0289e2b3a7e4a281e1e092b2de31170dc92c7232 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 31 Mar 2022 09:35:19 +0200
Subject: [PATCH 047/157] Philippe 31/03/2022: minor: correct comment for NPRO
 field

---
 src/LIB/SURCOUCHE/src/mode_field.f90 | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 6288bf39c..b6f5a6ab7 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -64,7 +64,6 @@ SUBROUTINE INI_FIELD_LIST()
 ! Modif
 !  J.Escobar 25/04/2018: missing def of FRC
 !------------------------------------------------
-USE MODD_CONF, ONLY: NMODEL
 
 CHARACTER(LEN=64) :: YMSG
 
@@ -1307,7 +1306,7 @@ call Add_field2list( TFIELDDATA( &
   CLONGNAME  = 'NPRO',           &
   CUNITS     = '',               &
   CDIR       = 'XY',             &
-  CCOMMENT   = 'X_Y_Z_Nact',     &
+  CCOMMENT   = 'X_Y_Z_NPRO',     &
   NGRID      = 1,                &
   NTYPE      = TYPEREAL,         &
   NDIMS      = 3,                &
-- 
GitLab


From 362ad0b434df11e3bf607ed5c7e52a8cb763037c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Apr 2022 09:54:02 +0200
Subject: [PATCH 048/157] Philippe 01/04/2022: bugfix: YAEROLONGNAMES
 allocation was made in a loop

---
 src/MNH/ini_nsv.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 1a9662857..b0064200d 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -460,6 +460,8 @@ IF (LORILAM.AND.(NEQ .GT. 0)) THEN
   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
@@ -1069,8 +1071,6 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
 
   WRITE( YNUM3, '( I3.3 )' ) JSV
 
-  ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) )
-
   !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
-- 
GitLab


From b13e1b6ce2133577a5ce3dcef38e7b259dd4d1e4 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Apr 2022 10:53:54 +0200
Subject: [PATCH 049/157] Philippe 01/04/2022: add error if CDUMMY1 not set
 correctly

---
 src/MNH/read_chem_data_netcdf_case.f90 | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90
index d779c372a..c1511ef3b 100644
--- a/src/MNH/read_chem_data_netcdf_case.f90
+++ b/src/MNH/read_chem_data_netcdf_case.f90
@@ -87,6 +87,7 @@ END MODULE MODI_READ_CHEM_DATA_NETCDF_CASE
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8)
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  P. Wautelet 01/04/2022: add error if CDUMMY1 not set correctly
 !-------------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -395,6 +396,9 @@ ELSEIF (CDUMMY1=="18") THEN
        itimeindex=3
 ELSEIF ((CDUMMY1=="24").OR.(CDUMMY1=="00")) THEN
        itimeindex=4
+ELSE
+  call Print_msg( NVERB_ERROR, 'GEN', 'READ_CHEM_DATA_NETCDF_CASE', 'CDUMMY1 is not set correctly (or not set at all)' )
+  itimeindex=1
 ENDIF
  istart3d(4) = itimeindex
 !
@@ -423,7 +427,7 @@ enddo
   istatus = nf90_get_var(incid, ips_varid, ZPSMOZ(:,:), start=istart2d, count=icount2d)
   if (istatus /= nf90_noerr) call handle_err(istatus)
 
-  
+
 !------------------------------------------------------------------------
 !* 3 Interpolation of MOZART variable
 !---------------------------------------------------------------------
@@ -580,7 +584,7 @@ DO JI = 1,IMOZ               !for every MNH species existing in MOZ1.nam
     ENDIF      
 
   ENDDO ! JNCHEM
-  DO JNAER = NSV_AERBEG, NSV_AEREND 
+  DO JNAER = NSV_AERBEG, NSV_AEREND
     IF (trim(CAERONAMES(JNAER-NSV_AERBEG+1))==trim(YSPCMNH(JI))) THEN !MNH mechanism species
        IF (ISPCMOZ(JI)==1) THEN
          istatus = nf90_inq_varid(incid, trim(YCHANGE(JI,1)), ind_netcdf)
@@ -661,7 +665,7 @@ DO JI = 1,IMOZ               !for every MNH species existing in MOZ1.nam
     ENDIF         
   ENDDO ! JNAER
 ENDDO  ! JIDO JNCHEM = NSV_CHEMBEG, NSV_CHEMEND  !loop on all MNH species
-DEALLOCATE(YSPCMNH) 
+DEALLOCATE(YSPCMNH)
 DEALLOCATE(TZSTOC)
 DEALLOCATE(ISPCMOZ) 
 DEALLOCATE(ZCOEFMOZART)
-- 
GitLab


From 84ebb2632fdb9aab52f22a868423870da87223ae Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Apr 2022 11:38:38 +0200
Subject: [PATCH 050/157] Philippe 01/04/2022: bugfix: error in the list of
 aerosols

---
 src/MNH/ini_nsv.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index b0064200d..63a98e801 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -1077,7 +1077,7 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
     !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_BCi,  JP_CH_DSTi, JP_CH_DSTj ] )                        &
+                           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, &
-- 
GitLab


From c78d6fb1a3ee08deb28e4b6d38933e34ded1c914 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 7 Apr 2022 14:05:37 +0200
Subject: [PATCH 051/157] Philippe 07/04/2022: rewrite types for stations

---
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 |   4 +-
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |   4 +-
 src/MNH/ini_stationn.f90                    |  69 ++---
 src/MNH/ini_surfstationn.f90                | 212 +++++++-------
 src/MNH/modd_stationn.f90                   |  29 +-
 src/MNH/modd_type_station.f90               | 122 ++++----
 src/MNH/station_reader.f90                  |  71 ++---
 src/MNH/stationn.f90                        | 206 +++++++-------
 src/MNH/write_stationn.f90                  | 295 ++++++++++----------
 9 files changed, 480 insertions(+), 532 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 22fa1c5db..465f3bf2f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -282,7 +282,7 @@ use modd_profiler_n,    only: numbprofiler, tprofiler
 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: numbstat, tstations_time
 
 TYPE(TFILEDATA),INTENT(INOUT)        :: TPFILE
 CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program
@@ -429,7 +429,7 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then
 
   !Dimension for the number of station times
   if ( numbstat > 0 ) then
-    istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1
+    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
 
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index ead87ec69..0900e7163 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1459,7 +1459,7 @@ use modd_parameters, only: jphext, JPVEXT
 use modd_profiler_n, only: numbprofiler, tprofiler
 use modd_series,     only: lseries
 use modd_series_n,   only: nsnbstept, tpsdates
-use modd_station_n,  only: numbstat, tstation
+use modd_station_n,  only: numbstat, tstations_time
 use modd_time,       only: tdtseg
 use modd_time_n,     only: tdtcur
 use modd_type_date,  only: date_time
@@ -1841,7 +1841,7 @@ if ( tpfile%lmaster ) then
 
     !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 )
+      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
diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90
index 8bfe8866f..8e675165b 100644
--- a/src/MNH/ini_stationn.f90
+++ b/src/MNH/ini_stationn.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.
@@ -59,9 +59,9 @@
 !!    MODIFICATIONS
 !!    -------------
 !!     Original 15/01/2002
-!!     Modification: 02/2021 (E.Jezequel) Read stations from CVS file
-!!
-!! --------------------------------------------------------------------------
+!  E. Jezequel     02/2021: read stations from CVS file
+!  P. Wautelet  07/04/2022: rewrite types for stations
+! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
 !          ------------
@@ -86,59 +86,40 @@ IMPLICIT NONE
 INTEGER :: JI
 !
 !----------------------------------------------------------------------------
-!
-!*      1.   Nameliste 
-!            ---------
-
 IF (CFILE_STAT=="NO_INPUT_CSV") THEN
+!
+!*      1.   Namelist
+!            --------
   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
-    !
+    ALLOCATE( TSTATIONS(NUMBSTAT) )
+
     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)
+        TSTATIONS(JI)%XX = XX_STAT(JI)
+        TSTATIONS(JI)%XY = XY_STAT(JI)
+        TSTATIONS(JI)%XZ = XZ_STAT(JI)
+        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
+        TSTATIONS(JI)%CTYPE = 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)
+        TSTATIONS(JI)%XLAT = XLAT_STAT(JI)
+        TSTATIONS(JI)%XLON = XLON_STAT(JI)
+        TSTATIONS(JI)%XZ   = XZ_STAT(JI)
+        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
+        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
       END DO
-    ENDIF
-  ENDIF
+    END IF
+  END IF
 ELSE
 !
 !*      2.   CSV DATA 
 !
-  CALL READ_CSV_STATION(CFILE_STAT,TSTATION,LCARTESIAN)
-  TSTATION%STEP = XSTEP_STAT
-END IF 
+  CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN )
+END IF
+
+TSTATIONS_TIME%XTSTEP = XSTEP_STAT
 
-!
 END SUBROUTINE INI_STATION_n
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 5b79bb289..013c342be 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -63,13 +63,14 @@ 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  07/04/2022: rewrite types for stations
+! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -80,7 +81,6 @@ 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
@@ -115,23 +115,20 @@ INTEGER,            INTENT(IN) :: KMI     ! MODEL NUMBER
 !       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)
+CALL DEFAULT_STATION_n()
 !
 !
 !*      3.   Stations initialization
 !            -----------------------
 !
-CALL INI_STATION_n
+CALL INI_STATION_n()
 LSTATION = (NUMBSTAT>0)
 !
 !----------------------------------------------------------------------------
@@ -140,135 +137,122 @@ LSTATION = (NUMBSTAT>0)
 !            -----------------------------
 !
 IF(NUMBSTAT>0) THEN
-  CALL ALLOCATE_STATION_n(TSTATION,KMI)
-  IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n(TSTATION)
+  CALL ALLOCATE_STATION_n()
+  IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n()
 ENDIF
 !----------------------------------------------------------------------------
 !
 CONTAINS
 !
 !----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_STATION_n(TSTATION)
-!
-TYPE(STATION), INTENT(INOUT) :: TSTATION
+SUBROUTINE DEFAULT_STATION_n()
+
+USE MODD_DYN_N, ONLY: XTSTEP
 !
 NUMBSTAT   = 0
-!
-TSTATION%T_CUR  = XUNDEF
-TSTATION%N_CUR  = 0
-TSTATION%STEP   = XTSTEP  
+TSTATIONS_TIME%XTSTEP = 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
+SUBROUTINE ALLOCATE_STATION_n()
+
+INTEGER :: JI
+
+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 ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1
+
+allocate( tstations_time%tpdates(istore) )
+
+DO JI = 1, NUMBSTAT
+  ALLOCATE(TSTATIONS(JI)%XZON   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XMER   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XW     (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XP     (ISTORE))
+  IF (OUSETKE) THEN
+    ALLOCATE(TSTATIONS(JI)%XTKE (ISTORE))
+  ELSE
+    ALLOCATE(TSTATIONS(JI)%XTKE (0))
+  END IF
+  ALLOCATE(TSTATIONS(JI)%XTH    (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XR     (ISTORE,KRR))
+  ALLOCATE(TSTATIONS(JI)%XSV    (ISTORE,KSV))
+  ALLOCATE(TSTATIONS(JI)%XTSRAD (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XT2M   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XQ2M   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XHU2M  (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XZON10M(ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XMER10M(ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XRN    (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XH     (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XLE    (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XLEI   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XGFLUX (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XSWD   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XSWU   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XLWD   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XLWU   (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XSWDIR (ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XSWDIFF(ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XDSTAOD(ISTORE))
+  ALLOCATE(TSTATIONS(JI)%XSFCO2 (ISTORE))
+
+  TSTATIONS(JI)%XZON(:)    = XUNDEF
+  TSTATIONS(JI)%XMER(:)    = XUNDEF
+  TSTATIONS(JI)%XW(:)      = XUNDEF
+  TSTATIONS(JI)%XP(:)      = XUNDEF
+  TSTATIONS(JI)%XTKE(:)    = XUNDEF
+  TSTATIONS(JI)%XTH(:)     = XUNDEF
+  TSTATIONS(JI)%XR(:,:)    = XUNDEF
+  TSTATIONS(JI)%XSV(:,:)   = XUNDEF
+  TSTATIONS(JI)%XTSRAD(:)  = XUNDEF
+  TSTATIONS(JI)%XT2M(:)    = XUNDEF
+  TSTATIONS(JI)%XQ2M(:)    = XUNDEF
+  TSTATIONS(JI)%XHU2M(:)   = XUNDEF
+  TSTATIONS(JI)%XZON10M(:) = XUNDEF
+  TSTATIONS(JI)%XMER10M(:) = XUNDEF
+  TSTATIONS(JI)%XRN(:)     = XUNDEF
+  TSTATIONS(JI)%XH(:)      = XUNDEF
+  TSTATIONS(JI)%XLE(:)     = XUNDEF
+  TSTATIONS(JI)%XLEI(:)    = XUNDEF
+  TSTATIONS(JI)%XGFLUX(:)  = XUNDEF
+  TSTATIONS(JI)%XSWD(:)    = XUNDEF
+  TSTATIONS(JI)%XSWU(:)    = XUNDEF
+  TSTATIONS(JI)%XLWD(:)    = XUNDEF
+  TSTATIONS(JI)%XLWU(:)    = XUNDEF
+  TSTATIONS(JI)%XSWDIR(:)  = XUNDEF
+  TSTATIONS(JI)%XSWDIFF(:) = XUNDEF
+  TSTATIONS(JI)%XDSTAOD(:) = XUNDEF
+  TSTATIONS(JI)%XSFCO2(:)  = XUNDEF
+END DO
 
-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))
-!
-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
-!
 END SUBROUTINE ALLOCATE_STATION_n
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE INI_INTERP_STATION_n(TSTATION)
+SUBROUTINE INI_INTERP_STATION_n()
 !
-TYPE(STATION), INTENT(INOUT) :: TSTATION   ! 
-INTEGER :: JII                             ! 
-INTEGER :: IIU, IJU                        !   
+INTEGER :: JII
+INTEGER :: IIU, IJU
 !
-IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN
- DO JII=1,NUMBSTAT
+IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= 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
+                 TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, &
+                 TSTATIONS(JII)%XX,   TSTATIONS(JII)%XY    )
+ END DO
 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','')
+  CMNHMSG(1) = 'Error in station position'
+  CMNHMSG(1) = 'either LATitude or LONgitude segment'
+  CMNHMSG(1) = 'or I and J segment'
+  CMNHMSG(1) = 'definition is not complete.'
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_SURFSTATION_n' )
 END IF
-!
-TSTATION%STEP  = MAX ( PTSTEP, TSTATION%STEP )
-!
-!
+
 END SUBROUTINE INI_INTERP_STATION_n
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90
index fe16b7697..ff5351dee 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,14 +29,16 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    15/01/02
+!  P. Wautelet 07/04/2022: rewrite types for stations
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 !
-USE MODD_TYPE_STATION
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
+USE MODD_TYPE_STATION
+
 IMPLICIT NONE
 
 TYPE STATION_t
@@ -52,7 +49,8 @@ TYPE STATION_t
   INTEGER                          :: NUMBSTAT    ! number of stations
   LOGICAL                          :: LSTATLAT    ! positioning in lat/lon
 !
-  TYPE(STATION) :: TSTATION ! characteristics and records of a station
+  TYPE(TSTATIONTIME) :: TSTATIONS_TIME
+  TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations
 !
 END TYPE STATION_t
 
@@ -61,7 +59,8 @@ 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()
+TYPE(TSTATIONTIME),               POINTER :: TSTATIONS_TIME => NULL()
+TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS      => NULL()
 
 CONTAINS
 
@@ -69,12 +68,14 @@ 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       => STATION_MODEL(KTO)%NUMBSTAT
+LSTATLAT       => STATION_MODEL(KTO)%LSTATLAT
+TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME
+TSTATIONS      => STATION_MODEL(KTO)%TSTATIONS
 
 END SUBROUTINE STATION_GOTO_MODEL
 
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
index 3456ac2d2..b929d28d4 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.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.
@@ -30,74 +30,72 @@
 !!    -------------
 !!      Original    15/01/02
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 07/04/2022: rewrite types for stations
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
-!
-use modd_type_date, only: date_time
+use modd_type_date,  only: date_time
+use modd_parameters, only: NUNDEF, XUNDEF
 
 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)
+private
+
+public :: TSTATIONTIME, TSTATIONDATA
+
+TYPE TSTATIONTIME
+  REAL                                       :: XTIME_CUR = XUNDEF  ! current time since last storage
+  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 TSTATIONTIME
+
+TYPE TSTATIONDATA
+! Type to store all the data of 1 station
+CHARACTER(LEN=8) :: CNAME = ''  ! station name
+CHARACTER(LEN=8) :: CTYPE = ''  ! station type (currently not used)
+LOGICAL :: LERROR = .FALSE.  !
+
+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)
+REAL :: XZS  = XUNDEF  ! zs(n)
+
+INTEGER :: NK = NUNDEF ! Model level for altitude comparisons
+
+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 :: XT2M
+REAL, DIMENSION(:),   ALLOCATABLE :: XQ2M
+REAL, DIMENSION(:),   ALLOCATABLE :: XHU2M
+REAL, DIMENSION(:),   ALLOCATABLE :: XZON10M
+REAL, DIMENSION(:),   ALLOCATABLE :: XMER10M
+REAL, DIMENSION(:),   ALLOCATABLE :: XRN
+REAL, DIMENSION(:),   ALLOCATABLE :: XH
+REAL, DIMENSION(:),   ALLOCATABLE :: XLE
+REAL, DIMENSION(:),   ALLOCATABLE :: XLEI
+REAL, DIMENSION(:),   ALLOCATABLE :: XGFLUX
+REAL, DIMENSION(:),   ALLOCATABLE :: XSWD
+REAL, DIMENSION(:),   ALLOCATABLE :: XSWU
+REAL, DIMENSION(:),   ALLOCATABLE :: XLWD
+REAL, DIMENSION(:),   ALLOCATABLE :: XLWU
+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
 
-END TYPE STATION
-!
 END MODULE MODD_TYPE_STATION
diff --git a/src/MNH/station_reader.f90 b/src/MNH/station_reader.f90
index 0f6b74663..3e7741e8b 100644
--- a/src/MNH/station_reader.f90
+++ b/src/MNH/station_reader.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.
@@ -9,11 +9,11 @@
 !
 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
+SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN )
+USE MODD_STATION_n
+CHARACTER(LEN=*),                          INTENT(IN)    :: HFILE      ! file to read
+TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS
+LOGICAL,                                   INTENT(IN)    :: OCARTESIAN
 END SUBROUTINE READ_CSV_STATION
 !
 END INTERFACE
@@ -21,7 +21,7 @@ END INTERFACE
 END MODULE MODI_STATION_READER
 !-------------------------------------------------------------------
 !
-!!****  *EOL_READER* -
+!!****  *READ_CSV_STATION* -
 !!
 !!    PURPOSE
 !!    -------
@@ -29,16 +29,16 @@ END MODULE MODI_STATION_READER
 !!
 !!    AUTHOR
 !!    ------
-!!     E. Jézéquel 		*CNRM & IFPEN*
+!!     E. Jezequel *CNRM & IFPEN*
 !!
 !!    MODIFICATIONS
 !!    -------------
 !!     03/2020      Original
-!!
-!!---------------------------------------------------------------
+!  P. Wautelet 07/04/2022: rewrite types for stations
+!---------------------------------------------------------------
 !
 !#########################################################
-SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN)
+SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN )
 USE MODD_ALLSTATION_n
 USE MODD_STATION_n
 USE MODD_PARAMETERS
@@ -46,15 +46,15 @@ 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
+CHARACTER(LEN=*),                          INTENT(IN)    :: HFILE      ! file to read
+TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS
+LOGICAL,                                   INTENT(IN)    :: OCARTESIAN
 !
-INTEGER                           :: INBLINE      ! Nb of line in csv file
+INTEGER            :: INBLINE      ! Nb of line in csv file
 !
-CHARACTER(LEN=80)                 :: YERROR
-CHARACTER(LEN=400)                :: YSTRING
-INTEGER                           :: ILU     ! logical unit of the file
+CHARACTER(LEN=80)  :: YERROR
+CHARACTER(LEN=400) :: YSTRING
+INTEGER            :: ILU     ! logical unit of the file
 !
 
 ! Open file
@@ -76,39 +76,22 @@ END DO
   YERROR = 'Data not found in file : '//TRIM(HFILE)
   PRINT*, YERROR
  ELSE 
-  ! Save number of station 
+  ! Save number of stations
   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 
+  ALLOCATE( TPSTATIONS(NUMBSTAT) )
+
+  ! New reading
   REWIND(ILU)
-  READ(ILU,FMT='(A400)') YSTRING ! Lecture du header
+  READ(ILU,FMT='(A400)') YSTRING ! Reading of 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)!,&
+    READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,&
+    TPSTATIONS(INBLINE)%XX, TPSTATIONS(INBLINE)%XY, TPSTATIONS(INBLINE)%XZ
    END DO
    REWIND(ILU)
    CLOSE(ILU)
@@ -117,8 +100,8 @@ END DO
    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)!,&
+    READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,&
+    TPSTATIONS(INBLINE)%XLAT, TPSTATIONS(INBLINE)%XLON, TPSTATIONS(INBLINE)%XZ
    END DO
    REWIND(ILU)
    CLOSE(ILU)
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index 4de047e71..92105242e 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2020 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.
@@ -72,14 +72,15 @@ 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/J 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  07/04/2022: rewrite types for stations
 !
 ! --------------------------------------------------------------------------
 !
@@ -185,27 +186,27 @@ ZYHATM(  IJU  )=1.5*PYHAT(  IJU  )-0.5*PYHAT(  IJU-1)
 !*      3.4  instant of storage
 !            ------------------
 !
-IF ( TSTATION%T_CUR == XUNDEF ) TSTATION%T_CUR = TSTATION%STEP - PTSTEP
+IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTSTEP - PTSTEP
 !
-TSTATION%T_CUR = TSTATION%T_CUR + PTSTEP
+TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP
 !
-IF ( TSTATION%T_CUR >= TSTATION%STEP - 1.E-10 ) THEN
+IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 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
+     TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP
+     TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1
+     IN = TSTATIONS_TIME%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
+  tstations_time%tpdates(in)%date%year  = tdtexp%date%year
+  tstations_time%tpdates(in)%date%month = tdtexp%date%month
+  tstations_time%tpdates(in)%date%day   = tdtexp%date%day
+  tstations_time%tpdates(in)%xtime      = tdtexp%xtime + ( in - 1 ) * tstation%step
 #else
-  tstation%tpdates(in) = tdtcur
+  tstations_time%tpdates(in) = tdtcur
 #endif
 END IF
 !
@@ -236,7 +237,6 @@ IF (GSTATFIRSTCALL) THEN
  ZYCOEF(:)  =XUNDEF
  ZVCOEF(:)  =XUNDEF
 
-!
  DO I=1,NUMBSTAT
 !
   ZTHIS_PROCS(I)=0.
@@ -244,21 +244,21 @@ IF (GSTATFIRSTCALL) THEN
 !*      4.1  X position
 !            ----------
 !
-  IU(I)=COUNT( PXHAT (:)<=TSTATION%X(I) )
-  II(I)=COUNT( ZXHATM(:)<=TSTATION%X(I) )
+  IU(I)=COUNT( PXHAT (:)<=TSTATIONS(I)%XX )
+  II(I)=COUNT( ZXHATM(:)<=TSTATIONS(I)%XX )
 !
-  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.
+  IF (II(I)<=IIB-1   .AND. LWEST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
+  IF (II(I)>=IIE     .AND. LEAST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
 !
 !
 !*      4.2  Y position
 !            ----------
 !
-  IV(I)=COUNT( PYHAT (:)<=TSTATION%Y(I) )
-  IJ(I)=COUNT( ZYHATM(:)<=TSTATION%Y(I) )
+  IV(I)=COUNT( PYHAT (:)<=TSTATIONS(I)%XY )
+  IJ(I)=COUNT( ZYHATM(:)<=TSTATIONS(I)%XY )
 !
-  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.
+  IF (IJ(I)<=IJB-1   .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
+  IF (IJ(I)>=IJE     .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
 !
 !
 !*      4.3  Position of station according to processors
@@ -272,7 +272,7 @@ IF (GSTATFIRSTCALL) THEN
 !            --------------------------------------
     ZXCOEF(I) = 0.
     ZYCOEF(I) = 0.
-    ZUCOEF(I) = 0.         
+    ZUCOEF(I) = 0.
     ZVCOEF(I) = 0.
     IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN
 !----------------------------------------------------------------------------
@@ -280,14 +280,14 @@ IF (GSTATFIRSTCALL) THEN
 !*      6.1  Interpolation coefficient for X
 !            -------------------------------
 !
-       ZXCOEF(I) = (TSTATION%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I)))
+       ZXCOEF(I) = (TSTATIONS(I)%XX - 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)))
+       ZYCOEF(I) = (TSTATIONS(I)%XY - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I)))
 !
 !-------------------------------------------------------------------
 !
@@ -297,13 +297,13 @@ IF (GSTATFIRSTCALL) THEN
 !*      7.1  Interpolation coefficient for X (for U)
 !            -------------------------------
 !
-       ZUCOEF(I) = (TSTATION%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I)))
+       ZUCOEF(I) = (TSTATIONS(I)%XX - 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)))
+       ZVCOEF(I) = (TSTATIONS(I)%XY - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I)))
 !
 !
 
@@ -318,70 +318,70 @@ END IF
 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
+     IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATIONS(I)%LERROR)) THEN
+       IF (TSTATIONS(I)%NK/= XUNDEF) THEN
+         J = TSTATIONS(I)%NK
+       ELSE  ! suppose TSTATIONS(I)%XZ /= XUNDEF
         J=1
         DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) &
-        < TSTATION%Z(I))
+        < TSTATIONS(I)%XZ)
          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
+        IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATIONS(I)%XZ)>&
+       (TSTATIONS(I)%XZ-(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))
+        TSTATIONS(I)%XZON (IN)   =   STATION_INTERP_2D_U(PU(:,:,J))
+        TSTATIONS(I)%XMER (IN)   =   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)
+        ZGAM                  = (XRPK * (TSTATIONS(I)%XLON - XLON0) - XBETA)*(XPI/180.)
+        TSTATIONS(I)%XZON (IN)   =   ZU_STAT     * COS(ZGAM) + ZV_STAT     * SIN(ZGAM)
+        TSTATIONS(I)%XMER (IN)   = - 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))
+        TSTATIONS(I)%XW   (IN)   = STATION_INTERP_2D(PW(:,:,J))
+        TSTATIONS(I)%XTH  (IN)   = STATION_INTERP_2D(PTH(:,:,J))
+        TSTATIONS(I)%XP   (IN)   = STATION_INTERP_2D(PP(:,:,J))
       !
         DO JSV=1,SIZE(PR,4)
-         TSTATION%R   (IN,I,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV))
+         TSTATIONS(I)%XR   (IN,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))
+         TSTATIONS(I)%XSV  (IN,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 (SIZE(PTKE)>0) TSTATIONS(I)%XTKE  (IN) = STATION_INTERP_2D(PTKE(:,:,J))
+        IF (SIZE(PTS) >0) TSTATIONS(I)%XTSRAD(IN) = STATION_INTERP_2D(PTS)
+        TSTATIONS(I)%XZS      = 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 ) 
+          TSTATIONS(I)%XZON10M(IN) = STATION_INTERP_2D(XCURRENT_ZON10M)
+          TSTATIONS(I)%XMER10M(IN) = STATION_INTERP_2D(XCURRENT_MER10M)
+          TSTATIONS(I)%XT2M   (IN) = STATION_INTERP_2D(XCURRENT_T2M   )
+          TSTATIONS(I)%XQ2M   (IN) = STATION_INTERP_2D(XCURRENT_Q2M   )
+          TSTATIONS(I)%XHU2M  (IN) = STATION_INTERP_2D(XCURRENT_HU2M  )
+          TSTATIONS(I)%XRN    (IN) = STATION_INTERP_2D(XCURRENT_RN    )
+          TSTATIONS(I)%XH     (IN) = STATION_INTERP_2D(XCURRENT_H     )
+          TSTATIONS(I)%XLE    (IN) = STATION_INTERP_2D(XCURRENT_LE    )
+          TSTATIONS(I)%XLEI   (IN) = STATION_INTERP_2D(XCURRENT_LEI   )
+          TSTATIONS(I)%XGFLUX (IN) = 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)
+          TSTATIONS(I)%XSWD   (IN) = STATION_INTERP_2D(XCURRENT_SWD   )
+          TSTATIONS(I)%XSWU   (IN) = STATION_INTERP_2D(XCURRENT_SWU   )
+          TSTATIONS(I)%XLWD   (IN) = STATION_INTERP_2D(XCURRENT_LWD   )
+          TSTATIONS(I)%XLWU   (IN) = STATION_INTERP_2D(XCURRENT_LWU   )
+          TSTATIONS(I)%XSWDIR (IN) = STATION_INTERP_2D(XCURRENT_SWDIR )
+          TSTATIONS(I)%XSWDIFF(IN) = STATION_INTERP_2D(XCURRENT_SWDIFF)
+          TSTATIONS(I)%XDSTAOD(IN) = STATION_INTERP_2D(XCURRENT_DSTAOD)
          ENDIF
-          TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) 
+          TSTATIONS(I)%XSFCO2 (IN) = STATION_INTERP_2D(XCURRENT_SFCO2 )
         ENDIF
-       
+
       !
     END IF
 !
@@ -393,48 +393,48 @@ IF (GSTORE) THEN
 !*     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))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XX   )
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XY   )
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZ   )
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLON )
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLAT )
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON (IN))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER (IN))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XW   (IN))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XP   (IN))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTH  (IN))
   DO JSV=1,SIZE(PR,4)
-    CALL DISTRIBUTE_STATION(TSTATION%R   (IN,I,JSV))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XR   (IN,JSV))
   END DO
   DO JSV=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_STATION(TSTATION%SV  (IN,I,JSV))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSV  (IN,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 (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTKE  (IN))
+  IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTSRAD(IN))
+  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZS )
   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))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XT2M    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XQ2M    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XHU2M   (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON10M (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER10M (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XRN     (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XH      (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLE     (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLEI    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XGFLUX  (IN))
    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))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWD    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWU    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWD    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWU    (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIR  (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIFF (IN))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XDSTAOD (IN))
    END IF
-    CALL DISTRIBUTE_STATION(TSTATION%SFCO2  (IN,I))
+    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSFCO2  (IN))
   ENDIF
-  !
+
  ENDDO
   !
 END IF
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 8d6d36ec6..0746c64d2 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -56,11 +56,12 @@ END MODULE MODI_WRITE_STATION_n
 !!    MODIFICATIONS
 !!    -------------
 !!     Original 15/02/2002
-!!  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/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 07/04/2022: rewrite types for stations
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -75,7 +76,7 @@ USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
                                 nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend
 USE MODD_PARAM_n,         ONLY: CRAD, CSURF
 USE MODD_PARAMETERS,      ONLY: XUNDEF
-USE MODD_STATION_n,       only: NUMBSTAT, STATION, TSTATION
+USE MODD_STATION_n,       only: NUMBSTAT, TSTATIONS
 !
 USE MODE_AERO_PSD
 USE MODE_DUST_PSD
@@ -94,12 +95,11 @@ 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)
+DO II = 1, NUMBSTAT
+  CALL STATION_DIACHRO_n( TSTATIONS(II) )
 ENDDO
 !
 !----------------------------------------------------------------------------
@@ -111,14 +111,15 @@ CONTAINS
 !----------------------------------------------------------------------------
 !
 !----------------------------------------------------------------------------
-SUBROUTINE STATION_DIACHRO_n(TSTATION,II)
+SUBROUTINE STATION_DIACHRO_n( TPSTATION )
 
 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, &
                        tfieldmetadata_base, TYPEREAL
+use modd_station_n,    only: tstations_time
+use modd_type_station, only: tstationdata
 
-TYPE(STATION),        INTENT(IN)       :: TSTATION
-INTEGER,              INTENT(IN)       :: II
+TYPE(TSTATIONDATA),   INTENT(IN)       :: TPSTATION
 !
 !*      0.2  declaration of local variables for diachro
 !
@@ -144,13 +145,13 @@ type(tbudiachrometadata)                             :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
-IF (TSTATION%X(II)==XUNDEF) RETURN
-IF (TSTATION%Y(II)==XUNDEF) RETURN
+IF (TPSTATION%XX==XUNDEF) RETURN
+IF (TPSTATION%XY==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 (TPSTATION%XX==XUNDEF) IPROC = IPROC + 2
+IF (SIZE(TPSTATION%XTKE  )>0) IPROC = IPROC + 1
 IF (LDIAG_SURFRAD) THEN
   IF(CSURF=="EXTE") IPROC = IPROC + 10
   IF(CRAD/="NONE")  IPROC = IPROC + 7
@@ -158,17 +159,17 @@ 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 (ANY(TPSTATION%XTSRAD(:)/=XUNDEF))  IPROC = IPROC + 1
+IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF))  IPROC = IPROC + 1
 !
-ALLOCATE (ZWORK6(1,1,1,SIZE(tstation%tpdates),1,IPROC))
+ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%tpdates),1,IPROC))
 ALLOCATE (YCOMMENT(IPROC))
 ALLOCATE (YTITLE  (IPROC))
 ALLOCATE (YUNIT   (IPROC))
 ALLOCATE (IGRID   (IPROC))
 !
 IGRID  = 1
-YGROUP = TSTATION%NAME(II)
+YGROUP = TPSTATION%CNAME
 JPROC = 0
 !
 !----------------------------------------------------------------------------
@@ -177,227 +178,227 @@ JPROC = JPROC + 1
 YTITLE   (JPROC) = 'ZS'
 YUNIT    (JPROC) = 'm'
 YCOMMENT (JPROC) = 'Orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZS(II)
+ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZS
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'P'
 YUNIT    (JPROC) = 'Pa'
-YCOMMENT (JPROC) = 'Pressure' 
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%P(:,II)
+YCOMMENT (JPROC) = 'Pressure'
+ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XP(:)
 !
 !JPROC = JPROC + 1
 !YTITLE   (JPROC) = 'Z'
 !YUNIT    (JPROC) = 'm'
 !YCOMMENT (JPROC) = 'Z Pos'
-!ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Z(II)
+!ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZ
 !
 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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XX
   !
   JPROC = JPROC + 1
   YTITLE   (JPROC) = 'Y'
   YUNIT    (JPROC) = 'm'
   YCOMMENT (JPROC) = 'Y Pos'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Y(II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XY
   !
   JPROC = JPROC + 1
   YTITLE   (JPROC) = 'U'
   YUNIT    (JPROC) = 'm s-1'
   YCOMMENT (JPROC) = 'Axial velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:)
   !
   JPROC = JPROC + 1
   YTITLE   (JPROC) = 'V'
   YUNIT    (JPROC) = 'm s-1'
   YCOMMENT (JPROC) = 'Transversal velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:)
 ELSE
   JPROC = JPROC + 1
   YTITLE   (JPROC) = 'LON'
   YUNIT    (JPROC) = 'degree'
   YCOMMENT (JPROC) = 'Longitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LON(II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLON
   !
   JPROC = JPROC + 1
   YTITLE   (JPROC) = 'LAT'
   YUNIT    (JPROC) = 'degree'
   YCOMMENT (JPROC) = 'Latitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LAT(II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLAT
   !
   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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:)
   !
   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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:)
 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)
+YCOMMENT (JPROC) = 'Air vertical speed'
+ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XW(:)
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'Th'
 YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'Potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TH(:,II)
+YCOMMENT (JPROC) = 'Potential temperature'
+ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTH(:)
 !
 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)
+    YCOMMENT (JPROC) = '2-m temperature'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XT2M(:)
     !
     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)
+    YCOMMENT (JPROC) = '2-m humidity'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XQ2M(:)
     !
     JPROC = JPROC + 1
     YTITLE   (JPROC) = 'HU2m'
     YUNIT    (JPROC) = 'percent'
-    YCOMMENT (JPROC) = '2-m relative humidity' 
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%HU2M(:,II)
+    YCOMMENT (JPROC) = '2-m relative humidity'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XHU2M(:)
     !
     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)
-    !       
+    YCOMMENT (JPROC) = '10-m zonal wind'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON10M(:)
+    !
     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)
+    YCOMMENT (JPROC) = '10-m meridian wind'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER10M(:)
     !
     JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'RN'  
+    YTITLE   (JPROC) = 'RN'
     YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Net radiation'         
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%RN(:,II)
+    YCOMMENT (JPROC) = 'Net radiation'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XRN(:)
     !
     JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'H'   
+    YTITLE   (JPROC) = 'H'
     YUNIT    (JPROC) = 'W m-2'
     YCOMMENT (JPROC) = 'Sensible heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%H(:,II)
-    !       
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XH(:)
+    !
     JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LE'  
+    YTITLE   (JPROC) = 'LE'
     YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Total Latent heat flux'   
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LE(:,II)
+    YCOMMENT (JPROC) = 'Total Latent heat flux'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLE(:)
     !
     JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'G'    
+    YTITLE   (JPROC) = 'G'
     YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Storage heat flux'     
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%GFLUX(:,II)
+    YCOMMENT (JPROC) = 'Storage heat flux'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XGFLUX(:)
     !
     JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LEI'  
+    YTITLE   (JPROC) = 'LEI'
     YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Solid Latent heat flux'   
-    ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LEI(:,II)
+    YCOMMENT (JPROC) = 'Solid Latent heat flux'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLEI(:)
   END IF
  IF (CRAD /= 'NONE') THEN
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWD'   
+  YTITLE   (JPROC) = 'SWD'
   YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWD(:,II)
-  !       
+  YCOMMENT (JPROC) = 'Downward short-wave radiation'
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWD(:)
+  !
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWU'   
+  YTITLE   (JPROC) = 'SWU'
   YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Upward short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWU(:,II)
-  !       
+  YCOMMENT (JPROC) = 'Upward short-wave radiation'
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWU(:)
+  !
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWD'  
+  YTITLE   (JPROC) = 'LWD'
   YUNIT    (JPROC) = 'W m-2'
   YCOMMENT (JPROC) = 'Downward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWD(:,II)
-  !       
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWD(:)
+  !
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWU'  
+  YTITLE   (JPROC) = 'LWU'
   YUNIT    (JPROC) = 'W m-2'
   YCOMMENT (JPROC) = 'Upward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWU(:,II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWU(:)
   JPROC = JPROC + 1
   !
-  YTITLE   (JPROC) = 'SWDIR'   
+  YTITLE   (JPROC) = 'SWDIR'
   YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward direct short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIR(:,II)
+  YCOMMENT (JPROC) = 'Downward direct short-wave radiation'
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIR(:)
   !
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWDIFF'   
+  YTITLE   (JPROC) = 'SWDIFF'
   YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIFF(:,II)  
-  !       
+  YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation'
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIFF(:)
+  !
   JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'DSTAOD'  
+  YTITLE   (JPROC) = 'DSTAOD'
   YUNIT    (JPROC) = 'm'
   YCOMMENT (JPROC) = 'Dust aerosol optical depth'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%DSTAOD(:,II)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XDSTAOD(:)
   !
  END IF
 ENDIF
 !
-DO JRR=1,SIZE(TSTATION%R,3)
+DO JRR=1,SIZE(TPSTATION%XR,2)
   JPROC = JPROC+1
   YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%R(:,II,JRR)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XR(:,JRR)
   IF (JRR==1) THEN
     YTITLE   (JPROC) = 'Rv'
-    YCOMMENT (JPROC) = 'Water vapor mixing ratio' 
+    YCOMMENT (JPROC) = 'Water vapor mixing ratio'
   ELSE IF (JRR==2) THEN
     YTITLE   (JPROC) = 'Rc'
-    YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' 
+    YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio'
   ELSE IF (JRR==3) THEN
     YTITLE   (JPROC) = 'Rr'
-    YCOMMENT (JPROC) = 'Rain water mixing ratio' 
+    YCOMMENT (JPROC) = 'Rain water mixing ratio'
   ELSE IF (JRR==4) THEN
     YTITLE   (JPROC) = 'Ri'
-    YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' 
+    YCOMMENT (JPROC) = 'Ice cloud water mixing ratio'
   ELSE IF (JRR==5) THEN
     YTITLE   (JPROC) = 'Rs'
-    YCOMMENT (JPROC) = 'Snow mixing ratio' 
+    YCOMMENT (JPROC) = 'Snow mixing ratio'
   ELSE IF (JRR==6) THEN
     YTITLE   (JPROC) = 'Rg'
-    YCOMMENT (JPROC) = 'Graupel mixing ratio' 
+    YCOMMENT (JPROC) = 'Graupel mixing ratio'
   ELSE IF (JRR==7) THEN
     YTITLE   (JPROC) = 'Rh'
-    YCOMMENT (JPROC) = 'Hail mixing ratio' 
+    YCOMMENT (JPROC) = 'Hail mixing ratio'
   END IF
 END DO
 !
-IF (SIZE(TSTATION%TKE,1)>0) THEN
+IF (SIZE(TPSTATION%XTKE,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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTKE(:)
 END IF
 !
-IF (SIZE(TSTATION%SV,3)>=1) THEN
+IF (SIZE(TPSTATION%XSV,2)>=1) THEN
   ! Scalar variables
   DO JSV = 1, NSV
     JPROC = JPROC + 1
@@ -405,33 +406,33 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
     YCOMMENT(JPROC) = ''
     IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
       YUNIT(JPROC)  = 'ppb'
-      ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+      ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
     ELSE
       YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
-      ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV)
+      ZWORK6(1,1,1,:,1,JPROC) = 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,SIZE(tstations_time%tpdates),NSV_AER))
+    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
+    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),JPMODE))
+    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),JPMODE))
+    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),JPMODE))
+    ALLOCATE (ZPTOTA(1,1,SIZE(tstations_time%tpdates),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) )  &
+      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)
 
@@ -552,25 +553,25 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
     DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
 
-  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,SIZE(tstations_time%tpdates),NSV_DST))
+    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
+    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_DST))
+    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_DST))
+    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),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) )  &
+      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
@@ -596,25 +597,25 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
     DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
 
-  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,SIZE(tstations_time%tpdates),NSV_SLT))
+    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
+    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_SLT))
+    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT))
+    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),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
@@ -636,31 +637,31 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN
       WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
       ZWORK6 (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
 END IF
 
-IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN
+IF (ANY(TPSTATION%XTSRAD(:)/=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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:)
 END IF
 !
-IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF)) THEN
+IF (ANY(TPSTATION%XSFCO2(:)/=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)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSFCO2(:)
 END IF
 !
 !----------------------------------------------------------------------------
 !
 !
-ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC))
+ALLOCATE (ZW6(1,1,1,SIZE(tstations_time%tpdates),1,JPROC))
 ZW6 = ZWORK6(:,:,:,:,:,:JPROC)
 DEALLOCATE(ZWORK6)
 !
@@ -727,7 +728,7 @@ 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, zw6 )
 
 deallocate( tzfields )
 
-- 
GitLab


From 30f5984cebf1832b9b21e8e0ba7f22f9c8ec6751 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Apr 2022 10:20:26 +0200
Subject: [PATCH 052/157] Philippe 08/04/2022: merge ini_stationn.f90 and
 ini_surfstationn.f90

---
 src/MNH/ini_stationn.f90     | 125 -----------------------------------
 src/MNH/ini_surfstationn.f90 |  51 ++++++++++----
 2 files changed, 39 insertions(+), 137 deletions(-)
 delete mode 100644 src/MNH/ini_stationn.f90

diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90
deleted file mode 100644
index 8e675165b..000000000
--- a/src/MNH/ini_stationn.f90
+++ /dev/null
@@ -1,125 +0,0 @@
-!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.
-!-----------------------------------------------------------------
-!     #######################
-      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
-!  E. Jezequel     02/2021: read stations from CVS file
-!  P. Wautelet  07/04/2022: rewrite types for stations
-! --------------------------------------------------------------------------
-!       
-!*      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
-!
-!----------------------------------------------------------------------------
-IF (CFILE_STAT=="NO_INPUT_CSV") THEN
-!
-!*      1.   Namelist
-!            --------
-  NUMBSTAT             = NNUMB_STAT
-
-  IF (NUMBSTAT > 0) THEN
-    ALLOCATE( TSTATIONS(NUMBSTAT) )
-
-    IF (LCARTESIAN) THEN
-      DO JI=1,NUMBSTAT
-        TSTATIONS(JI)%XX = XX_STAT(JI)
-        TSTATIONS(JI)%XY = XY_STAT(JI)
-        TSTATIONS(JI)%XZ = XZ_STAT(JI)
-        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
-        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
-      END DO
-    ELSE
-      DO JI=1,NUMBSTAT
-        TSTATIONS(JI)%XLAT = XLAT_STAT(JI)
-        TSTATIONS(JI)%XLON = XLON_STAT(JI)
-        TSTATIONS(JI)%XZ   = XZ_STAT(JI)
-        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
-        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
-      END DO
-    END IF
-  END IF
-ELSE
-!
-!*      2.   CSV DATA 
-!
-  CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN )
-END IF
-
-TSTATIONS_TIME%XTSTEP = XSTEP_STAT
-
-END SUBROUTINE INI_STATION_n
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 013c342be..f68f35028 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -116,19 +116,56 @@ INTEGER,            INTENT(IN) :: KMI     ! MODEL NUMBER
 !
 INTEGER :: ISTORE ! number of storage instants
 INTEGER :: IIU_ll,IJU_ll,IRESP
+INTEGER :: JI
 !
 !----------------------------------------------------------------------------
 !
 !*      1.   Default values
 !            --------------
 !
-CALL DEFAULT_STATION_n()
+NUMBSTAT   = 0
+TSTATIONS_TIME%XTSTEP = XTSTEP
 !
 !
 !*      3.   Stations initialization
 !            -----------------------
 !
-CALL INI_STATION_n()
+IF (CFILE_STAT=="NO_INPUT_CSV") THEN
+!
+!*      1.   Namelist
+!            --------
+  NUMBSTAT             = NNUMB_STAT
+
+  IF (NUMBSTAT > 0) THEN
+    ALLOCATE( TSTATIONS(NUMBSTAT) )
+
+    IF (LCARTESIAN) THEN
+      DO JI=1,NUMBSTAT
+        TSTATIONS(JI)%XX = XX_STAT(JI)
+        TSTATIONS(JI)%XY = XY_STAT(JI)
+        TSTATIONS(JI)%XZ = XZ_STAT(JI)
+        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
+        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
+      END DO
+    ELSE
+      DO JI=1,NUMBSTAT
+        TSTATIONS(JI)%XLAT = XLAT_STAT(JI)
+        TSTATIONS(JI)%XLON = XLON_STAT(JI)
+        TSTATIONS(JI)%XZ   = XZ_STAT(JI)
+        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
+        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
+      END DO
+    END IF
+  END IF
+ELSE
+!
+!*      2.   CSV DATA
+!
+  CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN )
+END IF
+
+TSTATIONS_TIME%XTSTEP = XSTEP_STAT
+
 LSTATION = (NUMBSTAT>0)
 !
 !----------------------------------------------------------------------------
@@ -145,16 +182,6 @@ ENDIF
 CONTAINS
 !
 !----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_STATION_n()
-
-USE MODD_DYN_N, ONLY: XTSTEP
-!
-NUMBSTAT   = 0
-TSTATIONS_TIME%XTSTEP = XTSTEP
-!
-END SUBROUTINE DEFAULT_STATION_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
 SUBROUTINE ALLOCATE_STATION_n()
 
 INTEGER :: JI
-- 
GitLab


From ae50524e13a2b085ec398c859d38f07fa4cbe275 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Apr 2022 11:51:10 +0200
Subject: [PATCH 053/157] Philippe 08/04/2022: stations: add position and
 interpolation coefficients in TSTATIONDATA type

---
 src/MNH/ini_surfstationn.f90  |  3 ++
 src/MNH/modd_type_station.f90 | 15 +++++-
 src/MNH/station_tools.f90     | 95 +++++++++++++++++++++++++++++++++++
 src/MNH/stationn.f90          | 43 ++++++++--------
 4 files changed, 134 insertions(+), 22 deletions(-)
 create mode 100644 src/MNH/station_tools.f90

diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index f68f35028..3cde34d16 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -262,6 +262,8 @@ END SUBROUTINE ALLOCATE_STATION_n
 !----------------------------------------------------------------------------
 SUBROUTINE INI_INTERP_STATION_n()
 !
+USE MODE_STATION_TOOLS, ONLY: STATION_POSITION
+
 INTEGER :: JII
 INTEGER :: IIU, IJU
 !
@@ -271,6 +273,7 @@ IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) T
    CALL SM_XYHAT(PLATOR,PLONOR,                        &
                  TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, &
                  TSTATIONS(JII)%XX,   TSTATIONS(JII)%XY    )
+   CALL STATION_POSITION( TSTATIONS(JII) )
  END DO
 ELSE
   CMNHMSG(1) = 'Error in station position'
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
index b929d28d4..ac0134eab 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.f90
@@ -37,7 +37,7 @@
 !             ------------
 !
 use modd_type_date,  only: date_time
-use modd_parameters, only: NUNDEF, XUNDEF
+use modd_parameters, only: NNEGUNDEF, NUNDEF, XUNDEF
 
 implicit none
 
@@ -57,6 +57,7 @@ TYPE TSTATIONDATA
 CHARACTER(LEN=8) :: CNAME = ''  ! station name
 CHARACTER(LEN=8) :: CTYPE = ''  ! station type (currently not used)
 LOGICAL :: LERROR = .FALSE.  !
+LOGICAL :: LPRESENT = .FALSE. ! If true, this station is situated on this process
 
 REAL :: XX   = XUNDEF  ! X(n)
 REAL :: XY   = XUNDEF  ! Y(n)
@@ -65,6 +66,18 @@ REAL :: XLON = XUNDEF  ! longitude(n)
 REAL :: XLAT = XUNDEF  ! latitude (n)
 REAL :: XZS  = XUNDEF  ! zs(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)
+
 INTEGER :: NK = NUNDEF ! Model level for altitude comparisons
 
 REAL, DIMENSION(:),   ALLOCATABLE :: XZON    ! zonal wind(n)
diff --git a/src/MNH/station_tools.f90 b/src/MNH/station_tools.f90
new file mode 100644
index 000000000..1aa02f68e
--- /dev/null
+++ b/src/MNH/station_tools.f90
@@ -0,0 +1,95 @@
+!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 08/04/2022
+!-----------------------------------------------------------------
+! Modifications:
+!-----------------------------------------------------------------
+!      ##################
+MODULE MODE_STATION_TOOLS
+!      ##################
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: STATION_POSITION
+
+CONTAINS
+
+! ######################################
+SUBROUTINE STATION_POSITION( TPSTATION )
+! ######################################
+! Subroutine to determine the position of a station on the model grid
+! and set the useful coefficient for data interpolation
+
+  USE MODD_CONF,         ONLY: L1D
+  USE MODD_GRID_n,       ONLY: XXHAT, XYHAT
+  USE MODD_TYPE_STATION, ONLY: TSTATIONDATA
+
+  USE MODE_TOOLS_ll,     ONLY: GET_INDICE_ll, LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
+
+  INTEGER :: IIB ! domain sizes of current process
+  INTEGER :: IJB !
+  INTEGER :: IIE !
+  INTEGER :: IJE !
+  INTEGER :: IIU !
+  INTEGER :: IJU !
+  REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates
+  REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates
+
+  IIU = SIZE( XXHAT )
+  IJU = SIZE( XYHAT )
+
+  CALL GET_INDICE_ll (IIB, IJB, IIE, IJE )
+
+  ! Interpolations of model variables to mass points
+  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
+  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
+
+  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
+  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
+
+  TPSTATION%LPRESENT = .FALSE.
+
+  ! X position
+  TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX )
+  TPSTATION%NI_M = COUNT( ZXHATM(:) <= TPSTATION%XX )
+
+  IF ( TPSTATION%NI_M<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
+  IF ( TPSTATION%NI_M>=IIE   .AND. LEAST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
+
+  ! Y position
+  TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY )
+  TPSTATION%NJ_M = COUNT( ZYHATM(:) <= TPSTATION%XY )
+
+  IF ( TPSTATION%NJ_M<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
+  IF ( TPSTATION%NJ_M>=IJE   .AND. LNORTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
+
+  ! Position of station according to processes
+  IF (       TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE &
+       .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) TPSTATION%LPRESENT = .TRUE.
+  IF ( L1D ) TPSTATION%LPRESENT = .TRUE.
+
+  ! Computations only on correct process
+  IF ( TPSTATION%LPRESENT .AND. .NOT. L1D ) THEN
+    ! Interpolation coefficient for X (mass-point)
+    TPSTATION%XXMCOEF = ( TPSTATION%XX - ZXHATM(TPSTATION%NI_M) ) / ( ZXHATM(TPSTATION%NI_M+1) - ZXHATM(TPSTATION%NI_M) )
+    ! Interpolation coefficient for Y (mass-point)
+    TPSTATION%XYMCOEF = ( TPSTATION%XY - ZYHATM(TPSTATION%NJ_M) ) / ( ZYHATM(TPSTATION%NJ_M+1) - ZYHATM(TPSTATION%NJ_M) )
+    ! Interpolation coefficient for X (U-point)
+    TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) )  / ( XXHAT(TPSTATION%NI_U+1)  - XXHAT(TPSTATION%NI_U) )
+    ! Interpolation coefficient for Y (V-point)
+    TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) )  / ( XYHAT(TPSTATION%NJ_V+1)  - XYHAT(TPSTATION%NJ_V) )
+  END IF
+
+END SUBROUTINE STATION_POSITION
+
+END MODULE MODE_STATION_TOOLS
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index 92105242e..d59477e66 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -152,7 +152,6 @@ 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
@@ -318,7 +317,7 @@ END IF
 IF (GSTORE) THEN
   DO I=1,NUMBSTAT
      !
-     IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATIONS(I)%LERROR)) THEN
+     IF ( TSTATIONS(I)%LPRESENT .AND. .NOT. TSTATIONS(I)%LERROR ) THEN
        IF (TSTATIONS(I)%NK/= XUNDEF) THEN
          J = TSTATIONS(I)%NK
        ELSE  ! suppose TSTATIONS(I)%XZ /= XUNDEF
@@ -461,17 +460,17 @@ ELSEIF (L1D) THEN
      JI=2
      JJ=2
 ELSE
-     JI=II(I)
-     JJ=IJ(I)
+     JI=TSTATIONS(I)%NI_M
+     JJ=TSTATIONS(I)%NJ_M
 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)
+PB = (1.-TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) *  PA(JI,JJ)    + &
+     (1.-TSTATIONS(I)%XYMCOEF) *    (TSTATIONS(I)%XXMCOEF) *  PA(JI+1,JJ)  + &
+     (   TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) *  PA(JI,JJ+1)  + &
+     (   TSTATIONS(I)%XYMCOEF) *    (TSTATIONS(I)%XXMCOEF) *  PA(JI+1,JJ+1)
 !
 END FUNCTION STATION_INTERP_2D
 !----------------------------------------------------------------------------
@@ -491,16 +490,16 @@ ELSEIF (L1D) THEN
      JI=2
      JJ=2
 ELSE
-     JI=II(I)
-     JJ=IJ(I)
+     JI=TSTATIONS(I)%NI_M
+     JJ=TSTATIONS(I)%NJ_M
 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)
+PB = (1.- TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI  ,JJ  ) &
+   + (1.- TSTATIONS(I)%XYMCOEF) * (   TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ  ) &
+   + (    TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI  ,JJ+1) &
+   + (    TSTATIONS(I)%XYMCOEF) * (   TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ+1)
 !
 END FUNCTION STATION_INTERP_2D_U
 !----------------------------------------------------------------------------
@@ -520,16 +519,16 @@ ELSEIF (L1D) THEN
      JI=2
      JJ=2  
 ELSE
-  JI=II(I)
-  JJ=IJ(I)
+  JI=TSTATIONS(I)%NI_M
+  JJ=TSTATIONS(I)%NJ_M
 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)
+PB = (1.- TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI  ,JJ  ) &
+   + (1.- TSTATIONS(I)%XYVCOEF) * (   TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ  ) &
+   + (    TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI  ,JJ+1) &
+   + (    TSTATIONS(I)%XYVCOEF) * (   TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1)
 !
 END FUNCTION STATION_INTERP_2D_V
 !----------------------------------------------------------------------------
@@ -538,7 +537,9 @@ SUBROUTINE DISTRIBUTE_STATION(PAS)
 !
 REAL, INTENT(INOUT) :: PAS
 !
-PAS = PAS * ZTHIS_PROCS(I)
+INTEGER :: IINFO_ll   ! return code
+
+IF ( .NOT. TSTATIONS(I)%LPRESENT ) PAS = 0.
 CALL REDUCESUM_ll(PAS,IINFO_ll)
 !
 END SUBROUTINE DISTRIBUTE_STATION
-- 
GitLab


From 417fbfbbb2e8741d6d9cbbd0e466b486e3f6a56e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 8 Apr 2022 11:57:42 +0200
Subject: [PATCH 054/157] Philippe 08/04/2022: remove modd_sub_stationn

---
 src/MNH/goto_model_wrapper.f90 |   4 +-
 src/MNH/modd_sub_stationn.f90  | 108 ---------------------------------
 src/MNH/stationn.f90           | 100 ------------------------------
 3 files changed, 1 insertion(+), 211 deletions(-)
 delete mode 100644 src/MNH/modd_sub_stationn.f90

diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index 831cb2028..da4f0e5c7 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.
@@ -108,7 +108,6 @@ 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
 !
@@ -204,7 +203,6 @@ 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/modd_sub_stationn.f90 b/src/MNH/modd_sub_stationn.f90
deleted file mode 100644
index d9fffb3ec..000000000
--- 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/stationn.f90 b/src/MNH/stationn.f90
index d59477e66..dcb38f6d3 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -95,7 +95,6 @@ USE MODD_PARAMETERS
 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
 !
@@ -212,105 +211,6 @@ END IF
 !
 !----------------------------------------------------------------------------
 !
-!*      4.   STATION POSITION
-!            --------------
-!
-!*      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))
-
- ZXCOEF(:)  =XUNDEF
- ZUCOEF(:)  =XUNDEF
- ZYCOEF(:)  =XUNDEF
- ZVCOEF(:)  =XUNDEF
-
- DO I=1,NUMBSTAT
-!
-  ZTHIS_PROCS(I)=0.
-!
-!*      4.1  X position
-!            ----------
-!
-  IU(I)=COUNT( PXHAT (:)<=TSTATIONS(I)%XX )
-  II(I)=COUNT( ZXHATM(:)<=TSTATIONS(I)%XX )
-!
-  IF (II(I)<=IIB-1   .AND. LWEST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
-  IF (II(I)>=IIE     .AND. LEAST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
-!
-!
-!*      4.2  Y position
-!            ----------
-!
-  IV(I)=COUNT( PYHAT (:)<=TSTATIONS(I)%XY )
-  IJ(I)=COUNT( ZYHATM(:)<=TSTATIONS(I)%XY )
-!
-  IF (IJ(I)<=IJB-1   .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE.
-  IF (IJ(I)>=IJE     .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.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) = (TSTATIONS(I)%XX - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I)))
-!
-!
-!
-!*      6.2  Interpolation coefficient for y
-!            -------------------------------
-!
-       ZYCOEF(I) = (TSTATIONS(I)%XY - 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) = (TSTATIONS(I)%XX - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I)))
-!
-!
-!*      7.2  Interpolation coefficient for y (for V)
-!            -------------------------------
-!
-       ZVCOEF(I) = (TSTATIONS(I)%XY - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I)))
-!
-!
-
-    END IF
- ENDDO
-END IF
-!----------------------------------------------------------------------------
-!
 !*      8.   DATA RECORDING
 !            --------------
 !
-- 
GitLab


From 488baaf1adbb7f14b8298971463f13809f3e517e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 20 Apr 2022 11:35:49 +0200
Subject: [PATCH 055/157] Philippe 20/04/2022: stations: optimise stations
 (less communications, less memory...) Interpolation was not correct for U and
 V (did not use correct position indices)

---
 src/MNH/default_desfmn.f90    |   3 +-
 src/MNH/ini_modeln.f90        |   6 +-
 src/MNH/ini_surfstationn.f90  | 295 +++++++++-----------------
 src/MNH/modd_allstationn.f90  |  16 +-
 src/MNH/modd_stationn.f90     |  18 +-
 src/MNH/modd_type_station.f90 |  12 +-
 src/MNH/modn_stationn.f90     |  10 +-
 src/MNH/station_reader.f90    | 162 ++++++++-------
 src/MNH/station_tools.f90     | 376 ++++++++++++++++++++++++++++++----
 src/MNH/stationn.f90          | 351 ++++++-------------------------
 src/MNH/write_stationn.f90    | 228 +++++++++++++++++++--
 11 files changed, 819 insertions(+), 658 deletions(-)

diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index c1be2c51e..c9f530786 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.
@@ -603,7 +603,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/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 718f11ce6..6ee23d80a 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-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.
@@ -2565,9 +2565,7 @@ CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, &
 !*      24.     STATION initializations
 !              -----------------------
 !
-CALL INI_SURFSTATION_n(XTSTEP, XSEGLEN, NRR, NSV, &
-                       CTURB=="TKEL" , KMI,       &
-                       XLATORI, XLONORI           )
+CALL INI_SURFSTATION_n( )
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 3cde34d16..ebd004817 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* - 
@@ -69,222 +53,143 @@ END MODULE MODI_INI_SURFSTATION_n
 !  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  07/04/2022: rewrite types for stations
+!  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_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_GRID_n,         ONLY: XXHAT, XYHAT
+USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_STATION_n
-USE MODD_TYPE_DATE
-USE MODD_VAR_ll,          ONLY: IP
+USE MODD_TYPE_STATION
 !
-USE MODE_GATHER_ll
-USE MODE_GRIDPROJ
-USE MODE_ll
 USE MODE_MSG
-!
-USE MODI_INI_STATION_N
+USE MODE_STATION_READER
+USE MODE_STATION_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION
+USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll
+USE MODE_GATHER_ll,      ONLY: GATHERALL_FIELD_ll
 !
 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 :: IIU_ll,IJU_ll,IRESP
+INTEGER :: IERR
+INTEGER :: IIU
+INTEGER :: IJU
+INTEGER :: ISTORE                           ! number of storage instants
 INTEGER :: JI
+LOGICAL :: GALLOCX, GALLOCY
+LOGICAL :: GINSIDE                          ! True if station is inside physical domain of model
+LOGICAL :: GPRESENT                         ! True if station is present on the current process
+REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
+REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
+REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM      ! mass point coordinates
+REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM      ! mass point coordinates
+REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
+REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
+TYPE(TSTATIONDATA)           :: TZSTATION
 !
 !----------------------------------------------------------------------------
-!
-!*      1.   Default values
-!            --------------
-!
-NUMBSTAT   = 0
-TSTATIONS_TIME%XTSTEP = XTSTEP
-!
-!
-!*      3.   Stations initialization
-!            -----------------------
-!
-IF (CFILE_STAT=="NO_INPUT_CSV") THEN
-!
-!*      1.   Namelist
-!            --------
-  NUMBSTAT             = NNUMB_STAT
 
-  IF (NUMBSTAT > 0) THEN
-    ALLOCATE( TSTATIONS(NUMBSTAT) )
+TSTATIONS_TIME%XTSTEP = XSTEP_STAT
 
-    IF (LCARTESIAN) THEN
-      DO JI=1,NUMBSTAT
-        TSTATIONS(JI)%XX = XX_STAT(JI)
-        TSTATIONS(JI)%XY = XY_STAT(JI)
-        TSTATIONS(JI)%XZ = XZ_STAT(JI)
-        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
-        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
-      END DO
-    ELSE
-      DO JI=1,NUMBSTAT
-        TSTATIONS(JI)%XLAT = XLAT_STAT(JI)
-        TSTATIONS(JI)%XLON = XLON_STAT(JI)
-        TSTATIONS(JI)%XZ   = XZ_STAT(JI)
-        TSTATIONS(JI)%CNAME = CNAME_STAT(JI)
-        TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI)
-      END DO
-    END IF
-  END IF
-ELSE
-!
-!*      2.   CSV DATA
-!
-  CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN )
-END IF
+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
 
-TSTATIONS_TIME%XTSTEP = XSTEP_STAT
+ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1
 
-LSTATION = (NUMBSTAT>0)
-!
-!----------------------------------------------------------------------------
+allocate( tstations_time%tpdates(istore) )
 !
-!*      4.   Allocations of storage arrays
-!            -----------------------------
+! Prepare positioning data
 !
-IF(NUMBSTAT>0) THEN
-  CALL ALLOCATE_STATION_n()
-  IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n()
-ENDIF
-!----------------------------------------------------------------------------
+IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
+  IIU = SIZE( XXHAT )
+  IJU = SIZE( XYHAT )
+
+  ! Get global XHAT and YHAT (needed by STATION_POSITION)
+  CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX )
+  CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY )
+  CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
+  CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
+
+  ! Interpolations of model variables to mass points
+  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
+  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
+
+  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
+  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
+
+  ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
+  ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
+  ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
+  ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) )
+END IF
 !
-CONTAINS
+! Stations initialization
 !
-!----------------------------------------------------------------------------
-SUBROUTINE ALLOCATE_STATION_n()
+NUMBSTAT_LOC = 0
 
-INTEGER :: JI
-
-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
+IF (CFILE_STAT=="NO_INPUT_CSV") THEN
+  ! Treat namelist
+  NUMBSTAT = 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 STATION_INI_INTERP( TZSTATION )
+      END IF
+      TZSTATION%XZ    = XZ_STAT(JI)
+      TZSTATION%CNAME = CNAME_STAT(JI)
 
-ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1
+      CALL STATION_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                  &
+                             ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
+                             GINSIDE, GPRESENT                                                   )
 
-allocate( tstations_time%tpdates(istore) )
+      IF ( GINSIDE ) THEN
+        NUMBSTAT = NUMBSTAT + 1
+        TZSTATION%NID = NUMBSTAT
+      END IF
 
-DO JI = 1, NUMBSTAT
-  ALLOCATE(TSTATIONS(JI)%XZON   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XMER   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XW     (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XP     (ISTORE))
-  IF (OUSETKE) THEN
-    ALLOCATE(TSTATIONS(JI)%XTKE (ISTORE))
-  ELSE
-    ALLOCATE(TSTATIONS(JI)%XTKE (0))
+      IF ( GPRESENT ) CALL STATION_ADD( TZSTATION )
+    END DO
   END IF
-  ALLOCATE(TSTATIONS(JI)%XTH    (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XR     (ISTORE,KRR))
-  ALLOCATE(TSTATIONS(JI)%XSV    (ISTORE,KSV))
-  ALLOCATE(TSTATIONS(JI)%XTSRAD (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XT2M   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XQ2M   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XHU2M  (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XZON10M(ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XMER10M(ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XRN    (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XH     (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XLE    (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XLEI   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XGFLUX (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XSWD   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XSWU   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XLWD   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XLWU   (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XSWDIR (ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XSWDIFF(ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XDSTAOD(ISTORE))
-  ALLOCATE(TSTATIONS(JI)%XSFCO2 (ISTORE))
+ELSE
+  !Treat CSV datafile
+  CALL READ_CSV_STATION( CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,               &
+                         ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX )
+END IF
 
-  TSTATIONS(JI)%XZON(:)    = XUNDEF
-  TSTATIONS(JI)%XMER(:)    = XUNDEF
-  TSTATIONS(JI)%XW(:)      = XUNDEF
-  TSTATIONS(JI)%XP(:)      = XUNDEF
-  TSTATIONS(JI)%XTKE(:)    = XUNDEF
-  TSTATIONS(JI)%XTH(:)     = XUNDEF
-  TSTATIONS(JI)%XR(:,:)    = XUNDEF
-  TSTATIONS(JI)%XSV(:,:)   = XUNDEF
-  TSTATIONS(JI)%XTSRAD(:)  = XUNDEF
-  TSTATIONS(JI)%XT2M(:)    = XUNDEF
-  TSTATIONS(JI)%XQ2M(:)    = XUNDEF
-  TSTATIONS(JI)%XHU2M(:)   = XUNDEF
-  TSTATIONS(JI)%XZON10M(:) = XUNDEF
-  TSTATIONS(JI)%XMER10M(:) = XUNDEF
-  TSTATIONS(JI)%XRN(:)     = XUNDEF
-  TSTATIONS(JI)%XH(:)      = XUNDEF
-  TSTATIONS(JI)%XLE(:)     = XUNDEF
-  TSTATIONS(JI)%XLEI(:)    = XUNDEF
-  TSTATIONS(JI)%XGFLUX(:)  = XUNDEF
-  TSTATIONS(JI)%XSWD(:)    = XUNDEF
-  TSTATIONS(JI)%XSWU(:)    = XUNDEF
-  TSTATIONS(JI)%XLWD(:)    = XUNDEF
-  TSTATIONS(JI)%XLWU(:)    = XUNDEF
-  TSTATIONS(JI)%XSWDIR(:)  = XUNDEF
-  TSTATIONS(JI)%XSWDIFF(:) = XUNDEF
-  TSTATIONS(JI)%XDSTAOD(:) = XUNDEF
-  TSTATIONS(JI)%XSFCO2(:)  = XUNDEF
-END DO
+LSTATION = ( NUMBSTAT > 0 )
 
-END SUBROUTINE ALLOCATE_STATION_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE INI_INTERP_STATION_n()
+DO JI = 1, NUMBSTAT_LOC
+  CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE )
+END DO
 !
-USE MODE_STATION_TOOLS, ONLY: STATION_POSITION
-
-INTEGER :: JII
-INTEGER :: IIU, IJU
+! Clean positioning data
 !
-IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) THEN
- DO JII = 1, NUMBSTAT
-   CALL GET_DIM_EXT_ll ('B',IIU,IJU)
-   CALL SM_XYHAT(PLATOR,PLONOR,                        &
-                 TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, &
-                 TSTATIONS(JII)%XX,   TSTATIONS(JII)%XY    )
-   CALL STATION_POSITION( TSTATIONS(JII) )
- END DO
-ELSE
-  CMNHMSG(1) = 'Error in station position'
-  CMNHMSG(1) = 'either LATitude or LONgitude segment'
-  CMNHMSG(1) = 'or I and J segment'
-  CMNHMSG(1) = 'definition is not complete.'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_SURFSTATION_n' )
+IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
+  IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB )
+  IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB )
 END IF
 
-END SUBROUTINE INI_INTERP_STATION_n
 !----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
+
 END SUBROUTINE INI_SURFSTATION_n
diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90
index 933c16571..4229177e4 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,6 +29,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    01/06/21
+!  P. Wautelet     04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -36,11 +37,16 @@
 !
 !
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
-USE MODD_STATION_n
-USE MODD_TYPE_STATION
 
 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,7 +54,7 @@ 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=7), DIMENSION(100) :: CNAME_STAT
   CHARACTER(LEN=20)                :: CFILE_STAT
   REAL                             :: XSTEP_STAT
   LOGICAL                          :: LDIAG_SURFRAD
@@ -66,7 +72,6 @@ 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()
 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_stationn.f90 b/src/MNH/modd_stationn.f90
index ff5351dee..6017c0f98 100644
--- a/src/MNH/modd_stationn.f90
+++ b/src/MNH/modd_stationn.f90
@@ -29,25 +29,31 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    15/01/02
-!  P. Wautelet 07/04/2022: rewrite types for stations
+!  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_TYPE_STATION
+USE MODD_PARAMETERS,   ONLY: JPMODELMAX
+USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATIONTIME
 
 IMPLICIT NONE
 
+PRIVATE
+
+PUBLIC :: LSTATION, NUMBSTAT, 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(TSTATIONTIME) :: TSTATIONS_TIME
   TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations
@@ -58,7 +64,7 @@ TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL
 
 LOGICAL, POINTER :: LSTATION=>NULL()
 INTEGER, POINTER :: NUMBSTAT=>NULL()
-LOGICAL, POINTER :: LSTATLAT=>NULL()
+INTEGER, POINTER :: NUMBSTAT_LOC=>NULL()
 TYPE(TSTATIONTIME),               POINTER :: TSTATIONS_TIME => NULL()
 TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS      => NULL()
 
@@ -73,7 +79,7 @@ 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
+NUMBSTAT_LOC   => STATION_MODEL(KTO)%NUMBSTAT_LOC
 TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME
 TSTATIONS      => STATION_MODEL(KTO)%TSTATIONS
 
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
index ac0134eab..8d34883fa 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.f90
@@ -30,14 +30,14 @@
 !!    -------------
 !!      Original    15/01/02
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!  P. Wautelet 07/04/2022: rewrite types for stations
+!  P. Wautelet    04/2022: restructure stations 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, NUNDEF, XUNDEF
+use modd_parameters, only: NNEGUNDEF, XUNDEF
 
 implicit none
 
@@ -54,10 +54,10 @@ END TYPE TSTATIONTIME
 
 TYPE TSTATIONDATA
 ! Type to store all the data of 1 station
+
 CHARACTER(LEN=8) :: CNAME = ''  ! station name
-CHARACTER(LEN=8) :: CTYPE = ''  ! station type (currently not used)
-LOGICAL :: LERROR = .FALSE.  !
-LOGICAL :: LPRESENT = .FALSE. ! If true, this station is situated on this process
+
+INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model)
 
 REAL :: XX   = XUNDEF  ! X(n)
 REAL :: XY   = XUNDEF  ! Y(n)
@@ -78,7 +78,7 @@ 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)
 
-INTEGER :: NK = NUNDEF ! Model level for altitude comparisons
+INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons
 
 REAL, DIMENSION(:),   ALLOCATABLE :: XZON    ! zonal wind(n)
 REAL, DIMENSION(:),   ALLOCATABLE :: XMER    ! meridian wind(n)
diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90
index f388061e7..ab6013ee2 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,6 +21,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!    Original 10/03/20
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -34,7 +35,6 @@ 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 
 !!
@@ -46,7 +46,7 @@ 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=7), DIMENSION(100),SAVE:: CNAME_STAT
 CHARACTER (LEN=20)               ,SAVE:: CFILE_STAT              !filename
 LOGICAL                          ,SAVE:: LDIAG_SURFRAD
 
@@ -54,7 +54,7 @@ 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 +69,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 +82,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/station_reader.f90 b/src/MNH/station_reader.f90
index 3e7741e8b..1a72bfe1a 100644
--- a/src/MNH/station_reader.f90
+++ b/src/MNH/station_reader.f90
@@ -4,21 +4,18 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     #######################
-       MODULE MODI_STATION_READER
+       MODULE MODE_STATION_READER
 !     #######################
-!
-INTERFACE
-!
-SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN )
-USE MODD_STATION_n
-CHARACTER(LEN=*),                          INTENT(IN)    :: HFILE      ! file to read
-TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS
-LOGICAL,                                   INTENT(IN)    :: OCARTESIAN
-END SUBROUTINE READ_CSV_STATION
-!
-END INTERFACE
-!
-END MODULE MODI_STATION_READER
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: READ_CSV_STATION
+
+INTEGER, PARAMETER :: NMAXLINELGT = 400
+
+CONTAINS
 !-------------------------------------------------------------------
 !
 !!****  *READ_CSV_STATION* -
@@ -34,85 +31,85 @@ END MODULE MODI_STATION_READER
 !!    MODIFICATIONS
 !!    -------------
 !!     03/2020      Original
-!  P. Wautelet 07/04/2022: rewrite types for stations
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 !---------------------------------------------------------------
 !
-!#########################################################
-SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN )
-USE MODD_ALLSTATION_n
-USE MODD_STATION_n
-USE MODD_PARAMETERS
-USE MODD_TYPE_STATION
-USE MODI_INI_SURFSTATION_n
+!###############################################################################################
+SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                    &
+                             PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX )
+!###############################################################################################
 
+USE MODD_CONF,          ONLY: LCARTESIAN
+USE MODD_STATION_n,     ONLY: NUMBSTAT
+USE MODD_TYPE_STATION,  ONLY: TSTATIONDATA
+
+USE MODE_MSG
+USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION
+
+CHARACTER(LEN=*),   INTENT(IN) :: HFILE ! file to read
+REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB
+REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB
+REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates
+REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates
+REAL,               INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
+REAL,               INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
 !
-CHARACTER(LEN=*),                          INTENT(IN)    :: HFILE      ! file to read
-TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS
-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
-!
+CHARACTER(LEN=NMAXLINELGT) :: YSTRING
+INTEGER            :: ILU      ! logical unit of the file
+INTEGER            :: INBLINE  ! Nb of lines in csv file
+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
+
+INBLINE  = 0 !Number of stations found in the file
+NUMBSTAT = 0 !Number of stations found in the file AND inside the model domain
 
 ! Open file
-OPEN(NEWUNIT=ILU,FILE=HFILE, FORM='formatted')
-! Count lines  
-REWIND(ILU)
-INBLINE=0
+OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' )
+
+READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it)
+
 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
+  ! Read station 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, * ) TZSTATION%CNAME, TZSTATION%XX,   TZSTATION%XY,   TZSTATION%XZ
+  ELSE
+    READ( YSTRING, * ) TZSTATION%CNAME, TZSTATION%XLAT, TZSTATION%XLON, TZSTATION%XZ
+  END IF
+
+  IF ( .NOT. LCARTESIAN ) CALL STATION_INI_INTERP( TZSTATION )
+  CALL STATION_POSITION( TZSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                  &
+                         PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
+                         GINSIDE, GPRESENT                                                   )
+
+  IF ( GINSIDE ) THEN
+    NUMBSTAT = NUMBSTAT + 1
+    TZSTATION%NID = NUMBSTAT
+  END IF
+
+  IF ( GPRESENT ) CALL STATION_ADD( TZSTATION )
+
   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 stations
-  NUMBSTAT = INBLINE - 1 
-
-  ALLOCATE( TPSTATIONS(NUMBSTAT) )
-
-  ! New reading
-  REWIND(ILU)
-  READ(ILU,FMT='(A400)') YSTRING ! Reading of header
-  !
-  ! Save the data
-  IF (OCARTESIAN) THEN
-   INBLINE = 1
-   DO INBLINE=1, NUMBSTAT
-    READ(ILU,FMT='(A400)') YSTRING
-    READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,&
-    TPSTATIONS(INBLINE)%XX, TPSTATIONS(INBLINE)%XY, TPSTATIONS(INBLINE)%XZ
-   END DO
-   REWIND(ILU)
-   CLOSE(ILU)
-   RETURN
-  ELSE
-   INBLINE = 1
-   DO INBLINE=1, NUMBSTAT
-    READ(ILU,FMT='(A400)') YSTRING
-    READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,&
-    TPSTATIONS(INBLINE)%XLAT, TPSTATIONS(INBLINE)%XLON, TPSTATIONS(INBLINE)%XZ
-   END DO
-   REWIND(ILU)
-   CLOSE(ILU)
-   RETURN
-  END IF
- END IF
-!
+
+CLOSE( ILU )
+
+IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'READ_CSV_STATION', 'Data not found in file ' // TRIM( HFILE ) )
+
 END SUBROUTINE READ_CSV_STATION
+
 !#########################################################
 SUBROUTINE FRENCH_TO_ENGLISH(HSTRING)
-CHARACTER(LEN=400), INTENT(INOUT) :: HSTRING ! csv record
+CHARACTER(LEN=NMAXLINELGT), INTENT(INOUT) :: HSTRING ! csv record
+
 INTEGER :: JL
 LOGICAL :: GFRENCH
 !
@@ -120,13 +117,13 @@ 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
+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,400
+ DO JL = 1, NMAXLINELGT
    IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.'
    IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=','
  END DO
@@ -134,3 +131,4 @@ END IF
 !
 END SUBROUTINE FRENCH_TO_ENGLISH
 
+END MODULE MODE_STATION_READER
diff --git a/src/MNH/station_tools.f90 b/src/MNH/station_tools.f90
index 1aa02f68e..10b3c1ee3 100644
--- a/src/MNH/station_tools.f90
+++ b/src/MNH/station_tools.f90
@@ -1,9 +1,10 @@
-!MNH_LIC Copyright 2022-2022 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.
 !-----------------------------------------------------------------
-! Author:
+! Authors:
+!  Misc: some of the code was taken from older subroutines/functions for stations
 !  P. Wautelet 08/04/2022
 !-----------------------------------------------------------------
 ! Modifications:
@@ -12,84 +13,381 @@
 MODULE MODE_STATION_TOOLS
 !      ##################
 
+USE MODD_TYPE_STATION, ONLY: TSTATIONDATA
+
 IMPLICIT NONE
 
 PRIVATE
 
+PUBLIC :: STATION_ALLOCATE
+PUBLIC :: STATION_INI_INTERP
 PUBLIC :: STATION_POSITION
+PUBLIC :: STATION_ADD
+PUBLIC :: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
 
 CONTAINS
 
-! ######################################
-SUBROUTINE STATION_POSITION( TPSTATION )
-! ######################################
+! ##############################################
+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
+
+  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
+    TPSTATION%XQ2M(:)    = XUNDEF
+    TPSTATION%XHU2M(:)   = XUNDEF
+    TPSTATION%XZON10M(:) = XUNDEF
+    TPSTATION%XMER10M(:) = XUNDEF
+    TPSTATION%XRN(:)     = XUNDEF
+    TPSTATION%XH(:)      = XUNDEF
+    TPSTATION%XLE(:)     = XUNDEF
+    TPSTATION%XLEI(:)    = XUNDEF
+    TPSTATION%XGFLUX(:)  = XUNDEF
+    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
+  END IF
+
+END SUBROUTINE STATION_ALLOCATE
+
+! ########################################
+SUBROUTINE STATION_INI_INTERP( TPSTATION )
+! ########################################
+
+  USE MODD_GRID,         ONLY: XLATORI, XLONORI
+  USE MODD_PARAMETERS,   ONLY: XUNDEF
+
+  USE MODE_GRIDPROJ,     ONLY: SM_XYHAT
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
+
+  IF ( TPSTATION%XLAT == XUNDEF .OR. TPSTATION%XLON == XUNDEF ) THEN
+    CMNHMSG(1) = 'Error in station 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', 'STATION_INI_INTERP' )
+  END IF
+
+  CALL SM_XYHAT( XLATORI,        XLONORI,        &
+                 TPSTATION%XLAT, TPSTATION%XLON, &
+                 TPSTATION%XX,   TPSTATION%XY    )
+
+END SUBROUTINE STATION_INI_INTERP
+
+! ###############################################################################################
+SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                 &
+                             PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
+                             OINSIDE, OPRESENT                                                  )
+! ###############################################################################################
 ! Subroutine to determine the position of a station on the model grid
-! and set the useful coefficient for data interpolation
+! and set the useful coefficients for data interpolation
 
-  USE MODD_CONF,         ONLY: L1D
-  USE MODD_GRID_n,       ONLY: XXHAT, XYHAT
-  USE MODD_TYPE_STATION, ONLY: TSTATIONDATA
+  USE MODD_CONF,           ONLY: L1D
+  USE MODD_GRID_n,         ONLY: XXHAT, XYHAT, XZZ
+  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 
-  USE MODE_TOOLS_ll,     ONLY: GET_INDICE_ll, LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll
+  USE MODE_MSG
+  USE MODE_NEST_LL,        ONLY: GET_MODEL_NUMBER_ll
+  USE MODE_TOOLS_ll,       ONLY: GET_INDICE_ll
 
   IMPLICIT NONE
 
   TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
+  REAL, DIMENSION(:), INTENT(IN)    :: PXHAT_GLOB
+  REAL, DIMENSION(:), INTENT(IN)    :: PYHAT_GLOB
+  REAL, DIMENSION(:), INTENT(IN)    :: PXHATM ! mass point coordinates
+  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! mass point coordinates
+  REAL,               INTENT(IN)    :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
+  REAL,               INTENT(IN)    :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
+  LOGICAL,            INTENT(OUT)   :: OINSIDE  ! True if station is inside physical domain of model
+  LOGICAL,            INTENT(OUT)   :: OPRESENT ! True if station is present on the current process
 
   INTEGER :: IIB ! domain sizes of current process
   INTEGER :: IJB !
   INTEGER :: IIE !
   INTEGER :: IJE !
-  INTEGER :: IIU !
-  INTEGER :: IJU !
-  REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates
-  REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates
-
-  IIU = SIZE( XXHAT )
-  IJU = SIZE( XYHAT )
+  INTEGER :: IMI
+  INTEGER :: JK
+  REAL    :: ZLOW, ZHIGH
 
-  CALL GET_INDICE_ll (IIB, IJB, IIE, IJE )
+  OPRESENT = .FALSE.
+  OINSIDE  = .FALSE.
 
-  ! Interpolations of model variables to mass points
-  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
-  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
+  CALL GET_INDICE_ll( IIB, IJB, IIE, IJE )
 
-  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
-  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
-
-  TPSTATION%LPRESENT = .FALSE.
+  IF (       TPSTATION%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) &
+       .AND. TPSTATION%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN
+    OINSIDE = .TRUE.
+  ELSE
+    CALL GET_MODEL_NUMBER_ll(IMI)
+    WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATION%CNAME), IMI
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' )
+ END IF
 
   ! X position
   TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX )
-  TPSTATION%NI_M = COUNT( ZXHATM(:) <= TPSTATION%XX )
-
-  IF ( TPSTATION%NI_M<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
-  IF ( TPSTATION%NI_M>=IIE   .AND. LEAST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
+  TPSTATION%NI_M = COUNT( PXHATM(:) <= TPSTATION%XX )
 
   ! Y position
   TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY )
-  TPSTATION%NJ_M = COUNT( ZYHATM(:) <= TPSTATION%XY )
+  TPSTATION%NJ_M = COUNT( PYHATM(:) <= TPSTATION%XY )
 
-  IF ( TPSTATION%NJ_M<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
-  IF ( TPSTATION%NJ_M>=IJE   .AND. LNORTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE.
-
-  ! Position of station according to processes
+  ! Position of station according to process
   IF (       TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE &
-       .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) TPSTATION%LPRESENT = .TRUE.
-  IF ( L1D ) TPSTATION%LPRESENT = .TRUE.
+       .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) OPRESENT = .TRUE.
+  IF ( L1D ) OPRESENT = .TRUE.
+
+  ! Check if station is too near of physical domain border (outside of physical domain for mass points)
+  IF ( OINSIDE .AND. .NOT. L1D ) THEN
+    IF (      TPSTATION%XX < PXHATM_PHYS_MIN .OR. TPSTATION%XX > PXHATM_PHYS_MAX &
+         .OR. TPSTATION%XY < PYHATM_PHYS_MIN .OR. TPSTATION%XY > PYHATM_PHYS_MAX ) THEN
+      CALL GET_MODEL_NUMBER_ll(IMI)
+      WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of mass-points physical domain of model', I3 )" ) &
+             TRIM(TPSTATION%CNAME), IMI
+      CMNHMSG(2) = 'but is inside of flux-points physical domain.'
+      CMNHMSG(3) = 'Meaning: station is too close to the boundaries of physical domain.'
+      CMNHMSG(4) = '=> station disabled (not computed)'
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' )
+      OPRESENT = .FALSE.
+      OINSIDE = .FALSE.
+    END IF
+  END IF
 
   ! Computations only on correct process
-  IF ( TPSTATION%LPRESENT .AND. .NOT. L1D ) THEN
+  IF ( OPRESENT .AND. .NOT. L1D ) THEN
     ! Interpolation coefficient for X (mass-point)
-    TPSTATION%XXMCOEF = ( TPSTATION%XX - ZXHATM(TPSTATION%NI_M) ) / ( ZXHATM(TPSTATION%NI_M+1) - ZXHATM(TPSTATION%NI_M) )
+    TPSTATION%XXMCOEF = ( TPSTATION%XX - PXHATM(TPSTATION%NI_M) ) / ( PXHATM(TPSTATION%NI_M+1) - PXHATM(TPSTATION%NI_M) )
     ! Interpolation coefficient for Y (mass-point)
-    TPSTATION%XYMCOEF = ( TPSTATION%XY - ZYHATM(TPSTATION%NJ_M) ) / ( ZYHATM(TPSTATION%NJ_M+1) - ZYHATM(TPSTATION%NJ_M) )
+    TPSTATION%XYMCOEF = ( TPSTATION%XY - PYHATM(TPSTATION%NJ_M) ) / ( PYHATM(TPSTATION%NJ_M+1) - PYHATM(TPSTATION%NJ_M) )
     ! Interpolation coefficient for X (U-point)
     TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) )  / ( XXHAT(TPSTATION%NI_U+1)  - XXHAT(TPSTATION%NI_U) )
     ! Interpolation coefficient for Y (V-point)
     TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) )  / ( XYHAT(TPSTATION%NJ_V+1)  - XYHAT(TPSTATION%NJ_V) )
   END IF
 
+  IF ( OPRESENT ) THEN
+    ! The closest K-level to the station altitude is chosen
+    JK = JPVEXT + 1
+    DO WHILE ( ( STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) ) < TPSTATION%XZ)
+      JK = JK + 1
+    END DO
+    ZLOW  = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK-1) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) )
+    ZHIGH = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK  ) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) )
+    !If the station is nearer from the lower level, select it
+    IF ( ( ZHIGH - TPSTATION%XZ ) > ( TPSTATION%XZ - ZLOW ) ) JK = JK - 1
+    TPSTATION%NK = JK
+  END IF
+
 END SUBROUTINE STATION_POSITION
 
+! #################################
+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
+
+  TYPE(TSTATIONDATA), 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
+  TZSTATIONS(NUMBSTAT_LOC) = TPSTATION
+  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 STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB )
+! ######################################################
+  USE MODD_CONF, ONLY: L1D
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  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 = TPSTATION%NI_M
+    JJ = TPSTATION%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI,JJ)    + &
+         (   TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ)  + &
+         (1.-TPSTATION%XXMCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI,JJ+1)  + &
+         (   TPSTATION%XXMCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI+1,JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D', 'value can not be interpolated' )
+  END IF
+
+END FUNCTION STATION_INTERP_2D
+
+! ########################################################
+FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB )
+! ########################################################
+  USE MODD_CONF, ONLY: L1D
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  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 = TPSTATION%NI_U
+    JJ = TPSTATION%NJ_M
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATION%XXUCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI,JJ)    + &
+         (   TPSTATION%XXUCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ)  + &
+         (1.-TPSTATION%XXUCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI,JJ+1)  + &
+         (   TPSTATION%XXUCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI+1,JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D_U', 'value can not be interpolated' )
+  END IF
+
+END FUNCTION STATION_INTERP_2D_U
+
+! ########################################################
+FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB )
+! ########################################################
+  USE MODD_CONF, ONLY: L1D
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  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 = TPSTATION%NI_M
+    JJ = TPSTATION%NJ_V
+  END IF
+
+  IF (       JI >= 1 .AND. JI < SIZE( PA, 1 ) &
+       .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN
+    PB = (1.-TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYVCOEF) * PA(JI,JJ)    + &
+         (   TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYVCOEF) * PA(JI+1,JJ)  + &
+         (1.-TPSTATION%XXMCOEF) *  (   TPSTATION%XYVCOEF) * PA(JI,JJ+1)  + &
+         (   TPSTATION%XXMCOEF) *  (   TPSTATION%XYVCOEF) * PA(JI+1,JJ+1)
+  ELSE
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D_V', 'value can not be interpolated' )
+  END IF
+
+END FUNCTION STATION_INTERP_2D_V
+
 END MODULE MODE_STATION_TOOLS
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index dcb38f6d3..0343d9da3 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -75,33 +75,29 @@ END MODULE MODI_STATION_n
 !  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
+!  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  07/04/2022: rewrite types for stations
+!  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, XUNDEF
 USE MODD_PARAM_n,       ONLY: CRAD
 USE MODD_STATION_n
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
-USE MODD_TIME,          ONLY: tdtexp
 USE MODD_TIME_n,        ONLY: tdtcur
 !
-USE MODE_ll
-!
-USE MODI_WATER_SUM
-!
+USE MODE_STATION_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
 !
 !
 IMPLICIT NONE
@@ -129,21 +125,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
 !
@@ -151,33 +132,8 @@ 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 :: 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
 !
 !----------------------------------------------------------------------------
 !
@@ -189,260 +145,73 @@ IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_T
 TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP
 !
 IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 1.E-10 ) THEN
-     GSTORE = .TRUE.
-     TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP
-     TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1
-     IN = TSTATIONS_TIME%N_CUR
-ELSE
-     GSTORE = .FALSE.
-END IF
-!
-IF (GSTORE) THEN
-#if 0
-  tstations_time%tpdates(in)%date%year  = tdtexp%date%year
-  tstations_time%tpdates(in)%date%month = tdtexp%date%month
-  tstations_time%tpdates(in)%date%day   = tdtexp%date%day
-  tstations_time%tpdates(in)%xtime      = tdtexp%xtime + ( in - 1 ) * tstation%step
-#else
+  TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP
+  TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1
+  IN = TSTATIONS_TIME%N_CUR
   tstations_time%tpdates(in) = tdtcur
-#endif
+ELSE
+  !No station storage at this time step
+  RETURN
 END IF
 !
-!
 !----------------------------------------------------------------------------
 !
 !*      8.   DATA RECORDING
 !            --------------
 !
-IF (GSTORE) THEN
-  DO I=1,NUMBSTAT
-     !
-     IF ( TSTATIONS(I)%LPRESENT .AND. .NOT. TSTATIONS(I)%LERROR ) THEN
-       IF (TSTATIONS(I)%NK/= XUNDEF) THEN
-         J = TSTATIONS(I)%NK
-       ELSE  ! suppose TSTATIONS(I)%XZ /= XUNDEF
-        J=1
-        DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) &
-        < TSTATIONS(I)%XZ)
-         J = J + 1
-        END DO
-        IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATIONS(I)%XZ)>&
-       (TSTATIONS(I)%XZ-(STATION_INTERP_2D(PZ(:,:,J-1))-STATION_INTERP_2D(PZ(:,:,2))))) THEN
-         J=J-1
-        ENDIF
-       END IF
-      !
-      IF (LCARTESIAN) THEN
-        TSTATIONS(I)%XZON (IN)   =   STATION_INTERP_2D_U(PU(:,:,J))
-        TSTATIONS(I)%XMER (IN)   =   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 * (TSTATIONS(I)%XLON - XLON0) - XBETA)*(XPI/180.)
-        TSTATIONS(I)%XZON (IN)   =   ZU_STAT     * COS(ZGAM) + ZV_STAT     * SIN(ZGAM)
-        TSTATIONS(I)%XMER (IN)   = - ZU_STAT     * SIN(ZGAM) + ZV_STAT     * COS(ZGAM)
-      ENDIF
-        TSTATIONS(I)%XW   (IN)   = STATION_INTERP_2D(PW(:,:,J))
-        TSTATIONS(I)%XTH  (IN)   = STATION_INTERP_2D(PTH(:,:,J))
-        TSTATIONS(I)%XP   (IN)   = STATION_INTERP_2D(PP(:,:,J))
-      !
-        DO JSV=1,SIZE(PR,4)
-         TSTATIONS(I)%XR   (IN,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV))
-        END DO
-      !
-        DO JSV=1,SIZE(PSV,4)
-         TSTATIONS(I)%XSV  (IN,JSV) = STATION_INTERP_2D(PSV(:,:,J,JSV))
-        END DO
-      !
-        IF (SIZE(PTKE)>0) TSTATIONS(I)%XTKE  (IN) = STATION_INTERP_2D(PTKE(:,:,J))
-        IF (SIZE(PTS) >0) TSTATIONS(I)%XTSRAD(IN) = STATION_INTERP_2D(PTS)
-        TSTATIONS(I)%XZS      = STATION_INTERP_2D(PZ(:,:,1+JPVEXT))
-      !
-        IF (LDIAG_SURFRAD) THEN
-          TSTATIONS(I)%XZON10M(IN) = STATION_INTERP_2D(XCURRENT_ZON10M)
-          TSTATIONS(I)%XMER10M(IN) = STATION_INTERP_2D(XCURRENT_MER10M)
-          TSTATIONS(I)%XT2M   (IN) = STATION_INTERP_2D(XCURRENT_T2M   )
-          TSTATIONS(I)%XQ2M   (IN) = STATION_INTERP_2D(XCURRENT_Q2M   )
-          TSTATIONS(I)%XHU2M  (IN) = STATION_INTERP_2D(XCURRENT_HU2M  )
-          TSTATIONS(I)%XRN    (IN) = STATION_INTERP_2D(XCURRENT_RN    )
-          TSTATIONS(I)%XH     (IN) = STATION_INTERP_2D(XCURRENT_H     )
-          TSTATIONS(I)%XLE    (IN) = STATION_INTERP_2D(XCURRENT_LE    )
-          TSTATIONS(I)%XLEI   (IN) = STATION_INTERP_2D(XCURRENT_LEI   )
-          TSTATIONS(I)%XGFLUX (IN) = STATION_INTERP_2D(XCURRENT_GFLUX )
-         IF (CRAD /= 'NONE') THEN
-          TSTATIONS(I)%XSWD   (IN) = STATION_INTERP_2D(XCURRENT_SWD   )
-          TSTATIONS(I)%XSWU   (IN) = STATION_INTERP_2D(XCURRENT_SWU   )
-          TSTATIONS(I)%XLWD   (IN) = STATION_INTERP_2D(XCURRENT_LWD   )
-          TSTATIONS(I)%XLWU   (IN) = STATION_INTERP_2D(XCURRENT_LWU   )
-          TSTATIONS(I)%XSWDIR (IN) = STATION_INTERP_2D(XCURRENT_SWDIR )
-          TSTATIONS(I)%XSWDIFF(IN) = STATION_INTERP_2D(XCURRENT_SWDIFF)
-          TSTATIONS(I)%XDSTAOD(IN) = STATION_INTERP_2D(XCURRENT_DSTAOD)
-         ENDIF
-          TSTATIONS(I)%XSFCO2 (IN) = STATION_INTERP_2D(XCURRENT_SFCO2 )
-        ENDIF
+STATION: DO JS = 1,NUMBSTAT_LOC
+  JK = TSTATIONS(JS)%NK
+
+  IF (LCARTESIAN) THEN
+    TSTATIONS(JS)%XZON(IN) =   STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
+    TSTATIONS(JS)%XMER(IN) =   STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) )
+  ELSE
+    ZU_STAT                = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
+    ZV_STAT                = STATION_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) = STATION_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) )
+  TSTATIONS(JS)%XTH(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) )
+  TSTATIONS(JS)%XP (IN) = STATION_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) )
 
-      !
-    END IF
-!
-!----------------------------------------------------------------------------
-!
-!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
-!            ------------------------------------------
-!
-!*     11.2  data stored
-!            -----------
-!
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XX   )
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XY   )
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZ   )
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLON )
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLAT )
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON (IN))
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER (IN))
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XW   (IN))
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XP   (IN))
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTH  (IN))
   DO JSV=1,SIZE(PR,4)
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XR   (IN,JSV))
+    TSTATIONS(JS)%XR(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) )
   END DO
+
   DO JSV=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSV  (IN,JSV))
+    TSTATIONS(JS)%XSV(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) )
   END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTKE  (IN))
-  IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTSRAD(IN))
-  CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZS )
-  IF (LDIAG_SURFRAD) THEN
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XT2M    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XQ2M    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XHU2M   (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON10M (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER10M (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XRN     (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XH      (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLE     (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLEI    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XGFLUX  (IN))
-   IF (CRAD /= 'NONE') THEN
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWD    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWU    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWD    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWU    (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIR  (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIFF (IN))
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XDSTAOD (IN))
-   END IF
-    CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSFCO2  (IN))
-  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=TSTATIONS(I)%NI_M
-     JJ=TSTATIONS(I)%NJ_M
-END IF
-!
-!
-IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
-    (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
-PB = (1.-TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) *  PA(JI,JJ)    + &
-     (1.-TSTATIONS(I)%XYMCOEF) *    (TSTATIONS(I)%XXMCOEF) *  PA(JI+1,JJ)  + &
-     (   TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) *  PA(JI,JJ+1)  + &
-     (   TSTATIONS(I)%XYMCOEF) *    (TSTATIONS(I)%XXMCOEF) *  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=TSTATIONS(I)%NI_M
-     JJ=TSTATIONS(I)%NJ_M
-END IF
-!
-IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. &
-    (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) &
-PB = (1.- TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI  ,JJ  ) &
-   + (1.- TSTATIONS(I)%XYMCOEF) * (   TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ  ) &
-   + (    TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI  ,JJ+1) &
-   + (    TSTATIONS(I)%XYMCOEF) * (   TSTATIONS(I)%XXUCOEF) * 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=TSTATIONS(I)%NI_M
-  JJ=TSTATIONS(I)%NJ_M
-END IF
-!
-IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. &
-    (JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) &
-PB = (1.- TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI  ,JJ  ) &
-   + (1.- TSTATIONS(I)%XYVCOEF) * (   TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ  ) &
-   + (    TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI  ,JJ+1) &
-   + (    TSTATIONS(I)%XYVCOEF) * (   TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1)
-!
-END FUNCTION STATION_INTERP_2D_V
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-SUBROUTINE DISTRIBUTE_STATION(PAS)
-!
-REAL, INTENT(INOUT) :: PAS
-!
-INTEGER :: IINFO_ll   ! return code
+  IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) )
+  IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTS )
+  TSTATIONS(JS)%XZS  = STATION_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT))
 
-IF ( .NOT. TSTATIONS(I)%LPRESENT ) PAS = 0.
-CALL REDUCESUM_ll(PAS,IINFO_ll)
+  IF ( LDIAG_SURFRAD ) THEN
+    TSTATIONS(JS)%XZON10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M )
+    TSTATIONS(JS)%XMER10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M )
+    TSTATIONS(JS)%XT2M   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M    )
+    TSTATIONS(JS)%XQ2M   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M    )
+    TSTATIONS(JS)%XHU2M  (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M   )
+    TSTATIONS(JS)%XRN    (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_RN     )
+    TSTATIONS(JS)%XH     (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_H      )
+    TSTATIONS(JS)%XLE    (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LE     )
+    TSTATIONS(JS)%XLEI   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI    )
+    TSTATIONS(JS)%XGFLUX (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX  )
+    IF ( CRAD /= 'NONE' ) THEN
+      TSTATIONS(JS)%XSWD   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD    )
+      TSTATIONS(JS)%XSWU   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU    )
+      TSTATIONS(JS)%XLWD   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD    )
+      TSTATIONS(JS)%XLWU   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU    )
+      TSTATIONS(JS)%XSWDIR (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR  )
+      TSTATIONS(JS)%XSWDIFF(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF )
+      TSTATIONS(JS)%XDSTAOD(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD )
+    END IF
+    TSTATIONS(JS)%XSFCO2(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 )
+  END IF
+END DO STATION
 !
-END SUBROUTINE DISTRIBUTE_STATION
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE STATION_n
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 0746c64d2..9f65f84e1 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -61,7 +61,7 @@ END MODULE MODI_WRITE_STATION_n
 !  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 07/04/2022: rewrite types for stations
+!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
 ! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -70,17 +70,22 @@ END MODULE MODI_WRITE_STATION_n
 USE MODD_ALLSTATION_n,    ONLY: LDIAG_SURFRAD
 use MODD_BUDGET,          ONLY: tbudiachrometadata
 USE MODD_CONF,            ONLY: LCARTESIAN
+USE MODD_CONF_n,          ONLY: NRR
 USE MODD_CST,             ONLY: XRV
-USE MODD_IO,              ONLY: TFILEDATA
+USE MODD_IO,              ONLY: ISNPROC, ISP, TFILEDATA
+USE MODD_MPIF
 USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
                                 nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend
-USE MODD_PARAM_n,         ONLY: CRAD, CSURF
+USE MODD_PARAM_n,         ONLY: CRAD, CSURF, CTURB
 USE MODD_PARAMETERS,      ONLY: XUNDEF
-USE MODD_STATION_n,       only: NUMBSTAT, TSTATIONS
+USE MODD_PRECISION,       ONLY: MNHINT_MPI, MNHREAL_MPI
+USE MODD_STATION_n,       only: NUMBSTAT_LOC, TSTATIONS, tstations_time
+USE MODD_TYPE_STATION,    ONLY: TSTATIONDATA
 !
 USE MODE_AERO_PSD
 USE MODE_DUST_PSD
 USE MODE_SALT_PSD
+USE MODE_STATION_TOOLS,   ONLY: STATION_ALLOCATE
 use MODE_WRITE_DIACHRO,   ONLY: Write_diachro
 !
 IMPLICIT NONE
@@ -94,13 +99,199 @@ TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE ! diachronic file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER     ::  II  ! loop
+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
 !
 !----------------------------------------------------------------------------
-!
-DO II = 1, NUMBSTAT
-  CALL STATION_DIACHRO_n( TSTATIONS(II) )
-ENDDO
+
+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
+
+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
+
+      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
+    END IF
+  END IF
+
+  CALL STATION_DIACHRO_n( TZSTATION )
+
+END DO STATION
 !
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
@@ -145,13 +336,10 @@ type(tbudiachrometadata)                             :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
-IF (TPSTATION%XX==XUNDEF) RETURN
-IF (TPSTATION%XY==XUNDEF) RETURN
 !
 IPROC = 8 + SIZE(TPSTATION%XR,2) + SIZE(TPSTATION%XSV,2)
 
-IF (TPSTATION%XX==XUNDEF) IPROC = IPROC + 2
-IF (SIZE(TPSTATION%XTKE  )>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
@@ -159,8 +347,8 @@ 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(TPSTATION%XTSRAD(:)/=XUNDEF))  IPROC = IPROC + 1
-IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF))  IPROC = IPROC + 1
+IF ( CRAD /= 'NONE' )  IPROC = IPROC + 1
+IPROC = IPROC + 1 ! XSFCO2 term
 !
 ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%tpdates),1,IPROC))
 ALLOCATE (YCOMMENT(IPROC))
@@ -390,7 +578,7 @@ DO JRR=1,SIZE(TPSTATION%XR,2)
   END IF
 END DO
 !
-IF (SIZE(TPSTATION%XTKE,1)>0) THEN
+IF ( CTURB == 'TKEL' ) THEN
   JPROC = JPROC+1
   YTITLE   (JPROC) = 'Tke'
   YUNIT    (JPROC) = 'm2 s-2'
@@ -642,7 +830,7 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN
   END IF
 END IF
 
-IF (ANY(TPSTATION%XTSRAD(:)/=XUNDEF)) THEN
+IF ( CRAD /= 'NONE' ) THEN
   JPROC = JPROC+1
   YTITLE   (JPROC) = 'Tsrad'
   YUNIT    (JPROC) = 'K'
@@ -650,13 +838,13 @@ IF (ANY(TPSTATION%XTSRAD(:)/=XUNDEF)) THEN
   ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:)
 END IF
 !
-IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF)) THEN
+! IF (ANY(TPSTATION%XSFCO2(:)/=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) = TPSTATION%XSFCO2(:)
-END IF
+! END IF
 !
 !----------------------------------------------------------------------------
 !
@@ -739,7 +927,5 @@ DEALLOCATE (YUNIT   )
 DEALLOCATE (IGRID   )
 !----------------------------------------------------------------------------
 END SUBROUTINE STATION_DIACHRO_n
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
 !
 END SUBROUTINE WRITE_STATION_n
-- 
GitLab


From c9181a12ef83f5ce833a6269ead495707a397fa6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 20 Apr 2022 15:32:01 +0200
Subject: [PATCH 056/157] Philippe 20/04/2022: stations: use parameters for
 character strings

---
 src/MNH/modd_allstationn.f90  | 10 +++++-----
 src/MNH/modd_parameters.f90   |  5 ++++-
 src/MNH/modd_type_station.f90 |  4 ++--
 src/MNH/modn_stationn.f90     | 13 ++++++++-----
 src/MNH/write_stationn.f90    | 18 ++++++++++--------
 5 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90
index 4229177e4..809e28845 100644
--- a/src/MNH/modd_allstationn.f90
+++ b/src/MNH/modd_allstationn.f90
@@ -36,7 +36,7 @@
 !             ------------
 !
 !
-USE MODD_PARAMETERS, ONLY: JPMODELMAX
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATIONNAMELGTMAX
 
 IMPLICIT NONE
 
@@ -54,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
-  CHARACTER(LEN=20)                :: CFILE_STAT
+  CHARACTER(LEN=NSTATIONNAMELGTMAX), DIMENSION(100) :: CNAME_STAT
+  CHARACTER(LEN=NFILENAMELGTMAX)   :: CFILE_STAT
   REAL                             :: XSTEP_STAT
   LOGICAL                          :: LDIAG_SURFRAD
   !
@@ -71,8 +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=20),POINTER                   :: CFILE_STAT=>NULL()
+CHARACTER (LEN=NSTATIONNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL()
+CHARACTER (LEN=NFILENAMELGTMAX),POINTER      :: CFILE_STAT=>NULL()
 LOGICAL, POINTER                             :: LDIAG_SURFRAD=>NULL()
 CONTAINS
 
diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index f4849d401..929cec5b6 100644
--- a/src/MNH/modd_parameters.f90
+++ b/src/MNH/modd_parameters.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.
@@ -44,6 +44,7 @@
 !  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 NSTATIONNAMELGTMAX parameter
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -86,6 +87,8 @@ INTEGER, PARAMETER :: NSTDNAMELGTMAX  = 64  ! Maximum length of the standard nam
 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 :: NSTATIONNAMELGTMAX = 8 ! Maximum length for the name of a station
+
 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_type_station.f90 b/src/MNH/modd_type_station.f90
index 8d34883fa..55c63959c 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.f90
@@ -37,7 +37,7 @@
 !             ------------
 !
 use modd_type_date,  only: date_time
-use modd_parameters, only: NNEGUNDEF, XUNDEF
+use modd_parameters, only: NNEGUNDEF, NSTATIONNAMELGTMAX, XUNDEF
 
 implicit none
 
@@ -55,7 +55,7 @@ END TYPE TSTATIONTIME
 TYPE TSTATIONDATA
 ! Type to store all the data of 1 station
 
-CHARACTER(LEN=8) :: CNAME = ''  ! station name
+CHARACTER(LEN=NSTATIONNAMELGTMAX) :: CNAME = ''  ! station name
 
 INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model)
 
diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90
index ab6013ee2..0bc56e63f 100644
--- a/src/MNH/modn_stationn.f90
+++ b/src/MNH/modn_stationn.f90
@@ -25,7 +25,6 @@
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
-USE MODD_STATION_n
 USE MODD_ALLSTATION_n, ONLY:&
         NNUMB_STAT_n    =>NNUMB_STAT    ,&
         XSTEP_STAT_n    =>XSTEP_STAT    ,&
@@ -36,18 +35,22 @@ USE MODD_ALLSTATION_n, ONLY:&
         XZ_STAT_n       =>XZ_STAT       ,&
         CNAME_STAT_n    =>CNAME_STAT    ,&
         CFILE_STAT_n    =>CFILE_STAT    ,&
-        LDIAG_SURFRAD_n =>LDIAG_SURFRAD 
-!!
+        LDIAG_SURFRAD_n =>LDIAG_SURFRAD
+USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATIONNAMELGTMAX
+USE MODD_STATION_n
+!
 !-----------------------------------------------------------------------------
 !
 !*       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
-CHARACTER (LEN=20)               ,SAVE:: CFILE_STAT              !filename
+CHARACTER (LEN=NSTATIONNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT
+CHARACTER (LEN=NFILENAMELGTMAX),                   SAVE:: CFILE_STAT              !filename
 LOGICAL                          ,SAVE:: LDIAG_SURFRAD
 
 NAMELIST /NAM_STATIONn/  &
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 9f65f84e1..754f9d41a 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -82,11 +82,7 @@ USE MODD_PRECISION,       ONLY: MNHINT_MPI, MNHREAL_MPI
 USE MODD_STATION_n,       only: NUMBSTAT_LOC, TSTATIONS, tstations_time
 USE MODD_TYPE_STATION,    ONLY: TSTATIONDATA
 !
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-USE MODE_SALT_PSD
 USE MODE_STATION_TOOLS,   ONLY: STATION_ALLOCATE
-use MODE_WRITE_DIACHRO,   ONLY: Write_diachro
 !
 IMPLICIT NONE
 !
@@ -307,9 +303,15 @@ SUBROUTINE STATION_DIACHRO_n( TPSTATION )
 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, &
                        tfieldmetadata_base, TYPEREAL
+use modd_parameters,   only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NSTATIONNAMELGTMAX, NUNITLGTMAX
 use modd_station_n,    only: tstations_time
 use modd_type_station, only: tstationdata
 
+USE MODE_AERO_PSD
+USE MODE_DUST_PSD
+USE MODE_SALT_PSD
+use MODE_WRITE_DIACHRO,   ONLY: Write_diachro
+
 TYPE(TSTATIONDATA),   INTENT(IN)       :: TPSTATION
 !
 !*      0.2  declaration of local variables for diachro
@@ -321,10 +323,10 @@ 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=NSTATIONNAMELGTMAX)             :: YGROUP   ! group title
+CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YTITLE   ! title
+CHARACTER(LEN=NUNITLGTMAX),    DIMENSION(:), ALLOCATABLE :: YUNIT    ! physical unit
 !
 !!! do not forget to increment the IPROC value if you add diagnostic !!!
 INTEGER :: IPROC    ! number of variables records
-- 
GitLab


From a1dc9a9520a06446a61e2ed4836904e3f8f6bbb3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 20 Apr 2022 16:36:43 +0200
Subject: [PATCH 057/157] Philippe 20/04/2022: stations: transform modi->mode
 for write_station_n

---
 src/MNH/modeln.f90         |  4 ++--
 src/MNH/write_stationn.f90 | 26 +++++++++++---------------
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 6ba8d8398..61c50c483 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-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.
@@ -383,6 +383,7 @@ USE MODE_ONE_WAY_n
 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
@@ -450,7 +451,6 @@ 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
 !
 IMPLICIT NONE
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 754f9d41a..8ff4c2fc2 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -4,22 +4,16 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ###########################
-MODULE MODI_WRITE_STATION_n
+MODULE MODE_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
+
+implicit none
+
+private
+
+public :: WRITE_STATION_n
+
+contains
 !
 !     ##########################################
       SUBROUTINE WRITE_STATION_n(TPDIAFILE)
@@ -931,3 +925,5 @@ DEALLOCATE (IGRID   )
 END SUBROUTINE STATION_DIACHRO_n
 !
 END SUBROUTINE WRITE_STATION_n
+
+END MODULE MODE_WRITE_STATION_n
-- 
GitLab


From 195d355e577232a6772ffe9e73fccce39c129ebd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 21 Apr 2022 15:48:08 +0200
Subject: [PATCH 058/157] Philippe 21/04/2022: write_stationn: improve writing
 code (now similar to write_profilern)

---
 src/MNH/write_stationn.f90 | 740 ++++++++++++++-----------------------
 1 file changed, 280 insertions(+), 460 deletions(-)

diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 8ff4c2fc2..23d6b40e7 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -7,17 +7,25 @@
 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)
-!     ##########################################
+! #####################################
+SUBROUTINE WRITE_STATION_n( TPDIAFILE )
+! #####################################
 !
 !
 !!****  *WRITE_STATION* - write the balloon and aircraft trajectories and records
@@ -62,16 +70,11 @@ contains
 !          ------------
 !
 USE MODD_ALLSTATION_n,    ONLY: LDIAG_SURFRAD
-use MODD_BUDGET,          ONLY: tbudiachrometadata
-USE MODD_CONF,            ONLY: LCARTESIAN
 USE MODD_CONF_n,          ONLY: NRR
-USE MODD_CST,             ONLY: XRV
 USE MODD_IO,              ONLY: ISNPROC, ISP, TFILEDATA
 USE MODD_MPIF
-USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
-                                nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend
+USE MODD_NSV,             ONLY: nsv
 USE MODD_PARAM_n,         ONLY: CRAD, CSURF, CTURB
-USE MODD_PARAMETERS,      ONLY: XUNDEF
 USE MODD_PRECISION,       ONLY: MNHINT_MPI, MNHREAL_MPI
 USE MODD_STATION_n,       only: NUMBSTAT_LOC, TSTATIONS, tstations_time
 USE MODD_TYPE_STATION,    ONLY: TSTATIONDATA
@@ -151,7 +154,7 @@ IF ( ISNPROC > 1 ) THEN
   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 ( LDIAG_SURFRAD ) THEN
     IF ( CSURF == 'EXTE' ) IPACKSIZE = IPACKSIZE + ISTORE * 10
     IF ( CRAD /= 'NONE' )  IPACKSIZE = IPACKSIZE + ISTORE * 7
     IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term
@@ -194,7 +197,7 @@ STATION: DO JS = 1, INUMSTAT
       IF ( CRAD /= 'NONE' ) THEN
         ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTSRAD(:); IPOS = IPOS + ISTORE
       END IF
-      IF (LDIAG_SURFRAD) THEN
+      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
@@ -252,7 +255,7 @@ STATION: DO JS = 1, INUMSTAT
       IF ( CRAD /= 'NONE' ) THEN
         TZSTATION%XTSRAD(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
       END IF
-      IF (LDIAG_SURFRAD) THEN
+      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
@@ -279,25 +282,28 @@ STATION: DO JS = 1, INUMSTAT
     END IF
   END IF
 
-  CALL STATION_DIACHRO_n( TZSTATION )
+  CALL STATION_DIACHRO_n( TPDIAFILE, TZSTATION )
 
 END DO STATION
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-!----------------------------------------------------------------------------
-SUBROUTINE STATION_DIACHRO_n( TPSTATION )
 
-use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK
+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_parameters,   only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NSTATIONNAMELGTMAX, NUNITLGTMAX
+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_station, only: tstationdata
 
@@ -306,25 +312,23 @@ USE MODE_DUST_PSD
 USE MODE_SALT_PSD
 use MODE_WRITE_DIACHRO,   ONLY: Write_diachro
 
-TYPE(TSTATIONDATA),   INTENT(IN)       :: TPSTATION
+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=NSTATIONNAMELGTMAX)             :: YGROUP   ! group title
-CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string
-CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YTITLE   ! title
-CHARACTER(LEN=NUNITLGTMAX),    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
@@ -339,271 +343,106 @@ 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 ( CRAD /= 'NONE' )  IPROC = IPROC + 1
-IPROC = IPROC + 1 ! XSFCO2 term
 !
-ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%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 = TPSTATION%CNAME
 JPROC = 0
 !
 !----------------------------------------------------------------------------
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZS'
-YUNIT    (JPROC) = 'm'
-YCOMMENT (JPROC) = 'Orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZS
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'P'
-YUNIT    (JPROC) = 'Pa'
-YCOMMENT (JPROC) = 'Pressure'
-ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XP(:)
-!
-!JPROC = JPROC + 1
-!YTITLE   (JPROC) = 'Z'
-!YUNIT    (JPROC) = 'm'
-!YCOMMENT (JPROC) = 'Z Pos'
-!ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZ
-!
-IF (LCARTESIAN) THEN
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'X'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'X Pos'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XX
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'Y'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'Y Pos'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XY
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'U'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Axial velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'V'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Transversal velocity'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:)
-ELSE
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LON'
-  YUNIT    (JPROC) = 'degree'
-  YCOMMENT (JPROC) = 'Longitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLON
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LAT'
-  YUNIT    (JPROC) = 'degree'
-  YCOMMENT (JPROC) = 'Latitude'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLAT
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'ZON_WIND'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Zonal wind'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'MER_WIND'
-  YUNIT    (JPROC) = 'm s-1'
-  YCOMMENT (JPROC) = 'Meridional wind'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:)
-ENDIF
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'W'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'Air vertical speed'
-ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XW(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'Th'
-YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'Potential temperature'
-ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTH(:)
-!
-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) = TPSTATION%XT2M(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'Q2m'
-    YUNIT    (JPROC) = 'kg kg-1'
-    YCOMMENT (JPROC) = '2-m humidity'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XQ2M(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'HU2m'
-    YUNIT    (JPROC) = 'percent'
-    YCOMMENT (JPROC) = '2-m relative humidity'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XHU2M(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'zon10m'
-    YUNIT    (JPROC) = 'm s-1'
-    YCOMMENT (JPROC) = '10-m zonal wind'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON10M(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'mer10m'
-    YUNIT    (JPROC) = 'm s-1'
-    YCOMMENT (JPROC) = '10-m meridian wind'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER10M(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'RN'
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Net radiation'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XRN(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'H'
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Sensible heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XH(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LE'
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Total Latent heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLE(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'G'
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Storage heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XGFLUX(:)
-    !
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'LEI'
-    YUNIT    (JPROC) = 'W m-2'
-    YCOMMENT (JPROC) = 'Solid Latent heat flux'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLEI(:)
-  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) = TPSTATION%XSWD(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWU'
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Upward short-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWU(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWD'
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWD(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWU'
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Upward long-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWU(:)
-  JPROC = JPROC + 1
-  !
-  YTITLE   (JPROC) = 'SWDIR'
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward direct short-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIR(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'SWDIFF'
-  YUNIT    (JPROC) = 'W m-2'
-  YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIFF(:)
-  !
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'DSTAOD'
-  YUNIT    (JPROC) = 'm'
-  YCOMMENT (JPROC) = 'Dust aerosol optical depth'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XDSTAOD(:)
-  !
- END IF
-ENDIF
-!
-DO JRR=1,SIZE(TPSTATION%XR,2)
-  JPROC = JPROC+1
-  YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XR(:,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 ( CTURB == 'TKEL' ) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'Turbulent kinetic energy'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTKE(:)
-END IF
-!
-IF (SIZE(TPSTATION%XSV,2)>=1) THEN
+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
-    JPROC = JPROC + 1
-    YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
-    YCOMMENT(JPROC) = ''
     IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
-      YUNIT(JPROC)  = 'ppb'
-      ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+      !*1e9 for conversion ppv->ppb
+      call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', 'ppb', TPSTATION%XSV(:,JSV) * 1.e9 )
     ELSE
-      YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
-      ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV)
+      call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', TSVLIST(JSV)%CUNITS, TPSTATION%XSV(:,JSV) )
     END IF
   END DO
 
   IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_AER))
-    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),JPMODE))
-    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),JPMODE))
-    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),JPMODE))
-    ALLOCATE (ZPTOTA(1,1,SIZE(tstations_time%tpdates),NSP+NCARB+NSOA,JPMODE))
+    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.
@@ -622,127 +461,101 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN
 
     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)
-      ! 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)
-      ! 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)
-
-      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,'(A6,I1)')'AERRGA',JSV
+      WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV
+      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,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)
-
-      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)
-
-      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)
+      ! standard deviation
+      WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV
+      WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV
+      call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,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)
+      ! particles number
+      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) )
+
+      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) )
+
+      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) )
+
+      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) )
+
+      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) )
+
+      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)
   END IF
 
   IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_DST))
-    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_DST))
-    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_DST))
-    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),NMODE_DST))
+    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.
@@ -760,33 +573,33 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN
     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)
   END IF
 
   IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_SLT))
-    ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates)))
-    ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_SLT))
-    ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT))
-    ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT))
+    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.
@@ -803,59 +616,39 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN
     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)
   END IF
-END IF
+end if
 
-IF ( CRAD /= 'NONE' ) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tsrad'
-  YUNIT    (JPROC) = 'K'
-  YCOMMENT (JPROC) = 'Radiative Surface Temperature'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:)
-END IF
-!
-! IF (ANY(TPSTATION%XSFCO2(:)/=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) = TPSTATION%XSFCO2(:)
-! 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(tstations_time%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
@@ -875,12 +668,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'
@@ -912,18 +705,45 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = 1
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstations_time%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
-- 
GitLab


From 2b51c5557df775e059bae6ed1b81a33e295e2cae Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Apr 2022 15:12:44 +0200
Subject: [PATCH 059/157] Philippe 22/04/2022: rename NSTATIONNAMELGTMAX to
 NSTATPROFNAMELGTMAX

---
 src/MNH/modd_allstationn.f90  | 6 +++---
 src/MNH/modd_parameters.f90   | 4 ++--
 src/MNH/modd_type_station.f90 | 4 ++--
 src/MNH/modn_stationn.f90     | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90
index 809e28845..4fe0a7be7 100644
--- a/src/MNH/modd_allstationn.f90
+++ b/src/MNH/modd_allstationn.f90
@@ -36,7 +36,7 @@
 !             ------------
 !
 !
-USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATIONNAMELGTMAX
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
 
 IMPLICIT NONE
 
@@ -54,7 +54,7 @@ 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=NSTATIONNAMELGTMAX), DIMENSION(100) :: CNAME_STAT
+  CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_STAT
   CHARACTER(LEN=NFILENAMELGTMAX)   :: CFILE_STAT
   REAL                             :: XSTEP_STAT
   LOGICAL                          :: LDIAG_SURFRAD
@@ -71,7 +71,7 @@ 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=NSTATIONNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL()
+CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL()
 CHARACTER (LEN=NFILENAMELGTMAX),POINTER      :: CFILE_STAT=>NULL()
 LOGICAL, POINTER                             :: LDIAG_SURFRAD=>NULL()
 CONTAINS
diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index 929cec5b6..c848073f9 100644
--- a/src/MNH/modd_parameters.f90
+++ b/src/MNH/modd_parameters.f90
@@ -44,7 +44,7 @@
 !  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 NSTATIONNAMELGTMAX parameter
+!  P. Wautelet 20/04/2022: add NSTATPROFNAMELGTMAX parameter
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -87,7 +87,7 @@ INTEGER, PARAMETER :: NSTDNAMELGTMAX  = 64  ! Maximum length of the standard nam
 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 :: NSTATIONNAMELGTMAX = 8 ! Maximum length for the name of a station
+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)
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
index 55c63959c..d8d58820a 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.f90
@@ -37,7 +37,7 @@
 !             ------------
 !
 use modd_type_date,  only: date_time
-use modd_parameters, only: NNEGUNDEF, NSTATIONNAMELGTMAX, XUNDEF
+use modd_parameters, only: NNEGUNDEF, NSTATPROFNAMELGTMAX, XUNDEF
 
 implicit none
 
@@ -54,8 +54,8 @@ END TYPE TSTATIONTIME
 
 TYPE TSTATIONDATA
 ! Type to store all the data of 1 station
+CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = ''  ! station name
 
-CHARACTER(LEN=NSTATIONNAMELGTMAX) :: CNAME = ''  ! station name
 
 INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model)
 
diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90
index 0bc56e63f..9b8737c03 100644
--- a/src/MNH/modn_stationn.f90
+++ b/src/MNH/modn_stationn.f90
@@ -36,7 +36,7 @@ USE MODD_ALLSTATION_n, ONLY:&
         CNAME_STAT_n    =>CNAME_STAT    ,&
         CFILE_STAT_n    =>CFILE_STAT    ,&
         LDIAG_SURFRAD_n =>LDIAG_SURFRAD
-USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATIONNAMELGTMAX
+USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
 USE MODD_STATION_n
 !
 !-----------------------------------------------------------------------------
@@ -49,7 +49,7 @@ 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=NSTATIONNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT
+CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT
 CHARACTER (LEN=NFILENAMELGTMAX),                   SAVE:: CFILE_STAT              !filename
 LOGICAL                          ,SAVE:: LDIAG_SURFRAD
 
-- 
GitLab


From 4cae411f28b0c54206fb36e6c034ed921e1321c7 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Apr 2022 15:38:56 +0200
Subject: [PATCH 060/157] Philippe 22/04/2022: rename TSTATIONTIME to
 TSTATPROFTIME

---
 src/MNH/modd_stationn.f90     | 6 +++---
 src/MNH/modd_type_station.f90 | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90
index 6017c0f98..f86692bf4 100644
--- a/src/MNH/modd_stationn.f90
+++ b/src/MNH/modd_stationn.f90
@@ -37,7 +37,7 @@
 !
 !
 USE MODD_PARAMETERS,   ONLY: JPMODELMAX
-USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATIONTIME
+USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATPROFTIME
 
 IMPLICIT NONE
 
@@ -55,7 +55,7 @@ TYPE STATION_t
   INTEGER                          :: NUMBSTAT    ! number of stations
   INTEGER                          :: NUMBSTAT_LOC = 0 ! number of stations on this process
 !
-  TYPE(TSTATIONTIME) :: TSTATIONS_TIME
+  TYPE(TSTATPROFTIME) :: TSTATIONS_TIME
   TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations
 !
 END TYPE STATION_t
@@ -65,7 +65,7 @@ TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL
 LOGICAL, POINTER :: LSTATION=>NULL()
 INTEGER, POINTER :: NUMBSTAT=>NULL()
 INTEGER, POINTER :: NUMBSTAT_LOC=>NULL()
-TYPE(TSTATIONTIME),               POINTER :: TSTATIONS_TIME => NULL()
+TYPE(TSTATPROFTIME),              POINTER :: TSTATIONS_TIME => NULL()
 TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS      => NULL()
 
 CONTAINS
diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90
index d8d58820a..ed408c9af 100644
--- a/src/MNH/modd_type_station.f90
+++ b/src/MNH/modd_type_station.f90
@@ -43,14 +43,14 @@ implicit none
 
 private
 
-public :: TSTATIONTIME, TSTATIONDATA
+public :: TSTATPROFTIME, TSTATIONDATA
 
-TYPE TSTATIONTIME
+TYPE :: TSTATPROFTIME
   REAL                                       :: XTIME_CUR = XUNDEF  ! current time since last storage
   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 TSTATIONTIME
+END TYPE TSTATPROFTIME
 
 TYPE TSTATIONDATA
 ! Type to store all the data of 1 station
-- 
GitLab


From 508731de97023236ee58d0fdcb76bed59ce3e01a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 27 Apr 2022 09:47:04 +0200
Subject: [PATCH 061/157] Philippe 27/04/2022: stations/profilers: rename some
 files (some code will be shared between profilers and stations)

---
 src/MNH/{modd_type_station.f90 => modd_type_statprof.f90} | 0
 src/MNH/{station_reader.f90 => statprof_reader.f90}       | 0
 src/MNH/{station_tools.f90 => statprof_tools.f90}         | 0
 3 files changed, 0 insertions(+), 0 deletions(-)
 rename src/MNH/{modd_type_station.f90 => modd_type_statprof.f90} (100%)
 rename src/MNH/{station_reader.f90 => statprof_reader.f90} (100%)
 rename src/MNH/{station_tools.f90 => statprof_tools.f90} (100%)

diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_statprof.f90
similarity index 100%
rename from src/MNH/modd_type_station.f90
rename to src/MNH/modd_type_statprof.f90
diff --git a/src/MNH/station_reader.f90 b/src/MNH/statprof_reader.f90
similarity index 100%
rename from src/MNH/station_reader.f90
rename to src/MNH/statprof_reader.f90
diff --git a/src/MNH/station_tools.f90 b/src/MNH/statprof_tools.f90
similarity index 100%
rename from src/MNH/station_tools.f90
rename to src/MNH/statprof_tools.f90
-- 
GitLab


From 92ab08e46b150a9c9c7fabe3014babefa798f509 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 27 Apr 2022 10:16:45 +0200
Subject: [PATCH 062/157] Philippe 27/04/2022: rename modules common to
 stations and profilers

---
 src/MNH/ini_surfstationn.f90   | 10 +++++-----
 src/MNH/modd_stationn.f90      |  4 ++--
 src/MNH/modd_type_statprof.f90 |  4 ++--
 src/MNH/stationn.f90           |  2 +-
 src/MNH/statprof_reader.f90    | 12 ++++++------
 src/MNH/statprof_tools.f90     | 10 +++++-----
 src/MNH/write_stationn.f90     | 34 +++++++++++++++++-----------------
 7 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index ebd004817..8811fa566 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -66,13 +66,13 @@ USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
 USE MODD_GRID_n,         ONLY: XXHAT, XYHAT
 USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_STATION_n
-USE MODD_TYPE_STATION
+USE MODD_TYPE_STATPROF
 !
 USE MODE_MSG
-USE MODE_STATION_READER
-USE MODE_STATION_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION
-USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll
-USE MODE_GATHER_ll,      ONLY: GATHERALL_FIELD_ll
+USE MODE_STATPROF_READER
+USE MODE_STATPROF_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION
+USE MODE_ALLOCBUFFER_ll,  ONLY: ALLOCBUFFER_ll
+USE MODE_GATHER_ll,       ONLY: GATHERALL_FIELD_ll
 !
 IMPLICIT NONE
 !
diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90
index f86692bf4..bd86a1595 100644
--- a/src/MNH/modd_stationn.f90
+++ b/src/MNH/modd_stationn.f90
@@ -36,8 +36,8 @@
 !             ------------
 !
 !
-USE MODD_PARAMETERS,   ONLY: JPMODELMAX
-USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATPROFTIME
+USE MODD_PARAMETERS,    ONLY: JPMODELMAX
+USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA, TSTATPROFTIME
 
 IMPLICIT NONE
 
diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90
index ed408c9af..12150549a 100644
--- a/src/MNH/modd_type_statprof.f90
+++ b/src/MNH/modd_type_statprof.f90
@@ -4,7 +4,7 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ############################
-      MODULE MODD_TYPE_STATION
+      MODULE MODD_TYPE_STATPROF
 !     ############################
 !
 !!****  *MODD_STATION* - declaration of stations
@@ -111,4 +111,4 @@ REAL, DIMENSION(:),   ALLOCATABLE :: XSFCO2  ! CO2 surface flux
 
 END TYPE TSTATIONDATA
 
-END MODULE MODD_TYPE_STATION
+END MODULE MODD_TYPE_STATPROF
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index 0343d9da3..41e95dc53 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -97,7 +97,7 @@ USE MODD_STATION_n
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
 USE MODD_TIME_n,        ONLY: tdtcur
 !
-USE MODE_STATION_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
+USE MODE_STATPROF_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
 !
 !
 IMPLICIT NONE
diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90
index 1a72bfe1a..ed645d7ab 100644
--- a/src/MNH/statprof_reader.f90
+++ b/src/MNH/statprof_reader.f90
@@ -3,9 +3,9 @@
 !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_STATION_READER
-!     #######################
+!     ############################
+       MODULE MODE_STATPROF_READER
+!     ############################
 
 IMPLICIT NONE
 
@@ -41,10 +41,10 @@ SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,
 
 USE MODD_CONF,          ONLY: LCARTESIAN
 USE MODD_STATION_n,     ONLY: NUMBSTAT
-USE MODD_TYPE_STATION,  ONLY: TSTATIONDATA
+USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA
 
 USE MODE_MSG
-USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION
+USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION
 
 CHARACTER(LEN=*),   INTENT(IN) :: HFILE ! file to read
 REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB
@@ -131,4 +131,4 @@ END IF
 !
 END SUBROUTINE FRENCH_TO_ENGLISH
 
-END MODULE MODE_STATION_READER
+END MODULE MODE_STATPROF_READER
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index 10b3c1ee3..0a5e466c3 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -9,11 +9,11 @@
 !-----------------------------------------------------------------
 ! Modifications:
 !-----------------------------------------------------------------
-!      ##################
-MODULE MODE_STATION_TOOLS
-!      ##################
+!      ###################
+MODULE MODE_STATPROF_TOOLS
+!      ###################
 
-USE MODD_TYPE_STATION, ONLY: TSTATIONDATA
+USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA
 
 IMPLICIT NONE
 
@@ -390,4 +390,4 @@ FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB )
 
 END FUNCTION STATION_INTERP_2D_V
 
-END MODULE MODE_STATION_TOOLS
+END MODULE MODE_STATPROF_TOOLS
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 23d6b40e7..7b35ea4c8 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -77,9 +77,9 @@ 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_STATION,    ONLY: TSTATIONDATA
+USE MODD_TYPE_STATPROF,   ONLY: TSTATIONDATA
 !
-USE MODE_STATION_TOOLS,   ONLY: STATION_ALLOCATE
+USE MODE_STATPROF_TOOLS,  ONLY: STATION_ALLOCATE
 !
 IMPLICIT NONE
 !
@@ -292,25 +292,25 @@ 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_station, only: tstationdata
+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
+use MODE_WRITE_DIACHRO, ONLY: Write_diachro
 
 TYPE(TFILEDATA),    INTENT(IN) :: TPDIAFILE ! diachronic file to write
 TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION
-- 
GitLab


From 6a55784ce758bedecbb2beac0e4bd3437b8dda6d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 27 Apr 2022 11:20:34 +0200
Subject: [PATCH 063/157] Philippe 27/04/2022: add namelist for profilers (not
 yet used)

---
 src/MNH/default_desfmn.f90     | 18 ++++++-
 src/MNH/goto_model_wrapper.f90 |  7 ++-
 src/MNH/modd_allprofilern.f90  | 99 ++++++++++++++++++++++++++++++++++
 src/MNH/modn_profilern.f90     | 91 +++++++++++++++++++++++++++++++
 src/MNH/read_desfmn.f90        | 13 ++++-
 src/MNH/read_exsegn.f90        |  8 ++-
 src/MNH/write_desfmn.f90       | 17 ++++--
 7 files changed, 243 insertions(+), 10 deletions(-)
 create mode 100644 src/MNH/modd_allprofilern.f90
 create mode 100644 src/MNH/modn_profilern.f90

diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index c9f530786..ec17d0ffc 100644
--- a/src/MNH/default_desfmn.f90
+++ b/src/MNH/default_desfmn.f90
@@ -219,6 +219,7 @@ END MODULE MODI_DEFAULT_DESFM_n
 !  Q. Rodier      06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation)
 !  F. Couvreux    06/2021: add LRELAX_UVMEAN_FRC
 !  Q. Rodier      07/2021: modify XPOND=1
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -270,6 +271,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
 !
 !
@@ -592,7 +594,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
diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index da4f0e5c7..c0e7e24dd 100644
--- a/src/MNH/goto_model_wrapper.f90
+++ b/src/MNH/goto_model_wrapper.f90
@@ -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
@@ -189,14 +191,15 @@ 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)
diff --git a/src/MNH/modd_allprofilern.f90 b/src/MNH/modd_allprofilern.f90
new file mode 100644
index 000000000..fd7cd8eb2
--- /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/modn_profilern.f90 b/src/MNH/modn_profilern.f90
new file mode 100644
index 000000000..d050fddcf
--- /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/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 2f781f8e7..cc91eec5f 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-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.
@@ -195,6 +195,7 @@ 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
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -263,6 +264,7 @@ 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
@@ -471,6 +473,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
@@ -732,6 +740,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)
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 9db15fc16..f77b127fe 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.
@@ -303,6 +303,7 @@ END MODULE MODI_READ_EXSEG_n
 !  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
 !  R. Honnert  23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT
 !  S. Riette   11/05/2021  HighLow cloud
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -391,6 +392,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
@@ -498,6 +500,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')")
@@ -553,6 +556,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)
 !
@@ -2974,6 +2979,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/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index 8be686e64..c88c912d4 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-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.
@@ -146,15 +146,19 @@ 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
+!  P. Wautelet 27/04/2022: add namelist for profilers
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 USE MODD_CONF
-USE MODD_DYN_n,   ONLY: LHORELAX_SVLIMA
-USE MODD_IO,      ONLY: TFILEDATA
-USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_DYN_n,      ONLY: LHORELAX_SVLIMA
+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
 !
@@ -205,7 +209,7 @@ 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
 !
 IMPLICIT NONE
@@ -389,6 +393,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)
 !
-- 
GitLab


From 0034b61a3460b77164fdba49ab312ab15d7ede97 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 27 Apr 2022 15:07:31 +0200
Subject: [PATCH 064/157] Philippe 27/04/2022: use lstation and lprofiler
 instead of numbstat and numbprofiler

---
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 8 ++++----
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 465f3bf2f..e462d6f19 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -278,11 +278,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, tprofiler
 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, tstations_time
+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
@@ -422,13 +422,13 @@ 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
+  if ( lprofiler ) then
     iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 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
+  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
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 0900e7163..223246cca 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1456,10 +1456,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, tprofiler
 use modd_series,     only: lseries
 use modd_series_n,   only: nsnbstept, tpsdates
-use modd_station_n,  only: numbstat, tstations_time
+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
@@ -1836,11 +1836,11 @@ if ( tpfile%lmaster ) then
     end if
 
     !Coordinates for the number of profiler times
-    if ( numbprofiler > 0 ) &
+    if ( lprofiler ) &
       call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates )
 
     !Coordinates for the number of station times
-    if ( numbstat > 0 ) &
+    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
-- 
GitLab


From 33d772457b3a15f00c931c7b9ec20f373a584f1e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 29 Apr 2022 15:15:00 +0200
Subject: [PATCH 065/157] Philippe 29/04/2022: restructure profilers for better
 performance, reduce memory usage and correct some problems/bugs + share code
 with stations

---
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 |    4 +-
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |    4 +-
 src/MNH/goto_model_wrapper.f90              |    2 -
 src/MNH/ini_modeln.f90                      |    4 +-
 src/MNH/ini_posprofilern.f90                |  329 ++---
 src/MNH/ini_profilern.f90                   |  176 ---
 src/MNH/ini_surfstationn.f90                |   26 +-
 src/MNH/modd_profilern.f90                  |   45 +-
 src/MNH/modd_stationn.f90                   |    5 +-
 src/MNH/modd_sub_profilern.f90              |  109 --
 src/MNH/modd_type_profiler.f90              |  115 --
 src/MNH/modd_type_statprof.f90              |  159 ++-
 src/MNH/modeln.f90                          |   13 +-
 src/MNH/modn_stationn.f90                   |    1 -
 src/MNH/profilern.f90                       | 1242 +++++++------------
 src/MNH/stationn.f90                        |   84 +-
 src/MNH/statprof_reader.f90                 |   99 +-
 src/MNH/statprof_tools.f90                  |  542 ++++++--
 src/MNH/write_profilern.f90                 |  525 +++++---
 src/MNH/write_stationn.f90                  |   56 +-
 20 files changed, 1659 insertions(+), 1881 deletions(-)
 delete mode 100644 src/MNH/ini_profilern.f90
 delete mode 100644 src/MNH/modd_sub_profilern.f90
 delete mode 100644 src/MNH/modd_type_profiler.f90

diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index e462d6f19..09d1c225a 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -278,7 +278,7 @@ 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: lprofiler, 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
@@ -423,7 +423,7 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then
 
   !Dimension for the number of profiler times
   if ( lprofiler ) then
-    iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 1
+    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
 
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 223246cca..c554d7da1 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1456,7 +1456,7 @@ 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: lprofiler, 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: lstation, tstations_time
@@ -1837,7 +1837,7 @@ if ( tpfile%lmaster ) then
 
     !Coordinates for the number of profiler times
     if ( lprofiler ) &
-      call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates )
+      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 ( lstation ) &
diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index c0e7e24dd..33dbefdf2 100644
--- a/src/MNH/goto_model_wrapper.f90
+++ b/src/MNH/goto_model_wrapper.f90
@@ -109,7 +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_TIMEZ
 USE MODD_TURB_n
 !
@@ -205,7 +204,6 @@ 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_PASPOL_GOTO_MODEL(KFROM, KTO)
 CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO)
 !CALL TIME_GOTO_MODEL(KFROM, KTO)
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 6ee23d80a..27d610835 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -2572,9 +2572,7 @@ 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_posprofilern.f90 b/src/MNH/ini_posprofilern.f90
index 00279c8a8..ad6340211 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,144 @@ 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_GRID_n,         ONLY: XXHAT, XYHAT
+USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+USE MODD_PROFILER_n,     ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME
+USE MODD_TYPE_STATPROF,  ONLY: TPROFILERDATA
+
+USE MODE_ALLOCBUFFER_ll,  ONLY: ALLOCBUFFER_ll
+USE MODE_GATHER_ll,       ONLY: GATHERALL_FIELD_ll
 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      !
+INTEGER :: IERR
+INTEGER :: IIU
+INTEGER :: IJU
+INTEGER :: INUMBPROF                        ! Total number of profilers (inside physical domain of model)
+INTEGER :: ISTORE                           ! number of storage instants
+INTEGER :: JI
+LOGICAL :: GALLOCX, GALLOCY
+LOGICAL :: GINSIDE                          ! True if profiler is inside physical domain of model
+LOGICAL :: GPRESENT                         ! True if profiler is present on the current process
+REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
+REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
+REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM      ! mass point coordinates
+REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM      ! mass point coordinates
+REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
+REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
+TYPE(TPROFILERDATA)          :: TZPROFILER
 !
 !----------------------------------------------------------------------------
-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)
+
+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) )
+!
+! Prepare positioning data
+!
+IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN
+  IIU = SIZE( XXHAT )
+  IJU = SIZE( XYHAT )
+
+  ! Get global XHAT and YHAT (needed by PROFILER_POSITION)
+  CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX )
+  CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY )
+  CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
+  CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
+
+  ! Interpolations of model variables to mass points
+  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
+  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
+
+  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
+  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
+
+  ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
+  ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
+  ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
+  ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) )
 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 
-!
-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))
+! 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, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                 &
+                              ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
+                              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))
+  !Treat CSV datafile
+  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,    &
+                          ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
+                          INUMBPROF                                                          )
 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','')
+
+LPROFILER = ( INUMBPROF > 0 )
+
+DO JI = 1, NUMBPROFILER_LOC
+  CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE )
+END DO
+!
+! Clean positioning data
+!
+IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN
+  IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB )
+  IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB )
 END IF
-!
-TPROFILER%STEP  = MAX ( PTSTEP, TPROFILER%STEP )
-!
-!
-END SUBROUTINE INI_INTERP_PROFILER_n
-!----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_POSPROFILER_n
diff --git a/src/MNH/ini_profilern.f90 b/src/MNH/ini_profilern.f90
deleted file mode 100644
index 598980099..000000000
--- 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_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 8811fa566..5452a5f0e 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -68,11 +68,11 @@ USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_STATION_n
 USE MODD_TYPE_STATPROF
 !
-USE MODE_MSG
-USE MODE_STATPROF_READER
-USE MODE_STATPROF_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION
 USE MODE_ALLOCBUFFER_ll,  ONLY: ALLOCBUFFER_ll
 USE MODE_GATHER_ll,       ONLY: GATHERALL_FIELD_ll
+USE MODE_MSG
+USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ
+USE MODE_STATPROF_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION
 !
 IMPLICIT NONE
 !
@@ -88,6 +88,7 @@ IMPLICIT NONE
 INTEGER :: IERR
 INTEGER :: IIU
 INTEGER :: IJU
+INTEGER :: INUMBSTAT                        ! Total number of stations (inside physical domain of model)
 INTEGER :: ISTORE                           ! number of storage instants
 INTEGER :: JI
 LOGICAL :: GALLOCX, GALLOCY
@@ -120,7 +121,7 @@ IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
   IIU = SIZE( XXHAT )
   IJU = SIZE( XYHAT )
 
-  ! Get global XHAT and YHAT (needed by STATION_POSITION)
+  ! Get global XHAT and YHAT (needed by STATPROF_POSITION)
   CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX )
   CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY )
   CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
@@ -145,7 +146,7 @@ NUMBSTAT_LOC = 0
 
 IF (CFILE_STAT=="NO_INPUT_CSV") THEN
   ! Treat namelist
-  NUMBSTAT = 0
+  INUMBSTAT = 0
   IF ( NNUMB_STAT > 0 ) THEN
     DO JI = 1, NNUMB_STAT
       IF ( LCARTESIAN ) THEN
@@ -154,18 +155,18 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
       ELSE
         TZSTATION%XLAT = XLAT_STAT(JI)
         TZSTATION%XLON = XLON_STAT(JI)
-        CALL STATION_INI_INTERP( TZSTATION )
+        CALL STATPROF_INI_INTERP( TZSTATION )
       END IF
       TZSTATION%XZ    = XZ_STAT(JI)
       TZSTATION%CNAME = CNAME_STAT(JI)
 
-      CALL STATION_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                  &
+      CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                 &
                              ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
                              GINSIDE, GPRESENT                                                   )
 
       IF ( GINSIDE ) THEN
-        NUMBSTAT = NUMBSTAT + 1
-        TZSTATION%NID = NUMBSTAT
+        INUMBSTAT = INUMBSTAT + 1
+        TZSTATION%NID = INUMBSTAT
       END IF
 
       IF ( GPRESENT ) CALL STATION_ADD( TZSTATION )
@@ -173,11 +174,12 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
   END IF
 ELSE
   !Treat CSV datafile
-  CALL READ_CSV_STATION( CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,               &
-                         ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX )
+  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,     &
+                          ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
+                          INUMBSTAT                                                          )
 END IF
 
-LSTATION = ( NUMBSTAT > 0 )
+LSTATION = ( INUMBSTAT > 0 )
 
 DO JI = 1, NUMBSTAT_LOC
   CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE )
diff --git a/src/MNH/modd_profilern.f90 b/src/MNH/modd_profilern.f90
index d8fb2469f..3abfe6611 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_stationn.f90 b/src/MNH/modd_stationn.f90
index bd86a1595..406d14909 100644
--- a/src/MNH/modd_stationn.f90
+++ b/src/MNH/modd_stationn.f90
@@ -43,7 +43,7 @@ IMPLICIT NONE
 
 PRIVATE
 
-PUBLIC :: LSTATION, NUMBSTAT, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS
+PUBLIC :: LSTATION, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS
 
 PUBLIC :: STATION_GOTO_MODEL
 
@@ -52,7 +52,6 @@ TYPE STATION_t
 !-------------------------------------------------------------------------------------------
 !
   LOGICAL                          :: LSTATION    ! flag to use stations
-  INTEGER                          :: NUMBSTAT    ! number of stations
   INTEGER                          :: NUMBSTAT_LOC = 0 ! number of stations on this process
 !
   TYPE(TSTATPROFTIME) :: TSTATIONS_TIME
@@ -63,7 +62,6 @@ END TYPE STATION_t
 TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL
 
 LOGICAL, POINTER :: LSTATION=>NULL()
-INTEGER, POINTER :: NUMBSTAT=>NULL()
 INTEGER, POINTER :: NUMBSTAT_LOC=>NULL()
 TYPE(TSTATPROFTIME),              POINTER :: TSTATIONS_TIME => NULL()
 TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS      => NULL()
@@ -78,7 +76,6 @@ STATION_MODEL(KFROM)%TSTATIONS => TSTATIONS
 !
 ! Current model is set to model KTO
 LSTATION       => STATION_MODEL(KTO)%LSTATION
-NUMBSTAT       => STATION_MODEL(KTO)%NUMBSTAT
 NUMBSTAT_LOC   => STATION_MODEL(KTO)%NUMBSTAT_LOC
 TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME
 TSTATIONS      => STATION_MODEL(KTO)%TSTATIONS
diff --git a/src/MNH/modd_sub_profilern.f90 b/src/MNH/modd_sub_profilern.f90
deleted file mode 100644
index 14582b74b..000000000
--- 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_type_profiler.f90 b/src/MNH/modd_type_profiler.f90
deleted file mode 100644
index b5fedbf60..000000000
--- 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_statprof.f90 b/src/MNH/modd_type_statprof.f90
index 12150549a..c456ae947 100644
--- a/src/MNH/modd_type_statprof.f90
+++ b/src/MNH/modd_type_statprof.f90
@@ -30,7 +30,7 @@
 !!    -------------
 !!      Original    15/01/02
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
+!  P. Wautelet    04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -43,7 +43,8 @@ implicit none
 
 private
 
-public :: TSTATPROFTIME, TSTATIONDATA
+public :: TSTATPROFTIME
+public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
 
 TYPE :: TSTATPROFTIME
   REAL                                       :: XTIME_CUR = XUNDEF  ! current time since last storage
@@ -52,63 +53,105 @@ TYPE :: TSTATPROFTIME
   type(date_time), dimension(:), ALLOCATABLE :: tpdates             ! dates(n) (n: recording instants)
 END TYPE TSTATPROFTIME
 
-TYPE TSTATIONDATA
-! Type to store all the data of 1 station
-CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = ''  ! station name
-
-
-INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model)
-
-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)
-REAL :: XZS  = XUNDEF  ! zs(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)
-
-INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons
-
-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 :: XT2M
-REAL, DIMENSION(:),   ALLOCATABLE :: XQ2M
-REAL, DIMENSION(:),   ALLOCATABLE :: XHU2M
-REAL, DIMENSION(:),   ALLOCATABLE :: XZON10M
-REAL, DIMENSION(:),   ALLOCATABLE :: XMER10M
-REAL, DIMENSION(:),   ALLOCATABLE :: XRN
-REAL, DIMENSION(:),   ALLOCATABLE :: XH
-REAL, DIMENSION(:),   ALLOCATABLE :: XLE
-REAL, DIMENSION(:),   ALLOCATABLE :: XLEI
-REAL, DIMENSION(:),   ALLOCATABLE :: XGFLUX
-REAL, DIMENSION(:),   ALLOCATABLE :: XSWD
-REAL, DIMENSION(:),   ALLOCATABLE :: XSWU
-REAL, DIMENSION(:),   ALLOCATABLE :: XLWD
-REAL, DIMENSION(:),   ALLOCATABLE :: XLWU
-REAL, DIMENSION(:),   ALLOCATABLE :: XSWDIR
-REAL, DIMENSION(:),   ALLOCATABLE :: XSWDIFF
-REAL, DIMENSION(:),   ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth
-REAL, DIMENSION(:),   ALLOCATABLE :: XSFCO2  ! CO2 surface flux
+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 :: XVISI      ! VISI(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/modeln.f90 b/src/MNH/modeln.f90
index 61c50c483..c778b2e1e 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -2116,21 +2116,20 @@ IF (LFLYER)                                                                   &
 !*       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(XTSTEP, XZZ,                                          &
+                 XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST )
 !
 !---------------------------------------------------------
 !
 !*       24.3    PROFILER (observation diagnostic)
 !               ---------------------------------
 !
-IF (LPROFILER)                                                           &
+IF ( LPROFILER )                                                         &
   CALL PROFILER_n(XTSTEP,                                                &
-                  XXHAT, XYHAT, XZZ,XRHODREF,                            &
+                  XZZ, XRHODREF,                                         &
                   XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
-                  XAER, XCLDFR, XCIT,PSEA=ZSEA(:,:))
+                  XAER, XCIT, PSEA=ZSEA(:,:))
 !
 !
 CALL SECOND_MNH2(ZTIME2)
diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90
index 9b8737c03..094b3dbb1 100644
--- a/src/MNH/modn_stationn.f90
+++ b/src/MNH/modn_stationn.f90
@@ -37,7 +37,6 @@ USE MODD_ALLSTATION_n, ONLY:&
         CFILE_STAT_n    =>CFILE_STAT    ,&
         LDIAG_SURFRAD_n =>LDIAG_SURFRAD
 USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX
-USE MODD_STATION_n
 !
 !-----------------------------------------------------------------------------
 !
diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index 4424b816f..ccd26a860 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -9,27 +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( PTSTEP,                         &
+                             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(:,:),     INTENT(IN)     :: PSEA   ! for radar 
 !
@@ -41,11 +38,11 @@ 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( PTSTEP,                         &
+                             PZ, PRHODREF,                   &
+                             PU, PV, PW, PTH, PR, PSV, PTKE, &
+                             PTS, PP, PAER, PCIT, PSEA )
 !     ########################################################
 !
 !
@@ -88,54 +85,50 @@ 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, 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
+USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
+USE MODD_NSV,              ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR
+USE MODD_PARAMETERS,       ONLY: JPVEXT, XUNDEF
+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
+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
+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
 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,                               &
+                                 XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA
+USE MODD_TIME_n,           only: tdtcur
+!
+USE MODE_FGAU,             ONLY: GAULAG
+USE MODE_FSCATTER,         ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG
 USE MODE_MSG
+USE MODE_STATPROF_TOOLS,   ONLY: 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
-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
-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_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,&
-                                 XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA
 !
 !
 IMPLICIT NONE
@@ -145,51 +138,40 @@ 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)     :: 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(:,:),     INTENT(IN)     :: PSEA   ! for radar 
+REAL, DIMENSION(:,:),     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)
@@ -219,34 +201,25 @@ 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))  :: ZTEMP,ZTHV,ZTEMPV
 REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZVISI,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   ! 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                           :: ZFRAC_ICE  ! ice water fraction
 REAL                           :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point
 REAL                           :: ZFW ! liquid fraction
 REAL                           :: ZFPW ! weight for mixed-phase reflectivity
@@ -270,150 +243,31 @@ 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
+
+IF ( TPROFILERS_TIME%XTIME_CUR == XUNDEF ) TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTSTEP - PTSTEP
 !
-TPROFILER%T_CUR = TPROFILER%T_CUR + PTSTEP
+TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_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
+IF ( TPROFILERS_TIME%XTIME_CUR >= TPROFILERS_TIME%XTSTEP - 1.E-10 ) THEN
+  TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR - TPROFILERS_TIME%XTSTEP
+  TPROFILERS_TIME%N_CUR = TPROFILERS_TIME%N_CUR + 1
+  IN = TPROFILERS_TIME%N_CUR
+  tprofilers_time%tpdates(in) = tdtcur
 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
+  !No profiler storage at this time step
+  RETURN
 END IF
 !
-!
-!----------------------------------------------------------------------------
-!
-!*      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
@@ -439,610 +293,406 @@ IF ((SIZE(PR,4) >= 2) .AND. NSV_C2R2END /= 0 ) THEN
   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' )
+    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 )
+  TPROFILERS(JP)%XVISI(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISI )
+  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
-       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
-       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
-                    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
-                    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
+    ! 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
+    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
+    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
+                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
+                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
+          ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
+          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
-            ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
-            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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
-             ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(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(:,:,:))
+            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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
+          ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(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/stationn.f90 b/src/MNH/stationn.f90
index 41e95dc53..b10c060a5 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -9,14 +9,11 @@ MODULE MODI_STATION_n
 !
 INTERFACE
 !
-      SUBROUTINE STATION_n(PTSTEP,                               &
-                           PXHAT, PYHAT, PZ,                     &
-                           PU, PV, PW, PTH, PR, PSV, PTKE,       &
-                           PTS,PP ) 
+      SUBROUTINE STATION_n( PTSTEP, 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
 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 +33,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( PTSTEP, PZ,                     &
+                            PU, PV, PW, PTH, PR, PSV, PTKE, &
+                            PTS, PP )
+!     #######################################################
 !
 !
 !!****  *STATION_n* - (advects and) stores 
@@ -97,7 +93,7 @@ USE MODD_STATION_n
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
 USE MODD_TIME_n,        ONLY: tdtcur
 !
-USE MODE_STATPROF_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
+USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V
 !
 !
 IMPLICIT NONE
@@ -107,8 +103,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)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
@@ -163,52 +157,52 @@ STATION: DO JS = 1,NUMBSTAT_LOC
   JK = TSTATIONS(JS)%NK
 
   IF (LCARTESIAN) THEN
-    TSTATIONS(JS)%XZON(IN) =   STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
-    TSTATIONS(JS)%XMER(IN) =   STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) )
+    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                = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) )
-    ZV_STAT                = STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) )
+    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) = STATION_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) )
-  TSTATIONS(JS)%XTH(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) )
-  TSTATIONS(JS)%XP (IN) = STATION_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) )
+  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 JSV=1,SIZE(PR,4)
-    TSTATIONS(JS)%XR(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) )
+    TSTATIONS(JS)%XR(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) )
   END DO
 
   DO JSV=1,SIZE(PSV,4)
-    TSTATIONS(JS)%XSV(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) )
+    TSTATIONS(JS)%XSV(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) )
   END DO
 
-  IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) )
-  IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTS )
-  TSTATIONS(JS)%XZS  = STATION_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT))
+  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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M )
-    TSTATIONS(JS)%XMER10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M )
-    TSTATIONS(JS)%XT2M   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M    )
-    TSTATIONS(JS)%XQ2M   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M    )
-    TSTATIONS(JS)%XHU2M  (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M   )
-    TSTATIONS(JS)%XRN    (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_RN     )
-    TSTATIONS(JS)%XH     (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_H      )
-    TSTATIONS(JS)%XLE    (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LE     )
-    TSTATIONS(JS)%XLEI   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI    )
-    TSTATIONS(JS)%XGFLUX (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX  )
+    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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD    )
-      TSTATIONS(JS)%XSWU   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU    )
-      TSTATIONS(JS)%XLWD   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD    )
-      TSTATIONS(JS)%XLWU   (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU    )
-      TSTATIONS(JS)%XSWDIR (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR  )
-      TSTATIONS(JS)%XSWDIFF(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF )
-      TSTATIONS(JS)%XDSTAOD(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD )
+      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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 )
+    TSTATIONS(JS)%XSFCO2(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 )
   END IF
 END DO STATION
 !
diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90
index ed645d7ab..888cfeac3 100644
--- a/src/MNH/statprof_reader.f90
+++ b/src/MNH/statprof_reader.f90
@@ -11,14 +11,14 @@ IMPLICIT NONE
 
 PRIVATE
 
-PUBLIC :: READ_CSV_STATION
+PUBLIC :: STATPROF_CSV_READ
 
 INTEGER, PARAMETER :: NMAXLINELGT = 400
 
 CONTAINS
 !-------------------------------------------------------------------
 !
-!!****  *READ_CSV_STATION* -
+!!****  *STATPROF_CSV_READ* -
 !!
 !!    PURPOSE
 !!    -------
@@ -31,39 +31,55 @@ CONTAINS
 !!    MODIFICATIONS
 !!    -------------
 !!     03/2020      Original
-!  P. Wautelet    04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs
+!  P. Wautelet    04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs
 !---------------------------------------------------------------
 !
-!###############################################################################################
-SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                    &
-                             PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX )
-!###############################################################################################
+!#################################################################################################
+SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,         &
+                              PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
+                              KNUMBSTATPROF                                                      )
+!#################################################################################################
 
 USE MODD_CONF,          ONLY: LCARTESIAN
-USE MODD_STATION_n,     ONLY: NUMBSTAT
-USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
 
 USE MODE_MSG
-USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION
-
-CHARACTER(LEN=*),   INTENT(IN) :: HFILE ! file to read
-REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB
-REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB
-REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates
-REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates
-REAL,               INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
-REAL,               INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
+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
+REAL, DIMENSION(:),   INTENT(IN)  :: PXHAT_GLOB
+REAL, DIMENSION(:),   INTENT(IN)  :: PYHAT_GLOB
+REAL, DIMENSION(:),   INTENT(IN)  :: PXHATM ! mass point coordinates
+REAL, DIMENSION(:),   INTENT(IN)  :: PYHATM ! mass point coordinates
+REAL,                 INTENT(IN)  :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
+REAL,                 INTENT(IN)  :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
+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
-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
+INTEGER             :: ILU      ! logical unit of the file
+INTEGER             :: INBLINE  ! Nb of lines in csv file
+INTEGER             :: JI
+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
 
-INBLINE  = 0 !Number of stations found in the file
-NUMBSTAT = 0 !Number of stations found in the file AND inside the model domain
+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' )
@@ -71,29 +87,40 @@ OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' )
 READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it)
 
 DO
-  ! Read station coordinates
+  ! 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, * ) TZSTATION%CNAME, TZSTATION%XX,   TZSTATION%XY,   TZSTATION%XZ
+    READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XX,   TZSTATPROF%XY,   TZSTATPROF%XZ
   ELSE
-    READ( YSTRING, * ) TZSTATION%CNAME, TZSTATION%XLAT, TZSTATION%XLON, TZSTATION%XZ
+    READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XLAT, TZSTATPROF%XLON, TZSTATPROF%XZ
   END IF
 
-  IF ( .NOT. LCARTESIAN ) CALL STATION_INI_INTERP( TZSTATION )
-  CALL STATION_POSITION( TZSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                  &
+  IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF )
+  CALL STATPROF_POSITION( TZSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                 &
                          PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
                          GINSIDE, GPRESENT                                                   )
 
   IF ( GINSIDE ) THEN
-    NUMBSTAT = NUMBSTAT + 1
-    TZSTATION%NID = NUMBSTAT
+    KNUMBSTATPROF = KNUMBSTATPROF + 1
+    TZSTATPROF%NID = KNUMBSTATPROF
   END IF
 
-  IF ( GPRESENT ) CALL STATION_ADD( TZSTATION )
+  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' )
+    END SELECT
+  END IF
 
   INBLINE = INBLINE + 1
 END DO
@@ -102,9 +129,9 @@ END DO
 
 CLOSE( ILU )
 
-IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'READ_CSV_STATION', 'Data not found in file ' // TRIM( HFILE ) )
+IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) )
 
-END SUBROUTINE READ_CSV_STATION
+END SUBROUTINE STATPROF_CSV_READ
 
 !#########################################################
 SUBROUTINE FRENCH_TO_ENGLISH(HSTRING)
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index 0a5e466c3..ca8ff988c 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -13,20 +13,146 @@
 MODULE MODE_STATPROF_TOOLS
 !      ###################
 
-USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
 
 IMPLICIT NONE
 
 PRIVATE
 
-PUBLIC :: STATION_ALLOCATE
-PUBLIC :: STATION_INI_INTERP
-PUBLIC :: STATION_POSITION
-PUBLIC :: STATION_ADD
-PUBLIC :: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V
+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
 
 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
+
+  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) )
+  ALLOCATE( TPPROFILER%XVISI     (KSTORE, IKU) )
+  ALLOCATE( TPPROFILER%XVISIKUN  (KSTORE, IKU) )
+  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
+  TPPROFILER%XVISI     (:,:) = XUNDEF
+  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
+    TPPROFILER%XQ2M   (:) = XUNDEF
+    TPPROFILER%XHU2M  (:) = XUNDEF
+    TPPROFILER%XZON10M(:) = XUNDEF
+    TPPROFILER%XMER10M(:) = XUNDEF
+    TPPROFILER%XRN    (:) = XUNDEF
+    TPPROFILER%XH     (:) = XUNDEF
+    TPPROFILER%XLE    (:) = XUNDEF
+    TPPROFILER%XLEI   (:) = XUNDEF
+    TPPROFILER%XGFLUX (:) = XUNDEF
+    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 )
 ! ##############################################
@@ -116,9 +242,9 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE )
 
 END SUBROUTINE STATION_ALLOCATE
 
-! ########################################
-SUBROUTINE STATION_INI_INTERP( TPSTATION )
-! ########################################
+! ##########################################
+SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF )
+! ##########################################
 
   USE MODD_GRID,         ONLY: XLATORI, XLONORI
   USE MODD_PARAMETERS,   ONLY: XUNDEF
@@ -128,28 +254,28 @@ SUBROUTINE STATION_INI_INTERP( TPSTATION )
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
+  CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF
 
-  IF ( TPSTATION%XLAT == XUNDEF .OR. TPSTATION%XLON == XUNDEF ) THEN
-    CMNHMSG(1) = 'Error in station position'
+  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', 'STATION_INI_INTERP' )
+    CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'STATPROF_INI_INTERP' )
   END IF
 
-  CALL SM_XYHAT( XLATORI,        XLONORI,        &
-                 TPSTATION%XLAT, TPSTATION%XLON, &
-                 TPSTATION%XX,   TPSTATION%XY    )
+  CALL SM_XYHAT( XLATORI,         XLONORI,         &
+                 TPSTATPROF%XLAT, TPSTATPROF%XLON, &
+                 TPSTATPROF%XX,   TPSTATPROF%XY    )
 
-END SUBROUTINE STATION_INI_INTERP
+END SUBROUTINE STATPROF_INI_INTERP
 
 ! ###############################################################################################
-SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                 &
+SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,               &
                              PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
                              OINSIDE, OPRESENT                                                  )
 ! ###############################################################################################
-! Subroutine to determine the position of a station on the model grid
+! 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
@@ -162,15 +288,17 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION
-  REAL, DIMENSION(:), INTENT(IN)    :: PXHAT_GLOB
-  REAL, DIMENSION(:), INTENT(IN)    :: PYHAT_GLOB
-  REAL, DIMENSION(:), INTENT(IN)    :: PXHATM ! mass point coordinates
-  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! mass point coordinates
-  REAL,               INTENT(IN)    :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
-  REAL,               INTENT(IN)    :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
-  LOGICAL,            INTENT(OUT)   :: OINSIDE  ! True if station is inside physical domain of model
-  LOGICAL,            INTENT(OUT)   :: OPRESENT ! True if station is present on the current process
+  CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF
+  REAL, DIMENSION(:),   INTENT(IN)    :: PXHAT_GLOB
+  REAL, DIMENSION(:),   INTENT(IN)    :: PYHAT_GLOB
+  REAL, DIMENSION(:),   INTENT(IN)    :: PXHATM ! mass point coordinates
+  REAL, DIMENSION(:),   INTENT(IN)    :: PYHATM ! mass point coordinates
+  REAL,                 INTENT(IN)    :: PXHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
+  REAL,                 INTENT(IN)    :: PYHATM_PHYS_MIN  ! Minimum Y coordinate of mass points in the physical domain
+  REAL,                 INTENT(IN)    :: PXHATM_PHYS_MAX  ! Maximum X coordinate of mass points in the physical domain
+  REAL,                 INTENT(IN)    :: PYHATM_PHYS_MAX  ! Minimum Y coordinate of mass points in the physical domain
+  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 !
@@ -185,39 +313,39 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,
 
   CALL GET_INDICE_ll( IIB, IJB, IIE, IJE )
 
-  IF (       TPSTATION%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) &
-       .AND. TPSTATION%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN
+  IF (       TPSTATPROF%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) &
+       .AND. TPSTATPROF%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN
     OINSIDE = .TRUE.
   ELSE
     CALL GET_MODEL_NUMBER_ll(IMI)
-    WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATION%CNAME), IMI
-    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' )
+    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
-  TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX )
-  TPSTATION%NI_M = COUNT( PXHATM(:) <= TPSTATION%XX )
+  TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX )
+  TPSTATPROF%NI_M = COUNT( PXHATM(:) <= TPSTATPROF%XX )
 
   ! Y position
-  TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY )
-  TPSTATION%NJ_M = COUNT( PYHATM(:) <= TPSTATION%XY )
+  TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY )
+  TPSTATPROF%NJ_M = COUNT( PYHATM(:) <= TPSTATPROF%XY )
 
-  ! Position of station according to process
-  IF (       TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE &
-       .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) OPRESENT = .TRUE.
+  ! 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 is too near of physical domain border (outside of physical domain for mass points)
+  ! 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 (      TPSTATION%XX < PXHATM_PHYS_MIN .OR. TPSTATION%XX > PXHATM_PHYS_MAX &
-         .OR. TPSTATION%XY < PYHATM_PHYS_MIN .OR. TPSTATION%XY > PYHATM_PHYS_MAX ) THEN
+    IF (      TPSTATPROF%XX < PXHATM_PHYS_MIN .OR. TPSTATPROF%XX > PXHATM_PHYS_MAX &
+         .OR. TPSTATPROF%XY < PYHATM_PHYS_MIN .OR. TPSTATPROF%XY > PYHATM_PHYS_MAX ) THEN
       CALL GET_MODEL_NUMBER_ll(IMI)
-      WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of mass-points physical domain of model', I3 )" ) &
-             TRIM(TPSTATION%CNAME), 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 is too close to the boundaries of physical domain.'
-      CMNHMSG(4) = '=> station disabled (not computed)'
-      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' )
+      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
@@ -226,29 +354,83 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,
   ! Computations only on correct process
   IF ( OPRESENT .AND. .NOT. L1D ) THEN
     ! Interpolation coefficient for X (mass-point)
-    TPSTATION%XXMCOEF = ( TPSTATION%XX - PXHATM(TPSTATION%NI_M) ) / ( PXHATM(TPSTATION%NI_M+1) - PXHATM(TPSTATION%NI_M) )
+    TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - PXHATM(TPSTATPROF%NI_M) ) / ( PXHATM(TPSTATPROF%NI_M+1) - PXHATM(TPSTATPROF%NI_M) )
     ! Interpolation coefficient for Y (mass-point)
-    TPSTATION%XYMCOEF = ( TPSTATION%XY - PYHATM(TPSTATION%NJ_M) ) / ( PYHATM(TPSTATION%NJ_M+1) - PYHATM(TPSTATION%NJ_M) )
+    TPSTATPROF%XYMCOEF = ( TPSTATPROF%XY - PYHATM(TPSTATPROF%NJ_M) ) / ( PYHATM(TPSTATPROF%NJ_M+1) - PYHATM(TPSTATPROF%NJ_M) )
     ! Interpolation coefficient for X (U-point)
-    TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) )  / ( XXHAT(TPSTATION%NI_U+1)  - XXHAT(TPSTATION%NI_U) )
+    TPSTATPROF%XXUCOEF = ( TPSTATPROF%XX - XXHAT(TPSTATPROF%NI_U) )  / ( XXHAT(TPSTATPROF%NI_U+1)  - XXHAT(TPSTATPROF%NI_U) )
     ! Interpolation coefficient for Y (V-point)
-    TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) )  / ( XYHAT(TPSTATION%NJ_V+1)  - XYHAT(TPSTATION%NJ_V) )
+    TPSTATPROF%XYVCOEF = ( TPSTATPROF%XY - XYHAT(TPSTATPROF%NJ_V) )  / ( XYHAT(TPSTATPROF%NJ_V+1)  - XYHAT(TPSTATPROF%NJ_V) )
   END IF
 
   IF ( OPRESENT ) THEN
-    ! The closest K-level to the station altitude is chosen
-    JK = JPVEXT + 1
-    DO WHILE ( ( STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) ) < TPSTATION%XZ)
-      JK = JK + 1
-    END DO
-    ZLOW  = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK-1) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) )
-    ZHIGH = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK  ) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) )
-    !If the station is nearer from the lower level, select it
-    IF ( ( ZHIGH - TPSTATION%XZ ) > ( TPSTATION%XZ - ZLOW ) ) JK = JK - 1
-    TPSTATION%NK = JK
+    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' )
+    END SELECT
   END IF
 
-END SUBROUTINE STATION_POSITION
+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 )
@@ -258,7 +440,7 @@ SUBROUTINE STATION_ADD( TPSTATION )
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATION
 
   INTEGER :: JS
   TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TZSTATIONS
@@ -269,23 +451,42 @@ SUBROUTINE STATION_ADD( TPSTATION )
   DO JS = 1, NUMBSTAT_LOC - 1
     TZSTATIONS(JS) = TSTATIONS(JS)
   END DO
-  TZSTATIONS(NUMBSTAT_LOC) = TPSTATION
+
+  !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 STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB )
-! ######################################################
-  USE MODD_CONF, ONLY: L1D
+
+! ########################################################
+FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB )
+! ########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
 
   USE MODE_MSG
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
   REAL, DIMENSION(:,:), INTENT(IN) :: PA
   REAL                             :: PB
 
@@ -298,32 +499,34 @@ FUNCTION STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB )
     JI = 2
     JJ = 2
   ELSE
-    JI = TPSTATION%NI_M
-    JJ = TPSTATION%NJ_M
+    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.-TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI,JJ)    + &
-         (   TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ)  + &
-         (1.-TPSTATION%XXMCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI,JJ+1)  + &
-         (   TPSTATION%XXMCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI+1,JJ+1)
+    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', 'STATION_INTERP_2D', 'value can not be interpolated' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated' )
+    PB = XUNDEF
   END IF
 
-END FUNCTION STATION_INTERP_2D
+END FUNCTION STATPROF_INTERP_2D
 
-! ########################################################
-FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB )
-! ########################################################
-  USE MODD_CONF, ONLY: L1D
+! ##########################################################
+FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
 
   USE MODE_MSG
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
   REAL, DIMENSION(:,:), INTENT(IN) :: PA
   REAL                             :: PB
 
@@ -336,32 +539,34 @@ FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB )
     JI = 2
     JJ = 2
   ELSE
-    JI = TPSTATION%NI_U
-    JJ = TPSTATION%NJ_M
+    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.-TPSTATION%XXUCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI,JJ)    + &
-         (   TPSTATION%XXUCOEF) *  (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ)  + &
-         (1.-TPSTATION%XXUCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI,JJ+1)  + &
-         (   TPSTATION%XXUCOEF) *  (   TPSTATION%XYMCOEF) * PA(JI+1,JJ+1)
+    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', 'STATION_INTERP_2D_U', 'value can not be interpolated' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated' )
+    PB = XUNDEF
   END IF
 
-END FUNCTION STATION_INTERP_2D_U
+END FUNCTION STATPROF_INTERP_2D_U
 
-! ########################################################
-FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB )
-! ########################################################
-  USE MODD_CONF, ONLY: L1D
+! ##########################################################
+FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB )
+! ##########################################################
+  USE MODD_CONF,       ONLY: L1D
+  USE MODD_PARAMETERS, ONLY: XUNDEF
 
   USE MODE_MSG
 
   IMPLICIT NONE
 
-  TYPE(TSTATIONDATA),   INTENT(IN) :: TPSTATION
+  CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF
   REAL, DIMENSION(:,:), INTENT(IN) :: PA
   REAL                             :: PB
 
@@ -374,20 +579,149 @@ FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB )
     JI = 2
     JJ = 2
   ELSE
-    JI = TPSTATION%NI_M
-    JJ = TPSTATION%NJ_V
+    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.-TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYVCOEF) * PA(JI,JJ)    + &
-         (   TPSTATION%XXMCOEF) *  (1.-TPSTATION%XYVCOEF) * PA(JI+1,JJ)  + &
-         (1.-TPSTATION%XXMCOEF) *  (   TPSTATION%XYVCOEF) * PA(JI,JJ+1)  + &
-         (   TPSTATION%XXMCOEF) *  (   TPSTATION%XYVCOEF) * PA(JI+1,JJ+1)
+    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', 'STATION_INTERP_2D_V', 'value can not be interpolated' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated' )
+    PB = XUNDEF
   END IF
 
-END FUNCTION STATION_INTERP_2D_V
+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' )
+    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' )
+    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' )
+    PB = XUNDEF
+  END IF
+
+END FUNCTION STATPROF_INTERP_3D_V
+
 
 END MODULE MODE_STATPROF_TOOLS
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index cb9dc945a..e6b744fb9 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -19,6 +19,7 @@
 !  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
@@ -40,19 +41,31 @@ 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
 !
@@ -65,50 +78,280 @@ 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 * ( 16 + NRR + NSV + NAER )
+  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
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISI(:,:),      [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:),   [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
+      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 /= IPACKSIZE (sender side)' )
+
+      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
+      TZPROFILER%XVISI(:,:)      = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      TZPROFILER%XVISIKUN(:,:)   = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
+      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 /= IPACKSIZE (receiver side)' )
+    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: LDUST, NMODE_DST
 USE MODD_CH_AEROSOL,      ONLY: LORILAM, JPMODE
+USE MODD_CONF_n,          ONLY: NRR
 USE MODD_CST,             ONLY: XRV
+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, &
                                 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
-USE MODD_PARAMETERS,      ONLY: XUNDEF
-USE MODD_PARAM_n,         ONLY: CRAD
-USE MODD_PROFILER_n,      ONLY: tprofiler
+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_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=NMNHNAMELGTMAX)                        :: yname
 character(len=NUNITLGTMAX)                           :: yunits
-CHARACTER(LEN=:),                        allocatable :: YGROUP   ! group title
 INTEGER                                              :: IKU
 INTEGER                                              :: IPROC    ! number of variables records
 INTEGER                                              :: JPROC
@@ -116,122 +359,119 @@ integer                                              :: jproc_alt, jproc_w
 INTEGER                                              :: JRR      ! loop counter
 INTEGER                                              :: JSV      ! loop counter
 integer                                              :: ji
-integer                                              :: irr !Number of moist variables
+INTEGER                                              :: ISTORE
 REAL, DIMENSION(:,:,:),                  ALLOCATABLE :: ZRHO
-REAL, DIMENSION(:,:,:), TARGET,          ALLOCATABLE :: ZWORK
-REAL, DIMENSION(:,:,:), POINTER                      :: ZDATA
+REAL, DIMENSION(:,:), TARGET,            ALLOCATABLE :: ZWORK
+REAL, DIMENSION(:,:), POINTER                        :: ZDATA
 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
 
 ZDATA => Null()
 
-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       )
+call Add_profile( 'VISI',     'Visibility',                    'km',     tpprofiler%xvisi      )
+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 )
+  call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss )
 
-if ( Size( tprofiler%ciz, 1 ) > 0 ) &
-  call Add_profile( 'CIT',      'Ice concentration',    'kg-3',   tprofiler%ciz )
+if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) &
+  call Add_profile( 'CIT',      'Ice concentration',    'kg-3',   tpprofiler%xciz )
 
-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) )
+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', tprofiler%rhod )
-if ( Size( tprofiler%tke, 1 ) > 0 ) &
-  call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke )
+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 ( Size( tprofiler%sv, 4 ) > 0  ) then
+if ( nsv > 0  ) then
   ! Scalar variables
-  Allocate( zwork, mold = tprofiler%sv(:,:,:,1) )
+  Allocate( zwork, mold = tpprofiler%xsv(:,:,1) )
   do jsv = 1, nsv
     if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then
       yunits = 'ppb'
-      zwork = tprofiler%sv(:,:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb
+      zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb
       zdata => zwork
     else
       yunits = Trim( tsvlist(jsv)%cunits )
-      zdata => tprofiler%sv(:,:,:,jsv)
+      zwork = tpprofiler%xsv(:,:,jsv)
+      zdata => zwork
     end if
     call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata )
     zdata => Null()
   end do
   Deallocate( zwork )
 
-  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))
+  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
@@ -263,32 +503,32 @@ if ( Size( tprofiler%sv, 4 ) > 0  ) then
     DEALLOCATE (ZSV,ZRHO)
     DEALLOCATE (ZN0,ZRG,ZSIG)
   END IF
-  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
@@ -323,7 +563,7 @@ if ( Size( tprofiler%sv, 4 ) > 0  ) then
   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
@@ -356,12 +596,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'
@@ -397,7 +637,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 )
@@ -405,33 +645,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 ) )
 
@@ -459,12 +699,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'
@@ -496,7 +736,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 )
 
@@ -510,13 +750,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 ) )
 
@@ -535,7 +775,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)
@@ -544,7 +784,6 @@ Deallocate (ccomment)
 Deallocate (ctitle  )
 Deallocate (cunit   )
 
-
 contains
 
 
@@ -552,23 +791,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 )
 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
@@ -578,22 +817,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_stationn.f90 b/src/MNH/write_stationn.f90
index 7b35ea4c8..4697b0e87 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -3,6 +3,17 @@
 !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. Tulet    15/02/2002
+!
+!  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
 !      ###########################
@@ -28,43 +39,7 @@ SUBROUTINE WRITE_STATION_n( TPDIAFILE )
 ! #####################################
 !
 !
-!!****  *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
-!  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
-! --------------------------------------------------------------------------
+!****  *WRITE_STATION* - write the stations records in the diachronic file
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -79,6 +54,7 @@ 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
@@ -100,7 +76,7 @@ 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 :: 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
@@ -222,6 +198,8 @@ STATION: DO JS = 1, INUMSTAT
         ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2;    IPOS = IPOS + ISTORE
       END IF
 
+      IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)' )
+
       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 )
@@ -279,6 +257,8 @@ STATION: DO JS = 1, INUMSTAT
         END IF
         TZSTATION%XSFCO2 =    ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
       END IF
+
+      IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)' )
     END IF
   END IF
 
-- 
GitLab


From f6894f6a6787fc37e8c099e680492cf3d0ca686a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 12 May 2022 10:46:20 +0200
Subject: [PATCH 066/157] Philippe 12/05/2022: stations + profilers: add
 STATPROF_INSTANT subroutine

---
 src/MNH/modeln.f90         | 14 ++++++--------
 src/MNH/profilern.f90      | 30 +++++++-----------------------
 src/MNH/stationn.f90       | 26 ++++++--------------------
 src/MNH/statprof_tools.f90 | 38 +++++++++++++++++++++++++++++++++++++-
 4 files changed, 56 insertions(+), 52 deletions(-)

diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index c778b2e1e..2582fea44 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -2116,20 +2116,18 @@ IF (LFLYER)                                                                   &
 !*       24.2    STATION (observation diagnostic)
 !               --------------------------------
 !
-IF ( LSTATION )                                                        &
-  CALL STATION_n(XTSTEP, 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 )
 !
 !---------------------------------------------------------
 !
 !*       24.3    PROFILER (observation diagnostic)
 !               ---------------------------------
 !
-IF ( LPROFILER )                                                         &
-  CALL PROFILER_n(XTSTEP,                                                &
-                  XZZ, XRHODREF,                                         &
-                  XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
-                  XAER, XCIT, PSEA=ZSEA(:,:))
+IF ( LPROFILER )                                                          &
+  CALL PROFILER_n( XZZ, XRHODREF,                                         &
+                   XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, &
+                   XAER, XCIT, PSEA=ZSEA(:,:) )
 !
 !
 CALL SECOND_MNH2(ZTIME2)
diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index ccd26a860..a9215eb8e 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -9,12 +9,10 @@ MODULE MODI_PROFILER_n
 !
 INTERFACE
 !
-      SUBROUTINE PROFILER_n( PTSTEP,                         &
-                             PZ, PRHODREF,                   &
+      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)     :: PZ     ! z array
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
@@ -39,8 +37,7 @@ END INTERFACE
 END MODULE MODI_PROFILER_n
 !
 !     ########################################################
-      SUBROUTINE PROFILER_n( PTSTEP,                         &
-                             PZ, PRHODREF,                   &
+      SUBROUTINE PROFILER_n( PZ, PRHODREF,                   &
                              PU, PV, PW, PTH, PR, PSV, PTKE, &
                              PTS, PP, PAER, PCIT, PSEA )
 !     ########################################################
@@ -120,12 +117,12 @@ USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I
                                  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_TIME_n,           only: tdtcur
 !
 USE MODE_FGAU,             ONLY: GAULAG
 USE MODE_FSCATTER,         ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG
 USE MODE_MSG
-USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V
+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_WATER_SUM
@@ -137,7 +134,6 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
 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
@@ -249,30 +245,18 @@ IKE = IKU-JPVEXT
 !
 !----------------------------------------------------------------------------
 !
-!
 !*      3.4  instant of storage
 !            ------------------
 !
-
-IF ( TPROFILERS_TIME%XTIME_CUR == XUNDEF ) TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTSTEP - PTSTEP
-!
-TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR + PTSTEP
-!
-IF ( TPROFILERS_TIME%XTIME_CUR >= TPROFILERS_TIME%XTSTEP - 1.E-10 ) THEN
-  TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR - TPROFILERS_TIME%XTSTEP
-  TPROFILERS_TIME%N_CUR = TPROFILERS_TIME%N_CUR + 1
-  IN = TPROFILERS_TIME%N_CUR
-  tprofilers_time%tpdates(in) = tdtcur
-ELSE
-  !No profiler storage at this time step
-  RETURN
-END IF
+CALL  STATPROF_INSTANT( TPROFILERS_TIME, IN )
+IF ( IN < 1 ) RETURN !No profiler storage at this time step
 !
 !----------------------------------------------------------------------------
 !
 !*      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)
diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90
index b10c060a5..172521e8a 100644
--- a/src/MNH/stationn.f90
+++ b/src/MNH/stationn.f90
@@ -9,11 +9,10 @@ MODULE MODI_STATION_n
 !
 INTERFACE
 !
-      SUBROUTINE STATION_n( PTSTEP, PZ,                     &
+      SUBROUTINE STATION_n( PZ,                             &
                             PU, PV, PW, PTH, PR, PSV, PTKE, &
                             PTS, PP )
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
 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
@@ -34,7 +33,7 @@ END INTERFACE
 END MODULE MODI_STATION_n
 !
 !     #######################################################
-      SUBROUTINE STATION_n( PTSTEP, PZ,                     &
+      SUBROUTINE STATION_n( PZ,                             &
                             PU, PV, PW, PTH, PR, PSV, PTKE, &
                             PTS, PP )
 !     #######################################################
@@ -87,13 +86,12 @@ USE MODD_CONF,          ONLY: LCARTESIAN
 USE MODD_CST,           ONLY: XPI
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID,          ONLY: XBETA, XLON0, XRPK
-USE MODD_PARAMETERS,    ONLY: JPVEXT, XUNDEF
+USE MODD_PARAMETERS,    ONLY: JPVEXT
 USE MODD_PARAM_n,       ONLY: CRAD
 USE MODD_STATION_n
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD
-USE MODD_TIME_n,        ONLY: tdtcur
 !
-USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V
+USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V
 !
 !
 IMPLICIT NONE
@@ -102,7 +100,6 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 !
-REAL,                     INTENT(IN)     :: PTSTEP ! time step
 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
@@ -134,19 +131,8 @@ INTEGER :: JK          ! loop for levels
 !*      3.4  instant of storage
 !            ------------------
 !
-IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTSTEP - PTSTEP
-!
-TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP
-!
-IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 1.E-10 ) THEN
-  TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP
-  TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1
-  IN = TSTATIONS_TIME%N_CUR
-  tstations_time%tpdates(in) = tdtcur
-ELSE
-  !No station storage at this time step
-  RETURN
-END IF
+CALL  STATPROF_INSTANT( TSTATIONS_TIME, IN )
+IF ( IN < 1 ) RETURN !No profiler storage at this time step
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index ca8ff988c..3c19593bb 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -13,7 +13,7 @@
 MODULE MODE_STATPROF_TOOLS
 !      ###################
 
-USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
+USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA, TSTATPROFTIME
 
 IMPLICIT NONE
 
@@ -25,6 +25,7 @@ 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
 
@@ -723,5 +724,40 @@ FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB )
 
 END FUNCTION STATPROF_INTERP_3D_V
 
+! #################################################
+SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN )
+! #################################################
+  USE MODD_DYN_n,      ONLY: XTSTEP
+  USE MODD_PARAMETERS, ONLY: XUNDEF
+  USE MODD_TIME_n,     ONLY: TDTCUR
+
+  USE MODE_MSG
+
+  IMPLICIT NONE
+
+  TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME
+  INTEGER,             INTENT(OUT)   :: KIN ! Current step of storage
+
+  IF ( TPSTATPROF_TIME%XTIME_CUR == XUNDEF ) TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTSTEP - XTSTEP
+
+  TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR + XTSTEP
+
+  IF ( TPSTATPROF_TIME%XTIME_CUR >= TPSTATPROF_TIME%XTSTEP - 1.E-10 ) THEN
+    TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR - TPSTATPROF_TIME%XTSTEP
+    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 SUBROUTINE STATPROF_INSTANT
 
 END MODULE MODE_STATPROF_TOOLS
-- 
GitLab


From b9ffcc237db822608eb47095b94380d758c5d92e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 12 May 2022 10:47:41 +0200
Subject: [PATCH 067/157] Philippe 12/05/2022: write_profilern: remove ZDATA
 array (not useful anymore)

---
 src/MNH/write_profilern.f90 | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index e6b744fb9..ccb4fdcd2 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -361,16 +361,13 @@ INTEGER                                              :: JSV      ! loop counter
 integer                                              :: ji
 INTEGER                                              :: ISTORE
 REAL, DIMENSION(:,:,:),                  ALLOCATABLE :: ZRHO
-REAL, DIMENSION(:,:), TARGET,            ALLOCATABLE :: ZWORK
-REAL, DIMENSION(:,:), POINTER                        :: ZDATA
+REAL, DIMENSION(:,:),                    ALLOCATABLE :: ZWORK
 REAL, DIMENSION(:,:,:,:),                ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 type(tbudiachrometadata)                             :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 
-ZDATA => Null()
-
 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
@@ -435,14 +432,11 @@ if ( nsv > 0  ) then
     if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then
       yunits = 'ppb'
       zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb
-      zdata => zwork
     else
       yunits = Trim( tsvlist(jsv)%cunits )
       zwork = tpprofiler%xsv(:,:,jsv)
-      zdata => zwork
     end if
-    call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata )
-    zdata => Null()
+    call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zwork )
   end do
   Deallocate( zwork )
 
-- 
GitLab


From 40cf41ee41a81b9ab7e2897a178af97bcdd62f10 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 May 2022 15:38:46 +0200
Subject: [PATCH 068/157] Philippe 13/05/2022: flyers: use same data structure
 for time management as for stations and profilers

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  2 +-
 src/MNH/aircraft_balloon_evol.f90           | 26 ++----------
 src/MNH/ini_aircraft.f90                    | 20 ++++-----
 src/MNH/ini_aircraft_balloon.f90            | 16 +++----
 src/MNH/ini_balloon.f90                     | 16 +++----
 src/MNH/modd_aircraft_balloon.f90           | 10 ++---
 src/MNH/modd_type_statprof.f90              |  2 +-
 src/MNH/write_aircraft_balloon.f90          | 47 +++++++++++----------
 8 files changed, 60 insertions(+), 79 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index c554d7da1..1cb861234 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -2339,7 +2339,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 )
 
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 9642bcc4e..bc55a8fa8 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.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.
@@ -176,6 +176,7 @@ USE MODE_FSCATTER,         ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG
 USE MODE_GRIDPROJ
 USE MODE_ll
 USE MODE_MSG
+USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INSTANT
 !
 USE MODI_GAMMA,            ONLY: GAMMA
 USE MODI_WATER_SUM
@@ -485,27 +486,8 @@ 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
+CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN )
+IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step
 !
 IF ( TPFLYER%FLY) THEN
 !
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index 2df936301..254889818 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2020 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.
@@ -127,7 +127,7 @@ TAIRCRAFT1%TITLE             = 'DIMO19A'
 !
 !* time step for storage
 !
-TAIRCRAFT1%STEP              = 60. 
+TAIRCRAFT1%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
@@ -357,7 +357,7 @@ TAIRCRAFT2%TITLE             = 'DIMO19B'
 !
 !* time step for storage
 !
-TAIRCRAFT2%STEP             = 60.
+TAIRCRAFT2%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
@@ -616,7 +616,7 @@ TAIRCRAFT3%TITLE             = 'SAAL19A'
 !
 !* time step for storage
 !
-TAIRCRAFT3%STEP             = 30.
+TAIRCRAFT3%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
@@ -723,7 +723,7 @@ TAIRCRAFT4%TITLE             = 'SAAL19B'
 !
 !* time step for storage
 !
-TAIRCRAFT4%STEP             = 30.
+TAIRCRAFT4%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
@@ -829,7 +829,7 @@ TAIRCRAFT5%TITLE             = 'SAIB19A'
 !
 !* time step for storage
 !
-TAIRCRAFT5%STEP             = 30.
+TAIRCRAFT5%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
@@ -1073,7 +1073,7 @@ TAIRCRAFT6%TITLE             = 'SAIB19B'
 !
 !* time step for storage
 !
-TAIRCRAFT6%STEP             = 30.
+TAIRCRAFT6%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
@@ -1314,7 +1314,7 @@ TAIRCRAFT7%TITLE             = 'TEST_19'
 !
 !* time step for storage
 !
-TAIRCRAFT7%STEP             = 60.
+TAIRCRAFT7%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
@@ -1585,7 +1585,7 @@ TAIRCRAFT8%TITLE             = 'DIMO22B'
 !
 !* time step for storage
 !
-TAIRCRAFT8%STEP             = 60.
+TAIRCRAFT8%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
@@ -1859,7 +1859,7 @@ TAIRCRAFT9%TITLE             = 'DIMO23A'
 !
 !* time step for storage
 !
-TAIRCRAFT9%STEP             = 60.
+TAIRCRAFT9%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 72f52303a..58803387b 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -317,9 +317,7 @@ TPFLYER%LAUNCH = TPDTSEG
 TPFLYER%CRASH  = .FALSE.
 TPFLYER%FLY    = .FALSE.
 !
-TPFLYER%T_CUR  = XUNDEF
-TPFLYER%N_CUR  = 0
-TPFLYER%STEP   = 60.     ! s
+TPFLYER%TFLYER_TIME%XTSTEP = 60. ! s
 !
 TPFLYER%LAT     = XUNDEF
 TPFLYER%LON     = XUNDEF
@@ -358,9 +356,9 @@ 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
+  ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%TFLYER_TIME%XTSTEP ) + 1
 ELSE
-  ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1
+  ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1
 ENDIF
 !
 IF (TPFLYER%NMODEL == 0) ISTORE=0
@@ -369,7 +367,7 @@ IF (TPFLYER%NMODEL > 0) THEN
 ENDIF
 !
 !
-allocate( tpflyer%tpdates(istore) )
+allocate( tpflyer%tflyer_time%tpdates(istore) )
 ALLOCATE(TPFLYER%X   (ISTORE))
 ALLOCATE(TPFLYER%Y   (ISTORE))
 ALLOCATE(TPFLYER%Z   (ISTORE))
@@ -558,7 +556,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
        " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO
     END IF
     !
-    TPFLYER%STEP  = MAX ( PTSTEP, TPFLYER%STEP )
+    TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
   END IF
   !
 ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
@@ -579,7 +577,7 @@ ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
             " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR
     END IF
     !
-    TPFLYER%STEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%STEP )
+    TPFLYER%TFLYER_TIME%XTSTEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP )
   END IF
 END IF
 !
@@ -611,7 +609,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 LFLYER=.TRUE.
 !
-TPFLYER%STEP  = MAX ( PTSTEP, TPFLYER%STEP )
+TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
 !
 IF (TPFLYER%SEG==0) THEN
   WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )'
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 71e935021..5c0095d21 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2020 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.
@@ -152,7 +152,7 @@ TBALLOON1%PRES               = 98450.
 !
 !* time step for data storage  (s)
 !
-TBALLOON1%STEP               = 20.
+TBALLOON1%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -207,7 +207,7 @@ TBALLOON2%PRES               = 98490.
 !
 !* time step for data storage  (s)
 !
-TBALLOON2%STEP               = 20.
+TBALLOON2%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -263,7 +263,7 @@ TBALLOON3%ALT                =   865.
 !
 !* time step for data storage  (s)
 !
-TBALLOON3%STEP               = 20.
+TBALLOON3%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -319,7 +319,7 @@ TBALLOON4%ALT                =   3959.
 !
 !* time step for data storage  (s)
 !
-TBALLOON4%STEP               = 20.
+TBALLOON4%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -374,7 +374,7 @@ TBALLOON5%ALT                =    340.
 !
 !* time step for data storage  (s)
 !
-TBALLOON5%STEP               = 20.
+TBALLOON5%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -429,7 +429,7 @@ TBALLOON6%LON                =  8.646
 !
 !* time step for data storage  (s)
 !
-TBALLOON6%STEP               = 20.
+TBALLOON6%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
@@ -484,7 +484,7 @@ TBALLOON7%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON7%STEP               = 20.
+TBALLOON7%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 33d6f973f..e3c30efca 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-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.
@@ -40,7 +40,8 @@
 !             ------------
 !
 !
-use modd_type_date, only: date_time
+USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME
+use modd_type_date,     only: date_time
 
 implicit none
 
@@ -66,9 +67,7 @@ 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
+TYPE(TSTATPROFTIME)           :: TFLYER_TIME ! Time management for flyer
 !
 !* balloon dynamical characteristics
 !
@@ -112,7 +111,6 @@ REAL                          :: P_CUR    ! current p (if 'AIRCRA' and 'ALTDEF'
 !
 !* 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)
diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90
index c456ae947..a95c1e11c 100644
--- a/src/MNH/modd_type_statprof.f90
+++ b/src/MNH/modd_type_statprof.f90
@@ -48,7 +48,7 @@ public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
 
 TYPE :: TSTATPROFTIME
   REAL                                       :: XTIME_CUR = XUNDEF  ! current time since last storage
-  INTEGER                                    :: N_CUR     = 0           ! current step of storage
+  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
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index f957e9f77..e9a4ab409 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -192,6 +192,7 @@ 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 :: JRR      ! loop counter
@@ -225,12 +226,14 @@ 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))
+ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
+
+ALLOCATE (ZWORK6(1,1,1,ISTORE,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 (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ))
 ALLOCATE (YCOMMENTZ(IPROCZ))
 ALLOCATE (YTITLEZ (IPROCZ))
 ALLOCATE (YUNITZ  (IPROCZ))
@@ -330,7 +333,7 @@ END DO
 !
 !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)))
+ALLOCATE (ZRHO(1,1,ISTORE))
 IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present
   ZRHO(1,1,:) = 0.
   DO JRR=1,SIZE(TPFLYER%R,2)
@@ -338,7 +341,7 @@ IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present
   ENDDO
   ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) )  &
                                 / ( 1. + ZRHO(1,1,:)              )
-  DO JPT=1,size(tpflyer%tpdates)
+  DO JPT=1,ISTORE
     IF (TPFLYER%P(JPT) == 0.) THEN
       ZRHO(1,1,JPT) = 0.
     ELSE
@@ -408,12 +411,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
 
   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))
+    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%SV(:,NSV_AERBEG:NSV_AEREND)
     IF (SIZE(TPFLYER%R,2) >0) THEN
       ZRHO(1,1,:) = 0.
@@ -431,7 +434,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
     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
@@ -566,11 +569,11 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
   END IF
 
   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))
+    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%SV(:,NSV_DSTBEG:NSV_DSTEND)
     IF (SIZE(TPFLYER%R,2) >0) THEN
       ZRHO(1,1,:) = 0.
@@ -723,10 +726,10 @@ DO IK=1, IKU
 END DO
 !----------------------------------------------------------------------------
 !
-ALLOCATE (ZW6(1,1,1,size(tpflyer%tpdates),1,JPROC))
+ALLOCATE (ZW6(1,1,1,ISTORE,1,JPROC))
 ZW6  = ZWORK6(:,:,:,:,:,:JPROC)
 DEALLOCATE(ZWORK6)
-ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ))
+ALLOCATE (ZWZ6(1,1,IKU,ISTORE,1,JPROCZ))
 ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ)
 DEALLOCATE(ZWORKZ6)
 !
@@ -792,8 +795,8 @@ 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, zw6, &
+                    tpflyer = tpflyer                                                   )
 
 deallocate( tzfields )
 
@@ -864,8 +867,8 @@ 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, zwz6, &
+                    tpflyer = tpflyer                                                    )
 
 deallocate( tzfields )
 
-- 
GitLab


From 4c907030ce65862d734fa6a181c536196a3b6914 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 May 2022 16:21:28 +0200
Subject: [PATCH 069/157] Philippe 20/05/2022: move XLAM_CRAD to modd_cst

---
 src/MNH/ini_aircraft_balloon.f90  |  1 -
 src/MNH/modd_aircraft_balloon.f90 |  1 -
 src/MNH/modd_cst.f90              | 11 +++++++----
 src/MNH/profilern.f90             |  3 +--
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 58803387b..367f70535 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -429,7 +429,6 @@ IF (CCLOUD=='LIMA') THEN
 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
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index e3c30efca..cc6b45b24 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -146,7 +146,6 @@ 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)
 !
 !-------------------------------------------------------------------------------------------
 !
diff --git a/src/MNH/modd_cst.f90 b/src/MNH/modd_cst.f90
index 73607888c..e720256f3 100644
--- a/src/MNH/modd_cst.f90
+++ b/src/MNH/modd_cst.f90
@@ -1,10 +1,10 @@
-!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 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 
@@ -37,7 +37,8 @@
 !!      C. Mari     31/10/00  add NDAYSEC
 !!      V. Masson   01/03/03  add conductivity of ice
 !!      J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG
-!!      J.L. Redelsperger 03/2021  add constants for ocean penetrating solar
+!  J.L. Redelsperger 03/2021: add constants for ocean penetrating solar
+!  P. Wautelet 20/05/2022: add RASTA cloud radar wavelength
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -97,6 +98,8 @@ REAL,SAVE :: XD2=23.
 REAL,SAVE :: XRHOLI             ! Volumic mass of liquid water
 !
 INTEGER, SAVE :: NDAYSEC        ! Number of seconds in a day
+
+REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz
 !
 !
 !   Some machine precision value depending of real4/8 use  
diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index a9215eb8e..5554c6cd2 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -88,7 +88,7 @@ END MODULE MODI_PROFILER_n
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,              ONLY: XCPD, XG, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT
+USE MODD_CST,              ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
 USE MODD_NSV,              ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR
@@ -235,7 +235,6 @@ 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
 !            -------
 !
-- 
GitLab


From bcfc3ac960c3af272c7f7765dc41b81c8bc3a922 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 2 Jun 2022 10:34:15 +0200
Subject: [PATCH 070/157] Philippe 01/06/2022: flyers: replace FLYER type by
 TAIRCRAFDATA and TBALLOONDATA types

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |   2 +-
 src/MNH/aircraft_balloon.f90                |  48 +-
 src/MNH/aircraft_balloon_evol.f90           | 664 ++++++++++----------
 src/MNH/ini_aircraft_balloon.f90            |  55 +-
 src/MNH/modd_aircraft_balloon.f90           | 292 ++++-----
 src/MNH/write_aircraft_balloon.f90          |  40 +-
 src/MNH/write_balloonn.f90                  |   7 +-
 src/MNH/write_diachro.f90                   |  14 +-
 8 files changed, 593 insertions(+), 529 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 1cb861234..8344bffc6 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -2294,7 +2294,7 @@ subroutine Write_flyer_time_coord( tpflyer )
 
   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
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 153d76fe6..7538a4068 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.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.
@@ -42,10 +42,10 @@ REAL, DIMENSION(:,:),INTENT(IN) :: PSEA
 END SUBROUTINE AIRCRAFT_BALLOON
 !
 SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE )
-  USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER
+  USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA
 
-  TYPE(FLYER),      INTENT(IN)  :: TPFLYER
-  CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE
+  CLASS(TFLYERDATA), INTENT(IN)  :: TPFLYER
+  CHARACTER(LEN=*),  INTENT(OUT) :: HLONGTYPE
 END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET
 
 END INTERFACE
@@ -92,6 +92,7 @@ END MODULE MODI_AIRCRAFT_BALLOON
 !!              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
+!  P. Wautelet    06/2022: reorganize flyers
 ! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -347,27 +348,36 @@ 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
 
-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%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
+
+  class default
+    call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown class for flyer ' // Trim( tpflyer%title ) )
+    ytype = 'Unknown'
+
+end select
 
 if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) &
   call Print_msg( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', &
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index bc55a8fa8..719d5de2f 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -36,7 +36,7 @@ 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
+CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER! balloon/aircraft
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
 !
 !-------------------------------------------------------------------------------
@@ -127,7 +127,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !                                    -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
 !! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -206,7 +206,7 @@ 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
+CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER! balloon/aircraft
 REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
 !
 !-------------------------------------------------------------------------------
@@ -414,72 +414,82 @@ IF (.NOT. TPFLYER%FLY) THEN
 !            ---------------------------
 !
   IF (ZTDIST >= - PTSTEP ) THEN
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
+    SELECT TYPE ( TPFLYER )
+      CLASS IS ( TAIRCRAFTDATA)
 !
 !*     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
+        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.
+        !
+        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
+
+      CLASS IS ( TBALLOONDATA)
         IF (ZTDIST <= PTSTEP ) THEN
+          TPFLYER%FLY = .TRUE.
+          GLAUNCH     = .TRUE.
           WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-          WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the   ', &
-                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                 &
-                      TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
+          WRITE(ILUOUT,*) 'Balloon  ',TPFLYER%TITLE,' is launched 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
+        END IF
+
+      CLASS DEFAULT
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER' )
+
+    END SELECT
 !
 !*      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
-    END IF
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
+    SELECT TYPE ( TPFLYER )
+      CLASS IS ( TBALLOONDATA)
+        IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
+          TPFLYER%X_CUR = TPFLYER%XLAUNCH
+          TPFLYER%Y_CUR = TPFLYER%YLAUNCH
+        END IF
+
+      CLASS IS ( TAIRCRAFTDATA)
 !
 !
 !*       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)
-      END IF
-!
-    END IF
+        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)
+        END IF
+    END SELECT
   END IF
 END IF
 !
@@ -622,131 +632,131 @@ IF ( TPFLYER%FLY) THEN
 !            --------------------------
 !
     IF (GLAUNCH) THEN
+      SELECT TYPE ( TPFLYER )
+        CLASS IS ( TBALLOONDATA)
+          SELECT CASE ( TPFLYER%TYPE )
 !
 !*      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
+            CASE ( 'ISODEN' )
+              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
+                CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%TITLE) // ' )'
+                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' )
+              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
-
-!*      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
+            CASE ( 'RADIOS' )
+              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) )
 !
 !*      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) )
+            CASE ( 'CVBALL' )
+              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 SELECT
+!
+!*      5.2.3 Aircraft
+!
+        CLASS IS ( TAIRCRAFTDATA)
+          IF (TPFLYER%ALTDEF) THEN
+            TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
+                          +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
           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)
+            TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) &
+                          +     ZSEG_FRAC  * TPFLYER%SEGZ(IL +1 )
           END IF
-        END IF
-      END IF
+      END SELECT
     END IF
 !
 !
@@ -754,30 +764,35 @@ IF ( TPFLYER%FLY) THEN
 !*      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
-    END IF
+    SELECT TYPE ( TPFLYER )
+      CLASS IS ( TBALLOONDATA)
+        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)
+        END IF
+
+      CLASS IS ( TAIRCRAFTDATA)
+        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
+    END SELECT
+
     IK00 = MAX ( IK00, IKB )
     IK01 = MAX ( IK01, IKB )
     IK10 = MAX ( IK10, IKB )
@@ -808,13 +823,16 @@ IF ( TPFLYER%FLY) THEN
                     TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
     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
+    SELECT TYPE ( TPFLYER )
+      CLASS IS ( TAIRCRAFTDATA)
+        IF ( .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
 !
 !----------------------------------------------------------------------------
     IF (ZTHIS_PROC>0.) THEN
@@ -840,32 +858,36 @@ IF ( TPFLYER%FLY) THEN
 !*      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
+      SELECT TYPE ( TPFLYER )
+        CLASS IS ( TBALLOONDATA)
+          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) )
+          END IF
+
+        CLASS IS ( TAIRCRAFTDATA)
+          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 SELECT
 !
 !----------------------------------------------------------------------------
 !
@@ -1273,49 +1295,52 @@ IF ( TPFLYER%FLY) THEN
 !*      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))
-        END IF
-      END IF
+      SELECT TYPE ( TPFLYER )
+        CLASS IS ( TBALLOONDATA)
+          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))
+            END IF
+          END IF
+      END SELECT
 !
 !----------------------------------------------------------------------------
   END IF
@@ -1324,53 +1349,53 @@ IF ( TPFLYER%FLY) THEN
 !*     10.   AIRCRAFT MOVE (computations done on all processors, to limit exchanges)
 !            -------------
 !
-    IF (TPFLYER%TYPE=='AIRCRA') THEN
+    SELECT TYPE ( TPFLYER )
+      CLASS IS ( TAIRCRAFTDATA )
 !
 !
 !*     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.
+        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 IF
-    !
-    END IF
+        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 IF
+    END SELECT
   !
   END IF
 ! 
@@ -1388,20 +1413,25 @@ 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
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TBALLOONDATA )
+    IF (TPFLYER%TYPE=='CVBALL') THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
+      CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT)
+    ELSE IF (TPFLYER%TYPE=='RADIOS') THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
+    ELSE IF (TPFLYER%TYPE=='ISODEN' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%RHO)
+    END IF
+
+  CLASS IS ( TAIRCRAFTDATA )
+    IF (TPFLYER%ALTDEF) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR)
+    ELSE
+      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
+    ENDIF
+END SELECT
 !
 !*     11.2  data stored
 !            -----------
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 367f70535..ba176c69a 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -5,6 +5,7 @@
 !-----------------------------------------------------------------
 ! Modifications:
 !  P. Wautelet 01/10/2020: bugfix: DEFAULT_FLYER: add missing default values
+!  P. Wautelet    06/2022: reorganize flyers
 !-----------------------------------------------------------------
 
 !      #########################
@@ -306,7 +307,7 @@ CONTAINS
 !----------------------------------------------------------------------------
 SUBROUTINE DEFAULT_FLYER(TPFLYER)
 !
-TYPE(FLYER), INTENT(OUT) :: TPFLYER
+CLASS(TFLYERDATA), INTENT(OUT) :: TPFLYER
 !
 !
 TPFLYER%NMODEL = 0
@@ -319,25 +320,29 @@ TPFLYER%FLY    = .FALSE.
 !
 TPFLYER%TFLYER_TIME%XTSTEP = 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.
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    TPFLYER%SEG     = 0
+    TPFLYER%SEGCURN = 1
+    TPFLYER%SEGCURT = 0.
+    TPFLYER%ALTDEF  = .FALSE.
+
+  CLASS IS ( TBALLOONDATA )
+    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
+
+END SELECT
 !
 TPFLYER%X_CUR   = XUNDEF
 TPFLYER%Y_CUR   = XUNDEF
@@ -350,7 +355,7 @@ END SUBROUTINE DEFAULT_FLYER
 SUBROUTINE ALLOCATE_FLYER(TPFLYER)
 !
 !
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
 !
 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
 IF (IMI /= TPFLYER%NMODEL .AND. .NOT. (IMI==1 .AND. TPFLYER%NMODEL==0) ) RETURN
@@ -448,8 +453,8 @@ SUBROUTINE INI_LAUNCH(KNBR,TPFLYER)
 !
 use MODE_IO_FIELD_READ, only: IO_Field_read
 !
-INTEGER,     INTENT(IN)    :: KNBR
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
+INTEGER,             INTENT(IN)    :: KNBR
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
 !
 !
 !
@@ -599,8 +604,8 @@ END SUBROUTINE INI_LAUNCH
 !----------------------------------------------------------------------------
 SUBROUTINE INI_FLIGHT(KNBR,TPFLYER)
 !
-INTEGER,     INTENT(IN)    :: KNBR
-TYPE(FLYER), INTENT(INOUT) :: TPFLYER
+INTEGER,              INTENT(IN)    :: KNBR
+CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER
 !
 IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index cc6b45b24..eb35a5c24 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -34,6 +34,7 @@
 !!              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
@@ -45,151 +46,156 @@ use modd_type_date,     only: date_time
 
 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
-!
-TYPE(TSTATPROFTIME)           :: TFLYER_TIME ! Time management for flyer
-!
-!* 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
-!
-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
-!
 !-------------------------------------------------------------------------------------------
 !
 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
-!
+TYPE :: TFLYERDATA
+  !
+  !* 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
+  !
+  TYPE(TSTATPROFTIME)           :: TFLYER_TIME ! Time management for flyer
+  !
+  !* 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
+  !
+  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 TFLYERDATA
+
+TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
+  !
+  !* 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
+END TYPE TAIRCRAFTDATA
+
+TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
+  !
+  !* 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')
+END TYPE TBALLOONDATA
+
+TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON2 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON3 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON4 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON5 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON6 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON7 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON8 ! characteristics and records of a balloon
+TYPE(TBALLOONDATA) :: TBALLOON9 ! characteristics and records of a balloon
+
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT1 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT2 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT3 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT4 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT5 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT6 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT7 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT8 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT9 ! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT10! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT11! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT12! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT13! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT14! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT15! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT16! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT17! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT18! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT19! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT20! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT21! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT22! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT23! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT24! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT25! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT26! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT27! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT28! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT29! characteristics and records of an aircraft
+TYPE(TAIRCRAFTDATA) :: TAIRCRAFT30! characteristics and records of an aircraft
+
 END MODULE MODD_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index e9a4ab409..4bf6970fa 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -72,6 +72,7 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON
 !  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
@@ -167,7 +168,7 @@ use modd_field,  only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NM
 
 use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
-TYPE(FLYER),        INTENT(IN)       :: TPFLYER
+CLASS(TFLYERDATA), INTENT(IN)       :: TPFLYER
 !
 !*      0.2  declaration of local variables for diachro
 !
@@ -253,19 +254,30 @@ 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
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    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
+
+  CLASS IS ( TBALLOONDATA )
+    JPROC = JPROC + 1
+    YTITLE   (JPROC) = 'Z'
+    YUNIT    (JPROC) = 'm'
+    YCOMMENT (JPROC) = 'altitude'
+    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:)
+
+END SELECT
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'LON'
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 8d20985f5..8332daba1 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.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.
@@ -57,7 +57,8 @@ END MODULE MODI_WRITE_BALLOON_n
 !!    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
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -99,7 +100,7 @@ SUBROUTINE WRITE_LFI_BALLOON(TPFLYER)
 use modd_field,          only: tfieldmetadata, TYPEREAL
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 !
-TYPE(FLYER),        INTENT(IN)       :: TPFLYER
+TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER
 !
 !
 !*       0.2   Declarations of local variables
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 6172e8a6a..f2d57806c 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-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.
@@ -95,7 +95,7 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields,       &
 !*       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: tfieldmetadata_base
@@ -112,7 +112,7 @@ class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfi
 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
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 !
 !*       0.1   Local variables
 !              ---------------
@@ -142,7 +142,7 @@ end subroutine Write_diachro
 !-----------------------------------------------------------------------------
 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, &
@@ -167,7 +167,7 @@ type(tbudiachrometadata),                           intent(in)           :: tpbu
 class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfields
 type(date_time),            dimension(:),           intent(in)           :: tpdates
 real,                       dimension(:,:,:,:,:,:), intent(in)           :: pvar
-type(flyer),                                        intent(in), optional :: tpflyer
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 
 integer, parameter :: LFITITLELGT = 100
 integer, parameter :: LFIUNITLGT = 100
@@ -792,7 +792,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,                     &
@@ -813,7 +813,7 @@ type(tbudiachrometadata),                           intent(in)           :: tpbu
 class(tfieldmetadata_base), dimension(:),           intent(in)           :: tpfields
 real,                       dimension(:,:,:,:,:,:), intent(in)           :: pvar
 logical,                                            intent(in), optional :: osplit
-type(flyer),                                        intent(in), optional :: tpflyer
+class(tflyerdata),                                  intent(in), optional :: tpflyer
 
 character(len=:), allocatable :: ycategory
 character(len=:), allocatable :: ylevelname
-- 
GitLab


From 2b47da0f82b3515ee9b3aec69c2cd13ba830b6b7 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 2 Jun 2022 10:36:17 +0200
Subject: [PATCH 071/157] Philippe 02/06/2022: fix: remove XLAM_CRAD
 declaration

---
 src/MNH/profilern.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index 5554c6cd2..71d4514af 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -210,7 +210,7 @@ REAL, DIMENSION(SIZE(PR,3))    :: ZRHODREFZ ! vertical profile of dry air densit
 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,3),SIZE(PR,4)+1) :: ZRZ  ! vertical profile of hydrometeor mixing ratios
-REAL                           :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD,XLAM_CRAD   ! generic microphysical parameters
+REAL                           :: ZA,ZB,ZCC,ZCX,ZALPHA,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
-- 
GitLab


From 97c47427ae6dce1d972a1aef5a890b864203b3b9 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Mon, 16 May 2022 18:14:51 +0200
Subject: [PATCH 072/157] Quentin 16/05/2022: PSEA allocation not done with
 aircraft_balloon with CSURF=EXTE

(cherry picked from commit 9e835a3e815e34dabe989994ed01e1c972d13c12)
---
 src/MNH/aircraft_balloon.f90      |  2 +-
 src/MNH/aircraft_balloon_evol.f90 |  2 +-
 src/MNH/modeln.f90                | 17 ++++++++++++++---
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 7538a4068..4dd66cdde 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -34,7 +34,7 @@ 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(:,:),INTENT(IN) :: PSEA
+REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA
 ! -- OC
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 719d5de2f..0ac512afb 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -37,7 +37,7 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the re
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
 !
 CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER! balloon/aircraft
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 2582fea44..01be40645 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -2104,12 +2104,23 @@ XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS
 !
 ZTIME1 = ZTIME2
 !
-IF (LFLYER)                                                                   &
-  CALL AIRCRAFT_BALLOON(XTSTEP,                                               &
+IF (LFLYER) THEN
+  IF (CSURF=='EXTE') 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(:,:))
-
+    DEALLOCATE(ZSEA)
+  ELSE
+    CALL AIRCRAFT_BALLOON(XTSTEP,                                             &
+                      XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI,              &
+                      XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD,  &
+                      XRHODREF,XCIT)
+  END IF
+END IF
 
 !-------------------------------------------------------------------------------
 !
-- 
GitLab


From c3a8d3ec02eebcd29dd58ce229401cc2b0c919a9 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 2 Jun 2022 14:22:18 +0200
Subject: [PATCH 073/157] Philippe 02/06/2022: flyers: set default values
 directly in type declarations

---
 src/MNH/ini_aircraft_balloon.f90  | 88 -------------------------------
 src/MNH/modd_aircraft_balloon.f90 | 75 +++++++++++++-------------
 2 files changed, 38 insertions(+), 125 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index ba176c69a..996ff864d 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -153,47 +153,6 @@ 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
 !
 !----------------------------------------------------------------------------
@@ -305,53 +264,6 @@ CONTAINS
 !
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE DEFAULT_FLYER(TPFLYER)
-!
-CLASS(TFLYERDATA), INTENT(OUT) :: TPFLYER
-!
-!
-TPFLYER%NMODEL = 0
-TPFLYER%MODEL = 'FIX'
-TPFLYER%TYPE   = '      '
-TPFLYER%TITLE  = '        '
-TPFLYER%LAUNCH = TPDTSEG
-TPFLYER%CRASH  = .FALSE.
-TPFLYER%FLY    = .FALSE.
-!
-TPFLYER%TFLYER_TIME%XTSTEP = 60. ! s
-!
-SELECT TYPE ( TPFLYER )
-  CLASS IS ( TAIRCRAFTDATA )
-    TPFLYER%SEG     = 0
-    TPFLYER%SEGCURN = 1
-    TPFLYER%SEGCURT = 0.
-    TPFLYER%ALTDEF  = .FALSE.
-
-  CLASS IS ( TBALLOONDATA )
-    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
-
-END SELECT
-!
-TPFLYER%X_CUR   = XUNDEF
-TPFLYER%Y_CUR   = XUNDEF
-TPFLYER%Z_CUR   = XUNDEF
-TPFLYER%P_CUR   = XUNDEF
-!
-END SUBROUTINE DEFAULT_FLYER
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
 SUBROUTINE ALLOCATE_FLYER(TPFLYER)
 !
 !
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index eb35a5c24..ea5b7e418 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -41,6 +41,7 @@
 !             ------------
 !
 !
+use modd_parameters,    only: XUNDEF
 USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME
 use modd_type_date,     only: date_time
 
@@ -48,37 +49,37 @@ implicit none
 
 !-------------------------------------------------------------------------------------------
 !
-LOGICAL     :: LFLYER    ! flag to use aircraft/balloons
+LOGICAL :: LFLYER    ! flag to use aircraft/balloons
 !
 TYPE :: TFLYERDATA
   !
   !* 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
+  CHARACTER(LEN=3)    :: MODEL = '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
+  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 = .FALSE. ! occurence of crash
+  LOGICAL             :: FLY   = .FALSE. ! occurence of flying
   !
   !* storage monitoring
   !
-  TYPE(TSTATPROFTIME)           :: TFLYER_TIME ! Time management for flyer
+  TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer
   !
   !* 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)
+  REAL :: X_CUR = XUNDEF ! current x
+  REAL :: Y_CUR = XUNDEF ! current y
+  REAL :: Z_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
+  REAL :: P_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
   !
   !* data records
   !
@@ -122,9 +123,9 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   !
   !* aircraft flight definition
   !
-  INTEGER                       :: SEG      ! number of aircraft flight segments
-  INTEGER                       :: SEGCURN  ! current flight segment number
-  REAL                          :: SEGCURT  ! current flight segment time spent
+  INTEGER :: SEG     = 0  ! number of aircraft flight segments
+  INTEGER :: SEGCURN = 1  ! current flight segment number
+  REAL    :: SEGCURT = 0. ! 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)
@@ -135,26 +136,26 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   !
   !* aircraft altitude type definition
   !
-  LOGICAL                       :: ALTDEF   ! TRUE == altitude given in pressure
+  LOGICAL                       :: ALTDEF = .FALSE.  ! TRUE == altitude given in pressure
 END TYPE TAIRCRAFTDATA
 
 TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
   !
   !* 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')
+  REAL :: LAT      = XUNDEF ! latitude of launch
+  REAL :: LON      = XUNDEF ! lontitude of launch
+  REAL :: XLAUNCH  = XUNDEF ! X coordinate of launch
+  REAL :: YLAUNCH  = XUNDEF ! Y coordinate of launch
+  REAL :: ALT      = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
+  REAL :: WASCENT  = 5.     ! ascent vertical speed, m/s (if 'RADIOS')
+  REAL :: RHO      = XUNDEF ! density of launch (if 'ISODEN')
+  REAL :: PRES     = XUNDEF ! pressure of launch (if 'ISODEN')
+  REAL :: DIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL')
+  REAL :: AERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL')
+  REAL :: INDDRAG  = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
+  REAL :: VOLUME   = XUNDEF ! volume of the balloon (m3) (if 'CVBALL')
+  REAL :: MASS     = XUNDEF ! mass of the balloon (kg) (if 'CVBALL')
 END TYPE TBALLOONDATA
 
 TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon
-- 
GitLab


From 45120a8259cfebcf7879c8b1e3e84c07a9153dee Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 2 Jun 2022 14:36:11 +0200
Subject: [PATCH 074/157] Philippe 02/06/2022: flyers: put all aircrafts in
 TAIRCRAFTS and balloons in TBALLOONS (array instead of separated variables)

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  47 +-
 src/MNH/aircraft_balloon.f90                | 211 +--------
 src/MNH/ini_aircraft.f90                    | 464 +++++++++++---------
 src/MNH/ini_aircraft_balloon.f90            |  99 +----
 src/MNH/ini_balloon.f90                     | 316 +++++++------
 src/MNH/modd_aircraft_balloon.f90           |  46 +-
 src/MNH/write_aircraft_balloon.f90          |  48 +-
 src/MNH/write_balloonn.f90                  |  14 +-
 8 files changed, 488 insertions(+), 757 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 8344bffc6..26d8ab705 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1855,46 +1855,13 @@ 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 )
+      do ji = 1, nballoons
+        call Write_flyer_time_coord( tballoons(ji) )
+      end do
+
+      do ji = 1, naircrafts
+        call Write_flyer_time_coord( taircrafts(ji) )
+      end do
     end if
 
   end if !MNHDIACHRONIC
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 4dd66cdde..0c46dd014 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -130,13 +130,13 @@ 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(:,:),     INTENT(IN)     :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
 !       0.2  declaration of local variables
 !
-!
+INTEGER :: JI
 !----------------------------------------------------------------------------
 IF(.NOT. ALLOCATED(XTHW_FLUX)) &
 ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
@@ -145,202 +145,17 @@ 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
+DO JI = 1, NBALLOONS
+  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,          &
+                              PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
+                              TBALLOONS(JI), PSEA                                      )
+END DO
+!
+DO JI = 1, NBALLOONS
+  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,          &
+                              PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
+                              TAIRCRAFTS(JI), PSEA                                     )
+END DO
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index 254889818..08d1a5e06 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -83,16 +83,16 @@
 !!    -------------
 !!     Original 15/05/2000
 !!             Sept2009, A. Boilley add initialisation of aircraft altitude by Z
-!!
-!!
-!! --------------------------------------------------------------------------
+!  P. Wautelet    06/2022: reorganize flyers
+! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-!
-!
+
+USE MODE_MSG
+
 IMPLICIT NONE
 !
 !
@@ -105,54 +105,60 @@ IMPLICIT NONE
 !
 !
 !----------------------------------------------------------------------------
+NAIRCRAFTS = 0
+
+ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
+
+IF ( NAIRCRAFTS < 1 ) RETURN
 !
 !*      1.   Aircraft number 1
 !            -----------------
+#if 0
 !
 !* model number
 !
-TAIRCRAFT1%NMODEL             = 0
+TAIRCRAFTS(1)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT1%MODEL              = 'FIX'
+TAIRCRAFTS(1)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT1%TYPE               = 'AIRCRA'
+TAIRCRAFTS(1)%TYPE               = 'AIRCRA'
 !
 !* aircraft flight name
 !
-TAIRCRAFT1%TITLE             = 'DIMO19A'  
+TAIRCRAFTS(1)%TITLE             = 'DIMO19A'
 !
 !* time step for storage
 !
-TAIRCRAFT1%TFLYER_TIME%XTSTEP = 60.
+TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFT1%LAUNCH%nyear  =  2007
-TAIRCRAFT1%LAUNCH%nmonth =    04
-TAIRCRAFT1%LAUNCH%nday   =    19
-TAIRCRAFT1%LAUNCH%xtime  = 32280.
+TAIRCRAFTS(1)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(1)%LAUNCH%nmonth =    04
+TAIRCRAFTS(1)%LAUNCH%nday   =    19
+TAIRCRAFTS(1)%LAUNCH%xtime  = 32280.
 !
 !* number of flight segments
 !
-TAIRCRAFT1%SEG                = 168 
+TAIRCRAFTS(1)%SEG                = 168
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT1%ALTDEF             = .TRUE.
+TAIRCRAFTS(1)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT1%SEGTIME(TAIRCRAFT1%SEG  ))
-ALLOCATE(TAIRCRAFT1%SEGLAT (TAIRCRAFT1%SEG+1))
-ALLOCATE(TAIRCRAFT1%SEGLON (TAIRCRAFT1%SEG+1))
+ALLOCATE(TAIRCRAFTS(1)%SEGTIME(TAIRCRAFTS(1)%SEG  ))
+ALLOCATE(TAIRCRAFTS(1)%SEGLAT (TAIRCRAFTS(1)%SEG+1))
+ALLOCATE(TAIRCRAFTS(1)%SEGLON (TAIRCRAFTS(1)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT1%SEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(1)%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,&
@@ -184,7 +190,7 @@ TAIRCRAFT1%SEGTIME      = (/ 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,&
+TAIRCRAFTS(1)%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,&
@@ -222,7 +228,7 @@ TAIRCRAFT1%SEGLAT  = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,&
 !* 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,&
+TAIRCRAFTS(1)%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,&
@@ -255,14 +261,14 @@ TAIRCRAFT1%SEGLON   = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,&
  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  /) 
+ 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,&
+IF (TAIRCRAFTS(1)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(1)%SEGP   (TAIRCRAFTS(1)%SEG+1))
+  TAIRCRAFTS(1)%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,&
@@ -297,8 +303,8 @@ IF (TAIRCRAFT1%ALTDEF) THEN
  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,&
+  ALLOCATE(TAIRCRAFTS(1)%SEGZ   (TAIRCRAFTS(1)%SEG+1))
+TAIRCRAFTS(1)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -331,58 +337,63 @@ 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  /)
 ENDIF
 !
+IF ( NAIRCRAFTS < 2 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      1.   Aircraft number 2
 !            -----------------
+#if 0
 !
 !* model number
 !
-TAIRCRAFT2%NMODEL             = 0
+TAIRCRAFTS(2)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT2%MODEL              = 'FIX'
+TAIRCRAFTS(2)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT2%TYPE               = 'AIRCRA'
+TAIRCRAFTS(2)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT2%TITLE             = 'DIMO19B'  
+TAIRCRAFTS(2)%TITLE             = 'DIMO19B'
 !
 !* time step for storage
 !
-TAIRCRAFT2%TFLYER_TIME%XTSTEP = 60.
+TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFT2%LAUNCH%nyear  =  2007
-TAIRCRAFT2%LAUNCH%nmonth =    04
-TAIRCRAFT2%LAUNCH%nday   =    19
-TAIRCRAFT2%LAUNCH%xtime  = 48060.
+TAIRCRAFTS(2)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(2)%LAUNCH%nmonth =    04
+TAIRCRAFTS(2)%LAUNCH%nday   =    19
+TAIRCRAFTS(2)%LAUNCH%xtime  = 48060.
 !
 !* number of flight segments
 !
-TAIRCRAFT2%SEG                = 198 
+TAIRCRAFTS(2)%SEG                = 198
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT2%ALTDEF             = .TRUE.
+TAIRCRAFTS(2)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT2%SEGTIME(TAIRCRAFT2%SEG  ))
-ALLOCATE(TAIRCRAFT2%SEGLAT (TAIRCRAFT2%SEG+1))
-ALLOCATE(TAIRCRAFT2%SEGLON (TAIRCRAFT2%SEG+1))
+ALLOCATE(TAIRCRAFTS(2)%SEGTIME(TAIRCRAFTS(2)%SEG  ))
+ALLOCATE(TAIRCRAFTS(2)%SEGLAT (TAIRCRAFTS(2)%SEG+1))
+ALLOCATE(TAIRCRAFTS(2)%SEGLON (TAIRCRAFTS(2)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT2%SEGTIME     = (/60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(2)%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,&
@@ -419,7 +430,7 @@ TAIRCRAFT2%SEGTIME     = (/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,&
+TAIRCRAFTS(2)%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,&
@@ -463,7 +474,7 @@ TAIRCRAFT2%SEGLAT      = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,&
 !* 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,&
+TAIRCRAFTS(2)%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,&
@@ -507,9 +518,9 @@ TAIRCRAFT2%SEGLON      = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,&
 !* 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,&
+IF (TAIRCRAFTS(2)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(2)%SEGP   (TAIRCRAFTS(2)%SEG+1))
+TAIRCRAFTS(2)%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,&
@@ -550,8 +561,8 @@ TAIRCRAFT2%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.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,&
+  ALLOCATE(TAIRCRAFTS(2)%SEGZ   (TAIRCRAFTS(2)%SEG+1))
+  TAIRCRAFTS(2)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -593,55 +604,60 @@ ELSE
 8000,8000,8000,8000  /)
 ENDIF
 !
+IF ( NAIRCRAFTS < 3 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      1.   Aircraft number 3
 !            -----------------
+#if 0
 !
 !* model number
 !
-TAIRCRAFT3%NMODEL             = 0
+TAIRCRAFTS(3)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT3%MODEL              = 'FIX'
+TAIRCRAFTS(3)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT3%TYPE               = 'AIRCRA'
+TAIRCRAFTS(3)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT3%TITLE             = 'SAAL19A'
+TAIRCRAFTS(3)%TITLE             = 'SAAL19A'
 !
 !* time step for storage
 !
-TAIRCRAFT3%TFLYER_TIME%XTSTEP = 30.
+TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFT3%LAUNCH%nyear  =  2007
-TAIRCRAFT3%LAUNCH%nmonth =    04
-TAIRCRAFT3%LAUNCH%nday   =    19
-TAIRCRAFT3%LAUNCH%xtime  = 45369
+TAIRCRAFTS(3)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(3)%LAUNCH%nmonth =    04
+TAIRCRAFTS(3)%LAUNCH%nday   =    19
+TAIRCRAFTS(3)%LAUNCH%xtime  = 45369
 !
 !* number of flight segments
 !
-TAIRCRAFT3%SEG                = 39
+TAIRCRAFTS(3)%SEG                = 39
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT3%ALTDEF             = .TRUE.
+TAIRCRAFTS(3)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT3%SEGTIME(TAIRCRAFT3%SEG  ))
-ALLOCATE(TAIRCRAFT3%SEGLAT (TAIRCRAFT3%SEG+1))
-ALLOCATE(TAIRCRAFT3%SEGLON (TAIRCRAFT3%SEG+1))
+ALLOCATE(TAIRCRAFTS(3)%SEGTIME(TAIRCRAFTS(3)%SEG  ))
+ALLOCATE(TAIRCRAFTS(3)%SEGLAT (TAIRCRAFTS(3)%SEG+1))
+ALLOCATE(TAIRCRAFTS(3)%SEGLON (TAIRCRAFTS(3)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT3%SEGTIME = (/   15,   16,   16,   18,   17,   17,&
+TAIRCRAFTS(3)%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,&
@@ -653,7 +669,7 @@ TAIRCRAFT3%SEGTIME = (/   15,   16,   16,   18,   17,   17,&
 !* 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,&
+TAIRCRAFTS(3)%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,&
@@ -665,7 +681,7 @@ TAIRCRAFT3%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,&
 !* 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,&
+TAIRCRAFTS(3)%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,&
@@ -677,9 +693,9 @@ TAIRCRAFT3%SEGLON   = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,&
 !* 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,&
+IF (TAIRCRAFTS(3)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(3)%SEGP   (TAIRCRAFTS(3)%SEG+1))
+TAIRCRAFTS(3)%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,&
@@ -688,8 +704,8 @@ TAIRCRAFT3%SEGP    = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,&
  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,&
+  ALLOCATE(TAIRCRAFTS(3)%SEGZ   (TAIRCRAFTS(3)%SEG+1))
+  TAIRCRAFTS(3)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -698,57 +714,61 @@ ELSE
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000  /)
 ENDIF
- 
 !
+IF ( NAIRCRAFTS < 4 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      1.   Aircraft number 4
 !            -----------------
+#if 0
 !
 !* model number
 !
-TAIRCRAFT4%NMODEL             = 0
+TAIRCRAFTS(4)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT4%MODEL              = 'FIX'
+TAIRCRAFTS(4)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT4%TYPE               = 'AIRCRA'
+TAIRCRAFTS(4)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT4%TITLE             = 'SAAL19B'
+TAIRCRAFTS(4)%TITLE             = 'SAAL19B'
 !
 !* time step for storage
 !
-TAIRCRAFT4%TFLYER_TIME%XTSTEP = 30.
+TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFT4%LAUNCH%nyear  =  2007
-TAIRCRAFT4%LAUNCH%nmonth =    04
-TAIRCRAFT4%LAUNCH%nday   =    19
-TAIRCRAFT4%LAUNCH%xtime  = 60392.
+TAIRCRAFTS(4)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(4)%LAUNCH%nmonth =    04
+TAIRCRAFTS(4)%LAUNCH%nday   =    19
+TAIRCRAFTS(4)%LAUNCH%xtime  = 60392.
 !
 !* number of flight segments
 !
-TAIRCRAFT4%SEG                = 39
+TAIRCRAFTS(4)%SEG                = 39
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT4%ALTDEF             = .TRUE.
+TAIRCRAFTS(4)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT4%SEGTIME(TAIRCRAFT4%SEG  ))
-ALLOCATE(TAIRCRAFT4%SEGLAT (TAIRCRAFT4%SEG+1))
-ALLOCATE(TAIRCRAFT4%SEGLON (TAIRCRAFT4%SEG+1))
+ALLOCATE(TAIRCRAFTS(4)%SEGTIME(TAIRCRAFTS(4)%SEG  ))
+ALLOCATE(TAIRCRAFTS(4)%SEGLAT (TAIRCRAFTS(4)%SEG+1))
+ALLOCATE(TAIRCRAFTS(4)%SEGLON (TAIRCRAFTS(4)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT4%SEGTIME = (/ 36,   18,   18,   21,   24,   23,&
+TAIRCRAFTS(4)%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,&
@@ -759,7 +779,7 @@ TAIRCRAFT4%SEGTIME = (/ 36,   18,   18,   21,   24,   23,&
 !* 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,&
+TAIRCRAFTS(4)%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,&
@@ -771,7 +791,7 @@ TAIRCRAFT4%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,&
 !* 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,&
+TAIRCRAFTS(4)%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,&
@@ -783,9 +803,9 @@ TAIRCRAFT4%SEGLON  = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,&
 !* 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,&
+IF (TAIRCRAFTS(4)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(4)%SEGP   (TAIRCRAFTS(4)%SEG+1))
+TAIRCRAFTS(4)%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,&
@@ -794,8 +814,8 @@ TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,&
  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,&
+  ALLOCATE(TAIRCRAFTS(4)%SEGZ   (TAIRCRAFTS(4)%SEG+1))
+  TAIRCRAFTS(4)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -804,57 +824,61 @@ TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000/)
 ENDIF
-
 !
+IF ( NAIRCRAFTS < 5 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      1.   Aircraft number 5
 !            -----------------
+#if 0
 !
 !* model number
 !
-TAIRCRAFT5%NMODEL             = 0
+TAIRCRAFTS(5)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT5%MODEL              = 'FIX'
+TAIRCRAFTS(5)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT5%TYPE               = 'AIRCRA'
+TAIRCRAFTS(5)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT5%TITLE             = 'SAIB19A'
+TAIRCRAFTS(5)%TITLE             = 'SAIB19A'
 !
 !* time step for storage
 !
-TAIRCRAFT5%TFLYER_TIME%XTSTEP = 30.
+TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFT5%LAUNCH%nyear  =  2007
-TAIRCRAFT5%LAUNCH%nmonth =    04
-TAIRCRAFT5%LAUNCH%nday   =    19
-TAIRCRAFT5%LAUNCH%xtime  = 43380.
+TAIRCRAFTS(5)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(5)%LAUNCH%nmonth =    04
+TAIRCRAFTS(5)%LAUNCH%nday   =    19
+TAIRCRAFTS(5)%LAUNCH%xtime  = 43380.
 !
 !* number of flight segments
 !
-TAIRCRAFT5%SEG                = 176
+TAIRCRAFTS(5)%SEG                = 176
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT5%ALTDEF             = .TRUE.
+TAIRCRAFTS(5)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT5%SEGTIME(TAIRCRAFT5%SEG  ))
-ALLOCATE(TAIRCRAFT5%SEGLAT (TAIRCRAFT5%SEG+1))
-ALLOCATE(TAIRCRAFT5%SEGLON (TAIRCRAFT5%SEG+1))
+ALLOCATE(TAIRCRAFTS(5)%SEGTIME(TAIRCRAFTS(5)%SEG  ))
+ALLOCATE(TAIRCRAFTS(5)%SEGLAT (TAIRCRAFTS(5)%SEG+1))
+ALLOCATE(TAIRCRAFTS(5)%SEGLON (TAIRCRAFTS(5)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT5%SEGTIME = (/  28,   28,   29,   29,   29,   28,&
+TAIRCRAFTS(5)%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,&
@@ -889,7 +913,7 @@ TAIRCRAFT5%SEGTIME = (/  28,   28,   29,   29,   29,   28,&
 !* 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,&
+TAIRCRAFTS(5)%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,&
@@ -930,7 +954,7 @@ TAIRCRAFT5%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,&
 !* 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,&
+TAIRCRAFTS(5)%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,&
@@ -971,9 +995,9 @@ TAIRCRAFT5%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,&
 !* 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,&
+IF (TAIRCRAFTS(5)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(5)%SEGP   (TAIRCRAFTS(5)%SEG+1))
+TAIRCRAFTS(5)%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,&
@@ -1010,8 +1034,8 @@ TAIRCRAFT5%SEGP  = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,&
  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,&
+  ALLOCATE(TAIRCRAFTS(5)%SEGZ   (TAIRCRAFTS(5)%SEG+1))
+  TAIRCRAFTS(5)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1049,56 +1073,60 @@ TAIRCRAFT5%SEGP  = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,&
 8000,8000/)
 ENDIF
 !
-!
+IF ( NAIRCRAFTS < 6 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      1.   Aircraft number 6
 !            -----------------
 !
+#if 0
 !* model number
 !
-TAIRCRAFT6%NMODEL             = 0
+TAIRCRAFTS(6)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT6%MODEL              = 'FIX'
+TAIRCRAFTS(6)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT6%TYPE               = 'AIRCRA'
+TAIRCRAFTS(6)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT6%TITLE             = 'SAIB19B'
+TAIRCRAFTS(6)%TITLE             = 'SAIB19B'
 !
 !* time step for storage
 !
-TAIRCRAFT6%TFLYER_TIME%XTSTEP = 30.
+TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFT6%LAUNCH%nyear  =  2007
-TAIRCRAFT6%LAUNCH%nmonth =    04
-TAIRCRAFT6%LAUNCH%nday   =    19
-TAIRCRAFT6%LAUNCH%xtime  = 55992.
+TAIRCRAFTS(6)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(6)%LAUNCH%nmonth =    04
+TAIRCRAFTS(6)%LAUNCH%nday   =    19
+TAIRCRAFTS(6)%LAUNCH%xtime  = 55992.
 !
 !* number of flight segments
 !
-TAIRCRAFT6%SEG                = 179
+TAIRCRAFTS(6)%SEG                = 179
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT6%ALTDEF             = .TRUE.
+TAIRCRAFTS(6)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT6%SEGTIME(TAIRCRAFT6%SEG  ))
-ALLOCATE(TAIRCRAFT6%SEGLAT (TAIRCRAFT6%SEG+1))
-ALLOCATE(TAIRCRAFT6%SEGLON (TAIRCRAFT6%SEG+1))
+ALLOCATE(TAIRCRAFTS(6)%SEGTIME(TAIRCRAFTS(6)%SEG  ))
+ALLOCATE(TAIRCRAFTS(6)%SEGLAT (TAIRCRAFTS(6)%SEG+1))
+ALLOCATE(TAIRCRAFTS(6)%SEGLON (TAIRCRAFTS(6)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT6%SEGTIME = (/ 27,   25,   26,   25,   25,   25,&
+TAIRCRAFTS(6)%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,&
@@ -1132,7 +1160,7 @@ TAIRCRAFT6%SEGTIME = (/ 27,   25,   26,   25,   25,   25,&
 !* 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,&
+TAIRCRAFTS(6)%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,&
@@ -1172,7 +1200,7 @@ TAIRCRAFT6%SEGLAT = (/  44.14614, 44.14841, 44.15199, 44.15888, 44.16587,&
 !* 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,&
+TAIRCRAFTS(6)%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,&
@@ -1212,9 +1240,9 @@ TAIRCRAFT6%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,&
 !* 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,&
+IF (TAIRCRAFTS(6)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(6)%SEGP   (TAIRCRAFTS(6)%SEG+1))
+TAIRCRAFTS(6)%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,&
@@ -1251,8 +1279,8 @@ TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,&
  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,&
+  ALLOCATE(TAIRCRAFTS(6)%SEGZ   (TAIRCRAFTS(6)%SEG+1))
+  TAIRCRAFTS(6)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1290,56 +1318,61 @@ TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,&
 8000,8000,8000,8000,8000/)
 ENDIF 
 !
+IF ( NAIRCRAFTS < 7 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !
 !*      1.   Aircraft number 7
 !            -----------------
 !
+#if 0
 !* model number
 !
-TAIRCRAFT7%NMODEL             = 0
+TAIRCRAFTS(7)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT7%MODEL              = 'FIX'
+TAIRCRAFTS(7)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT7%TYPE               = 'AIRCRA'
+TAIRCRAFTS(7)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT7%TITLE             = 'TEST_19'
+TAIRCRAFTS(7)%TITLE             = 'TEST_19'
 !
 !* time step for storage
 !
-TAIRCRAFT7%TFLYER_TIME%XTSTEP = 60.
+TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFT7%LAUNCH%nyear  =  2007
-TAIRCRAFT7%LAUNCH%nmonth =    04
-TAIRCRAFT7%LAUNCH%nday   =    19
-TAIRCRAFT7%LAUNCH%xtime  = 43500.
+TAIRCRAFTS(7)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(7)%LAUNCH%nmonth =    04
+TAIRCRAFTS(7)%LAUNCH%nday   =    19
+TAIRCRAFTS(7)%LAUNCH%xtime  = 43500.
 !
 !* number of flight segments
 !
-TAIRCRAFT7%SEG                = 207
+TAIRCRAFTS(7)%SEG                = 207
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT7%ALTDEF             = .TRUE.
+TAIRCRAFTS(7)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT7%SEGTIME(TAIRCRAFT7%SEG  ))
-ALLOCATE(TAIRCRAFT7%SEGLAT (TAIRCRAFT7%SEG+1))
-ALLOCATE(TAIRCRAFT7%SEGLON (TAIRCRAFT7%SEG+1))
+ALLOCATE(TAIRCRAFTS(7)%SEGTIME(TAIRCRAFTS(7)%SEG  ))
+ALLOCATE(TAIRCRAFTS(7)%SEGLAT (TAIRCRAFTS(7)%SEG+1))
+ALLOCATE(TAIRCRAFTS(7)%SEGLON (TAIRCRAFTS(7)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT7%SEGTIME = (/  60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(7)%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,&
@@ -1378,7 +1411,7 @@ TAIRCRAFT7%SEGTIME = (/  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,&
+TAIRCRAFTS(7)%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,&
@@ -1424,7 +1457,7 @@ TAIRCRAFT7%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,&
 !* 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,&
+TAIRCRAFTS(7)%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,&
@@ -1470,9 +1503,9 @@ TAIRCRAFT7%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,&
 !* 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,&
+IF (TAIRCRAFTS(7)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(7)%SEGP   (TAIRCRAFTS(7)%SEG+1))
+TAIRCRAFTS(7)%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,&
@@ -1515,8 +1548,8 @@ TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,&
  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,&
+  ALLOCATE(TAIRCRAFTS(7)%SEGZ   (TAIRCRAFTS(7)%SEG+1))
+  TAIRCRAFTS(7)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1560,57 +1593,60 @@ TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,&
 8000,8000,8000/)
 ENDIF
 !
+IF ( NAIRCRAFTS < 8 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
-!
-!
 !*      1.   Aircraft number 8
 !            -----------------
 !
+#if 0
 !* model number
 !
-TAIRCRAFT8%NMODEL             = 0
+TAIRCRAFTS(8)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT8%MODEL              = 'FIX'
+TAIRCRAFTS(8)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT8%TYPE               = 'AIRCRA'
+TAIRCRAFTS(8)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT8%TITLE             = 'DIMO22B'
+TAIRCRAFTS(8)%TITLE             = 'DIMO22B'
 !
 !* time step for storage
 !
-TAIRCRAFT8%TFLYER_TIME%XTSTEP = 60.
+TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFT8%LAUNCH%nyear  =  2007
-TAIRCRAFT8%LAUNCH%nmonth =    04
-TAIRCRAFT8%LAUNCH%nday   =    22
-TAIRCRAFT8%LAUNCH%xtime  = 45720.
+TAIRCRAFTS(8)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(8)%LAUNCH%nmonth =    04
+TAIRCRAFTS(8)%LAUNCH%nday   =    22
+TAIRCRAFTS(8)%LAUNCH%xtime  = 45720.
 !
 !* number of flight segments
 !
-TAIRCRAFT8%SEG                =  210
+TAIRCRAFTS(8)%SEG                =  210
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT8%ALTDEF             = .TRUE.
+TAIRCRAFTS(8)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT8%SEGTIME(TAIRCRAFT8%SEG  ))
-ALLOCATE(TAIRCRAFT8%SEGLAT (TAIRCRAFT8%SEG+1))
-ALLOCATE(TAIRCRAFT8%SEGLON (TAIRCRAFT8%SEG+1))
+ALLOCATE(TAIRCRAFTS(8)%SEGTIME(TAIRCRAFTS(8)%SEG  ))
+ALLOCATE(TAIRCRAFTS(8)%SEGLAT (TAIRCRAFTS(8)%SEG+1))
+ALLOCATE(TAIRCRAFTS(8)%SEGLON (TAIRCRAFTS(8)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT8%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(8)%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,&
@@ -1649,7 +1685,7 @@ TAIRCRAFT8%SEGTIME = (/   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,&
+TAIRCRAFTS(8)%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,&
@@ -1697,7 +1733,7 @@ TAIRCRAFT8%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,&
 !* 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,&
+TAIRCRAFTS(8)%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,&
@@ -1745,9 +1781,9 @@ TAIRCRAFT8%SEGLON = (/  0.75057, 0.72578, 0.69760, 0.66704, 0.63457,&
 !* 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,&
+IF (TAIRCRAFTS(8)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(8)%SEGP   (TAIRCRAFTS(8)%SEG+1))
+TAIRCRAFTS(8)%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,&
@@ -1791,8 +1827,8 @@ TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,&
  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,&
+  ALLOCATE(TAIRCRAFTS(8)%SEGZ   (TAIRCRAFTS(8)%SEG+1))
+  TAIRCRAFTS(8)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1837,54 +1873,59 @@ TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,&
 8000/)
 ENDIF 
 !
+IF ( NAIRCRAFTS < 9 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !
 !*      1.   Aircraft number 9
 !            -----------------
 !
+#if 0
 !* model number
 !
-TAIRCRAFT9%NMODEL             = 0
+TAIRCRAFTS(9)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFT9%MODEL              = 'FIX'
+TAIRCRAFTS(9)%MODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFT9%TYPE               = 'AIRCRA'
+TAIRCRAFTS(9)%TYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFT9%TITLE             = 'DIMO23A'
+TAIRCRAFTS(9)%TITLE             = 'DIMO23A'
 !
 !* time step for storage
 !
-TAIRCRAFT9%TFLYER_TIME%XTSTEP = 60.
+TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFT9%LAUNCH%nyear  =  2007
-TAIRCRAFT9%LAUNCH%nmonth =    04
-TAIRCRAFT9%LAUNCH%nday   =    23
-TAIRCRAFT9%LAUNCH%xtime  = 28080.
+TAIRCRAFTS(9)%LAUNCH%nyear  =  2007
+TAIRCRAFTS(9)%LAUNCH%nmonth =    04
+TAIRCRAFTS(9)%LAUNCH%nday   =    23
+TAIRCRAFTS(9)%LAUNCH%xtime  = 28080.
 !
 !* number of flight segments
 !
-TAIRCRAFT9%SEG                =   217
+TAIRCRAFTS(9)%SEG                =   217
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFT9%ALTDEF             = .TRUE.
+TAIRCRAFTS(9)%ALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFT9%SEGTIME(TAIRCRAFT9%SEG  ))
-ALLOCATE(TAIRCRAFT9%SEGLAT (TAIRCRAFT9%SEG+1))
-ALLOCATE(TAIRCRAFT9%SEGLON (TAIRCRAFT9%SEG+1))
+ALLOCATE(TAIRCRAFTS(9)%SEGTIME(TAIRCRAFTS(9)%SEG  ))
+ALLOCATE(TAIRCRAFTS(9)%SEGLAT (TAIRCRAFTS(9)%SEG+1))
+ALLOCATE(TAIRCRAFTS(9)%SEGLON (TAIRCRAFTS(9)%SEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFT9%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(9)%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,&
@@ -1926,7 +1967,7 @@ TAIRCRAFT9%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
 !* 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,&
+TAIRCRAFTS(9)%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,&
@@ -1976,7 +2017,7 @@ TAIRCRAFT9%SEGLAT = (/  44.39751, 44.39753, 44.39752, 44.39853, 44.40034,&
 !* 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,&
+TAIRCRAFTS(9)%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,&
@@ -2026,9 +2067,9 @@ TAIRCRAFT9%SEGLON = (/  0.76306, 0.76307, 0.76305, 0.76269, 0.74580,&
 !        (pascals)
 !
 
-IF (TAIRCRAFT9%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFT9%SEGP   (TAIRCRAFT9%SEG+1))
-TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
+IF (TAIRCRAFTS(9)%ALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(9)%SEGP   (TAIRCRAFTS(9)%SEG+1))
+TAIRCRAFTS(9)%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,&
@@ -2073,8 +2114,8 @@ TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
  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,&
+  ALLOCATE(TAIRCRAFTS(9)%SEGZ   (TAIRCRAFTS(9)%SEG+1))
+  TAIRCRAFTS(9)%SEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -2119,6 +2160,9 @@ TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000/)
 ENDIF
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
+#endif
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 996ff864d..5a9c1b141 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -128,6 +128,7 @@ INTEGER :: IMI    ! current model index
 INTEGER :: ISTORE ! number of storage instants
 INTEGER :: ILUOUT ! logical unit
 INTEGER :: IRESP  ! return code
+INTEGER :: JI
 INTEGER :: JSEG   ! loop counter
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
@@ -161,15 +162,9 @@ END IF
 !            ----------------------
 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)
+DO JI = 1, NBALLOONS
+  CALL INI_LAUNCH( JI, TBALLOONS(JI) )
+END DO
 !
 !----------------------------------------------------------------------------
 !
@@ -178,36 +173,9 @@ CALL INI_LAUNCH(9,TBALLOON9)
 !
 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)
+DO JI = 1, NAIRCRAFTS
+  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI) )
+END DO
 !
 !----------------------------------------------------------------------------
 !
@@ -216,46 +184,13 @@ CALL INI_FLIGHT(30,TAIRCRAFT30)
 !
 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)
+DO JI = 1, NBALLOONS
+  CALL ALLOCATE_FLYER( TBALLOONS(JI) )
+END DO
+!
+DO JI = 1, NAIRCRAFTS
+  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI) )
+END DO
 !
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
@@ -402,7 +337,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
   CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP)
   !
   IF ( IRESP /= 0 ) THEN
-    WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE
+    WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%TITLE
   ELSE
     TZFIELD = TFIELDMETADATA(                  &
       CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
@@ -463,7 +398,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
               TPFLYER%X_CUR, TPFLYER%Y_CUR )
     TPFLYER%FLY = .TRUE.
     WRITE(ILUOUT,*) &
-    "INI_LAUCH: Current location read in FM file for ",TPFLYER%TITLE
+    "INI_LAUNCH: 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
@@ -488,7 +423,7 @@ ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
               TPFLYER%X_CUR, TPFLYER%Y_CUR )
       TPFLYER%FLY = .TRUE.
       WRITE(ILUOUT,*) &
-      "INI_LAUCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE
+      "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE
       WRITE(ILUOUT,*) &
             " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR
     END IF
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 5c0095d21..68da88553 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -93,7 +93,7 @@
 !!    -------------
 !!     Original 15/05/2000
 !!              Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models
-!!
+!  P. Wautelet    06/2022: reorganize flyers
 !! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -101,8 +101,9 @@
 !
 USE MODD_AIRCRAFT_BALLOON
 USE MODD_CST
-!
-!
+
+USE MODE_MSG
+
 IMPLICIT NONE
 !
 !
@@ -113,393 +114,430 @@ IMPLICIT NONE
 !
 !       0.2  declaration of local variables
 !
-!
+INTEGER :: JI
 !----------------------------------------------------------------------------
+NBALLOONS = 0
+
+ALLOCATE( TBALLOONS(NBALLOONS) )
+
+IF ( NBALLOONS < 1 ) RETURN
 !
 !*      1.   Balloon number 1
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON1%NMODEL             = 0
-TBALLOON1%MODEL             = 'MOB'
+TBALLOONS(1)%NMODEL             = 0
+TBALLOONS(1)%MODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOON1%TYPE               = 'CVBALL'
+TBALLOONS(1)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON1%TITLE              = 'CVB1MOBI'
+TBALLOONS(1)%TITLE              = 'CVB1MOBI'
 !
 !* launching date and time
 !
-TBALLOON1%LAUNCH%nyear  =  1999
-TBALLOON1%LAUNCH%nmonth =    09
-TBALLOON1%LAUNCH%nday   =    19
-TBALLOON1%LAUNCH%xtime  = 32460.
+TBALLOONS(1)%LAUNCH%nyear  =  1999
+TBALLOONS(1)%LAUNCH%nmonth =    09
+TBALLOONS(1)%LAUNCH%nday   =    19
+TBALLOONS(1)%LAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON1%LAT                = 45.800
-TBALLOON1%LON                =  8.629
+TBALLOONS(1)%LAT                = 45.800
+TBALLOONS(1)%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.
+!TBALLOONS(1)%ALT                =   3959.
+TBALLOONS(1)%PRES               = 98450.
 !
 !* time step for data storage  (s)
 !
-TBALLOON1%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOON1%WASCENT            = 0.
+TBALLOONS(1)%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.)
+TBALLOONS(1)%AERODRAG           = 0.44
+TBALLOONS(1)%INDDRAG           = 0.014
+TBALLOONS(1)%VOLUME           = 3.040
+TBALLOONS(1)%MASS           = 2.4516
+TBALLOONS(1)%DIAMETER           = ((3.*TBALLOONS(1)%VOLUME)/(4.*XPI))**(1./3.)
 !
+IF ( NBALLOONS < 2 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      2.   Balloon number 2
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON2%NMODEL             = 0
-TBALLOON2%MODEL             = 'MOB'
+TBALLOONS(2)%NMODEL             = 0
+TBALLOONS(2)%MODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOON2%TYPE               = 'CVBALL'
+TBALLOONS(2)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON2%TITLE              = 'CVB2MOBI'
+TBALLOONS(2)%TITLE              = 'CVB2MOBI'
 !
 !* launching date and time
 !
-TBALLOON2%LAUNCH%nyear  =  1999
-TBALLOON2%LAUNCH%nmonth =    09
-TBALLOON2%LAUNCH%nday   =    19
-TBALLOON2%LAUNCH%xtime  = 39660.
+TBALLOONS(2)%LAUNCH%nyear  =  1999
+TBALLOONS(2)%LAUNCH%nmonth =    09
+TBALLOONS(2)%LAUNCH%nday   =    19
+TBALLOONS(2)%LAUNCH%xtime  = 39660.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON2%LAT                = 45.800
-TBALLOON2%LON                =  8.630
+TBALLOONS(2)%LAT                = 45.800
+TBALLOONS(2)%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.
+!TBALLOONS(2)%ALT                =   3959.
+TBALLOONS(2)%PRES               = 98490.
 !
 !* time step for data storage  (s)
 !
-TBALLOON2%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOON2%WASCENT            = 0.
+TBALLOONS(2)%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.)
+TBALLOONS(2)%AERODRAG           = 0.44
+TBALLOONS(2)%INDDRAG           = 0.014
+TBALLOONS(2)%VOLUME           = 3.040
+TBALLOONS(2)%MASS           = 2.58087
+TBALLOONS(2)%DIAMETER           = ((3.*TBALLOONS(2)%VOLUME)/(4.*XPI))**(1./3.)
 !
-!-------------------------------------------------------------------------------
+IF ( NBALLOONS < 3 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      3.   Balloon number 3
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON3%NMODEL             = 0
-TBALLOON3%MODEL             = 'MOB'
+TBALLOONS(3)%NMODEL             = 0
+TBALLOONS(3)%MODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOON3%TYPE               = 'RADIOS'
+TBALLOONS(3)%TYPE               = 'RADIOS'
 !
 !* balloon name
 !
-TBALLOON3%TITLE              = 'RSMASE19'
+TBALLOONS(3)%TITLE              = 'RSMASE19'
 !
 !* launching date and time
 !
-TBALLOON3%LAUNCH%nyear  =  1999
-TBALLOON3%LAUNCH%nmonth =    09
-TBALLOON3%LAUNCH%nday   =    19
-TBALLOON3%LAUNCH%xtime  = 68400.
+TBALLOONS(3)%LAUNCH%nyear  =  1999
+TBALLOONS(3)%LAUNCH%nmonth =    09
+TBALLOONS(3)%LAUNCH%nday   =    19
+TBALLOONS(3)%LAUNCH%xtime  = 68400.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON3%LAT                = 46.810
-TBALLOON3%LON                =  9.39 
+TBALLOONS(3)%LAT                = 46.810
+TBALLOONS(3)%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.
+TBALLOONS(3)%ALT                =   865.
+!TBALLOONS(3)%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON3%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOON3%WASCENT            = 4.85
+TBALLOONS(3)%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.)
-!
+TBALLOONS(3)%AERODRAG           = 0.44
+TBALLOONS(3)%INDDRAG           = 0.014
+TBALLOONS(3)%VOLUME           = 3.040
+TBALLOONS(3)%MASS           = 2.4516
+TBALLOONS(3)%DIAMETER           = ((3.*TBALLOONS(3)%VOLUME)/(4.*XPI))**(1./3.)
 !
+IF ( NBALLOONS < 4 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      4.   Balloon number 4
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON4%NMODEL             = 0
-TBALLOON4%MODEL             = 'FIX'
+TBALLOONS(4)%NMODEL             = 0
+TBALLOONS(4)%MODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOON4%TYPE               = 'CVBALL'
+TBALLOONS(4)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON4%TITLE              = 'CVB1ACVB'
+TBALLOONS(4)%TITLE              = 'CVB1ACVB'
 !
 !* launching date and time
 !
-TBALLOON4%LAUNCH%nyear  =  1999
-TBALLOON4%LAUNCH%nmonth =    09
-TBALLOON4%LAUNCH%nday   =    19
-TBALLOON4%LAUNCH%xtime  = 32460.
+TBALLOONS(4)%LAUNCH%nyear  =  1999
+TBALLOONS(4)%LAUNCH%nmonth =    09
+TBALLOONS(4)%LAUNCH%nday   =    19
+TBALLOONS(4)%LAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON4%LAT                = 45.922
-TBALLOON4%LON                =  8.646
+TBALLOONS(4)%LAT                = 45.922
+TBALLOONS(4)%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.
+TBALLOONS(4)%ALT                =   3959.
+!TBALLOONS(4)%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON4%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOON4%WASCENT            = 2.55
+!TBALLOONS(4)%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.)
+TBALLOONS(4)%AERODRAG           = 0.44
+TBALLOONS(4)%INDDRAG           = 0.014
+TBALLOONS(4)%VOLUME           = 3.040
+TBALLOONS(4)%MASS           = 2.4516
+TBALLOONS(4)%DIAMETER           = ((3.*TBALLOONS(4)%VOLUME)/(4.*XPI))**(1./3.)
 !
+IF ( NBALLOONS < 5 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      5.   Balloon number 5
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON5%NMODEL             = 0
-TBALLOON5%MODEL             = 'FIX'
+TBALLOONS(5)%NMODEL             = 0
+TBALLOONS(5)%MODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOON5%TYPE               = 'CVBALL'
+TBALLOONS(5)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON5%TITLE              = 'CVB1DEPA'
+TBALLOONS(5)%TITLE              = 'CVB1DEPA'
 !
 !* launching date and time
 !
-TBALLOON5%LAUNCH%nyear  =  1999
-TBALLOON5%LAUNCH%nmonth =    09
-TBALLOON5%LAUNCH%nday   =    19
-TBALLOON5%LAUNCH%xtime  = 32435.
+TBALLOONS(5)%LAUNCH%nyear  =  1999
+TBALLOONS(5)%LAUNCH%nmonth =    09
+TBALLOONS(5)%LAUNCH%nday   =    19
+TBALLOONS(5)%LAUNCH%xtime  = 32435.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON5%LAT                = 45.800
-TBALLOON5%LON                =  8.630
+TBALLOONS(5)%LAT                = 45.800
+TBALLOONS(5)%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.
+TBALLOONS(5)%ALT                =    340.
+!TBALLOONS(5)%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON5%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOON5%WASCENT            = 2.55
+!TBALLOONS(5)%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.)
+TBALLOONS(5)%AERODRAG           = 0.44
+TBALLOONS(5)%INDDRAG           = 0.014
+TBALLOONS(5)%VOLUME           = 3.040
+TBALLOONS(5)%MASS           = 2.4516
+TBALLOONS(5)%DIAMETER           = ((3.*TBALLOONS(5)%VOLUME)/(4.*XPI))**(1./3.)
 !
+IF ( NBALLOONS < 6 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      6.   Balloon number 6
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON6%NMODEL             = 0
-TBALLOON6%MODEL             = 'FIX'
+TBALLOONS(6)%NMODEL             = 0
+TBALLOONS(6)%MODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOON6%TYPE               = 'CVBALL'
+TBALLOONS(6)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON6%TITLE              = 'CVB1RCVB'
+TBALLOONS(6)%TITLE              = 'CVB1RCVB'
 !
 !* launching date and time
 !
-TBALLOON6%LAUNCH%nyear  =  1999
-TBALLOON6%LAUNCH%nmonth =    09
-TBALLOON6%LAUNCH%nday   =    19
-TBALLOON6%LAUNCH%xtime  = 32460.
+TBALLOONS(6)%LAUNCH%nyear  =  1999
+TBALLOONS(6)%LAUNCH%nmonth =    09
+TBALLOONS(6)%LAUNCH%nday   =    19
+TBALLOONS(6)%LAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON6%LAT                = 45.922
-TBALLOON6%LON                =  8.646
+TBALLOONS(6)%LAT                = 45.922
+TBALLOONS(6)%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.
+!TBALLOONS(6)%ALT                =   3959.
+!TBALLOONS(6)%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON6%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOON6%WASCENT            = 2.55
+!TBALLOONS(6)%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.)
+TBALLOONS(6)%AERODRAG           = 0.44
+TBALLOONS(6)%INDDRAG           = 0.014
+TBALLOONS(6)%VOLUME           = 3.040
+TBALLOONS(6)%MASS           = 2.4516
+TBALLOONS(6)%DIAMETER           = ((3.*TBALLOONS(6)%VOLUME)/(4.*XPI))**(1./3.)
 !
+IF ( NBALLOONS < 7 ) RETURN
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !----------------------------------------------------------------------------
 !
 !*      7.   Balloon number 7
 !            ----------------
+#if 0
 !
 !* model number
 !
-TBALLOON7%NMODEL             = 0
-TBALLOON7%MODEL             = 'FIX'
+TBALLOONS(7)%NMODEL             = 0
+TBALLOONS(7)%MODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOON7%TYPE               = 'CVBALL'
+TBALLOONS(7)%TYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOON7%TITLE              = 'CVB1PISO'
+TBALLOONS(7)%TITLE              = 'CVB1PISO'
 !
 !* launching date and time
 !
-TBALLOON7%LAUNCH%nyear  =  1999
-TBALLOON7%LAUNCH%nmonth =    09
-TBALLOON7%LAUNCH%nday   =    19
-TBALLOON7%LAUNCH%xtime  = 32460.
+TBALLOONS(7)%LAUNCH%nyear  =  1999
+TBALLOONS(7)%LAUNCH%nmonth =    09
+TBALLOONS(7)%LAUNCH%nday   =    19
+TBALLOONS(7)%LAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOON7%LAT                = 45.922
-TBALLOON7%LON                =  8.646
+TBALLOONS(7)%LAT                = 45.922
+TBALLOONS(7)%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.
+!TBALLOONS(7)%ALT                =   3959.
+TBALLOONS(7)%PRES               = 62360.
 !
 !* time step for data storage  (s)
 !
-TBALLOON7%TFLYER_TIME%XTSTEP = 20.
+TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOON7%WASCENT            = 2.55
+!TBALLOONS(7)%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.)
+TBALLOONS(7)%AERODRAG           = 0.44
+TBALLOONS(7)%INDDRAG           = 0.014
+TBALLOONS(7)%VOLUME           = 3.040
+TBALLOONS(7)%MASS           = 2.4516
+TBALLOONS(7)%DIAMETER           = ((3.*TBALLOONS(7)%VOLUME)/(4.*XPI))**(1./3.)
+#else
+CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
+#endif
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index ea5b7e418..54d38ad12 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -47,6 +47,8 @@ use modd_type_date,     only: date_time
 
 implicit none
 
+save
+
 !-------------------------------------------------------------------------------------------
 !
 LOGICAL :: LFLYER    ! flag to use aircraft/balloons
@@ -158,45 +160,11 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
   REAL :: MASS     = XUNDEF ! mass of the balloon (kg) (if 'CVBALL')
 END TYPE TBALLOONDATA
 
-TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON2 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON3 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON4 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON5 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON6 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON7 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON8 ! characteristics and records of a balloon
-TYPE(TBALLOONDATA) :: TBALLOON9 ! characteristics and records of a balloon
+INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
+INTEGER :: NBALLOONS  = 0 ! Total number of balloons
+
+TYPE(TAIRCRAFTDATA), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts
 
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT1 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT2 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT3 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT4 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT5 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT6 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT7 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT8 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT9 ! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT10! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT11! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT12! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT13! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT14! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT15! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT16! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT17! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT18! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT19! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT20! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT21! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT22! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT23! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT24! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT25! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT26! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT27! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT28! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT29! characteristics and records of an aircraft
-TYPE(TAIRCRAFTDATA) :: TAIRCRAFT30! characteristics and records of an aircraft
+TYPE(TBALLOONDATA),  DIMENSION(:), ALLOCATABLE :: TBALLOONS  ! characteristics and records of the balloons
 
 END MODULE MODD_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 4bf6970fa..82040c7ea 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -105,51 +105,19 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 !       0.2  declaration of local variables
 !
 INTEGER :: IMI    ! current model index
+INTEGER :: JI
 !
 !----------------------------------------------------------------------------
 !
 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)
+DO JI = 1, NBALLOONS
+  CALL FLYER_DIACHRO( TBALLOONS(JI) )
+END DO
+
+DO JI = 1, NAIRCRAFTS
+  CALL FLYER_DIACHRO( TAIRCRAFTS(JI) )
+END DO
 !
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 8332daba1..54a7bbcb6 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -80,15 +80,11 @@ 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)
+INTEGER :: JI
+
+DO JI = 1, NBALLOONS
+  IF ( TBALLOONS(JI)%FLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) )
+END DO
 !
 !
 CONTAINS
-- 
GitLab


From 98647623d902cbab5b9b53b60877e8d7a6669313 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 3 Jun 2022 13:38:32 +0200
Subject: [PATCH 075/157] Philippe 03/06/2022: flyers: respect DOCTOR norm for
 data structures

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |   9 +-
 src/MNH/aircraft_balloon.f90                |  12 +-
 src/MNH/aircraft_balloon_evol.f90           | 693 ++++++++++----------
 src/MNH/ini_aircraft.f90                    | 368 +++++------
 src/MNH/ini_aircraft_balloon.f90            | 372 +++++------
 src/MNH/ini_balloon.f90                     | 236 +++----
 src/MNH/modd_aircraft_balloon.f90           | 150 ++---
 src/MNH/write_aircraft_balloon.f90          | 167 ++---
 src/MNH/write_balloonn.f90                  |  30 +-
 src/MNH/write_diachro.f90                   |  29 +-
 10 files changed, 1022 insertions(+), 1044 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 26d8ab705..bc3633ddd 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -29,6 +29,7 @@
 !                          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
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -2272,7 +2273,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 )
@@ -2289,16 +2290,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'
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 0c46dd014..eb5b0d777 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -177,26 +177,26 @@ select type ( tpflyer )
     ytype = 'Aircrafts'
 
   class is ( tballoondata )
-    if ( Trim( TPFLYER%TYPE ) == 'RADIOS' ) then
+    if ( Trim( TPFLYER%CTYPE ) == 'RADIOS' ) then
       ytype = 'Radiosonde_balloons'
-    else if ( Trim( TPFLYER%TYPE ) == 'ISODEN' ) then
+    else if ( Trim( TPFLYER%CTYPE ) == 'ISODEN' ) then
       ytype = 'Isodensity_balloons'
-    else if ( Trim( TPFLYER%TYPE ) == 'CVBALL' ) then
+    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%title ) )
+      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%title ) )
+    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
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 0ac512afb..d7de3a7c1 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -354,12 +354,12 @@ ZTHIS_PROC=0.
 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)
+IF ( TPFLYER%CMODEL /= 'FIX' .AND. COUNT( NDAD(:) == IMI ) /= 0       &
+     .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) &
+     .AND. TPFLYER%XX_CUR /= XUNDEF .AND. TPFLYER%XY_CUR /= XUNDEF    &
+     .AND. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH                    &
+     .AND. CPROGRAM == 'MESONH'                                       ) THEN
+  CALL FLYER_CHANGE_MODEL( IMI )
 ENDIF
 !
 IF ( TPFLYER%NMODEL /= IMI ) RETURN
@@ -394,7 +394,7 @@ 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)
+CALL DATETIME_DISTANCE( TPFLYER%TLAUNCH, TDTCUR, ZTDIST )
 !
 !*      3.   LAUNCH
 !            ------
@@ -402,13 +402,7 @@ CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST)
 GLAUNCH     = .FALSE.
 !
 !
-IF (.NOT. TPFLYER%FLY) THEN
-!
-!
-!*      3.1  comparison of dates and times
-!            -----------------------------
-!
-!  CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST)
+IF ( .NOT. TPFLYER%LFLY ) THEN
 !
 !*      3.2  launch/takeoff is effective
 !            ---------------------------
@@ -420,43 +414,43 @@ IF (.NOT. TPFLYER%FLY) THEN
 !*     3.2.1 Determination of flight segment
 !            -------------------------------
 !
-        TPFLYER%SEGCURN = 1
-        IL = TPFLYER%SEGCURN
+        TPFLYER%NSEGCURN = 1
+        IL = TPFLYER%NSEGCURN
         !
-        TPFLYER%SEGCURT = ZTDIST
+        TPFLYER%XSEGCURT = 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
+        DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG)
+          TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
+          IL = TPFLYER%NSEGCURN
+          TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
+          IF (IL>TPFLYER%NSEG) EXIT
         END DO
         !
         !* end of flight
         !
-        IF (IL > TPFLYER%SEG) THEN
-          TPFLYER%FLY=.FALSE.
+        IF (IL > TPFLYER%NSEG) THEN
+          TPFLYER%LFLY = .FALSE.
         ELSE
-          TPFLYER%FLY = .TRUE.
-          GLAUNCH     = .TRUE.
-          TPFLYER%CRASH=.FALSE.
+          TPFLYER%LFLY   = .TRUE.
+          GLAUNCH        = .TRUE.
+          TPFLYER%LCRASH =.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,*) 'Aircraft ',TPFLYER%CTITLE,' takes off the   ', &
+                            TDTCUR%nday,'/',TDTCUR%nmonth,'/',              &
+                            TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
             WRITE(ILUOUT,*) '-------------------------------------------------------------------'
           ENDIF
         ENDIF
 
       CLASS IS ( TBALLOONDATA)
         IF (ZTDIST <= PTSTEP ) THEN
-          TPFLYER%FLY = .TRUE.
-          GLAUNCH     = .TRUE.
+          TPFLYER%LFLY = .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,*) 'Balloon  ',TPFLYER%CTITLE,' is launched the ', &
+                          TDTCUR%nday,'/',TDTCUR%nmonth,'/',              &
+                          TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
           WRITE(ILUOUT,*) '-------------------------------------------------------------------'
         END IF
 
@@ -470,9 +464,9 @@ IF (.NOT. TPFLYER%FLY) THEN
 !
     SELECT TYPE ( TPFLYER )
       CLASS IS ( TBALLOONDATA)
-        IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
-          TPFLYER%X_CUR = TPFLYER%XLAUNCH
-          TPFLYER%Y_CUR = TPFLYER%YLAUNCH
+        IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
+          TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
+          TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
         END IF
 
       CLASS IS ( TAIRCRAFTDATA)
@@ -481,13 +475,13 @@ IF (.NOT. TPFLYER%FLY) THEN
 !*       3.3.2 Determination of initial position
 !              -----------------------------
 !
-        IF (TPFLYER%FLY) THEN
-          ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
+        IF (TPFLYER%LFLY) THEN
+          ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(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)
+          TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL  ) &
+                         +     ZSEG_FRAC  * TPFLYER%XSEGX(IL+1)
+          TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL  ) &
+                         +     ZSEG_FRAC  * TPFLYER%XSEGY(IL+1)
         END IF
     END SELECT
   END IF
@@ -499,7 +493,7 @@ END IF
 CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN )
 IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step
 !
-IF ( TPFLYER%FLY) THEN
+IF ( TPFLYER%LFLY ) THEN
 !
 !----------------------------------------------------------------------------
 !
@@ -509,23 +503,23 @@ IF ( TPFLYER%FLY) THEN
 !*      4.1  X position
 !            ----------
 !
-  IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR )
-  II=COUNT( ZXHATM(:)<=TPFLYER%X_CUR )
+  IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR )
+  II=COUNT( ZXHATM(:)<=TPFLYER%XX_CUR )
 !
-  IF (IU<IIB   .AND. LWEST_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN 
-      TPFLYER%CRASH=.TRUE.
+  IF ( IU < IIB .AND. LWEST_ll() ) THEN
+    IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN
+      TPFLYER%LCRASH = .TRUE.
     ELSE
-      II=IIB
-      IU=IIB
+      II = IIB
+      IU = IIB
     END IF
   END IF
-  IF (IU>IIE     .AND. LEAST_ll())  THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
+  IF ( IU > IIE .AND. LEAST_ll() )  THEN
+    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
+      TPFLYER%LCRASH = .TRUE.
     ELSE
-      II=IIE
-      IU=IIE
+      II = IIE
+      IU = IIE
     END IF
   END IF
 !
@@ -533,23 +527,23 @@ IF ( TPFLYER%FLY) THEN
 !*      4.2  Y position
 !            ----------
 !
-  IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR )
-  IJ=COUNT( ZYHATM(:)<=TPFLYER%Y_CUR )
+  IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR )
+  IJ=COUNT( ZYHATM(:)<=TPFLYER%XY_CUR )
 !
-  IF (IV<IJB   .AND. LSOUTH_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
+  IF ( IV < IJB .AND. LSOUTH_ll() ) THEN
+    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
+      TPFLYER%LCRASH = .TRUE.
     ELSE
-      IJ=IJB
-      IV=IJB
+      IJ = IJB
+      IV = IJB
     END IF
   END IF
-  IF (IV>IJE     .AND. LNORTH_ll()) THEN
-    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
-      TPFLYER%CRASH=.TRUE.
+  IF (IV > IJE .AND. LNORTH_ll() ) THEN
+    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
+      TPFLYER%LCRASH = .TRUE.
     ELSE
-      IJ=IJE
-      IV=IJE
+      IJ = IJE
+      IV = IJE
     END IF
   END IF
 !
@@ -564,7 +558,7 @@ IF ( TPFLYER%FLY) THEN
 !            --------------------------------------
 !
 !----------------------------------------------------------------------------
-  IF (ZTHIS_PROC>0. .AND. .NOT. TPFLYER%CRASH) THEN
+  IF ( ZTHIS_PROC > 0. .AND. .NOT. TPFLYER%LCRASH ) THEN
 !----------------------------------------------------------------------------
 !
 !*      4.5  Interpolations of model variables to mass points
@@ -607,8 +601,7 @@ IF ( TPFLYER%FLY) THEN
       ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK-1) - 0.5 * ZEXN(:,:,JK-2)
     END DO
     !
-    IF (TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL' &
-        .OR. TPFLYER%TYPE=='AIRCRA' ) THEN
+    IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == '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) )  &
@@ -634,27 +627,27 @@ IF ( TPFLYER%FLY) THEN
     IF (GLAUNCH) THEN
       SELECT TYPE ( TPFLYER )
         CLASS IS ( TBALLOONDATA)
-          SELECT CASE ( TPFLYER%TYPE )
+          SELECT CASE ( TPFLYER%CTYPE )
 !
 !*      5.2.1 Iso-density balloon
 !
             CASE ( 'ISODEN' )
-              ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+              ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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)
+              IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN
+                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
+                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
+                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
+                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1)
+                ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
+                ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
+                ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
+                ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
+                TPFLYER%XRHO = FLYER_INTERP(ZRHO)
+              ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN
+                ZFLYER_EXN = (TPFLYER%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)
@@ -663,9 +656,9 @@ IF ( TPFLYER%FLY) THEN
                 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%XRHO = FLYER_INTERP(ZRHO)
               ELSE
-                CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%TITLE) // ' )'
+                CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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' )
@@ -674,74 +667,74 @@ IF ( TPFLYER%FLY) THEN
 !*      5.2.2 Radiosounding balloon
 !
             CASE ( 'RADIOS' )
-              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) )
+              TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH
+              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) )
+              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
+              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
+              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) )
 !
 !*      5.2.4 Constant Volume Balloon
 !
             CASE ( 'CVBALL' )
-              ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+              ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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 ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN
+                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
+                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
+                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
+                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= 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) )
+                  TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_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)
+                  ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
+                  ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
+                  ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
+                  ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
+                  TPFLYER%XRHO = FLYER_INTERP(ZRHO)
+                  TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
                 END IF
-              ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN
-                ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD)
+              ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN
+                ZFLYER_EXN = (TPFLYER%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
-                  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) )
+                  TPFLYER%XZ_CUR = ZZM(1,1,IKB)
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%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))
-                  TPFLYER%RHO = FLYER_INTERP(ZRHO)
-                  TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
+                  TPFLYER%XRHO = FLYER_INTERP(ZRHO)
+                  TPFLYER%XZ_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)
+                TPFLYER%XRHO = TPFLYER%XMASS / TPFLYER%XVOLUME
+                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)
                 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) )
+                  TPFLYER%XZ_CUR = ZZM(1,1,IKB)
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
+                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_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)
+                  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)
                 END IF
               END IF
           END SELECT
@@ -749,12 +742,12 @@ IF ( TPFLYER%FLY) THEN
 !*      5.2.3 Aircraft
 !
         CLASS IS ( TAIRCRAFTDATA)
-          IF (TPFLYER%ALTDEF) THEN
-            TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
-                          +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
+          IF (TPFLYER%LALTDEF) THEN
+            TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL  ) &
+                           +     ZSEG_FRAC  * TPFLYER%XSEGP(IL+1)
           ELSE
-            TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) &
-                          +     ZSEG_FRAC  * TPFLYER%SEGZ(IL +1 )
+            TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) &
+                           +     ZSEG_FRAC  * TPFLYER%XSEGZ(IL +1 )
           END IF
       END SELECT
     END IF
@@ -766,30 +759,30 @@ IF ( TPFLYER%FLY) THEN
 !
     SELECT TYPE ( TPFLYER )
       CLASS IS ( TBALLOONDATA)
-        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)
+        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
 
       CLASS IS ( TAIRCRAFTDATA)
-        IF (TPFLYER%ALTDEF) THEN
-          ZFLYER_EXN = (TPFLYER%P_CUR/XP00)**(XRD/XCPD)
+        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%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)
+          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
     END SELECT
 
@@ -805,31 +798,31 @@ IF ( TPFLYER%FLY) THEN
 !
     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.
+      TPFLYER%LCRASH = .TRUE.
     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.'
+  IF ( TPFLYER%LCRASH ) THEN
+    TPFLYER%LFLY = .FALSE.
+    IF ( TPFLYER%CTYPE == 'AIRCRA' .AND. .NOT. GLAUNCH ) THEN
+      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flew out of the domain the ', &
+                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                         &
+                      TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
+    ELSE IF (TPFLYER%CTYPE /= 'AIRCRA') THEN
+      WRITE(ILUOUT,*) 'Balloon ',TPFLYER%CTITLE,' crashed the ',                 &
+                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                         &
+                      TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
     END IF
   ELSE
     SELECT TYPE ( TPFLYER )
       CLASS IS ( TAIRCRAFTDATA)
         IF ( .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,*) 'Aircraft ',TPFLYER%CTITLE,' flies  in leg',TPFLYER%NSEGCURN ,' the ',  &
+                          TDTCUR%nday,'/',TDTCUR%nmonth,'/',      &
+                          TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
           WRITE(ILUOUT,*) '-------------------------------------------------------------------'
         ENDIF
     END SELECT
@@ -844,14 +837,14 @@ IF ( TPFLYER%FLY) THEN
 !*      6.1  Interpolation coefficient for X
 !            -------------------------------
 !
-      ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+      ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
       ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
 !
 !
@@ -860,32 +853,32 @@ IF ( TPFLYER%FLY) THEN
 !
       SELECT TYPE ( TPFLYER )
         CLASS IS ( TBALLOONDATA)
-          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) )
+          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
 
         CLASS IS ( TAIRCRAFTDATA)
-          IF (TPFLYER%ALTDEF) THEN
+          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%Z_CUR = FLYER_INTERP(ZZM)
+            TPFLYER%XZ_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)
+            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 SELECT
 !
@@ -897,42 +890,42 @@ IF ( TPFLYER%FLY) THEN
 !*      7.1  Interpolation coefficient for X (for U)
 !            -------------------------------
 !
-      ZUCOEF = (TPFLYER%X_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU))
+      ZUCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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) )
+      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) )
 !
 !
 !*      7.4  Interpolation coefficients for the 4 suroundings verticals (for V)
 !            ----------------------------------------------------------
 !
 
-      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) )
+      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) )
 !
 !----------------------------------------------------------------------------
 !
@@ -940,54 +933,54 @@ IF ( TPFLYER%FLY) THEN
 !            --------------
 !
       IF ( GSTORE ) THEN
-        TPFLYER%X   (IN) = TPFLYER%X_CUR
-        TPFLYER%Y   (IN) = TPFLYER%Y_CUR
-        TPFLYER%Z   (IN) = TPFLYER%Z_CUR
+        TPFLYER%XX   (IN) = TPFLYER%XX_CUR
+        TPFLYER%XY   (IN) = TPFLYER%XY_CUR
+        TPFLYER%XZ   (IN) = TPFLYER%XZ_CUR
         !
         CALL SM_LATLON(PLATOR,PLONOR,          &
-                     TPFLYER%X_CUR, TPFLYER%Y_CUR,       &
-                     TPFLYER%YLAT(IN), TPFLYER%XLON(IN)  )
+                     TPFLYER%XX_CUR, TPFLYER%XY_CUR,       &
+                     TPFLYER%XLAT(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%XZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
+        TPFLYER%XMER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
         !
-        TPFLYER%W   (IN) = FLYER_INTERP(ZWM)
-        TPFLYER%TH  (IN) = FLYER_INTERP(PTH)
+        TPFLYER%XW   (IN) = FLYER_INTERP(ZWM)
+        TPFLYER%XTH  (IN) = FLYER_INTERP(PTH)
         !
         ZFLYER_EXN = FLYER_INTERP(ZEXN)
-        TPFLYER%P   (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD)
+        TPFLYER%XP   (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD)
         !
         DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%R   (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP))
+          TPFLYER%XR   (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))
+          TPFLYER%XSV  (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP))
         END DO
-        TPFLYER%RTZ  (IN,:) = FLYER_INTERPZ(ZR(:,:,:))
+        TPFLYER%XRTZ  (IN,:) = FLYER_INTERPZ(ZR(:,:,:))
         DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%RZ  (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
+          TPFLYER%XRZ  (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
         END DO
         ! Fin Modifs ON
-        TPFLYER%FFZ  (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2))
+        TPFLYER%XFFZ  (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))  
+          TPFLYER%XCIZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
+          TPFLYER%XCCZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
+          TPFLYER%XCRZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
         ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
-          TPFLYER%CIZ  (IN,:) = FLYER_INTERPZ(PCIT(:,:,:))
+          TPFLYER%XCIZ  (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.
+        TPFLYER%XCRARE(IN,:) = 0.
+        TPFLYER%XCRARE_ATT(IN,:) = 0.
+        TPFLYER%XLWCZ  (IN,:) = 0.
+        TPFLYER%XIWCZ  (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(:,:,:))
+       TPFLYER%XLWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
+       TPFLYER%XIWCZ  (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
@@ -1215,7 +1208,7 @@ IF ( TPFLYER%FLY) THEN
               END DO
               ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
               ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
-              TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC
+              TPFLYER%XCRARE(IN,JK)=TPFLYER%XCRARE(IN,JK)+ZREFLOC
               ZAELOC(JK)=ZAELOC(JK)+ZAETMP
             END IF
 
@@ -1228,65 +1221,65 @@ IF ( TPFLYER%FLY) THEN
         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
+        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%Z_CUR-ZZMZ(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%Z_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) &
+              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
-          TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
+          TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(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
+        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%Z_CUR)))
+              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%Z_CUR) &
+              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%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
+          TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT
         END DO
-        TPFLYER%ZZ  (IN,:) = ZZMZ(:)
+        TPFLYER%XZZ  (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,:))
+        WHERE(TPFLYER%XCRARE(IN,:)>0)
+          TPFLYER%XCRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(IN,:))
         ELSEWHERE
-          TPFLYER%CRARE(IN,:)=XUNDEF
+          TPFLYER%XCRARE(IN,:)=XUNDEF
         END WHERE
-        WHERE(TPFLYER%CRARE_ATT(IN,:)>0)
-          TPFLYER%CRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE_ATT(IN,:))
+        WHERE(TPFLYER%XCRARE_ATT(IN,:)>0)
+          TPFLYER%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(IN,:))
         ELSEWHERE
-          TPFLYER%CRARE_ATT(IN,:)=XUNDEF
+          TPFLYER%XCRARE_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)
+        TPFLYER%XWZ  (IN,:) = FLYER_INTERPZ(ZWM(:,:,:))
+        IF (SIZE(PTKE)>0) TPFLYER%XTKE  (IN)    = FLYER_INTERP(PTKE)
+        IF (SIZE(PTS) >0) TPFLYER%XTSRAD(IN)    = FLYER_INTERP_2D(PTS)
+        IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS)
+        TPFLYER%XZS(IN)  = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT))
+        TPFLYER%XTHW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX)
+        TPFLYER%XRCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX)
         DO JLOOP=1,SIZE(PSV,4)
-         TPFLYER%SVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
+         TPFLYER%XSVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
         END DO
       END IF
 !
@@ -1297,7 +1290,7 @@ IF ( TPFLYER%FLY) THEN
 !
       SELECT TYPE ( TPFLYER )
         CLASS IS ( TBALLOONDATA)
-          IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
+          IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
             ZU_BAL = FLYER_INTERP_U(PU)
             ZV_BAL = FLYER_INTERP_V(PV)
             if ( .not. lcartesian ) then
@@ -1306,38 +1299,38 @@ IF ( TPFLYER%FLY) THEN
               ZMAP = 1.
             end if
             !
-            TPFLYER%X_CUR = TPFLYER%X_CUR   +   ZU_BAL * PTSTEP * ZMAP
-            TPFLYER%Y_CUR = TPFLYER%Y_CUR   +   ZV_BAL * PTSTEP * ZMAP
+            TPFLYER%XX_CUR = TPFLYER%XX_CUR   +   ZU_BAL * PTSTEP * ZMAP
+            TPFLYER%XY_CUR = TPFLYER%XY_CUR   +   ZV_BAL * PTSTEP * ZMAP
           END IF
           !
-          IF (TPFLYER%TYPE=='RADIOS') THEN
+          IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
             ZW_BAL = FLYER_INTERP(ZWM)
-            TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * PTSTEP
+            TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * PTSTEP
           END IF
           !
-          IF (TPFLYER%TYPE=='CVBALL') THEN
+          IF ( TPFLYER%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(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%XWASCENT = TPFLYER%XWASCENT &
+                  -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * &
+                     ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
+                        + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
+                          TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
                       )
-                TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * 1.
+                TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 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%XWASCENT = TPFLYER%XWASCENT &
+                  -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * &
+                     ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
+                        + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
+                          TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
                       )
-                TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * (PTSTEP-INT(PTSTEP))
+                TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (PTSTEP-INT(PTSTEP))
             END IF
           END IF
       END SELECT
@@ -1356,43 +1349,43 @@ IF ( TPFLYER%FLY) THEN
 !*     10.1  Determination of flight segment
 !            -------------------------------
 !
-        IL = TPFLYER%SEGCURN
+        IL = TPFLYER%NSEGCURN
         !
-        TPFLYER%SEGCURT = TPFLYER%SEGCURT + PTSTEP
+        TPFLYER%XSEGCURT = TPFLYER%XSEGCURT + 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
+         DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL))
+           TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
+           IL = TPFLYER%NSEGCURN
+           TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
+           IF (IL>TPFLYER%NSEG) 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)
+!        DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG)
+!          TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
+!          IL = TPFLYER%NSEGCURN
+!          TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
 !        END DO
         !
         !* end of flight
         !
-        IF (IL > TPFLYER%SEG) TPFLYER%FLY=.FALSE.
+        IF (IL > TPFLYER%NSEG) TPFLYER%LFLY = .FALSE.
 !
 !
 !*     10.2  Determination of new position
 !            -----------------------------
 !
-        IF (TPFLYER%FLY) THEN
-          ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
+        IF (TPFLYER%LFLY) THEN
+          ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(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)
+          TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL  ) &
+                        +     ZSEG_FRAC  * TPFLYER%XSEGX(IL+1)
+          TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL  ) &
+                        +     ZSEG_FRAC  * TPFLYER%XSEGY(IL+1)
+            IF (TPFLYER%LALTDEF) THEN
+               TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL  ) &
+                        +     ZSEG_FRAC  * TPFLYER%XSEGP(IL+1)
             ELSE
-               TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL  ) &
-                        +     ZSEG_FRAC  * TPFLYER%SEGZ(IL+1)
+               TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL  ) &
+                        +     ZSEG_FRAC  * TPFLYER%XSEGZ(IL+1)
             END IF
         END IF
     END SELECT
@@ -1409,27 +1402,27 @@ END IF
 !*     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)
+CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
+CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
+CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
+CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
 
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TBALLOONDATA )
-    IF (TPFLYER%TYPE=='CVBALL') THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
-      CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT)
-    ELSE IF (TPFLYER%TYPE=='RADIOS') THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
-    ELSE IF (TPFLYER%TYPE=='ISODEN' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%RHO)
+    IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+    ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
     END IF
 
   CLASS IS ( TAIRCRAFTDATA )
-    IF (TPFLYER%ALTDEF) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR)
+    IF (TPFLYER%LALTDEF) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XP_CUR)
     ELSE
-      CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
     ENDIF
 END SELECT
 !
@@ -1437,47 +1430,47 @@ END SELECT
 !            -----------
 !
 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%XX  (IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XY  (IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (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))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZON(IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XMER(IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XW  (IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XP  (IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XTH (IN))
   DO JLOOP=1,SIZE(PR,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%R   (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XR   (IN,JLOOP))
   END DO
   DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%SV  (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (IN,JLOOP))
   END DO
   DO JLOOP=1,IKU              
-    CALL DISTRIBUTE_FLYER(TPFLYER%RTZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (IN,JLOOP))
     DO JLOOP2=1,SIZE(PR,4)
-      CALL DISTRIBUTE_FLYER(TPFLYER%RZ (IN,JLOOP,JLOOP2))
+      CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (IN,JLOOP,JLOOP2))
     ENDDO
-    CALL DISTRIBUTE_FLYER(TPFLYER%FFZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%CIZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (IN,JLOOP))
     IF (CCLOUD== 'LIMA' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%CRZ (IN,JLOOP))
-      CALL DISTRIBUTE_FLYER(TPFLYER%CCZ (IN,JLOOP))      
+      CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (IN,JLOOP))
+      CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (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))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (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))
+  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (IN))
+  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN))
   DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%SVW_FLUX(IN,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(IN,JLOOP))
   END DO
 END IF
 !
@@ -1673,8 +1666,8 @@ 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 )
+IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR )
+IV=COUNT( PYHAT (:)<=TPFLYER%XY_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
@@ -1721,13 +1714,13 @@ ZTHIS_PROC=0.
 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,*) TPFLYER%CTITLE,' 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,*) TPFLYER%CTITLE,' goes from model ',IMODEL,' to  model ', &
+                      TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.'
       WRITE(ILUOUT,*) '-------------------------------------------------------------------'
    ENDIF
 ENDIF
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index 08d1a5e06..af8ecdaaf 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -41,9 +41,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 +51,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
 !!
 !!
 !!
@@ -121,15 +121,15 @@ TAIRCRAFTS(1)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(1)%MODEL              = 'FIX'
+TAIRCRAFTS(1)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(1)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(1)%CTYPE               = 'AIRCRA'
 !
 !* aircraft flight name
 !
-TAIRCRAFTS(1)%TITLE             = 'DIMO19A'
+TAIRCRAFTS(1)%CTITLE             = 'DIMO19A'
 !
 !* time step for storage
 !
@@ -137,28 +137,28 @@ TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(1)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(1)%LAUNCH%nmonth =    04
-TAIRCRAFTS(1)%LAUNCH%nday   =    19
-TAIRCRAFTS(1)%LAUNCH%xtime  = 32280.
+TAIRCRAFTS(1)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(1)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(1)%TLAUNCH%nday   =    19
+TAIRCRAFTS(1)%TLAUNCH%xtime  = 32280.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(1)%SEG                = 168
+TAIRCRAFTS(1)%NSEG                = 168
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(1)%ALTDEF             = .TRUE.
+TAIRCRAFTS(1)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(1)%SEGTIME(TAIRCRAFTS(1)%SEG  ))
-ALLOCATE(TAIRCRAFTS(1)%SEGLAT (TAIRCRAFTS(1)%SEG+1))
-ALLOCATE(TAIRCRAFTS(1)%SEGLON (TAIRCRAFTS(1)%SEG+1))
+ALLOCATE(TAIRCRAFTS(1)%XSEGTIME(TAIRCRAFTS(1)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(1)%XSEGLAT (TAIRCRAFTS(1)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(1)%XSEGLON (TAIRCRAFTS(1)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(1)%SEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(1)%XSEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
@@ -190,7 +190,7 @@ TAIRCRAFTS(1)%SEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(1)%SEGLAT  = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,&
+TAIRCRAFTS(1)%XSEGLAT  = (/ 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,&
@@ -228,7 +228,7 @@ TAIRCRAFTS(1)%SEGLAT  = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(1)%SEGLON   = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,&
+TAIRCRAFTS(1)%XSEGLON   = (/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,&
@@ -266,9 +266,9 @@ TAIRCRAFTS(1)%SEGLON   = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(1)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(1)%SEGP   (TAIRCRAFTS(1)%SEG+1))
-  TAIRCRAFTS(1)%SEGP    = 100. * (/1003.6, 990.8, 988.1, 988.5, 989.3,&
+IF (TAIRCRAFTS(1)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(1)%XSEGP   (TAIRCRAFTS(1)%NSEG+1))
+  TAIRCRAFTS(1)%XSEGP    = 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,&
@@ -303,8 +303,8 @@ IF (TAIRCRAFTS(1)%ALTDEF) THEN
  989.5, 981.8, 977.8, 983.3,1001.9,&
 1007.0,1006.8,1006.8, 1006.8 /)
 ELSE
-  ALLOCATE(TAIRCRAFTS(1)%SEGZ   (TAIRCRAFTS(1)%SEG+1))
-TAIRCRAFTS(1)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(1)%XSEGZ   (TAIRCRAFTS(1)%NSEG+1))
+TAIRCRAFTS(1)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -356,15 +356,15 @@ TAIRCRAFTS(2)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(2)%MODEL              = 'FIX'
+TAIRCRAFTS(2)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(2)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(2)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(2)%TITLE             = 'DIMO19B'
+TAIRCRAFTS(2)%CTITLE             = 'DIMO19B'
 !
 !* time step for storage
 !
@@ -372,28 +372,28 @@ TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(2)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(2)%LAUNCH%nmonth =    04
-TAIRCRAFTS(2)%LAUNCH%nday   =    19
-TAIRCRAFTS(2)%LAUNCH%xtime  = 48060.
+TAIRCRAFTS(2)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(2)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(2)%TLAUNCH%nday   =    19
+TAIRCRAFTS(2)%TLAUNCH%xtime  = 48060.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(2)%SEG                = 198
+TAIRCRAFTS(2)%NSEG                = 198
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(2)%ALTDEF             = .TRUE.
+TAIRCRAFTS(2)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(2)%SEGTIME(TAIRCRAFTS(2)%SEG  ))
-ALLOCATE(TAIRCRAFTS(2)%SEGLAT (TAIRCRAFTS(2)%SEG+1))
-ALLOCATE(TAIRCRAFTS(2)%SEGLON (TAIRCRAFTS(2)%SEG+1))
+ALLOCATE(TAIRCRAFTS(2)%XSEGTIME(TAIRCRAFTS(2)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(2)%XSEGLAT (TAIRCRAFTS(2)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(2)%XSEGLON (TAIRCRAFTS(2)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(2)%SEGTIME     = (/60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(2)%XSEGTIME     = (/60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
@@ -430,7 +430,7 @@ TAIRCRAFTS(2)%SEGTIME     = (/60,   60,   60,   60,   60,   60,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(2)%SEGLAT      = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,&
+TAIRCRAFTS(2)%XSEGLAT      = (/ 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,&
@@ -474,7 +474,7 @@ TAIRCRAFTS(2)%SEGLAT      = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(2)%SEGLON      = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,&
+TAIRCRAFTS(2)%XSEGLON      = (/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,&
@@ -518,9 +518,9 @@ TAIRCRAFTS(2)%SEGLON      = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(2)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(2)%SEGP   (TAIRCRAFTS(2)%SEG+1))
-TAIRCRAFTS(2)%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,&
+IF (TAIRCRAFTS(2)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(2)%XSEGP   (TAIRCRAFTS(2)%NSEG+1))
+TAIRCRAFTS(2)%XSEGP = 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,&
@@ -561,8 +561,8 @@ TAIRCRAFTS(2)%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,&
  975.8, 993.9,1004.1,1004.1,1004.1,&
 1004.1,1004.1,1004.1,1004.1 /)
 ELSE
-  ALLOCATE(TAIRCRAFTS(2)%SEGZ   (TAIRCRAFTS(2)%SEG+1))
-  TAIRCRAFTS(2)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(2)%XSEGZ   (TAIRCRAFTS(2)%NSEG+1))
+  TAIRCRAFTS(2)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -620,15 +620,15 @@ TAIRCRAFTS(3)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(3)%MODEL              = 'FIX'
+TAIRCRAFTS(3)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(3)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(3)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(3)%TITLE             = 'SAAL19A'
+TAIRCRAFTS(3)%CTITLE             = 'SAAL19A'
 !
 !* time step for storage
 !
@@ -636,28 +636,28 @@ TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(3)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(3)%LAUNCH%nmonth =    04
-TAIRCRAFTS(3)%LAUNCH%nday   =    19
-TAIRCRAFTS(3)%LAUNCH%xtime  = 45369
+TAIRCRAFTS(3)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(3)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(3)%TLAUNCH%nday   =    19
+TAIRCRAFTS(3)%TLAUNCH%xtime  = 45369
 !
 !* number of flight segments
 !
-TAIRCRAFTS(3)%SEG                = 39
+TAIRCRAFTS(3)%NSEG                = 39
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(3)%ALTDEF             = .TRUE.
+TAIRCRAFTS(3)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(3)%SEGTIME(TAIRCRAFTS(3)%SEG  ))
-ALLOCATE(TAIRCRAFTS(3)%SEGLAT (TAIRCRAFTS(3)%SEG+1))
-ALLOCATE(TAIRCRAFTS(3)%SEGLON (TAIRCRAFTS(3)%SEG+1))
+ALLOCATE(TAIRCRAFTS(3)%XSEGTIME(TAIRCRAFTS(3)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(3)%XSEGLAT (TAIRCRAFTS(3)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(3)%XSEGLON (TAIRCRAFTS(3)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(3)%SEGTIME = (/   15,   16,   16,   18,   17,   17,&
+TAIRCRAFTS(3)%XSEGTIME = (/   15,   16,   16,   18,   17,   17,&
    22,   25,   19,   19,   22,   27,&
    28,   27,   29,   32,   30,   24,&
   169,   18,   15,   18,   17,   16,&
@@ -669,7 +669,7 @@ TAIRCRAFTS(3)%SEGTIME = (/   15,   16,   16,   18,   17,   17,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(3)%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,&
+TAIRCRAFTS(3)%XSEGLAT = (/ 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,&
@@ -681,7 +681,7 @@ TAIRCRAFTS(3)%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(3)%SEGLON   = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,&
+TAIRCRAFTS(3)%XSEGLON   = (/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,&
@@ -693,9 +693,9 @@ TAIRCRAFTS(3)%SEGLON   = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(3)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(3)%SEGP   (TAIRCRAFTS(3)%SEG+1))
-TAIRCRAFTS(3)%SEGP    = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,&
+IF (TAIRCRAFTS(3)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(3)%XSEGP   (TAIRCRAFTS(3)%NSEG+1))
+TAIRCRAFTS(3)%XSEGP    = 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,&
@@ -704,8 +704,8 @@ TAIRCRAFTS(3)%SEGP    = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,&
  940.4, 946.6, 951.8, 957.8, 963.1,&
  969.1, 974.1, 980.0, 986.0, 993.0 /)
 ELSE
-  ALLOCATE(TAIRCRAFTS(3)%SEGZ   (TAIRCRAFTS(3)%SEG+1))
-  TAIRCRAFTS(3)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(3)%XSEGZ   (TAIRCRAFTS(3)%NSEG+1))
+  TAIRCRAFTS(3)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -731,15 +731,15 @@ TAIRCRAFTS(4)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(4)%MODEL              = 'FIX'
+TAIRCRAFTS(4)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(4)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(4)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(4)%TITLE             = 'SAAL19B'
+TAIRCRAFTS(4)%CTITLE             = 'SAAL19B'
 !
 !* time step for storage
 !
@@ -747,28 +747,28 @@ TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(4)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(4)%LAUNCH%nmonth =    04
-TAIRCRAFTS(4)%LAUNCH%nday   =    19
-TAIRCRAFTS(4)%LAUNCH%xtime  = 60392.
+TAIRCRAFTS(4)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(4)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(4)%TLAUNCH%nday   =    19
+TAIRCRAFTS(4)%TLAUNCH%xtime  = 60392.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(4)%SEG                = 39
+TAIRCRAFTS(4)%NSEG                = 39
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(4)%ALTDEF             = .TRUE.
+TAIRCRAFTS(4)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(4)%SEGTIME(TAIRCRAFTS(4)%SEG  ))
-ALLOCATE(TAIRCRAFTS(4)%SEGLAT (TAIRCRAFTS(4)%SEG+1))
-ALLOCATE(TAIRCRAFTS(4)%SEGLON (TAIRCRAFTS(4)%SEG+1))
+ALLOCATE(TAIRCRAFTS(4)%XSEGTIME(TAIRCRAFTS(4)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(4)%XSEGLAT (TAIRCRAFTS(4)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(4)%XSEGLON (TAIRCRAFTS(4)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(4)%SEGTIME = (/ 36,   18,   18,   21,   24,   23,&
+TAIRCRAFTS(4)%XSEGTIME = (/ 36,   18,   18,   21,   24,   23,&
    20,   20,   25,   27,   21,   25,&
    27,   23,   21,   23,   25,   21,&
    27,  190,   17,   17,   18,   17,&
@@ -779,7 +779,7 @@ TAIRCRAFTS(4)%SEGTIME = (/ 36,   18,   18,   21,   24,   23,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(4)%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,&
+TAIRCRAFTS(4)%XSEGLAT = (/ 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,&
@@ -791,7 +791,7 @@ TAIRCRAFTS(4)%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(4)%SEGLON  = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,&
+TAIRCRAFTS(4)%XSEGLON  = (/ 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,&
@@ -803,9 +803,9 @@ TAIRCRAFTS(4)%SEGLON  = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(4)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(4)%SEGP   (TAIRCRAFTS(4)%SEG+1))
-TAIRCRAFTS(4)%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,&
+IF (TAIRCRAFTS(4)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(4)%XSEGP   (TAIRCRAFTS(4)%NSEG+1))
+TAIRCRAFTS(4)%XSEGP = 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,&
@@ -814,8 +814,8 @@ TAIRCRAFTS(4)%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,&
  934.6, 940.3, 946.0, 951.4, 956.5,&
  962.8, 968.1, 973.7, 979.3, 984.9 /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(4)%SEGZ   (TAIRCRAFTS(4)%SEG+1))
-  TAIRCRAFTS(4)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(4)%XSEGZ   (TAIRCRAFTS(4)%NSEG+1))
+  TAIRCRAFTS(4)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -841,15 +841,15 @@ TAIRCRAFTS(5)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(5)%MODEL              = 'FIX'
+TAIRCRAFTS(5)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(5)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(5)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(5)%TITLE             = 'SAIB19A'
+TAIRCRAFTS(5)%CTITLE             = 'SAIB19A'
 !
 !* time step for storage
 !
@@ -857,28 +857,28 @@ TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(5)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(5)%LAUNCH%nmonth =    04
-TAIRCRAFTS(5)%LAUNCH%nday   =    19
-TAIRCRAFTS(5)%LAUNCH%xtime  = 43380.
+TAIRCRAFTS(5)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(5)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(5)%TLAUNCH%nday   =    19
+TAIRCRAFTS(5)%TLAUNCH%xtime  = 43380.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(5)%SEG                = 176
+TAIRCRAFTS(5)%NSEG                = 176
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(5)%ALTDEF             = .TRUE.
+TAIRCRAFTS(5)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(5)%SEGTIME(TAIRCRAFTS(5)%SEG  ))
-ALLOCATE(TAIRCRAFTS(5)%SEGLAT (TAIRCRAFTS(5)%SEG+1))
-ALLOCATE(TAIRCRAFTS(5)%SEGLON (TAIRCRAFTS(5)%SEG+1))
+ALLOCATE(TAIRCRAFTS(5)%XSEGTIME(TAIRCRAFTS(5)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(5)%XSEGLAT (TAIRCRAFTS(5)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(5)%XSEGLON (TAIRCRAFTS(5)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(5)%SEGTIME = (/  28,   28,   29,   29,   29,   28,&
+TAIRCRAFTS(5)%XSEGTIME = (/  28,   28,   29,   29,   29,   28,&
    28,   28,   29,   26,   28,   27,&
    28,   27,   28,   27,   25,   27,&
    27,   26,   24,   25,   26,   26,&
@@ -913,7 +913,7 @@ TAIRCRAFTS(5)%SEGTIME = (/  28,   28,   29,   29,   29,   28,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(5)%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,&
+TAIRCRAFTS(5)%XSEGLAT = (/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,&
@@ -954,7 +954,7 @@ TAIRCRAFTS(5)%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(5)%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,&
+TAIRCRAFTS(5)%XSEGLON = (/ 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,&
@@ -995,9 +995,9 @@ TAIRCRAFTS(5)%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(5)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(5)%SEGP   (TAIRCRAFTS(5)%SEG+1))
-TAIRCRAFTS(5)%SEGP  = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,&
+IF (TAIRCRAFTS(5)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(5)%XSEGP   (TAIRCRAFTS(5)%NSEG+1))
+TAIRCRAFTS(5)%XSEGP  = 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,&
@@ -1034,8 +1034,8 @@ TAIRCRAFTS(5)%SEGP  = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,&
  995.4, 995.4, 995.3, 994.8, 994.5,&
  994.1, 994.4  /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(5)%SEGZ   (TAIRCRAFTS(5)%SEG+1))
-  TAIRCRAFTS(5)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(5)%XSEGZ   (TAIRCRAFTS(5)%NSEG+1))
+  TAIRCRAFTS(5)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1089,15 +1089,15 @@ TAIRCRAFTS(6)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(6)%MODEL              = 'FIX'
+TAIRCRAFTS(6)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(6)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(6)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(6)%TITLE             = 'SAIB19B'
+TAIRCRAFTS(6)%CTITLE             = 'SAIB19B'
 !
 !* time step for storage
 !
@@ -1105,28 +1105,28 @@ TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(6)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(6)%LAUNCH%nmonth =    04
-TAIRCRAFTS(6)%LAUNCH%nday   =    19
-TAIRCRAFTS(6)%LAUNCH%xtime  = 55992.
+TAIRCRAFTS(6)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(6)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(6)%TLAUNCH%nday   =    19
+TAIRCRAFTS(6)%TLAUNCH%xtime  = 55992.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(6)%SEG                = 179
+TAIRCRAFTS(6)%NSEG                = 179
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(6)%ALTDEF             = .TRUE.
+TAIRCRAFTS(6)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(6)%SEGTIME(TAIRCRAFTS(6)%SEG  ))
-ALLOCATE(TAIRCRAFTS(6)%SEGLAT (TAIRCRAFTS(6)%SEG+1))
-ALLOCATE(TAIRCRAFTS(6)%SEGLON (TAIRCRAFTS(6)%SEG+1))
+ALLOCATE(TAIRCRAFTS(6)%XSEGTIME(TAIRCRAFTS(6)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(6)%XSEGLAT (TAIRCRAFTS(6)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(6)%XSEGLON (TAIRCRAFTS(6)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(6)%SEGTIME = (/ 27,   25,   26,   25,   25,   25,&
+TAIRCRAFTS(6)%XSEGTIME = (/ 27,   25,   26,   25,   25,   25,&
    25,   27,   28,   25,   26,   25,&
    26,   26,   26,   26,   25,   27,&
    27,   27,   27,   28,   28,   25,&
@@ -1160,7 +1160,7 @@ TAIRCRAFTS(6)%SEGTIME = (/ 27,   25,   26,   25,   25,   25,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(6)%SEGLAT = (/  44.14614, 44.14841, 44.15199, 44.15888, 44.16587,&
+TAIRCRAFTS(6)%XSEGLAT = (/  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,&
@@ -1200,7 +1200,7 @@ TAIRCRAFTS(6)%SEGLAT = (/  44.14614, 44.14841, 44.15199, 44.15888, 44.16587,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(6)%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,&
+TAIRCRAFTS(6)%XSEGLON = (/-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,&
@@ -1240,9 +1240,9 @@ TAIRCRAFTS(6)%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(6)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(6)%SEGP   (TAIRCRAFTS(6)%SEG+1))
-TAIRCRAFTS(6)%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,&
+IF (TAIRCRAFTS(6)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(6)%XSEGP   (TAIRCRAFTS(6)%NSEG+1))
+TAIRCRAFTS(6)%XSEGP = 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,&
@@ -1279,8 +1279,8 @@ TAIRCRAFTS(6)%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,&
  999.2, 999.2, 999.2, 998.9, 998.4,&
  997.7, 997.1, 996.8, 996.9, 996.9  /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(6)%SEGZ   (TAIRCRAFTS(6)%SEG+1))
-  TAIRCRAFTS(6)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(6)%XSEGZ   (TAIRCRAFTS(6)%NSEG+1))
+  TAIRCRAFTS(6)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1335,15 +1335,15 @@ TAIRCRAFTS(7)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(7)%MODEL              = 'FIX'
+TAIRCRAFTS(7)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(7)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(7)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(7)%TITLE             = 'TEST_19'
+TAIRCRAFTS(7)%CTITLE             = 'TEST_19'
 !
 !* time step for storage
 !
@@ -1351,28 +1351,28 @@ TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(7)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(7)%LAUNCH%nmonth =    04
-TAIRCRAFTS(7)%LAUNCH%nday   =    19
-TAIRCRAFTS(7)%LAUNCH%xtime  = 43500.
+TAIRCRAFTS(7)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(7)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(7)%TLAUNCH%nday   =    19
+TAIRCRAFTS(7)%TLAUNCH%xtime  = 43500.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(7)%SEG                = 207
+TAIRCRAFTS(7)%NSEG                = 207
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(7)%ALTDEF             = .TRUE.
+TAIRCRAFTS(7)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(7)%SEGTIME(TAIRCRAFTS(7)%SEG  ))
-ALLOCATE(TAIRCRAFTS(7)%SEGLAT (TAIRCRAFTS(7)%SEG+1))
-ALLOCATE(TAIRCRAFTS(7)%SEGLON (TAIRCRAFTS(7)%SEG+1))
+ALLOCATE(TAIRCRAFTS(7)%XSEGTIME(TAIRCRAFTS(7)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(7)%XSEGLAT (TAIRCRAFTS(7)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(7)%XSEGLON (TAIRCRAFTS(7)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(7)%SEGTIME = (/  60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(7)%XSEGTIME = (/  60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
@@ -1411,7 +1411,7 @@ TAIRCRAFTS(7)%SEGTIME = (/  60,   60,   60,   60,   60,   60,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(7)%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,&
+TAIRCRAFTS(7)%XSEGLAT = (/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,&
@@ -1457,7 +1457,7 @@ TAIRCRAFTS(7)%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(7)%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,&
+TAIRCRAFTS(7)%XSEGLON = (/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,&
@@ -1503,9 +1503,9 @@ TAIRCRAFTS(7)%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(7)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(7)%SEGP   (TAIRCRAFTS(7)%SEG+1))
-TAIRCRAFTS(7)%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,&
+IF (TAIRCRAFTS(7)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(7)%XSEGP   (TAIRCRAFTS(7)%NSEG+1))
+TAIRCRAFTS(7)%XSEGP = 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,&
@@ -1548,8 +1548,8 @@ TAIRCRAFTS(7)%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,&
  993.5, 994.8, 995.2, 999.8,1012.4,&
 1012.4,1012.4,1012.4   /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(7)%SEGZ   (TAIRCRAFTS(7)%SEG+1))
-  TAIRCRAFTS(7)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(7)%XSEGZ   (TAIRCRAFTS(7)%NSEG+1))
+  TAIRCRAFTS(7)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1609,15 +1609,15 @@ TAIRCRAFTS(8)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(8)%MODEL              = 'FIX'
+TAIRCRAFTS(8)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(8)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(8)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(8)%TITLE             = 'DIMO22B'
+TAIRCRAFTS(8)%CTITLE             = 'DIMO22B'
 !
 !* time step for storage
 !
@@ -1625,28 +1625,28 @@ TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(8)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(8)%LAUNCH%nmonth =    04
-TAIRCRAFTS(8)%LAUNCH%nday   =    22
-TAIRCRAFTS(8)%LAUNCH%xtime  = 45720.
+TAIRCRAFTS(8)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(8)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(8)%TLAUNCH%nday   =    22
+TAIRCRAFTS(8)%TLAUNCH%xtime  = 45720.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(8)%SEG                =  210
+TAIRCRAFTS(8)%NSEG                =  210
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(8)%ALTDEF             = .TRUE.
+TAIRCRAFTS(8)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(8)%SEGTIME(TAIRCRAFTS(8)%SEG  ))
-ALLOCATE(TAIRCRAFTS(8)%SEGLAT (TAIRCRAFTS(8)%SEG+1))
-ALLOCATE(TAIRCRAFTS(8)%SEGLON (TAIRCRAFTS(8)%SEG+1))
+ALLOCATE(TAIRCRAFTS(8)%XSEGTIME(TAIRCRAFTS(8)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(8)%XSEGLAT (TAIRCRAFTS(8)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(8)%XSEGLON (TAIRCRAFTS(8)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(8)%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(8)%XSEGTIME = (/   60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
@@ -1685,7 +1685,7 @@ TAIRCRAFTS(8)%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(8)%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,&
+TAIRCRAFTS(8)%XSEGLAT = (/ 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,&
@@ -1733,7 +1733,7 @@ TAIRCRAFTS(8)%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(8)%SEGLON = (/  0.75057, 0.72578, 0.69760, 0.66704, 0.63457,&
+TAIRCRAFTS(8)%XSEGLON = (/  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,&
@@ -1781,9 +1781,9 @@ TAIRCRAFTS(8)%SEGLON = (/  0.75057, 0.72578, 0.69760, 0.66704, 0.63457,&
 !* pressure of the segments ends (1st point is takeoff, last point is landing)
 !        (pascals)
 !
-IF (TAIRCRAFTS(8)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(8)%SEGP   (TAIRCRAFTS(8)%SEG+1))
-TAIRCRAFTS(8)%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,&
+IF (TAIRCRAFTS(8)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(8)%XSEGP   (TAIRCRAFTS(8)%NSEG+1))
+TAIRCRAFTS(8)%XSEGP = 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,&
@@ -1827,8 +1827,8 @@ TAIRCRAFTS(8)%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,&
  995.1, 995.0, 986.7, 992.4,1009.3,&
 1010.1  /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(8)%SEGZ   (TAIRCRAFTS(8)%SEG+1))
-  TAIRCRAFTS(8)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(8)%XSEGZ   (TAIRCRAFTS(8)%NSEG+1))
+  TAIRCRAFTS(8)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
@@ -1888,15 +1888,15 @@ TAIRCRAFTS(9)%NMODEL             = 0
 !
 !* model switch
 !
-TAIRCRAFTS(9)%MODEL              = 'FIX'
+TAIRCRAFTS(9)%CMODEL              = 'FIX'
 !
 !* aircraft type
 !
-TAIRCRAFTS(9)%TYPE               = 'AIRCRA'
+TAIRCRAFTS(9)%CTYPE               = 'AIRCRA'
 
 !* aircraft flight name
 !
-TAIRCRAFTS(9)%TITLE             = 'DIMO23A'
+TAIRCRAFTS(9)%CTITLE             = 'DIMO23A'
 !
 !* time step for storage
 !
@@ -1904,28 +1904,28 @@ TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60.
 !
 !* take-off date and time
 !
-TAIRCRAFTS(9)%LAUNCH%nyear  =  2007
-TAIRCRAFTS(9)%LAUNCH%nmonth =    04
-TAIRCRAFTS(9)%LAUNCH%nday   =    23
-TAIRCRAFTS(9)%LAUNCH%xtime  = 28080.
+TAIRCRAFTS(9)%TLAUNCH%nyear  =  2007
+TAIRCRAFTS(9)%TLAUNCH%nmonth =    04
+TAIRCRAFTS(9)%TLAUNCH%nday   =    23
+TAIRCRAFTS(9)%TLAUNCH%xtime  = 28080.
 !
 !* number of flight segments
 !
-TAIRCRAFTS(9)%SEG                =   217
+TAIRCRAFTS(9)%NSEG                =   217
 !
 !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
 !
-TAIRCRAFTS(9)%ALTDEF             = .TRUE.
+TAIRCRAFTS(9)%LALTDEF             = .TRUE.
 !
 !* allocation of the arrays
 !
-ALLOCATE(TAIRCRAFTS(9)%SEGTIME(TAIRCRAFTS(9)%SEG  ))
-ALLOCATE(TAIRCRAFTS(9)%SEGLAT (TAIRCRAFTS(9)%SEG+1))
-ALLOCATE(TAIRCRAFTS(9)%SEGLON (TAIRCRAFTS(9)%SEG+1))
+ALLOCATE(TAIRCRAFTS(9)%XSEGTIME(TAIRCRAFTS(9)%NSEG  ))
+ALLOCATE(TAIRCRAFTS(9)%XSEGLAT (TAIRCRAFTS(9)%NSEG+1))
+ALLOCATE(TAIRCRAFTS(9)%XSEGLON (TAIRCRAFTS(9)%NSEG+1))
 !
 !* duration of the segments (seconds)
 !
-TAIRCRAFTS(9)%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
+TAIRCRAFTS(9)%XSEGTIME = (/   60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
    60,   60,   60,   60,   60,   60,&
@@ -1967,7 +1967,7 @@ TAIRCRAFTS(9)%SEGTIME = (/   60,   60,   60,   60,   60,   60,&
 !* latitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(9)%SEGLAT = (/  44.39751, 44.39753, 44.39752, 44.39853, 44.40034,&
+TAIRCRAFTS(9)%XSEGLAT = (/  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,&
@@ -2017,7 +2017,7 @@ TAIRCRAFTS(9)%SEGLAT = (/  44.39751, 44.39753, 44.39752, 44.39853, 44.40034,&
 !* longitudes of the segments ends (1st point is takeoff, last point is landing)
 !        (decimal degrees)
 !
-TAIRCRAFTS(9)%SEGLON = (/  0.76306, 0.76307, 0.76305, 0.76269, 0.74580,&
+TAIRCRAFTS(9)%XSEGLON = (/  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,&
@@ -2067,9 +2067,9 @@ TAIRCRAFTS(9)%SEGLON = (/  0.76306, 0.76307, 0.76305, 0.76269, 0.74580,&
 !        (pascals)
 !
 
-IF (TAIRCRAFTS(9)%ALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(9)%SEGP   (TAIRCRAFTS(9)%SEG+1))
-TAIRCRAFTS(9)%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
+IF (TAIRCRAFTS(9)%LALTDEF) THEN
+  ALLOCATE(TAIRCRAFTS(9)%XSEGP   (TAIRCRAFTS(9)%NSEG+1))
+TAIRCRAFTS(9)%XSEGP = 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,&
@@ -2114,8 +2114,8 @@ TAIRCRAFTS(9)%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,&
  965.9, 985.1,1003.1,1013.9,1013.9,&
 1013.9,1013.9,1013.9  /)
  ELSE
-  ALLOCATE(TAIRCRAFTS(9)%SEGZ   (TAIRCRAFTS(9)%SEG+1))
-  TAIRCRAFTS(9)%SEGZ    = (/8000,8000,8000,8000,8000,&
+  ALLOCATE(TAIRCRAFTS(9)%XSEGZ   (TAIRCRAFTS(9)%NSEG+1))
+  TAIRCRAFTS(9)%XSEGZ    = (/8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
 8000,8000,8000,8000,8000,&
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 5a9c1b141..1352e6577 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -215,84 +215,85 @@ ENDIF
 !
 IF (TPFLYER%NMODEL == 0) ISTORE=0
 IF (TPFLYER%NMODEL > 0) THEN
-  WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%TITLE,' nmodel=',TPFLYER%NMODEL
+  WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%CTITLE,' nmodel=',TPFLYER%NMODEL
 ENDIF
 !
 !
 allocate( tpflyer%tflyer_time%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))
+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,KRR))
+ALLOCATE(TPFLYER%XSV  (ISTORE,KSV))
+ALLOCATE(TPFLYER%XRTZ (ISTORE,KKU))
+ALLOCATE(TPFLYER%XRZ  (ISTORE,KKU,KRR))
+ALLOCATE(TPFLYER%XFFZ (ISTORE,KKU))
+ALLOCATE(TPFLYER%XIWCZ(ISTORE,KKU))
+ALLOCATE(TPFLYER%XLWCZ(ISTORE,KKU))
+ALLOCATE(TPFLYER%XCIZ (ISTORE,KKU))
 IF (CCLOUD=='LIMA') THEN
-  ALLOCATE(TPFLYER%CCZ  (ISTORE,KKU))
-  ALLOCATE(TPFLYER%CRZ  (ISTORE,KKU))
+  ALLOCATE(TPFLYER%XCCZ(ISTORE,KKU))
+  ALLOCATE(TPFLYER%XCRZ(ISTORE,KKU))
 ENDIF
-ALLOCATE(TPFLYER%CRARE(ISTORE,KKU))
-ALLOCATE(TPFLYER%CRARE_ATT(ISTORE,KKU))
-ALLOCATE(TPFLYER%WZ(ISTORE,KKU))
-ALLOCATE(TPFLYER%ZZ(ISTORE,KKU))
+ALLOCATE(TPFLYER%XCRARE    (ISTORE,KKU))
+ALLOCATE(TPFLYER%XCRARE_ATT(ISTORE,KKU))
+ALLOCATE(TPFLYER%XWZ       (ISTORE,KKU))
+ALLOCATE(TPFLYER%XZZ       (ISTORE,KKU))
 IF (OUSETKE) THEN
-  ALLOCATE(TPFLYER%TKE (ISTORE))
+  ALLOCATE(TPFLYER%XTKE(ISTORE))
 ELSE
-  ALLOCATE(TPFLYER%TKE (0))
+  ALLOCATE(TPFLYER%XTKE(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
+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,KSV))
+!
+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%XCIZ = XUNDEF
 IF (CCLOUD=='LIMA') THEN
-  TPFLYER%CRZ      = XUNDEF
-  TPFLYER%CCZ      = XUNDEF
+  TPFLYER%XCRZ = XUNDEF
+  TPFLYER%XCCZ = XUNDEF
 ENDIF
-TPFLYER%IWCZ     = XUNDEF
-TPFLYER%LWCZ     = XUNDEF
-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
+TPFLYER%XIWCZ      = XUNDEF
+TPFLYER%XLWCZ      = XUNDEF
+TPFLYER%XCRARE     = XUNDEF
+TPFLYER%XCRARE_ATT = XUNDEF
+TPFLYER%XWZ        = XUNDEF
+TPFLYER%XZZ        = XUNDEF
+TPFLYER%XTKE       = XUNDEF
+TPFLYER%XTSRAD     = XUNDEF
+TPFLYER%XZS        = XUNDEF
+TPFLYER%XTKE_DISS  = XUNDEF
+!
+TPFLYER%XTHW_FLUX = XUNDEF
+TPFLYER%XRCW_FLUX = XUNDEF
+TPFLYER%XSVW_FLUX = XUNDEF
+
 END SUBROUTINE ALLOCATE_FLYER
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
@@ -310,101 +311,99 @@ CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
 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%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 LFLYER=.TRUE.
 !
-IF (TPFLYER%TITLE=='          ') THEN
-  WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR
+IF (TPFLYER%CTITLE=='          ') THEN
+  WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR
 END IF
 !
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
   ! read the current location in the FM_FILE
   !
-  TZFIELD = TFIELDMETADATA(                  &
-    CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
-    CSTDNAME   = '',                         &
-    CLONGNAME  = TRIM(TPFLYER%TITLE)//'LAT', &
-    CUNITS     = 'degree',                   &
-    CDIR       = '--',                       &
-    CCOMMENT   = '',                         &
-    NGRID      = 0,                          &
-    NTYPE      = TYPEREAL,                   &
-    NDIMS      = 0,                          &
-    LTIMEDEP   = .TRUE.                      )
+  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
-    WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%TITLE
+    WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%CTITLE
   ELSE
-    TZFIELD = TFIELDMETADATA(                  &
-      CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
-      CSTDNAME   = '',                         &
-      CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
-      CUNITS     = 'degree',                   &
-      CDIR       = '--',                       &
-      CCOMMENT   = '',                         &
-      NGRID      = 0,                          &
-      NTYPE      = TYPEREAL,                   &
-      NDIMS      = 0,                          &
-      LTIMEDEP   = .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%TITLE)//'ALT', &
-      CSTDNAME   = '',                         &
-      CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
-      CUNITS     = 'm',                        &
-      CDIR       = '--',                       &
-      CCOMMENT   = '',                         &
-      NGRID      = 0,                          &
-      NTYPE      = TYPEREAL,                   &
-      NDIMS      = 0,                          &
-      LTIMEDEP   = .TRUE.                      )
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%Z_CUR)
+    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)
     !
-    TPFLYER%P_CUR   = XUNDEF
+    TPFLYER%XP_CUR   = XUNDEF
     !
-    TZFIELD = TFIELDMETADATA(                      &
-      CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
-      CSTDNAME   = '',                             &
-      CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
-      CUNITS     = 'm s-1',                        &
-      CDIR       = '--',                           &
-      CCOMMENT   = '',                             &
-      NGRID      = 0,                              &
-      NTYPE      = TYPEREAL,                       &
-      NDIMS      = 0,                              &
-      LTIMEDEP   = .TRUE.                          )
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT)
+    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%TITLE)//'RHO', &
-      CSTDNAME   = '',                         &
-      CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
-      CUNITS     = 'kg m-3',                   &
-      CDIR       = '--',                       &
-      CCOMMENT   = '',                         &
-      NGRID      = 0,                          &
-      NTYPE      = TYPEREAL,                   &
-      NDIMS      = 0,                          &
-      LTIMEDEP   = .TRUE.                      )
-    CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO)
+    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)
     !
-    CALL SM_XYHAT(PLATOR,PLONOR,&
-              ZLAT,ZLON,        &
-              TPFLYER%X_CUR, TPFLYER%Y_CUR )
-    TPFLYER%FLY = .TRUE.
+    CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR )
+    TPFLYER%LFLY = .TRUE.
     WRITE(ILUOUT,*) &
-    "INI_LAUNCH: Current location read in FM file for ",TPFLYER%TITLE
-    IF (TPFLYER%TYPE== 'CVBALL') THEN
+    "INI_LAUNCH: Current location read in FM file for ",TPFLYER%CTITLE
+    IF (TPFLYER%CTYPE== 'CVBALL') THEN
       WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR," Wasc=",TPFLYER%WASCENT
-    ELSE IF (TPFLYER%TYPE== 'ISODEN') THEN
+       " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR," Wasc=",TPFLYER%XWASCENT
+    ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN
       WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO
+       " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%XRHO
     END IF
     !
     TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
@@ -416,35 +415,28 @@ ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
     !
     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.
+    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.
       WRITE(ILUOUT,*) &
-      "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE
+      "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%CTITLE
       WRITE(ILUOUT,*) &
-            " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR
+            " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR
     END IF
     !
     TPFLYER%TFLYER_TIME%XTSTEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP )
   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','')
+IF ( TPFLYER%XLATLAUNCH == XUNDEF .OR. TPFLYER%XLONLAUNCH == XUNDEF ) THEN
+  CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM( TPFLYER%CTITLE ) // ' )'
+  CMNHMSG(2) = 'either LATitude or LONgitude is not given'
+  CMNHMSG(3) = 'Check your INI_BALLOON routine'
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' )
 END IF
 !
-CALL SM_XYHAT(PLATOR,PLONOR,       &
-              TPFLYER%LAT, TPFLYER%LON,        &
-              TPFLYER%XLAUNCH, TPFLYER%YLAUNCH )
+CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH )
 !
 END SUBROUTINE INI_LAUNCH
 !----------------------------------------------------------------------------
@@ -454,57 +446,47 @@ SUBROUTINE INI_FLIGHT(KNBR,TPFLYER)
 INTEGER,              INTENT(IN)    :: KNBR
 CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER
 !
-IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
+IF (TPFLYER%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 LFLYER=.TRUE.
 !
 TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
-!
-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','')
+
+IF (TPFLYER%CTITLE=='          ') THEN
+  WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR
+END IF
+
+IF ( TPFLYER%NSEG == 0 ) THEN
+  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
+  CMNHMSG(2) = 'There is ZERO flight segment defined.'
+  CMNHMSG(3) = 'Check your INI_AIRCRAFT routine'
+  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','')
+IF ( ANY(TPFLYER%XSEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%XSEGLON(:)==XUNDEF) ) THEN
+  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
+  CMNHMSG(2) = 'either LATitude or LONgitude segment'
+  CMNHMSG(3) = 'definiton is not complete.'
+  CMNHMSG(4) = 'Check your INI_AIRCRAFT routine'
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' )
 END IF
 !
-ALLOCATE(TPFLYER%SEGX(TPFLYER%SEG+1))
-ALLOCATE(TPFLYER%SEGY(TPFLYER%SEG+1))
+ALLOCATE(TPFLYER%XSEGX(TPFLYER%NSEG+1))
+ALLOCATE(TPFLYER%XSEGY(TPFLYER%NSEG+1))
 !
-DO JSEG=1,TPFLYER%SEG+1
-  CALL SM_XYHAT(PLATOR,PLONOR,                              &
-                TPFLYER%SEGLAT(JSEG), TPFLYER%SEGLON(JSEG), &
-                TPFLYER%SEGX(JSEG),   TPFLYER%SEGY(JSEG)    )
+DO JSEG=1,TPFLYER%NSEG+1
+  CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XSEGLAT(JSEG), TPFLYER%XSEGLON(JSEG), TPFLYER%XSEGX(JSEG), TPFLYER%XSEGY(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','')
+IF ( ANY(TPFLYER%XSEGTIME(:)==XUNDEF) ) THEN
+  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
+  CMNHMSG(2) = 'definiton of segment duration is not complete.'
+  CMNHMSG(3) = 'Check your INI_AIRCRAFT routine'
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' )
 END IF
-!
-!
-IF (TPFLYER%TITLE=='          ') THEN
-  WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR
-END IF
-!
+
 END SUBROUTINE INI_FLIGHT
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 68da88553..f9f2d1cd0 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -129,33 +129,33 @@ IF ( NBALLOONS < 1 ) RETURN
 !* model number
 !
 TBALLOONS(1)%NMODEL             = 0
-TBALLOONS(1)%MODEL             = 'MOB'
+TBALLOONS(1)%CMODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOONS(1)%TYPE               = 'CVBALL'
+TBALLOONS(1)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(1)%TITLE              = 'CVB1MOBI'
+TBALLOONS(1)%CTITLE              = 'CVB1MOBI'
 !
 !* launching date and time
 !
-TBALLOONS(1)%LAUNCH%nyear  =  1999
-TBALLOONS(1)%LAUNCH%nmonth =    09
-TBALLOONS(1)%LAUNCH%nday   =    19
-TBALLOONS(1)%LAUNCH%xtime  = 32460.
+TBALLOONS(1)%TLAUNCH%nyear  =  1999
+TBALLOONS(1)%TLAUNCH%nmonth =    09
+TBALLOONS(1)%TLAUNCH%nday   =    19
+TBALLOONS(1)%TLAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(1)%LAT                = 45.800
-TBALLOONS(1)%LON                =  8.629
+TBALLOONS(1)%XLATLAUNCH                = 45.800
+TBALLOONS(1)%XLONLAUNCH                =  8.629
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-!TBALLOONS(1)%ALT                =   3959.
-TBALLOONS(1)%PRES               = 98450.
+!TBALLOONS(1)%XALTLAUNCH                =   3959.
+TBALLOONS(1)%XPRES               = 98450.
 !
 !* time step for data storage  (s)
 !
@@ -163,18 +163,18 @@ TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOONS(1)%WASCENT            = 0.
+TBALLOONS(1)%XWASCENT            = 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')
 !
-TBALLOONS(1)%AERODRAG           = 0.44
-TBALLOONS(1)%INDDRAG           = 0.014
-TBALLOONS(1)%VOLUME           = 3.040
-TBALLOONS(1)%MASS           = 2.4516
-TBALLOONS(1)%DIAMETER           = ((3.*TBALLOONS(1)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(1)%XAERODRAG           = 0.44
+TBALLOONS(1)%XINDDRAG           = 0.014
+TBALLOONS(1)%XVOLUME           = 3.040
+TBALLOONS(1)%XMASS           = 2.4516
+TBALLOONS(1)%XDIAMETER           = ((3.*TBALLOONS(1)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 2 ) RETURN
 #else
@@ -193,29 +193,29 @@ TBALLOONS(2)%MODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOONS(2)%TYPE               = 'CVBALL'
+TBALLOONS(2)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(2)%TITLE              = 'CVB2MOBI'
+TBALLOONS(2)%CTITLE              = 'CVB2MOBI'
 !
 !* launching date and time
 !
-TBALLOONS(2)%LAUNCH%nyear  =  1999
-TBALLOONS(2)%LAUNCH%nmonth =    09
-TBALLOONS(2)%LAUNCH%nday   =    19
-TBALLOONS(2)%LAUNCH%xtime  = 39660.
+TBALLOONS(2)%TLAUNCH%nyear  =  1999
+TBALLOONS(2)%TLAUNCH%nmonth =    09
+TBALLOONS(2)%TLAUNCH%nday   =    19
+TBALLOONS(2)%TLAUNCH%xtime  = 39660.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(2)%LAT                = 45.800
-TBALLOONS(2)%LON                =  8.630
+TBALLOONS(2)%XLATLAUNCH                = 45.800
+TBALLOONS(2)%XLONLAUNCH                =  8.630
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-!TBALLOONS(2)%ALT                =   3959.
-TBALLOONS(2)%PRES               = 98490.
+!TBALLOONS(2)%XALTLAUNCH                =   3959.
+TBALLOONS(2)%XPRES               = 98490.
 !
 !* time step for data storage  (s)
 !
@@ -223,18 +223,18 @@ TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOONS(2)%WASCENT            = 0.
+TBALLOONS(2)%XWASCENT            = 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')
 !
-TBALLOONS(2)%AERODRAG           = 0.44
-TBALLOONS(2)%INDDRAG           = 0.014
-TBALLOONS(2)%VOLUME           = 3.040
-TBALLOONS(2)%MASS           = 2.58087
-TBALLOONS(2)%DIAMETER           = ((3.*TBALLOONS(2)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(2)%XAERODRAG           = 0.44
+TBALLOONS(2)%XINDDRAG           = 0.014
+TBALLOONS(2)%XVOLUME           = 3.040
+TBALLOONS(2)%XMASS           = 2.58087
+TBALLOONS(2)%XDIAMETER           = ((3.*TBALLOONS(2)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 3 ) RETURN
 #else
@@ -249,33 +249,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are
 !* model number
 !
 TBALLOONS(3)%NMODEL             = 0
-TBALLOONS(3)%MODEL             = 'MOB'
+TBALLOONS(3)%CMODEL             = 'MOB'
 !
 !* balloon type
 !
-TBALLOONS(3)%TYPE               = 'RADIOS'
+TBALLOONS(3)%CTYPE               = 'RADIOS'
 !
 !* balloon name
 !
-TBALLOONS(3)%TITLE              = 'RSMASE19'
+TBALLOONS(3)%CTITLE              = 'RSMASE19'
 !
 !* launching date and time
 !
-TBALLOONS(3)%LAUNCH%nyear  =  1999
-TBALLOONS(3)%LAUNCH%nmonth =    09
-TBALLOONS(3)%LAUNCH%nday   =    19
-TBALLOONS(3)%LAUNCH%xtime  = 68400.
+TBALLOONS(3)%TLAUNCH%nyear  =  1999
+TBALLOONS(3)%TLAUNCH%nmonth =    09
+TBALLOONS(3)%TLAUNCH%nday   =    19
+TBALLOONS(3)%TLAUNCH%xtime  = 68400.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(3)%LAT                = 46.810
-TBALLOONS(3)%LON                =  9.39
+TBALLOONS(3)%XLATLAUNCH                = 46.810
+TBALLOONS(3)%XLONLAUNCH                =  9.39
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-TBALLOONS(3)%ALT                =   865.
-!TBALLOONS(3)%PRES               = 62360.
+TBALLOONS(3)%XALTLAUNCH                =   865.
+!TBALLOONS(3)%XPRES               = 62360.
 !
 !* time step for data storage  (s)
 !
@@ -283,18 +283,18 @@ TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-TBALLOONS(3)%WASCENT            = 4.85
+TBALLOONS(3)%XWASCENT            = 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')
 !
-TBALLOONS(3)%AERODRAG           = 0.44
-TBALLOONS(3)%INDDRAG           = 0.014
-TBALLOONS(3)%VOLUME           = 3.040
-TBALLOONS(3)%MASS           = 2.4516
-TBALLOONS(3)%DIAMETER           = ((3.*TBALLOONS(3)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(3)%XAERODRAG           = 0.44
+TBALLOONS(3)%XINDDRAG           = 0.014
+TBALLOONS(3)%XVOLUME           = 3.040
+TBALLOONS(3)%XMASS           = 2.4516
+TBALLOONS(3)%XDIAMETER           = ((3.*TBALLOONS(3)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 4 ) RETURN
 #else
@@ -309,33 +309,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are
 !* model number
 !
 TBALLOONS(4)%NMODEL             = 0
-TBALLOONS(4)%MODEL             = 'FIX'
+TBALLOONS(4)%CMODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOONS(4)%TYPE               = 'CVBALL'
+TBALLOONS(4)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(4)%TITLE              = 'CVB1ACVB'
+TBALLOONS(4)%CTITLE              = 'CVB1ACVB'
 !
 !* launching date and time
 !
-TBALLOONS(4)%LAUNCH%nyear  =  1999
-TBALLOONS(4)%LAUNCH%nmonth =    09
-TBALLOONS(4)%LAUNCH%nday   =    19
-TBALLOONS(4)%LAUNCH%xtime  = 32460.
+TBALLOONS(4)%TLAUNCH%nyear  =  1999
+TBALLOONS(4)%TLAUNCH%nmonth =    09
+TBALLOONS(4)%TLAUNCH%nday   =    19
+TBALLOONS(4)%TLAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(4)%LAT                = 45.922
-TBALLOONS(4)%LON                =  8.646
+TBALLOONS(4)%XLATLAUNCH                = 45.922
+TBALLOONS(4)%XLONLAUNCH                =  8.646
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-TBALLOONS(4)%ALT                =   3959.
-!TBALLOONS(4)%PRES               = 62360.
+TBALLOONS(4)%XALTLAUNCH                =   3959.
+!TBALLOONS(4)%XPRES               = 62360.
 !
 !* time step for data storage  (s)
 !
@@ -343,18 +343,18 @@ TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOONS(4)%WASCENT            = 2.55
+!TBALLOONS(4)%XWASCENT            = 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')
 !
-TBALLOONS(4)%AERODRAG           = 0.44
-TBALLOONS(4)%INDDRAG           = 0.014
-TBALLOONS(4)%VOLUME           = 3.040
-TBALLOONS(4)%MASS           = 2.4516
-TBALLOONS(4)%DIAMETER           = ((3.*TBALLOONS(4)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(4)%XAERODRAG           = 0.44
+TBALLOONS(4)%XINDDRAG           = 0.014
+TBALLOONS(4)%XVOLUME           = 3.040
+TBALLOONS(4)%XMASS           = 2.4516
+TBALLOONS(4)%XDIAMETER           = ((3.*TBALLOONS(4)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 5 ) RETURN
 #else
@@ -369,33 +369,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are
 !* model number
 !
 TBALLOONS(5)%NMODEL             = 0
-TBALLOONS(5)%MODEL             = 'FIX'
+TBALLOONS(5)%CMODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOONS(5)%TYPE               = 'CVBALL'
+TBALLOONS(5)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(5)%TITLE              = 'CVB1DEPA'
+TBALLOONS(5)%CTITLE              = 'CVB1DEPA'
 !
 !* launching date and time
 !
-TBALLOONS(5)%LAUNCH%nyear  =  1999
-TBALLOONS(5)%LAUNCH%nmonth =    09
-TBALLOONS(5)%LAUNCH%nday   =    19
-TBALLOONS(5)%LAUNCH%xtime  = 32435.
+TBALLOONS(5)%TLAUNCH%nyear  =  1999
+TBALLOONS(5)%TLAUNCH%nmonth =    09
+TBALLOONS(5)%TLAUNCH%nday   =    19
+TBALLOONS(5)%TLAUNCH%xtime  = 32435.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(5)%LAT                = 45.800
-TBALLOONS(5)%LON                =  8.630
+TBALLOONS(5)%XLATLAUNCH                = 45.800
+TBALLOONS(5)%XLONLAUNCH                =  8.630
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-TBALLOONS(5)%ALT                =    340.
-!TBALLOONS(5)%PRES               = 62360.
+TBALLOONS(5)%XALTLAUNCH                =    340.
+!TBALLOONS(5)%XPRES               = 62360.
 !
 !* time step for data storage  (s)
 !
@@ -403,18 +403,18 @@ TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOONS(5)%WASCENT            = 2.55
+!TBALLOONS(5)%XWASCENT            = 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')
 !
-TBALLOONS(5)%AERODRAG           = 0.44
-TBALLOONS(5)%INDDRAG           = 0.014
-TBALLOONS(5)%VOLUME           = 3.040
-TBALLOONS(5)%MASS           = 2.4516
-TBALLOONS(5)%DIAMETER           = ((3.*TBALLOONS(5)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(5)%XAERODRAG           = 0.44
+TBALLOONS(5)%XINDDRAG           = 0.014
+TBALLOONS(5)%XVOLUME           = 3.040
+TBALLOONS(5)%XMASS           = 2.4516
+TBALLOONS(5)%XDIAMETER           = ((3.*TBALLOONS(5)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 6 ) RETURN
 #else
@@ -429,33 +429,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are
 !* model number
 !
 TBALLOONS(6)%NMODEL             = 0
-TBALLOONS(6)%MODEL             = 'FIX'
+TBALLOONS(6)%CMODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOONS(6)%TYPE               = 'CVBALL'
+TBALLOONS(6)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(6)%TITLE              = 'CVB1RCVB'
+TBALLOONS(6)%CTITLE              = 'CVB1RCVB'
 !
 !* launching date and time
 !
-TBALLOONS(6)%LAUNCH%nyear  =  1999
-TBALLOONS(6)%LAUNCH%nmonth =    09
-TBALLOONS(6)%LAUNCH%nday   =    19
-TBALLOONS(6)%LAUNCH%xtime  = 32460.
+TBALLOONS(6)%TLAUNCH%nyear  =  1999
+TBALLOONS(6)%TLAUNCH%nmonth =    09
+TBALLOONS(6)%TLAUNCH%nday   =    19
+TBALLOONS(6)%TLAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(6)%LAT                = 45.922
-TBALLOONS(6)%LON                =  8.646
+TBALLOONS(6)%XLATLAUNCH                = 45.922
+TBALLOONS(6)%XLONLAUNCH                =  8.646
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-!TBALLOONS(6)%ALT                =   3959.
-!TBALLOONS(6)%PRES               = 62360.
+!TBALLOONS(6)%XALTLAUNCH                =   3959.
+!TBALLOONS(6)%XPRES               = 62360.
 !
 !* time step for data storage  (s)
 !
@@ -463,18 +463,18 @@ TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOONS(6)%WASCENT            = 2.55
+!TBALLOONS(6)%XWASCENT            = 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')
 !
-TBALLOONS(6)%AERODRAG           = 0.44
-TBALLOONS(6)%INDDRAG           = 0.014
-TBALLOONS(6)%VOLUME           = 3.040
-TBALLOONS(6)%MASS           = 2.4516
-TBALLOONS(6)%DIAMETER           = ((3.*TBALLOONS(6)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(6)%XAERODRAG           = 0.44
+TBALLOONS(6)%XINDDRAG           = 0.014
+TBALLOONS(6)%XVOLUME           = 3.040
+TBALLOONS(6)%XMASS           = 2.4516
+TBALLOONS(6)%XDIAMETER           = ((3.*TBALLOONS(6)%XVOLUME)/(4.*XPI))**(1./3.)
 !
 IF ( NBALLOONS < 7 ) RETURN
 #else
@@ -489,33 +489,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are
 !* model number
 !
 TBALLOONS(7)%NMODEL             = 0
-TBALLOONS(7)%MODEL             = 'FIX'
+TBALLOONS(7)%CMODEL             = 'FIX'
 !
 !* balloon type
 !
-TBALLOONS(7)%TYPE               = 'CVBALL'
+TBALLOONS(7)%CTYPE               = 'CVBALL'
 !
 !* balloon name
 !
-TBALLOONS(7)%TITLE              = 'CVB1PISO'
+TBALLOONS(7)%CTITLE              = 'CVB1PISO'
 !
 !* launching date and time
 !
-TBALLOONS(7)%LAUNCH%nyear  =  1999
-TBALLOONS(7)%LAUNCH%nmonth =    09
-TBALLOONS(7)%LAUNCH%nday   =    19
-TBALLOONS(7)%LAUNCH%xtime  = 32460.
+TBALLOONS(7)%TLAUNCH%nyear  =  1999
+TBALLOONS(7)%TLAUNCH%nmonth =    09
+TBALLOONS(7)%TLAUNCH%nday   =    19
+TBALLOONS(7)%TLAUNCH%xtime  = 32460.
 !
 !* latitude and longitude of launching site (decimal degree)
 !
-TBALLOONS(7)%LAT                = 45.922
-TBALLOONS(7)%LON                =  8.646
+TBALLOONS(7)%XLATLAUNCH                = 45.922
+TBALLOONS(7)%XLONLAUNCH                =  8.646
 !
 !* altitude of the launching site for 'RADIOS'
 !* altitude or pressure of the flight level for 'ISODEN'
 !
-!TBALLOONS(7)%ALT                =   3959.
-TBALLOONS(7)%PRES               = 62360.
+!TBALLOONS(7)%XALTLAUNCH                =   3959.
+TBALLOONS(7)%XPRES               = 62360.
 !
 !* time step for data storage  (s)
 !
@@ -523,18 +523,18 @@ TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20.
 !
 !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
 !
-!TBALLOONS(7)%WASCENT            = 2.55
+!TBALLOONS(7)%XWASCENT            = 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')
 !
-TBALLOONS(7)%AERODRAG           = 0.44
-TBALLOONS(7)%INDDRAG           = 0.014
-TBALLOONS(7)%VOLUME           = 3.040
-TBALLOONS(7)%MASS           = 2.4516
-TBALLOONS(7)%DIAMETER           = ((3.*TBALLOONS(7)%VOLUME)/(4.*XPI))**(1./3.)
+TBALLOONS(7)%XAERODRAG           = 0.44
+TBALLOONS(7)%XINDDRAG           = 0.014
+TBALLOONS(7)%XVOLUME           = 3.040
+TBALLOONS(7)%XMASS           = 2.4516
+TBALLOONS(7)%XDIAMETER           = ((3.*TBALLOONS(7)%XVOLUME)/(4.*XPI))**(1./3.)
 #else
 CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
 #endif
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 54d38ad12..1a50954a0 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -57,20 +57,20 @@ TYPE :: TFLYERDATA
   !
   !* general information
   !
-  CHARACTER(LEN=3)    :: MODEL = '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
-  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 = .FALSE. ! occurence of crash
-  LOGICAL             :: FLY   = .FALSE. ! occurence of flying
+  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
+  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      ! launch/takeoff date and time
+  LOGICAL           :: LCRASH = .FALSE. ! occurence of crash
+  LOGICAL           :: LFLY   = .FALSE. ! occurence of flying
   !
   !* storage monitoring
   !
@@ -78,86 +78,86 @@ TYPE :: TFLYERDATA
   !
   !* current position of the balloon/aircraft
   !
-  REAL :: X_CUR = XUNDEF ! current x
-  REAL :: Y_CUR = XUNDEF ! current y
-  REAL :: Z_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
-  REAL :: P_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
+  REAL :: XX_CUR = XUNDEF ! current x
+  REAL :: XY_CUR = XUNDEF ! current y
+  REAL :: XZ_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
+  REAL :: XP_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
   !
   !* data records
   !
-  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 :: XX         => NULL() ! X(n)
+  REAL, DIMENSION(:),     POINTER :: XY         => NULL() ! Y(n)
+  REAL, DIMENSION(:),     POINTER :: XZ         => NULL() ! Z(n)
+  REAL, DIMENSION(:),     POINTER :: XLAT       => NULL() ! latitude (n)
+  REAL, DIMENSION(:),     POINTER :: XLON       => NULL() ! longitude(n)
+  REAL, DIMENSION(:),     POINTER :: XZON       => NULL() ! zonal wind(n)
+  REAL, DIMENSION(:),     POINTER :: XMER       => NULL() ! meridian wind(n)
+  REAL, DIMENSION(:),     POINTER :: XW         => NULL() ! w(n)  (air vertical speed)
+  REAL, DIMENSION(:),     POINTER :: XP         => NULL() ! p(n)
+  REAL, DIMENSION(:),     POINTER :: XTKE       => NULL() ! tke(n)
+  REAL, DIMENSION(:),     POINTER :: XTKE_DISS  => NULL() ! tke dissipation rate
+  REAL, DIMENSION(:),     POINTER :: XTH        => NULL() ! th(n)
+  REAL, DIMENSION(:,:),   POINTER :: XR         => NULL() ! r*(n)
+  REAL, DIMENSION(:,:),   POINTER :: XSV        => NULL() ! Sv*(n)
+  REAL, DIMENSION(:,:),   POINTER :: XRTZ       => NULL() ! tot hydrometeor mixing ratio
+  REAL, DIMENSION(:,:,:), POINTER :: XRZ        => NULL() ! water vapour mixing ratio
+  REAL, DIMENSION(:,:),   POINTER :: XFFZ       => NULL() ! horizontal wind
+  REAL, DIMENSION(:,:),   POINTER :: XIWCZ      => NULL() ! ice water content
+  REAL, DIMENSION(:,:),   POINTER :: XLWCZ      => NULL() ! liquid water content
+  REAL, DIMENSION(:,:),   POINTER :: XCIZ       => NULL() ! Ice concentration
+  REAL, DIMENSION(:,:),   POINTER :: XCCZ       => NULL() ! Cloud concentration (LIMA)
+  REAL, DIMENSION(:,:),   POINTER :: XCRZ       => NULL() ! Rain concentration (LIMA)
+  REAL, DIMENSION(:,:),   POINTER :: XCRARE     => NULL() ! cloud radar reflectivity
+  REAL, DIMENSION(:,:),   POINTER :: XCRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity
+  REAL, DIMENSION(:,:),   POINTER :: XWZ        => NULL() ! vertical profile of vertical velocity
+  REAL, DIMENSION(:,:),   POINTER :: XZZ        => NULL() ! vertical profile of mass point altitude (above sea)
+  REAL, DIMENSION(:,:),   POINTER :: XAER       => NULL() ! Extinction at 550 nm
+  REAL, DIMENSION(:,:),   POINTER :: XDST_WL    => NULL() ! Extinction by wavelength
+  REAL, DIMENSION(:),     POINTER :: XZS        => NULL() ! zs(n)
+  REAL, DIMENSION(:),     POINTER :: XTSRAD     => 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)
+  REAL, DIMENSION(:),     POINTER :: XTHW_FLUX => NULL() ! thw_flux(n)
+  REAL, DIMENSION(:),     POINTER :: XRCW_FLUX => NULL() ! rcw_flux(n)
+  REAL, DIMENSION(:,:),   POINTER :: XSVW_FLUX => NULL() ! psw_flux(n)
 END TYPE TFLYERDATA
 
 TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   !
   !* aircraft flight definition
   !
-  INTEGER :: SEG     = 0  ! number of aircraft flight segments
-  INTEGER :: SEGCURN = 1  ! current flight segment number
-  REAL    :: SEGCURT = 0. ! 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  )
+  INTEGER :: NSEG     = 0  ! number of aircraft flight segments
+  INTEGER :: NSEGCURN = 1  ! current flight segment number
+  REAL    :: XSEGCURT = 0. ! current flight segment time spent
+  REAL, DIMENSION(:), POINTER :: XSEGLAT  => NULL() ! latitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGLON  => NULL() ! longitude of flight segment extremities (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGX    => NULL() ! X of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGY    => NULL() ! Y of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGP    => NULL() ! pressure of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGZ    => NULL() ! altitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), POINTER :: XSEGTIME => NULL() ! duration of flight segments             (LEG  )
   !
   !* aircraft altitude type definition
   !
-  LOGICAL                       :: ALTDEF = .FALSE.  ! TRUE == altitude given in pressure
+  LOGICAL :: LALTDEF = .FALSE.  ! TRUE == altitude given in pressure
 END TYPE TAIRCRAFTDATA
 
 TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
   !
   !* balloon dynamical characteristics
   !
-  REAL :: LAT      = XUNDEF ! latitude of launch
-  REAL :: LON      = XUNDEF ! lontitude of launch
-  REAL :: XLAUNCH  = XUNDEF ! X coordinate of launch
-  REAL :: YLAUNCH  = XUNDEF ! Y coordinate of launch
-  REAL :: ALT      = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
-  REAL :: WASCENT  = 5.     ! ascent vertical speed, m/s (if 'RADIOS')
-  REAL :: RHO      = XUNDEF ! density of launch (if 'ISODEN')
-  REAL :: PRES     = XUNDEF ! pressure of launch (if 'ISODEN')
-  REAL :: DIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL')
-  REAL :: AERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL')
-  REAL :: INDDRAG  = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
-  REAL :: VOLUME   = XUNDEF ! volume of the balloon (m3) (if 'CVBALL')
-  REAL :: MASS     = XUNDEF ! mass of the balloon (kg) (if 'CVBALL')
+  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 = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
+  REAL :: XWASCENT   = 5.     ! ascent vertical speed, m/s (if 'RADIOS')
+  REAL :: XRHO       = XUNDEF ! density of launch (if 'ISODEN')
+  REAL :: XPRES      = XUNDEF ! pressure of launch (if 'ISODEN')
+  REAL :: XDIAMETER  = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL')
+  REAL :: XAERODRAG  = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL')
+  REAL :: XINDDRAG   = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
+  REAL :: XVOLUME    = XUNDEF ! volume of the balloon (m3) (if 'CVBALL')
+  REAL :: XMASS      = XUNDEF ! mass of the balloon (kg) (if 'CVBALL')
 END TYPE TBALLOONDATA
 
 INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 82040c7ea..d1e239263 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -175,25 +175,25 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !----------------------------------------------------------------------------
 !
 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 = 20 + SIZE(TPFLYER%XR,2) + 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
+IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1
 !
 ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
 
@@ -209,9 +209,9 @@ ALLOCATE (YUNITZ  (IPROCZ))
 ALLOCATE (IGRIDZ  (IPROCZ))
 !
 IGRID  = 1
-YGROUP = TPFLYER%TITLE
+YGROUP = TPFLYER%CTITLE
 IGRIDZ = 1
-YGROUPZ = TPFLYER%TITLE
+YGROUPZ = TPFLYER%CTITLE
 !
 !----------------------------------------------------------------------------
 JPROC = 0
@@ -220,22 +220,22 @@ JPROC = JPROC + 1
 YTITLE   (JPROC) = 'ZS'
 YUNIT    (JPROC) = 'm'
 YCOMMENT (JPROC) = 'orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZS(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZS(:)
 !
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA )
-    IF (TPFLYER%ALTDEF) THEN
+    IF (TPFLYER%LALTDEF) THEN
       JPROC = JPROC + 1
       YTITLE   (JPROC) = 'P'
       YUNIT    (JPROC) = 'Pascal'
       YCOMMENT (JPROC) = 'pressure'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%P(:)
+      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XP(:)
     ELSE
       JPROC = JPROC + 1
       YTITLE   (JPROC) = 'Z'
       YUNIT    (JPROC) = 'm'
       YCOMMENT (JPROC) = 'altitude'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:)
+      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
     ENDIF
 
   CLASS IS ( TBALLOONDATA )
@@ -243,7 +243,7 @@ SELECT TYPE ( TPFLYER )
     YTITLE   (JPROC) = 'Z'
     YUNIT    (JPROC) = 'm'
     YCOMMENT (JPROC) = 'altitude'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:)
+    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
 
 END SELECT
 !
@@ -257,36 +257,36 @@ JPROC = JPROC + 1
 YTITLE   (JPROC) = 'LAT'
 YUNIT    (JPROC) = 'degree'
 YCOMMENT (JPROC) = 'latitude'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%YLAT(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLAT(:)
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'ZON_WIND'
 YUNIT    (JPROC) = 'm s-1'
 YCOMMENT (JPROC) = 'zonal wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZON(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZON(:)
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'MER_WIND'
 YUNIT    (JPROC) = 'm s-1'
 YCOMMENT (JPROC) = 'meridian wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%MER(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XMER(:)
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'W'
 YUNIT    (JPROC) = 'm s-1'
 YCOMMENT (JPROC) = 'air vertical speed' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%W(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XW(:)
 !
 JPROC = JPROC + 1
 YTITLE   (JPROC) = 'Th'
 YUNIT    (JPROC) = 'K'
 YCOMMENT (JPROC) = 'potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TH(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTH(:)
 !
-DO JRR=1,SIZE(TPFLYER%R,2)
+DO JRR=1,SIZE(TPFLYER%XR,2)
   JPROC = JPROC+1
   YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,JRR)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,JRR)
   IF (JRR==1) THEN
     YTITLE   (JPROC) = 'Rv'
     YCOMMENT (JPROC) = 'water vapor mixing ratio' 
@@ -312,68 +312,69 @@ DO JRR=1,SIZE(TPFLYER%R,2)
 END DO
 !
 !add cloud liquid water content in g/m3 to compare to measurements from FSSP
-!IF (.NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
+!IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
 ALLOCATE (ZRHO(1,1,ISTORE))
-IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present
+IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present
   ZRHO(1,1,:) = 0.
-  DO JRR=1,SIZE(TPFLYER%R,2)
-    ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR)
+  DO JRR=1,SIZE(TPFLYER%XR,2)
+    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,ISTORE
-    IF (TPFLYER%P(JPT) == 0.) THEN
+    IF (TPFLYER%XP(JPT) == 0.) THEN
       ZRHO(1,1,JPT) = 0.
     ELSE
-      ZRHO(1,1,JPT) =  TPFLYER%P(JPT) / &
-               (XRD *ZRHO(1,1,JPT) *((TPFLYER%P(JPT)/XP00)**(XRD/XCPD))  )
+      ZRHO(1,1,JPT) =  TPFLYER%XP(JPT) / &
+               (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(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
+  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,2)*ZRHO(1,1,:)*1.E3
   DEALLOCATE (ZRHO)
 ENDIF
 !ENDIF
 !
-IF (SIZE(TPFLYER%TKE)>0) THEN
+IF (SIZE(TPFLYER%XTKE)>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(:)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE(:)
 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(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTHW_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(:)
+ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XRCW_FLUX(:)
 !
-DO JSV=1,SIZE(TPFLYER%SVW_FLUX,2)
+DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2)
   JPROC = JPROC + 1
+!PW: titre a modifier pour recuperer nom variables scalaires depuis TSVLIST?
   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)
+  ZWORK6 (1,1,1,:,1,JPROC) = 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(:)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE_DISS(:)
 ENDIF
 !
-IF (SIZE(TPFLYER%SV,2)>=1) THEN
+IF (SIZE(TPFLYER%XSV,2)>=1) THEN
   ! Scalar variables
   DO JSV = 1, NSV
     JPROC = JPROC + 1
@@ -382,14 +383,14 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
     YCOMMENT(JPROC) = ''
     IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
       YUNIT(JPROC)  = 'ppb'
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
     ELSE
       YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV)
+      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV)
     END IF
   END DO
 
-  IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN
+  IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
 
     ALLOCATE (ZSV(1,1,ISTORE,NSV_AER))
     ALLOCATE (ZRHO(1,1,ISTORE))
@@ -397,19 +398,19 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
     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%SV(:,NSV_AERBEG:NSV_AEREND)
-    IF (SIZE(TPFLYER%R,2) >0) THEN
+    ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(:,NSV_AERBEG:NSV_AEREND)
+    IF (SIZE(TPFLYER%XR,2) >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,SIZE(TPFLYER%XR,2)
+        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,:)                )
     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.
@@ -548,25 +549,25 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
     DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA)
   END IF
 
-  IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 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%SV(:,NSV_DSTBEG:NSV_DSTEND)
-    IF (SIZE(TPFLYER%R,2) >0) THEN
+    ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(:,NSV_DSTBEG:NSV_DSTEND)
+    IF (SIZE(TPFLYER%XR,2) >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,SIZE(TPFLYER%XR,2)
+        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,:)                )
     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
@@ -593,12 +594,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN
   END IF
 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(:)
+  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:)
 END IF
 !
 DO IK=1, IKU
@@ -609,12 +610,12 @@ DO IK=1, IKU
   YTITLEZ  (JPROCZ) = 'Rt'
   YUNITZ   (JPROCZ) = 'kg kg-1'
   YCOMMENTZ(JPROCZ) = '1D Total hydrometeor mixing ratio'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RTZ(:,IK)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRTZ(:,IK)
 !
-  DO JRR=1,SIZE(TPFLYER%RZ,3)
+  DO JRR=1,SIZE(TPFLYER%XRZ,3)
     JPROCZ = JPROCZ+1
     YUNITZ    (JPROCZ) = 'kg kg-1'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RZ(:,IK,JRR)
+    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRZ(:,IK,JRR)
     IF (JRR==1) THEN
       YTITLEZ   (JPROCZ) = 'Rv'
       YCOMMENTZ (JPROCZ) = '1D water vapor mixing ratio' 
@@ -643,66 +644,66 @@ DO IK=1, IKU
   YTITLEZ  (JPROCZ) = 'FF'
   YUNITZ   (JPROCZ) = 'm s-1'
   YCOMMENTZ(JPROCZ) = 'Horizontal wind'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%FFZ(:,IK)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XFFZ(:,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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XIWCZ(:,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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XLWCZ(:,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)
+    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,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)
+    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCCZ(:,IK)
 !
     JPROCZ = JPROCZ + 1
     YTITLEZ  (JPROCZ) = 'CRAINT'
     YUNITZ   (JPROCZ) = 'kg-1'
     YCOMMENTZ(JPROCZ) = 'Rain concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRZ(:,IK)
+    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRZ(:,IK)
 !
     JPROCZ = JPROCZ + 1
     YTITLEZ  (JPROCZ) = 'CICET'
     YUNITZ   (JPROCZ) = 'kg-1'
     YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK)
+    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE(:,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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE_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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XWZ(:,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)
+  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK)
 END DO
 !----------------------------------------------------------------------------
 !
@@ -740,11 +741,11 @@ tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Tr
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
 tzbudiachro%clevels  (NLVL_GROUP)       = Trim( ygroup )
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%title )
+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'
@@ -807,11 +808,11 @@ tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Tr
 
 tzbudiachro%lleveluse(NLVL_GROUP)       = .true.
 tzbudiachro%clevels  (NLVL_GROUP)       = Trim( ygroupz )
-tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%title )
+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'
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 54a7bbcb6..295de8c3a 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -83,7 +83,7 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 INTEGER :: JI
 
 DO JI = 1, NBALLOONS
-  IF ( TBALLOONS(JI)%FLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) )
+  IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) )
 END DO
 !
 !
@@ -107,13 +107,13 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !
 CALL SM_LATLON(XLATORI,XLONORI,  &
-     TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON)
+     TPFLYER%XX_CUR,TPFLYER%XY_CUR,ZLAT,ZLON)
 !
 !
 TZFIELD = TFIELDMETADATA(                  &
-  CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT', &
+  CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LAT', &
   CSTDNAME   = '',                         &
-  CLONGNAME  = TRIM(TPFLYER%TITLE)//'LAT', &
+  CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LAT', &
   CUNITS     = 'degree',                   &
   CDIR       = '--',                       &
   CCOMMENT   = '',                         &
@@ -124,9 +124,9 @@ TZFIELD = TFIELDMETADATA(                  &
 CALL IO_Field_write(TPFILE,TZFIELD,ZLAT)
 !
 TZFIELD = TFIELDMETADATA(                  &
-  CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON', &
+  CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LON', &
   CSTDNAME   = '',                         &
-  CLONGNAME  = TRIM(TPFLYER%TITLE)//'LON', &
+  CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LON', &
   CUNITS     = 'degree',                   &
   CDIR       = '--',                       &
   CCOMMENT   = '',                         &
@@ -137,9 +137,9 @@ TZFIELD = TFIELDMETADATA(                  &
 CALL IO_Field_write(TPFILE,TZFIELD,ZLON)
 !
 TZFIELD = TFIELDMETADATA(                  &
-  CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT', &
+  CMNHNAME   = TRIM(TPFLYER%CTITLE)//'ALT', &
   CSTDNAME   = '',                         &
-  CLONGNAME  = TRIM(TPFLYER%TITLE)//'ALT', &
+  CLONGNAME  = TRIM(TPFLYER%CTITLE)//'ALT', &
   CUNITS     = 'm',                        &
   CDIR       = '--',                       &
   CCOMMENT   = '',                         &
@@ -147,12 +147,12 @@ TZFIELD = TFIELDMETADATA(                  &
   NTYPE      = TYPEREAL,                   &
   NDIMS      = 0,                          &
   LTIMEDEP   = .TRUE.                      )
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR)
+CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XZ_CUR)
 !
 TZFIELD = TFIELDMETADATA(                      &
-  CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT', &
+  CMNHNAME   = TRIM(TPFLYER%CTITLE)//'WASCENT', &
   CSTDNAME   = '',                             &
-  CLONGNAME  = TRIM(TPFLYER%TITLE)//'WASCENT', &
+  CLONGNAME  = TRIM(TPFLYER%CTITLE)//'WASCENT', &
   CUNITS     = 'm s-1',                        &
   CDIR       = '--',                           &
   CCOMMENT   = '',                             &
@@ -160,12 +160,12 @@ TZFIELD = TFIELDMETADATA(                      &
   NTYPE      = TYPEREAL,                       &
   NDIMS      = 0,                              &
   LTIMEDEP   = .TRUE.                          )
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT)
+CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XWASCENT)
 !
 TZFIELD = TFIELDMETADATA(                  &
-  CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO', &
+  CMNHNAME   = TRIM(TPFLYER%CTITLE)//'RHO', &
   CSTDNAME   = '',                         &
-  CLONGNAME  = TRIM(TPFLYER%TITLE)//'RHO', &
+  CLONGNAME  = TRIM(TPFLYER%CTITLE)//'RHO', &
   CUNITS     = 'kg m-3',                   &
   CDIR       = '--',                       &
   CCOMMENT   = '',                         &
@@ -173,7 +173,7 @@ TZFIELD = TFIELDMETADATA(                  &
   NTYPE      = TYPEREAL,                   &
   NDIMS      = 0,                          &
   LTIMEDEP   = .TRUE.                      )
-CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO)
+CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XRHO)
 !
 !
 !
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index f2d57806c..21be258ef 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -90,6 +90,7 @@ 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
@@ -364,7 +365,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 +374,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 +383,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
@@ -655,7 +656,7 @@ IF(PRESENT(tpflyer))THEN
     NTYPE      = TYPEREAL,               &
     NDIMS      = 3,                      &
     LTIMEDEP   = .FALSE.                 )
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) )
+  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 = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJX', &
@@ -688,7 +689,7 @@ IF(PRESENT(tpflyer))THEN
     NTYPE      = TYPEREAL,               &
     NDIMS      = 3,                      &
     LTIMEDEP   = .FALSE.                 )
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) )
+  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 = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJY', &
@@ -721,7 +722,7 @@ IF(PRESENT(tpflyer))THEN
     NTYPE      = TYPEREAL,               &
     NDIMS      = 3,                      &
     LTIMEDEP   = .FALSE.                 )
-  CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) )
+  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 = TFIELDMETADATA(              &
     CMNHNAME   = TRIM(ygroup)//'.TRAJZ', &
@@ -1512,13 +1513,13 @@ if ( Present( tpflyer ) ) then
     ndimlist   = [ NMNHDIM_FLYER_TIME ],                    &
     ltimedep   = .false.                                    )
 
-  call IO_Field_write( tzfile, tzfield, tpflyer%x )
+  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
@@ -1563,21 +1564,21 @@ 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) )
-- 
GitLab


From 8d2de9e54ca7a7847278867b00cd4e0d38817133 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 3 Jun 2022 13:54:05 +0200
Subject: [PATCH 076/157] Philippe 03/06/2022: flyers: arrays are allocatable
 (instead of pointers)

---
 src/MNH/modd_aircraft_balloon.f90 | 81 ++++++++++++++++---------------
 1 file changed, 41 insertions(+), 40 deletions(-)

diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 1a50954a0..7e3c2f6b4 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -85,40 +85,41 @@ TYPE :: TFLYERDATA
   !
   !* data records
   !
-  REAL, DIMENSION(:),     POINTER :: XX         => NULL() ! X(n)
-  REAL, DIMENSION(:),     POINTER :: XY         => NULL() ! Y(n)
-  REAL, DIMENSION(:),     POINTER :: XZ         => NULL() ! Z(n)
-  REAL, DIMENSION(:),     POINTER :: XLAT       => NULL() ! latitude (n)
-  REAL, DIMENSION(:),     POINTER :: XLON       => NULL() ! longitude(n)
-  REAL, DIMENSION(:),     POINTER :: XZON       => NULL() ! zonal wind(n)
-  REAL, DIMENSION(:),     POINTER :: XMER       => NULL() ! meridian wind(n)
-  REAL, DIMENSION(:),     POINTER :: XW         => NULL() ! w(n)  (air vertical speed)
-  REAL, DIMENSION(:),     POINTER :: XP         => NULL() ! p(n)
-  REAL, DIMENSION(:),     POINTER :: XTKE       => NULL() ! tke(n)
-  REAL, DIMENSION(:),     POINTER :: XTKE_DISS  => NULL() ! tke dissipation rate
-  REAL, DIMENSION(:),     POINTER :: XTH        => NULL() ! th(n)
-  REAL, DIMENSION(:,:),   POINTER :: XR         => NULL() ! r*(n)
-  REAL, DIMENSION(:,:),   POINTER :: XSV        => NULL() ! Sv*(n)
-  REAL, DIMENSION(:,:),   POINTER :: XRTZ       => NULL() ! tot hydrometeor mixing ratio
-  REAL, DIMENSION(:,:,:), POINTER :: XRZ        => NULL() ! water vapour mixing ratio
-  REAL, DIMENSION(:,:),   POINTER :: XFFZ       => NULL() ! horizontal wind
-  REAL, DIMENSION(:,:),   POINTER :: XIWCZ      => NULL() ! ice water content
-  REAL, DIMENSION(:,:),   POINTER :: XLWCZ      => NULL() ! liquid water content
-  REAL, DIMENSION(:,:),   POINTER :: XCIZ       => NULL() ! Ice concentration
-  REAL, DIMENSION(:,:),   POINTER :: XCCZ       => NULL() ! Cloud concentration (LIMA)
-  REAL, DIMENSION(:,:),   POINTER :: XCRZ       => NULL() ! Rain concentration (LIMA)
-  REAL, DIMENSION(:,:),   POINTER :: XCRARE     => NULL() ! cloud radar reflectivity
-  REAL, DIMENSION(:,:),   POINTER :: XCRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity
-  REAL, DIMENSION(:,:),   POINTER :: XWZ        => NULL() ! vertical profile of vertical velocity
-  REAL, DIMENSION(:,:),   POINTER :: XZZ        => NULL() ! vertical profile of mass point altitude (above sea)
-  REAL, DIMENSION(:,:),   POINTER :: XAER       => NULL() ! Extinction at 550 nm
-  REAL, DIMENSION(:,:),   POINTER :: XDST_WL    => NULL() ! Extinction by wavelength
-  REAL, DIMENSION(:),     POINTER :: XZS        => NULL() ! zs(n)
-  REAL, DIMENSION(:),     POINTER :: XTSRAD     => NULL() ! Ts(n)
+
+  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 :: XAER       ! Extinction at 550 nm
+  REAL, DIMENSION(:,:),   ALLOCATABLE :: XDST_WL    ! Extinction by wavelength
+  REAL, DIMENSION(:),     ALLOCATABLE :: XZS        ! zs(n)
+  REAL, DIMENSION(:),     ALLOCATABLE :: XTSRAD     ! Ts(n)
   !
-  REAL, DIMENSION(:),     POINTER :: XTHW_FLUX => NULL() ! thw_flux(n)
-  REAL, DIMENSION(:),     POINTER :: XRCW_FLUX => NULL() ! rcw_flux(n)
-  REAL, DIMENSION(:,:),   POINTER :: XSVW_FLUX => NULL() ! psw_flux(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
@@ -128,13 +129,13 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   INTEGER :: NSEG     = 0  ! number of aircraft flight segments
   INTEGER :: NSEGCURN = 1  ! current flight segment number
   REAL    :: XSEGCURT = 0. ! current flight segment time spent
-  REAL, DIMENSION(:), POINTER :: XSEGLAT  => NULL() ! latitude of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGLON  => NULL() ! longitude of flight segment extremities (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGX    => NULL() ! X of flight segment extremities         (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGY    => NULL() ! Y of flight segment extremities         (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGP    => NULL() ! pressure of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGZ    => NULL() ! altitude of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), POINTER :: XSEGTIME => NULL() ! duration of flight segments             (LEG  )
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGLAT  ! latitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGLON  ! longitude of flight segment extremities (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGX    ! X of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGY    ! Y of flight segment extremities         (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGP    ! pressure of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGZ    ! altitude of flight segment extremities  (LEG+1)
+  REAL, DIMENSION(:), ALLOCATABLE :: XSEGTIME ! duration of flight segments             (LEG  )
   !
   !* aircraft altitude type definition
   !
-- 
GitLab


From 46766d3d35a54e33fe2315f2efba3e88799879dd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 3 Jun 2022 15:04:39 +0200
Subject: [PATCH 077/157] Philippe 03/06/2022: flyers: small improvements

---
 src/MNH/ini_aircraft_balloon.f90   |  4 ---
 src/MNH/modd_aircraft_balloon.f90  |  2 +-
 src/MNH/write_aircraft_balloon.f90 | 41 +++++++-----------------------
 3 files changed, 10 insertions(+), 37 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 1352e6577..64135ed5c 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -152,10 +152,6 @@ IF ( CPROGRAM == 'DIAG  ') THEN
 ENDIF
 !
 !
-IF ( IMI == 1 ) THEN
-  LFLYER=.FALSE.
-END IF
-!
 !----------------------------------------------------------------------------
 !
 !*      2.   Balloon initialization
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 7e3c2f6b4..a0e6e5070 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -51,7 +51,7 @@ save
 
 !-------------------------------------------------------------------------------------------
 !
-LOGICAL :: LFLYER    ! flag to use aircraft/balloons
+LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons
 !
 TYPE :: TFLYERDATA
   !
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index d1e239263..8c2132bf7 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -65,7 +65,6 @@ 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)
@@ -141,23 +140,17 @@ 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
 !
 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
@@ -201,17 +194,10 @@ ALLOCATE (ZWORK6(1,1,1,ISTORE,1,IPROC))
 ALLOCATE (YCOMMENT(IPROC))
 ALLOCATE (YTITLE  (IPROC))
 ALLOCATE (YUNIT   (IPROC))
-ALLOCATE (IGRID   (IPROC))
 ALLOCATE (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ))
 ALLOCATE (YCOMMENTZ(IPROCZ))
 ALLOCATE (YTITLEZ (IPROCZ))
 ALLOCATE (YUNITZ  (IPROCZ))
-ALLOCATE (IGRIDZ  (IPROCZ))
-!
-IGRID  = 1
-YGROUP = TPFLYER%CTITLE
-IGRIDZ = 1
-YGROUPZ = TPFLYER%CTITLE
 !
 !----------------------------------------------------------------------------
 JPROC = 0
@@ -706,14 +692,7 @@ DO IK=1, IKU
   ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK)
 END DO
 !----------------------------------------------------------------------------
-!
-ALLOCATE (ZW6(1,1,1,ISTORE,1,JPROC))
-ZW6  = ZWORK6(:,:,:,:,:,:JPROC)
-DEALLOCATE(ZWORK6)
-ALLOCATE (ZWZ6(1,1,IKU,ISTORE,1,JPROCZ))
-ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ)
-DEALLOCATE(ZWORKZ6)
-!
+
 allocate( tzfields( jproc ) )
 
 tzfields(:)%cmnhname  = ytitle(1 : jproc)
@@ -740,7 +719,7 @@ 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%clevels  (NLVL_GROUP)       = Trim( tpflyer%ctitle )
 tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
@@ -776,8 +755,8 @@ tzbudiachro%lnorm      = .false.
 ! tzbudiachro%nkl        = NOT SET (default values)
 ! tzbudiachro%nkh        = NOT SET (default values)
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zw6, &
-                    tpflyer = tpflyer                                                   )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwork6(:,:,:,:,:,:jproc), &
+                    tpflyer = tpflyer                                                                        )
 
 deallocate( tzfields )
 
@@ -807,7 +786,7 @@ 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%clevels  (NLVL_GROUP)       = Trim( tpflyer%ctitle )
 tzbudiachro%ccomments(NLVL_GROUP)       = 'Values for flyer ' // Trim( tpflyer%ctitle )
 
 tzbudiachro%lleveluse(NLVL_SHAPE)       = .true.
@@ -848,21 +827,19 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = iku
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwz6, &
-                    tpflyer = tpflyer                                                    )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zworkz6(:,:,:,:,:,:jprocz), &
+                    tpflyer = tpflyer                                                                          )
 
 deallocate( tzfields )
 
-DEALLOCATE (ZW6)
+DEALLOCATE (ZWORK6)
 DEALLOCATE (YCOMMENT)
 DEALLOCATE (YTITLE  )
 DEALLOCATE (YUNIT   )
-DEALLOCATE (IGRID   )
-DEALLOCATE (ZWZ6)
+DEALLOCATE (ZWORKZ6)
 DEALLOCATE (YCOMMENTZ)
 DEALLOCATE (YTITLEZ )
 DEALLOCATE (YUNITZ  )
-DEALLOCATE (IGRIDZ  )
 !----------------------------------------------------------------------------
 END SUBROUTINE FLYER_DIACHRO
 !----------------------------------------------------------------------------
-- 
GitLab


From 2d851baafabbeb43fd66132041aa62c98021316f Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 21 Jun 2022 11:23:41 +0200
Subject: [PATCH 078/157] Philippe 21/06/2022: bugfix: time_budget was not
 computed correctly (tdtexp -> tdtseg)

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 30 ++++++++++-----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index bc3633ddd..8ca884014 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -30,6 +30,7 @@
 !  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)
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -1468,7 +1469,6 @@ use modd_type_date,  only: date_time
 use mode_field,      only: Find_field_id_from_mnhname
 use mode_gridproj,   only: Sm_latlon
 use mode_nest_ll,    only: Get_model_number_ll, Go_tomodel_ll
-use mode_time,       only: tdtexp
 
 type(tfiledata),            intent(in) :: tpfile
 character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file coming from this program
@@ -1720,20 +1720,20 @@ if ( tpfile%lmaster ) then
       Allocate( tzdates_bound(2, nbutotwrite) )
 
       do jt = 1, nbutotwrite
-        tzdates(jt)%nyear  = tdtexp%nyear
-        tzdates(jt)%nmonth = tdtexp%nmonth
-        tzdates(jt)%nday   = tdtexp%nday
-        tzdates(jt)%xtime  = tdtexp%xtime + nbustep * ( ( jt - 1 )  + 0.5  ) * xtstep
-
-        tzdates_bound(1, jt)%nyear  = tdtexp%nyear
-        tzdates_bound(1, jt)%nmonth = tdtexp%nmonth
-        tzdates_bound(1, jt)%nday   = tdtexp%nday
-        tzdates_bound(1, jt)%xtime  = tdtexp%xtime + nbustep * ( jt - 1 ) * xtstep
-
-        tzdates_bound(2, jt)%nyear  = tdtexp%nyear
-        tzdates_bound(2, jt)%nmonth = tdtexp%nmonth
-        tzdates_bound(2, jt)%nday   = tdtexp%nday
-        tzdates_bound(2, jt)%xtime  = tdtexp%xtime + nbustep * jt * xtstep
+        tzdates(jt)%nyear  = tdtseg%nyear
+        tzdates(jt)%nmonth = tdtseg%nmonth
+        tzdates(jt)%nday   = tdtseg%nday
+        tzdates(jt)%xtime  = tdtseg%xtime + nbustep * ( ( jt - 1 )  + 0.5  ) * xtstep
+
+        tzdates_bound(1, jt)%nyear  = tdtseg%nyear
+        tzdates_bound(1, jt)%nmonth = tdtseg%nmonth
+        tzdates_bound(1, jt)%nday   = tdtseg%nday
+        tzdates_bound(1, jt)%xtime  = tdtseg%xtime + nbustep * ( jt - 1 ) * xtstep
+
+        tzdates_bound(2, jt)%nyear  = tdtseg%nyear
+        tzdates_bound(2, jt)%nmonth = tdtseg%nmonth
+        tzdates_bound(2, jt)%nday   = tdtseg%nday
+        tzdates_bound(2, jt)%xtime  = tdtseg%xtime + nbustep * jt * xtstep
       end do
 
       call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_TIME), 'time axis for budgets', tzdates, tzdates_bound )
-- 
GitLab


From 88a930d91434ea98802ec2c8e2b4b3397bb47243 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 16 Jun 2022 15:22:51 +0200
Subject: [PATCH 079/157] Philippe 16/06/2022: flyers: add Add_point and
 Add_profile subroutines and use them

---
 src/MNH/diag.f90                   |   4 +-
 src/MNH/modeln.f90                 |   2 +-
 src/MNH/write_aircraft_balloon.f90 | 737 +++++++++++------------------
 3 files changed, 290 insertions(+), 453 deletions(-)

diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 4bfd2dc5e..27362f835 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.
@@ -156,6 +156,7 @@ 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
@@ -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
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 01be40645..222333c7c 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -380,6 +380,7 @@ 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
@@ -446,7 +447,6 @@ 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
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 8c2132bf7..dc7726bcd 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -4,26 +4,28 @@
 !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
+
+implicit none
+
+private
+
+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
@@ -77,20 +79,8 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,             ONLY: XRV
-USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_PARAMETERS,      ONLY: XUNDEF
-!
 USE MODD_AIRCRAFT_BALLOON
-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_DIAG_IN_RUN,     ONLY: LDIAG_IN_RUN
-!
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-USE MODE_MODELN_HANDLER,  ONLY: GET_CURRENT_MODEL_INDEX
-use mode_msg
-use mode_write_diachro,   only: Write_diachro
+USE MODD_IO,              ONLY: TFILEDATA
 !
 IMPLICIT NONE
 !
@@ -103,70 +93,77 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: IMI    ! current model index
 INTEGER :: JI
 !
 !----------------------------------------------------------------------------
 !
-IMI=GET_CURRENT_MODEL_INDEX()
-!
 DO JI = 1, NBALLOONS
-  CALL FLYER_DIACHRO( TBALLOONS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) )
 END DO
 
 DO JI = 1, NAIRCRAFTS
-  CALL FLYER_DIACHRO( TAIRCRAFTS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) )
 END DO
 !
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
+END SUBROUTINE WRITE_AIRCRAFT_BALLOON
 !
-SUBROUTINE FLYER_DIACHRO(TPFLYER)
+! ############################################
+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 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, &
-                       tfieldmetadata_base, TYPEREAL
+USE MODE_AERO_PSD
+USE MODE_DUST_PSD
+USE MODE_MODELN_HANDLER,   ONLY: GET_CURRENT_MODEL_INDEX
+use mode_msg
+use mode_write_diachro,    only: Write_diachro
 
 use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
-CLASS(TFLYERDATA), INTENT(IN)       :: TPFLYER
+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 :: ZWORKZ6! contains temporal serie
 REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
 REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
 !
-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
-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
-INTEGER :: JLOOP
+INTEGER :: IKU
 type(tbudiachrometadata) :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 !
+IMI = GET_CURRENT_MODEL_INDEX()
+
+IRR = SIZE( tpflyer%xr, 2 )
+
 IF (TPFLYER%NMODEL==0) RETURN
 IF (ALL(TPFLYER%XX==XUNDEF)) RETURN
 IF (COUNT(TPFLYER%XX/=XUNDEF)<=1) RETURN
@@ -174,7 +171,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels
 !
-IPROC = 20 + SIZE(TPFLYER%XR,2) + SIZE(TPFLYER%XSV,2) &
+IPROC = 20 + 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)+ &
@@ -189,120 +186,52 @@ IF (LDUST) IPROC = IPROC + NMODE_DST*3
 IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1
 !
 ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
-
-ALLOCATE (ZWORK6(1,1,1,ISTORE,1,IPROC))
-ALLOCATE (YCOMMENT(IPROC))
-ALLOCATE (YTITLE  (IPROC))
-ALLOCATE (YUNIT   (IPROC))
-ALLOCATE (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ))
-ALLOCATE (YCOMMENTZ(IPROCZ))
-ALLOCATE (YTITLEZ (IPROCZ))
-ALLOCATE (YUNITZ  (IPROCZ))
 !
 !----------------------------------------------------------------------------
-JPROC = 0
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZS'
-YUNIT    (JPROC) = 'm'
-YCOMMENT (JPROC) = 'orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZS(:)
+!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(:) )
 !
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA )
     IF (TPFLYER%LALTDEF) THEN
-      JPROC = JPROC + 1
-      YTITLE   (JPROC) = 'P'
-      YUNIT    (JPROC) = 'Pascal'
-      YCOMMENT (JPROC) = 'pressure'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XP(:)
+      call Add_point( 'P', 'pressure', 'Pascal', tpflyer%xp(:) )
     ELSE
-      JPROC = JPROC + 1
-      YTITLE   (JPROC) = 'Z'
-      YUNIT    (JPROC) = 'm'
-      YCOMMENT (JPROC) = 'altitude'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
+      call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
     ENDIF
 
   CLASS IS ( TBALLOONDATA )
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'Z'
-    YUNIT    (JPROC) = 'm'
-    YCOMMENT (JPROC) = 'altitude'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
+    call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
 
 END SELECT
 !
-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%XLAT(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZON_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'zonal wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZON(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'MER_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'meridian wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XMER(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'W'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'air vertical speed' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XW(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'Th'
-YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTH(:)
-!
-DO JRR=1,SIZE(TPFLYER%XR,2)
-  JPROC = JPROC+1
-  YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,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
+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%XP(:) == 0.))) THEN
 ALLOCATE (ZRHO(1,1,ISTORE))
-IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present
+IF ( IRR > 1 ) THEN !cloud water is present
   ZRHO(1,1,:) = 0.
-  DO JRR=1,SIZE(TPFLYER%XR,2)
+  DO JRR = 1, IRR
     ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
   ENDDO
   ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -315,64 +244,31 @@ IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present
                (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(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%XR(:,2)*ZRHO(1,1,:)*1.E3
+  call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', tpflyer%xr(:,2)*ZRHO(1,1,:)*1.E3 )
   DEALLOCATE (ZRHO)
 ENDIF
 !ENDIF
 !
-IF (SIZE(TPFLYER%XTKE)>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%XTKE(:)
-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%XTHW_FLUX(:)
+IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) )
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LE_FLUX'
-YUNIT    (JPROC) = 'W m-2'
-YCOMMENT (JPROC) = 'latent flux' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XRCW_FLUX(:)
+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)
-  JPROC = JPROC + 1
-!PW: titre a modifier pour recuperer nom variables scalaires depuis TSVLIST?
-  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%XSVW_FLUX(:,JSV)
+  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%XTKE_DISS(:)
+  call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) )
 ENDIF
 !
 IF (SIZE(TPFLYER%XSV,2)>=1) THEN
   ! Scalar variables
   DO JSV = 1, NSV
-    JPROC = JPROC + 1
-
-    YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
-    YCOMMENT(JPROC) = ''
     IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
-      YUNIT(JPROC)  = 'ppb'
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsv(:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb
     ELSE
-      YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV)
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsv(:,jsv) )
     END IF
   END DO
 
@@ -385,9 +281,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     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 (SIZE(TPFLYER%XR,2) >0) THEN
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%XR,2)
+      DO JRR=1,IRR
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -408,128 +304,88 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     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)
@@ -542,9 +398,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     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 (SIZE(TPFLYER%XR,2) >0) THEN
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%XR,2)
+      DO JRR=1,IRR
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -557,23 +413,17 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     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)
@@ -582,124 +432,19 @@ ENDIF
 !
 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%XTSRAD(:)
+  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%XRTZ(:,IK)
-!
-  DO JRR=1,SIZE(TPFLYER%XRZ,3)
-    JPROCZ = JPROCZ+1
-    YUNITZ    (JPROCZ) = 'kg kg-1'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRZ(:,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%XFFZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'IWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Ice water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XIWCZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'LWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Liquid water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XLWCZ(:,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%XCIZ(:,IK)
-  ELSE
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CCLOUDT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'liquid cloud concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCCZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CRAINT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Rain concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CICET'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,IK)
- ENDIF
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RARE'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar reflectivity'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RAREatt'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar attenuated reflectivity' 
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE_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%XWZ(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'Z'
-  YUNITZ   (JPROCZ) = 'm'
-  YCOMMENTZ(JPROCZ) = '1D altitude above sea'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK)
-END DO
-!----------------------------------------------------------------------------
-
 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
@@ -755,18 +500,61 @@ tzbudiachro%lnorm      = .false.
 ! tzbudiachro%nkl        = NOT SET (default values)
 ! tzbudiachro%nkh        = NOT SET (default values)
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwork6(:,:,:,:,:,:jproc), &
+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 )
 
-allocate( tzfields( jprocz ) )
+!----------------------------------------------------------------------------
+!Treat vertical profiles
+
+ALLOCATE (XWORK6(1,1,IKU,ISTORE,1,IPROCZ))
+ALLOCATE (CCOMMENT(IPROCZ))
+ALLOCATE (CTITLE (IPROCZ))
+ALLOCATE (CUNIT  (IPROCZ))
 
-tzfields(:)%cmnhname  = ytitlez(1 : jprocz)
+JPROC = 0
+
+call Add_profile( 'Rt', '1D Total hydrometeor mixing ratio', 'kg kg-1', tpflyer%xrtz(:,:) )
+
+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) )
+
+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
@@ -827,22 +615,71 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = iku
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zworkz6(:,:,:,:,:,:jprocz), &
-                    tpflyer = tpflyer                                                                          )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), &
+                    tpflyer = tpflyer                                                                        )
 
 deallocate( tzfields )
 
-DEALLOCATE (ZWORK6)
-DEALLOCATE (YCOMMENT)
-DEALLOCATE (YTITLE  )
-DEALLOCATE (YUNIT   )
-DEALLOCATE (ZWORKZ6)
-DEALLOCATE (YCOMMENTZ)
-DEALLOCATE (YTITLEZ )
-DEALLOCATE (YUNITZ  )
+DEALLOCATE (XWORK6)
+DEALLOCATE (CCOMMENT)
+DEALLOCATE (CTITLE  )
+DEALLOCATE (CUNIT   )
+
+contains
+
+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
+
+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 )
+
+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 FLYER_DIACHRO
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
-END SUBROUTINE WRITE_AIRCRAFT_BALLOON
+
+END MODULE MODE_WRITE_AIRCRAFT_BALLOON
-- 
GitLab


From df8087ff6e09af710baa554b7d15cf9d49526cfb Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 24 Jun 2022 09:58:10 +0200
Subject: [PATCH 080/157] Philippe 24/06/2022: remove check on CSTORAGE_TYPE
 for restart of ForeFire variables

---
 src/MNH/ini_segn.f90    |  4 ++--
 src/MNH/read_exsegn.f90 | 14 ++++----------
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 7cd8620da..f5fc4e5ee 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.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.
@@ -453,7 +453,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,CSTORAGE_TYPE,CINIFILEPGD_n                      )
+                PTSTEP_ALL,CINIFILEPGD_n                                    )
 !
 IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  '      &
      .OR. CPROGRAM=='REAL  ') THEN
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index f77b127fe..243ed7665 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -21,7 +21,7 @@ INTERFACE
                    OCONDSAMP,OBLOWSNOW,                                            &
                    KRIMX,KRIMY, KSV_USER,                                          &
                    HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,              &
-                   HEQNSYS,PTSTEP_ALL,HSTORAGE_TYPE,HINIFILEPGD                    )
+                   HEQNSYS,PTSTEP_ALL,HINIFILEPGD                                  )
 !
 USE MODD_IO,   ONLY: TFILEDATA
 !
@@ -71,7 +71,6 @@ CHARACTER (LEN=4),  INTENT(IN) :: HCLOUD ! Kind of microphysical scheme
 CHARACTER (LEN=4),  INTENT(IN) :: HELEC  ! Kind of electrical scheme
 CHARACTER (LEN=*),  INTENT(IN) :: HEQNSYS! type of equations' system
 REAL,DIMENSION(:),  INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models
-CHARACTER (LEN=*),  INTENT(IN) :: HSTORAGE_TYPE ! type of initial file
 CHARACTER (LEN=*),  INTENT(IN) :: HINIFILEPGD ! name of PGD file
 !
 END SUBROUTINE READ_EXSEG_n
@@ -94,7 +93,7 @@ END MODULE MODI_READ_EXSEG_n
                    OCONDSAMP, OBLOWSNOW,                                           &
                    KRIMX,KRIMY, KSV_USER,                                          &
                    HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,              &
-                   HEQNSYS,PTSTEP_ALL,HSTORAGE_TYPE,HINIFILEPGD                    )
+                   HEQNSYS,PTSTEP_ALL,HINIFILEPGD                                  )
 !     #########################################################################
 !
 !!****  *READ_EXSEG_n * - routine to read  the descriptor file EXSEG
@@ -302,8 +301,9 @@ END MODULE MODI_READ_EXSEG_n
 !  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
 !  R. Honnert  23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT
-!  S. Riette   11/05/2021  HighLow cloud
+!  S. Riette   11/05/2021: HighLow cloud
 !  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -314,7 +314,6 @@ USE MODD_CH_AEROSOL
 USE MODD_CH_M9_n, ONLY : NEQ
 USE MODD_CONDSAMP
 USE MODD_CONF
-USE MODD_CONF_n,  ONLY: CSTORAGE_TYPE
 USE MODD_CONFZ
 ! USE MODD_DRAG_n
 USE MODD_DUST
@@ -455,7 +454,6 @@ CHARACTER (LEN=4),  INTENT(IN) :: HCLOUD ! Kind of microphysical scheme
 CHARACTER (LEN=4),  INTENT(IN) :: HELEC  ! Kind of electrical scheme
 CHARACTER (LEN=*),  INTENT(IN) :: HEQNSYS! type of equations' system
 REAL,DIMENSION(:),  INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models
-CHARACTER (LEN=*),  INTENT(IN) :: HSTORAGE_TYPE ! type of initial file
 CHARACTER (LEN=*),  INTENT(IN) :: HINIFILEPGD ! name of PGD file
 !
 !*       0.2   declarations of local variables
@@ -1750,7 +1748,6 @@ END IF
 IF (CCLOUD == 'LIMA') THEN
   IF (HCLOUD == 'LIMA') THEN
     CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='READ'
-!!JPP    IF(HSTORAGE_TYPE=='TT') CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='INIT'
   ELSE
     WRITE(UNIT=ILUOUT,FMT=9001) KMI
     WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LIMA &
@@ -2037,9 +2034,6 @@ END IF
 IF (LFOREFIRE) THEN
   IF (OFOREFIRE) THEN
     CGETSVT(NSV_FFBEG:NSV_FFEND)='READ'
-    IF(HSTORAGE_TYPE=='TT') THEN
-      CGETSVT(NSV_FFBEG:NSV_FFEND)='INIT'
-    END IF
   ELSE
     WRITE(UNIT=ILUOUT,FMT=9001) KMI
     WRITE(UNIT=ILUOUT,FMT='("THERE IS NO FOREFIRE SCALAR VARIABLES IN INITIAL FMFILE",/,&
-- 
GitLab


From 0cc413430ddab86b616fe6cd18e0f7f6a12d94ea Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Jul 2022 12:02:22 +0200
Subject: [PATCH 081/157] Philippe 01/07/2022: add olocal optional argument to
 force Print_msg on current process

---
 src/LIB/SURCOUCHE/src/mode_msg.f90 | 49 ++++++++++++++++++------------
 1 file changed, 30 insertions(+), 19 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_msg.f90 b/src/LIB/SURCOUCHE/src/mode_msg.f90
index 80d2f6677..ac78920fa 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
-- 
GitLab


From e65a2f06e5ab25321e2a962342732c8bc22f502a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Jul 2022 15:25:19 +0200
Subject: [PATCH 082/157] Philippe 01/07/2022: add use of optional OLOCAL
 argument of Print_msg when useful for stations and profilers

---
 src/MNH/profilern.f90       |  2 +-
 src/MNH/statprof_reader.f90 |  2 +-
 src/MNH/statprof_tools.f90  | 14 +++++++-------
 src/MNH/write_profilern.f90 |  6 ++++--
 src/MNH/write_stationn.f90  |  6 ++++--
 5 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index d915a9336..7226a452d 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -356,7 +356,7 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC
   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' )
+    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
diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90
index 888cfeac3..92eb1917f 100644
--- a/src/MNH/statprof_reader.f90
+++ b/src/MNH/statprof_reader.f90
@@ -118,7 +118,7 @@ DO
         CALL STATION_ADD( TZSTATPROF )
 
       CLASS DEFAULT
-        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF' )
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. )
     END SELECT
   END IF
 
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index 3c19593bb..e48358ed2 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -383,7 +383,7 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
         TPSTATPROF%NK = JK
 
       CLASS DEFAULT
-        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF' )
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. )
     END SELECT
   END IF
 
@@ -511,7 +511,7 @@ FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB )
          (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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB = XUNDEF
   END IF
 
@@ -551,7 +551,7 @@ FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB )
          (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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB = XUNDEF
   END IF
 
@@ -591,7 +591,7 @@ FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB )
          (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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB = XUNDEF
   END IF
 
@@ -638,7 +638,7 @@ FUNCTION STATPROF_INTERP_3D( TPSTATPROF, PA ) RESULT( PB )
       END IF
     END DO
   ELSE
-    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB(:) = XUNDEF
   END IF
 
@@ -678,7 +678,7 @@ FUNCTION STATPROF_INTERP_3D_U( TPSTATPROF, PA ) RESULT( PB )
             (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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_U', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB = XUNDEF
   END IF
 
@@ -718,7 +718,7 @@ FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB )
             (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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_V', 'value can not be interpolated', OLOCAL = .TRUE. )
     PB = XUNDEF
   END IF
 
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index ccb4fdcd2..e4e1263cb 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -229,7 +229,8 @@ PROFILER: DO JS = 1, INUMPROF
         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 /= IPACKSIZE (sender side)' )
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= 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 )
@@ -306,7 +307,8 @@ PROFILER: DO JS = 1, INUMPROF
         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 /= IPACKSIZE (receiver side)' )
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
     END IF
   END IF
 
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 4697b0e87..98c18dc67 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -198,7 +198,8 @@ STATION: DO JS = 1, INUMSTAT
         ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2;    IPOS = IPOS + ISTORE
       END IF
 
-      IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)' )
+      IF ( IPOS /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= 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 )
@@ -258,7 +259,8 @@ STATION: DO JS = 1, INUMSTAT
         TZSTATION%XSFCO2 =    ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
       END IF
 
-      IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)' )
+      IF ( IPOS /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
     END IF
   END IF
 
-- 
GitLab


From 4c16efba5fca6e81d6782cf9c20ed56a5d1470e3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 1 Jul 2022 15:26:59 +0200
Subject: [PATCH 083/157] Philippe 01/07/2022: stations: minor bugfix: correct
 warning when buffer size is not as expected

---
 src/MNH/write_profilern.f90 | 4 ++--
 src/MNH/write_stationn.f90  | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index e4e1263cb..acda0bf50 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -230,7 +230,7 @@ PROFILER: DO JS = 1, INUMPROF
       END IF
 
       IF ( IPOS-1 /= IPACKSIZE ) &
-        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (sender side)', OLOCAL = .TRUE. )
+        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 )
@@ -308,7 +308,7 @@ PROFILER: DO JS = 1, INUMPROF
       END IF
 
       IF ( IPOS-1 /= IPACKSIZE ) &
-        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
     END IF
   END IF
 
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 98c18dc67..309b4eb21 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -198,8 +198,8 @@ STATION: DO JS = 1, INUMSTAT
         ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2;    IPOS = IPOS + ISTORE
       END IF
 
-      IF ( IPOS /= IPACKSIZE ) &
-        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)', OLOCAL = .TRUE. )
+      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 )
@@ -259,8 +259,8 @@ STATION: DO JS = 1, INUMSTAT
         TZSTATION%XSFCO2 =    ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE
       END IF
 
-      IF ( IPOS /= IPACKSIZE ) &
-        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
+      IF ( IPOS-1 /= IPACKSIZE ) &
+        call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. )
     END IF
   END IF
 
-- 
GitLab


From 46e214d03a76143e34b7116b0e64d3cf616a3672 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 4 Jul 2022 11:01:25 +0200
Subject: [PATCH 084/157] Philippe 04/07/2022: workaroung GCC bug: date_time is
 not defined as an extended type of date (to prevent failure when reading
 arrays of date_type in namelists)

---
 src/MNH/modd_type_date.f90 | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90
index e9717d321..d1b3078e8 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.
@@ -47,8 +47,19 @@ type date
   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
+end type date_time
+#endif
 !
 end module modd_type_date
-- 
GitLab


From 431626cb65555feb74d454541ea4ea725c0cfafb Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 11 Jul 2022 11:42:39 +0200
Subject: [PATCH 085/157] Philippe 11/07/2022: add Datetime_initialized_check
 function

---
 src/MNH/modd_type_date.f90 | 83 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90
index d1b3078e8..31b67ef89 100644
--- a/src/MNH/modd_type_date.f90
+++ b/src/MNH/modd_type_date.f90
@@ -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,7 +47,7 @@ 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)
@@ -59,7 +60,85 @@ type :: date_time
   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
-- 
GitLab


From 2bc237431658021f75f48b9fcf2008be3be623b6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 13 Jul 2022 09:52:46 +0200
Subject: [PATCH 086/157] Philippe 13/07/2022: date_time: correct problem with
 use of default constructor

---
 src/MNH/prep_ideal_case.f90 | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 0a4aa09b9..5169942d6 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.
@@ -1480,7 +1480,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
@@ -1499,7 +1499,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
-- 
GitLab


From 122d2ddfe3fa25a6b8489496652735b770594be0 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 13 Jul 2022 09:50:04 +0200
Subject: [PATCH 087/157] Philippe 13/07/2022: balloons: give balloons
 characteristics in namelist instead of hardcoded

---
 src/MNH/aircraft_balloon_evol.f90 |  12 +-
 src/MNH/ini_balloon.f90           | 683 +++++++++++-------------------
 src/MNH/modd_aircraft_balloon.f90 |  28 +-
 src/MNH/modn_balloons.f90         |  93 ++++
 src/MNH/modn_flyers.f90           |  21 +
 src/MNH/read_exsegn.f90           |  12 +
 src/MNH/write_desfmn.f90          |   5 +
 7 files changed, 396 insertions(+), 458 deletions(-)
 create mode 100644 src/MNH/modn_balloons.f90
 create mode 100644 src/MNH/modn_flyers.f90

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index d7de3a7c1..c79631fa0 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -455,7 +455,7 @@ IF ( .NOT. TPFLYER%LFLY ) THEN
         END IF
 
       CLASS DEFAULT
-        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER' )
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER', OLOCAL = .TRUE. )
 
     END SELECT
 !
@@ -636,7 +636,7 @@ IF ( TPFLYER%LFLY ) THEN
               ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
               ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
               ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-              IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN
+              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
                 IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
                 IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
                 IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
@@ -646,7 +646,7 @@ IF ( TPFLYER%LFLY ) THEN
                 ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
                 ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
                 TPFLYER%XRHO = FLYER_INTERP(ZRHO)
-              ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN
+              ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN
                 ZFLYER_EXN = (TPFLYER%XPRES/XP00)**(XRD/XCPD)
                 IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
                 IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
@@ -661,7 +661,7 @@ IF ( TPFLYER%LFLY ) THEN
                 CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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' )
+                CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
               END IF
 !
 !*      5.2.2 Radiosounding balloon
@@ -680,7 +680,7 @@ IF ( TPFLYER%LFLY ) THEN
               ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
               ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
               ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-              IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN
+              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
                 IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
                 IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
                 IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
@@ -699,7 +699,7 @@ IF ( TPFLYER%LFLY ) THEN
                   TPFLYER%XRHO = FLYER_INTERP(ZRHO)
                   TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
                 END IF
-              ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN
+              ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN
                 ZFLYER_EXN = (TPFLYER%XPRES/XP00)**(XRD/XCPD)
                 IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
                 IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index f9f2d1cd0..886f3f83e 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -18,7 +18,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,452 +93,259 @@
 !!    -------------
 !!     Original 15/05/2000
 !!              Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models
-!  P. Wautelet    06/2022: reorganize flyers
+!  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: XUNDEF
 
 USE MODE_MSG
 
+USE MODN_BALLOONS
+
 IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
+
 INTEGER :: JI
-!----------------------------------------------------------------------------
-NBALLOONS = 0
 
-ALLOCATE( TBALLOONS(NBALLOONS) )
+ALLOCATE( TBALLOONS (NBALLOONS)  )
+
+!Treat balloon data read in namelist
+DO JI = 1, NBALLOONS
+  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' )
+  END IF
+  TBALLOONS(JI)%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' )
+      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) ) // ')' )
+    END IF
+    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' )
+    CMODEL(JI) = 'FIX'
+    NMODEL(JI) = 1
+  END IF
+  TBALLOONS(JI)%CMODEL = CMODEL(JI)
+  TBALLOONS(JI)%NMODEL = NMODEL(JI)
+
+  TBALLOONS(JI)%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) ) )
+  TBALLOONS(JI)%TLAUNCH  = TLAUNCH(JI)
+
+  IF ( XLATLAUNCH(JI) == XUNDEF ) &
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
+  TBALLOONS(JI)%XLATLAUNCH = XLATLAUNCH(JI)
+
+  IF ( XLONLAUNCH(JI) == XUNDEF ) &
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
+  TBALLOONS(JI)%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' )
+    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) ) )
+    XTSTEP(JI) = 60.
+  END IF
+  TBALLOONS(JI)%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' )
+      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) ) )
+      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
+      TBALLOONS(JI)%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.' )
+        XWASCENT(JI) = 0.
+      END IF
+      TBALLOONS(JI)%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' )
+        XAERODRAG(JI) = 0.44
+      END IF
+      TBALLOONS(JI)%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' )
+        XINDDRAG(JI) = 0.014
+      END IF
+      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+
+      IF ( XMASS(JI) == XNEGUNDEF ) &
+        CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'mass not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) )
+      TBALLOONS(JI)%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) ) )
+
+      IF ( XDIAMETER(JI) <= 0. ) THEN
+        TBALLOONS(JI)%XVOLUME          = XVOLUME(JI)
+        TBALLOONS(JI)%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
+      ELSE IF ( XVOLUME(JI) <= 0 ) THEN
+        TBALLOONS(JI)%XDIAMETER        = XDIAMETER(JI)
+        TBALLOONS(JI)%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) ) )
+      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) ) )
+      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) ) )
+      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
+      TBALLOONS(JI)%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' )
+        XWASCENT(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XAERODRAG(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XINDDRAG(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XMASS(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XDIAMETER(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XVOLUME(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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) ) )
+      TBALLOONS(JI)%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.' )
+        XWASCENT(JI) = 5.
+      END IF
+      TBALLOONS(JI)%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' )
+        XPRES(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XAERODRAG(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XINDDRAG(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XMASS(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XDIAMETER(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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' )
+        XVOLUME(JI) = XNEGUNDEF
+      END IF
+      TBALLOONS(JI)%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) ) )
+
+  END SELECT
+END DO
+
+CALL BALLOONS_NML_DEALLOCATE()
 
-IF ( NBALLOONS < 1 ) RETURN
-!
-!*      1.   Balloon number 1
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(1)%NMODEL             = 0
-TBALLOONS(1)%CMODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOONS(1)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(1)%CTITLE              = 'CVB1MOBI'
-!
-!* launching date and time
-!
-TBALLOONS(1)%TLAUNCH%nyear  =  1999
-TBALLOONS(1)%TLAUNCH%nmonth =    09
-TBALLOONS(1)%TLAUNCH%nday   =    19
-TBALLOONS(1)%TLAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(1)%XLATLAUNCH                = 45.800
-TBALLOONS(1)%XLONLAUNCH                =  8.629
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOONS(1)%XALTLAUNCH                =   3959.
-TBALLOONS(1)%XPRES               = 98450.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOONS(1)%XWASCENT            = 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')
-!
-TBALLOONS(1)%XAERODRAG           = 0.44
-TBALLOONS(1)%XINDDRAG           = 0.014
-TBALLOONS(1)%XVOLUME           = 3.040
-TBALLOONS(1)%XMASS           = 2.4516
-TBALLOONS(1)%XDIAMETER           = ((3.*TBALLOONS(1)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 2 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      2.   Balloon number 2
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(2)%NMODEL             = 0
-TBALLOONS(2)%MODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOONS(2)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(2)%CTITLE              = 'CVB2MOBI'
-!
-!* launching date and time
-!
-TBALLOONS(2)%TLAUNCH%nyear  =  1999
-TBALLOONS(2)%TLAUNCH%nmonth =    09
-TBALLOONS(2)%TLAUNCH%nday   =    19
-TBALLOONS(2)%TLAUNCH%xtime  = 39660.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(2)%XLATLAUNCH                = 45.800
-TBALLOONS(2)%XLONLAUNCH                =  8.630
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOONS(2)%XALTLAUNCH                =   3959.
-TBALLOONS(2)%XPRES               = 98490.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOONS(2)%XWASCENT            = 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')
-!
-TBALLOONS(2)%XAERODRAG           = 0.44
-TBALLOONS(2)%XINDDRAG           = 0.014
-TBALLOONS(2)%XVOLUME           = 3.040
-TBALLOONS(2)%XMASS           = 2.58087
-TBALLOONS(2)%XDIAMETER           = ((3.*TBALLOONS(2)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 3 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      3.   Balloon number 3
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(3)%NMODEL             = 0
-TBALLOONS(3)%CMODEL             = 'MOB'
-!
-!* balloon type
-!
-TBALLOONS(3)%CTYPE               = 'RADIOS'
-!
-!* balloon name
-!
-TBALLOONS(3)%CTITLE              = 'RSMASE19'
-!
-!* launching date and time
-!
-TBALLOONS(3)%TLAUNCH%nyear  =  1999
-TBALLOONS(3)%TLAUNCH%nmonth =    09
-TBALLOONS(3)%TLAUNCH%nday   =    19
-TBALLOONS(3)%TLAUNCH%xtime  = 68400.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(3)%XLATLAUNCH                = 46.810
-TBALLOONS(3)%XLONLAUNCH                =  9.39
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOONS(3)%XALTLAUNCH                =   865.
-!TBALLOONS(3)%XPRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-TBALLOONS(3)%XWASCENT            = 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')
-!
-TBALLOONS(3)%XAERODRAG           = 0.44
-TBALLOONS(3)%XINDDRAG           = 0.014
-TBALLOONS(3)%XVOLUME           = 3.040
-TBALLOONS(3)%XMASS           = 2.4516
-TBALLOONS(3)%XDIAMETER           = ((3.*TBALLOONS(3)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 4 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      4.   Balloon number 4
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(4)%NMODEL             = 0
-TBALLOONS(4)%CMODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOONS(4)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(4)%CTITLE              = 'CVB1ACVB'
-!
-!* launching date and time
-!
-TBALLOONS(4)%TLAUNCH%nyear  =  1999
-TBALLOONS(4)%TLAUNCH%nmonth =    09
-TBALLOONS(4)%TLAUNCH%nday   =    19
-TBALLOONS(4)%TLAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(4)%XLATLAUNCH                = 45.922
-TBALLOONS(4)%XLONLAUNCH                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOONS(4)%XALTLAUNCH                =   3959.
-!TBALLOONS(4)%XPRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOONS(4)%XWASCENT            = 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')
-!
-TBALLOONS(4)%XAERODRAG           = 0.44
-TBALLOONS(4)%XINDDRAG           = 0.014
-TBALLOONS(4)%XVOLUME           = 3.040
-TBALLOONS(4)%XMASS           = 2.4516
-TBALLOONS(4)%XDIAMETER           = ((3.*TBALLOONS(4)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 5 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      5.   Balloon number 5
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(5)%NMODEL             = 0
-TBALLOONS(5)%CMODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOONS(5)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(5)%CTITLE              = 'CVB1DEPA'
-!
-!* launching date and time
-!
-TBALLOONS(5)%TLAUNCH%nyear  =  1999
-TBALLOONS(5)%TLAUNCH%nmonth =    09
-TBALLOONS(5)%TLAUNCH%nday   =    19
-TBALLOONS(5)%TLAUNCH%xtime  = 32435.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(5)%XLATLAUNCH                = 45.800
-TBALLOONS(5)%XLONLAUNCH                =  8.630
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-TBALLOONS(5)%XALTLAUNCH                =    340.
-!TBALLOONS(5)%XPRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOONS(5)%XWASCENT            = 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')
-!
-TBALLOONS(5)%XAERODRAG           = 0.44
-TBALLOONS(5)%XINDDRAG           = 0.014
-TBALLOONS(5)%XVOLUME           = 3.040
-TBALLOONS(5)%XMASS           = 2.4516
-TBALLOONS(5)%XDIAMETER           = ((3.*TBALLOONS(5)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 6 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      6.   Balloon number 6
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(6)%NMODEL             = 0
-TBALLOONS(6)%CMODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOONS(6)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(6)%CTITLE              = 'CVB1RCVB'
-!
-!* launching date and time
-!
-TBALLOONS(6)%TLAUNCH%nyear  =  1999
-TBALLOONS(6)%TLAUNCH%nmonth =    09
-TBALLOONS(6)%TLAUNCH%nday   =    19
-TBALLOONS(6)%TLAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(6)%XLATLAUNCH                = 45.922
-TBALLOONS(6)%XLONLAUNCH                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOONS(6)%XALTLAUNCH                =   3959.
-!TBALLOONS(6)%XPRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOONS(6)%XWASCENT            = 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')
-!
-TBALLOONS(6)%XAERODRAG           = 0.44
-TBALLOONS(6)%XINDDRAG           = 0.014
-TBALLOONS(6)%XVOLUME           = 3.040
-TBALLOONS(6)%XMASS           = 2.4516
-TBALLOONS(6)%XDIAMETER           = ((3.*TBALLOONS(6)%XVOLUME)/(4.*XPI))**(1./3.)
-!
-IF ( NBALLOONS < 7 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      7.   Balloon number 7
-!            ----------------
-#if 0
-!
-!* model number
-!
-TBALLOONS(7)%NMODEL             = 0
-TBALLOONS(7)%CMODEL             = 'FIX'
-!
-!* balloon type
-!
-TBALLOONS(7)%CTYPE               = 'CVBALL'
-!
-!* balloon name
-!
-TBALLOONS(7)%CTITLE              = 'CVB1PISO'
-!
-!* launching date and time
-!
-TBALLOONS(7)%TLAUNCH%nyear  =  1999
-TBALLOONS(7)%TLAUNCH%nmonth =    09
-TBALLOONS(7)%TLAUNCH%nday   =    19
-TBALLOONS(7)%TLAUNCH%xtime  = 32460.
-!
-!* latitude and longitude of launching site (decimal degree)
-!
-TBALLOONS(7)%XLATLAUNCH                = 45.922
-TBALLOONS(7)%XLONLAUNCH                =  8.646
-!
-!* altitude of the launching site for 'RADIOS'
-!* altitude or pressure of the flight level for 'ISODEN'
-!
-!TBALLOONS(7)%XALTLAUNCH                =   3959.
-TBALLOONS(7)%XPRES               = 62360.
-!
-!* time step for data storage  (s)
-!
-TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20.
-!
-!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS')
-!
-!TBALLOONS(7)%XWASCENT            = 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')
-!
-TBALLOONS(7)%XAERODRAG           = 0.44
-TBALLOONS(7)%XINDDRAG           = 0.014
-TBALLOONS(7)%XVOLUME           = 3.040
-TBALLOONS(7)%XMASS           = 2.4516
-TBALLOONS(7)%XDIAMETER           = ((3.*TBALLOONS(7)%XVOLUME)/(4.*XPI))**(1./3.)
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' )
-#endif
-!
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_BALLOON
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index a0e6e5070..4e71d254d 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -41,7 +41,7 @@
 !             ------------
 !
 !
-use modd_parameters,    only: XUNDEF
+use modd_parameters,    only: XNEGUNDEF, XUNDEF
 USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME
 use modd_type_date,     only: date_time
 
@@ -78,10 +78,10 @@ TYPE :: TFLYERDATA
   !
   !* current position of the balloon/aircraft
   !
-  REAL :: XX_CUR = XUNDEF ! current x
-  REAL :: XY_CUR = XUNDEF ! current y
-  REAL :: XZ_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
-  REAL :: XP_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
+  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)
+  REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
   !
   !* data records
   !
@@ -150,15 +150,15 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
   REAL :: XLONLAUNCH = XUNDEF ! lontitude of launch
   REAL :: XXLAUNCH   = XUNDEF ! X coordinate of launch
   REAL :: XYLAUNCH   = XUNDEF ! Y coordinate of launch
-  REAL :: XALTLAUNCH = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL')
-  REAL :: XWASCENT   = 5.     ! ascent vertical speed, m/s (if 'RADIOS')
-  REAL :: XRHO       = XUNDEF ! density of launch (if 'ISODEN')
-  REAL :: XPRES      = XUNDEF ! pressure of launch (if 'ISODEN')
-  REAL :: XDIAMETER  = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL')
-  REAL :: XAERODRAG  = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL')
-  REAL :: XINDDRAG   = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL')
-  REAL :: XVOLUME    = XUNDEF ! volume of the balloon (m3) (if 'CVBALL')
-  REAL :: XMASS      = XUNDEF ! mass of the balloon (kg) (if 'CVBALL')
+  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')
 END TYPE TBALLOONDATA
 
 INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
diff --git a/src/MNH/modn_balloons.f90 b/src/MNH/modn_balloons.f90
new file mode 100644
index 000000000..f77356c88
--- /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 000000000..0c8b6e3e2
--- /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/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 243ed7665..a3303a5fe 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -304,10 +304,12 @@ END MODULE MODI_READ_EXSEG_n
 !  S. Riette   11/05/2021: HighLow cloud
 !  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
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
+USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS
 USE MODD_BLOWSNOW
 USE MODD_BUDGET
 USE MODD_CH_AEROSOL
@@ -342,6 +344,7 @@ 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_BACKUP
+USE MODN_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS
 USE MODN_BLANK_n
 USE MODN_BLOWSNOW
 USE MODN_BLOWSNOW_n
@@ -363,6 +366,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
@@ -844,6 +848,14 @@ 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 ( 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
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index c88c912d4..046b0bd1e 100644
--- a/src/MNH/write_desfmn.f90
+++ b/src/MNH/write_desfmn.f90
@@ -147,6 +147,7 @@ END MODULE MODI_WRITE_DESFM_n
 !!      Modification   F.Auguste      02/2021  add IBM
 !!                     E.Jezequel     02/2021  add stations read from CSV file
 !  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 13/07/2022: add namelist for flyers and balloons
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -163,6 +164,7 @@ USE MODD_STATION_n,  ONLY: LSTATION
 USE MODE_MSG
 !
 USE MODN_BACKUP
+USE MODN_BALLOONS
 USE MODN_CONF
 USE MODN_DYN
 USE MODN_NESTING
@@ -211,6 +213,7 @@ USE MODN_IBM_PARAM_n
 USE MODN_RECYCL_PARAM_n
 USE MODN_PROFILER_n
 USE MODN_STATION_n
+USE MODN_FLYERS
 !
 IMPLICIT NONE
 !
@@ -451,6 +454,8 @@ 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_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS)
 !
 !
 !
-- 
GitLab


From 1e3ba6d94784a81f32bad482e9a6016289c21f1a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 19 Aug 2022 09:53:28 +0200
Subject: [PATCH 088/157] Philippe 19/08/2022: bugfix:
 IO_File_check_format_exist: broadcast cformat if changed

(cherry picked from commit ca0712732dc623b16d1f89ad6a3962b117039c6b)
---
 src/LIB/SURCOUCHE/src/mode_io_file.f90 | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90
index e269accf0..6ed3a03c2 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-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.
@@ -38,6 +38,7 @@
 !  P. Wautelet 12/03/2019: simplify opening of IO split files
 !  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
 !-----------------------------------------------------------------
 module mode_io_file
 
@@ -666,9 +667,11 @@ end subroutine IO_Transfer_list_addto
 
 
 subroutine IO_File_check_format_exist( tpfile )
+use modd_mpif
 
 type(tfiledata), intent(inout) :: tpfile ! File structure
 
+integer :: ierr
 logical :: gexist_lfi, gexist_nc4
 
 
@@ -720,6 +723,9 @@ IF (TPFILE%LMASTER) THEN
   end if MODE
 END IF
 
+if ( tpfile%cmode == 'READ' ) &
+  call MPI_BCAST( tpfile%cformat, Len( tpfile%cformat ), MPI_CHARACTER, tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr )
+
 end subroutine IO_File_check_format_exist
 
 
-- 
GitLab


From f45d087e690dbdaa1f7fb11f711209c3eed4735d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 19 Aug 2022 10:48:32 +0200
Subject: [PATCH 089/157] Philippe 19/08/2022: bugfix: deallocate ballon
 namelist data only if allocated

---
 src/MNH/ini_balloon.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 886f3f83e..f52a2f994 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -344,7 +344,7 @@ DO JI = 1, NBALLOONS
   END SELECT
 END DO
 
-CALL BALLOONS_NML_DEALLOCATE()
+IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE()
 
 !----------------------------------------------------------------------------
 !
-- 
GitLab


From 881fea18e72ef9814353c16cfd61f6759f0fea56 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 19 Aug 2022 16:09:53 +0200
Subject: [PATCH 090/157] Philippe 19/08/2022: provide aircraft characteristics
 in namelist and CSV file instead of hardcoded

---
 src/MNH/ini_aircraft.f90         | 2191 ++----------------------------
 src/MNH/ini_aircraft_balloon.f90 |    4 +-
 src/MNH/ini_balloon.f90          |   14 +-
 src/MNH/modn_aircrafts.f90       |   69 +
 src/MNH/read_exsegn.f90          |   11 +-
 src/MNH/write_desfmn.f90         |    6 +-
 6 files changed, 236 insertions(+), 2059 deletions(-)
 create mode 100644 src/MNH/modn_aircrafts.f90

diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index af8ecdaaf..f6355579a 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -3,6 +3,18 @@
 !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
 !     #######################
@@ -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
@@ -84,2087 +96,160 @@
 !!     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
+USE MODD_CONF,             ONLY: NMODEL_NEST => NMODEL
+USE MODD_PARAMETERS,       ONLY: XNEGUNDEF
 
 USE MODE_MSG
 
+USE MODN_AIRCRAFTS
+
 IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-!
-!-------------------------------------------------------------------------------
-!
-!       0.2  declaration of local variables
-!
-!
-!----------------------------------------------------------------------------
-NAIRCRAFTS = 0
+
+INTEGER :: JI
 
 ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
 
-IF ( NAIRCRAFTS < 1 ) RETURN
-!
-!*      1.   Aircraft number 1
-!            -----------------
-#if 0
-!
-!* model number
-!
-TAIRCRAFTS(1)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(1)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(1)%CTYPE               = 'AIRCRA'
-!
-!* aircraft flight name
-!
-TAIRCRAFTS(1)%CTITLE             = 'DIMO19A'
-!
-!* time step for storage
-!
-TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(1)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(1)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(1)%TLAUNCH%nday   =    19
-TAIRCRAFTS(1)%TLAUNCH%xtime  = 32280.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(1)%NSEG                = 168
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(1)%LALTDEF             = .TRUE.
+!Treat aircraft data read in namelist
+DO JI = 1, NAIRCRAFTS
+  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 aircraft number ', JI
+    CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT' )
+  END IF
+  TAIRCRAFTS(JI)%CTITLE = CTITLE(JI)
+
+  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' )
+      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) ) // ')' )
+    END IF
+    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' )
+    CMODEL(JI) = 'FIX'
+    NMODEL(JI) = 1
+  END IF
+  TAIRCRAFTS(JI)%CMODEL = CMODEL(JI)
+  TAIRCRAFTS(JI)%NMODEL = NMODEL(JI)
+
+  TAIRCRAFTS(JI)%CTYPE = CTYPE(JI)
+
+  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) ) )
+  TAIRCRAFTS(JI)%TLAUNCH  = TLAUNCH(JI)
+
+  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' )
+    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) ) )
+    XTSTEP(JI) = 60.
+  END IF
+  TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+
+  IF ( NPOS(JI) < 1 ) THEN
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 1 for aircraft ' // TRIM( CTITLE(JI) ) )
+  END IF
+  TAIRCRAFTS(JI)%NSEG = NPOS(JI)-1
+
+  TAIRCRAFTS(JI)%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) ) )
+
+  ! Allocate trajectory data
+  ALLOCATE( TAIRCRAFTS(JI)%XSEGTIME(TAIRCRAFTS(JI)%NSEG  ) ); TAIRCRAFTS(JI)%XSEGTIME(:) = XNEGUNDEF
+  ALLOCATE( TAIRCRAFTS(JI)%XSEGLAT (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLAT(:)  = XNEGUNDEF
+  ALLOCATE( TAIRCRAFTS(JI)%XSEGLON (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLON(:)  = XNEGUNDEF
+  IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN
+    ALLOCATE( TAIRCRAFTS(JI)%XSEGP (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGP(:)    = XNEGUNDEF
+  ELSE
+    ALLOCATE( TAIRCRAFTS(JI)%XSEGZ (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGZ(:)    = XNEGUNDEF
+  END IF
+
+  ! Read CSV data (trajectory)
+  CALL AIRCRAFT_CSV_READ( TAIRCRAFTS(JI), CFILE(JI) )
+
+END DO
+
+IF ( NAIRCRAFTS > 0 ) CALL AIRCRAFTS_NML_DEALLOCATE()
 !
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(1)%XSEGTIME(TAIRCRAFTS(1)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(1)%XSEGLAT (TAIRCRAFTS(1)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(1)%XSEGLON (TAIRCRAFTS(1)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(1)%XSEGTIME      = (/ 60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   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)
-!
-TAIRCRAFTS(1)%XSEGLAT  = (/ 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)
-!
-TAIRCRAFTS(1)%XSEGLON   = (/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 (TAIRCRAFTS(1)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(1)%XSEGP   (TAIRCRAFTS(1)%NSEG+1))
-  TAIRCRAFTS(1)%XSEGP    = 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(TAIRCRAFTS(1)%XSEGZ   (TAIRCRAFTS(1)%NSEG+1))
-TAIRCRAFTS(1)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-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
-!
-IF ( NAIRCRAFTS < 2 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
 !----------------------------------------------------------------------------
 !
-!*      1.   Aircraft number 2
-!            -----------------
-#if 0
-!
-!* model number
-!
-TAIRCRAFTS(2)%NMODEL             = 0
-!
-!* model switch
 !
-TAIRCRAFTS(2)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(2)%CTYPE               = 'AIRCRA'
+END SUBROUTINE INI_AIRCRAFT
 
-!* aircraft flight name
-!
-TAIRCRAFTS(2)%CTITLE             = 'DIMO19B'
-!
-!* time step for storage
-!
-TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(2)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(2)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(2)%TLAUNCH%nday   =    19
-TAIRCRAFTS(2)%TLAUNCH%xtime  = 48060.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(2)%NSEG                = 198
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(2)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(2)%XSEGTIME(TAIRCRAFTS(2)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(2)%XSEGLAT (TAIRCRAFTS(2)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(2)%XSEGLON (TAIRCRAFTS(2)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(2)%XSEGTIME     = (/60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   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)
-!
-TAIRCRAFTS(2)%XSEGLAT      = (/ 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)
-!
-TAIRCRAFTS(2)%XSEGLON      = (/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 (TAIRCRAFTS(2)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(2)%XSEGP   (TAIRCRAFTS(2)%NSEG+1))
-TAIRCRAFTS(2)%XSEGP = 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(TAIRCRAFTS(2)%XSEGZ   (TAIRCRAFTS(2)%NSEG+1))
-  TAIRCRAFTS(2)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-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
-!
-IF ( NAIRCRAFTS < 3 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 3
-!            -----------------
-#if 0
-!
-!* model number
-!
-TAIRCRAFTS(3)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(3)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(3)%CTYPE               = 'AIRCRA'
 
-!* aircraft flight name
-!
-TAIRCRAFTS(3)%CTITLE             = 'SAAL19A'
-!
-!* time step for storage
-!
-TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(3)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(3)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(3)%TLAUNCH%nday   =    19
-TAIRCRAFTS(3)%TLAUNCH%xtime  = 45369
-!
-!* number of flight segments
-!
-TAIRCRAFTS(3)%NSEG                = 39
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(3)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(3)%XSEGTIME(TAIRCRAFTS(3)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(3)%XSEGLAT (TAIRCRAFTS(3)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(3)%XSEGLON (TAIRCRAFTS(3)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(3)%XSEGTIME = (/   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)
-!
-TAIRCRAFTS(3)%XSEGLAT = (/ 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)
-!
-TAIRCRAFTS(3)%XSEGLON   = (/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 (TAIRCRAFTS(3)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(3)%XSEGP   (TAIRCRAFTS(3)%NSEG+1))
-TAIRCRAFTS(3)%XSEGP    = 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(TAIRCRAFTS(3)%XSEGZ   (TAIRCRAFTS(3)%NSEG+1))
-  TAIRCRAFTS(3)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,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
-!
-IF ( NAIRCRAFTS < 4 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 4
-!            -----------------
-#if 0
-!
-!* model number
-!
-TAIRCRAFTS(4)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(4)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(4)%CTYPE               = 'AIRCRA'
+SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE )
 
-!* aircraft flight name
-!
-TAIRCRAFTS(4)%CTITLE             = 'SAAL19B'
-!
-!* time step for storage
-!
-TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(4)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(4)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(4)%TLAUNCH%nday   =    19
-TAIRCRAFTS(4)%TLAUNCH%xtime  = 60392.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(4)%NSEG                = 39
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(4)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(4)%XSEGTIME(TAIRCRAFTS(4)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(4)%XSEGLAT (TAIRCRAFTS(4)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(4)%XSEGLON (TAIRCRAFTS(4)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(4)%XSEGTIME = (/ 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)
-!
-TAIRCRAFTS(4)%XSEGLAT = (/ 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)
-!
-TAIRCRAFTS(4)%XSEGLON  = (/ 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 (TAIRCRAFTS(4)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(4)%XSEGP   (TAIRCRAFTS(4)%NSEG+1))
-TAIRCRAFTS(4)%XSEGP = 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(TAIRCRAFTS(4)%XSEGZ   (TAIRCRAFTS(4)%NSEG+1))
-  TAIRCRAFTS(4)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,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
-!
-IF ( NAIRCRAFTS < 5 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 5
-!            -----------------
-#if 0
-!
-!* model number
-!
-TAIRCRAFTS(5)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(5)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(5)%CTYPE               = 'AIRCRA'
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA
 
-!* aircraft flight name
-!
-TAIRCRAFTS(5)%CTITLE             = 'SAIB19A'
-!
-!* time step for storage
-!
-TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(5)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(5)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(5)%TLAUNCH%nday   =    19
-TAIRCRAFTS(5)%TLAUNCH%xtime  = 43380.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(5)%NSEG                = 176
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(5)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(5)%XSEGTIME(TAIRCRAFTS(5)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(5)%XSEGLAT (TAIRCRAFTS(5)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(5)%XSEGLON (TAIRCRAFTS(5)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(5)%XSEGTIME = (/  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  /) 
+USE MODE_MSG
 
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFTS(5)%XSEGLAT = (/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  /)
+IMPLICIT NONE
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFTS(5)%XSEGLON = (/ 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 (TAIRCRAFTS(5)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(5)%XSEGP   (TAIRCRAFTS(5)%NSEG+1))
-TAIRCRAFTS(5)%XSEGP  = 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(TAIRCRAFTS(5)%XSEGZ   (TAIRCRAFTS(5)%NSEG+1))
-  TAIRCRAFTS(5)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,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
-!
-IF ( NAIRCRAFTS < 6 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 6
-!            -----------------
-!
-#if 0
-!* model number
-!
-TAIRCRAFTS(6)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(6)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(6)%CTYPE               = 'AIRCRA'
+TYPE(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT
+CHARACTER(LEN=*),    INTENT(IN)    :: HFILE !Name of the CSV file with the aircraft trajectory
 
-!* aircraft flight name
-!
-TAIRCRAFTS(6)%CTITLE             = 'SAIB19B'
-!
-!* time step for storage
-!
-TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(6)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(6)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(6)%TLAUNCH%nday   =    19
-TAIRCRAFTS(6)%TLAUNCH%xtime  = 55992.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(6)%NSEG                = 179
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(6)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(6)%XSEGTIME(TAIRCRAFTS(6)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(6)%XSEGLAT (TAIRCRAFTS(6)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(6)%XSEGLON (TAIRCRAFTS(6)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(6)%XSEGTIME = (/ 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)
-!
-TAIRCRAFTS(6)%XSEGLAT = (/  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)
-!
-TAIRCRAFTS(6)%XSEGLON = (/-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 (TAIRCRAFTS(6)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(6)%XSEGP   (TAIRCRAFTS(6)%NSEG+1))
-TAIRCRAFTS(6)%XSEGP = 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(TAIRCRAFTS(6)%XSEGZ   (TAIRCRAFTS(6)%NSEG+1))
-  TAIRCRAFTS(6)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,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 
-!
-IF ( NAIRCRAFTS < 7 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!
-!*      1.   Aircraft number 7
-!            -----------------
-!
-#if 0
-!* model number
-!
-TAIRCRAFTS(7)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(7)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(7)%CTYPE               = 'AIRCRA'
+CHARACTER(LEN=NMAXLINELGT) :: YSTRING
+INTEGER                    :: ILU      ! logical unit of the file
+INTEGER                    :: JI
+REAL                       :: ZTIME, ZLAT, ZLON, ZALT
+REAL                       :: ZTIME_OLD
 
-!* aircraft flight name
-!
-TAIRCRAFTS(7)%CTITLE             = 'TEST_19'
-!
-!* time step for storage
-!
-TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(7)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(7)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(7)%TLAUNCH%nday   =    19
-TAIRCRAFTS(7)%TLAUNCH%xtime  = 43500.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(7)%NSEG                = 207
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(7)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(7)%XSEGTIME(TAIRCRAFTS(7)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(7)%XSEGLAT (TAIRCRAFTS(7)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(7)%XSEGLON (TAIRCRAFTS(7)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(7)%XSEGTIME = (/  60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   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)
-!
-TAIRCRAFTS(7)%XSEGLAT = (/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)
-!
-TAIRCRAFTS(7)%XSEGLON = (/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 (TAIRCRAFTS(7)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(7)%XSEGP   (TAIRCRAFTS(7)%NSEG+1))
-TAIRCRAFTS(7)%XSEGP = 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(TAIRCRAFTS(7)%XSEGZ   (TAIRCRAFTS(7)%NSEG+1))
-  TAIRCRAFTS(7)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,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
-!
-IF ( NAIRCRAFTS < 8 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!----------------------------------------------------------------------------
-!
-!*      1.   Aircraft number 8
-!            -----------------
-!
-#if 0
-!* model number
-!
-TAIRCRAFTS(8)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(8)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(8)%CTYPE               = 'AIRCRA'
+ZTIME_OLD = 0.
 
-!* aircraft flight name
-!
-TAIRCRAFTS(8)%CTITLE             = 'DIMO22B'
-!
-!* time step for storage
-!
-TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(8)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(8)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(8)%TLAUNCH%nday   =    22
-TAIRCRAFTS(8)%TLAUNCH%xtime  = 45720.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(8)%NSEG                =  210
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(8)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(8)%XSEGTIME(TAIRCRAFTS(8)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(8)%XSEGLAT (TAIRCRAFTS(8)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(8)%XSEGLON (TAIRCRAFTS(8)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(8)%XSEGTIME = (/   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   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)
-!
-TAIRCRAFTS(8)%XSEGLAT = (/ 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  /)
+! Open file
+OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' )
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFTS(8)%XSEGLON = (/  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  /)
+READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it)
 
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
-IF (TAIRCRAFTS(8)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(8)%XSEGP   (TAIRCRAFTS(8)%NSEG+1))
-TAIRCRAFTS(8)%XSEGP = 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(TAIRCRAFTS(8)%XSEGZ   (TAIRCRAFTS(8)%NSEG+1))
-  TAIRCRAFTS(8)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,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 
-!
-IF ( NAIRCRAFTS < 9 ) RETURN
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!
-!*      1.   Aircraft number 9
-!            -----------------
-!
-#if 0
-!* model number
-!
-TAIRCRAFTS(9)%NMODEL             = 0
-!
-!* model switch
-!
-TAIRCRAFTS(9)%CMODEL              = 'FIX'
-!
-!* aircraft type
-!
-TAIRCRAFTS(9)%CTYPE               = 'AIRCRA'
+DO JI = 1, TPAIRCRAFT%NSEG + 1
+  ! Read aircraft position
+  READ( ILU, END = 101, FMT = '(A)' ) YSTRING
 
-!* aircraft flight name
-!
-TAIRCRAFTS(9)%CTITLE             = 'DIMO23A'
-!
-!* time step for storage
-!
-TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60.
-!
-!* take-off date and time
-!
-TAIRCRAFTS(9)%TLAUNCH%nyear  =  2007
-TAIRCRAFTS(9)%TLAUNCH%nmonth =    04
-TAIRCRAFTS(9)%TLAUNCH%nday   =    23
-TAIRCRAFTS(9)%TLAUNCH%xtime  = 28080.
-!
-!* number of flight segments
-!
-TAIRCRAFTS(9)%NSEG                =   217
-!
-!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude
-!
-TAIRCRAFTS(9)%LALTDEF             = .TRUE.
-!
-!* allocation of the arrays
-!
-ALLOCATE(TAIRCRAFTS(9)%XSEGTIME(TAIRCRAFTS(9)%NSEG  ))
-ALLOCATE(TAIRCRAFTS(9)%XSEGLAT (TAIRCRAFTS(9)%NSEG+1))
-ALLOCATE(TAIRCRAFTS(9)%XSEGLON (TAIRCRAFTS(9)%NSEG+1))
-!
-!* duration of the segments (seconds)
-!
-TAIRCRAFTS(9)%XSEGTIME = (/   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60,   60,   60,   60,   60,   60,&
-   60 /)
+  READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT
 
-!
-!* latitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFTS(9)%XSEGLAT = (/  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 /)
+  IF ( JI > 1 ) TPAIRCRAFT%XSEGTIME(JI-1) = ZTIME - ZTIME_OLD
+  TPAIRCRAFT%XSEGLAT(JI) = ZLAT
+  TPAIRCRAFT%XSEGLON(JI) = ZLON
+  IF ( TPAIRCRAFT%LALTDEF ) THEN
+    TPAIRCRAFT%XSEGP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa
+  ELSE
+    TPAIRCRAFT%XSEGZ(JI) = ZALT
+  END IF
 
+  ZTIME_OLD = ZTIME
+END DO
 
-!
-!* longitudes of the segments ends (1st point is takeoff, last point is landing)
-!        (decimal degrees)
-!
-TAIRCRAFTS(9)%XSEGLON = (/  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  /)
+101 CONTINUE
 
-!
-!* pressure of the segments ends (1st point is takeoff, last point is landing)
-!        (pascals)
-!
+CLOSE( ILU )
 
-IF (TAIRCRAFTS(9)%LALTDEF) THEN
-  ALLOCATE(TAIRCRAFTS(9)%XSEGP   (TAIRCRAFTS(9)%NSEG+1))
-TAIRCRAFTS(9)%XSEGP = 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(TAIRCRAFTS(9)%XSEGZ   (TAIRCRAFTS(9)%NSEG+1))
-  TAIRCRAFTS(9)%XSEGZ    = (/8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,8000,&
-8000,8000,8000,8000,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
-#else
-CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' )
-#endif
-!
-!----------------------------------------------------------------------------
-!
-!
-END SUBROUTINE INI_AIRCRAFT
+IF ( JI < TPAIRCRAFT%NSEG + 1 ) &
+  CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) )
+
+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 64135ed5c..a9fb888da 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -98,12 +98,12 @@ USE MODD_PARAM_n,    ONLY: CCLOUD
 USE MODD_PARAMETERS
 !
 USE MODE_GRIDPROJ
+USE MODE_INI_AIRCRAFT
+USE MODE_INI_BALLOON
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_MSG
 !
-USE MODI_INI_BALLOON
-USE MODI_INI_AIRCRAFT
 !
 IMPLICIT NONE
 !
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index f52a2f994..cda0db7c2 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -3,6 +3,16 @@
 !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
 !     ######################
@@ -98,7 +108,7 @@
 USE MODD_AIRCRAFT_BALLOON
 USE MODD_CONF,             ONLY: NMODEL_NEST => NMODEL
 USE MODD_CST,              ONLY: XPI
-USE MODD_PARAMETERS,       ONLY: XUNDEF
+USE MODD_PARAMETERS,       ONLY: XNEGUNDEF, XUNDEF
 
 USE MODE_MSG
 
@@ -349,3 +359,5 @@ IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE()
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_BALLOON
+
+END MODULE MODE_INI_BALLOON
diff --git a/src/MNH/modn_aircrafts.f90 b/src/MNH/modn_aircrafts.f90
new file mode 100644
index 000000000..f4309dfc7
--- /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/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index a3303a5fe..ca2f7047a 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -305,6 +305,7 @@ END MODULE MODI_READ_EXSEG_n
 !  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
@@ -343,8 +344,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_BALLOONS,  ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS
 USE MODN_BLANK_n
 USE MODN_BLOWSNOW
 USE MODN_BLOWSNOW_n
@@ -851,6 +853,13 @@ IF (KMI == 1) THEN
 
   CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS)
+
+  IF ( NAIRCRAFTS > 0 ) THEN
+    CALL AIRCRAFTS_NML_ALLOCATE( NBALLOONS )
+    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)
diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index 046b0bd1e..e7a777d64 100644
--- a/src/MNH/write_desfmn.f90
+++ b/src/MNH/write_desfmn.f90
@@ -163,8 +163,9 @@ USE MODD_STATION_n,  ONLY: LSTATION
 !
 USE MODE_MSG
 !
+! USE MODN_AIRCRAFTS
 USE MODN_BACKUP
-USE MODN_BALLOONS
+! USE MODN_BALLOONS
 USE MODN_CONF
 USE MODN_DYN
 USE MODN_NESTING
@@ -455,7 +456,8 @@ 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_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS)
+!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)
 !
 !
 !
-- 
GitLab


From 915a2790b025580ee298eeade8dc30723ff36107 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 24 Aug 2022 16:10:17 +0200
Subject: [PATCH 091/157] Philippe 24/08/2022: change MNHVERSION to 5.6.0 and
 adapt conditions when reading older files

---
 src/MNH/ini_deep_convection.f90 |  9 ++++----
 src/MNH/ini_lb.f90              | 39 ++++++++++++++++++---------------
 src/MNH/ini_prog_var.f90        |  7 +++---
 src/MNH/read_field.f90          |  9 ++++----
 src/MNH/spawn_field2.f90        |  9 ++++----
 src/MNH/version.f90             | 10 ++++-----
 6 files changed, 41 insertions(+), 42 deletions(-)

diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index cd57a04d4..187d2e820 100644
--- a/src/MNH/ini_deep_convection.f90
+++ b/src/MNH/ini_deep_convection.f90
@@ -188,10 +188,9 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*       2. INITIALIZE CONVECTIVE TENDENCIES
 !	        --------------------------------
 !
-!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
-GOLDFILEFORMAT = (        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 ) )
+!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
@@ -282,7 +281,7 @@ ELSE
                   ( 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.5.1 files
+          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 )
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index c45c50666..a5da9cfcf 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -219,6 +219,7 @@ LOGICAL :: GHORELAX_UVWTH  ! switch for the horizontal relaxation for U,V,W,TH i
 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
@@ -241,10 +242,10 @@ ENDIF
 !*       1.    SOME INITIALIZATIONS
 !              --------------------
 !
-!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
-GOLDFILEFORMAT = (        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 ) )
+!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
 !
 !
 !-------------------------------------------------------------------------------
@@ -488,21 +489,22 @@ DO JSV = 1, NSV
         TZFIELD%CMNHNAME  = 'LBX_' // TRIM( YMNHNAME_BASE  )
         TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE )
 
-        !Some variables were written with an other name in MesoNH < 5.5.1
+        !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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            ! 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.5.1) for LBX_PP scalar variables'
+              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' )
@@ -513,7 +515,7 @@ DO JSV = 1, NSV
             TZFIELD%CSTDNAME  = ''
             TZFIELD%CLONGNAME = 'LBX_FF'
             IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
-              CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_FF scalar variables'
+              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' )
@@ -524,7 +526,7 @@ DO JSV = 1, NSV
             TZFIELD%CSTDNAME  = ''
             TZFIELD%CLONGNAME = 'LBX_CS'
             IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
-              CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_CS scalar variables'
+              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' )
@@ -543,7 +545,7 @@ DO JSV = 1, NSV
             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.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables)
+              !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
@@ -557,7 +559,7 @@ DO JSV = 1, NSV
                       ( 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.5.1
+                      ( 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
@@ -571,21 +573,22 @@ DO JSV = 1, NSV
         TZFIELD%CMNHNAME  = 'LBY_' // TRIM( YMNHNAME_BASE  )
         TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE )
 
-        !Some variables were written with an other name in MesoNH < 5.5.1
+        !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
-            CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            ! 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.5.1) for LBY_PP scalar variables'
+              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' )
@@ -596,7 +599,7 @@ DO JSV = 1, NSV
             TZFIELD%CSTDNAME  = ''
             TZFIELD%CLONGNAME = 'LBY_FF'
             IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
-              CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_FF scalar variables'
+              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' )
@@ -607,7 +610,7 @@ DO JSV = 1, NSV
             TZFIELD%CSTDNAME  = ''
             TZFIELD%CLONGNAME = 'LBY_CS'
             IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
-              CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_CS scalar variables'
+              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' )
@@ -625,7 +628,7 @@ DO JSV = 1, NSV
             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.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables)
+              !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
@@ -639,7 +642,7 @@ DO JSV = 1, NSV
                       ( 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.5.1
+                      ( 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
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 3a60efc9a..d21746e6d 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -215,10 +215,9 @@ IF(PRESENT(HCHEMFILE)) THEN
   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.5.1, some variables had different names (or were not available)
-  GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5                                                                              &
-              .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 5 )                                       &
-              .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) == 5  .AND. TZCHEMFILE%NMNHVERSION(3) < 1 ) )
+  !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
   !
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 8b72ffd03..1a40d1797 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -425,10 +425,9 @@ TYPE(TFIELDMETADATA)         :: TZFIELD
 GLSOURCE=.FALSE.
 ZWORK = 0.0
 !
-!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available
-GOLDFILEFORMAT = (        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 ) )
+!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
@@ -821,7 +820,7 @@ DO JSV = 1, NSV              ! initialize according to the get indicators
              ( 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.5.1
+          !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   = ''
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index ccd4ceaea..50047fb02 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -279,10 +279,9 @@ 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.5.1, some variables had different names or were not available
-  GOLDFILEFORMAT = (      TPSONFILE%NMNHVERSION(1) < 5                                                                            &
-                   .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) < 5 )                                      &
-                   .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) == 5  .AND. TPSONFILE%NMNHVERSION(3) < 1 ) )
+  !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
@@ -843,7 +842,7 @@ IF (PRESENT(TPSONFILE)) THEN
            ( 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.5.1
+        !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   = ''
diff --git a/src/MNH/version.f90 b/src/MNH/version.f90
index 5c98f1946..c8283e723 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
-- 
GitLab


From 4a714f6e67f72ccdfc7e025ede814c61e181ce55 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 25 Aug 2022 13:13:00 +0200
Subject: [PATCH 092/157] Philippe 25/08/2022: add CDFINT_MPI parameter

---
 src/MNH/modd_precision.f90 | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/MNH/modd_precision.f90 b/src/MNH/modd_precision.f90
index a759ddf1f..83db21558 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
-- 
GitLab


From 95910e1f333fc16ecb26243888e827a1573b5fdf Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 25 Aug 2022 14:43:37 +0200
Subject: [PATCH 093/157] Philippe 25/08/2022: write balloon positions in
 netCDF4 files inside HDF5 groups

---
 src/MNH/ini_aircraft_balloon.f90 | 331 ++++++++++++++++++++-----------
 src/MNH/ini_modeln.f90           |   3 +-
 src/MNH/write_balloonn.f90       | 321 ++++++++++++++++++++----------
 src/MNH/write_lfin.f90           |   2 +-
 4 files changed, 428 insertions(+), 229 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index a9fb888da..6191e60d5 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -6,41 +6,21 @@
 ! 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
-!
+!###############################
+MODULE MODE_INI_AIRCRAFT_BALLOON
+!###############################
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: INI_AIRCRAFT_BALLOON
+
+CONTAINS
+
 !     ###############################################################
       SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE,                    &
                                       PTSTEP, TPDTSEG, PSEGLEN,     &
@@ -294,9 +274,19 @@ END SUBROUTINE ALLOCATE_FLYER
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 SUBROUTINE INI_LAUNCH(KNBR,TPFLYER)
-!
+
+#ifdef MNH_IOCDF4
+USE NETCDF,             ONLY: NF90_INQ_NCID, NF90_NOERR
+#endif
+
+USE MODD_IO,            ONLY: ISP, TFILEDATA
+#ifdef MNH_IOCDF4
+USE MODD_MPIF
+USE MODD_PRECISION,     ONLY: CDFINT, CDFINT_MPI
+#endif
+
 use MODE_IO_FIELD_READ, only: IO_Field_read
-!
+
 INTEGER,             INTENT(IN)    :: KNBR
 CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
 !
@@ -304,42 +294,36 @@ CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
 !
 !*      0.2  declaration of local variables
 !
+#ifdef MNH_IOCDF4
+INTEGER              :: IERR
+INTEGER(KIND=CDFINT) :: IGROUPID
+INTEGER(KIND=CDFINT) :: ISTATUS
+INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts
+#endif
+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%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
-IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
+#ifdef MNH_IOCDF4
+TYPE(TFILEDATA) :: TZFILE
+#endif
+
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
-!
+
+GREAD = .FALSE.
 LFLYER=.TRUE.
-!
-IF (TPFLYER%CTITLE=='          ') THEN
-  WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR
-END IF
-!
+
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
-  ! read the current location in the FM_FILE
-  !
-  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
-    WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%CTITLE
-  ELSE
+  ! 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)//'LON', &
+      CMNHNAME   = TRIM(TPFLYER%CTITLE)//'LAT', &
       CSTDNAME   = '',                          &
-      CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LON', &
+      CLONGNAME  = TRIM(TPFLYER%CTITLE)//'LAT', &
       CUNITS     = 'degree',                    &
       CDIR       = '--',                        &
       CCOMMENT   = '',                          &
@@ -347,65 +331,173 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
       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)
-    !
-    TPFLYER%XP_CUR   = XUNDEF
-    !
-    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)
-    !
+    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)
+
+      TPFLYER%XP_CUR   = XUNDEF
+
+      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
+    ! Read in netCDF file (new structure since MesoNH 5.6)
+    IF ( ISP == TPINIFILE%NMASTER_RANK ) ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID )
+
+    IDATA(:) = [ ISTATUS, IGROUPID ] ! Merge 2 broadcasts into 1
+    CALL MPI_BCAST( IDATA, SIZE( IDATA ), CDFINT_MPI, TPINIFILE%NMASTER_RANK - 1, TPINIFILE%NMPICOMM, IERR )
+    ISTATUS  = IDATA(1)
+    IGROUPID = IDATA(2)
+
+    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)
+
+      TPFLYER%XP_CUR   = XUNDEF
+
+      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
+#endif
+  END IF
+
+  IF ( GREAD ) THEN
     CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR )
+
     TPFLYER%LFLY = .TRUE.
-    WRITE(ILUOUT,*) &
-    "INI_LAUNCH: Current location read in FM file for ",TPFLYER%CTITLE
+
+    CMNHMSG(1) = 'current location read from synchronous file for ' // TRIM( TPFLYER%CTITLE )
     IF (TPFLYER%CTYPE== 'CVBALL') THEN
-      WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR," Wasc=",TPFLYER%XWASCENT
+      WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON
+      WRITE( CMNHMSG(3), * ) " Alt=", TPFLYER%XZ_CUR, " Wasc=", TPFLYER%XWASCENT
     ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN
-      WRITE(ILUOUT,*) &
-       " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%XRHO
+      WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO
     END IF
-    !
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' )
+
     TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
+  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
   !
-ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
+ELSE IF ( CPROGRAM == 'DIAG  ' ) THEN
   IF ( LAIRCRAFT_BALLOON ) THEN
     ! read the current location in MODD_DIAG_FLAG
     !
@@ -415,10 +507,9 @@ ELSE IF (CPROGRAM == 'DIAG  ' ) THEN
     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.
-      WRITE(ILUOUT,*) &
-      "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%CTITLE
-      WRITE(ILUOUT,*) &
-            " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR
+      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%TFLYER_TIME%XTSTEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP )
@@ -488,3 +579,5 @@ END SUBROUTINE INI_FLIGHT
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_AIRCRAFT_BALLOON
+
+END MODULE MODE_INI_AIRCRAFT_BALLOON
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 5bf5d68bb..11dad29e3 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -401,6 +401,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
@@ -427,8 +428,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
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 295de8c3a..974bde880 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -3,26 +3,18 @@
 !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)
 !     ###################################
@@ -59,17 +51,15 @@ END MODULE MODI_WRITE_BALLOON_n
 !!      Original    06/06/01 
 !  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, TBALLOONS
+USE MODD_IO,               ONLY: TFILEDATA
 !
-USE MODE_GRIDPROJ
 !
 IMPLICIT NONE
 !
@@ -83,102 +73,219 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 INTEGER :: JI
 
 DO JI = 1, NBALLOONS
-  IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) )
+  IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI) )
 END DO
-!
-!
-CONTAINS
-!
+
+END SUBROUTINE WRITE_BALLOON_n
 !-------------------------------------------------------------------------------
+
 !-------------------------------------------------------------------------------
-SUBROUTINE WRITE_LFI_BALLOON(TPFLYER)
+SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER )
 !
+#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 MODE_GRIDPROJ,       ONLY: SM_LATLON
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-!
+#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
 !
 !
 !*       0.2   Declarations of local variables
 !
+#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
-!
-!
-CALL SM_LATLON(XLATORI,XLONORI,  &
-     TPFLYER%XX_CUR,TPFLYER%XY_CUR,ZLAT,ZLON)
-!
-!
-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(TPFILE,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(TPFILE,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(TPFILE,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(TPFILE,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(TPFILE,TZFIELD,TPFLYER%XRHO)
-!
-!
-!
-END SUBROUTINE WRITE_LFI_BALLOON
+
+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_lfin.f90 b/src/MNH/write_lfin.f90
index 481840839..c1fdfcd2c 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -268,13 +268,13 @@ USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_MSG
 USE MODE_TOOLS, ONLY: UPCASE
+USE MODE_WRITE_BALLOON_n, ONLY: WRITE_BALLOON_n
 
 USE MODI_CH_AER_REALLFI_n
 USE MODI_DUST_FILTER
 USE MODI_DUSTLFI_n
 USE MODI_SALT_FILTER
 USE MODI_SALTLFI_n
-USE MODI_WRITE_BALLOON_n
 USE MODI_WRITE_LB_n
 
 IMPLICIT NONE
-- 
GitLab


From 592c5d1880dc7e9d8b131ce56b929ba096d7568b Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 2 Sep 2022 16:18:55 +0200
Subject: [PATCH 094/157] Philippe 02/09/2022: add XXHATM, XYHATM and XZHATM
 grid variables at mass points + more efficient use of grid variables

---
 src/LIB/SURCOUCHE/src/mode_field.f90        | 41 ++++++++-
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 44 +++++-----
 src/MNH/aircraft_balloon_evol.f90           | 25 ++----
 src/MNH/eddy_fluxn.f90                      |  9 +-
 src/MNH/eol_maths.f90                       | 12 +--
 src/MNH/extract_vortex.f90                  | 14 ++--
 src/MNH/flash_geom_elec.f90                 | 30 +++----
 src/MNH/fun.f90                             | 18 ++--
 src/MNH/gps_zenith.f90                      | 37 ++++-----
 src/MNH/gps_zenith_grid.f90                 | 15 +---
 src/MNH/ibm_affectp.f90                     |  6 +-
 src/MNH/ibm_affectv.f90                     |  6 +-
 src/MNH/ibm_balance.f90                     | 17 ++--
 src/MNH/ibm_detect.f90                      |  3 +-
 src/MNH/ibm_generls.f90                     |  3 +-
 src/MNH/ibm_idealee.f90                     |  3 +-
 src/MNH/ibm_init_ls.f90                     |  4 +-
 src/MNH/ibm_mixinglength.f90                |  2 +-
 src/MNH/ibm_smooth_ls.f90                   |  8 +-
 src/MNH/ibm_volume.f90                      |  3 +-
 src/MNH/ini_dynamics.f90                    | 14 ++--
 src/MNH/ini_lg.f90                          | 37 ++++-----
 src/MNH/ini_modeln.f90                      | 29 ++++---
 src/MNH/ini_posprofilern.f90                | 15 +---
 src/MNH/ini_size_spawn.f90                  |  4 +-
 src/MNH/ini_spectren.f90                    | 29 ++++---
 src/MNH/ini_surfstationn.f90                | 15 +---
 src/MNH/modd_gridn.f90                      |  8 +-
 src/MNH/modd_spawn.f90                      |  3 +-
 src/MNH/modd_sub_elecn.f90                  | 18 +---
 src/MNH/mode_gridproj.f90                   | 36 ++++----
 src/MNH/modeln.f90                          |  7 +-
 src/MNH/phys_paramn.f90                     |  8 +-
 src/MNH/prep_ideal_case.f90                 | 23 ++++--
 src/MNH/prep_real_case.f90                  |  8 +-
 src/MNH/radar_simulator.f90                 | 20 ++---
 src/MNH/read_all_data_grib_case.f90         |  8 +-
 src/MNH/read_cams_data_netcdf_case.f90      | 10 +--
 src/MNH/read_chem_data_netcdf_case.f90      |  8 +-
 src/MNH/read_hgridn.f90                     | 14 +++-
 src/MNH/read_ver_grid.f90                   | 36 ++++----
 src/MNH/relaxdef.f90                        | 22 +++--
 src/MNH/series_cloud_elec.f90               |  3 +-
 src/MNH/set_advfrc.f90                      | 21 ++---
 src/MNH/set_frc.f90                         | 17 ++--
 src/MNH/set_geosbal.f90                     | 36 +++-----
 src/MNH/set_grid.f90                        | 69 ++++++++++------
 src/MNH/set_perturb.f90                     | 11 ++-
 src/MNH/set_ref.f90                         | 26 +++---
 src/MNH/set_refz.f90                        | 10 +--
 src/MNH/set_relfrc.f90                      | 26 ++----
 src/MNH/setlb_lg.f90                        | 92 +++++++--------------
 src/MNH/shallow_mf.f90                      |  3 +-
 src/MNH/spawn_grid2.f90                     | 69 +++++++++-------
 src/MNH/spawn_model2.f90                    | 28 ++++---
 src/MNH/spawning.f90                        |  3 +-
 src/MNH/surf_rad_modif.f90                  | 47 ++++++-----
 src/MNH/surf_solar_shadows.f90              | 37 ++++-----
 src/MNH/surf_solar_slopes.f90               | 30 +++----
 src/MNH/surf_solar_sum.f90                  | 29 +++----
 src/MNH/turb_ver_thermo_flux.f90            | 11 ++-
 src/MNH/ver_interp_to_mixed_grid.f90        |  4 +-
 src/MNH/ver_thermo.f90                      |  8 +-
 src/MNH/write_lfifm1_for_diag.f90           | 16 ++--
 src/MNH/write_surf_mnh.f90                  | 12 ++-
 65 files changed, 605 insertions(+), 675 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index b6f5a6ab7..a0df6d83f 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -440,7 +440,6 @@ call Add_field2list( TFIELDDATA( &
 
 call Add_field2list( TFIELDDATA( &
   CMNHNAME   = 'XHAT',           &
-!TODO: check stdname
   CSTDNAME   = 'projection_x_coordinate', &
   CLONGNAME  = 'XHAT',           &
   CUNITS     = 'm',              &
@@ -453,7 +452,6 @@ call Add_field2list( TFIELDDATA( &
 
 call Add_field2list( TFIELDDATA( &
   CMNHNAME   = 'YHAT',           &
-!TODO: check stdname
   CSTDNAME   = 'projection_y_coordinate', &
   CLONGNAME  = 'YHAT',           &
   CUNITS     = 'm',              &
@@ -464,6 +462,30 @@ call Add_field2list( TFIELDDATA( &
   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 point', &
+  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 point', &
+  NGRID      = 1,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
 call Add_field2list( TFIELDDATA( &
   CMNHNAME   = 'ZHAT',           &
 !TODO: check stdname
@@ -477,6 +499,18 @@ call Add_field2list( TFIELDDATA( &
   NDIMS      = 1,                &
   LTIMEDEP   = .FALSE.           ) )
 
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'ZHATM',          &
+  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   = 'ZTOP',                &
   CSTDNAME   = 'altitude_at_top_of_atmosphere_model', &
@@ -3594,7 +3628,10 @@ 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( 'ZTOP',  kfrom, kto, XZTOP  )
 call Goto_model_1field( 'DXHAT', kfrom, kto, XDXHAT )
 call Goto_model_1field( 'DYHAT', kfrom, kto, XDYHAT )
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 8ca884014..65ffbdc8e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1450,7 +1450,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
 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
@@ -1475,7 +1475,7 @@ character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file comin
 
 character(len=:),                         allocatable :: ystdnameprefix
 character(len=:),                         allocatable :: yprogram
-integer                                               :: iiu, iju, iku
+integer                                               :: iiu, iju
 integer                                               :: id, iid, iresp
 integer                                               :: imi
 integer                                               :: ji
@@ -1486,7 +1486,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
@@ -1505,9 +1505,12 @@ 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()
 
 gchangemodel = .false.
 
@@ -1527,8 +1530,14 @@ 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( 'SLEVE', iid, iresp )
   gsleve => tfieldlist(iid)%tfield_l0d(tpfile%nmodel)%data
 
@@ -1538,21 +1547,17 @@ 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
   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'
@@ -1634,17 +1639,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','', &
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index c79631fa0..e6cfc21ba 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -138,6 +138,7 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID
+USE MODD_GRID_n,           ONLY: XXHATM, XYHATM
 USE MODD_LUNIT_n,          ONLY: TLUOUT
 USE MODD_NESTING
 USE MODD_NSV,              ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC
@@ -229,9 +230,6 @@ 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
@@ -384,11 +382,6 @@ IKU = SIZE(PZ,3)
 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
@@ -504,7 +497,7 @@ IF ( TPFLYER%LFLY ) THEN
 !            ----------
 !
   IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR )
-  II=COUNT( ZXHATM(:)<=TPFLYER%XX_CUR )
+  II=COUNT( XXHATM(:)<=TPFLYER%XX_CUR )
 !
   IF ( IU < IIB .AND. LWEST_ll() ) THEN
     IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN
@@ -528,7 +521,7 @@ IF ( TPFLYER%LFLY ) THEN
 !            ----------
 !
   IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR )
-  IJ=COUNT( ZYHATM(:)<=TPFLYER%XY_CUR )
+  IJ=COUNT( XYHATM(:)<=TPFLYER%XY_CUR )
 !
   IF ( IV < IJB .AND. LSOUTH_ll() ) THEN
     IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
@@ -632,9 +625,9 @@ IF ( TPFLYER%LFLY ) THEN
 !*      5.2.1 Iso-density balloon
 !
             CASE ( 'ISODEN' )
-              ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
               ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
+              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
               ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
               IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
                 IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
@@ -676,9 +669,9 @@ IF ( TPFLYER%LFLY ) THEN
 !*      5.2.4 Constant Volume Balloon
 !
             CASE ( 'CVBALL' )
-              ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
               ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
+              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
               ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
               IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
                 IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
@@ -837,14 +830,14 @@ IF ( TPFLYER%LFLY ) THEN
 !*      6.1  Interpolation coefficient for X
 !            -------------------------------
 !
-      ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
+      ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
       ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
 !
 !
 !*      6.2  Interpolation coefficient for y
 !            -------------------------------
 !
-      ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
+      ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
       ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
 !
 !
diff --git a/src/MNH/eddy_fluxn.f90 b/src/MNH/eddy_fluxn.f90
index ed52def26..dc20500dc 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/eol_maths.f90 b/src/MNH/eol_maths.f90
index bda3aa694..81e2a0a88 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 df1bb103b..311fcecd1 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/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90
index 8ae281d26..14265cba1 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/fun.f90 b/src/MNH/fun.f90
index 46db8b201..64c54caa6 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.
@@ -126,9 +126,9 @@ ZWIDTHY =ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_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)-ZYHAT_ll(IJ0))/ZWIDTHY) **2 &
+    +(( PZHAT(JK) -   PZHAT(IK0))/ZWIDTHZ) **2 )
   END DO
 END DO
 DEALLOCATE(ZYHAT_ll)
@@ -217,7 +217,7 @@ 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)
 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)-ZYHAT_ll(IJ0))/ZWIDTH)
 END DO
 FUNUY(KJU)=2.*FUNUY(KJU-1)-FUNUY(KJU-2) !simple extrapolation for the last point
 !
@@ -314,9 +314,9 @@ ZWIDTHX=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_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)-ZXHAT_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
@@ -403,7 +403,7 @@ 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)
 DO JI = 1,KIU
- FUNVX(JI)=1./COSH(((XXHAT(JI)+XXHAT(JI))*0.5-ZXHAT_ll(II0))/ZWIDTH)
+ FUNVX(JI)=1./COSH((XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTH)
 END DO
 DEALLOCATE(ZXHAT_ll)
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/gps_zenith.f90 b/src/MNH/gps_zenith.f90
index a11a074d6..5fe9cd741 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 86b72414f..f3859e62c 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/ibm_affectp.f90 b/src/MNH/ibm_affectp.f90
index b0c998744..4f6bd4451 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 1a5711e10..dddd95e97 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
@@ -291,7 +291,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 2256cd097..e1ed43c51 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 ca4530964..b88a80445 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 a129d2109..1b7683652 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 e08be780d..1c2d6449f 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_init_ls.f90 b/src/MNH/ibm_init_ls.f90
index 2d881e1fd..bdfbff5ad 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_mixinglength.f90 b/src/MNH/ibm_mixinglength.f90
index 14bb0dd89..c4c1a2c10 100644
--- a/src/MNH/ibm_mixinglength.f90
+++ b/src/MNH/ibm_mixinglength.f90
@@ -75,7 +75,7 @@ SUBROUTINE IBM_MIXINGLENGTH(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/MNH/ibm_smooth_ls.f90 b/src/MNH/ibm_smooth_ls.f90
index 961441234..7e06c354d 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 af4012a42..ec734278f 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_dynamics.f90 b/src/MNH/ini_dynamics.f90
index e4d00f5bb..add1cc9e3 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_lg.f90 b/src/MNH/ini_lg.f90
index 0ce0d7b1b..8f5428cae 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 11dad29e3..282936099 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1001,10 +1001,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))
@@ -1852,13 +1855,13 @@ 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, 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)
 !
@@ -1938,10 +1941,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 )
 !
 !-------------------------------------------------------------------------------
 !
@@ -2187,7 +2190,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 )
 
 !
 !-------------------------------------------------------------------------------
@@ -2196,7 +2199,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,                            &
diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90
index ad6340211..966c343cf 100644
--- a/src/MNH/ini_posprofilern.f90
+++ b/src/MNH/ini_posprofilern.f90
@@ -62,7 +62,7 @@ USE MODD_ALLPROFILER_n
 USE MODD_CONF,           ONLY: LCARTESIAN
 USE MODD_DYN,            ONLY: XSEGLEN
 USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
-USE MODD_GRID_n,         ONLY: XXHAT, XYHAT
+USE MODD_GRID_n,         ONLY: XXHAT, XXHATM, XYHAT, XYHATM
 USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_PROFILER_n,     ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME
 USE MODD_TYPE_STATPROF,  ONLY: TPROFILERDATA
@@ -95,8 +95,6 @@ LOGICAL :: GINSIDE                          ! True if profiler is inside physica
 LOGICAL :: GPRESENT                         ! True if profiler is present on the current process
 REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
 REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
-REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM      ! mass point coordinates
-REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM      ! mass point coordinates
 REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
 REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
 TYPE(TPROFILERDATA)          :: TZPROFILER
@@ -126,13 +124,6 @@ IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN
   CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
   CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
 
-  ! Interpolations of model variables to mass points
-  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
-  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
-
-  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
-  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
-
   ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
   ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
   ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
@@ -159,7 +150,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN
       TZPROFILER%XZ    = XZ_PROF(JI)
       TZPROFILER%CNAME = CNAME_PROF(JI)
 
-      CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                 &
+      CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,                 &
                               ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
                               GINSIDE, GPRESENT                                                   )
 
@@ -173,7 +164,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN
   END IF
 ELSE
   !Treat CSV datafile
-  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,    &
+  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,    &
                           ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
                           INUMBPROF                                                          )
 END IF
diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90
index abab91578..3695fe140 100644
--- a/src/MNH/ini_size_spawn.f90
+++ b/src/MNH/ini_size_spawn.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.
@@ -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 1067f2cef..7f62014dd 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.
@@ -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,13 @@ 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, 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 +746,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 +897,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_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 5452a5f0e..94332d77c 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -63,7 +63,7 @@ USE MODD_ALLSTATION_n
 USE MODD_CONF,           ONLY: LCARTESIAN
 USE MODD_DYN,            ONLY: XSEGLEN
 USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
-USE MODD_GRID_n,         ONLY: XXHAT, XYHAT
+USE MODD_GRID_n,         ONLY: XXHAT, XXHATM, XYHAT, XYHATM
 USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_STATION_n
 USE MODD_TYPE_STATPROF
@@ -96,8 +96,6 @@ LOGICAL :: GINSIDE                          ! True if station is inside physical
 LOGICAL :: GPRESENT                         ! True if station is present on the current process
 REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
 REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
-REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM      ! mass point coordinates
-REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM      ! mass point coordinates
 REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
 REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
 TYPE(TSTATIONDATA)           :: TZSTATION
@@ -127,13 +125,6 @@ IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
   CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
   CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
 
-  ! Interpolations of model variables to mass points
-  ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU  )
-  ZXHATM(  IIU  ) = 1.5 * XXHAT(  IIU  ) - 0.5 * XXHAT(  IIU-1)
-
-  ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU  )
-  ZYHATM(  IJU  ) = 1.5 * XYHAT(  IJU  ) - 0.5 * XYHAT(  IJU-1)
-
   ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
   ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
   ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
@@ -160,7 +151,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
       TZSTATION%XZ    = XZ_STAT(JI)
       TZSTATION%CNAME = CNAME_STAT(JI)
 
-      CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,                 &
+      CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,                 &
                              ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
                              GINSIDE, GPRESENT                                                   )
 
@@ -174,7 +165,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
   END IF
 ELSE
   !Treat CSV datafile
-  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM,     &
+  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,     &
                           ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
                           INUMBSTAT                                                          )
 END IF
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 055d3c88f..6437cfc8b 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.
 !-----------------------------------------------------------------
 !     ##################
@@ -36,6 +36,7 @@
 !!      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
+!  P. Wautelet 02/09/2022: add XXHATM, XYHATM and XZHATM
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -47,6 +48,8 @@ IMPLICIT NONE
 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 +57,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
diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90
index 8d432e588..6efedc643 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_sub_elecn.f90 b/src/MNH/modd_sub_elecn.f90
index d25df3084..1f5b6b940 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/mode_gridproj.f90 b/src/MNH/mode_gridproj.f90
index d907e6801..c055e7c06 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_CHECK( ZXHATM, "GRIDPROJ:ZXHATM" )
+  CALL MPPDB_CHECK( ZYHATM, "GRIDPROJ:ZXHATM" )
+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/modeln.f90 b/src/MNH/modeln.f90
index bf87ea052..8183346f1 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -989,7 +989,7 @@ 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'
@@ -1204,8 +1204,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
diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90
index be5d47e97..bb9291239 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.
@@ -781,9 +781,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
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 5169942d6..d1604d2f1 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -1239,7 +1239,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
@@ -1283,6 +1284,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
+  XXHATM(1:NIU-1) = 0.5 * XXHAT(1:NIU-1) + 0.5 * XXHAT(2:NIU)
+  XXHATM(  NIU)   = 1.5 * XXHAT(  NIU)   - 0.5 * XXHAT(NIU-1)
+
+  XYHATM(1:NJU-1) = 0.5 * XYHAT(1:NJU-1) + 0.5 * XYHAT(2:NJU)
+  XYHATM(  NJU)   = 1.5 * XYHAT(  NJU)   - 0.5 * XYHAT(NJU-1)
 END IF
 !
 !*       5.1.2  Orography and Gal-Chen Sommerville transformation :
@@ -1425,8 +1433,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:
 !
@@ -1550,10 +1559,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_real_case.f90 b/src/MNH/prep_real_case.f90
index 7014fc3b2..f73bb0919 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.
@@ -858,9 +858,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/radar_simulator.f90 b/src/MNH/radar_simulator.f90
index b855afc92..d03bfb657 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/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index 8a7335846..6682759c5 100644
--- a/src/MNH/read_all_data_grib_case.f90
+++ b/src/MNH/read_all_data_grib_case.f90
@@ -370,12 +370,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_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90
index a4023d091..ec6421713 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.
@@ -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 c1511ef3b..2648709e0 100644
--- a/src/MNH/read_chem_data_netcdf_case.f90
+++ b/src/MNH/read_chem_data_netcdf_case.f90
@@ -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))
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index d75ca9bba..b60277ad2 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.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.
@@ -250,7 +250,17 @@ 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
+XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) )
+XXHATM( UBOUND(XXHATM,1)     ) = 1.5 * XXHAT( UBOUND(XXHAT,1)     ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 )
+
+XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) )
+XYHATM( UBOUND(XYHATM,1)     ) = 1.5 * XYHAT( UBOUND(XYHAT,1)     ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 )
+
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
 IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU))
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index 2f8b1fc47..bd1de11a9 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.
@@ -121,10 +121,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 +193,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 +215,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 +228,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 +259,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 +300,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 +326,11 @@ END SELECT
 !
 !Set model top
 XZTOP = XZHAT(IKU)
-!
+
+! Interpolations of positions to mass points
+XZHATM(1:IKU-1 ) = 0.5 * XZHAT(1:IKU-1) + 0.5 * XZHAT(2:IKU  )
+XZHATM(  IKU   ) = 1.5 * XZHAT(  IKU  ) - 0.5 * XZHAT(  IKU-1)
+
 !-------------------------------------------------------------------------------
 !
 !*       5.    TEST ON STRETCHING :
diff --git a/src/MNH/relaxdef.f90 b/src/MNH/relaxdef.f90
index 41665139b..216dc0389 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/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90
index cb4d18b42..05ced2f2a 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 395660c88..eac8ea7b8 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 6c49fbbf2..3f82878d9 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 28e528d8b..2f8bd2e68 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 3945848c8..dd7daa678 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_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.
@@ -9,15 +9,15 @@
 !
 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             )
+      SUBROUTINE SET_GRID( KMI, TPINIFILE,                                &
+                           KKU, KIMAX_ll, KJMAX_ll,                       &
+                           PTSTEP, PSEGLEN,                               &
+                           PLONORI, PLATORI, PLON, PLAT,                  &
+                           PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                           PMAP, PZS, PZZ, PZHAT, PZHATM, 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
@@ -47,11 +47,14 @@ 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(:,:),   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
@@ -80,17 +83,17 @@ 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             )
-!     #########################################################################
+!     #####################################################################
+      SUBROUTINE SET_GRID( KMI, TPINIFILE,                                &
+                           KKU, KIMAX_ll, KJMAX_ll,                       &
+                           PTSTEP, PSEGLEN,                               &
+                           PLONORI, PLATORI, PLON, PLAT,                  &
+                           PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                           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 +210,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
@@ -260,11 +264,14 @@ 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(:,:),   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
@@ -396,11 +403,23 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG)
 !
 !*       2.1    Spatial grid
 !
+
+! Interpolations of positions to mass points
+PXHATM( : UBOUND(PXHATM,1)-1 ) = 0.5 * PXHAT( : UBOUND(PXHAT,1)-1 ) + 0.5 * PXHAT( LBOUND(PXHAT,1)+1 : UBOUND(PXHAT,1) )
+PXHATM( UBOUND(PXHATM,1)     ) = 1.5 * PXHAT( UBOUND(PXHAT,1)     ) - 0.5 * PXHAT( UBOUND(PXHAT,1)-1 )
+
+PYHATM( : UBOUND(PYHATM,1)-1 ) = 0.5 * PYHAT( : UBOUND(PYHAT,1)-1 ) + 0.5 * PYHAT( LBOUND(PYHAT,1)+1 : UBOUND(PYHAT,1) )
+PYHATM( UBOUND(PYHATM,1)     ) = 1.5 * PYHAT( UBOUND(PYHAT,1)     ) - 0.5 * PYHAT( UBOUND(PYHAT,1)-1 )
+
+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 )
+
 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
diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90
index 42e384c2a..7e9e43687 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.
@@ -275,11 +275,10 @@ SELECT CASE(CPERT_KIND)
     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
diff --git a/src/MNH/set_ref.f90 b/src/MNH/set_ref.f90
index 3fbd530b7..02496e920 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 f6e82cd85..7822c7e60 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 d53c5ae36..857e92ede 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 89bb3d3ec..bbdf91a69 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.f90 b/src/MNH/shallow_mf.f90
index 2ae315ad5..cac05f86a 100644
--- a/src/MNH/shallow_mf.f90
+++ b/src/MNH/shallow_mf.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.
@@ -192,7 +192,6 @@ USE MODI_COMPUTE_FRAC_ICE
 USE MODI_SHUMAN_MF
 !
 USE MODI_COMPUTE_BL89_ML
-USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT
 USE MODD_REF_n, ONLY : XTHVREF
 USE MODE_MSG
 !
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 4ba0d58a3..7131b7d5a 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,11 @@ 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, &
+                             PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
+                             PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
+                             TPDTMOD, TPDTCUR                                             )
 !
 USE MODD_TIME
 !
@@ -23,22 +23,23 @@ 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,                 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 +48,13 @@ 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, &
+                             PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
+                             PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
+                             TPDTMOD, TPDTCUR                                             )
+!    ######################################################################################
 !
 !!****  *SPAWN_GRID2 * - subroutine to define spatial and temporal grid.
 !!
@@ -184,10 +185,12 @@ 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,                 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 +200,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 +306,8 @@ END IF
 !              --------------------------------------
 !
 PZTOP    = XZTOP1
-PZHAT(:) = XZHAT1(:) 
+PZHAT(:)  = XZHAT1(:)
+PZHATM(:) = XZHATM1(:)
 OSLEVE   = LSLEVE1
 PLEN1    = XLEN11
 PLEN2    = XLEN21
@@ -391,6 +394,11 @@ PLEN2    = XLEN21
   DEALLOCATE(ZXHAT_2D_F)
   DEALLOCATE(ZXHAT_EXTENDED_C)
   DEALLOCATE(ZXHAT_2D_C)
+
+  ! Interpolations of positions to mass points
+  PXHATM(1:IIU_C-1) = 0.5 * PXHAT(1:IIU_C-1) + 0.5 * PXHAT(2:IIU_C)
+  PXHATM(  IIU_C)   = 1.5 * PXHAT(  IIU_C)   - 0.5 * PXHAT(IIU_C-1)
+
 !
 !     YHAT
 !
@@ -449,6 +457,11 @@ PLEN2    = XLEN21
   DEALLOCATE(ZYHAT_2D_F)
   DEALLOCATE(ZYHAT_EXTENDED_C)
   DEALLOCATE(ZYHAT_2D_C)
+
+  ! Interpolations of positions to mass points
+  PYHATM(1:IJU_C-1) = 0.5 * PYHAT(1:IJU_C-1) + 0.5 * PYHAT(2:IJU_C)
+  PYHATM(  IJU_C)   = 1.5 * PYHAT(  IJU_C)   - 0.5 * PYHAT(IJU_C-1)
+
 !!$=======
 !!$  IXSIZE1=SIZE(XXHAT1)
 !!$  ALLOCATE(ZXHAT_EXTENDED(IXSIZE1+1))
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index 7d286b6ee..8837733b6 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.
@@ -735,6 +735,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))
@@ -1058,9 +1059,10 @@ 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, &
+                  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)
@@ -1079,10 +1081,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
@@ -1108,10 +1112,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 15c7d98b7..f0ef28310 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/surf_rad_modif.f90 b/src/MNH/surf_rad_modif.f90
index a21ce0dc1..1cb4f085d 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 b75198959..0a3eaabb7 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                           )
 !     #########################################################################
@@ -95,8 +90,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 +226,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 e7ea4ef22..0ffcf81e3 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 3742792d5..11295f83a 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_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index aa53f0822..596d78c00 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.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.
@@ -339,7 +339,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX
 USE MODD_CST
 USE MODD_CTURB
 use modd_field,          only: tfieldmetadata, TYPEREAL
-USE MODD_GRID_n,         ONLY: XZS, XXHAT, XYHAT
+USE MODD_GRID_n,         ONLY: XZS, XXHAT, XXHATM, XYHAT, XYHATM
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_METRICS_n,      ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
 USE MODD_PARAMETERS
@@ -545,10 +545,9 @@ IF (LOCEAN .AND. LDEEPOC) THEN
   CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
   DO JJ = IJB,IJE
     DO JI = IIB,IIE
-      ZDIST(JI,JJ) = SQRT(                         &
-      (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + &
-      (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2   &
-                                )
+      ZDIST(JI,JJ) = SQRT(                          &
+      ( ( XXHATM(JI) - XCENTX_OC ) / XRADX_OC )**2 + &
+      ( ( XYHATM(JJ) - XCENTY_OC ) / XRADY_OC )**2 )
     END DO
   END DO
   DO JJ=IJB,IJE
diff --git a/src/MNH/ver_interp_to_mixed_grid.f90 b/src/MNH/ver_interp_to_mixed_grid.f90
index 94b161a5d..1c1580cc9 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 a4e8ee654..186f230a4 100644
--- a/src/MNH/ver_thermo.f90
+++ b/src/MNH/ver_thermo.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.
@@ -332,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/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 0bb1d984b..d452fecaf 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -178,7 +178,7 @@ use modd_field,             only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
 USE MODD_FIELD_n,           ONLY: XCIT, XCLDFR, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XYHAT, XZHAT, XZSMT, XZTOP, XZZ
+USE MODD_GRID_n,            only: LSLEVE, 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
@@ -1217,10 +1217,7 @@ IF (LTRAJ) THEN
   ! 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)
+      ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:)
     END DO
   END DO
 
@@ -1236,15 +1233,12 @@ IF (LTRAJ) THEN
     NDIMS      = 3,                    &
     LTIMEDEP   = .TRUE.                )
 
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3)
+  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)
+      ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:)
     END DO
   END DO
 
@@ -1252,7 +1246,7 @@ IF (LTRAJ) THEN
   TZFIELD%CLONGNAME  = 'Y'
   TZFIELD%CCOMMENT   = 'X_Y_Z_Y coordinate'
 
-  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3)
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
 END IF
 !
 ! Passive polluant scalar variables
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 216fefe1f..ef001e661 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -286,7 +286,7 @@ END SUBROUTINE WRITE_SURFX0_MNH
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 use modd_field,         only: tfieldmetadata, tfieldlist, TYPEREAL
-USE MODD_GRID_n,        ONLY: XXHAT, XYHAT
+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,          &
@@ -447,7 +447,12 @@ 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
+      XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) )
+      XXHATM( UBOUND(XXHATM,1)     ) = 1.5 * XXHAT( UBOUND(XXHAT,1)     ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 )
     END IF
   END IF
   DEALLOCATE(ZW1D)
@@ -478,7 +483,12 @@ 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
+      XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) )
+      XYHATM( UBOUND(XYHATM,1)     ) = 1.5 * XYHAT( UBOUND(XYHAT,1)     ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 )
     END IF
   END IF
   DEALLOCATE(ZW1D)
-- 
GitLab


From a90e04873986214515c8e4eea672b05fd312e1d1 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 7 Sep 2022 14:39:23 +0200
Subject: [PATCH 095/157] Philippe 07/09/2022: deduplication of PX/Y/ZHATM
 interpolations + update_halo for horizontal values

---
 src/MNH/ini_modeln.f90      |   2 +-
 src/MNH/ini_spectren.f90    |   2 +-
 src/MNH/prep_ideal_case.f90 |   7 +-
 src/MNH/read_hgridn.f90     |   7 +-
 src/MNH/read_ver_grid.f90   |   4 +-
 src/MNH/set_grid.f90        | 178 +++++++++++++++++++-----------------
 src/MNH/spawn_grid2.f90     |   9 +-
 src/MNH/write_surf_mnh.f90  |   9 +-
 8 files changed, 106 insertions(+), 112 deletions(-)

diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 282936099..9ef32c017 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -412,6 +412,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
 
@@ -460,7 +461,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
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 7f62014dd..c17715ec6 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -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
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index d1604d2f1..6be3241c1 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -379,6 +379,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
 !
 USE MODI_DEFAULT_DESFM_n    ! Interface modules
 USE MODI_DEFAULT_EXPRE
@@ -1286,11 +1287,7 @@ ELSE
   END IF
 
   ! Interpolations of positions to mass points
-  XXHATM(1:NIU-1) = 0.5 * XXHAT(1:NIU-1) + 0.5 * XXHAT(2:NIU)
-  XXHATM(  NIU)   = 1.5 * XXHAT(  NIU)   - 0.5 * XXHAT(NIU-1)
-
-  XYHATM(1:NJU-1) = 0.5 * XYHAT(1:NJU-1) + 0.5 * XYHAT(2:NJU)
-  XYHATM(  NJU)   = 1.5 * XYHAT(  NJU)   - 0.5 * XYHAT(NJU-1)
+  CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 END IF
 !
 !*       5.1.2  Orography and Gal-Chen Sommerville transformation :
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index b60277ad2..39586f979 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -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
 use MODE_TOOLS_ll,       only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll
 !
 IMPLICIT NONE
@@ -255,11 +256,7 @@ IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) )
 IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
 
 ! Interpolations of positions to mass points
-XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) )
-XXHATM( UBOUND(XXHATM,1)     ) = 1.5 * XXHAT( UBOUND(XXHAT,1)     ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 )
-
-XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) )
-XYHATM( UBOUND(XYHATM,1)     ) = 1.5 * XYHAT( UBOUND(XYHAT,1)     ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 )
+CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index bd1de11a9..653bbec02 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -111,6 +111,7 @@ USE MODD_PARAMETERS
 !
 USE MODE_MSG
 USE MODE_POS
+USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS
 !
 USE MODI_DEFAULT_SLEVE
 !
@@ -328,8 +329,7 @@ END SELECT
 XZTOP = XZHAT(IKU)
 
 ! Interpolations of positions to mass points
-XZHATM(1:IKU-1 ) = 0.5 * XZHAT(1:IKU-1) + 0.5 * XZHAT(2:IKU  )
-XZHATM(  IKU   ) = 1.5 * XZHAT(  IKU  ) - 0.5 * XZHAT(  IKU-1)
+CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
 
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index dd7daa678..1f972fd21 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -3,86 +3,24 @@
 !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, PXHATM, PYHATM,  &
-                           PMAP, PZS, PZZ, PZHAT, PZHATM, 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) :: 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(:,:),   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) :: 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
-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
-!
-!
-!
-!
-!
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: SET_GRID
+
+PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
+
+CONTAINS
+
 !     #####################################################################
       SUBROUTINE SET_GRID( KMI, TPINIFILE,                                &
                            KKU, KIMAX_ll, KJMAX_ll,                       &
@@ -405,14 +343,8 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG)
 !
 
 ! Interpolations of positions to mass points
-PXHATM( : UBOUND(PXHATM,1)-1 ) = 0.5 * PXHAT( : UBOUND(PXHAT,1)-1 ) + 0.5 * PXHAT( LBOUND(PXHAT,1)+1 : UBOUND(PXHAT,1) )
-PXHATM( UBOUND(PXHATM,1)     ) = 1.5 * PXHAT( UBOUND(PXHAT,1)     ) - 0.5 * PXHAT( UBOUND(PXHAT,1)-1 )
-
-PYHATM( : UBOUND(PYHATM,1)-1 ) = 0.5 * PYHAT( : UBOUND(PYHAT,1)-1 ) + 0.5 * PYHAT( LBOUND(PYHAT,1)+1 : UBOUND(PYHAT,1) )
-PYHATM( UBOUND(PYHATM,1)     ) = 1.5 * PYHAT( UBOUND(PYHAT,1)     ) - 0.5 * PYHAT( UBOUND(PYHAT,1)-1 )
-
-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 )
+CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
+CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
 
 IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ)
@@ -496,3 +428,77 @@ 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
+
+
+END MODULE MODE_SET_GRID
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 7131b7d5a..6909c693e 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -167,6 +167,7 @@ USE MODD_BIKHARDT_n
 USE MODD_VAR_ll
 use mode_bikhardt
 USE MODE_ll
+USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS
 USE MODE_TIME
 USE MODE_GRIDPROJ
 !
@@ -394,11 +395,6 @@ PLEN2    = XLEN21
   DEALLOCATE(ZXHAT_2D_F)
   DEALLOCATE(ZXHAT_EXTENDED_C)
   DEALLOCATE(ZXHAT_2D_C)
-
-  ! Interpolations of positions to mass points
-  PXHATM(1:IIU_C-1) = 0.5 * PXHAT(1:IIU_C-1) + 0.5 * PXHAT(2:IIU_C)
-  PXHATM(  IIU_C)   = 1.5 * PXHAT(  IIU_C)   - 0.5 * PXHAT(IIU_C-1)
-
 !
 !     YHAT
 !
@@ -459,8 +455,7 @@ PLEN2    = XLEN21
   DEALLOCATE(ZYHAT_2D_C)
 
   ! Interpolations of positions to mass points
-  PYHATM(1:IJU_C-1) = 0.5 * PYHAT(1:IJU_C-1) + 0.5 * PYHAT(2:IJU_C)
-  PYHATM(  IJU_C)   = 1.5 * PYHAT(  IJU_C)   - 0.5 * PYHAT(IJU_C-1)
+  CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 
 !!$=======
 !!$  IXSIZE1=SIZE(XXHAT1)
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index ef001e661..ca3d3d124 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1997-2021 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.
@@ -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
 
@@ -451,8 +452,7 @@ IF (      (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
       XXHAT(:) = ZW1D(1+NHALO:IIU-NHALO)
 
       ! Interpolations of positions to mass points
-      XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) )
-      XXHATM( UBOUND(XXHATM,1)     ) = 1.5 * XXHAT( UBOUND(XXHAT,1)     ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 )
+      CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', XXHAT, XXHATM )
     END IF
   END IF
   DEALLOCATE(ZW1D)
@@ -487,8 +487,7 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
       XYHAT(:) = ZW1D(1+NHALO:IJU-NHALO)
 
       ! Interpolations of positions to mass points
-      XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) )
-      XYHATM( UBOUND(XYHATM,1)     ) = 1.5 * XYHAT( UBOUND(XYHAT,1)     ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 )
+      CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', XYHAT, XYHATM )
     END IF
   END IF
   DEALLOCATE(ZW1D)
-- 
GitLab


From 58b1614eddde4583253cf4c59adcb3fcf50e895d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 9 Sep 2022 14:31:09 +0200
Subject: [PATCH 096/157] Philippe 09/09/2022: add XHAT_BOUND and XHATM_BOUND +
 set their values

---
 src/LIB/SURCOUCHE/src/mode_field.f90 |  26 ++++
 src/MNH/ini_modeln.f90               |  11 +-
 src/MNH/ini_spectren.f90             |   9 +-
 src/MNH/modd_gridn.f90               |  33 ++++-
 src/MNH/prep_ideal_case.f90          |  12 +-
 src/MNH/read_hgridn.f90              |   8 +-
 src/MNH/read_ver_grid.f90            |   6 +-
 src/MNH/set_grid.f90                 | 200 +++++++++++++++++++++------
 src/MNH/spawn_grid2.f90              |  12 +-
 src/MNH/spawn_model2.f90             |   2 +
 10 files changed, 258 insertions(+), 61 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index a0df6d83f..71eefd211 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -511,6 +511,30 @@ call Add_field2list( TFIELDDATA( &
   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', &
@@ -3632,6 +3656,8 @@ 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 )
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 9ef32c017..a3de7b35a 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -292,7 +292,7 @@ END MODULE MODI_INI_MODEL_n
 !  S. Riette      04/2020: XHL* fields
 !  F. Auguste     02/2021: add IBM
 !  T.Nigel        02/2021: add turbulence recycling
-! J.L.Redelsperger 06/2011: OCEAN case
+! J.L.Redelsperger 06/2021: OCEAN case
 !---------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -1013,6 +1013,8 @@ ALLOCATE(XDIRCOSXW(IIU,IJU))
 ALLOCATE(XDIRCOSYW(IIU,IJU))
 ALLOCATE(XCOSSLOPE(IIU,IJU))
 ALLOCATE(XSINSLOPE(IIU,IJU))
+ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE))
+ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE))
 !
 ALLOCATE(XDXX(IIU,IJU,IKU))
 ALLOCATE(XDYY(IIU,IJU,IKU))
@@ -1858,9 +1860,10 @@ END IF
 CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
                XTSTEP, XSEGLEN,                                                &
                XLONORI, XLATORI, XLON, XLAT,                                   &
-               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, XMAP,             &
-               XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, XLEN1, XLEN2, XZSMT,    &
-               ZJ,                                                             &
+               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               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)
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index c17715ec6..a98810782 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -269,6 +269,8 @@ ALLOCATE(XZSMT(IIU,IJU))
 ALLOCATE(XZZ(IIU,IJU,IKU))
 ALLOCATE(XZHAT(IKU))
 ALLOCATE(XZHATM(IKU))
+ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE))
+ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE))
 !
 ALLOCATE(XDXX(IIU,IJU,IKU))
 ALLOCATE(XDYY(IIU,IJU,IKU))
@@ -688,9 +690,10 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
 CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
                XTSTEP, XSEGLEN,                                                &
                XLONORI, XLATORI, XLON, XLAT,                                   &
-               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, XMAP,             &
-               XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, XLEN1, XLEN2, XZSMT,    &
-               ZJ,                                                             &
+               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               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)
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 6437cfc8b..1f0c5d895 100644
--- a/src/MNH/modd_gridn.f90
+++ b/src/MNH/modd_gridn.f90
@@ -31,20 +31,39 @@
 !!
 !!    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
-!  P. Wautelet 02/09/2022: add XXHATM, XYHATM and XZHATM
+!  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 and XHATM_BOUND
 !-------------------------------------------------------------------------------
 !
 !*       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
@@ -67,5 +86,7 @@ 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
 
 END MODULE MODD_GRID_n
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 6be3241c1..8d4cdc385 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -379,7 +379,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
+USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS
 !
 USE MODI_DEFAULT_DESFM_n    ! Interface modules
 USE MODI_DEFAULT_EXPRE
@@ -1242,6 +1242,7 @@ ELSE
 !
   ALLOCATE( XXHAT(NIU),  XYHAT(NJU)  )
   ALLOCATE( XXHATM(NIU), XYHATM(NJU) )
+  ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 !
 ! define the grid localization at the earth surface by the central point
 ! coordinates
@@ -1254,14 +1255,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
@@ -1288,6 +1285,11 @@ ELSE
 
   ! Interpolations of positions to mass points
   CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
+
+  ! Collect global domain boundaries
+  CALL STORE_HORGRID_BOUNDS( XXHAT,  XYHAT,  XHAT_BOUND  )
+  CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND )
+
 END IF
 !
 !*       5.1.2  Orography and Gal-Chen Sommerville transformation :
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index 39586f979..7bdf08ec4 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -93,7 +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
+USE MODE_SET_GRID,       only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS
 use MODE_TOOLS_ll,       only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll
 !
 IMPLICIT NONE
@@ -254,10 +254,16 @@ CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT)
 
 IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) )
 IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
+IF ( .NOT. ASSOCIATED(XHAT_BOUND)  ) ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE) )
+IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) )
 
 ! Interpolations of positions to mass points
 CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
+! Collect global domain boundaries
+CALL STORE_HORGRID_BOUNDS( XXHAT,  XYHAT,  XHAT_BOUND  )
+CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND )
+
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
 IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU))
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index 653bbec02..7fd47bf64 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -111,7 +111,7 @@ USE MODD_PARAMETERS
 !
 USE MODE_MSG
 USE MODE_POS
-USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS
+USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_VERGRID_BOUNDS
 !
 USE MODI_DEFAULT_SLEVE
 !
@@ -331,6 +331,10 @@ XZTOP = XZHAT(IKU)
 ! Interpolations of positions to mass points
 CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
 
+! Collect global domain boundaries
+CALL STORE_VERGRID_BOUNDS( XZHAT,  XHAT_BOUND  )
+CALL STORE_VERGRID_BOUNDS( XZHATM, XHATM_BOUND )
+
 !-------------------------------------------------------------------------------
 !
 !*       5.    TEST ON STRETCHING :
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index 1f972fd21..25d645e5c 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -19,6 +19,8 @@ PUBLIC :: SET_GRID
 
 PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
 
+PUBLIC :: STORE_GRID_BOUNDS, STORE_HORGRID_BOUNDS, STORE_VERGRID_BOUNDS
+
 CONTAINS
 
 !     #####################################################################
@@ -27,6 +29,7 @@ CONTAINS
                            PTSTEP, PSEGLEN,                               &
                            PLONORI, PLATORI, PLON, PLAT,                  &
                            PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                           PHAT_BOUND, PHATM_BOUND,                       &
                            PMAP, PZS, PZZ, PZHAT, PZHATM, PZTOP, OSLEVE,  &
                            PLEN1, PLEN2, PZSMT, PJ,                       &
                            TPDTMOD, TPDTCUR, KSTOP,                       &
@@ -204,6 +207,8 @@ 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(:),     INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),     INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane at mass pts
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
 !
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PZS       ! orography
@@ -346,6 +351,10 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG)
 CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
 
+! Collect global domain boundaries
+CALL STORE_GRID_BOUNDS( PXHAT,  PYHAT,  PZHAT,  PHAT_BOUND  )
+CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND )
+
 IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ)
 ELSE
@@ -430,75 +439,186 @@ 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
+  ! Interpolate 1 direction of horizontal grid to mass points
 
-USE MODD_ARGSLIST_ll, ONLY: LIST1D_ll
+  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
+  USE MODE_ARGSLIST_ll, ONLY: ADD1DFIELD_ll, CLEANLIST1D_ll
+  USE MODE_EXCHANGE_ll, ONLY: UPDATE_1DHALO_ll
+  USE MODE_MSG
 
-IMPLICIT NONE
+  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=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
+  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 )
+  ! 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 )
+  ! 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
+  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 )
+  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
+  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
+  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 )
+  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
+  ! Interpolate vertical grid to mass points
 
-IMPLICIT NONE
+  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
+  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 )
+  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_BOUNDS( HDIR, PHAT, PHAT_BOUND )
+
+  USE MODD_GRID_n
+  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+
+  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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+
+  INTEGER                     :: IERR
+  LOGICAL                     :: GALLOC
+  REAL, DIMENSION(:), POINTER :: ZHAT_GLOB
+
+  ZHAT_GLOB => NULL()
+
+  SELECT CASE (HDIR)
+    CASE ( 'X' )
+      CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC )
+      CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR )
+      PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 )
+      PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT )
+
+    CASE ( 'Y' )
+      CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC )
+      CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR )
+      PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 )
+      PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT )
+
+    CASE ( 'Z' )
+      ZHAT_GLOB => PHAT
+      PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 )
+      PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 )
+      PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPVEXT )
+
+    CASE DEFAULT
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' )
+
+  END SELECT
+
+  IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB )
+
+END SUBROUTINE STORE_GRID_1DIR_BOUNDS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+
+  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND )
+
+END SUBROUTINE STORE_GRID_BOUNDS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PHAT_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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+
+  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND )
+
+END SUBROUTINE STORE_HORGRID_BOUNDS
+!-----------------------------------------------------------------
+
+
+!-----------------------------------------------------------------
+SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PHAT_BOUND )
+
+  IMPLICIT NONE
+
+  REAL, DIMENSION(:), INTENT(IN)    :: PZHAT  ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+
+  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND )
+
+END SUBROUTINE STORE_VERGRID_BOUNDS
+!-----------------------------------------------------------------
 
 
 END MODULE MODE_SET_GRID
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 6909c693e..564efb716 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -11,6 +11,7 @@ INTERFACE
 !
      SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
                              PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PHAT_BOUND, PHATM_BOUND,                                     &
                              PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
                              PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
                              TPDTMOD, TPDTCUR                                             )
@@ -29,6 +30,8 @@ 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(:),   INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),   INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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
@@ -51,6 +54,7 @@ END MODULE MODI_SPAWN_GRID2
 !    ######################################################################################
      SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
                              PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PHAT_BOUND, PHATM_BOUND,                                     &
                              PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
                              PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
                              TPDTMOD, TPDTCUR                                             )
@@ -167,7 +171,7 @@ USE MODD_BIKHARDT_n
 USE MODD_VAR_ll
 use mode_bikhardt
 USE MODE_ll
-USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS
+USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GRID_BOUNDS
 USE MODE_TIME
 USE MODE_GRIDPROJ
 !
@@ -192,6 +196,8 @@ 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(:),   INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+REAL, DIMENSION(:),   INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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
@@ -457,6 +463,10 @@ PLEN2    = XLEN21
   ! Interpolations of positions to mass points
   CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 
+  ! Collect global domain boundaries
+  CALL STORE_GRID_BOUNDS( PXHAT,  PYHAT,  PZHAT,  PHAT_BOUND  )
+  CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, 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 8837733b6..a824c074b 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -736,6 +736,7 @@ END IF
 !
 ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU))
 ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU))
+ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 ALLOCATE(XZTOP)
 ALLOCATE(XMAP(IIU,IJU))
 ALLOCATE(XLAT(IIU,IJU))
@@ -1061,6 +1062,7 @@ ENDIF
 XZS=0.
 CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO,                  &
                   XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, &
+                  XHAT_BOUND, XHATM_BOUND,                                       &
                   XZTOP, LSLEVE, XLEN1, XLEN2,                                   &
                   XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR                   )
 !
-- 
GitLab


From f40612d33e499aaa9244f1136cd0df0d343fac0c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 14 Sep 2022 09:27:53 +0200
Subject: [PATCH 097/157] Philippe 14/09/2022: fix: set correct global physical
 boundaries at non-mass points

---
 src/MNH/prep_ideal_case.f90 |   3 +-
 src/MNH/read_hgridn.f90     |   3 +-
 src/MNH/read_ver_grid.f90   |   3 +-
 src/MNH/set_grid.f90        | 100 +++++++++++++++++++++++++-----------
 src/MNH/spawn_grid2.f90     |   3 +-
 5 files changed, 75 insertions(+), 37 deletions(-)

diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 8d4cdc385..bf758751f 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -1287,8 +1287,7 @@ ELSE
   CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_HORGRID_BOUNDS( XXHAT,  XYHAT,  XHAT_BOUND  )
-  CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND )
+  CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
 
 END IF
 !
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index 7bdf08ec4..4afe7ed32 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -261,8 +261,7 @@ IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) )
 CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
 ! Collect global domain boundaries
-CALL STORE_HORGRID_BOUNDS( XXHAT,  XYHAT,  XHAT_BOUND  )
-CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND )
+CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
 
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index 7fd47bf64..a00d7a30a 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -332,8 +332,7 @@ XZTOP = XZHAT(IKU)
 CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_VERGRID_BOUNDS( XZHAT,  XHAT_BOUND  )
-CALL STORE_VERGRID_BOUNDS( XZHATM, XHATM_BOUND )
+CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
 
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index 25d645e5c..c6acdf6b9 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -352,8 +352,7 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_GRID_BOUNDS( PXHAT,  PYHAT,  PZHAT,  PHAT_BOUND  )
-CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND )
+CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
 IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ)
@@ -517,7 +516,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND )
+SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   USE MODD_GRID_n
   USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
@@ -528,94 +527,137 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND )
 
   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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+  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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
 
   INTEGER                     :: IERR
-  LOGICAL                     :: GALLOC
+  LOGICAL                     :: GALLOC, GALLOCM
   REAL, DIMENSION(:), POINTER :: ZHAT_GLOB
+  REAL, DIMENSION(:), POINTER :: ZHATM_GLOB
 
-  ZHAT_GLOB => NULL()
+  ZHAT_GLOB  => NULL()
+  ZHATM_GLOB => NULL()
 
   SELECT CASE (HDIR)
     CASE ( 'X' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC )
-      CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR )
+      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'XX', GALLOC  )
+      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM )
+      CALL GATHERALL_FIELD_ll( 'XX', PHAT,  ZHAT_GLOB,  IERR )
+      CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR )
+
+      ! Global boundaries on u points
       PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 )
       PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
       PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT )
+      PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_XMIN) = ZHATM_GLOB( 1 )
+      PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
+      PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
 
     CASE ( 'Y' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC )
-      CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR )
+      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'YY', GALLOC  )
+      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM )
+      CALL GATHERALL_FIELD_ll( 'YY', PHAT,  ZHAT_GLOB,  IERR )
+      CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR )
+
+      ! Global boundaries on v points
       PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 )
       PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
       PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT )
+      PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_YMIN) = ZHATM_GLOB( 1 )
+      PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
+      PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
 
     CASE ( 'Z' )
-      ZHAT_GLOB => PHAT
+      ZHAT_GLOB  => PHAT
+      ZHATM_GLOB => PHATM
+
+      ! Global boundaries on w points
       PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 )
       PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
       PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 )
-      PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPVEXT )
+      PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+
+      ! Global boundaries on m points
+      PHATM_BOUND(NEXTE_ZMIN) = ZHATM_GLOB( 1 )
+      PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
+      PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 )
+      PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT )
 
     CASE DEFAULT
       CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' )
 
   END SELECT
 
-  IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB )
+  IF ( GALLOC  ) DEALLOCATE( ZHAT_GLOB  )
+  IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB )
 
 END SUBROUTINE STORE_GRID_1DIR_BOUNDS
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND )
+SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, 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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(IN)    :: PXHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(IN)    :: PZHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
 END SUBROUTINE STORE_GRID_BOUNDS
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PHAT_BOUND )
+SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, 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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(IN)    :: PXHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
 
 END SUBROUTINE STORE_HORGRID_BOUNDS
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PHAT_BOUND )
+SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
   REAL, DIMENSION(:), INTENT(IN)    :: PZHAT  ! Position y in the conformal or cartesian plane
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(IN)    :: PZHATM ! id at mass points
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
+  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND )
+  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
 END SUBROUTINE STORE_VERGRID_BOUNDS
 !-----------------------------------------------------------------
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 564efb716..2bbc35dd8 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -464,8 +464,7 @@ PLEN2    = XLEN21
   CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_GRID_BOUNDS( PXHAT,  PYHAT,  PZHAT,  PHAT_BOUND  )
-  CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND )
+  CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
 !!$=======
 !!$  IXSIZE1=SIZE(XXHAT1)
-- 
GitLab


From b160942ec1195a08944e4503fb08b47d33f51edf Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 14 Sep 2022 11:17:33 +0200
Subject: [PATCH 098/157] Philippe 14/09/2022: use XHATM_BOUND

---
 src/MNH/ini_posprofilern.f90         | 45 ++--------------------------
 src/MNH/ini_surfstationn.f90         | 45 ++--------------------------
 src/MNH/statprof_reader.f90          | 19 +++---------
 src/MNH/statprof_tools.f90           | 35 ++++++++--------------
 src/MNH/write_lfifm1_for_diag.f90    | 17 ++---------
 src/MNH/write_lfifmn_fordiachron.f90 | 16 ++--------
 src/MNH/write_lfin.f90               | 14 +--------
 7 files changed, 27 insertions(+), 164 deletions(-)

diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90
index 966c343cf..674dab0d8 100644
--- a/src/MNH/ini_posprofilern.f90
+++ b/src/MNH/ini_posprofilern.f90
@@ -62,13 +62,9 @@ USE MODD_ALLPROFILER_n
 USE MODD_CONF,           ONLY: LCARTESIAN
 USE MODD_DYN,            ONLY: XSEGLEN
 USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
-USE MODD_GRID_n,         ONLY: XXHAT, XXHATM, XYHAT, XYHATM
-USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_PROFILER_n,     ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME
 USE MODD_TYPE_STATPROF,  ONLY: TPROFILERDATA
 
-USE MODE_ALLOCBUFFER_ll,  ONLY: ALLOCBUFFER_ll
-USE MODE_GATHER_ll,       ONLY: GATHERALL_FIELD_ll
 USE MODE_MSG
 USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ
 USE MODE_STATPROF_TOOLS,  ONLY: PROFILER_ADD, PROFILER_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION
@@ -84,19 +80,11 @@ IMPLICIT NONE
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: IERR
-INTEGER :: IIU
-INTEGER :: IJU
 INTEGER :: INUMBPROF                        ! Total number of profilers (inside physical domain of model)
 INTEGER :: ISTORE                           ! number of storage instants
 INTEGER :: JI
-LOGICAL :: GALLOCX, GALLOCY
 LOGICAL :: GINSIDE                          ! True if profiler is inside physical domain of model
 LOGICAL :: GPRESENT                         ! True if profiler is present on the current process
-REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
-REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
-REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
-REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
 TYPE(TPROFILERDATA)          :: TZPROFILER
 !
 !----------------------------------------------------------------------------
@@ -112,24 +100,6 @@ ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILERS_TIME%XTSTEP ) + 1
 
 allocate( tprofilers_time%tpdates(istore) )
 !
-! Prepare positioning data
-!
-IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN
-  IIU = SIZE( XXHAT )
-  IJU = SIZE( XYHAT )
-
-  ! Get global XHAT and YHAT (needed by PROFILER_POSITION)
-  CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX )
-  CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY )
-  CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
-  CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
-
-  ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
-  ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
-  ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
-  ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) )
-END IF
-!
 ! Profilers initialization
 !
 NUMBPROFILER_LOC = 0
@@ -150,9 +120,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN
       TZPROFILER%XZ    = XZ_PROF(JI)
       TZPROFILER%CNAME = CNAME_PROF(JI)
 
-      CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,                 &
-                              ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
-                              GINSIDE, GPRESENT                                                   )
+      CALL STATPROF_POSITION( TZPROFILER, GINSIDE, GPRESENT )
 
       IF ( GINSIDE ) THEN
         INUMBPROF = INUMBPROF + 1
@@ -164,9 +132,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN
   END IF
 ELSE
   !Treat CSV datafile
-  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,    &
-                          ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
-                          INUMBPROF                                                          )
+  CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, INUMBPROF )
 END IF
 
 LPROFILER = ( INUMBPROF > 0 )
@@ -174,13 +140,6 @@ LPROFILER = ( INUMBPROF > 0 )
 DO JI = 1, NUMBPROFILER_LOC
   CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE )
 END DO
-!
-! Clean positioning data
-!
-IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN
-  IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB )
-  IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB )
-END IF
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_POSPROFILER_n
diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90
index 94332d77c..c312cf819 100644
--- a/src/MNH/ini_surfstationn.f90
+++ b/src/MNH/ini_surfstationn.f90
@@ -63,13 +63,9 @@ USE MODD_ALLSTATION_n
 USE MODD_CONF,           ONLY: LCARTESIAN
 USE MODD_DYN,            ONLY: XSEGLEN
 USE MODD_DYN_n,          ONLY: DYN_MODEL, XTSTEP
-USE MODD_GRID_n,         ONLY: XXHAT, XXHATM, XYHAT, XYHATM
-USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
 USE MODD_STATION_n
 USE MODD_TYPE_STATPROF
 !
-USE MODE_ALLOCBUFFER_ll,  ONLY: ALLOCBUFFER_ll
-USE MODE_GATHER_ll,       ONLY: GATHERALL_FIELD_ll
 USE MODE_MSG
 USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ
 USE MODE_STATPROF_TOOLS,  ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION
@@ -85,19 +81,11 @@ IMPLICIT NONE
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: IERR
-INTEGER :: IIU
-INTEGER :: IJU
 INTEGER :: INUMBSTAT                        ! Total number of stations (inside physical domain of model)
 INTEGER :: ISTORE                           ! number of storage instants
 INTEGER :: JI
-LOGICAL :: GALLOCX, GALLOCY
 LOGICAL :: GINSIDE                          ! True if station is inside physical domain of model
 LOGICAL :: GPRESENT                         ! True if station is present on the current process
-REAL    :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain
-REAL    :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain
-REAL, DIMENSION(:), POINTER  :: ZXHAT_GLOB
-REAL, DIMENSION(:), POINTER  :: ZYHAT_GLOB
 TYPE(TSTATIONDATA)           :: TZSTATION
 !
 !----------------------------------------------------------------------------
@@ -113,24 +101,6 @@ ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1
 
 allocate( tstations_time%tpdates(istore) )
 !
-! Prepare positioning data
-!
-IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
-  IIU = SIZE( XXHAT )
-  IJU = SIZE( XYHAT )
-
-  ! Get global XHAT and YHAT (needed by STATPROF_POSITION)
-  CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX )
-  CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY )
-  CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR )
-  CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR )
-
-  ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) )
-  ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) )
-  ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) )
-  ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) )
-END IF
-!
 ! Stations initialization
 !
 NUMBSTAT_LOC = 0
@@ -151,9 +121,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
       TZSTATION%XZ    = XZ_STAT(JI)
       TZSTATION%CNAME = CNAME_STAT(JI)
 
-      CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,                 &
-                             ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
-                             GINSIDE, GPRESENT                                                   )
+      CALL STATPROF_POSITION( TZSTATION, GINSIDE, GPRESENT )
 
       IF ( GINSIDE ) THEN
         INUMBSTAT = INUMBSTAT + 1
@@ -165,9 +133,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN
   END IF
 ELSE
   !Treat CSV datafile
-  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM,     &
-                          ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, &
-                          INUMBSTAT                                                          )
+  CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, INUMBSTAT )
 END IF
 
 LSTATION = ( INUMBSTAT > 0 )
@@ -175,13 +141,6 @@ LSTATION = ( INUMBSTAT > 0 )
 DO JI = 1, NUMBSTAT_LOC
   CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE )
 END DO
-!
-! Clean positioning data
-!
-IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN
-  IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB )
-  IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB )
-END IF
 
 !----------------------------------------------------------------------------
 
diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90
index 92eb1917f..be9c3d2e2 100644
--- a/src/MNH/statprof_reader.f90
+++ b/src/MNH/statprof_reader.f90
@@ -34,11 +34,9 @@ CONTAINS
 !  P. Wautelet    04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs
 !---------------------------------------------------------------
 !
-!#################################################################################################
-SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,         &
-                              PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
-                              KNUMBSTATPROF                                                      )
-!#################################################################################################
+!###############################################################
+SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, KNUMBSTATPROF )
+!###############################################################
 
 USE MODD_CONF,          ONLY: LCARTESIAN
 USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
@@ -48,18 +46,11 @@ USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, STATION_ADD, STATPROF_INI_INTERP, S
 
 CLASS(TSTATPROFDATA), INTENT(IN)  :: TPSTATPROF ! Used only to identify datatype
 CHARACTER(LEN=*),     INTENT(IN)  :: HFILE ! file to read
-REAL, DIMENSION(:),   INTENT(IN)  :: PXHAT_GLOB
-REAL, DIMENSION(:),   INTENT(IN)  :: PYHAT_GLOB
-REAL, DIMENSION(:),   INTENT(IN)  :: PXHATM ! mass point coordinates
-REAL, DIMENSION(:),   INTENT(IN)  :: PYHATM ! mass point coordinates
-REAL,                 INTENT(IN)  :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
-REAL,                 INTENT(IN)  :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX  ! Minimum X coordinate of mass points in the physical domain
 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
-INTEGER             :: JI
 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
@@ -100,9 +91,7 @@ DO
   END IF
 
   IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF )
-  CALL STATPROF_POSITION( TZSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,                 &
-                         PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
-                         GINSIDE, GPRESENT                                                   )
+  CALL STATPROF_POSITION( TZSTATPROF, GINSIDE, GPRESENT )
 
   IF ( GINSIDE ) THEN
     KNUMBSTATPROF = KNUMBSTATPROF + 1
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index e48358ed2..4a0ac4239 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -271,16 +271,15 @@ SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF )
 
 END SUBROUTINE STATPROF_INI_INTERP
 
-! ###############################################################################################
-SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM,               &
-                             PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, &
-                             OINSIDE, OPRESENT                                                  )
-! ###############################################################################################
+! ###########################################################
+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: XXHAT, XYHAT, XZZ
+  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
@@ -290,14 +289,6 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
   IMPLICIT NONE
 
   CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF
-  REAL, DIMENSION(:),   INTENT(IN)    :: PXHAT_GLOB
-  REAL, DIMENSION(:),   INTENT(IN)    :: PYHAT_GLOB
-  REAL, DIMENSION(:),   INTENT(IN)    :: PXHATM ! mass point coordinates
-  REAL, DIMENSION(:),   INTENT(IN)    :: PYHATM ! mass point coordinates
-  REAL,                 INTENT(IN)    :: PXHATM_PHYS_MIN  ! Minimum X coordinate of mass points in the physical domain
-  REAL,                 INTENT(IN)    :: PYHATM_PHYS_MIN  ! Minimum Y coordinate of mass points in the physical domain
-  REAL,                 INTENT(IN)    :: PXHATM_PHYS_MAX  ! Maximum X coordinate of mass points in the physical domain
-  REAL,                 INTENT(IN)    :: PYHATM_PHYS_MAX  ! Minimum Y coordinate of mass points in the physical domain
   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
 
@@ -314,8 +305,8 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
 
   CALL GET_INDICE_ll( IIB, IJB, IIE, IJE )
 
-  IF (       TPSTATPROF%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) &
-       .AND. TPSTATPROF%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN
+  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)
@@ -325,11 +316,11 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
 
   ! X position
   TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX )
-  TPSTATPROF%NI_M = COUNT( PXHATM(:) <= TPSTATPROF%XX )
+  TPSTATPROF%NI_M = COUNT( XXHATM(:) <= TPSTATPROF%XX )
 
   ! Y position
   TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY )
-  TPSTATPROF%NJ_M = COUNT( PYHATM(:) <= 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 &
@@ -338,8 +329,8 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
 
   ! 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 < PXHATM_PHYS_MIN .OR. TPSTATPROF%XX > PXHATM_PHYS_MAX &
-         .OR. TPSTATPROF%XY < PYHATM_PHYS_MIN .OR. TPSTATPROF%XY > PYHATM_PHYS_MAX ) 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
@@ -355,9 +346,9 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM
   ! Computations only on correct process
   IF ( OPRESENT .AND. .NOT. L1D ) THEN
     ! Interpolation coefficient for X (mass-point)
-    TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - PXHATM(TPSTATPROF%NI_M) ) / ( PXHATM(TPSTATPROF%NI_M+1) - PXHATM(TPSTATPROF%NI_M) )
+    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 - PYHATM(TPSTATPROF%NJ_M) ) / ( PYHATM(TPSTATPROF%NJ_M+1) - PYHATM(TPSTATPROF%NJ_M) )
+    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)
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index d452fecaf..a83308109 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -178,7 +178,8 @@ use modd_field,             only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
 USE MODD_FIELD_n,           ONLY: XCIT, XCLDFR, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ
+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
@@ -211,7 +212,6 @@ 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_GATHER_ll,         only: GATHERALL_FIELD_ll
 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
@@ -263,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
@@ -398,13 +393,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), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR )
 !
   CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
   CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90
index d6c6ba317..83b6d0a9b 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), XYHATM(NEXTE_XMIN), 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 c1fdfcd2c..8818506c3 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -259,7 +259,6 @@ 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_IO_FIELD_WRITE, only: IO_Field_write
 USE MODE_IO_FILE,        only: IO_File_close
@@ -299,11 +298,6 @@ 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           :: INFO_ll
@@ -366,13 +360,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), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR )
 !
   CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
   CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
-- 
GitLab


From df3149919de5f14627f33e606b3092e992ea27c8 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 14 Sep 2022 11:36:30 +0200
Subject: [PATCH 099/157] Philippe 14/09/2022: bugfix: NBALLOONS => NAIRCRAFTS

---
 src/MNH/aircraft_balloon.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index eb5b0d777..02b18e25d 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -151,7 +151,7 @@ DO JI = 1, NBALLOONS
                               TBALLOONS(JI), PSEA                                      )
 END DO
 !
-DO JI = 1, NBALLOONS
+DO JI = 1, NAIRCRAFTS
   CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,          &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
                               TAIRCRAFTS(JI), PSEA                                     )
-- 
GitLab


From 81f4ea921487a16e76e5fb68d90b8edbeb7c4e05 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 14 Sep 2022 14:38:17 +0200
Subject: [PATCH 100/157] Philippe 14/09/2022: bugfix: GALLOC/GALLOCM were not
 initialized

---
 src/MNH/set_grid.f90 | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index c6acdf6b9..e2cb21e46 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -538,6 +538,8 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
   REAL, DIMENSION(:), POINTER :: ZHAT_GLOB
   REAL, DIMENSION(:), POINTER :: ZHATM_GLOB
 
+  GALLOC  = .FALSE.
+  GALLOCM = .FALSE.
   ZHAT_GLOB  => NULL()
   ZHATM_GLOB => NULL()
 
-- 
GitLab


From 9accacee9316f0ad4cb5863c692f0cf99f83bd25 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 14 Sep 2022 14:39:04 +0200
Subject: [PATCH 101/157] Philippe 14/09/2022: bugfix: usage of xhatm_bound was
 incorrect

---
 src/MNH/write_lfifm1_for_diag.f90    | 2 +-
 src/MNH/write_lfifmn_fordiachron.f90 | 2 +-
 src/MNH/write_lfin.f90               | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index a83308109..ceba1cb51 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -393,7 +393,7 @@ IF (.NOT.LCARTESIAN) THEN
 ! 
 !* diagnostic of 1st mass point
 !
-  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR )
+  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_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90
index 83b6d0a9b..a46115d97 100644
--- a/src/MNH/write_lfifmn_fordiachron.f90
+++ b/src/MNH/write_lfifmn_fordiachron.f90
@@ -157,7 +157,7 @@ IF (.NOT.LCARTESIAN) THEN
   !
   !* diagnostic of 1st mass point
   !
-  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR )
+  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 8818506c3..1b48d9b9b 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -360,7 +360,7 @@ IF (.NOT.LCARTESIAN) THEN
 ! 
 !* diagnostic of 1st mass point
 !
-  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR )
+  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)
-- 
GitLab


From 62c85f203c6382f666f706ac88a4715f3f0220a6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 15 Sep 2022 16:27:53 +0200
Subject: [PATCH 102/157] Philippe 15/09/2022: bugfix: prep_ideal_case: earlier
 allocate of XHAT_BOUND and XHATM_BOUND

---
 src/MNH/prep_ideal_case.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index bf758751f..2a892ab01 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -904,6 +904,7 @@ IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE.
 !
 !*       4.1  Vertical Spatial grid 
 !
+ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 CALL READ_VER_GRID(TZEXPREFILE)
 !
 !*       4.2  Initialize parallel variables and compute array's dimensions
@@ -1242,7 +1243,6 @@ ELSE
 !
   ALLOCATE( XXHAT(NIU),  XYHAT(NJU)  )
   ALLOCATE( XXHATM(NIU), XYHATM(NJU) )
-  ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 !
 ! define the grid localization at the earth surface by the central point
 ! coordinates
-- 
GitLab


From 3719b8c02f0b1ba126837717566405edeeb01b84 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 21 Sep 2022 15:08:51 +0200
Subject: [PATCH 103/157] Philippe 21/09/2022: move allocations of XHAT_BOUND
 and XHATM_BOUND to STORE_GRID_1DIR_BOUNDS

---
 src/MNH/ini_modeln.f90      |  2 --
 src/MNH/ini_spectren.f90    |  2 --
 src/MNH/prep_ideal_case.f90 |  1 -
 src/MNH/read_hgridn.f90     |  2 --
 src/MNH/set_grid.f90        | 66 ++++++++++++++++++++++---------------
 src/MNH/spawn_grid2.f90     |  8 ++---
 src/MNH/spawn_model2.f90    |  1 -
 7 files changed, 43 insertions(+), 39 deletions(-)

diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index a3de7b35a..9a4aed5cd 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1013,8 +1013,6 @@ ALLOCATE(XDIRCOSXW(IIU,IJU))
 ALLOCATE(XDIRCOSYW(IIU,IJU))
 ALLOCATE(XCOSSLOPE(IIU,IJU))
 ALLOCATE(XSINSLOPE(IIU,IJU))
-ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE))
-ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE))
 !
 ALLOCATE(XDXX(IIU,IJU,IKU))
 ALLOCATE(XDYY(IIU,IJU,IKU))
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index a98810782..29b2679f0 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -269,8 +269,6 @@ ALLOCATE(XZSMT(IIU,IJU))
 ALLOCATE(XZZ(IIU,IJU,IKU))
 ALLOCATE(XZHAT(IKU))
 ALLOCATE(XZHATM(IKU))
-ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE))
-ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE))
 !
 ALLOCATE(XDXX(IIU,IJU,IKU))
 ALLOCATE(XDYY(IIU,IJU,IKU))
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 2a892ab01..b4faa5ac1 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -904,7 +904,6 @@ IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE.
 !
 !*       4.1  Vertical Spatial grid 
 !
-ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 CALL READ_VER_GRID(TZEXPREFILE)
 !
 !*       4.2  Initialize parallel variables and compute array's dimensions
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index 4afe7ed32..cfccf88ba 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -254,8 +254,6 @@ CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT)
 
 IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) )
 IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
-IF ( .NOT. ASSOCIATED(XHAT_BOUND)  ) ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE) )
-IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) )
 
 ! Interpolations of positions to mass points
 CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index e2cb21e46..e2d28d064 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -207,8 +207,8 @@ 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(:),     INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-REAL, DIMENSION(:),     INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane at mass pts
+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
@@ -284,7 +284,8 @@ 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 = TFIELDMETADATA( TFIELDLIST(IID) )
     TZFIELD%CMNHNAME = 'LONOR'
@@ -519,7 +520,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS
 SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   USE MODD_GRID_n
-  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+  USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT, XNEGUNDEF
 
   USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll
   USE MODE_GATHER_ll,      ONLY: GATHERALL_FIELD_ll
@@ -527,11 +528,11 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-  REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
+  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_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
@@ -540,9 +541,20 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   GALLOC  = .FALSE.
   GALLOCM = .FALSE.
+
   ZHAT_GLOB  => NULL()
   ZHATM_GLOB => NULL()
 
+  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' )
       CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'XX', GALLOC  )
@@ -613,14 +625,14 @@ SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_
 
   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 ! id at mass points
-  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! id at mass points
-  REAL, DIMENSION(:), INTENT(IN)    :: PZHATM ! id at mass points
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
+  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) :: 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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
   CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
@@ -635,12 +647,12 @@ SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM
 
   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 ! id at mass points
-  REAL, DIMENSION(:), INTENT(IN)    :: PYHATM ! id at mass points
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
+  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) :: 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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
   CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
@@ -654,10 +666,10 @@ SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
-  REAL, DIMENSION(:), INTENT(IN)    :: PZHAT  ! Position y in the conformal or cartesian plane
-  REAL, DIMENSION(:), INTENT(IN)    :: PZHATM ! id at mass points
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-  REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points
+  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
 
   CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 2bbc35dd8..332519faa 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -30,8 +30,8 @@ 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(:),   INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-REAL, DIMENSION(:),   INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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
@@ -196,8 +196,8 @@ 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(:),   INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
-REAL, DIMENSION(:),   INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index a824c074b..fe3baed67 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -736,7 +736,6 @@ END IF
 !
 ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU))
 ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU))
-ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) )
 ALLOCATE(XZTOP)
 ALLOCATE(XMAP(IIU,IJU))
 ALLOCATE(XLAT(IIU,IJU))
-- 
GitLab


From 1796c1d191556e095364152d2a55aa85e6d10e92 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 22 Sep 2022 10:43:45 +0200
Subject: [PATCH 104/157] Philippe 22/09/2022: add XXHAT_ll, XYHAT_ll, XHATM_ll
 and XYHATM_ll and use them

---
 src/LIB/SURCOUCHE/src/mode_field.f90        |  60 ++++++-
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  36 +++--
 src/MNH/fun.f90                             |  34 +---
 src/MNH/ibm_idealrp.f90                     |  15 +-
 src/MNH/ini_les_cart_maskn.f90              |  25 +--
 src/MNH/ini_lesn.f90                        |  24 +--
 src/MNH/ini_modeln.f90                      |   5 +-
 src/MNH/ini_spectren.f90                    |   1 +
 src/MNH/modd_gridn.f90                      |   7 +-
 src/MNH/modd_shadowsn.f90                   |  19 +--
 src/MNH/prep_ideal_case.f90                 |  12 +-
 src/MNH/read_hgridn.f90                     |   4 +-
 src/MNH/read_ver_grid.f90                   |   4 +-
 src/MNH/set_grid.f90                        | 166 ++++++++++++--------
 src/MNH/set_perturb.f90                     |  21 +--
 src/MNH/spawn_grid2.f90                     |  15 +-
 src/MNH/spawn_model2.f90                    |   1 +
 src/MNH/surf_solar_shadows.f90              |  11 +-
 src/MNH/turb_ver_thermo_flux.f90            |  16 --
 19 files changed, 252 insertions(+), 224 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 71eefd211..4e444469a 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -468,7 +468,7 @@ call Add_field2list( TFIELDDATA( &
   CLONGNAME  = 'XHATM',          &
   CUNITS     = 'm',              &
   CDIR       = 'XX',             &
-  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass point', &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass points', &
   NGRID      = 1,                &
   NTYPE      = TYPEREAL,         &
   NDIMS      = 1,                &
@@ -480,7 +480,7 @@ call Add_field2list( TFIELDDATA( &
   CLONGNAME  = 'YHATM',          &
   CUNITS     = 'm',              &
   CDIR       = 'YY',             &
-  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass point', &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass points', &
   NGRID      = 1,                &
   NTYPE      = TYPEREAL,         &
   NDIMS      = 1,                &
@@ -780,6 +780,58 @@ call Add_field2list( TFIELDDATA( &
   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',              &
+  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', &
@@ -3673,6 +3725,10 @@ 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
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 65ffbdc8e..43a779e3e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1450,7 +1450,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, xxhatm, xyhat, xyhatm, xzhat, xzhatm
+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
@@ -1494,9 +1494,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()
@@ -1511,6 +1511,10 @@ zzhat  => null()
 zxhatm => null()
 zyhatm => null()
 zzhatm => null()
+zxhat_glob  => null()
+zyhat_glob  => null()
+zxhatm_glob => null()
+zyhatm_glob => null()
 
 gchangemodel = .false.
 
@@ -1538,6 +1542,14 @@ if ( tpfile%nmodel > 0 ) then
   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
 
@@ -1553,6 +1565,10 @@ else
   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
 
@@ -1581,14 +1597,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', &
@@ -1602,7 +1610,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
@@ -1867,13 +1874,14 @@ if ( tpfile%lmaster ) then
 
 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
@@ -1917,7 +1925,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 )
diff --git a/src/MNH/fun.f90 b/src/MNH/fun.f90
index 64c54caa6..85100a77b 100644
--- a/src/MNH/fun.f90
+++ b/src/MNH/fun.f90
@@ -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(                   &
-     (( XYHATM(JJ)-ZYHAT_ll(IJ0))/ZWIDTHY) **2 &
+     (( 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((XYHATM(JJ)-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,14 +297,12 @@ 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(                  &
-     (( XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTHX)**2 &
+     (( XXHATM(JI)-XXHAT_ll(II0))/ZWIDTHX)**2 &
     +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 )
   END DO
 END DO
@@ -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((XXHATM(JI)-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/ibm_idealrp.f90 b/src/MNH/ibm_idealrp.f90
index a67bb5fd2..3c2a0c77d 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/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90
index a3e9c7840..822d41581 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 84f90dba5..0b565244c 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_modeln.f90 b/src/MNH/ini_modeln.f90
index 9a4aed5cd..258172aeb 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1859,6 +1859,7 @@ 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,                                        &
@@ -2263,15 +2264,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
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 29b2679f0..b6e605ecc 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -689,6 +689,7 @@ 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,                                        &
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 1f0c5d895..c5fcc566b 100644
--- a/src/MNH/modd_gridn.f90
+++ b/src/MNH/modd_gridn.f90
@@ -36,7 +36,8 @@
 !  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 and XHATM_BOUND
+!  P. Wautelet    09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND, XHATM_BOUND,
+!                          XXHAT_ll, XYHAT_ll, XXHATM_ll and XYHATM_ll
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -88,5 +89,9 @@ REAL,                  POINTER  :: XLEN2=>NULL()             ! Decay scale for s
 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_shadowsn.f90 b/src/MNH/modd_shadowsn.f90
index b2ca81707..ebb1372e4 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/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index b4faa5ac1..d16492d7a 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -379,7 +379,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_HORGRID_BOUNDS
+USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
 !
 USE MODI_DEFAULT_DESFM_n    ! Interface modules
 USE MODI_DEFAULT_EXPRE
@@ -552,7 +552,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, &
@@ -1286,7 +1285,7 @@ ELSE
   CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
+  CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
 
 END IF
 !
@@ -1455,12 +1454,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
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index cfccf88ba..1ac466b48 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -93,7 +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_HORGRID_BOUNDS
+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
@@ -259,7 +259,7 @@ IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
 CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
 ! Collect global domain boundaries
-CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
+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
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index a00d7a30a..44665594e 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -111,7 +111,7 @@ USE MODD_PARAMETERS
 !
 USE MODE_MSG
 USE MODE_POS
-USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_VERGRID_BOUNDS
+USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_GLOB_VERGRID
 !
 USE MODI_DEFAULT_SLEVE
 !
@@ -332,7 +332,7 @@ XZTOP = XZHAT(IKU)
 CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
+CALL STORE_GLOB_VERGRID( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
 
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index e2d28d064..4ecfdf897 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -19,7 +19,7 @@ PUBLIC :: SET_GRID
 
 PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
 
-PUBLIC :: STORE_GRID_BOUNDS, STORE_HORGRID_BOUNDS, STORE_VERGRID_BOUNDS
+PUBLIC :: STORE_GLOB_GRID, STORE_GLOB_HORGRID, STORE_GLOB_VERGRID
 
 CONTAINS
 
@@ -29,6 +29,7 @@ CONTAINS
                            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,                       &
@@ -207,6 +208,10 @@ 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
@@ -353,7 +358,8 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+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)
@@ -517,7 +523,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
+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
@@ -531,19 +537,17 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
   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
-  REAL, DIMENSION(:), POINTER :: ZHAT_GLOB
-  REAL, DIMENSION(:), POINTER :: ZHATM_GLOB
+  LOGICAL                     :: GALLOC, GALLOCM !Remark: do not deallocate (PHAT_ll/PHATM_ll may be used outside this subroutine)
 
   GALLOC  = .FALSE.
   GALLOCM = .FALSE.
 
-  ZHAT_GLOB  => NULL()
-  ZHATM_GLOB => NULL()
 
   IF ( .NOT. ASSOCIATED( PHAT_BOUND ) ) THEN
     ALLOCATE( PHAT_BOUND(NHAT_BOUND_SIZE) )
@@ -557,93 +561,112 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   SELECT CASE (HDIR)
     CASE ( 'X' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'XX', GALLOC  )
-      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM )
-      CALL GATHERALL_FIELD_ll( 'XX', PHAT,  ZHAT_GLOB,  IERR )
-      CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR )
+      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) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      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) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 )
-      PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
+      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' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'YY', GALLOC  )
-      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM )
-      CALL GATHERALL_FIELD_ll( 'YY', PHAT,  ZHAT_GLOB,  IERR )
-      CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR )
+      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) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      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) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 )
-      PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
+      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' )
-      ZHAT_GLOB  => PHAT
-      ZHATM_GLOB => PHATM
+      PHAT_ll  => PHAT
+      PHATM_ll => PHATM
 
       ! Global boundaries on w points
-      PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 )
-      PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      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) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 )
-      PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT )
+      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_BOUNDS', 'invalid direction (valid: X, Y or Z)' )
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR', 'invalid direction (valid: X, Y or Z)' )
 
   END SELECT
 
-  IF ( GALLOC  ) DEALLOCATE( ZHAT_GLOB  )
-  IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB )
-
-END SUBROUTINE STORE_GRID_1DIR_BOUNDS
+END SUBROUTINE STORE_GRID_1DIR
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+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(:),          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
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll
+  REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll
 
-END SUBROUTINE STORE_GRID_BOUNDS
+  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_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM,                                     &
+                                 PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
@@ -651,18 +674,22 @@ SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM
   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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
+  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_HORGRID_BOUNDS
+END SUBROUTINE STORE_GLOB_HORGRID
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
@@ -671,9 +698,18 @@ SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
   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_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  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_VERGRID_BOUNDS
+END SUBROUTINE STORE_GLOB_VERGRID
 !-----------------------------------------------------------------
 
 
diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90
index 7e9e43687..7c4ea5e2e 100644
--- a/src/MNH/set_perturb.f90
+++ b/src/MNH/set_perturb.f90
@@ -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,8 +262,8 @@ 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
@@ -339,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
 !
@@ -348,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
 !
@@ -558,8 +551,6 @@ SELECT CASE(CPERT_KIND)
 !
 END SELECT
 !
-DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
-!
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE SET_PERTURB 
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 332519faa..8521be04d 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -11,6 +11,7 @@ INTERFACE
 !
      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,                                &
@@ -30,6 +31,10 @@ 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)
@@ -54,6 +59,7 @@ END MODULE MODI_SPAWN_GRID2
 !    ######################################################################################
      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,                                &
@@ -171,7 +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_GRID_BOUNDS
+USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_GRID
 USE MODE_TIME
 USE MODE_GRIDPROJ
 !
@@ -196,6 +202,10 @@ 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)
@@ -464,7 +474,8 @@ PLEN2    = XLEN21
   CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  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)
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index fe3baed67..85a2ed746 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -1061,6 +1061,7 @@ ENDIF
 XZS=0.
 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                   )
diff --git a/src/MNH/surf_solar_shadows.f90 b/src/MNH/surf_solar_shadows.f90
index 0a3eaabb7..7d13e34b0 100644
--- a/src/MNH/surf_solar_shadows.f90
+++ b/src/MNH/surf_solar_shadows.f90
@@ -76,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
 !
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index 596d78c00..0febd151f 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -372,7 +372,6 @@ USE MODE_PRANDTL
 !
 USE MODI_SECOND_MNH
 USE MODE_ll
-USE MODE_GATHER_ll
 !
 IMPLICIT NONE
 !
@@ -494,12 +493,6 @@ INTEGER                    :: IIB,IJB       ! Lower bounds of the physical
 INTEGER                    :: IIE,IJE       ! Upper bounds of the physical
                                             ! sub-domain in x and y directions
 !
-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)
-!
-!
 CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
 CHARACTER (LEN=LEN_HREC)  :: YRECFM       ! Name of the desired field in LFIFM file
 !
@@ -535,12 +528,6 @@ IJU=SIZE(PTHLM,2)
 ! 
 IF (LOCEAN .AND. LDEEPOC) THEN
   !*       COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
-  ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT))
-  !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 )
-  !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc
-  !                                     L0_subproc as referenced in the full domain 1
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
   CALL GET_DIM_EXT_ll('B',IIU,IJU)
   CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
   DO JJ = IJB,IJE
@@ -1103,9 +1090,6 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN
   END IF
 !
 END IF !end of <w Rc>
-IF (LOCEAN.AND.LDEEPOC) THEN
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
-END IF
 !
 !----------------------------------------------------------------------------
 END SUBROUTINE TURB_VER_THERMO_FLUX
-- 
GitLab


From 3fd56d32389b2329e53e0f31176763afddf6c7b0 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 29 Sep 2022 09:56:32 +0200
Subject: [PATCH 105/157] Philippe 29/09/2022: bugfix: NBALLOONS->NAIRCRAFTS
 for AIRCRAFTS_NML_ALLOCATE

---
 src/MNH/read_exsegn.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index ca2f7047a..c469bd5d4 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -855,7 +855,7 @@ IF (KMI == 1) THEN
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS)
 
   IF ( NAIRCRAFTS > 0 ) THEN
-    CALL AIRCRAFTS_NML_ALLOCATE( NBALLOONS )
+    CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS )
     CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
   END IF
-- 
GitLab


From bf07e64ff8749606964af4fff013f9debbbf8b70 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 29 Sep 2022 10:33:24 +0200
Subject: [PATCH 106/157] Philippe 29/09/2022: bugfix: XTKE_DISS was not
 communicated

---
 src/MNH/aircraft_balloon_evol.f90 | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index e6cfc21ba..6a81850ba 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -1459,6 +1459,7 @@ IF ( GSTORE ) THEN
   END DO
   IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (IN))
   IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN))
+  IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(IN))
   CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (IN))
   CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN))
   CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN))
-- 
GitLab


From f9be1aa728d98a385614ddeb5f9e40658430158d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 30 Sep 2022 09:08:11 +0200
Subject: [PATCH 107/157] Philippe 30/09/2022: bugfix: missing communications
 for SWDIFF, SWDIR and LEI

---
 src/MNH/ground_paramn.f90 | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 863574d33..62c2a57f2 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -112,6 +112,7 @@ END MODULE MODI_GROUND_PARAM_n
 !!     (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
+!  P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -774,11 +775,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'   )
-- 
GitLab


From a62e405f1aa0d860af3073533db247bf90e87d02 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 30 Sep 2022 09:45:59 +0200
Subject: [PATCH 108/157] Philippe 30/09/2022: bugfix: use XUNDEF from SURFEX
 for surface variables computed by SURFEX

---
 src/MNH/ground_paramn.f90   | 40 ++++++++++++++++---------------
 src/MNH/ini_diag_in_run.f90 | 48 +++++++++++++++++--------------------
 src/MNH/statprof_tools.f90  | 45 ++++++++++++++++++----------------
 3 files changed, 67 insertions(+), 66 deletions(-)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 62c2a57f2..44ab4453a 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -113,6 +113,7 @@ END MODULE MODI_GROUND_PARAM_n
 !  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
 !  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
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -130,7 +131,7 @@ USE MODD_DYN_n,     ONLY : DYN_MODEL
 !
 USE MODD_LUNIT_n, ONLY: TLUOUT
 USE MODD_CST,        ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO
-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_FIELD_n,    ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS
@@ -162,6 +163,7 @@ 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 MODI_ROTATE_WIND
@@ -366,16 +368,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
 !
 !
 !-------------------------------------------------------------------------------
@@ -660,7 +662,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
@@ -943,12 +945,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)
@@ -979,7 +981,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/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90
index d44800cdc..6f39e805a 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/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index 4a0ac4239..a1daff569 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -8,6 +8,7 @@
 !  P. Wautelet 08/04/2022
 !-----------------------------------------------------------------
 ! Modifications:
+!  P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX
 !-----------------------------------------------------------------
 !      ###################
 MODULE MODE_STATPROF_TOOLS
@@ -41,6 +42,7 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE )
   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
 
@@ -133,16 +135,16 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE )
   TPPROFILER%XZHD(:) = XUNDEF
 
 !   IF ( LDIAG_IN_RUN ) THEN
-    TPPROFILER%XT2M   (:) = XUNDEF
-    TPPROFILER%XQ2M   (:) = XUNDEF
-    TPPROFILER%XHU2M  (:) = XUNDEF
-    TPPROFILER%XZON10M(:) = XUNDEF
-    TPPROFILER%XMER10M(:) = XUNDEF
-    TPPROFILER%XRN    (:) = XUNDEF
-    TPPROFILER%XH     (:) = XUNDEF
-    TPPROFILER%XLE    (:) = XUNDEF
-    TPPROFILER%XLEI   (:) = XUNDEF
-    TPPROFILER%XGFLUX (:) = XUNDEF
+    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
@@ -163,6 +165,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE )
   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
 
@@ -219,16 +222,16 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE )
   TPSTATION%XSV(:,:)   = XUNDEF
   TPSTATION%XTSRAD(:)  = XUNDEF
   IF ( LDIAG_SURFRAD ) THEN
-    TPSTATION%XT2M(:)    = XUNDEF
-    TPSTATION%XQ2M(:)    = XUNDEF
-    TPSTATION%XHU2M(:)   = XUNDEF
-    TPSTATION%XZON10M(:) = XUNDEF
-    TPSTATION%XMER10M(:) = XUNDEF
-    TPSTATION%XRN(:)     = XUNDEF
-    TPSTATION%XH(:)      = XUNDEF
-    TPSTATION%XLE(:)     = XUNDEF
-    TPSTATION%XLEI(:)    = XUNDEF
-    TPSTATION%XGFLUX(:)  = XUNDEF
+    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
@@ -238,7 +241,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE )
       TPSTATION%XSWDIFF(:) = XUNDEF
       TPSTATION%XDSTAOD(:) = XUNDEF
     END IF
-    TPSTATION%XSFCO2(:)  = XUNDEF
+    TPSTATION%XSFCO2(:)  = XUNDEF_SFX
   END IF
 
 END SUBROUTINE STATION_ALLOCATE
-- 
GitLab


From ec5e940e79a9fc85966a99a665a4d46a41ce5883 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 30 Sep 2022 13:52:23 +0200
Subject: [PATCH 109/157] Philippe 30/09/2022: bugfix: write XCURRENT_LWU in
 LWU field (and not XCURRENT_LWD)

---
 src/MNH/write_lfifm1_for_diag_supp.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index fe258339c..1412e986d 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -963,7 +963,7 @@ IF (CSURF=='EXTE') THEN
       NTYPE      = TYPEREAL,                            &
       NDIMS      = 2,                                   &
       LTIMEDEP   = .TRUE.                               )
-    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD)
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU)
   END IF
 END IF
 
-- 
GitLab


From 1d3bf289886b30794f70a78d04d14b735fc73496 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 6 Oct 2022 09:21:23 +0200
Subject: [PATCH 110/157] Philippe 06/10/2022: small fixes for ForeFire

---
 src/LIB/FOREFIRE/coupling_forefiren.f90 | 49 +++++++++++++------------
 src/MNH/ini_one_wayn.f90                |  6 ++-
 src/MNH/one_wayn.f90                    |  6 ++-
 3 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/src/LIB/FOREFIRE/coupling_forefiren.f90 b/src/LIB/FOREFIRE/coupling_forefiren.f90
index 8d5dde80b..0791f7f1c 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/MNH/ini_one_wayn.f90 b/src/MNH/ini_one_wayn.f90
index 78e025b2a..c18ff402a 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/one_wayn.f90 b/src/MNH/one_wayn.f90
index eac7238d6..aa78ac781 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
-- 
GitLab


From 1781167e4d5dfb7601bafd18c1831eb204a393de Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 21 Oct 2022 16:01:35 +0200
Subject: [PATCH 111/157] Philippe 21/10/2022: init XTSRAD to XUNDEF from
 SURFEX

---
 src/MNH/ini_aircraft_balloon.f90 | 3 ++-
 src/MNH/ini_modeln.f90           | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 6191e60d5..7509894df 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -177,6 +177,7 @@ CONTAINS
 !----------------------------------------------------------------------------
 SUBROUTINE ALLOCATE_FLYER(TPFLYER)
 !
+USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF
 !
 CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER
 !
@@ -262,7 +263,7 @@ TPFLYER%XCRARE_ATT = XUNDEF
 TPFLYER%XWZ        = XUNDEF
 TPFLYER%XZZ        = XUNDEF
 TPFLYER%XTKE       = XUNDEF
-TPFLYER%XTSRAD     = XUNDEF
+TPFLYER%XTSRAD     = XUNDEF_SFX
 TPFLYER%XZS        = XUNDEF
 TPFLYER%XTKE_DISS  = XUNDEF
 !
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 258172aeb..81161434a 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -394,6 +394,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
@@ -1494,7 +1495,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))
-- 
GitLab


From c71972c237c6fff23c1be8c91ef4ddd279411605 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 21 Oct 2022 16:14:57 +0200
Subject: [PATCH 112/157] Philippe 21/10/2022: bugfix: ground_param_n:
 communicate halo values between processes for OUT variables

---
 src/MNH/ground_paramn.f90 | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 44ab4453a..986441cfd 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -114,6 +114,7 @@ END MODULE MODI_GROUND_PARAM_n
 !  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
@@ -352,6 +353,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
 !                                                        
@@ -745,6 +747,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 )' ) JSV
+  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 )' ) JSV
+  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
 !   -----------
-- 
GitLab


From 63c8001087ace0d7c32f4bf64f398ac51262b0d2 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 27 Oct 2022 09:54:53 +0200
Subject: [PATCH 113/157] Philippe 27/10/2022: datetime: add + operator via
 DATETIME_TIME_ADD subroutine

---
 src/MNH/mode_datetime.f90 | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index fc9f68267..2d999f564 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-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,6 +7,7 @@
 !  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 + operator via DATETIME_TIME_ADD subroutine
 !-----------------------------------------------------------------
 MODULE MODE_DATETIME
 !
@@ -21,6 +22,7 @@ PRIVATE
 PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
 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.)
@@ -34,6 +36,10 @@ INTERFACE OPERATOR(>=)
   MODULE PROCEDURE DATETIME_GE
 END INTERFACE
 !
+INTERFACE OPERATOR(+)
+  MODULE PROCEDURE DATETIME_TIME_ADD
+END INTERFACE
+!
 CONTAINS
 !
 SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC )
@@ -140,7 +146,7 @@ PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (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 +238,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
@@ -256,7 +262,7 @@ END SELECT
 END SUBROUTINE DATETIME_GETMONTHLGT
 !
 !
-FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
+ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
 IMPLICIT NONE
 LOGICAL :: OLT
 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
@@ -281,7 +287,7 @@ ENDIF
 END FUNCTION DATETIME_LT
 !
 !
-FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT)
+ELEMENTAL FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT)
 IMPLICIT NONE
 LOGICAL :: OLT
 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
@@ -291,5 +297,21 @@ TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
 OLT = .NOT.DATETIME_LT(TPT1,TPT2)
 !
 END FUNCTION DATETIME_GE
-!
+
+
+ELEMENTAL 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
+
 END MODULE MODE_DATETIME
-- 
GitLab


From ce2bd9405410894bb33870d1976bfbc746ff7cc6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 27 Oct 2022 10:56:19 +0200
Subject: [PATCH 114/157] Philippe 27/10/2022: datetime: add <= and > operators
 and improve older comparison subroutines (more robust but slower)

---
 src/MNH/mode_datetime.f90 | 117 +++++++++++++++++++++++++++++++++-----
 1 file changed, 104 insertions(+), 13 deletions(-)

diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index 2d999f564..2ccc4700b 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -7,7 +7,7 @@
 !  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 + operator via DATETIME_TIME_ADD subroutine
+!  P. Wautelet 27/10/2022: add +, <= and > operators and improve older comparison subroutines (more robust but slower)
 !-----------------------------------------------------------------
 MODULE MODE_DATETIME
 !
@@ -21,6 +21,8 @@ PRIVATE
 !
 PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
 PUBLIC :: OPERATOR(<)
+PUBLIC :: OPERATOR(<=)
+PUBLIC :: OPERATOR(>)
 PUBLIC :: OPERATOR(>=)
 PUBLIC :: OPERATOR(+)
 !
@@ -32,6 +34,14 @@ 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
@@ -260,16 +270,23 @@ SELECT CASE(KMONTH)
 END SELECT
 !
 END SUBROUTINE DATETIME_GETMONTHLGT
+
+
+FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
 !
+! TRUE if TPT1 .LT. TPT2
 !
-ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
 IMPLICIT NONE
-LOGICAL :: OLT
+
 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
-!
-! TRUE if TPT1 .LT. 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
@@ -283,23 +300,97 @@ 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
 !
-ELEMENTAL 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
 
 
-ELEMENTAL FUNCTION DATETIME_TIME_ADD( TPIN, PTIME ) RESULT ( TPOUT )
+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
 
-- 
GitLab


From d903a9da22e670e13e45c3dee116d69c79e60d94 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 27 Oct 2022 17:03:02 +0200
Subject: [PATCH 115/157] Philippe 27/10/2022: datetime: add - operator via
 DATETIME_TIME_SUBSTRACT subroutine

---
 src/MNH/mode_datetime.f90 | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index 2ccc4700b..07e9c816b 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -7,7 +7,7 @@
 !  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 27/10/2022: add +, -, <= and > operators and improve older comparison subroutines (more robust but slower)
 !-----------------------------------------------------------------
 MODULE MODE_DATETIME
 !
@@ -25,6 +25,7 @@ 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.)
@@ -50,6 +51,10 @@ 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 )
@@ -405,4 +410,20 @@ 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
-- 
GitLab


From d6efb9ad5424e954ae7439431de349733b8988a8 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 28 Oct 2022 15:40:10 +0200
Subject: [PATCH 116/157] Philippe 28/10/2022: small bugfix: use correct index
 for YJSV

---
 src/MNH/ground_paramn.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 986441cfd..1be86f91f 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -761,12 +761,12 @@ NULLIFY(TZFIELDSURF_ll)
 ! 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 )' ) JSV
+  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 )' ) JSV
+  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'  )
-- 
GitLab


From 77c16c01768f2624c578effb5d2340d3b7b53864 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 16 Nov 2022 11:43:55 +0100
Subject: [PATCH 117/157] Philippe 16/11/2022: profilers: rename VISI ->
 VISIGUL + compute visibilities only when it has a meaning (there were NaN if
 not...)

---
 src/MNH/modd_type_statprof.f90 |  2 +-
 src/MNH/profilern.f90          | 27 +++++++++++++++------------
 src/MNH/statprof_tools.f90     | 16 ++++++++++++----
 src/MNH/write_profilern.f90    | 26 +++++++++++++++++++-------
 4 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90
index a95c1e11c..8b8a7cffb 100644
--- a/src/MNH/modd_type_statprof.f90
+++ b/src/MNH/modd_type_statprof.f90
@@ -134,7 +134,7 @@ TYPE, EXTENDS( TSTATPROFDATA ) ::  TPROFILERDATA
   REAL, DIMENSION(:,:),   ALLOCATABLE :: XTKE       ! tke(n)
   REAL, DIMENSION(:,:),   ALLOCATABLE :: XTH        ! th(n)
   REAL, DIMENSION(:,:),   ALLOCATABLE :: XTHV       ! thv(n)
-  REAL, DIMENSION(:,:),   ALLOCATABLE :: XVISI      ! VISI(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)
diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90
index 7226a452d..924527d0b 100644
--- a/src/MNH/profilern.f90
+++ b/src/MNH/profilern.f90
@@ -91,7 +91,7 @@ END MODULE MODI_PROFILER_n
 USE MODD_CST,              ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
-USE MODD_NSV,              ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR
+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_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, &
@@ -199,7 +199,7 @@ REAL                       :: ZZWDR         ! ZWD correction at station location
 !
 REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2))              :: ZZTD,ZZHD,ZZWD
 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))  :: ZVISI,ZVISIKUN
+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
 !
@@ -262,19 +262,22 @@ 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
 !
 PROFILER: DO JP = 1, NUMBPROFILER_LOC
   ZZ(:)                  = STATPROF_INTERP_3D( TPROFILERS(JP), PZ )
@@ -369,8 +372,8 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC
   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 )
-  TPROFILERS(JP)%XVISI(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISI )
-  TPROFILERS(JP)%XVISIKUN(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIKUN )
+  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' ) &
diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index a1daff569..af3bc1eb8 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -66,8 +66,16 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE )
   END IF
   ALLOCATE( TPPROFILER%XTH       (KSTORE, IKU) )
   ALLOCATE( TPPROFILER%XTHV      (KSTORE, IKU) )
-  ALLOCATE( TPPROFILER%XVISI     (KSTORE, IKU) )
-  ALLOCATE( TPPROFILER%XVISIKUN  (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
@@ -117,8 +125,8 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE )
   IF ( CTURB == 'TKEL' ) TPPROFILER%XTKE(:,:) = XUNDEF
   TPPROFILER%XTH       (:,:) = XUNDEF
   TPPROFILER%XTHV      (:,:) = XUNDEF
-  TPPROFILER%XVISI     (:,:) = XUNDEF
-  TPPROFILER%XVISIKUN  (:,:) = 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
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index acda0bf50..62264efab 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -140,7 +140,9 @@ CALL PROFILER_ALLOCATE( TZPROFILER, SIZE( tprofilers_time%tpdates ) )
 IF ( ISNPROC > 1 ) THEN
   ISTORE = SIZE( TPROFILERS_TIME%TPDATES )
   IPACKSIZE = 6
-  IPACKSIZE = IPACKSIZE + ISTORE * IKU * ( 16 + NRR + NSV + NAER )
+  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
@@ -186,8 +188,12 @@ PROFILER: DO JS = 1, INUMPROF
       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
-      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISI(:,:),      [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU
-      ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:),   [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
@@ -264,8 +270,12 @@ PROFILER: DO JS = 1, INUMPROF
       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
-      TZPROFILER%XVISI(:,:)      = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU
-      TZPROFILER%XVISIKUN(:,:)   = 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
@@ -393,8 +403,10 @@ jproc = 0
 
 call Add_profile( 'Th',       'Potential temperature',         'K',      tpprofiler%xth        )
 call Add_profile( 'Thv',      'Virtual Potential temperature', 'K',      tpprofiler%xthv       )
-call Add_profile( 'VISI',     'Visibility',                    'km',     tpprofiler%xvisi      )
-call Add_profile( 'VISIKUN',  'Visibility Kunkel',             'km',     tpprofiler%xvisikun   )
+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         )
-- 
GitLab


From 66bc293eb7b4ee6273dea21b1f38ff3bd32b0a76 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 18 Nov 2022 14:20:45 +0100
Subject: [PATCH 118/157] Philippe 18/11/2022: TPREFERENCE_DATE is now public

---
 src/MNH/mode_datetime.f90 | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index 07e9c816b..5c73ea3ca 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -20,6 +20,7 @@ IMPLICIT NONE
 PRIVATE
 !
 PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
+PUBLIC :: TPREFERENCE_DATE
 PUBLIC :: OPERATOR(<)
 PUBLIC :: OPERATOR(<=)
 PUBLIC :: OPERATOR(>)
-- 
GitLab


From 6998685ff6b542858656a7e139e68ce316ee2f41 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 25 Nov 2022 09:08:12 +0100
Subject: [PATCH 119/157] Philippe 25/11/2022: rewrite STATPROF_INSTANT
 algorithm (does not depends on model timestep anymore => independent of
 model)

---
 src/MNH/statprof_tools.f90 | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90
index af3bc1eb8..0d1de4a16 100644
--- a/src/MNH/statprof_tools.f90
+++ b/src/MNH/statprof_tools.f90
@@ -9,6 +9,7 @@
 !-----------------------------------------------------------------
 ! 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
@@ -729,10 +730,9 @@ END FUNCTION STATPROF_INTERP_3D_V
 ! #################################################
 SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN )
 ! #################################################
-  USE MODD_DYN_n,      ONLY: XTSTEP
-  USE MODD_PARAMETERS, ONLY: XUNDEF
   USE MODD_TIME_n,     ONLY: TDTCUR
 
+  USE MODE_DATETIME
   USE MODE_MSG
 
   IMPLICIT NONE
@@ -740,24 +740,26 @@ SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN )
   TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME
   INTEGER,             INTENT(OUT)   :: KIN ! Current step of storage
 
-  IF ( TPSTATPROF_TIME%XTIME_CUR == XUNDEF ) TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTSTEP - XTSTEP
-
-  TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR + XTSTEP
-
-  IF ( TPSTATPROF_TIME%XTIME_CUR >= TPSTATPROF_TIME%XTSTEP - 1.E-10 ) THEN
-    TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR - TPSTATPROF_TIME%XTSTEP
-    TPSTATPROF_TIME%N_CUR = TPSTATPROF_TIME%N_CUR + 1
-    KIN = TPSTATPROF_TIME%N_CUR
+  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
+      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
-      TPSTATPROF_TIME%TPDATES(KIN) = TDTCUR
+      ! Return an invalid step number
+      KIN = -1
     END IF
-  ELSE
-    ! Return an invalid step number
-    KIN = -1
   END IF
 
 END SUBROUTINE STATPROF_INSTANT
-- 
GitLab


From 1b9d5f05dfa9b1dd11e52e7dbe0d6e7cc2d03efe Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 25 Nov 2022 09:21:14 +0100
Subject: [PATCH 120/157] Philippe 25/11/2022: remove XTIME_CUR (in
 TSTATPROFTIME derived type)

---
 src/MNH/modd_type_statprof.f90 | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90
index 8b8a7cffb..24d4d7e19 100644
--- a/src/MNH/modd_type_statprof.f90
+++ b/src/MNH/modd_type_statprof.f90
@@ -47,7 +47,6 @@ public :: TSTATPROFTIME
 public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA
 
 TYPE :: TSTATPROFTIME
-  REAL                                       :: XTIME_CUR = XUNDEF  ! current time since last storage
   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)
-- 
GitLab


From 4dfb0f703247a6056941934f600aa3db5752362e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 25 Nov 2022 13:39:01 +0100
Subject: [PATCH 121/157] Philippe 25/11/2022: add tools fo find rank and model
 number corresponding to a given position

---
 src/MNH/position_tools.f90 | 230 +++++++++++++++++++++++++++++++++++++
 1 file changed, 230 insertions(+)
 create mode 100644 src/MNH/position_tools.f90

diff --git a/src/MNH/position_tools.f90 b/src/MNH/position_tools.f90
new file mode 100644
index 000000000..2fb03e7d5
--- /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
-- 
GitLab


From 5d826f73ef7ea07aab50bb9c02ca667a06117165 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 25 Nov 2022 15:11:32 +0100
Subject: [PATCH 122/157] Philippe 25/11/2022: rewrite of aircraft_balloon_evol
 First version: some cleaning, deduplication and optimisation not yet done

---
 src/MNH/aircraft_balloon.f90      |   38 +-
 src/MNH/aircraft_balloon_evol.f90 | 2816 +++++++++++++++++------------
 src/MNH/diag.f90                  |   20 +-
 src/MNH/ini_aircraft.f90          |   44 +-
 src/MNH/ini_aircraft_balloon.f90  |  121 +-
 src/MNH/ini_balloon.f90           |    6 +-
 src/MNH/modd_aircraft_balloon.f90 |   44 +-
 src/MNH/modeln.f90                |   14 +-
 8 files changed, 1807 insertions(+), 1296 deletions(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 02b18e25d..a43f04c53 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -9,15 +9,12 @@ MODULE MODI_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)
+      SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, 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
@@ -31,11 +28,9 @@ 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
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
@@ -52,13 +47,12 @@ 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)
-!     ###################################################################
+!     #################################################################
+      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
@@ -101,8 +95,8 @@ END MODULE MODI_AIRCRAFT_BALLOON
 USE MODD_AIRCRAFT_BALLOON
 !
 USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
-USE MODI_AIRCRAFT_BALLOON_EVOL
 !
+USE MODE_AIRCRAFT_BALLOON_EVOL,      ONLY: AIRCRAFT_BALLOON_EVOL
 USE MODE_ll
 !
 !
@@ -113,8 +107,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
@@ -130,7 +122,7 @@ 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
 !
 !-------------------------------------------------------------------------------
 !
@@ -146,13 +138,13 @@ IF(.NOT. ALLOCATED(XSVW_FLUX)) &
 ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
 !
 DO JI = 1, NBALLOONS
-  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,          &
+  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
                               TBALLOONS(JI), PSEA                                      )
 END DO
 !
 DO JI = 1, NAIRCRAFTS
-  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR,          &
+  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
                               TAIRCRAFTS(JI), PSEA                                     )
 END DO
diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 6a81850ba..5b52ea22f 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -4,59 +4,27 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ##########################
-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
-!
-CLASS(TFLYERDATA),        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
+
+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     )
 !     ########################################################
 !
 !
-!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores 
+!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores
 !!                                balloons/aircrafts in the model
 !!
 !!    PURPOSE
@@ -65,7 +33,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 +54,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
 !!    --------
@@ -115,7 +83,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !!     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 
+!!     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
@@ -129,7 +97,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL
 !                                    -do not use PMAP if cartesian domain
 !  P. Wautelet    06/2022: reorganize flyers
 !! --------------------------------------------------------------------------
-!       
+!
 !*      0. DECLARATIONS
 !          ------------
 !
@@ -138,7 +106,8 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID
-USE MODD_GRID_n,           ONLY: XXHATM, XYHATM
+USE MODD_GRID_n
+USE MODD_IO,               ONLY: ISP
 USE MODD_LUNIT_n,          ONLY: TLUOUT
 USE MODD_NESTING
 USE MODD_NSV,              ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC
@@ -167,7 +136,7 @@ USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEX
                                  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,             only: TDTSEG
 USE MODD_TIME_n,           only: tdtcur
 USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
 !
@@ -176,7 +145,7 @@ USE MODE_FGAU,             ONLY: GAULAG
 USE MODE_FSCATTER,         ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG
 USE MODE_GRIDPROJ
 USE MODE_ll
-USE MODE_MSG
+USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
 USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INSTANT
 !
 USE MODI_GAMMA,            ONLY: GAMMA
@@ -189,8 +158,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
@@ -208,7 +175,7 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the re
 REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
 !
 CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER! balloon/aircraft
-REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
 !
@@ -218,7 +185,7 @@ 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 :: IIB        ! current process domain sizes
 INTEGER :: IJB
 INTEGER :: IIE
 INTEGER :: IJE
@@ -241,7 +208,7 @@ 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
 !
@@ -249,45 +216,45 @@ 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
+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 :: IDU      ! difference between II_U and II_M
+INTEGER :: IDV      ! difference between IJ_V and IJ_M
+!
+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
+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
 INTEGER :: JLOOP,JLOOP2    ! loop counter
 !
 REAL    :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
@@ -308,7 +275,7 @@ 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,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   ! generic microphysical parameters
 INTEGER                        :: JJ    ! loop counter for quadrature
@@ -324,318 +291,908 @@ 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%CMODEL /= 'FIX' .AND. COUNT( NDAD(:) == IMI ) /= 0       &
-     .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) &
-     .AND. TPFLYER%XX_CUR /= XUNDEF .AND. TPFLYER%XY_CUR /= XUNDEF    &
-     .AND. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH                    &
-     .AND. CPROGRAM == 'MESONH'                                       ) THEN
-  CALL FLYER_CHANGE_MODEL( IMI )
-ENDIF
-!
-IF ( TPFLYER%NMODEL /= IMI ) RETURN
 !
+INTEGER :: IRANK
+INTEGER :: IMODEL
+INTEGER :: IMODEL_OLD
+REAL    :: ZX_OLD, ZY_OLD
+REAL    :: ZDELTATIME
+REAL    :: ZTSTEP
+REAL    :: ZDIVTMP
+
 !----------------------------------------------------------------------------
-!
-!*      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)
-!
-!----------------------------------------------------------------------------
-!
-!*      2.3  Compute time until launch by comparison of dates and times
-!            ----------------------------------------------------------
-!
-CALL DATETIME_DISTANCE( TPFLYER%TLAUNCH, TDTCUR, ZTDIST )
-!
-!*      3.   LAUNCH
-!            ------
-!
-GLAUNCH     = .FALSE.
-!
-!
-IF ( .NOT. TPFLYER%LFLY ) THEN
-!
-!*      3.2  launch/takeoff is effective
-!            ---------------------------
-!
-  IF (ZTDIST >= - PTSTEP ) THEN
-    SELECT TYPE ( TPFLYER )
-      CLASS IS ( TAIRCRAFTDATA)
-!
-!*     3.2.1 Determination of flight segment
-!            -------------------------------
-!
-        TPFLYER%NSEGCURN = 1
-        IL = TPFLYER%NSEGCURN
-        !
-        TPFLYER%XSEGCURT = ZTDIST
-        !
-        DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG)
-          TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
-          IL = TPFLYER%NSEGCURN
-          TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
-          IF (IL>TPFLYER%NSEG) EXIT
+
+CALL GET_MODEL_NUMBER_ll(IMI)
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+
+    !Do the positioning only if model 1 (data will be available to others after)
+    MODEL1: IF ( IMI == 1 ) THEN
+      !Do we have to store aircraft data?
+      CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE )
+      IF ( ISTORE < 1 ) THEN
+        !No profiler storage at this time step
+        TPFLYER%LSTORE = .FALSE.
+        RETURN
+      ELSE
+        TPFLYER%LSTORE = .TRUE.
+      END IF
+
+      ! Is the aircraft in flight ?
+      IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
+        TPFLYER%LFLY = .TRUE.
+
+        ! Find the flight segment
+        ZTDIST = TDTCUR - TPFLYER%TLAUNCH
+        IL = TPFLYER%NPOSCUR
+        DO WHILE ( ZTDIST > TPFLYER%XPOSTIME(IL+1) )
+          IL = IL + 1
+          IF ( IL > TPFLYER%NPOS-1 ) THEN
+            !Security (should not happen)
+            IL = TPFLYER%NPOS-1
+            EXIT
+          END IF
         END DO
-        !
-        !* end of flight
-        !
-        IF (IL > TPFLYER%NSEG) THEN
-          TPFLYER%LFLY = .FALSE.
+        TPFLYER%NPOSCUR = IL
+
+        ! Compute the current position
+        ZSEG_FRAC = ( ZTDIST - TPFLYER%XPOSTIME(IL) ) / ( TPFLYER%XPOSTIME(IL+1) - TPFLYER%XPOSTIME(IL) )
+
+        TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSX(IL  ) &
+                       +     ZSEG_FRAC  * TPFLYER%XPOSX(IL+1)
+        TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSY(IL  ) &
+                       +     ZSEG_FRAC  * TPFLYER%XPOSY(IL+1)
+        IF (TPFLYER%LALTDEF) THEN
+          TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSP(IL  ) &
+                         +     ZSEG_FRAC  * TPFLYER%XPOSP(IL+1)
         ELSE
-          TPFLYER%LFLY   = .TRUE.
-          GLAUNCH        = .TRUE.
-          TPFLYER%LCRASH =.FALSE.
-          IF (ZTDIST <= PTSTEP ) THEN
-            WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-            WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' takes off the   ', &
-                            TDTCUR%nday,'/',TDTCUR%nmonth,'/',              &
-                            TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-            WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-          ENDIF
-        ENDIF
-
-      CLASS IS ( TBALLOONDATA)
-        IF (ZTDIST <= PTSTEP ) THEN
-          TPFLYER%LFLY = .TRUE.
-          GLAUNCH      = .TRUE.
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-          WRITE(ILUOUT,*) 'Balloon  ',TPFLYER%CTITLE,' is launched the ', &
-                          TDTCUR%nday,'/',TDTCUR%nmonth,'/',              &
-                          TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
+          TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSZ(IL ) &
+                         +     ZSEG_FRAC  * TPFLYER%XPOSZ(IL +1 )
         END IF
 
-      CLASS DEFAULT
-        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER', OLOCAL = .TRUE. )
-
-    END SELECT
-!
-!*      3.3  Initial horizontal positions
-!            ----------------------------
-!
-    SELECT TYPE ( TPFLYER )
-      CLASS IS ( TBALLOONDATA)
-        IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
-          TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
-          TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
+        ! Get rank of the process where the aircraft is and the model number
+        IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+          IMODEL = TPFLYER%NMODEL
+        ELSE
+          IMODEL = 0
+        END IF
+        CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
+        IF ( IRANK < 1 ) THEN
+          TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+          TPFLYER%LCRASH = .TRUE.
+          TPFLYER%NCRASH = NCRASH_OUT_HORIZ
+          TPFLYER%LFLY   = .FALSE.
+        ELSE
+          TPFLYER%NMODEL = IMODEL
+          TPFLYER%LCRASH = .FALSE.
+          TPFLYER%NCRASH = NCRASH_NO
+          TPFLYER%NRANK_CUR = IRANK
         END IF
+      ELSE
+        TPFLYER%LFLY = .FALSE.
 
-      CLASS IS ( TAIRCRAFTDATA)
-!
-!
-!*       3.3.2 Determination of initial position
-!              -----------------------------
-!
-        IF (TPFLYER%LFLY) THEN
-          ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(IL)
+      END IF
+    END IF MODEL1
+
+    IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY ) THEN
+      ! 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
+
+          ISOWNER: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+            ZTHIS_PROC = 1.
+            !
+            !*      2.   PRELIMINARIES-2
+            !            -------------
+            !
+            !*      2.1  Indices
+            !            -------
+            !
+            CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+
+            IKB =   1   + JPVEXT
+            IKE = SIZE(PZ,3) - JPVEXT
+            !
+            !
+            !*      2.2  Interpolations of model variables to mass points
+            !            ------------------------------------------------
+            !
+            IIU=SIZE(XXHAT)
+            IJU=SIZE(XYHAT)
+            ! 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 )
+            !
+            !*      4.5  Interpolations of model variables to mass points
+            !            ------------------------------------------------
+            !
+            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)
+            !
+            !----------------------------------------------------------------------------
+            !
+            !*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
+            !            ----------------------------------
+            !
+            !
+            !*      5.1  Density
+            !            -------
+            !
+            ZEXN(:,:,:    ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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)
+            END DO
+            !
+            ! IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN
+            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,:,:)) )
+            !
+            ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
+            ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:)
+            ! END IF
+
+            ! Vertical position
+            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
+
+            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', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+            END IF
+
+            IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
+              TPFLYER%LCRASH = .TRUE.
+              TPFLYER%NCRASH = NCRASH_OUT_HIGH
+            END IF
+            !
+            !*      6.   INITIALIZATIONS FOR INTERPOLATIONS
+            !            ----------------------------------
+            !
+            !*      6.1  Interpolation coefficient for X
+            !            -------------------------------
+            !
+            ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
+            ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
+            !
+            !
+            !*      6.2  Interpolation coefficient for y
+            !            -------------------------------
+            !
+            ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
+            ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
+            !
+            !
+            !*      6.3  Interpolation coefficients for the 4 suroundings verticals
+            !            ----------------------------------------------------------
+            !
+            !       SELECT TYPE ( TPFLYER )
+            !         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
+            !
+            !         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 SELECT
+            !
+            !----------------------------------------------------------------------------
+            !
+            !*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
+            !            ---------------------------------------------
+            !
+            !*      7.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.))
+            !
+            !
+            !*      7.2  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.))
+            !
+            !
+            !*      7.3  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) )
+            !
+            !
+            !*      7.4  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) )
+            !
+            !
+            !*      8.   DATA RECORDING
+            !            --------------
+            !
+            TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
+            TPFLYER%XX   (ISTORE) = TPFLYER%XX_CUR
+            TPFLYER%XY   (ISTORE) = TPFLYER%XY_CUR
+            TPFLYER%XZ   (ISTORE) = TPFLYER%XZ_CUR
+            !
+            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)
+            !
+            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)
+
+            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
+            ! Fin Modifs ON
+            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(:,:,:))
+            ENDIF
+            ! 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
+              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
+                          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
+                          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
+                    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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
+                    ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
+                    TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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
+                TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
+              END DO
+              ! 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
+              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
+
+          ELSE ISOWNER
+
+            ZTHIS_PROC = 0.
+
+          END IF ISOWNER
+
+!----------------------------------------------------------------------------
+          !
+          !*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSES
+          !            -----------------------------------------
+          !
+          !*     11.1  current position
+          !            ----------------
+          !
           !
-          TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL  ) &
-                         +     ZSEG_FRAC  * TPFLYER%XSEGX(IL+1)
-          TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL  ) &
-                         +     ZSEG_FRAC  * TPFLYER%XSEGY(IL+1)
+          !*     11.2  data stored
+          !            -----------
+          !
+          ! IF ( GSTORE ) THEN
+          CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
+          DO JLOOP=1,SIZE(PR,4)
+            CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
+          END DO
+          DO JLOOP=1,SIZE(PSV,4)
+            CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
+          END DO
+          DO JLOOP=1,IKU
+            CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
+            DO JLOOP2=1,SIZE(PR,4)
+              CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
+            ENDDO
+            CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
+            IF (CCLOUD== 'LIMA' ) THEN
+              CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
+              CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
+            ENDIF
+            CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
+          END DO
+          IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
+          IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
+          IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
+          DO JLOOP=1,SIZE(PSV,4)
+            CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
+          END DO
         END IF
-    END SELECT
-  END IF
-END IF
-!
-!*      3.4  instant of storage
-!            ------------------
-!
-CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN )
-IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step
-!
-IF ( TPFLYER%LFLY ) THEN
-!
-!----------------------------------------------------------------------------
-!
-!*      4.   FLYER POSITION
-!            --------------
-!
-!*      4.1  X position
-!            ----------
-!
-  IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR )
-  II=COUNT( XXHATM(:)<=TPFLYER%XX_CUR )
-!
-  IF ( IU < IIB .AND. LWEST_ll() ) THEN
-    IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN
-      TPFLYER%LCRASH = .TRUE.
-    ELSE
-      II = IIB
-      IU = IIB
-    END IF
-  END IF
-  IF ( IU > IIE .AND. LEAST_ll() )  THEN
-    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
-      TPFLYER%LCRASH = .TRUE.
-    ELSE
-      II = IIE
-      IU = IIE
-    END IF
-  END IF
-!
-!
-!*      4.2  Y position
-!            ----------
-!
-  IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR )
-  IJ=COUNT( XYHATM(:)<=TPFLYER%XY_CUR )
-!
-  IF ( IV < IJB .AND. LSOUTH_ll() ) THEN
-    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
-      TPFLYER%LCRASH = .TRUE.
-    ELSE
-      IJ = IJB
-      IV = IJB
-    END IF
-  END IF
-  IF (IV > IJE .AND. LNORTH_ll() ) THEN
-    IF ( TPFLYER%CMODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1 ) THEN
-      TPFLYER%LCRASH = .TRUE.
-    ELSE
-      IJ = IJE
-      IV = IJE
+      END IF
     END IF
-  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
-!            --------------------------------------
-!
-!----------------------------------------------------------------------------
-  IF ( ZTHIS_PROC > 0. .AND. .NOT. TPFLYER%LCRASH ) THEN
-!----------------------------------------------------------------------------
-!
-!*      4.5  Interpolations of model variables to mass points
-!            ------------------------------------------------
-!
 
-    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)
-    END DO
-    !
-    IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == '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,:,:)
+  CLASS IS ( TBALLOONDATA)
+    GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch)
+
+    ! 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. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN
+      ! Get rank of the process where the balloon is and the model number
+      IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+        IMODEL = TPFLYER%NMODEL
+      ELSE
+        IMODEL = 0
+      END IF
+      CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH, IRANK, IMODEL )
+
+      IF ( IRANK < 1 ) THEN
+        TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+        TPFLYER%LCRASH = .TRUE.
+        TPFLYER%NCRASH = NCRASH_OUT_HORIZ
+        TPFLYER%LFLY   = .FALSE.
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) &
+                        // ': launch coordinates are outside of horizontal physical domain' )
+      ELSE
+        TPFLYER%NMODEL = IMODEL
+        TPFLYER%LCRASH = .FALSE.
+        TPFLYER%NCRASH = NCRASH_NO
+        TPFLYER%NRANK_CUR = IRANK
+      END IF
     END IF
 
-!
-!*      5.2  Initial vertical positions
-!            --------------------------
-!
-    IF (GLAUNCH) THEN
-      SELECT TYPE ( TPFLYER )
-        CLASS IS ( TBALLOONDATA)
-          SELECT CASE ( TPFLYER%CTYPE )
-!
-!*      5.2.1 Iso-density balloon
-!
-            CASE ( 'ISODEN' )
-              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
-              ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
-              ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
-                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
-                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
-                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
-                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1)
-                ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
-                ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
+    ! Launch?
+    LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN
+      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
+        ! Get rank of the process where the balloon is and the model number
+        IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+          IMODEL = TPFLYER%NMODEL
+        ELSE
+          IMODEL = 0
+        END IF
+        CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
+        IF ( IRANK < 1 ) THEN
+          TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+          TPFLYER%LCRASH = .TRUE.
+          TPFLYER%NCRASH = NCRASH_OUT_HORIZ
+          TPFLYER%LFLY   = .FALSE.
+          WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                              's (out of the horizontal boundaries)' )" ) &
+             TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+          CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' )
+        ELSE
+          TPFLYER%NMODEL = IMODEL
+          TPFLYER%LCRASH = .FALSE.
+          TPFLYER%NCRASH = NCRASH_NO
+          TPFLYER%NRANK_CUR = IRANK
+        END IF
+      END IF LAUNCHTIME
+    END IF LAUNCH
+
+    MODEL1BAL: IF ( TPFLYER%NMODEL == IMI .AND. &
+      !Do we have to store balloon data?
+      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 IF MODEL1BAL
+
+    ! 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
+        ZTHIS_PROC = 1.
+        !
+        !*      2.   PRELIMINARIES-2
+        !            -------------
+        !
+        !*      2.1  Indices
+        !            -------
+        !
+        CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+        IKB =   1   + JPVEXT
+        IKE = SIZE(PZ,3) - JPVEXT
+        !
+        !
+        !*      2.2  Interpolations of model variables to mass points
+        !            ------------------------------------------------
+        !
+        IIU=SIZE(XXHAT)
+        IJU=SIZE(XYHAT)
+        ! 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 )
+        !
+        !*      4.5  Interpolations of model variables to mass points
+        !            ------------------------------------------------
+        !
+        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)
+        !
+        !----------------------------------------------------------------------------
+        !
+        !*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
+        !            ----------------------------------
+        !
+        !
+        !*      5.1  Density
+        !            -------
+        !
+        ZEXN(:,:,:    ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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)
+        END DO
+        !
+        IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN
+          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,:,:)) )
+          !
+          ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
+          ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:)
+        END IF
+          SELECT CASE ( TPFLYER%CTYPE )
+            !
+            !*      5.2.1 Iso-density balloon
+            !
+            CASE ( 'ISODEN' )
+              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
+              ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
+              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
+              ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
+              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
+                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
+                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
+                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
+                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1)
+                ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
+                ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
                 ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
                 ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
                 TPFLYER%XRHO = FLYER_INTERP(ZRHO)
@@ -656,22 +1213,22 @@ IF ( TPFLYER%LFLY ) THEN
                 CMNHMSG(3) = 'Check your INI_BALLOON routine'
                 CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
               END IF
-!
-!*      5.2.2 Radiosounding balloon
-!
+            !
+            !*      5.2.2 Radiosounding balloon
+            !
             CASE ( 'RADIOS' )
               TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH
               TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) )
               TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
               TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
               TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) )
-!
-!*      5.2.4 Constant Volume Balloon
-!
+            !
+            !*      5.2.4 Constant Volume Balloon
+            !
             CASE ( 'CVBALL' )
-              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
+              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
               ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
+              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
               ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
               IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
                 IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
@@ -731,27 +1288,13 @@ IF ( TPFLYER%LFLY ) THEN
                 END IF
               END IF
           END SELECT
+        END IF LAUNCHVERTPOS
+        !
+        !
+        !
+        !*      5.3  Vertical position
+        !            -----------------
 !
-!*      5.2.3 Aircraft
-!
-        CLASS IS ( TAIRCRAFTDATA)
-          IF (TPFLYER%LALTDEF) THEN
-            TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL  ) &
-                           +     ZSEG_FRAC  * TPFLYER%XSEGP(IL+1)
-          ELSE
-            TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) &
-                           +     ZSEG_FRAC  * TPFLYER%XSEGZ(IL +1 )
-          END IF
-      END SELECT
-    END IF
-!
-!
-!
-!*      5.3  Vertical position
-!            -----------------
-!
-    SELECT TYPE ( TPFLYER )
-      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)
@@ -764,88 +1307,63 @@ IF ( TPFLYER%LFLY ) THEN
           IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1)
         END IF
 
-      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)
+        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', 'AIRCRAFT_BALLOON_EVOL' , OLOCAL = .TRUE.)
         END IF
-    END SELECT
 
-    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%LCRASH = .TRUE.
-    END IF
-!
-  END IF
-!
-!
-  IF ( TPFLYER%LCRASH ) THEN
-    TPFLYER%LFLY = .FALSE.
-    IF ( TPFLYER%CTYPE == 'AIRCRA' .AND. .NOT. GLAUNCH ) THEN
-      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flew out of the domain the ', &
-                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                         &
-                      TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
-    ELSE IF (TPFLYER%CTYPE /= 'AIRCRA') THEN
-      WRITE(ILUOUT,*) 'Balloon ',TPFLYER%CTITLE,' crashed the ',                 &
-                      TDTCUR%nday,'/',TDTCUR%nmonth,'/',                         &
-                      TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.'
-    END IF
-  ELSE
-    SELECT TYPE ( TPFLYER )
-      CLASS IS ( TAIRCRAFTDATA)
-        IF ( .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-          WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flies  in leg',TPFLYER%NSEGCURN ,' the ',  &
-                          TDTCUR%nday,'/',TDTCUR%nmonth,'/',      &
-                          TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.'
-          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-        ENDIF
-    END SELECT
-!
-!----------------------------------------------------------------------------
-    IF (ZTHIS_PROC>0.) THEN
-!----------------------------------------------------------------------------
-!
-!*      6.   INITIALIZATIONS FOR INTERPOLATIONS
-!            ----------------------------------
-!
-!*      6.1  Interpolation coefficient for X
-!            -------------------------------
-!
-      ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II))
-      ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-!
-!
-!*      6.2  Interpolation coefficient for y
-!            -------------------------------
-!
-      ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ))
-      ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-!
-!
-!*      6.3  Interpolation coefficients for the 4 suroundings verticals
-!            ----------------------------------------------------------
-!
-      SELECT TYPE ( TPFLYER )
-        CLASS IS ( TBALLOONDATA)
+        !
+        !
+        !*      5.4  Crash of the balloon
+        !            --------------------
+        !
+        !
+        IF (IK00 <  IKB .OR. IK01 <  IKB .OR. IK10 <  IKB .OR. IK11 <  IKB ) THEN
+          TPFLYER%LCRASH = .TRUE.
+          TPFLYER%NCRASH = NCRASH_OUT_LOW
+        END IF
+        IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
+          TPFLYER%LCRASH = .TRUE.
+          TPFLYER%NCRASH = NCRASH_OUT_HIGH
+        END IF
+        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
+          !
+          !*      6.   INITIALIZATIONS FOR INTERPOLATIONS
+          !            ----------------------------------
+          !
+          !*      6.1  Interpolation coefficient for X
+          !            -------------------------------
+          !
+          ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
+          ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
+          !
+          !
+          !*      6.2  Interpolation coefficient for y
+          !            -------------------------------
+          !
+          ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
+          ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
+          !
+          !
+          !*      6.3  Interpolation coefficients for the 4 suroundings verticals
+          !            ----------------------------------------------------------
+          !
+          !       SELECT TYPE ( TPFLYER )
+          !         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) )
@@ -858,431 +1376,433 @@ IF ( TPFLYER%LFLY ) THEN
             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
+          !----------------------------------------------------------------------------
+          !
+          !*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
+          !            ---------------------------------------------
+          !
+          !*      7.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.))
+          !
+          !
+          !*      7.2  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.))
+          !
+          !
+          !*      7.3  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) )
+          !
+          !
+          !*      7.4  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) )
 
-        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 SELECT
-!
-!----------------------------------------------------------------------------
-!
-!*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-!            ---------------------------------------------
-!
-!*      7.1  Interpolation coefficient for X (for U)
-!            -------------------------------
-!
-      ZUCOEF = (TPFLYER%XX_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU))
-      ZUCOEF = MAX(0.,MIN(ZUCOEF,1.))
-!
-!
-!*      7.2  Interpolation coefficient for y (for V)
-!            -------------------------------
-!
-      ZVCOEF = (TPFLYER%XY_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%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) )
-!
-!
-!*      7.4  Interpolation coefficients for the 4 suroundings verticals (for V)
-!            ----------------------------------------------------------
-!
+          ! 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
+              !
+              !*      2.   PRELIMINARIES-2
+              !            -------------
+              !
+              !*      2.1  Indices
+              !            -------
+              !
+              CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 
-      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) )
-!
-!----------------------------------------------------------------------------
-!
-!*      8.   DATA RECORDING
-!            --------------
-!
-      IF ( GSTORE ) THEN
-        TPFLYER%XX   (IN) = TPFLYER%XX_CUR
-        TPFLYER%XY   (IN) = TPFLYER%XY_CUR
-        TPFLYER%XZ   (IN) = TPFLYER%XZ_CUR
-        !
-        CALL SM_LATLON(PLATOR,PLONOR,          &
-                     TPFLYER%XX_CUR, TPFLYER%XY_CUR,       &
-                     TPFLYER%XLAT(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%XZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
-        TPFLYER%XMER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
-        !
-        TPFLYER%XW   (IN) = FLYER_INTERP(ZWM)
-        TPFLYER%XTH  (IN) = FLYER_INTERP(PTH)
-        !
-        ZFLYER_EXN = FLYER_INTERP(ZEXN)
-        TPFLYER%XP   (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD)
-        !
-        DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%XR   (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP))
-          IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP)
-        END DO
-        DO JLOOP=1,SIZE(PSV,4)
-          TPFLYER%XSV  (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP))
-        END DO
-        TPFLYER%XRTZ  (IN,:) = FLYER_INTERPZ(ZR(:,:,:))
-        DO JLOOP=1,SIZE(PR,4)
-          TPFLYER%XRZ  (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
-        END DO
-        ! Fin Modifs ON
-        TPFLYER%XFFZ  (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2))
-        IF (CCLOUD=="LIMA") THEN                                  
-          TPFLYER%XCIZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
-          TPFLYER%XCCZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
-          TPFLYER%XCRZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
-        ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
-          TPFLYER%XCIZ  (IN,:) = FLYER_INTERPZ(PCIT(:,:,:))
-        ENDIF             
-        ! initialization CRARE and CRARE_ATT + LWC and IWC
-        TPFLYER%XCRARE(IN,:) = 0.
-        TPFLYER%XCRARE_ATT(IN,:) = 0.
-        TPFLYER%XLWCZ  (IN,:) = 0.
-        TPFLYER%XIWCZ  (IN,:) = 0.
-      IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
-       TPFLYER%XLWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
-       TPFLYER%XIWCZ  (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
-            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
-                    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
-                    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
-              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)
+              IKB =   1   + JPVEXT
+              IKE = SIZE(PZ,3) - JPVEXT
+              !
+              !
+              !*      2.2  Interpolations of model variables to mass points
+              !            ------------------------------------------------
+              !
+              IIU=SIZE(XXHAT)
+              IJU=SIZE(XYHAT)
+
+              TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
+              TPFLYER%XX   (ISTORE) = TPFLYER%XX_CUR
+              TPFLYER%XY   (ISTORE) = TPFLYER%XY_CUR
+              TPFLYER%XZ   (ISTORE) = TPFLYER%XZ_CUR
+              !
+              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)
+              !
+              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)
+              !
+              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
-              ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
-              ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
-              TPFLYER%XCRARE(IN,JK)=TPFLYER%XCRARE(IN,JK)+ZREFLOC
-              ZAELOC(JK)=ZAELOC(JK)+ZAETMP
-            END IF
+              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
+              ! Fin Modifs ON
+              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(:,:,:))
+              ENDIF
+              ! 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
+                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
+                            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
+                            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
+                      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))
 
-          END DO
+                            ! 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)
 
-        END DO
+                            !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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
+                      ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
+                      TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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
-          TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT
-        END DO
-        ! 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))))
+                ! 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
+                  TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
+                END DO
+                ! 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
+                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 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(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT
-        END DO
-        TPFLYER%XZZ  (IN,:) = ZZMZ(:)
-        DEALLOCATE(ZZMZ,ZAELOC)
-        ! m^3 → mm^6/m^3 → dBZ
-        WHERE(TPFLYER%XCRARE(IN,:)>0)
-          TPFLYER%XCRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(IN,:))
-        ELSEWHERE
-          TPFLYER%XCRARE(IN,:)=XUNDEF
-        END WHERE
-        WHERE(TPFLYER%XCRARE_ATT(IN,:)>0)
-          TPFLYER%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(IN,:))
-        ELSEWHERE
-          TPFLYER%XCRARE_ATT(IN,:)=XUNDEF
-        END WHERE
-        DEALLOCATE(ZX,ZW,ZRTMIN)
-      END IF ! end LOOP ICE3
-        ! vertical wind
-        TPFLYER%XWZ  (IN,:) = FLYER_INTERPZ(ZWM(:,:,:))
-        IF (SIZE(PTKE)>0) TPFLYER%XTKE  (IN)    = FLYER_INTERP(PTKE)
-        IF (SIZE(PTS) >0) TPFLYER%XTSRAD(IN)    = FLYER_INTERP_2D(PTS)
-        IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS)
-        TPFLYER%XZS(IN)  = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT))
-        TPFLYER%XTHW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX)
-        TPFLYER%XRCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX)
-        DO JLOOP=1,SIZE(PSV,4)
-         TPFLYER%XSVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
-        END DO
-      END IF
-!
-!----------------------------------------------------------------------------
-!
-!*      9.   BALLOON ADVECTION
-!            -----------------
-!
-      SELECT TYPE ( TPFLYER )
-        CLASS IS ( TBALLOONDATA)
+          !
+          !----------------------------------------------------------------------------
+          !
+          !*      9.   BALLOON ADVECTION
+          !            -----------------
+          !
+          !       SELECT TYPE ( TPFLYER )
+          !         CLASS IS ( TBALLOONDATA)
+          ZTSTEP = PTSTEP
+
           IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
             ZU_BAL = FLYER_INTERP_U(PU)
             ZV_BAL = FLYER_INTERP_V(PV)
@@ -1292,21 +1812,113 @@ IF ( TPFLYER%LFLY ) THEN
               ZMAP = 1.
             end if
             !
-            TPFLYER%XX_CUR = TPFLYER%XX_CUR   +   ZU_BAL * PTSTEP * ZMAP
-            TPFLYER%XY_CUR = TPFLYER%XY_CUR   +   ZV_BAL * PTSTEP * ZMAP
+            ZX_OLD = TPFLYER%XX_CUR
+            ZY_OLD = TPFLYER%XY_CUR
+
+            TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+            TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
           END IF
           !
+          !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 = TPFLYER%NMODEL
+          ! Get rank of the process where the balloon is and the model number
+          IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+            IMODEL = TPFLYER%NMODEL
+          ELSE
+            IMODEL = 0
+          END IF
+          CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
+          IF ( IRANK < 1 ) THEN
+            TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+            TPFLYER%LCRASH = .TRUE.
+            TPFLYER%NCRASH = NCRASH_OUT_HORIZ
+            TPFLYER%LFLY   = .FALSE.
+            WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                                's (out of the horizontal boundaries)' )" ) &
+              TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+            CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+          ELSE
+            TPFLYER%NMODEL = IMODEL
+            TPFLYER%LCRASH = .FALSE.
+            TPFLYER%NCRASH = NCRASH_NO
+            TPFLYER%NRANK_CUR = IRANK
+          END IF
+          IF ( TPFLYER%NMODEL /= IMODEL_OLD .AND. .NOT. TPFLYER%LCRASH ) THEN
+            IF ( NDAD(TPFLYER%NMODEL ) == IMODEL_OLD ) THEN
+              !Nothing special to do
+            ELSE IF ( TPFLYER%NMODEL == NDAD(IMODEL_OLD) ) THEN
+              !Recompute position to be compatible with parent timestep
+
+              !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
+                ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD)
+              ELSE
+                ZTSTEP = ZTSTEP * ( 1 + 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 > &
+                     TPFLYER%TFLYER_TIME%TPDATES(TPFLYER%TFLYER_TIME%N_CUR) + TPFLYER%TFLYER_TIME%XTSTEP + 1e-6 ) THEN
+                  TPFLYER%TFLYER_TIME%N_CUR = TPFLYER%TFLYER_TIME%N_CUR + 1
+                  ISTORE = TPFLYER%TFLYER_TIME%N_CUR
+                  !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value
+                  TPFLYER%TFLYER_TIME%TPDATES(ISTORE) = TPFLYER%TFLYER_TIME%TPDATES(ISTORE-1) + TPFLYER%TFLYER_TIME%XTSTEP
+
+                  !Force a dummy store (nothing is computed, therefore default/initial values will be stored)
+                  TPFLYER%LSTORE = .TRUE.
+
+                  WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) &
+                         TRIM( TPFLYER%CTITLE ),                                                                             &
+                         TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY,  TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH,              &
+                         TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPFLYER%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
+
+              TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+              TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
+
+              ! Model number is now imposed
+              IMODEL = TPFLYER%NMODEL
+              CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
+              IF ( IRANK < 1 ) THEN
+                TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+                TPFLYER%LCRASH = .TRUE.
+                TPFLYER%NCRASH = NCRASH_OUT_HORIZ
+                TPFLYER%LFLY   = .FALSE.
+                WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                       's (out of the horizontal boundaries)' )" )                                          &
+                       TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+                CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+              ELSE
+                !TPFLYER%NMODEL = IMODEL !Do not change model because we are in transition to parent
+                TPFLYER%LCRASH = .FALSE.
+                TPFLYER%NCRASH = NCRASH_NO
+                TPFLYER%NRANK_CUR = IRANK
+              END IF
+            ELSE
+              !Special case not-managed (different dads, change of several models in 1 step (going to grand parent)...)
+              CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPFLYER%CTITLE
+              CMNHMSG(2) = 'its trajectory might be wrong'
+              CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+            END IF
+          END IF
+
           IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
             ZW_BAL = FLYER_INTERP(ZWM)
-            TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * PTSTEP
+            TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * ZTSTEP
           END IF
           !
           IF ( TPFLYER%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(PTSTEP) .GT. 1 ) THEN
-              DO JK=1,INT(PTSTEP)
+            IF (INT(ZTSTEP) .GT. 1 ) THEN
+              DO JK=1,INT(ZTSTEP)
                 TPFLYER%XWASCENT = TPFLYER%XWASCENT &
                   -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * &
                      ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
@@ -1316,161 +1928,114 @@ IF ( TPFLYER%LFLY ) THEN
                 TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 1.
               END DO
             END IF
-            IF (PTSTEP .GT. INT(PTSTEP)) THEN
-                TPFLYER%XWASCENT = TPFLYER%XWASCENT &
-                  -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * &
-                     ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
-                        + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
-                          TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
-                      )
-                TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (PTSTEP-INT(PTSTEP))
+            IF (ZTSTEP .GT. INT(ZTSTEP)) THEN
+              TPFLYER%XWASCENT = TPFLYER%XWASCENT &
+                -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * &
+                   ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
+                      + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
+                        TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
+                    )
+              TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (ZTSTEP-INT(ZTSTEP))
             END IF
           END IF
-      END SELECT
-!
-!----------------------------------------------------------------------------
-  END IF
-!----------------------------------------------------------------------------
-!
-!*     10.   AIRCRAFT MOVE (computations done on all processors, to limit exchanges)
-!            -------------
-!
-    SELECT TYPE ( TPFLYER )
-      CLASS IS ( TAIRCRAFTDATA )
-!
-!
-!*     10.1  Determination of flight segment
-!            -------------------------------
-!
-        IL = TPFLYER%NSEGCURN
-        !
-        TPFLYER%XSEGCURT = TPFLYER%XSEGCURT + PTSTEP
-        !
-         DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL))
-           TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
-           IL = TPFLYER%NSEGCURN
-           TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
-           IF (IL>TPFLYER%NSEG) EXIT
-        END DO
-!        DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG)
-!          TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1
-!          IL = TPFLYER%NSEGCURN
-!          TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1)
-!        END DO
-        !
-        !* end of flight
-        !
-        IF (IL > TPFLYER%NSEG) TPFLYER%LFLY = .FALSE.
-!
-!
-!*     10.2  Determination of new position
-!            -----------------------------
-!
-        IF (TPFLYER%LFLY) THEN
-          ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(IL)
-          !
-          TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL  ) &
-                        +     ZSEG_FRAC  * TPFLYER%XSEGX(IL+1)
-          TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL  ) &
-                        +     ZSEG_FRAC  * TPFLYER%XSEGY(IL+1)
-            IF (TPFLYER%LALTDEF) THEN
-               TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL  ) &
-                        +     ZSEG_FRAC  * TPFLYER%XSEGP(IL+1)
-            ELSE
-               TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL  ) &
-                        +     ZSEG_FRAC  * TPFLYER%XSEGZ(IL+1)
-            END IF
-        END IF
-    END SELECT
-  !
-  END IF
-! 
-END IF
-!
-!----------------------------------------------------------------------------
-!
-!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
-!            ------------------------------------------
-!
-!*     11.1  current position
-!            ----------------
-!
-CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
-CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
-CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
-CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
 
-SELECT TYPE ( TPFLYER )
-  CLASS IS ( TBALLOONDATA )
-    IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
-    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-    ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
-    END IF
+          TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP
+        END IF CRASH_VERT !end of no vertical crash branch
+      ELSE ISOWNERBAL
+        !The balloon is not present on this MPI process
+        ZTHIS_PROC = 0.
+      END IF ISOWNERBAL
+      !----------------------------------------------------------------------------
+      !
+      !*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSES
+      !            -----------------------------------------
+      !
+      !*     11.1  current position
+      !            ----------------
+      !
+      IF ( TPFLYER%CMODEL == 'MOB' ) THEN
+        CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
+      END IF
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR)
+      CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
+      CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
+      CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY)
+      CALL DISTRIBUTE_FLYER  (TPFLYER%TPOS_CUR%XTIME)
+
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR)
+
+      ! SELECT TYPE ( TPFLYER )
+      !   CLASS IS ( TBALLOONDATA )
+      IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
+        CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+        CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
+      ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
+        CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+      ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+        CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
+      END IF
+
+      IF ( TPFLYER%LSTORE ) THEN
+        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR)
+        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH)
+        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY)
+        CALL DISTRIBUTE_FLYER  (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME)
+
+        CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
+        DO JLOOP=1,SIZE(PR,4)
+          CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
+        END DO
+        DO JLOOP=1,SIZE(PSV,4)
+          CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
+        END DO
+        DO JLOOP=1,IKU
+          CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
+          DO JLOOP2=1,SIZE(PR,4)
+            CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
+          ENDDO
+          CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
+          IF (CCLOUD== 'LIMA' ) THEN
+            CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
+            CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
+          ENDIF
+          CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
+          CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
+        END DO
+        IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
+        IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
+        IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
+        CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
+        DO JLOOP=1,SIZE(PSV,4)
+          CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
+        END DO
+      END IF
+    END IF INFLIGHTONMODEL
 
-  CLASS IS ( TAIRCRAFTDATA )
-    IF (TPFLYER%LALTDEF) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XP_CUR)
-    ELSE
-      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-    ENDIF
 END SELECT
-!
-!*     11.2  data stored
-!            -----------
-!
-IF ( GSTORE ) THEN
-  CALL DISTRIBUTE_FLYER(TPFLYER%XX  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XY  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XLON(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZON(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XMER(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XW  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XP  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XTH (IN))
-  DO JLOOP=1,SIZE(PR,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XR   (IN,JLOOP))
-  END DO
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (IN,JLOOP))
-  END DO
-  DO JLOOP=1,IKU              
-    CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (IN,JLOOP))
-    DO JLOOP2=1,SIZE(PR,4)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (IN,JLOOP,JLOOP2))
-    ENDDO
-    CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (IN,JLOOP))
-    IF (CCLOUD== 'LIMA' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (IN,JLOOP))
-      CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (IN,JLOOP))
-    ENDIF
-    CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (IN,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (IN,JLOOP))
-  END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (IN))
-  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN))
-  IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN))
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(IN,JLOOP))
-  END DO
-END IF
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
+
+
 CONTAINS
 !
 !----------------------------------------------------------------------------
@@ -1486,8 +2051,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)) &
@@ -1508,8 +2073,8 @@ IF (SIZE(PA,1)==2) THEN
   JI=1
   JJ=1
 ELSE
-  JI=II
-  JJ=IJ
+  JI=II_M
+  JJ=IJ_M
 END IF
 !
 !
@@ -1519,10 +2084,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
@@ -1538,8 +2103,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)) &
@@ -1561,8 +2126,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)) &
@@ -1584,8 +2149,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  ) &
@@ -1639,88 +2204,9 @@ END IF
 !
 END SUBROUTINE DISTRIBUTE_FLYER_L
 !----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-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%XX_CUR )
-IV=COUNT( PYHAT (:)<=TPFLYER%XY_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
-    !
-  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
-  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%CTITLE,' comes from model ',IMODEL,' in  model ', &
-                      TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-   ELSE
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-      WRITE(ILUOUT,*) TPFLYER%CTITLE,' goes from model ',IMODEL,' to  model ', &
-                      TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.'
-      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
-   ENDIF
-ENDIF
-!
-!
-END SUBROUTINE FLYER_CHANGE_MODEL
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
+
+
 END SUBROUTINE AIRCRAFT_BALLOON_EVOL
+!----------------------------------------------------------------------------
+
+END MODULE MODE_AIRCRAFT_BALLOON_EVOL
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 27362f835..59e39266e 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -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
 !-------------------------------------------------------------------------------
@@ -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/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index f6355579a..d0f456f1a 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -118,6 +118,8 @@ ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
 
 !Treat aircraft data read in namelist
 DO JI = 1, NAIRCRAFTS
+    TAIRCRAFTS(JI)%NID = JI
+
   IF ( CTITLE(JI) == '' ) THEN
     WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
 
@@ -139,6 +141,7 @@ DO JI = 1, NAIRCRAFTS
       CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT', &
                       'NMODEL is set to 1 at start for a CMODEL="MOB" aircraft (aircraft ' // TRIM( CTITLE(JI) ) // ')' )
     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) )
@@ -167,10 +170,10 @@ DO JI = 1, NAIRCRAFTS
   END IF
   TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
-  IF ( NPOS(JI) < 1 ) THEN
-    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 1 for aircraft ' // TRIM( CTITLE(JI) ) )
+  IF ( NPOS(JI) < 2 ) THEN
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) )
   END IF
-  TAIRCRAFTS(JI)%NSEG = NPOS(JI)-1
+  TAIRCRAFTS(JI)%NPOS = NPOS(JI)
 
   TAIRCRAFTS(JI)%LALTDEF = LALTDEF(JI)
 
@@ -179,13 +182,13 @@ DO JI = 1, NAIRCRAFTS
                     // TRIM( CTITLE(JI) ) )
 
   ! Allocate trajectory data
-  ALLOCATE( TAIRCRAFTS(JI)%XSEGTIME(TAIRCRAFTS(JI)%NSEG  ) ); TAIRCRAFTS(JI)%XSEGTIME(:) = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XSEGLAT (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLAT(:)  = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XSEGLON (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLON(:)  = XNEGUNDEF
+  ALLOCATE( TAIRCRAFTS(JI)%XPOSTIME(TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSTIME(:) = XNEGUNDEF
+  ALLOCATE( TAIRCRAFTS(JI)%XPOSLAT (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLAT(:)  = XNEGUNDEF
+  ALLOCATE( TAIRCRAFTS(JI)%XPOSLON (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLON(:)  = XNEGUNDEF
   IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN
-    ALLOCATE( TAIRCRAFTS(JI)%XSEGP (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGP(:)    = XNEGUNDEF
+    ALLOCATE( TAIRCRAFTS(JI)%XPOSP (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSP(:)    = XNEGUNDEF
   ELSE
-    ALLOCATE( TAIRCRAFTS(JI)%XSEGZ (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGZ(:)    = XNEGUNDEF
+    ALLOCATE( TAIRCRAFTS(JI)%XPOSZ (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSZ(:)    = XNEGUNDEF
   END IF
 
   ! Read CSV data (trajectory)
@@ -205,6 +208,7 @@ SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE )
 
 USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA
 
+USE MODE_DATETIME
 USE MODE_MSG
 
 IMPLICIT NONE
@@ -215,41 +219,39 @@ CHARACTER(LEN=*),    INTENT(IN)    :: HFILE !Name of the CSV file with the aircr
 CHARACTER(LEN=NMAXLINELGT) :: YSTRING
 INTEGER                    :: ILU      ! logical unit of the file
 INTEGER                    :: JI
-REAL                       :: ZTIME, ZLAT, ZLON, ZALT
-REAL                       :: ZTIME_OLD
-
-ZTIME_OLD = 0.
+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%NSEG + 1
+DO JI = 1, TPAIRCRAFT%NPOS
   ! Read aircraft position
   READ( ILU, END = 101, FMT = '(A)' ) YSTRING
 
   READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT
 
-  IF ( JI > 1 ) TPAIRCRAFT%XSEGTIME(JI-1) = ZTIME - ZTIME_OLD
-  TPAIRCRAFT%XSEGLAT(JI) = ZLAT
-  TPAIRCRAFT%XSEGLON(JI) = ZLON
+  TPAIRCRAFT%XPOSTIME(JI) = ZTIME
+  TPAIRCRAFT%XPOSLAT(JI)  = ZLAT
+  TPAIRCRAFT%XPOSLON(JI)  = ZLON
   IF ( TPAIRCRAFT%LALTDEF ) THEN
-    TPAIRCRAFT%XSEGP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa
+    TPAIRCRAFT%XPOSP(JI)  = ZALT * 100. ! *100 to convert from hPa to Pa
   ELSE
-    TPAIRCRAFT%XSEGZ(JI) = ZALT
+    TPAIRCRAFT%XPOSZ(JI)  = ZALT
   END IF
-
-  ZTIME_OLD = ZTIME
 END DO
 
 101 CONTINUE
 
 CLOSE( ILU )
 
-IF ( JI < TPAIRCRAFT%NSEG + 1 ) &
+IF ( JI < TPAIRCRAFT%NPOS ) &
   CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) )
 
+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 7509894df..59da978f8 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -109,7 +109,6 @@ INTEGER :: ISTORE ! number of storage instants
 INTEGER :: ILUOUT ! logical unit
 INTEGER :: IRESP  ! return code
 INTEGER :: JI
-INTEGER :: JSEG   ! loop counter
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !----------------------------------------------------------------------------
@@ -197,6 +196,7 @@ ENDIF
 !
 !
 allocate( tpflyer%tflyer_time%tpdates(istore) )
+ALLOCATE(TPFLYER%NMODELHIST(ISTORE))
 ALLOCATE(TPFLYER%XX   (ISTORE))
 ALLOCATE(TPFLYER%XY   (ISTORE))
 ALLOCATE(TPFLYER%XZ   (ISTORE))
@@ -236,6 +236,7 @@ ALLOCATE(TPFLYER%XTHW_FLUX(ISTORE))
 ALLOCATE(TPFLYER%XRCW_FLUX(ISTORE))
 ALLOCATE(TPFLYER%XSVW_FLUX(ISTORE,KSV))
 !
+TPFLYER%NMODELHIST = NNEGUNDEF
 TPFLYER%XX   = XUNDEF
 TPFLYER%XY   = XUNDEF
 TPFLYER%XZ   = XUNDEF
@@ -301,6 +302,7 @@ INTEGER(KIND=CDFINT) :: IGROUPID
 INTEGER(KIND=CDFINT) :: ISTATUS
 INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts
 #endif
+INTEGER :: IMODEL
 LOGICAL :: GREAD ! True if balloon position was read in synchronous file
 REAL :: ZLAT ! latitude of the balloon
 REAL :: ZLON ! longitude of the balloon
@@ -310,8 +312,11 @@ TYPE(TFILEDATA) :: TZFILE
 
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 
+LFLYER = .TRUE.
+
 GREAD = .FALSE.
-LFLYER=.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 synchronous file
@@ -490,13 +495,27 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
       WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO
     END IF
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' )
-
-    TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
   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
   IF ( LAIRCRAFT_BALLOON ) THEN
@@ -513,19 +532,10 @@ ELSE IF ( CPROGRAM == 'DIAG  ' ) THEN
       CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' )
     END IF
     !
-    TPFLYER%TFLYER_TIME%XTSTEP  = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP )
+    CALL FLYER_TIMESTEP_CORRECT( XSTEP_AIRCRAFT_BALLOON, TPFLYER )
   END IF
 END IF
-!
-IF ( TPFLYER%XLATLAUNCH == XUNDEF .OR. TPFLYER%XLONLAUNCH == XUNDEF ) THEN
-  CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM( TPFLYER%CTITLE ) // ' )'
-  CMNHMSG(2) = 'either LATitude or LONgitude is not given'
-  CMNHMSG(3) = 'Check your INI_BALLOON routine'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' )
-END IF
-!
-CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH )
-!
+
 END SUBROUTINE INI_LAUNCH
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
@@ -533,50 +543,61 @@ SUBROUTINE INI_FLIGHT(KNBR,TPFLYER)
 !
 INTEGER,              INTENT(IN)    :: KNBR
 CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER
-!
-IF (TPFLYER%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1
-IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0
+
+INTEGER :: IMODEL
+INTEGER :: JSEG   ! loop counter
+
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
-!
+
 LFLYER=.TRUE.
-!
-TPFLYER%TFLYER_TIME%XTSTEP  = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP )
 
-IF (TPFLYER%CTITLE=='          ') THEN
-  WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR
-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
 
-IF ( TPFLYER%NSEG == 0 ) THEN
-  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
-  CMNHMSG(2) = 'There is ZERO flight segment defined.'
-  CMNHMSG(3) = 'Check your INI_AIRCRAFT routine'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' )
-END IF
-!
-IF ( ANY(TPFLYER%XSEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%XSEGLON(:)==XUNDEF) ) THEN
-  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
-  CMNHMSG(2) = 'either LATitude or LONgitude segment'
-  CMNHMSG(3) = 'definiton is not complete.'
-  CMNHMSG(4) = 'Check your INI_AIRCRAFT routine'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' )
+  CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER )
 END IF
-!
-ALLOCATE(TPFLYER%XSEGX(TPFLYER%NSEG+1))
-ALLOCATE(TPFLYER%XSEGY(TPFLYER%NSEG+1))
-!
-DO JSEG=1,TPFLYER%NSEG+1
-  CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XSEGLAT(JSEG), TPFLYER%XSEGLON(JSEG), TPFLYER%XSEGX(JSEG), TPFLYER%XSEGY(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%XSEGTIME(:)==XUNDEF) ) THEN
-  CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )'
-  CMNHMSG(2) = 'definiton of segment duration is not complete.'
-  CMNHMSG(3) = 'Check your INI_AIRCRAFT routine'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' )
-END IF
 
 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
+!----------------------------------------------------------------------------
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE INI_AIRCRAFT_BALLOON
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index cda0db7c2..3c3c4d6ae 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -118,10 +118,12 @@ IMPLICIT NONE
 
 INTEGER :: JI
 
-ALLOCATE( TBALLOONS (NBALLOONS)  )
+ALLOCATE( TBALLOONS(NBALLOONS) )
 
 !Treat balloon data read in namelist
 DO JI = 1, NBALLOONS
+  TBALLOONS(JI)%NID = JI
+
   IF ( CTITLE(JI) == '' ) THEN
     WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
 
@@ -143,6 +145,8 @@ DO JI = 1, NBALLOONS
       CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                       'NMODEL is set to 1 at start for a CMODEL="MOB" balloon (balloon ' // TRIM( CTITLE(JI) ) // ')' )
     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) )
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 4e71d254d..0ed8002ec 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -41,18 +41,23 @@
 !             ------------
 !
 !
-use modd_parameters,    only: XNEGUNDEF, XUNDEF
+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
 
 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)
+
 LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons
-!
+
 TYPE :: TFLYERDATA
   !
   !* general information
@@ -62,18 +67,21 @@ TYPE :: TFLYERDATA
                                      ! 'MOB' : change od model depends of the
                                      !         balloon/aircraft location
   INTEGER          :: NMODEL = 0 ! model number for each balloon/aircraft
+  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      ! launch/takeoff date and time
+  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
@@ -82,10 +90,11 @@ TYPE :: TFLYERDATA
   REAL :: XY_CUR = XNEGUNDEF ! current y
   REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
   REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
+  INTEGER :: NRANK_CUR = NNEGUNDEF ! 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)
@@ -126,16 +135,16 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   !
   !* aircraft flight definition
   !
-  INTEGER :: NSEG     = 0  ! number of aircraft flight segments
-  INTEGER :: NSEGCURN = 1  ! current flight segment number
-  REAL    :: XSEGCURT = 0. ! current flight segment time spent
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGLAT  ! latitude of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGLON  ! longitude of flight segment extremities (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGX    ! X of flight segment extremities         (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGY    ! Y of flight segment extremities         (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGP    ! pressure of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGZ    ! altitude of flight segment extremities  (LEG+1)
-  REAL, DIMENSION(:), ALLOCATABLE :: XSEGTIME ! duration of flight segments             (LEG  )
+  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
   !
@@ -159,6 +168,9 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
   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
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 8183346f1..6de3470a4 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -2112,16 +2112,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
 
-- 
GitLab


From d21b58385fecc65a3cb776c58acde21180939526 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 25 Nov 2022 15:28:43 +0100
Subject: [PATCH 123/157] Philippe 25/11/2022: flyer data in files: add
 NMODELHIST + compute/write LWC only when it makes sense

---
 src/MNH/write_aircraft_balloon.f90 | 31 ++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index dc7726bcd..d03d35acc 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -155,6 +155,7 @@ INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
 INTEGER :: JPT      ! loop counter
 INTEGER :: IKU
+REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position
 type(tbudiachrometadata) :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
@@ -171,7 +172,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels
 !
-IPROC = 20 + IRR + SIZE(TPFLYER%XSV,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)+ &
@@ -211,6 +212,7 @@ SELECT TYPE ( TPFLYER )
 
 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(:) )
@@ -228,8 +230,9 @@ if ( irr >= 7 ) call Add_point( 'Rh', 'Hail mixing ratio',               'kg kg-
 !
 !add cloud liquid water content in g/m3 to compare to measurements from FSSP
 !IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
-ALLOCATE (ZRHO(1,1,ISTORE))
 IF ( IRR > 1 ) THEN !cloud water is present
+  ALLOCATE( ZRHO(1, 1, ISTORE) )
+  ALLOCATE( ZLWC(ISTORE) )
   ZRHO(1,1,:) = 0.
   DO JRR = 1, IRR
     ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
@@ -237,17 +240,21 @@ IF ( IRR > 1 ) THEN !cloud water is present
   ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
                                 / ( 1. + ZRHO(1,1,:)              )
   DO JPT=1,ISTORE
-    IF (TPFLYER%XP(JPT) == 0.) THEN
-      ZRHO(1,1,JPT) = 0.
+    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%XP(JPT) / &
-               (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(JPT)/XP00)**(XRD/XCPD))  )
-    ENDIF
-  ENDDO
-  call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', tpflyer%xr(:,2)*ZRHO(1,1,:)*1.E3 )
-  DEALLOCATE (ZRHO)
-ENDIF
-!ENDIF
+      ZLWC(JPT) = XUNDEF
+    END IF
+  END DO
+  call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', ZLWC(:) )
+  DEALLOCATE( ZLWC, ZRHO )
+END IF
 !
 IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) )
 !
-- 
GitLab


From a999fb49a87fc20b542d335278c402134bb4d2d7 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 30 Nov 2022 13:36:40 +0100
Subject: [PATCH 124/157] Philippe 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and
 XSVW_FLUX only when needed

---
 src/MNH/phys_paramn.f90          | 28 ++++++++++---------
 src/MNH/turb_ver_sv_flux.f90     | 17 ++++++++----
 src/MNH/turb_ver_thermo_flux.f90 | 47 +++++++++++++++++++-------------
 3 files changed, 54 insertions(+), 38 deletions(-)

diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90
index bb9291239..2c314509d 100644
--- a/src/MNH/phys_paramn.f90
+++ b/src/MNH/phys_paramn.f90
@@ -237,12 +237,14 @@ 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
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
 USE MODD_ADV_n,            ONLY : XRTKEMS
+USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 use modd_budget,            only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv,  &
                                   NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
@@ -1460,25 +1462,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
 !
    CALL TURB( 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD,        &
diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90
index 8a742e185..a9dbae3d1 100644
--- a/src/MNH/turb_ver_sv_flux.f90
+++ b/src/MNH/turb_ver_sv_flux.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.
@@ -263,11 +263,13 @@ END MODULE MODI_TURB_VER_SV_FLUX
 !!                                   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
+!  P. Wautelet 30/11/2022: compute PWSV only when needed
 !!--------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
 !          ------------
 !
+USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
 USE MODD_CST
 USE MODD_CTURB
 use modd_field,          only: tfieldmetadata, TYPEREAL
@@ -445,11 +447,14 @@ DO JSV=1,ISV
     ! extrapolates the flux under the ground so that the vertical average with
     ! the IKB flux gives the ground value
     ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB)
-    DO JK=IKTB+1,IKTE-1
-      PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
-    END DO
-    PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL))
-    PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV)
+
+    IF ( LFLYER ) THEN
+      DO JK=IKTB+1,IKTE-1
+        PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
+      END DO
+      PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL))
+      PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV)
+    END IF
  END IF
   !
   IF (OTURB_FLX .AND. tpfile%lopened) THEN
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index 0febd151f..45f46987e 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -331,11 +331,13 @@ END MODULE MODI_TURB_VER_THERMO_FLUX
 !!                     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 MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
 USE MODD_CST
 USE MODD_CTURB
 use modd_field,          only: tfieldmetadata, TYPEREAL
@@ -722,19 +724,24 @@ IF (LOCEAN) THEN
   ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE)
 END IF
 !  
-DO JK=IKTB+1,IKTE-1
-  PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
-END DO
-!
-PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) 
-!
-IF (LOCEAN) THEN
-  PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL))
-  PWTH(:,:,KKA)=0. 
-  PWTH(:,:,KKU)=ZFLXZ(:,:,KKU)
-ELSE
-  PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL)
-  PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL))
+IF ( LFLYER ) THEN
+  PWTH(:,:,:IKTB) = XUNDEF
+  PWTH(:,:,IKTE:) = XUNDEF
+  !
+  DO JK=IKTB+1,IKTE-1
+    PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
+  END DO
+  !
+  PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL))
+  !
+  IF (LOCEAN) THEN
+    PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL))
+    PWTH(:,:,KKA)=0.
+    PWTH(:,:,KKU)=ZFLXZ(:,:,KKU)
+  ELSE
+    PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL)
+    PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL))
+  END IF
 END IF
 !
 IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
@@ -966,12 +973,14 @@ IF (KRR /= 0) THEN
   !
   ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) 
   !
-  DO JK=IKTB+1,IKTE-1
-   PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
-  END DO
-  PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL))
-  PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL))
-  PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL)
+  IF ( LFLYER ) THEN
+    DO JK=IKTB+1,IKTE-1
+     PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL))
+    END DO
+    PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL))
+    PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL))
+    PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL)
+  END IF
   !
   !
   IF ( OTURB_FLX .AND. tpfile%lopened ) THEN
-- 
GitLab


From 1358525288bde7e22e485496be5d62dc4d54ce47 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 30 Nov 2022 14:34:52 +0100
Subject: [PATCH 125/157] Philippe 30/11/2022: spl: add support for PURE and
 ELEMENTAL functions and subroutines

---
 bin/spl | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 77 insertions(+), 8 deletions(-)

diff --git a/bin/spl b/bin/spl
index 7d6e4158a..9497c5b36 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 }
             }
-- 
GitLab


From 4b06fb52bb4553436ce6597a6f2a888ce33d707f Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 30 Nov 2022 14:38:13 +0100
Subject: [PATCH 126/157] Philippe 30/11/2022: WATER_SUM is now a PURE function

---
 src/MNH/water_sum.f90 | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/src/MNH/water_sum.f90 b/src/MNH/water_sum.f90
index 845b99c48..46a899cda 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)
 !! 
-- 
GitLab


From adc7a81a3a742a7c5a7b45011b78b60c1fade5cd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 30 Nov 2022 16:27:26 +0100
Subject: [PATCH 127/157] Philippe 30/11/2022: CF conventions 1.10 (support for
 groups was added in version 1.8)

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 43a779e3e..54c01012f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -2339,7 +2339,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)
-- 
GitLab


From bbaf5704ac941da6c56e9dcceb130eadf4e83398 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 2 Dec 2022 10:39:07 +0100
Subject: [PATCH 128/157] Philippe 02/12/2022: aircraft_balloon_evol: first
 cleaning + better organisation of the source + correction of several bugs

---
 src/MNH/aircraft_balloon_evol.f90 | 2928 ++++++++++++-----------------
 1 file changed, 1216 insertions(+), 1712 deletions(-)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 5b52ea22f..a246e4391 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -102,7 +102,7 @@ CONTAINS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF
+USE MODD_CONF,             ONLY: LCARTESIAN
 USE MODD_CST
 USE MODD_DIAG_IN_RUN
 USE MODD_GRID
@@ -110,31 +110,8 @@ USE MODD_GRID_n
 USE MODD_IO,               ONLY: ISP
 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
-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
-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_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,&
-                                 XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA
 USE MODD_REF_n,            ONLY: XRHODREF
 USE MODD_TIME,             only: TDTSEG
 USE MODD_TIME_n,           only: tdtcur
@@ -145,11 +122,6 @@ USE MODE_FGAU,             ONLY: GAULAG
 USE MODE_FSCATTER,         ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG
 USE MODE_GRIDPROJ
 USE MODE_ll
-USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
-USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_INSTANT
-!
-USE MODI_GAMMA,            ONLY: GAMMA
-USE MODI_WATER_SUM
 !
 IMPLICIT NONE
 !
@@ -185,13 +157,7 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 INTEGER :: IMI        ! model index
 REAL    :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0
 !
-INTEGER :: IIB        ! current process domain sizes
-INTEGER :: IJB
-INTEGER :: IIE
-INTEGER :: IJE
-INTEGER :: IIU
-INTEGER :: IJU
-INTEGER :: IKB
+INTEGER :: IKB        ! vertical domain sizes
 INTEGER :: IKE
 INTEGER :: IKU
 !
@@ -202,8 +168,6 @@ 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
@@ -212,7 +176,6 @@ 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    :: 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
 !
@@ -262,43 +225,12 @@ 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,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                           :: 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
 !
-INTEGER :: IRANK
 INTEGER :: IMODEL
-INTEGER :: IMODEL_OLD
-REAL    :: ZX_OLD, ZY_OLD
-REAL    :: ZDELTATIME
 REAL    :: ZTSTEP
-REAL    :: ZDIVTMP
 
 !----------------------------------------------------------------------------
 IKU = SIZE(PZ,3)
@@ -307,710 +239,56 @@ CALL GET_MODEL_NUMBER_ll(IMI)
 
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA)
-
     !Do the positioning only if model 1 (data will be available to others after)
-    MODEL1: IF ( IMI == 1 ) THEN
+    MODEL1AIR: IF ( IMI == 1 ) THEN
       !Do we have to store aircraft data?
-      CALL  STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE )
-      IF ( ISTORE < 1 ) THEN
-        !No profiler storage at this time step
-        TPFLYER%LSTORE = .FALSE.
-        RETURN
-      ELSE
-        TPFLYER%LSTORE = .TRUE.
-      END IF
+      CALL FLYER_CHECK_STORESTEP( TPFLYER )
 
       ! Is the aircraft in flight ?
       IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
         TPFLYER%LFLY = .TRUE.
 
-        ! Find the flight segment
-        ZTDIST = TDTCUR - TPFLYER%TLAUNCH
-        IL = TPFLYER%NPOSCUR
-        DO WHILE ( ZTDIST > TPFLYER%XPOSTIME(IL+1) )
-          IL = IL + 1
-          IF ( IL > TPFLYER%NPOS-1 ) THEN
-            !Security (should not happen)
-            IL = TPFLYER%NPOS-1
-            EXIT
-          END IF
-        END DO
-        TPFLYER%NPOSCUR = IL
-
-        ! Compute the current position
-        ZSEG_FRAC = ( ZTDIST - TPFLYER%XPOSTIME(IL) ) / ( TPFLYER%XPOSTIME(IL+1) - TPFLYER%XPOSTIME(IL) )
-
-        TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSX(IL  ) &
-                       +     ZSEG_FRAC  * TPFLYER%XPOSX(IL+1)
-        TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSY(IL  ) &
-                       +     ZSEG_FRAC  * TPFLYER%XPOSY(IL+1)
-        IF (TPFLYER%LALTDEF) THEN
-          TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSP(IL  ) &
-                         +     ZSEG_FRAC  * TPFLYER%XPOSP(IL+1)
-        ELSE
-          TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSZ(IL ) &
-                         +     ZSEG_FRAC  * TPFLYER%XPOSZ(IL +1 )
-        END IF
+        ! Compute current position
+        CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER )
 
         ! Get rank of the process where the aircraft is and the model number
-        IF ( TPFLYER%CMODEL == 'FIX' ) THEN
-          IMODEL = TPFLYER%NMODEL
-        ELSE
-          IMODEL = 0
-        END IF
-        CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
-        IF ( IRANK < 1 ) THEN
-          TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
-          TPFLYER%LCRASH = .TRUE.
-          TPFLYER%NCRASH = NCRASH_OUT_HORIZ
-          TPFLYER%LFLY   = .FALSE.
-        ELSE
-          TPFLYER%NMODEL = IMODEL
-          TPFLYER%LCRASH = .FALSE.
-          TPFLYER%NCRASH = NCRASH_NO
-          TPFLYER%NRANK_CUR = IRANK
-        END IF
+        CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
       ELSE
         TPFLYER%LFLY = .FALSE.
-
       END IF
-    END IF MODEL1
+    END IF MODEL1AIR
 
-    IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY ) THEN
+    ! For aircrafts, data has only to be computed at store moments
+    IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN
+      ISTORE = TPFLYER%TFLYER_TIME%N_CUR
       ! 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
-
-          ISOWNER: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
-            ZTHIS_PROC = 1.
-            !
-            !*      2.   PRELIMINARIES-2
-            !            -------------
-            !
-            !*      2.1  Indices
-            !            -------
-            !
-            CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-
-            IKB =   1   + JPVEXT
-            IKE = SIZE(PZ,3) - JPVEXT
-            !
-            !
-            !*      2.2  Interpolations of model variables to mass points
-            !            ------------------------------------------------
-            !
-            IIU=SIZE(XXHAT)
-            IJU=SIZE(XYHAT)
-            ! 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 )
-            !
-            !*      4.5  Interpolations of model variables to mass points
-            !            ------------------------------------------------
-            !
-            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)
-            !
-            !----------------------------------------------------------------------------
-            !
-            !*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
-            !            ----------------------------------
-            !
-            !
-            !*      5.1  Density
-            !            -------
-            !
-            ZEXN(:,:,:    ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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)
-            END DO
-            !
-            ! IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN
-            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,:,:)) )
-            !
-            ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
-            ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:)
-            ! END IF
-
-            ! Vertical position
-            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
+      IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+        ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+          ZTHIS_PROC = 1.
 
-            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', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
-            END IF
+          CALL FLYER_INTERP_TO_MASSPOINTS()
 
-            IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
-              TPFLYER%LCRASH = .TRUE.
-              TPFLYER%NCRASH = NCRASH_OUT_HIGH
-            END IF
-            !
-            !*      6.   INITIALIZATIONS FOR INTERPOLATIONS
-            !            ----------------------------------
-            !
-            !*      6.1  Interpolation coefficient for X
-            !            -------------------------------
-            !
-            ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
-            ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-            !
-            !
-            !*      6.2  Interpolation coefficient for y
-            !            -------------------------------
-            !
-            ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
-            ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-            !
-            !
-            !*      6.3  Interpolation coefficients for the 4 suroundings verticals
-            !            ----------------------------------------------------------
-            !
-            !       SELECT TYPE ( TPFLYER )
-            !         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
-            !
-            !         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 SELECT
-            !
-            !----------------------------------------------------------------------------
-            !
-            !*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-            !            ---------------------------------------------
-            !
-            !*      7.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.))
-            !
-            !
-            !*      7.2  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.))
-            !
-            !
-            !*      7.3  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) )
-            !
-            !
-            !*      7.4  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) )
-            !
-            !
-            !*      8.   DATA RECORDING
-            !            --------------
-            !
-            TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
-            TPFLYER%XX   (ISTORE) = TPFLYER%XX_CUR
-            TPFLYER%XY   (ISTORE) = TPFLYER%XY_CUR
-            TPFLYER%XZ   (ISTORE) = TPFLYER%XZ_CUR
-            !
-            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)
-            !
-            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)
-
-            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
-            ! Fin Modifs ON
-            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(:,:,:))
-            ENDIF
-            ! 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
-              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
-                          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
-                          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
-                    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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
-                    ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
-                    TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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
-                TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
-              END DO
-              ! 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
-              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
-
-          ELSE ISOWNER
-
-            ZTHIS_PROC = 0.
-
-          END IF ISOWNER
+          ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
+          ZRHO(:,:,:) = FLYER_COMPUTE_RHO( )
 
-!----------------------------------------------------------------------------
-          !
-          !*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSES
-          !            -----------------------------------------
-          !
-          !*     11.1  current position
-          !            ----------------
-          !
-          !
-          !*     11.2  data stored
-          !            -----------
-          !
-          ! IF ( GSTORE ) THEN
-          CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
-          DO JLOOP=1,SIZE(PR,4)
-            CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
-          END DO
-          DO JLOOP=1,SIZE(PSV,4)
-            CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
-          END DO
-          DO JLOOP=1,IKU
-            CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
-            DO JLOOP2=1,SIZE(PR,4)
-              CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
-            ENDDO
-            CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
-            IF (CCLOUD== 'LIMA' ) THEN
-              CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
-              CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
-            ENDIF
-            CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
-          END DO
-          IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
-          IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
-          IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
-          DO JLOOP=1,SIZE(PSV,4)
-            CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
-          END DO
-        END IF
+          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( )
+        ELSE ISOWNERAIR
+          !Not owner branch
+          ZTHIS_PROC = 0.
+        END IF ISOWNERAIR
+
+        CALL FLYER_COMMUNICATE_DATA( )
       END IF
     END IF
 
@@ -1023,30 +301,16 @@ SELECT TYPE ( TPFLYER )
     ! (XXHAT_ll of all models are needed by FIND_PROCESS_AND_MODEL_FROM_XY_POS)
     IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN
       ! Get rank of the process where the balloon is and the model number
-      IF ( TPFLYER%CMODEL == 'FIX' ) THEN
-        IMODEL = TPFLYER%NMODEL
-      ELSE
-        IMODEL = 0
-      END IF
-      CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH, IRANK, IMODEL )
-
-      IF ( IRANK < 1 ) THEN
-        TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
-        TPFLYER%LCRASH = .TRUE.
-        TPFLYER%NCRASH = NCRASH_OUT_HORIZ
-        TPFLYER%LFLY   = .FALSE.
+      CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH )
+      IF ( TPFLYER%LCRASH ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) &
                         // ': launch coordinates are outside of horizontal physical domain' )
-      ELSE
-        TPFLYER%NMODEL = IMODEL
-        TPFLYER%LCRASH = .FALSE.
-        TPFLYER%NCRASH = NCRASH_NO
-        TPFLYER%NRANK_CUR = IRANK
       END IF
     END IF
 
     ! 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.
@@ -1054,890 +318,74 @@ SELECT TYPE ( TPFLYER )
         TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
         TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
         TPFLYER%TPOS_CUR = TDTCUR
+
         ! Get rank of the process where the balloon is and the model number
-        IF ( TPFLYER%CMODEL == 'FIX' ) THEN
-          IMODEL = TPFLYER%NMODEL
-        ELSE
-          IMODEL = 0
-        END IF
-        CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
-        IF ( IRANK < 1 ) THEN
-          TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
-          TPFLYER%LCRASH = .TRUE.
-          TPFLYER%NCRASH = NCRASH_OUT_HORIZ
-          TPFLYER%LFLY   = .FALSE.
+        CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
+        IF ( TPFLYER%LCRASH ) THEN
           WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
                               's (out of the horizontal boundaries)' )" ) &
              TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
           CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' )
-        ELSE
-          TPFLYER%NMODEL = IMODEL
-          TPFLYER%LCRASH = .FALSE.
-          TPFLYER%NCRASH = NCRASH_NO
-          TPFLYER%NRANK_CUR = IRANK
         END IF
       END IF LAUNCHTIME
     END IF LAUNCH
 
-    MODEL1BAL: IF ( TPFLYER%NMODEL == IMI .AND. &
+    ! 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  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 IF MODEL1BAL
+      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
         ZTHIS_PROC = 1.
-        !
-        !*      2.   PRELIMINARIES-2
-        !            -------------
-        !
-        !*      2.1  Indices
-        !            -------
-        !
-        CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-        IKB =   1   + JPVEXT
-        IKE = SIZE(PZ,3) - JPVEXT
-        !
-        !
-        !*      2.2  Interpolations of model variables to mass points
-        !            ------------------------------------------------
-        !
-        IIU=SIZE(XXHAT)
-        IJU=SIZE(XYHAT)
-        ! 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 )
-        !
-        !*      4.5  Interpolations of model variables to mass points
-        !            ------------------------------------------------
-        !
-        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)
-        !
-        !----------------------------------------------------------------------------
-        !
-        !*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
-        !            ----------------------------------
-        !
-        !
-        !*      5.1  Density
-        !            -------
-        !
-        ZEXN(:,:,:    ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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)
-        END DO
-        !
-        IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN
-          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,:,:)) )
-          !
-          ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
-          ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:)
-        END IF
-          SELECT CASE ( TPFLYER%CTYPE )
-            !
-            !*      5.2.1 Iso-density balloon
-            !
-            CASE ( 'ISODEN' )
-              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
-              ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
-              ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
-                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
-                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
-                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
-                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1)
-                ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
-                ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
-                ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
-                ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
-                TPFLYER%XRHO = FLYER_INTERP(ZRHO)
-              ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN
-                ZFLYER_EXN = (TPFLYER%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))
-                TPFLYER%XRHO = FLYER_INTERP(ZRHO)
-              ELSE
-                CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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
-            !
-            !*      5.2.2 Radiosounding balloon
-            !
-            CASE ( 'RADIOS' )
-              TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH
-              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) )
-              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
-              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
-              TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) )
-            !
-            !*      5.2.4 Constant Volume Balloon
-            !
-            CASE ( 'CVBALL' )
-              ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
-              ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-              ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
-              ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-              IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN
-                IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1)
-                IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1)
-                IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1)
-                IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1)
-                IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
-                  TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) )
-                ELSE
-                  ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
-                  ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
-                  ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
-                  ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
-                  TPFLYER%XRHO = FLYER_INTERP(ZRHO)
-                  TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
-                END IF
-              ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN
-                ZFLYER_EXN = (TPFLYER%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
-                  TPFLYER%XZ_CUR = ZZM(1,1,IKB)
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%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))
-                  TPFLYER%XRHO = FLYER_INTERP(ZRHO)
-                  TPFLYER%XZ_CUR = FLYER_INTERP(ZZM)
-                END IF
-              ELSE
-                TPFLYER%XRHO = TPFLYER%XMASS / TPFLYER%XVOLUME
-                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)
-                IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
-                  TPFLYER%XZ_CUR = ZZM(1,1,IKB)
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) )
-                  TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) )
-                ELSE
-                  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)
-                END IF
-              END IF
-          END SELECT
-        END IF LAUNCHVERTPOS
-        !
-        !
-        !
-        !*      5.3  Vertical position
-        !            -----------------
-!
-        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
 
-        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', 'AIRCRAFT_BALLOON_EVOL' , OLOCAL = .TRUE.)
-        END IF
+        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( )
 
-        !
-        !
-        !*      5.4  Crash of the balloon
-        !            --------------------
-        !
-        !
-        IF (IK00 <  IKB .OR. IK01 <  IKB .OR. IK10 <  IKB .OR. IK11 <  IKB ) THEN
-          TPFLYER%LCRASH = .TRUE.
-          TPFLYER%NCRASH = NCRASH_OUT_LOW
-        END IF
-        IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
-          TPFLYER%LCRASH = .TRUE.
-          TPFLYER%NCRASH = NCRASH_OUT_HIGH
-        END IF
         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. )
+          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
-          !
-          !*      6.   INITIALIZATIONS FOR INTERPOLATIONS
-          !            ----------------------------------
-          !
-          !*      6.1  Interpolation coefficient for X
-          !            -------------------------------
-          !
-          ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M))
-          ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
-          !
-          !
-          !*      6.2  Interpolation coefficient for y
-          !            -------------------------------
-          !
-          ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M))
-          ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
-          !
-          !
-          !*      6.3  Interpolation coefficients for the 4 suroundings verticals
-          !            ----------------------------------------------------------
-          !
-          !       SELECT TYPE ( TPFLYER )
-          !         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
-          !----------------------------------------------------------------------------
-          !
-          !*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
-          !            ---------------------------------------------
-          !
-          !*      7.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.))
-          !
-          !
-          !*      7.2  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.))
-          !
-          !
-          !*      7.3  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) )
-          !
-          !
-          !*      7.4  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) )
+
+          ! 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
-              !
-              !*      2.   PRELIMINARIES-2
-              !            -------------
-              !
-              !*      2.1  Indices
-              !            -------
-              !
-              CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-
-              IKB =   1   + JPVEXT
-              IKE = SIZE(PZ,3) - JPVEXT
-              !
-              !
-              !*      2.2  Interpolations of model variables to mass points
-              !            ------------------------------------------------
-              !
-              IIU=SIZE(XXHAT)
-              IJU=SIZE(XYHAT)
-
-              TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
-              TPFLYER%XX   (ISTORE) = TPFLYER%XX_CUR
-              TPFLYER%XY   (ISTORE) = TPFLYER%XY_CUR
-              TPFLYER%XZ   (ISTORE) = TPFLYER%XZ_CUR
-              !
-              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)
-              !
-              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)
-              !
-              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
-              ! Fin Modifs ON
-              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(:,:,:))
-              ENDIF
-              ! 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
-                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
-                            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
-                            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
-                      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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
-                      ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
-                      TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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
-                  TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
-                END DO
-                ! 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
-                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 IF
-          END IF
-          !
-          !----------------------------------------------------------------------------
-          !
-          !*      9.   BALLOON ADVECTION
-          !            -----------------
-          !
-          !       SELECT TYPE ( TPFLYER )
-          !         CLASS IS ( TBALLOONDATA)
-          ZTSTEP = PTSTEP
-
-          IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == '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
-            !
-            ZX_OLD = TPFLYER%XX_CUR
-            ZY_OLD = TPFLYER%XY_CUR
-
-            TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
-            TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
-          END IF
-          !
-          !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 = TPFLYER%NMODEL
-          ! Get rank of the process where the balloon is and the model number
-          IF ( TPFLYER%CMODEL == 'FIX' ) THEN
-            IMODEL = TPFLYER%NMODEL
-          ELSE
-            IMODEL = 0
-          END IF
-          CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
-          IF ( IRANK < 1 ) THEN
-            TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
-            TPFLYER%LCRASH = .TRUE.
-            TPFLYER%NCRASH = NCRASH_OUT_HORIZ
-            TPFLYER%LFLY   = .FALSE.
-            WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
-                                's (out of the horizontal boundaries)' )" ) &
-              TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
-            CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
-          ELSE
-            TPFLYER%NMODEL = IMODEL
-            TPFLYER%LCRASH = .FALSE.
-            TPFLYER%NCRASH = NCRASH_NO
-            TPFLYER%NRANK_CUR = IRANK
-          END IF
-          IF ( TPFLYER%NMODEL /= IMODEL_OLD .AND. .NOT. TPFLYER%LCRASH ) THEN
-            IF ( NDAD(TPFLYER%NMODEL ) == IMODEL_OLD ) THEN
-              !Nothing special to do
-            ELSE IF ( TPFLYER%NMODEL == NDAD(IMODEL_OLD) ) THEN
-              !Recompute position to be compatible with parent timestep
-
-              !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
-                ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD)
-              ELSE
-                ZTSTEP = ZTSTEP * ( 1 + 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 > &
-                     TPFLYER%TFLYER_TIME%TPDATES(TPFLYER%TFLYER_TIME%N_CUR) + TPFLYER%TFLYER_TIME%XTSTEP + 1e-6 ) THEN
-                  TPFLYER%TFLYER_TIME%N_CUR = TPFLYER%TFLYER_TIME%N_CUR + 1
-                  ISTORE = TPFLYER%TFLYER_TIME%N_CUR
-                  !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value
-                  TPFLYER%TFLYER_TIME%TPDATES(ISTORE) = TPFLYER%TFLYER_TIME%TPDATES(ISTORE-1) + TPFLYER%TFLYER_TIME%XTSTEP
-
-                  !Force a dummy store (nothing is computed, therefore default/initial values will be stored)
-                  TPFLYER%LSTORE = .TRUE.
-
-                  WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) &
-                         TRIM( TPFLYER%CTITLE ),                                                                             &
-                         TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY,  TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH,              &
-                         TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPFLYER%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
-
-              TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
-              TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
-
-              ! Model number is now imposed
-              IMODEL = TPFLYER%NMODEL
-              CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL )
-              IF ( IRANK < 1 ) THEN
-                TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
-                TPFLYER%LCRASH = .TRUE.
-                TPFLYER%NCRASH = NCRASH_OUT_HORIZ
-                TPFLYER%LFLY   = .FALSE.
-                WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
-                       's (out of the horizontal boundaries)' )" )                                          &
-                       TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
-                CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
-              ELSE
-                !TPFLYER%NMODEL = IMODEL !Do not change model because we are in transition to parent
-                TPFLYER%LCRASH = .FALSE.
-                TPFLYER%NCRASH = NCRASH_NO
-                TPFLYER%NRANK_CUR = IRANK
-              END IF
-            ELSE
-              !Special case not-managed (different dads, change of several models in 1 step (going to grand parent)...)
-              CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPFLYER%CTITLE
-              CMNHMSG(2) = 'its trajectory might be wrong'
-              CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+              CALL FLYER_RECORD_DATA( )
             END IF
           END IF
 
-          IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
-            ZW_BAL = FLYER_INTERP(ZWM)
-            TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * ZTSTEP
-          END IF
-          !
-          IF ( TPFLYER%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)
-                TPFLYER%XWASCENT = TPFLYER%XWASCENT &
-                  -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * &
-                     ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
-                        + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
-                          TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
-                      )
-                TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 1.
-              END DO
-            END IF
-            IF (ZTSTEP .GT. INT(ZTSTEP)) THEN
-              TPFLYER%XWASCENT = TPFLYER%XWASCENT &
-                -  ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * &
-                   ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) &
-                      + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * &
-                        TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) &
-                    )
-              TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (ZTSTEP-INT(ZTSTEP))
-            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
@@ -1945,99 +393,1022 @@ SELECT TYPE ( TPFLYER )
         !The balloon is not present on this MPI process
         ZTHIS_PROC = 0.
       END IF ISOWNERBAL
-      !----------------------------------------------------------------------------
-      !
-      !*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSES
-      !            -----------------------------------------
-      !
-      !*     11.1  current position
-      !            ----------------
-      !
-      IF ( TPFLYER%CMODEL == 'MOB' ) THEN
-        CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
+
+      CALL FLYER_COMMUNICATE_DATA( )
+    END IF INFLIGHTONMODEL
+
+END SELECT
+
+
+CONTAINS
+!
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON )
+
+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
+      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
+  !
+  ! 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
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR)
-      CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
-      CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
-      CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY)
-      CALL DISTRIBUTE_FLYER  (TPFLYER%TPOS_CUR%XTIME)
-
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR)
-
-      ! SELECT TYPE ( TPFLYER )
-      !   CLASS IS ( TBALLOONDATA )
-      IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
-        CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-        CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
-      ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
-        CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-      ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
-        CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
+    ELSE
+      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 SELECT
 
-      IF ( TPFLYER%LSTORE ) THEN
-        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR)
-        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH)
-        CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY)
-        CALL DISTRIBUTE_FLYER  (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME)
-
-        CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
-        DO JLOOP=1,SIZE(PR,4)
-          CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
-        END DO
-        DO JLOOP=1,SIZE(PSV,4)
-          CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
-        END DO
-        DO JLOOP=1,IKU
-          CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
-          DO JLOOP2=1,SIZE(PR,4)
-            CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
-          ENDDO
-          CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
-          IF (CCLOUD== 'LIMA' ) THEN
-            CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
-            CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
-          ENDIF
-          CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
-          CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
-        END DO
-        IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
-        IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
-        IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
-        CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
-        DO JLOOP=1,SIZE(PSV,4)
-          CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
-        END DO
+END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+INTEGER :: IMODEL_OLD
+REAL    :: ZX_OLD, ZY_OLD
+REAL    :: ZDELTATIME
+REAL    :: ZDIVTMP
+
+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
+      ! 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 INFLIGHTONMODEL
+    END IF
+
+    ! 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
+END IF
+
+END SUBROUTINE BALLOON_ADVECTION_HOR
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+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
+  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
+
+END SUBROUTINE BALLOON_ADVECTION_VER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_INTERP_TO_MASSPOINTS()
+
+IMPLICIT NONE
+
+! 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 )
+
+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 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)
+
+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
+
+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
+
+  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
 
 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
 
-CONTAINS
+! ! 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
+
+  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
+
+END SELECT
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+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_NSV,              ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI
+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
+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
+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_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,                                 &
+                                 XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA
+
+USE MODI_GAMMA,            ONLY: GAMMA
+
+IMPLICIT NONE
+
+INTEGER, PARAMETER :: JPTS_GAULAG = 7 ! number of points for Gauss-Laguerre quadrature
+
+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   ! 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,DIMENSION(:),ALLOCATABLE  :: ZX,ZW ! Gauss-Laguerre points and weights
+REAL,DIMENSION(:),ALLOCATABLE  :: ZRTMIN ! local values for XRTMIN
+LOGICAL                        :: GCALC
+
+TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
+
+TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR
+TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR
+TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR
+!
+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)
+!
+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)
+
+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
+  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
+              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
+              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
+        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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
+        ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
+        TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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
+    TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT
+  END DO
+  ! 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
+
+  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
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMMUNICATE_DATA( )
+! Exchange of information between processes
+
+IMPLICIT NONE
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%CMODEL == 'MOB' ) THEN
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
+    END IF
+    CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR)
+    CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
+    CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
+    CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE)
+    CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
+    CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
+    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR)
+    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH)
+    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY)
+    CALL DISTRIBUTE_FLYER  (TPFLYER%TPOS_CUR%XTIME)
+
+    CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR)
+
+    IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
+    ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
+    END IF
+
+END SELECT
+
+IF ( TPFLYER%LSTORE ) THEN
+  ! Data stored
+  ISTORE = TPFLYER%TFLYER_TIME%N_CUR
+
+  SELECT TYPE ( TPFLYER )
+    CLASS IS ( TBALLOONDATA)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH)
+      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY)
+      CALL DISTRIBUTE_FLYER  (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME)
+  END SELECT
+
+  CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
+  DO JLOOP=1,SIZE(PR,4)
+    CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
+  END DO
+  DO JLOOP=1,SIZE(PSV,4)
+    CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
+  END DO
+  DO JLOOP=1,IKU
+    CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
+    DO JLOOP2=1,SIZE(PR,4)
+      CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
+    END DO
+    CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
+    IF (CCLOUD== 'LIMA' ) THEN
+      CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
+      CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
+    END IF
+    CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
+    CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
+  END DO
+  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
+  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
+  IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
+  CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
+  DO JLOOP=1,SIZE(PSV,4)
+    CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
+  END DO
+END IF
+
+END SUBROUTINE FLYER_COMMUNICATE_DATA
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 FUNCTION FLYER_INTERP(PA) RESULT(PB)
@@ -2062,6 +1433,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
@@ -2208,5 +1580,137 @@ END SUBROUTINE DISTRIBUTE_FLYER_L
 
 END SUBROUTINE AIRCRAFT_BALLOON_EVOL
 !----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+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
+  TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) &
+                 +     ZSEG_FRAC  * TPAIRCRAFT%XPOSZ(IL +1)
+END IF
+
+END SUBROUTINE AIRCRAFT_COMPUTE_POSITION
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+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
+    IMODEL = 0
+  END IF
+END IF
+
+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    = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+  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
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+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
-- 
GitLab


From b53b5c0770e43bca02cc8ead5bc514a7181b5f79 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 8 Dec 2022 15:17:51 +0100
Subject: [PATCH 129/157] Philippe 08/12/2022: bugfix if no TDADFILE

---
 src/MNH/modeln.f90 | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 6de3470a4..e6dfee3dc 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -272,6 +272,7 @@ END MODULE MODI_MODEL_n
 !  T. Nagel    01/02/2021: add turbulence recycling
 !  P. Wautelet 19/02/2021: add NEGA2 term for SV budgets
 !  J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version)
+!  P. Wautelet 08/12/2022: bugfix if no TDADFILE
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -479,6 +480,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
@@ -973,7 +975,13 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
     !
     CALL WRITE_DESFM_n(IMI,TZBAKFILE)
     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 )
+    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 => TZBAKFILE
     CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
     IF (CSURF=='EXTE') THEN
-- 
GitLab


From b946950ca23d308cbd101b81311157d4643cb8bc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 9 Dec 2022 11:37:42 +0100
Subject: [PATCH 130/157] Philippe 09/12/2022: flyers: keep previous NMODEL
 value in case of crash

---
 src/MNH/aircraft_balloon_evol.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index a246e4391..8b6383b57 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -1673,7 +1673,7 @@ CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL )
 
 IF ( IRANK < 1 ) THEN
   ! Flyer is outside of horizontal domain
-  TPFLYER%NMODEL    = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) )
+  ! TPFLYER%NMODEL !Do not change to keep a valid value
   TPFLYER%LCRASH    = .TRUE.
   TPFLYER%NCRASH    = NCRASH_OUT_HORIZ
   TPFLYER%LFLY      = .FALSE.
-- 
GitLab


From eda8ef3a6dfe23ddd91b8d849973a99ed8726c5e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 9 Dec 2022 11:41:30 +0100
Subject: [PATCH 131/157] Philippe 09/12/2022: flyers: correction for 'FIX'
 aircrafts if store timestep smaller than model 1 timestep

---
 src/MNH/aircraft_balloon_evol.f90 | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 8b6383b57..933c9c319 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -239,8 +239,12 @@ CALL GET_MODEL_NUMBER_ll(IMI)
 
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA)
-    !Do the positioning only if model 1 (data will be available to others after)
-    MODEL1AIR: IF ( IMI == 1 ) THEN
+    ! For 'MOB' aircrafts, do the positioning only if model 1 (data will be available to others after)
+    !     aircraft store timestep is always a multiple of model 1 timestep
+    ! For 'FIX' aircrafts, do the computation only on the correct model
+    !     (important especially if store timestep is smaller than model 1 timestep)
+    IF (      ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1              ) &
+         .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN
       !Do we have to store aircraft data?
       CALL FLYER_CHECK_STORESTEP( TPFLYER )
 
@@ -256,7 +260,8 @@ SELECT TYPE ( TPFLYER )
       ELSE
         TPFLYER%LFLY = .FALSE.
       END IF
-    END IF MODEL1AIR
+
+    END IF
 
     ! For aircrafts, data has only to be computed at store moments
     IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN
-- 
GitLab


From 967f2bbb682fe7cb3f66a1e8650cdb4a2a572ffa Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 9 Dec 2022 15:55:44 +0100
Subject: [PATCH 132/157] Philippe 09/12/2022: balloons: add LPOSITION_INIT
 field

---
 src/MNH/aircraft_balloon_evol.f90 | 3 ++-
 src/MNH/modd_aircraft_balloon.f90 | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 933c9c319..75ea925f4 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -304,7 +304,8 @@ SELECT TYPE ( TPFLYER )
     ! 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. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN
+    IF ( .NOT. TPFLYER%LPOSITION_INIT ) THEN
+      TPFLYER%LPOSITION_INIT = .TRUE.
       ! Get rank of the process where the balloon is and the model number
       CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH )
       IF ( TPFLYER%LCRASH ) THEN
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 0ed8002ec..e59cdcd0e 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -152,6 +152,7 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
 END TYPE TAIRCRAFTDATA
 
 TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA
+  LOGICAL :: LPOSITION_INIT = .FALSE. ! True if initial position has been computed
   !
   !* balloon dynamical characteristics
   !
-- 
GitLab


From 38babc7c73139130736c0174e6d6e300bc2f2088 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 12 Dec 2022 16:58:26 +0100
Subject: [PATCH 133/157] Philippe 12/12/2022: aircrafts: restructure to
 compute next position (instead of computing current position) This is
 necessary to allow transfer of all aircraft data between processes (to be
 developed)

---
 src/MNH/aircraft_balloon_evol.f90 | 72 +++++++++++++++++++++----------
 src/MNH/modd_aircraft_balloon.f90 |  1 +
 2 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90
index 75ea925f4..f38d3953a 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -231,7 +231,7 @@ INTEGER :: IINFO_ll ! return code
 !
 INTEGER :: IMODEL
 REAL    :: ZTSTEP
-
+TYPE(DATE_TIME) :: TZNEXT ! Time for next position
 !----------------------------------------------------------------------------
 IKU = SIZE(PZ,3)
 
@@ -239,33 +239,34 @@ CALL GET_MODEL_NUMBER_ll(IMI)
 
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA)
-    ! For 'MOB' aircrafts, do the positioning only if model 1 (data will be available to others after)
-    !     aircraft store timestep is always a multiple of model 1 timestep
-    ! For 'FIX' aircrafts, do the computation only on the correct model
-    !     (important especially if store timestep is smaller than model 1 timestep)
-    IF (      ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1              ) &
-         .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN
-      !Do we have to store aircraft data?
-      CALL FLYER_CHECK_STORESTEP( TPFLYER )
-
-      ! Is the aircraft in flight ?
-      IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
-        TPFLYER%LFLY = .TRUE.
-
-        ! Compute current position
-        CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, 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.
+    ! 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.
+
+          ! Compute current position
+          CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER )
+
+          ! Get rank of the process where the aircraft is and the model number
+          CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
+        END IF
       END IF
+    END IF TAKEOFF
 
+    IF ( IMI == TPFLYER%NMODEL ) THEN
+       !Do we have to store aircraft data?
+      CALL FLYER_CHECK_STORESTEP( TPFLYER )
     END IF
 
     ! 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
-      ISTORE = TPFLYER%TFLYER_TIME%N_CUR
       ! 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
@@ -294,6 +295,33 @@ SELECT TYPE ( TPFLYER )
         END IF ISOWNERAIR
 
         CALL FLYER_COMMUNICATE_DATA( )
+
+        ! Store has been done
+        TPFLYER%LSTORE = .FALSE.
+      END IF
+    END IF
+
+    ! 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
 
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index e59cdcd0e..167cf8fef 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -132,6 +132,7 @@ TYPE :: TFLYERDATA
 END TYPE TFLYERDATA
 
 TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
+  LOGICAL :: LTOOKOFF = .FALSE. ! Set to true once the aircraft takes off
   !
   !* aircraft flight definition
   !
-- 
GitLab


From 5f2e2a6e28a7e030ca11e486a22a72a2590a59a7 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 12 Dec 2022 17:09:14 +0100
Subject: [PATCH 134/157] Philippe 12/12/2022: flyers: use arrays of pointers
 to flyers instead of arrays of flyers Useful to allow transfer of flyers
 between processses (to be developed)

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  4 +-
 src/MNH/aircraft_balloon.f90                |  4 +-
 src/MNH/ini_aircraft.f90                    | 36 +++++-----
 src/MNH/ini_aircraft_balloon.f90            |  8 +--
 src/MNH/ini_balloon.f90                     | 74 +++++++++++----------
 src/MNH/modd_aircraft_balloon.f90           | 13 +++-
 src/MNH/write_aircraft_balloon.f90          |  4 +-
 src/MNH/write_balloonn.f90                  |  2 +-
 8 files changed, 81 insertions(+), 64 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 54c01012f..b9c92d64b 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1862,11 +1862,11 @@ if ( tpfile%lmaster ) then
 
     if ( lflyer ) then
       do ji = 1, nballoons
-        call Write_flyer_time_coord( tballoons(ji) )
+        call Write_flyer_time_coord( tballoons(ji)%tballoon )
       end do
 
       do ji = 1, naircrafts
-        call Write_flyer_time_coord( taircrafts(ji) )
+        call Write_flyer_time_coord( taircrafts(ji)%taircraft )
       end do
     end if
 
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index a43f04c53..5028e0d9f 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -140,13 +140,13 @@ ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
 DO JI = 1, NBALLOONS
   CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TBALLOONS(JI), PSEA                                      )
+                              TBALLOONS(JI)%TBALLOON, PSEA                             )
 END DO
 !
 DO JI = 1, NAIRCRAFTS
   CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TAIRCRAFTS(JI), PSEA                                     )
+                              TAIRCRAFTS(JI)%TAIRCRAFT, PSEA                           )
 END DO
 !
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index d0f456f1a..b968be84d 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -113,12 +113,16 @@ USE MODN_AIRCRAFTS
 IMPLICIT NONE
 
 INTEGER :: JI
+TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT
 
 ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
 
 !Treat aircraft data read in namelist
 DO JI = 1, NAIRCRAFTS
-    TAIRCRAFTS(JI)%NID = JI
+    ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+    TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT
+
+    TZAIRCRAFT%NID = JI
 
   IF ( CTITLE(JI) == '' ) THEN
     WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
@@ -127,7 +131,7 @@ DO JI = 1, NAIRCRAFTS
     CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT' )
   END IF
-  TAIRCRAFTS(JI)%CTITLE = CTITLE(JI)
+  TZAIRCRAFT%CTITLE = CTITLE(JI)
 
   IF ( CMODEL(JI) == 'FIX' ) THEN
     IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
@@ -150,15 +154,15 @@ DO JI = 1, NAIRCRAFTS
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
-  TAIRCRAFTS(JI)%CMODEL = CMODEL(JI)
-  TAIRCRAFTS(JI)%NMODEL = NMODEL(JI)
+  TZAIRCRAFT%CMODEL = CMODEL(JI)
+  TZAIRCRAFT%NMODEL = NMODEL(JI)
 
-  TAIRCRAFTS(JI)%CTYPE = CTYPE(JI)
+  TZAIRCRAFT%CTYPE = CTYPE(JI)
 
   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) ) )
-  TAIRCRAFTS(JI)%TLAUNCH  = TLAUNCH(JI)
+  TZAIRCRAFT%TLAUNCH  = TLAUNCH(JI)
 
   IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', &
@@ -168,31 +172,31 @@ DO JI = 1, NAIRCRAFTS
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'invalid data storage frequency for aircraft ' // TRIM( CTITLE(JI) ) )
     XTSTEP(JI) = 60.
   END IF
-  TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+  TZAIRCRAFT%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
   IF ( NPOS(JI) < 2 ) THEN
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) )
   END IF
-  TAIRCRAFTS(JI)%NPOS = NPOS(JI)
+  TZAIRCRAFT%NPOS = NPOS(JI)
 
-  TAIRCRAFTS(JI)%LALTDEF = LALTDEF(JI)
+  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) ) )
 
   ! Allocate trajectory data
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSTIME(TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSTIME(:) = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSLAT (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLAT(:)  = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSLON (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLON(:)  = XNEGUNDEF
-  IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN
-    ALLOCATE( TAIRCRAFTS(JI)%XPOSP (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSP(:)    = XNEGUNDEF
+  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( TAIRCRAFTS(JI)%XPOSZ (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSZ(:)    = XNEGUNDEF
+    ALLOCATE( TZAIRCRAFT%XPOSZ (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSZ(:)    = XNEGUNDEF
   END IF
 
   ! Read CSV data (trajectory)
-  CALL AIRCRAFT_CSV_READ( TAIRCRAFTS(JI), CFILE(JI) )
+  CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) )
 
 END DO
 
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 59da978f8..2b9ef0f6c 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -138,7 +138,7 @@ ENDIF
 IF (IMI == 1) CALL INI_BALLOON
 !
 DO JI = 1, NBALLOONS
-  CALL INI_LAUNCH( JI, TBALLOONS(JI) )
+  CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON )
 END DO
 !
 !----------------------------------------------------------------------------
@@ -149,7 +149,7 @@ END DO
 IF (IMI == 1) CALL INI_AIRCRAFT
 !
 DO JI = 1, NAIRCRAFTS
-  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI) )
+  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 !----------------------------------------------------------------------------
@@ -160,11 +160,11 @@ END DO
 IF (.NOT. LFLYER) RETURN
 !
 DO JI = 1, NBALLOONS
-  CALL ALLOCATE_FLYER( TBALLOONS(JI) )
+  CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
 END DO
 !
 DO JI = 1, NAIRCRAFTS
-  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI) )
+  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 3c3c4d6ae..7e268fb43 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -117,12 +117,16 @@ USE MODN_BALLOONS
 IMPLICIT NONE
 
 INTEGER :: JI
+TYPE(TBALLOONDATA), POINTER :: TZBALLOON
 
 ALLOCATE( TBALLOONS(NBALLOONS) )
 
 !Treat balloon data read in namelist
 DO JI = 1, NBALLOONS
-  TBALLOONS(JI)%NID = JI
+  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
@@ -131,7 +135,7 @@ DO JI = 1, NBALLOONS
     CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON' )
   END IF
-  TBALLOONS(JI)%CTITLE = CTITLE(JI)
+  TZBALLOON%CTITLE = CTITLE(JI)
 
   IF ( CMODEL(JI) == 'FIX' ) THEN
     IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
@@ -155,23 +159,23 @@ DO JI = 1, NBALLOONS
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
-  TBALLOONS(JI)%CMODEL = CMODEL(JI)
-  TBALLOONS(JI)%NMODEL = NMODEL(JI)
+  TZBALLOON%CMODEL = CMODEL(JI)
+  TZBALLOON%NMODEL = NMODEL(JI)
 
-  TBALLOONS(JI)%CTYPE = CTYPE(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) ) )
-  TBALLOONS(JI)%TLAUNCH  = TLAUNCH(JI)
+  TZBALLOON%TLAUNCH  = TLAUNCH(JI)
 
   IF ( XLATLAUNCH(JI) == XUNDEF ) &
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
-  TBALLOONS(JI)%XLATLAUNCH = XLATLAUNCH(JI)
+  TZBALLOON%XLATLAUNCH = XLATLAUNCH(JI)
 
   IF ( XLONLAUNCH(JI) == XUNDEF ) &
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
-  TBALLOONS(JI)%XLONLAUNCH = XLONLAUNCH(JI)
+  TZBALLOON%XLONLAUNCH = XLONLAUNCH(JI)
 
   IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
@@ -181,7 +185,7 @@ DO JI = 1, NBALLOONS
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'invalid data storage frequency for balloon ' // TRIM( CTITLE(JI) ) )
     XTSTEP(JI) = 60.
   END IF
-  TBALLOONS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+  TZBALLOON%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
   SELECT CASE ( CTYPE(JI) )
     CASE ( 'CVBALL' )
@@ -193,15 +197,15 @@ DO JI = 1, NBALLOONS
       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) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
-      TBALLOONS(JI)%XPRES      = XPRES(JI)
+      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.' )
         XWASCENT(JI) = 0.
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
 
       IF ( XAERODRAG(JI) == XNEGUNDEF ) THEN
@@ -209,29 +213,29 @@ DO JI = 1, NBALLOONS
                         'aerodynamic drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.44' )
         XAERODRAG(JI) = 0.44
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      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' )
         XINDDRAG(JI) = 0.014
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      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) ) )
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      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) ) )
 
       IF ( XDIAMETER(JI) <= 0. ) THEN
-        TBALLOONS(JI)%XVOLUME          = XVOLUME(JI)
-        TBALLOONS(JI)%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
+        TZBALLOON%XVOLUME          = XVOLUME(JI)
+        TZBALLOON%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
       ELSE IF ( XVOLUME(JI) <= 0 ) THEN
-        TBALLOONS(JI)%XDIAMETER        = XDIAMETER(JI)
-        TBALLOONS(JI)%XVOLUME          = XPI / 6 * XDIAMETER(JI)**3
+        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) ) )
@@ -245,15 +249,15 @@ DO JI = 1, NBALLOONS
       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) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
-      TBALLOONS(JI)%XPRES      = XPRES(JI)
+      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' )
         XWASCENT(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
 
       IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
@@ -261,49 +265,49 @@ DO JI = 1, NBALLOONS
                         'aerodynamic drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XAERODRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      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' )
         XINDDRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      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' )
         XMASS(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      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' )
         XDIAMETER(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI)
+      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' )
         XVOLUME(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XVOLUME = XVOLUME(JI)
+      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) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
+      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.' )
         XWASCENT(JI) = 5.
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
       IF ( XPRES(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                        &
@@ -311,7 +315,7 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XPRES(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                    &
@@ -319,7 +323,7 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XAERODRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                &
@@ -327,28 +331,28 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XINDDRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      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' )
         XMASS(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      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' )
         XDIAMETER(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI)
+      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' )
         XVOLUME(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XVOLUME = XVOLUME(JI)
+      TZBALLOON%XVOLUME = XVOLUME(JI)
 
 
     CASE DEFAULT
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 167cf8fef..92d1ade55 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -178,8 +178,17 @@ END TYPE TBALLOONDATA
 INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
 INTEGER :: NBALLOONS  = 0 ! Total number of balloons
 
-TYPE(TAIRCRAFTDATA), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts
+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
 
-TYPE(TBALLOONDATA),  DIMENSION(:), ALLOCATABLE :: TBALLOONS  ! characteristics and records of the balloons
 
 END MODULE MODD_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index d03d35acc..943c01bd3 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -98,11 +98,11 @@ INTEGER :: JI
 !----------------------------------------------------------------------------
 !
 DO JI = 1, NBALLOONS
-  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON )
 END DO
 
 DO JI = 1, NAIRCRAFTS
-  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 END SUBROUTINE WRITE_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 974bde880..2b1b55417 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -73,7 +73,7 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 INTEGER :: JI
 
 DO JI = 1, NBALLOONS
-  IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI) )
+  IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON )
 END DO
 
 END SUBROUTINE WRITE_BALLOON_n
-- 
GitLab


From fd5a209a86d596eff55b07ced765590cabbfb3ed Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 16 Dec 2022 11:31:03 +0100
Subject: [PATCH 135/157] Philippe 16/12/2022: aircraft_balloon: modi->mode

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  2 +-
 src/MNH/aircraft_balloon.f90                | 50 +++++----------------
 src/MNH/diag.f90                            |  2 +-
 src/MNH/modeln.f90                          |  2 +-
 src/MNH/write_aircraft_balloon.f90          |  2 +-
 5 files changed, 15 insertions(+), 43 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index b9c92d64b..ff1782c84 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -2266,9 +2266,9 @@ 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
 
   class(tflyerdata), intent(in) :: tpflyer
 
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 5028e0d9f..068d03cb2 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -4,48 +4,18 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      #####################
-MODULE MODI_AIRCRAFT_BALLOON
+MODULE MODE_AIRCRAFT_BALLOON
 !      #####################
-!
-INTERFACE
-!
-      SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, 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)     :: 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
-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
-!
-!-------------------------------------------------------------------------------
-!
-END SUBROUTINE AIRCRAFT_BALLOON
-!
-SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE )
-  USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA
 
-  CLASS(TFLYERDATA), INTENT(IN)  :: TPFLYER
-  CHARACTER(LEN=*),  INTENT(OUT) :: HLONGTYPE
-END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET
+IMPLICIT NONE
 
-END INTERFACE
-!
-END MODULE MODI_AIRCRAFT_BALLOON
+PRIVATE
+
+PUBLIC :: AIRCRAFT_BALLOON
+
+PUBLIC :: AIRCRAFT_BALLOON_LONGTYPE_GET
+
+CONTAINS
 !
 !     #################################################################
       SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, PZ,                         &
@@ -192,3 +162,5 @@ if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) &
 HLONGTYPE = Trim( ytype )
 
 END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET
+
+END MODULE MODE_AIRCRAFT_BALLOON
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 59e39266e..abc759976 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -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
@@ -159,7 +160,6 @@ 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
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index e6dfee3dc..8d9b03f17 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -364,6 +364,7 @@ USE MODD_TURB_CLOUD,     ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI
 USE MODD_TURB_n
 USE MODD_VISCOSITY
 !
+USE MODE_AIRCRAFT_BALLOON
 use mode_budget,           only: Budget_store_init, Budget_store_end
 USE MODE_DATETIME
 USE MODE_ELEC_ll
@@ -393,7 +394,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
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 943c01bd3..decf8c040 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -125,12 +125,12 @@ 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_msg
 use mode_write_diachro,    only: Write_diachro
 
-use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
 TYPE(TFILEDATA),   INTENT(IN) :: TPDIAFILE ! file to write
 CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER
-- 
GitLab


From cdebdbb9126e50606d94d7e177fdc709bfdbf8d6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 5 Jan 2023 17:06:17 +0100
Subject: [PATCH 136/157] Philippe 05/01/2023: fix: DATETIME_DISTANCE: need 64
 bits integers computation for very distant dates

---
 src/MNH/mode_datetime.f90 | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index 5c73ea3ca..fdcde8e7e 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2018-2022 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.
@@ -8,6 +8,7 @@
 !  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
 !
@@ -141,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
@@ -158,7 +161,7 @@ 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
 !
-- 
GitLab


From 75f8de94c73ed900c7db0087aa3d507717dd0aef Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 11 Jan 2023 09:45:01 +0100
Subject: [PATCH 137/157] Juan 11/01/2023: bugfix: wrong message size in
 mpi_reduce of error values in IO_Field_write_byfield_X3

---
 src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index 07bf78a63..a597f1e47 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -1426,7 +1426,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)
-- 
GitLab


From 1d9bb4d62a203867529c08e3c2d42aec04ee3347 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 3 Jan 2023 13:21:56 +0100
Subject: [PATCH 138/157] Philippe 03/01/2023: correct intent of PDZX and PDZY
 variables (IN->INOUT) (modified by update_halo in contrav)

(cherry picked from commit 0b0270cc68158677a1bca971da0f644ee4ad6cac)
---
 src/MNH/advection_metsv.f90   |  8 +++++---
 src/MNH/advection_uvw.f90     | 10 ++++++----
 src/MNH/advection_uvw_cen.f90 |  8 +++++---
 src/MNH/conjgrad.f90          | 26 +++++++++++++-------------
 src/MNH/conresol.f90          | 31 +++++++++++++------------------
 src/MNH/conresolz.f90         | 32 +++++++++++++-------------------
 src/MNH/contrav.f90           | 10 +++++-----
 src/MNH/gdiv.f90              | 26 +++++++++++++-------------
 src/MNH/ini_elecn.f90         | 26 +++++++++++++-------------
 src/MNH/ini_field_elec.f90    | 26 +++++++++++++-------------
 src/MNH/lap_m.f90             | 26 +++++++++++++-------------
 src/MNH/pressure_in_prep.f90  | 22 +++++++++++-----------
 src/MNH/pressurez.f90         |  8 +++++---
 src/MNH/qlap.f90              | 26 +++++++++++++-------------
 src/MNH/richardson.f90        | 31 +++++++++++++------------------
 src/MNH/viscosity.f90         | 24 ++++++++++++------------
 16 files changed, 166 insertions(+), 174 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index ec9b54f0c..a0ef0da8c 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
@@ -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
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 64a497958..8b05aa480 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 62787ea59..ac9c7f56d 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/conjgrad.f90 b/src/MNH/conjgrad.f90
index 9adf9ed36..63c3cad9e 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 c0e103e9a..8b33d0dcc 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 3624bb2eb..358b78ea7 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 c890435f5..44e3b3333 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/gdiv.f90 b/src/MNH/gdiv.f90
index b22065908..dc77dde55 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/ini_elecn.f90 b/src/MNH/ini_elecn.f90
index 27ed168cd..1489ba1af 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 c5dcbb79a..49206a1d8 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/lap_m.f90 b/src/MNH/lap_m.f90
index f1936c828..5eceef4f0 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/pressure_in_prep.f90 b/src/MNH/pressure_in_prep.f90
index 6219e352f..e5d004e09 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 1f597f104..320351512 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/qlap.f90 b/src/MNH/qlap.f90
index 24c49ab38..4502200a9 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/richardson.f90 b/src/MNH/richardson.f90
index 492454276..7f80f4a6d 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/viscosity.f90 b/src/MNH/viscosity.f90
index 4a9607c8c..c909bd9b0 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
-- 
GitLab


From 31d55bf3fa1e80d6aed1d2c82ea6907f8846b6ad Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 12 Jan 2023 09:13:37 +0100
Subject: [PATCH 139/157] Philippe 12/01/2023: flyers: manage them only on the
 processes where they are physically located

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  16 +-
 src/MNH/aircraft_balloon.f90                | 831 ++++++++++++++++++--
 src/MNH/aircraft_balloon_evol.f90           | 354 +++------
 src/MNH/ini_aircraft.f90                    |  27 +-
 src/MNH/ini_aircraft_balloon.f90            | 430 ++++++----
 src/MNH/ini_balloon.f90                     |  89 ++-
 src/MNH/ini_modeln.f90                      |   6 +-
 src/MNH/modd_aircraft_balloon.f90           |  13 +-
 src/MNH/modeln.f90                          |   4 +-
 src/MNH/read_desfmn.f90                     |  15 +-
 src/MNH/write_aircraft_balloon.f90          | 108 ++-
 src/MNH/write_balloonn.f90                  |  43 +-
 src/MNH/write_diachro.f90                   |  20 +-
 src/MNH/write_lfin.f90                      |   3 +-
 14 files changed, 1383 insertions(+), 576 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index ff1782c84..1858061ac 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.
@@ -1861,12 +1861,22 @@ if ( tpfile%lmaster ) then
     end if
 
     if ( lflyer ) then
+      ! 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
-        call Write_flyer_time_coord( tballoons(ji)%tballoon )
+        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
-        call Write_flyer_time_coord( taircrafts(ji)%taircraft )
+        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
 
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 068d03cb2..f8ff487e0 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -1,12 +1,22 @@
-!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.
 !-----------------------------------------------------------------
+! 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 MODE_AIRCRAFT_BALLOON
 !      #####################
 
+USE MODE_MSG
+
 IMPLICIT NONE
 
 PRIVATE
@@ -15,6 +25,20 @@ 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
 !
 !     #################################################################
@@ -23,56 +47,15 @@ CONTAINS
                                   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
-!  P. Wautelet    06/2022: reorganize flyers
-! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
+! *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts
+
 USE MODD_AIRCRAFT_BALLOON
-!
 USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
-!
+
 USE MODE_AIRCRAFT_BALLOON_EVOL,      ONLY: AIRCRAFT_BALLOON_EVOL
-USE MODE_ll
-!
-!
+
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 !
@@ -98,36 +81,216 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: JI
+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)))
-!
-DO JI = 1, NBALLOONS
-  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
-                              PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TBALLOONS(JI)%TBALLOON, PSEA                             )
-END DO
+
+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
+
+!----------------------------------------------------------------------------
+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
-  CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
-                              PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TAIRCRAFTS(JI)%TAIRCRAFT, PSEA                           )
+  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
 !----------------------------------------------------------------------------
-!
-END SUBROUTINE AIRCRAFT_BALLOON
+!----------------------------------------------------------------------------
+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
+      CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH )
+      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: taircraftdata, tballoondata, TFLYERDATA
 
-USE MODE_MSG
+IMPLICIT NONE
 
 CLASS(TFLYERDATA), INTENT(IN)  :: TPFLYER
 CHARACTER(LEN=*),  INTENT(OUT) :: HLONGTYPE
@@ -162,5 +325,541 @@ if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) &
 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NSV * 2 + IKU * ( 9 + NRR * 2 ) )
+IF (  CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA )
+    IPACKSIZE = IPACKSIZE + 5 + 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%XP_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
+
+    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%XP_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
+
+    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 f38d3953a..26968c75e 100644
--- a/src/MNH/aircraft_balloon_evol.f90
+++ b/src/MNH/aircraft_balloon_evol.f90
@@ -1,8 +1,31 @@
-!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.
 !-----------------------------------------------------------------
+! 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 MODE_AIRCRAFT_BALLOON_EVOL
 !      ##########################
@@ -15,12 +38,17 @@ PRIVATE
 
 PUBLIC :: AIRCRAFT_BALLOON_EVOL
 
+PUBLIC :: AIRCRAFT_COMPUTE_POSITION
+
+PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED
+
 CONTAINS
 !     ########################################################
       SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP,               &
                        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            )
 !     ########################################################
 !
 !
@@ -68,60 +96,19 @@ CONTAINS
 !!    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
-!  P. Wautelet    06/2022: reorganize flyers
 !! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF,             ONLY: LCARTESIAN
-USE MODD_CST
-USE MODD_DIAG_IN_RUN
-USE MODD_GRID
-USE MODD_GRID_n
+USE MODD_CST,              ONLY: XCPD, XLVTT
 USE MODD_IO,               ONLY: ISP
-USE MODD_LUNIT_n,          ONLY: TLUOUT
-USE MODD_NESTING
-USE MODD_PARAMETERS
-USE MODD_PARAM_n,          ONLY: CCLOUD, CSURF
-USE MODD_REF_n,            ONLY: XRHODREF
-USE MODD_TIME,             only: TDTSEG
-USE MODD_TIME_n,           only: tdtcur
-USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
+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_NEST_ll,          ONLY: GET_MODEL_NUMBER_ll
 !
 IMPLICIT NONE
 !
@@ -146,7 +133,9 @@ 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
 !
-CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER! balloon/aircraft
+CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER ! balloon/aircraft
+INTEGER,                  INTENT(IN)     :: KRANK_CUR
+INTEGER,                  INTENT(OUT)    :: KRANK_NXT
 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !-------------------------------------------------------------------------------
@@ -155,36 +144,30 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
 !
 !
 INTEGER :: IMI        ! model index
-REAL    :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0
-!
 INTEGER :: IKB        ! vertical domain sizes
 INTEGER :: IKE
 INTEGER :: IKU
 !
-INTEGER :: JK         ! loop index
-!
 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))    :: 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))    :: 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
 !
 LOGICAL :: GLAUNCH  ! launch/takeoff is effective at this time-step (if true)
 LOGICAL :: GSTORE   ! storage occurs at this time step
+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 :: IDU      ! difference between II_U and II_M
-INTEGER :: IDV      ! difference between IJ_V and IJ_M
 !
 INTEGER :: IK00     ! balloon position for II_M  , IJ_M
 INTEGER :: IK01     ! balloon position for II_M  , IJ_M+1
@@ -218,18 +201,7 @@ 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
-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.
-REAL    :: ZRO_BAL  ! air density at balloon location
-!
-INTEGER :: IINFO_ll ! return code
 !
-INTEGER :: IMODEL
 REAL    :: ZTSTEP
 TYPE(DATE_TIME) :: TZNEXT ! Time for next position
 !----------------------------------------------------------------------------
@@ -237,6 +209,17 @@ IKU = SIZE(PZ,3)
 
 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?
@@ -249,20 +232,12 @@ SELECT TYPE ( TPFLYER )
         IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
           TPFLYER%LFLY     = .TRUE.
           TPFLYER%LTOOKOFF = .TRUE.
-
-          ! Compute current position
-          CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER )
-
-          ! Get rank of the process where the aircraft is and the model number
-          CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
         END IF
       END IF
     END IF TAKEOFF
 
-    IF ( IMI == TPFLYER%NMODEL ) THEN
-       !Do we have to store aircraft data?
-      CALL FLYER_CHECK_STORESTEP( TPFLYER )
-    END IF
+    !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
@@ -270,8 +245,6 @@ SELECT TYPE ( TPFLYER )
       ! 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
-          ZTHIS_PROC = 1.
-
           CALL FLYER_INTERP_TO_MASSPOINTS()
 
           ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
@@ -289,13 +262,8 @@ SELECT TYPE ( TPFLYER )
           CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
 
           CALL FLYER_RECORD_DATA( )
-        ELSE ISOWNERAIR
-          !Not owner branch
-          ZTHIS_PROC = 0.
         END IF ISOWNERAIR
 
-        CALL FLYER_COMMUNICATE_DATA( )
-
         ! Store has been done
         TPFLYER%LSTORE = .FALSE.
       END IF
@@ -325,23 +293,11 @@ SELECT TYPE ( TPFLYER )
       END IF
     END IF
 
+    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)
 
-    ! 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. TPFLYER%LPOSITION_INIT ) THEN
-      TPFLYER%LPOSITION_INIT = .TRUE.
-      ! Get rank of the process where the balloon is and the model number
-      CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH )
-      IF ( TPFLYER%LCRASH ) THEN
-        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) &
-                        // ': launch coordinates are outside of horizontal physical domain' )
-      END IF
-    END IF
-
     ! Launch?
     LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN
       ! Check if it is launchtime
@@ -352,15 +308,6 @@ SELECT TYPE ( TPFLYER )
         TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
         TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
         TPFLYER%TPOS_CUR = TDTCUR
-
-        ! Get rank of the process where the balloon is and the model number
-        CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
-        IF ( TPFLYER%LCRASH ) THEN
-          WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
-                              's (out of the horizontal boundaries)' )" ) &
-             TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
-          CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' )
-        END IF
       END IF LAUNCHTIME
     END IF LAUNCH
 
@@ -376,8 +323,6 @@ SELECT TYPE ( TPFLYER )
     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
-        ZTHIS_PROC = 1.
-
         CALL FLYER_INTERP_TO_MASSPOINTS()
 
         ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
@@ -423,23 +368,20 @@ SELECT TYPE ( TPFLYER )
 
           TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP
         END IF CRASH_VERT !end of no vertical crash branch
-      ELSE ISOWNERBAL
-        !The balloon is not present on this MPI process
-        ZTHIS_PROC = 0.
       END IF ISOWNERBAL
-
-      CALL FLYER_COMMUNICATE_DATA( )
     END IF INFLIGHTONMODEL
 
+    IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR
 END SELECT
 
-
 CONTAINS
-!
+
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON )
 
+USE MODD_CST, ONLY: XCPD, XP00, XRD
+
 IMPLICIT NONE
 
 CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
@@ -554,15 +496,23 @@ 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
 
@@ -668,11 +618,16 @@ END SUBROUTINE BALLOON_ADVECTION_HOR
 SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON )
 
 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
@@ -709,8 +664,14 @@ END SUBROUTINE BALLOON_ADVECTION_VER
 !----------------------------------------------------------------------------
 SUBROUTINE FLYER_INTERP_TO_MASSPOINTS()
 
+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
@@ -748,6 +709,8 @@ 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
@@ -767,6 +730,8 @@ END FUNCTION FLYER_COMPUTE_EXNER
 !----------------------------------------------------------------------------
 PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO )
 
+USE MODD_CST, ONLY: XRD, XRV
+
 USE MODI_WATER_SUM
 
 IMPLICIT NONE
@@ -795,6 +760,8 @@ 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
@@ -819,6 +786,9 @@ 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
@@ -950,7 +920,11 @@ 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_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
@@ -958,6 +932,7 @@ USE MODD_PARAM_LIMA_COLD,  ONLY: XAI_L => XAI, XBI_L => XBI, XLBEXS_L => XLBEXS,
                                  XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS
 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,           &
@@ -970,12 +945,18 @@ USE MODD_RAIN_ICE_DESCR,   ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I
                                  XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI,                                 &
                                  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
@@ -994,6 +975,9 @@ 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
+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
 
@@ -1350,101 +1334,6 @@ END DO
 END SUBROUTINE FLYER_RECORD_DATA
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
-SUBROUTINE FLYER_COMMUNICATE_DATA( )
-! Exchange of information between processes
-
-IMPLICIT NONE
-
-SELECT TYPE ( TPFLYER )
-  CLASS IS ( TBALLOONDATA)
-    IF ( TPFLYER%CMODEL == 'MOB' ) THEN
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
-    END IF
-    CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR)
-    CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY)
-    CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH)
-    CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR)
-    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR)
-    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH)
-    CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY)
-    CALL DISTRIBUTE_FLYER  (TPFLYER%TPOS_CUR%XTIME)
-
-    CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR)
-
-    IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT)
-    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR)
-    ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XRHO)
-    END IF
-
-END SELECT
-
-IF ( TPFLYER%LSTORE ) THEN
-  ! Data stored
-  ISTORE = TPFLYER%TFLYER_TIME%N_CUR
-
-  SELECT TYPE ( TPFLYER )
-    CLASS IS ( TBALLOONDATA)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH)
-      CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY)
-      CALL DISTRIBUTE_FLYER  (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME)
-  END SELECT
-
-  CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XX  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XY  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZ  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XW  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XP  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE))
-  DO JLOOP=1,SIZE(PR,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XR   (ISTORE,JLOOP))
-  END DO
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XSV  (ISTORE,JLOOP))
-  END DO
-  DO JLOOP=1,IKU
-    CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP))
-    DO JLOOP2=1,SIZE(PR,4)
-      CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2))
-    END DO
-    CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP))
-    IF (CCLOUD== 'LIMA' ) THEN
-      CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP))
-      CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP))
-    END IF
-    CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP))
-    CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP))
-  END DO
-  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE  (ISTORE))
-  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE))
-  IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XZS  (ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE))
-  CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE))
-  DO JLOOP=1,SIZE(PSV,4)
-    CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP))
-  END DO
-END IF
-
-END SUBROUTINE FLYER_COMMUNICATE_DATA
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
 FUNCTION FLYER_INTERP(PA) RESULT(PB)
 !
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
@@ -1566,51 +1455,6 @@ 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
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-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.
-ELSE
-  OA=.TRUE.
-END IF
-!
-END SUBROUTINE DISTRIBUTE_FLYER_L
-!----------------------------------------------------------------------------
-
 
 END SUBROUTINE AIRCRAFT_BALLOON_EVOL
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index b968be84d..331df58cf 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -1,4 +1,4 @@
-!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.
@@ -115,8 +115,6 @@ IMPLICIT NONE
 INTEGER :: JI
 TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT
 
-ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
-
 !Treat aircraft data read in namelist
 DO JI = 1, NAIRCRAFTS
     ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
@@ -129,7 +127,7 @@ DO JI = 1, NAIRCRAFTS
 
     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' )
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. )
   END IF
   TZAIRCRAFT%CTITLE = CTITLE(JI)
 
@@ -137,20 +135,21 @@ DO JI = 1, NAIRCRAFTS
     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' )
+      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) ) // ')' )
+                      '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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. )
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
@@ -161,21 +160,23 @@ DO JI = 1, NAIRCRAFTS
 
   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) ) )
+                        'problem with TLAUNCH (not set or incorrect values) for aircraft ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
   TZAIRCRAFT%TLAUNCH  = TLAUNCH(JI)
 
   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' )
+                    '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) ) )
+    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)
 
   IF ( NPOS(JI) < 2 ) THEN
-    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) )
+    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)
 
@@ -183,7 +184,7 @@ DO JI = 1, NAIRCRAFTS
 
   IF ( CFILE(JI) == '' ) &
     CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'name of CSV file with trajectory not provided for aircraft ' &
-                    // TRIM( CTITLE(JI) ) )
+                    // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
 
   ! Allocate trajectory data
   ALLOCATE( TZAIRCRAFT%XPOSTIME(TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSTIME(:) = XNEGUNDEF
@@ -252,7 +253,7 @@ END DO
 CLOSE( ILU )
 
 IF ( JI < TPAIRCRAFT%NPOS ) &
-  CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) )
+  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)
 
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 2b9ef0f6c..5fa73b17a 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -1,4 +1,4 @@
-!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.
@@ -13,20 +13,21 @@
 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,                    &
-                                      PTSTEP, TPDTSEG, PSEGLEN,     &
-                                      KRR, KSV, KKU, OUSETKE,       &
-                                      PLATOR, PLONOR                )
-!     ###############################################################
+!     ############################################################
+      SUBROUTINE INI_AIRCRAFT_BALLOON( TPINIFILE, PLATOR, PLONOR )
+!     ############################################################
 !
 !
 !!****  *INI_AIRCRAFT_BALLOON* -
@@ -67,22 +68,17 @@ CONTAINS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF
-USE MODD_DIAG_FLAG
-USE MODD_DYN_n
-use modd_field,      only: tfieldmetadata, 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_INI_AIRCRAFT
-USE MODE_INI_BALLOON
-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
 !
 !
 IMPLICIT NONE
@@ -90,13 +86,6 @@ 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
 !
@@ -105,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 :: JI
-TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !----------------------------------------------------------------------------
 !
 IMI=GET_CURRENT_MODEL_INDEX()
-ILUOUT = TLUOUT%NLU
 !----------------------------------------------------------------------------
 !
 !*      1.   Default values
@@ -123,165 +107,86 @@ 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 ( NAIRCRAFTS > 0 .OR. NBALLOONS > 0 ) LFLYER = .TRUE.
 !
 !----------------------------------------------------------------------------
 !
 !*      2.   Balloon initialization
 !            ----------------------
-IF (IMI == 1) CALL INI_BALLOON
-!
-DO JI = 1, NBALLOONS
-  CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON )
-END DO
+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
-!
-DO JI = 1, NAIRCRAFTS
-  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT )
-END DO
+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
-!
-DO JI = 1, NBALLOONS
-  CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
-END DO
-!
-DO JI = 1, NAIRCRAFTS
-  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT )
-END DO
+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 ALLOCATE_FLYER(TPFLYER)
-!
-USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF
-!
-CLASS(TFLYERDATA), 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%TFLYER_TIME%XTSTEP ) + 1
-ELSE
-  ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1
-ENDIF
-!
-IF (TPFLYER%NMODEL == 0) ISTORE=0
-IF (TPFLYER%NMODEL > 0) THEN
-  WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%CTITLE,' nmodel=',TPFLYER%NMODEL
-ENDIF
-!
-!
-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,KRR))
-ALLOCATE(TPFLYER%XSV  (ISTORE,KSV))
-ALLOCATE(TPFLYER%XRTZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%XRZ  (ISTORE,KKU,KRR))
-ALLOCATE(TPFLYER%XFFZ (ISTORE,KKU))
-ALLOCATE(TPFLYER%XIWCZ(ISTORE,KKU))
-ALLOCATE(TPFLYER%XLWCZ(ISTORE,KKU))
-ALLOCATE(TPFLYER%XCIZ (ISTORE,KKU))
-IF (CCLOUD=='LIMA') THEN
-  ALLOCATE(TPFLYER%XCCZ(ISTORE,KKU))
-  ALLOCATE(TPFLYER%XCRZ(ISTORE,KKU))
-ENDIF
-ALLOCATE(TPFLYER%XCRARE    (ISTORE,KKU))
-ALLOCATE(TPFLYER%XCRARE_ATT(ISTORE,KKU))
-ALLOCATE(TPFLYER%XWZ       (ISTORE,KKU))
-ALLOCATE(TPFLYER%XZZ       (ISTORE,KKU))
-IF (OUSETKE) 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,KSV))
-!
-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%XCIZ = XUNDEF
-IF (CCLOUD=='LIMA') THEN
-  TPFLYER%XCRZ = XUNDEF
-  TPFLYER%XCCZ = XUNDEF
-ENDIF
-TPFLYER%XIWCZ      = XUNDEF
-TPFLYER%XLWCZ      = XUNDEF
-TPFLYER%XCRARE     = XUNDEF
-TPFLYER%XCRARE_ATT = XUNDEF
-TPFLYER%XWZ        = XUNDEF
-TPFLYER%XZZ        = XUNDEF
-TPFLYER%XTKE       = XUNDEF
-TPFLYER%XTSRAD     = XUNDEF_SFX
-TPFLYER%XZS        = XUNDEF
-TPFLYER%XTKE_DISS  = XUNDEF
-!
-TPFLYER%XTHW_FLUX = XUNDEF
-TPFLYER%XRCW_FLUX = XUNDEF
-TPFLYER%XSVW_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_IO,            ONLY: ISP, TFILEDATA
+use modd_field,         only: tfieldmetadata, TYPEREAL
+USE MODD_IO,            ONLY: GSMONOPROC, ISP, TFILEDATA
 #ifdef MNH_IOCDF4
 USE MODD_MPIF
 USE MODD_PRECISION,     ONLY: CDFINT, CDFINT_MPI
@@ -291,11 +196,7 @@ use MODE_IO_FIELD_READ, only: IO_Field_read
 
 INTEGER,             INTENT(IN)    :: KNBR
 CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
-!
-!
-!
-!*      0.2  declaration of local variables
-!
+
 #ifdef MNH_IOCDF4
 INTEGER              :: IERR
 INTEGER(KIND=CDFINT) :: IGROUPID
@@ -303,19 +204,25 @@ INTEGER(KIND=CDFINT) :: ISTATUS
 INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts
 #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
 #ifdef MNH_IOCDF4
 TYPE(TFILEDATA) :: TZFILE
 #endif
+TYPE(TFIELDMETADATA) :: TZFIELD
 
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 
-LFLYER = .TRUE.
-
 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
@@ -536,11 +443,14 @@ ELSE IF ( CPROGRAM == 'DIAG  ' ) THEN
   END IF
 END IF
 
+! Restore correct value of GSMONOPROC
+GSMONOPROC = OMONOPROC_SAVE
+
 END SUBROUTINE INI_LAUNCH
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 SUBROUTINE INI_FLIGHT(KNBR,TPFLYER)
-!
+
 INTEGER,              INTENT(IN)    :: KNBR
 CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER
 
@@ -549,8 +459,6 @@ INTEGER :: JSEG   ! loop counter
 
 IF ( IMI /= TPFLYER%NMODEL ) RETURN
 
-LFLYER=.TRUE.
-
 ! 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)
@@ -602,4 +510,186 @@ END SUBROUTINE FLYER_TIMESTEP_CORRECT
 !
 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
+!
+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
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+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 7e268fb43..342eb5abf 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -1,4 +1,4 @@
-!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.
@@ -119,8 +119,6 @@ IMPLICIT NONE
 INTEGER :: JI
 TYPE(TBALLOONDATA), POINTER :: TZBALLOON
 
-ALLOCATE( TBALLOONS(NBALLOONS) )
-
 !Treat balloon data read in namelist
 DO JI = 1, NBALLOONS
   ALLOCATE( TBALLOONS(JI)%TBALLOON )
@@ -133,7 +131,7 @@ DO JI = 1, NBALLOONS
 
     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' )
+    CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. )
   END IF
   TZBALLOON%CTITLE = CTITLE(JI)
 
@@ -141,13 +139,14 @@ DO JI = 1, NBALLOONS
     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' )
+      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) ) // ')' )
+                      '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
@@ -155,7 +154,7 @@ DO JI = 1, NBALLOONS
   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' )
+    CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. )
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
@@ -166,23 +165,26 @@ DO JI = 1, NBALLOONS
 
   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) ) )
+                        '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) ) )
+    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) ) )
+    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' )
+                    '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) ) )
+    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)
@@ -192,17 +194,19 @@ DO JI = 1, NBALLOONS
       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' )
+        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) ) )
+                        '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.' )
+                        '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)
@@ -210,25 +214,28 @@ DO JI = 1, NBALLOONS
 
       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' )
+                        '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' )
+                        '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) ) )
+        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) ) )
+                        'diameter or volume not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
 
       IF ( XDIAMETER(JI) <= 0. ) THEN
         TZBALLOON%XVOLUME          = XVOLUME(JI)
@@ -238,23 +245,27 @@ DO JI = 1, NBALLOONS
         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) ) )
+                        '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) ) )
+                        '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) ) )
+                        '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' )
+                        'initial vertical speed is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', &
+                        OLOCAL = .TRUE. )
         XWASCENT(JI) = XNEGUNDEF
       END IF
       TZBALLOON%XWASCENT = XWASCENT(JI)
@@ -262,35 +273,37 @@ DO JI = 1, NBALLOONS
 
       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' )
+                        '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' )
+                        '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' )
+                        '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' )
+                        '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' )
+                        'volume is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
         XVOLUME(JI) = XNEGUNDEF
       END IF
       TZBALLOON%XVOLUME = XVOLUME(JI)
@@ -299,12 +312,13 @@ DO JI = 1, NBALLOONS
     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) ) )
+                        '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.' )
+                        'initial vertical speed not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 5.', &
+                        OLOCAL = .TRUE. )
         XWASCENT(JI) = 5.
       END IF
       TZBALLOON%XWASCENT = XWASCENT(JI)
@@ -312,7 +326,7 @@ DO JI = 1, NBALLOONS
       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' )
+                        // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
         XPRES(JI) = XNEGUNDEF
       END IF
       TZBALLOON%XAERODRAG = XAERODRAG(JI)
@@ -320,7 +334,7 @@ DO JI = 1, NBALLOONS
       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' )
+                        // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
         XAERODRAG(JI) = XNEGUNDEF
       END IF
       TZBALLOON%XAERODRAG = XAERODRAG(JI)
@@ -328,28 +342,29 @@ DO JI = 1, NBALLOONS
       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' )
+                        // 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' )
+                        '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' )
+                        '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' )
+                        'volume is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. )
         XVOLUME(JI) = XNEGUNDEF
       END IF
       TZBALLOON%XVOLUME = XVOLUME(JI)
@@ -357,7 +372,7 @@ DO JI = 1, NBALLOONS
 
     CASE DEFAULT
       CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'invalid balloon type (CTYPE=' &
-                      // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ) )
+                      // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. )
 
   END SELECT
 END DO
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 81161434a..902d21e1c 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.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.
@@ -2557,9 +2557,7 @@ 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 )
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 92d1ade55..9383f1451 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -1,4 +1,4 @@
-!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.
@@ -56,6 +56,8 @@ INTEGER, PARAMETER :: NCRASH_OUT_HORIZ = 1 ! Flyer is outside of horizontal doma
 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
@@ -90,7 +92,7 @@ TYPE :: TFLYERDATA
   REAL :: XY_CUR = XNEGUNDEF ! current y
   REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T)
   REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
-  INTEGER :: NRANK_CUR = NNEGUNDEF ! Rank of the process where the flyer is
+  INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is
   !
   !* data records
   !
@@ -121,8 +123,6 @@ TYPE :: TFLYERDATA
   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 :: XAER       ! Extinction at 550 nm
-  REAL, DIMENSION(:,:),   ALLOCATABLE :: XDST_WL    ! Extinction by wavelength
   REAL, DIMENSION(:),     ALLOCATABLE :: XZS        ! zs(n)
   REAL, DIMENSION(:),     ALLOCATABLE :: XTSRAD     ! Ts(n)
   !
@@ -190,5 +190,10 @@ TYPE(TAIRCRAFT_PTR), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics a
 
 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/modeln.f90 b/src/MNH/modeln.f90
index 8d9b03f17..a0d66c654 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.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.
@@ -2232,6 +2232,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/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index cc91eec5f..fb645f295 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.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.
@@ -268,6 +268,7 @@ USE MODN_PROFILER_n
 USE MODN_STATION_n
 !
 USE MODN_PARAM_LIMA
+! USE MODN_FLYERS
 !
 USE MODE_MSG
 USE MODE_POS
@@ -546,7 +547,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 +623,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
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index decf8c040..2284be8ea 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -1,4 +1,4 @@
-!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.
@@ -9,10 +9,13 @@ MODULE MODE_WRITE_AIRCRAFT_BALLOON
 
 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(
@@ -80,7 +83,9 @@ SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_IO,              ONLY: TFILEDATA
+USE MODD_IO,               ONLY: ISP, TFILEDATA
+!
+USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND
 !
 IMPLICIT NONE
 !
@@ -96,17 +101,100 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 INTEGER :: JI
 !
 !----------------------------------------------------------------------------
-!
+
 DO JI = 1, NBALLOONS
-  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON )
+  ! 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
 
 DO JI = 1, NAIRCRAFTS
-  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT )
+  ! The aircraft 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_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 )
 ! ############################################
@@ -128,7 +216,6 @@ 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_msg
 use mode_write_diachro,    only: Write_diachro
 
 
@@ -634,9 +721,8 @@ DEALLOCATE (CUNIT   )
 
 contains
 
-subroutine Add_profile( htitle, hcomment, hunits, pfield )
 
-use mode_msg
+subroutine Add_profile( htitle, hcomment, hunits, pfield )
 
 character(len=*),     intent(in) :: htitle
 character(len=*),     intent(in) :: hcomment
@@ -662,8 +748,6 @@ end subroutine Add_profile
 
 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
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 2b1b55417..6855ece50 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2001-2022 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.
@@ -44,7 +44,7 @@ CONTAINS
 !!
 !!    AUTHOR
 !!    ------
-!!  	G.Jaubert   *Meteo France* 
+!!  	G.Jaubert   *Meteo France*
 !!
 !!    MODIFICATIONS
 !!    -------------
@@ -57,9 +57,11 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, TBALLOONS
-USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, NRANKCUR_BALLOON, TBALLOONS
+USE MODD_IO,               ONLY: GSMONOPROC, ISP, TFILEDATA
 !
+USE MODE_AIRCRAFT_BALLOON,     ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND
+USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER
 !
 IMPLICIT NONE
 !
@@ -71,11 +73,42 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 !
 !
 INTEGER :: JI
+LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC
+
+! 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
-  IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON )
+  ! 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
+    IF ( TBALLOONS(JI)%TBALLOON%LFLY ) 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
 !-------------------------------------------------------------------------------
 
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 21be258ef..bde51d154 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1996-2022 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.
@@ -100,7 +100,7 @@ use modd_aircraft_balloon, only: tflyerdata
 use modd_budget,           only: tbudiachrometadata
 use modd_conf,             only: lpack
 use modd_field,            only: tfieldmetadata_base
-use modd_io,               only: tfiledata
+use modd_io,               only: gsmonoproc, tfiledata
 use modd_type_date,        only: date_time
 !
 IMPLICIT NONE
@@ -117,6 +117,7 @@ class(tflyerdata),                                  intent(in), optional :: tpfl
 !
 !*       0.1   Local variables
 !              ---------------
+logical :: omonoproc_save ! Copy of true value of gsmonoproc
 logical :: gpack
 !------------------------------------------------------------------------------
 
@@ -125,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 )
@@ -137,6 +147,12 @@ 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
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 1b48d9b9b..9daf40c08 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.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.
@@ -1795,6 +1795,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)
 !
 !
-- 
GitLab


From 08bbeaf468990aea42505ff145ffe97b1cb9accc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 Jan 2023 14:59:36 +0100
Subject: [PATCH 140/157] Philippe 13/01/2023: fix for LCHECK

---
 src/MNH/finalize_mnh.f90 | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/src/MNH/finalize_mnh.f90 b/src/MNH/finalize_mnh.f90
index faabb9972..e6000a55b 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()
-- 
GitLab


From 383c44f7538c6cfaa4799275e061acd66f42be98 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 Jan 2023 15:01:49 +0100
Subject: [PATCH 141/157] Philippe 13/01/2023: set NMODEL field for backup and
 output files

---
 src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 60cf44de0..3174a2947 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
-- 
GitLab


From 63c9aa0c3644f3ec6e760ca6cd903387b48b08c8 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 Jan 2023 16:01:12 +0100
Subject: [PATCH 142/157] Philippe 13/01/2023: IO_File_close: add optional
 dummy argument TPDTMODELN to force written model time

---
 src/LIB/SURCOUCHE/src/mode_io_file.f90      | 10 ++++++----
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 13 ++++++++++---
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90
index 6ed3a03c2..663059f07 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_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 1858061ac..f91733cdd 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -31,6 +31,7 @@
 !  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
@@ -1429,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
@@ -1472,6 +1473,7 @@ 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
@@ -1661,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
 
-- 
GitLab


From 30b3fe3d12991c901038a0095e05bf5db5c425bd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 Jan 2023 16:19:33 +0100
Subject: [PATCH 143/157] Philippe 13/01/2023: manage close of backup files
 outside of MODEL_n Useful to close them in reverse model order (child before
 parent) This is needed by WRITE_BALLOON_n (future commit)

---
 src/MNH/kid_model.f90 | 30 +++++++++++--------
 src/MNH/mesonh.f90    | 23 ++++++++++++---
 src/MNH/modeln.f90    | 69 ++++++++++++++++++++++---------------------
 3 files changed, 71 insertions(+), 51 deletions(-)

diff --git a/src/MNH/kid_model.f90 b/src/MNH/kid_model.f90
index 68fdb5dbc..44c18b9eb 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/mesonh.f90 b/src/MNH/mesonh.f90
index dd28504bb..a6053e6e9 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
 !
@@ -121,6 +125,8 @@ INTEGER       :: ITEMP_MODEL1                 ! loop increment
 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
 !
 #ifdef CPLOASIS
   CHARACTER(LEN=28)  :: CNAMELIST
@@ -190,7 +196,11 @@ 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, TZBAKFILE, TZDTMODELN, GEXIT )
+  IF ( TZBAKFILE%LOPENED ) THEN
+    CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+    NULLIFY( TZBAKFILE )
+  END IF
 END DO
 !
 IF(GEXIT) THEN
@@ -205,10 +215,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/modeln.f90 b/src/MNH/modeln.f90
index a0d66c654..e3227e2b5 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -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 
@@ -273,6 +278,8 @@ END MODULE MODI_MODEL_n
 !  P. Wautelet 19/02/2021: add NEGA2 term for SV budgets
 !  J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version)
 !  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
@@ -362,6 +369,7 @@ 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
@@ -460,8 +468,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
 !
@@ -551,16 +561,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)
@@ -968,12 +978,12 @@ 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 )
     IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN
       YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME
@@ -982,10 +992,10 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
       YDADNAME = 'DUMMY'
     END IF
     CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) )
-    TOUTDATAFILE => TZBAKFILE
-    CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
+    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
@@ -1000,7 +1010,7 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
       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
@@ -1011,11 +1021,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
@@ -1434,7 +1444,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      )
@@ -1609,7 +1619,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,               &
@@ -1711,7 +1721,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                                             )
@@ -1898,7 +1908,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,   &
@@ -1918,7 +1928,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,   &
@@ -2192,15 +2202,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
 !               --------------------
 !
-- 
GitLab


From e6ded4d68f6b5a0531e39f86a21479ab31de0e9d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 18 Jan 2023 10:40:29 +0100
Subject: [PATCH 144/157] Philippe 18/01/2023: balloons: write position in
 backup files for current and all ancestry models (at correct instant)

---
 src/MNH/write_balloonn.f90 | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 6855ece50..e20c046d5 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -62,6 +62,7 @@ USE MODD_IO,               ONLY: GSMONOPROC, ISP, TFILEDATA
 !
 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
 !
@@ -72,9 +73,12 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 !*       0.2   Declarations of local variables
 !
 !
+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)
@@ -95,8 +99,9 @@ DO JI = 1, NBALLOONS
       CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) )
     END IF
 
-    ! Write data
-    IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON )
+    ! 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
@@ -113,7 +118,7 @@ END SUBROUTINE WRITE_BALLOON_n
 !-------------------------------------------------------------------------------
 
 !-------------------------------------------------------------------------------
-SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER )
+RECURSIVE SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER )
 !
 #ifdef MNH_IOCDF4
 use NETCDF,              only: NF90_DEF_GRP, NF90_GLOBAL, NF90_INQ_NCID, NF90_NOERR, NF90_PUT_ATT
@@ -126,7 +131,9 @@ 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
 #ifdef MNH_IOCDF4
@@ -136,10 +143,7 @@ use mode_msg
 
 TYPE(TFILEDATA),    INTENT(IN) :: TPFILE ! File characteristics
 TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER
-!
-!
-!*       0.2   Declarations of local variables
-!
+
 #ifdef MNH_IOCDF4
 integer(kind=CDFINT) :: igroupid
 integer(kind=CDFINT) :: istatus
@@ -149,6 +153,22 @@ 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
-- 
GitLab


From 555f607a579d561092031fd205e6b0b55703230a Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 18 Jan 2023 13:27:58 +0100
Subject: [PATCH 145/157] Philippe 18/01/2023: bugfix: correct pack size for
 flyer communications

---
 src/MNH/aircraft_balloon.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index f8ff487e0..4311c5406 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -256,7 +256,7 @@ END IF
 
 CALL BALLOONS_MOVE_TO_NEW_RANKS()
 
-END SUBROUTINE BALLOONS_INIT_POSITIONs
+END SUBROUTINE BALLOONS_INIT_POSITIONS
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS()
@@ -372,7 +372,7 @@ ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR
 
 ! 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NSV * 2 + IKU * ( 9 + NRR * 2 ) )
+IPACKSIZE = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) )
 IF (  CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2
 
 SELECT TYPE ( TPFLYER )
-- 
GitLab


From 352773749d32e0a37eaddf99ded21b14595311b5 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 18 Jan 2023 14:33:49 +0100
Subject: [PATCH 146/157] Philippe 18/01/2023: bugfix: close backup files in
 the correct order for the first temporal iteration This solves crash in case
 of model restart with balloons

---
 src/MNH/mesonh.f90 | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90
index a6053e6e9..ad132c941 100644
--- a/src/MNH/mesonh.f90
+++ b/src/MNH/mesonh.f90
@@ -120,13 +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
@@ -192,17 +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, TZBAKFILE, TZDTMODELN, 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
-- 
GitLab


From 3fb6fc48df20fe9344617ff5d3bb6990090758c6 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 18 Jan 2023 16:11:54 +0100
Subject: [PATCH 147/157] Philippe 18/01/2023: balloons: modify restart for
 balloons to work correctly

---
 src/MNH/aircraft_balloon.f90     |  7 ++++++-
 src/MNH/ini_aircraft_balloon.f90 | 14 +++++---------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 4311c5406..5027747f5 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -240,7 +240,12 @@ IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
     IF ( .NOT. TZBALLOON%LPOSITION_INIT ) THEN
       TZBALLOON%LPOSITION_INIT = .TRUE.
       ! Get rank of the process where the balloon is and the model number
-      CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH )
+      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' )
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 5fa73b17a..61e634973 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -188,9 +188,9 @@ USE NETCDF,             ONLY: NF90_INQ_NCID, NF90_NOERR
 use modd_field,         only: tfieldmetadata, TYPEREAL
 USE MODD_IO,            ONLY: GSMONOPROC, ISP, TFILEDATA
 #ifdef MNH_IOCDF4
-USE MODD_MPIF
-USE MODD_PRECISION,     ONLY: CDFINT, CDFINT_MPI
+USE MODD_PRECISION,     ONLY: CDFINT
 #endif
+USE MODD_TIME_n,        ONLY: TDTCUR
 
 use MODE_IO_FIELD_READ, only: IO_Field_read
 
@@ -198,10 +198,8 @@ INTEGER,             INTENT(IN)    :: KNBR
 CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER
 
 #ifdef MNH_IOCDF4
-INTEGER              :: IERR
 INTEGER(KIND=CDFINT) :: IGROUPID
 INTEGER(KIND=CDFINT) :: ISTATUS
-INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts
 #endif
 INTEGER :: IMODEL
 INTEGER :: IRESP  ! return code
@@ -306,12 +304,9 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
 #ifdef MNH_IOCDF4
   ELSE
     ! Read in netCDF file (new structure since MesoNH 5.6)
-    IF ( ISP == TPINIFILE%NMASTER_RANK ) ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID )
+    IF ( ISP /= TPINIFILE%NMASTER_RANK )  CALL PRINT_MSG( NVERB_ERROR, 'IO', 'INI_LAUNCH', 'process is not the file master process')
 
-    IDATA(:) = [ ISTATUS, IGROUPID ] ! Merge 2 broadcasts into 1
-    CALL MPI_BCAST( IDATA, SIZE( IDATA ), CDFINT_MPI, TPINIFILE%NMASTER_RANK - 1, TPINIFILE%NMPICOMM, IERR )
-    ISTATUS  = IDATA(1)
-    IGROUPID = IDATA(2)
+    ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID )
 
     IF ( ISTATUS == NF90_NOERR ) THEN
       GREAD = .TRUE.
@@ -393,6 +388,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
     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
-- 
GitLab


From 663e511ce410856548336b80fad714e9f4149fbc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 19 Jan 2023 11:09:57 +0100
Subject: [PATCH 148/157] Philippe 19/01/2023: flyers: move XP_CUR from
 TFLYERDATA to TAIRCRAFTDATA

---
 src/MNH/aircraft_balloon.f90      | 9 +++++----
 src/MNH/ini_aircraft_balloon.f90  | 4 ----
 src/MNH/modd_aircraft_balloon.f90 | 4 ++--
 3 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index 5027747f5..3f7e8384f 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -377,12 +377,12 @@ ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR
 
 ! 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) )
+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 + 5 + TPFLYER%NPOS * 6
+    IPACKSIZE = IPACKSIZE + 6 + TPFLYER%NPOS * 6
 
   CLASS IS ( TBALLOONDATA )
     IPACKSIZE = IPACKSIZE + 15
@@ -463,7 +463,6 @@ 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%XP_CUR; IPOS = IPOS + 1
 
 ZPACK(IPOS) = TPFLYER%NRANK_CUR; IPOS = IPOS + 1
 
@@ -532,6 +531,7 @@ SELECT TYPE ( TPFLYER )
 
     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
 
@@ -738,7 +738,6 @@ 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%XP_CUR = ZPACK(IPOS); IPOS = IPOS + 1
 
 TPFLYER%NRANK_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1
 
@@ -808,6 +807,8 @@ SELECT TYPE ( TPFLYER )
     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) )
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 61e634973..48f7b1e22 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -273,8 +273,6 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
         LTIMEDEP   = .TRUE.                       )
       CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XZ_CUR)
 
-      TPFLYER%XP_CUR   = XUNDEF
-
       TZFIELD = TFIELDMETADATA(                       &
         CMNHNAME   = TRIM(TPFLYER%CTITLE)//'WASCENT', &
         CSTDNAME   = '',                              &
@@ -353,8 +351,6 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' )
         LTIMEDEP   = .TRUE.      )
       CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XZ_CUR)
 
-      TPFLYER%XP_CUR   = XUNDEF
-
       TZFIELD = TFIELDMETADATA(               &
         CMNHNAME   = 'WASCENT',               &
         CSTDNAME   = '',                      &
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 9383f1451..98bbd34ed 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -68,7 +68,7 @@ TYPE :: TFLYERDATA
                                      ! '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
+  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
@@ -91,7 +91,6 @@ TYPE :: TFLYERDATA
   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)
-  REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F)
   INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is
   !
   !* data records
@@ -150,6 +149,7 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA
   !* 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
-- 
GitLab


From 93d26ea06930e7483b4220b91200bb4ddd09a42c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 19 Jan 2023 14:04:49 +0100
Subject: [PATCH 149/157] Philippe 19/01/2023: flyers: write X and Y (flyer
 horizontal position) only in shape level 'Point' (and not 'Vertical_profile'
 anymore)

---
 src/MNH/write_diachro.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index bde51d154..3a45d50f9 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -1509,7 +1509,7 @@ 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
-- 
GitLab


From a0e4c900b6f60a68b1f8dc9df1b0748d17fcefbb Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 19 Jan 2023 14:45:56 +0100
Subject: [PATCH 150/157] Philippe 19/01/2023: backward compatibility fix: set
 DRYMASSS to 0. if not found in restart file (needed to restart with pre 5.5.1
 backup files)

---
 src/MNH/read_field.f90 | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 1a40d1797..ce75a05f3 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.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.
@@ -1007,7 +1007,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
-- 
GitLab


From 1e32775ddc2d4f91516c7da6564701cc68959c25 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 19 Jan 2023 15:43:50 +0100
Subject: [PATCH 151/157] Philippe 19/01/2023: bugfix for ForeFire: solve
 ForeFire scalar variables not read in grid nested restarted runs

---
 src/MNH/write_desfmn.f90 | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index e7a777d64..1613eb4bc 100644
--- a/src/MNH/write_desfmn.f90
+++ b/src/MNH/write_desfmn.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.
@@ -148,12 +148,16 @@ END MODULE MODI_WRITE_DESFM_n
 !!                     E.Jezequel     02/2021  add stations read from CSV file
 !  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
+#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
@@ -206,7 +210,6 @@ 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
@@ -407,7 +410,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(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP)
 IF(LORILAM.AND.LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_ORILAM)
-- 
GitLab


From 1a59e43164f03d5e2e56077f3ff00b8913b3a141 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:20:12 +0100
Subject: [PATCH 152/157] Philippe 20/01/2023: upgrade libaec to version v1.0.6

---
 src/LIB/libaec-v1.0.6.tar.gz | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 src/LIB/libaec-v1.0.6.tar.gz

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 000000000..9a4e3c40c
--- /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
-- 
GitLab


From b9f814ed470fb41dbd0d19a116401a8397375e5c Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:20:37 +0100
Subject: [PATCH 153/157] Philippe 20/01/2023: upgrade HDF5 to version 1.14.0

---
 src/LIB/hdf5-1.14.0.tar.gz | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 src/LIB/hdf5-1.14.0.tar.gz

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 000000000..14467a663
--- /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
-- 
GitLab


From 2d8bbca474615c74c223a8b212a9660d30d080b4 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:20:59 +0100
Subject: [PATCH 154/157] Philippe 20/01/2023: upgrade netCDF-C to version
 4.9.0

---
 src/LIB/netcdf-c-4.9.0.tar.gz | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 src/LIB/netcdf-c-4.9.0.tar.gz

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 000000000..6ee47e081
--- /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
-- 
GitLab


From e14a400fd4f97eea6829032820e936eef2288940 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:21:19 +0100
Subject: [PATCH 155/157] Philippe 20/01/2023: upgrade netCDF-Fortran to
 version 4.6.0

---
 src/LIB/netcdf-fortran-4.6.0.tar.gz | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 src/LIB/netcdf-fortran-4.6.0.tar.gz

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 000000000..acc4addf3
--- /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
-- 
GitLab


From d3c148fa8b6441a1589827373634ffa91d357186 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:30:31 +0100
Subject: [PATCH 156/157] Philippe 20/01/2023: compile new versions of libaec,
 HDF5 and netCDF

---
 src/Makefile  |  4 ++--
 src/configure | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index d996ff973..eeb9a0c77 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" && \
diff --git a/src/configure b/src/configure
index 1b807d8b8..ef21a7b0c 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/"}
-- 
GitLab


From eff3959274550799e4bfd4ad91bfbfd949688515 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 20 Jan 2023 10:34:14 +0100
Subject: [PATCH 157/157] Philippe 20/01/2023: remove old libaec, HDF5 and
 netCDF versions

---
 src/LIB/hdf5-1.12.0.tar.gz          | 3 ---
 src/LIB/libaec-0.3.4.tar.gz         | 3 ---
 src/LIB/netcdf-c-4.7.4.tar.gz       | 3 ---
 src/LIB/netcdf-fortran-4.5.3.tar.gz | 3 ---
 4 files changed, 12 deletions(-)
 delete mode 100644 src/LIB/hdf5-1.12.0.tar.gz
 delete mode 100644 src/LIB/libaec-0.3.4.tar.gz
 delete mode 100644 src/LIB/netcdf-c-4.7.4.tar.gz
 delete mode 100644 src/LIB/netcdf-fortran-4.5.3.tar.gz

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 b61a243e0..000000000
--- 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/libaec-0.3.4.tar.gz b/src/LIB/libaec-0.3.4.tar.gz
deleted file mode 100644
index f35f3df1a..000000000
--- 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/netcdf-c-4.7.4.tar.gz b/src/LIB/netcdf-c-4.7.4.tar.gz
deleted file mode 100644
index e0062fbd7..000000000
--- 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-fortran-4.5.3.tar.gz b/src/LIB/netcdf-fortran-4.5.3.tar.gz
deleted file mode 100644
index 8533eec91..000000000
--- 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
-- 
GitLab