From f7adf0aae5b91e14ea1ccc41613e92dd857e0137 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 15 May 2017 16:30:10 +0200
Subject: [PATCH] Philippe 15/05/2017: IO: end of replacements of FMWRIT calls
 by IO_WRITE_FIELD calls

---
 src/LIB/SURCOUCHE/src/mode_field.f90   | 134 +++++-
 src/MNH/compute_r00.f90                |  98 +++--
 src/MNH/goto_model_wrapper.f90         |   4 +-
 src/MNH/modd_deep_convectionn.f90      | 125 ++----
 src/MNH/write_budget.f90               |  19 +-
 src/MNH/write_diachro.f90              |   4 +-
 src/MNH/write_lfifm1_for_diag_supp.f90 | 545 +++++++++++++------------
 src/MNH/write_surf_mnh.f90             |  42 +-
 8 files changed, 532 insertions(+), 439 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 667862b5a..376b78821 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -12,7 +12,7 @@ USE MODE_MSG
 !
 IMPLICIT NONE
 !
-INTEGER,PRIVATE,PARAMETER :: MAXFIELDS = 200
+INTEGER,PRIVATE,PARAMETER :: MAXFIELDS = 250
 INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5
 !
 TYPE TFIELDPTR_C0D
@@ -2051,7 +2051,7 @@ TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: DIRFLASWD'
 TFIELDLIST(IDX)%CUNITS     = 'W m-2'
 TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Long Waves on FLAT surface'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Short Waves on FLAT surface'
 TFIELDLIST(IDX)%NGRID      = 1
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
@@ -2064,7 +2064,7 @@ TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: SCAFLASWD'
 TFIELDLIST(IDX)%CUNITS     = 'W m-2'
 TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SCAttered Downward Long Waves on FLAT surface'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SCAttered Downward Short Waves on FLAT surface'
 TFIELDLIST(IDX)%NGRID      = 1
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
@@ -2077,7 +2077,7 @@ TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: DIRSRFSWD'
 TFIELDLIST(IDX)%CUNITS     = 'W m-2'
 TFIELDLIST(IDX)%CDIR       = 'XY'
-TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Long Waves'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect Downward Short Waves'
 TFIELDLIST(IDX)%NGRID      = 1
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
@@ -2127,7 +2127,7 @@ IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'DIR_ALB'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: DIR_ALB'
-TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CUNITS     = '1'
 TFIELDLIST(IDX)%CDIR       = 'XY'
 TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_DIRect ALBedo'
 TFIELDLIST(IDX)%NGRID      = 1
@@ -2140,7 +2140,7 @@ IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'SCA_ALB'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: SCA_ALB'
-TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CUNITS     = '1'
 TFIELDLIST(IDX)%CDIR       = 'XY'
 TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_SCAttered ALBedo'
 TFIELDLIST(IDX)%NGRID      = 1
@@ -2153,7 +2153,7 @@ IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'EMIS'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: EMIS'
-TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CUNITS     = '1'
 TFIELDLIST(IDX)%CDIR       = 'XY'
 TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_EMISsivity'
 TFIELDLIST(IDX)%NGRID      = 1
@@ -2285,6 +2285,84 @@ 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  = 'MesoNH: 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
+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  = 'MesoNH: 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
+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  = 'MesoNH: 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
+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  = 'MesoNH: 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
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'DMFCONV'
+TFIELDLIST(IDX)%CSTDNAME   = 'X_Y_Downdraft Convective Mass Flux'
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: DMFCONV'
+TFIELDLIST(IDX)%CUNITS     = 'kg s-1 m-2'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = ''
+TFIELDLIST(IDX)%NGRID      = 4
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+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  = 'MesoNH: 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
+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  = 'MesoNH: CAPE'
@@ -2298,6 +2376,32 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'CLTOPCONV'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: CLTOPCONV'
+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
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'CLBASCONV'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: CLBASCONV'
+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
+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  = 'MesoNH: IC_RATE'
@@ -3462,7 +3566,15 @@ IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM
   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',  IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLTOPCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV',  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
@@ -3854,7 +3966,15 @@ IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM
   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',  IID,IRESP); NCLTOPCONV       => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV',  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
diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90
index 7425b458a..a537e5e55 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -79,6 +79,7 @@ USE MODI_SHUMAN
 !
 USE MODD_VAR_ll
 !
+USE MODE_FIELD
 USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_FMREAD
@@ -102,7 +103,6 @@ INTEGER  :: ININAR               ! number of articles  present in
 INTEGER  :: ITYPE                ! type of file (conv2dia and transfer)
 !
 CHARACTER(LEN=100)                 :: YCOMMENT
-CHARACTER(LEN=28)                  :: YFMFILE ! Name of FM-file to write
 CHARACTER(LEN=16)                  :: YRECFM
 INTEGER                            :: IFILECUR,JFILECUR,NIU,NJU,NKU,IGRID,ILENCH
 INTEGER                            :: NFILES,JLOOP
@@ -126,6 +126,7 @@ INTEGER                            :: INBR_START
 REAL                               :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
 INTEGER, DIMENSION(100)            :: NBRFILES 
 INTEGER                            :: IKU
+TYPE(TFIELDDATA)                   :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -136,8 +137,6 @@ ITYPE=2
 ZSPVAL=-1.E+11
 IKU=SIZE(XZHAT)
 !
-YFMFILE = TPFILE%CNAME
-!
 !-------------------------------------------------------------------------------
 !
 !*       2.0    FIND THE FILE TO BE TREATED AND THE INIT-SV FILES
@@ -297,31 +296,42 @@ DO JFILECUR=1,NFILES
 !             computing the new origin
 !
   IF (GSTART) THEN
-    IGRID=1
     PRINT *,'INBR_START',INBR_START,' NBRFILES(JFILECUR)',NBRFILES(JFILECUR)
-    WRITE(YRECFM,'(A2,I2.2)')'X0',INBR_START
-    WRITE(YCOMMENT,'(A8,I2.2)')'X_Y_Z_X0',INBR_START
-    YCOMMENT=YCOMMENT(1:10)//YDATE//' (KM)'
-    PRINT *,'YCOMMENT = ',YCOMMENT
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZX00(:,:,:),IGRID,ILENCH,   &
-                YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'X0',INBR_START
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'km'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZX00(:,:,:))
     !
-    WRITE(YRECFM,'(A2,I2.2)')'Y0',INBR_START
-    WRITE(YCOMMENT,'(A8,I2.2)')'X_Y_Z_Y0',INBR_START
-    YCOMMENT=YCOMMENT(1:10)//YDATE//' (KM)'
-    PRINT *,'YCOMMENT = ',YCOMMENT
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZY00(:,:,:),IGRID,ILENCH,   &
-                YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Y0',INBR_START
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'km'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZY00(:,:,:))
     !
-    WRITE(YRECFM,'(A2,I2.2)')'Z0',INBR_START
-    WRITE(YCOMMENT,'(A8,I2.2)')'X_Y_Z_Z0',INBR_START
-    YCOMMENT=YCOMMENT(1:10)//YDATE//' (KM)'
-    PRINT *,'YCOMMENT = ',YCOMMENT
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZZ00(:,:,:),IGRID,ILENCH,   &
-                YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Z0',INBR_START
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'km'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZZ00(:,:,:))
   END IF
 !
 !
@@ -339,23 +349,29 @@ DO JFILECUR=1,NFILES
 !
   IF (GSTART) THEN
     !
-    WRITE(YRECFM,'(A3,I2.2)')'TH0',INBR_START
-    WRITE(YCOMMENT,'(A9,I2.2)')'X_Y_Z_TH0',INBR_START
-    YCOMMENT=YCOMMENT(1:11)//YDATE//' (K)'
-    PRINT *,'YCOMMENT = ',YCOMMENT
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',   &
-                ZWORK1(:,:,:),IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'TH0',INBR_START
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK1(:,:,:))
     !
-    WRITE(YRECFM,'(A3,I2.2)')'RV0',INBR_START
-    WRITE(YCOMMENT,'(A9,I2.2)')'X_Y_Z_RV0',INBR_START
-    YCOMMENT=YCOMMENT(1:11)//YDATE//' (G/KG)'
-    PRINT *,'YCOMMENT = ',YCOMMENT
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',   &
-                ZWORK2(:,:,:),IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'RV0',INBR_START
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'g kg-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE
+    PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT)
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK2(:,:,:))
   ENDIF
 !*       4.4   compute the origin of the particules using one more segment
 !
diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index de8216031..cc4c35b41 100644
--- a/src/MNH/goto_model_wrapper.f90
+++ b/src/MNH/goto_model_wrapper.f90
@@ -39,7 +39,7 @@ USE MODD_CLOUDPAR_n
 USE MODD_CLOUD_MF_n
 USE MODD_CONF_n
 USE MODD_CURVCOR_n
-USE MODD_DEEP_CONVECTION_n
+!USE MODD_DEEP_CONVECTION_n
 USE MODD_DIM_n
 USE MODD_DUMMY_GR_FIELD_n
 USE MODD_DYN_n
@@ -135,7 +135,7 @@ CALL CLOUDPAR_GOTO_MODEL(KFROM, KTO)
 CALL CLOUD_MF_GOTO_MODEL(KFROM, KTO)
 CALL CONF_GOTO_MODEL(KFROM, KTO)
 CALL CURVCOR_GOTO_MODEL(KFROM, KTO)
-CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO)
+!CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO)
 CALL DIM_GOTO_MODEL(KFROM, KTO)
 CALL DUMMY_GR_FIELD_GOTO_MODEL(KFROM, KTO)
 CALL DYN_GOTO_MODEL(KFROM, KTO)
diff --git a/src/MNH/modd_deep_convectionn.f90 b/src/MNH/modd_deep_convectionn.f90
index b86efd55f..a4311353c 100644
--- a/src/MNH/modd_deep_convectionn.f90
+++ b/src/MNH/modd_deep_convectionn.f90
@@ -43,112 +43,39 @@
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 
-TYPE DEEP_CONVECTION_t
-!
-!  INTEGER, DIMENSION(:,:),POINTER :: NCOUNTCONV=>NULL()! convective counter used
-!                                                      ! to refresh the
-!                                                      ! convective tendencies
-!  REAL, DIMENSION(:,:,:) ,POINTER :: XDTHCONV=>NULL()  ! convective TH tendency (K/s)
-!  REAL, DIMENSION(:,:,:) ,POINTER :: XDRVCONV=>NULL()  ! convective r_v tendency (1/s)
-!  REAL, DIMENSION(:,:,:) ,POINTER :: XDRCCONV=>NULL()  ! convective r_c tendency (1/s)
-!  REAL, DIMENSION(:,:,:) ,POINTER :: XDRICONV=>NULL()  ! convective r_i tendency (1/s)
-!  REAL, DIMENSION(:,:)   ,POINTER :: XPRCONV=>NULL()   ! total precipitation rate (m/s)
-!  REAL, DIMENSION(:,:)   ,POINTER :: XPRSCONV=>NULL()  ! solid precipitation rate (m/s)
-!  REAL, DIMENSION(:,:)   ,POINTER :: XPACCONV=>NULL()  ! accumulated convective
-!                                                      ! precipitation (m)
-  REAL, DIMENSION(:,:,:,:),POINTER ::XDSVCONV=>NULL()  ! tracer tendencies (1/s)
-! diagnostic variables
-  REAL, DIMENSION(:,:,:) ,POINTER :: XUMFCONV=>NULL()  ! updraft mass flux (kg/s m2)
-  REAL, DIMENSION(:,:,:) ,POINTER :: XDMFCONV=>NULL()  ! downdraft mass flux (kg/s m2)
-  REAL, DIMENSION(:,:,:) ,POINTER :: XMFCONV=>NULL()   ! convective mass flux (kg/s m2)
-  REAL, DIMENSION(:,:,:) ,POINTER ::XPRLFLXCONV=>NULL()! liquid precip flux (m/s)
-  REAL, DIMENSION(:,:,:) ,POINTER ::XPRSFLXCONV=>NULL()! solid  precip flux (m/s)
-!  REAL, DIMENSION(:,:)   ,POINTER :: XCAPE=>NULL()     ! CAPE (J/kg)
-  INTEGER,DIMENSION(:,:), POINTER :: NCLTOPCONV=>NULL()! convective cloud top level
-  INTEGER,DIMENSION(:,:), POINTER :: NCLBASCONV=>NULL()! convective cloud base level
-!
-!  REAL, DIMENSION(:,:) ,  POINTER :: XIC_RATE=>NULL()  ! IC lightning frequency
-!  REAL, DIMENSION(:,:) ,  POINTER :: XCG_RATE=>NULL()  ! CG lightning frequency
-!  REAL, DIMENSION(:,:) ,  POINTER :: XIC_TOTAL_NUMBER=>NULL()  !Total number of IC
-!  REAL, DIMENSION(:,:) ,  POINTER :: XCG_TOTAL_NUMBER=>NULL()  !Total number of CG
-
-END TYPE DEEP_CONVECTION_t
-
-TYPE(DEEP_CONVECTION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DEEP_CONVECTION_MODEL
+INTEGER, DIMENSION(:,:),POINTER :: NCOUNTCONV=>NULL()  ! convective counter used
+                                                       ! to refresh the
+                                                       ! convective tendencies
+REAL, DIMENSION(:,:,:) ,POINTER :: XDTHCONV=>NULL()    ! convective TH tendency (K/s)
+REAL, DIMENSION(:,:,:) ,POINTER :: XDRVCONV=>NULL()    ! convective r_v tendency (1/s)
+REAL, DIMENSION(:,:,:) ,POINTER :: XDRCCONV=>NULL()    ! convective r_c tendency (1/s)
+REAL, DIMENSION(:,:,:) ,POINTER :: XDRICONV=>NULL()    ! convective r_i tendency (1/s)
+REAL, DIMENSION(:,:)   ,POINTER :: XPRCONV=>NULL()     ! total precipitation rate (m/s)
+REAL, DIMENSION(:,:)   ,POINTER :: XPRSCONV=>NULL()    ! solid precipitation rate (m/s)
+REAL, DIMENSION(:,:)   ,POINTER :: XPACCONV=>NULL()    ! accumulated convective
+                                                       ! precipitation (m)
+REAL, DIMENSION(:,:,:,:),POINTER ::XDSVCONV=>NULL()    ! tracer tendencies (1/s)
+!diagnostic variables
+REAL, DIMENSION(:,:,:) ,POINTER :: XUMFCONV=>NULL()    ! updraft mass flux (kg/s m2)
+REAL, DIMENSION(:,:,:) ,POINTER :: XDMFCONV=>NULL()    ! downdraft mass flux (kg/s m2)
+REAL, DIMENSION(:,:,:) ,POINTER :: XMFCONV=>NULL()     ! convective mass flux (kg/s m2)
+REAL, DIMENSION(:,:,:) ,POINTER :: XPRLFLXCONV=>NULL() ! liquid precip flux (m/s)
+REAL, DIMENSION(:,:,:) ,POINTER :: XPRSFLXCONV=>NULL() ! solid  precip flux (m/s)
+REAL, DIMENSION(:,:)   ,POINTER :: XCAPE=>NULL()       ! CAPE (J/kg)
+INTEGER,DIMENSION(:,:), POINTER :: NCLTOPCONV=>NULL()  ! convective cloud top level
+INTEGER,DIMENSION(:,:), POINTER :: NCLBASCONV=>NULL()  ! convective cloud base level
 
-INTEGER, DIMENSION(:,:),POINTER :: NCOUNTCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XDTHCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XDRVCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XDRCCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XDRICONV=>NULL()
-REAL, DIMENSION(:,:)   ,POINTER :: XPRCONV=>NULL()
-REAL, DIMENSION(:,:)   ,POINTER :: XPRSCONV=>NULL()
-REAL, DIMENSION(:,:)   ,POINTER :: XPACCONV=>NULL()
-REAL, DIMENSION(:,:,:,:),POINTER :: XDSVCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XUMFCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XDMFCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XMFCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XPRLFLXCONV=>NULL()
-REAL, DIMENSION(:,:,:) ,POINTER :: XPRSFLXCONV=>NULL()
-REAL, DIMENSION(:,:)   ,POINTER :: XCAPE=>NULL()
-INTEGER,DIMENSION(:,:), POINTER :: NCLTOPCONV=>NULL()
-INTEGER,DIMENSION(:,:), POINTER :: NCLBASCONV=>NULL()
-REAL, DIMENSION(:,:) ,POINTER   :: XIC_RATE=>NULL()
-REAL, DIMENSION(:,:) ,POINTER   :: XCG_RATE=>NULL()
-REAL, DIMENSION(:,:) ,POINTER   :: XIC_TOTAL_NUMBER=>NULL()
-REAL, DIMENSION(:,:) ,POINTER   :: XCG_TOTAL_NUMBER=>NULL()
+REAL, DIMENSION(:,:) ,  POINTER :: XIC_RATE=>NULL()          ! IC lightning frequency
+REAL, DIMENSION(:,:) ,  POINTER :: XCG_RATE=>NULL()          ! CG lightning frequency
+REAL, DIMENSION(:,:) ,  POINTER :: XIC_TOTAL_NUMBER=>NULL()  ! Total number of IC
+REAL, DIMENSION(:,:) ,  POINTER :: XCG_TOTAL_NUMBER=>NULL()  ! Total number of CG
 
 CONTAINS
 
 SUBROUTINE DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO)
-INTEGER, INTENT(IN) :: KFROM, KTO
 !
-! Save current state for allocated arrays
-!DEEP_CONVECTION_MODEL(KFROM)%NCOUNTCONV=>NCOUNTCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XDTHCONV=>XDTHCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XDRVCONV=>XDRVCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XDRCCONV=>XDRCCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XDRICONV=>XDRICONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XPRCONV=>XPRCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XPRSCONV=>XPRSCONV !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XPACCONV=>XPACCONV !Done in FIELDLIST_GOTO_MODEL
-DEEP_CONVECTION_MODEL(KFROM)%XDSVCONV=>XDSVCONV
-DEEP_CONVECTION_MODEL(KFROM)%XUMFCONV=>XUMFCONV
-DEEP_CONVECTION_MODEL(KFROM)%XDMFCONV=>XDMFCONV
-DEEP_CONVECTION_MODEL(KFROM)%XMFCONV=>XMFCONV
-DEEP_CONVECTION_MODEL(KFROM)%XPRLFLXCONV=>XPRLFLXCONV
-DEEP_CONVECTION_MODEL(KFROM)%XPRSFLXCONV=>XPRSFLXCONV
-!DEEP_CONVECTION_MODEL(KFROM)%XCAPE=>XCAPE !Done in FIELDLIST_GOTO_MODEL
-DEEP_CONVECTION_MODEL(KFROM)%NCLTOPCONV=>NCLTOPCONV
-DEEP_CONVECTION_MODEL(KFROM)%NCLBASCONV=>NCLBASCONV
-!DEEP_CONVECTION_MODEL(KFROM)%XIC_RATE=>XIC_RATE !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XCG_RATE=>XCG_RATE !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XIC_TOTAL_NUMBER=>XIC_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
-!DEEP_CONVECTION_MODEL(KFROM)%XCG_TOTAL_NUMBER=>XCG_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
+INTEGER, INTENT(IN) :: KFROM, KTO
 !
-! Current model is set to model KTO
-!NCOUNTCONV=>DEEP_CONVECTION_MODEL(KTO)%NCOUNTCONV !Done in FIELDLIST_GOTO_MODEL
-!XDTHCONV=>DEEP_CONVECTION_MODEL(KTO)%XDTHCONV !Done in FIELDLIST_GOTO_MODEL
-!XDRVCONV=>DEEP_CONVECTION_MODEL(KTO)%XDRVCONV !Done in FIELDLIST_GOTO_MODEL
-!XDRCCONV=>DEEP_CONVECTION_MODEL(KTO)%XDRCCONV !Done in FIELDLIST_GOTO_MODEL
-!XDRICONV=>DEEP_CONVECTION_MODEL(KTO)%XDRICONV !Done in FIELDLIST_GOTO_MODEL
-!XPRCONV=>DEEP_CONVECTION_MODEL(KTO)%XPRCONV !Done in FIELDLIST_GOTO_MODEL
-!XPRSCONV=>DEEP_CONVECTION_MODEL(KTO)%XPRSCONV !Done in FIELDLIST_GOTO_MODEL
-!XPACCONV=>DEEP_CONVECTION_MODEL(KTO)%XPACCONV !Done in FIELDLIST_GOTO_MODEL
-XDSVCONV=>DEEP_CONVECTION_MODEL(KTO)%XDSVCONV
-XUMFCONV=>DEEP_CONVECTION_MODEL(KTO)%XUMFCONV
-XDMFCONV=>DEEP_CONVECTION_MODEL(KTO)%XDMFCONV
-XMFCONV=>DEEP_CONVECTION_MODEL(KTO)%XMFCONV
-XPRLFLXCONV=>DEEP_CONVECTION_MODEL(KTO)%XPRLFLXCONV
-XPRSFLXCONV=>DEEP_CONVECTION_MODEL(KTO)%XPRSFLXCONV
-!XCAPE=>DEEP_CONVECTION_MODEL(KTO)%XCAPE !Done in FIELDLIST_GOTO_MODEL
-NCLTOPCONV=>DEEP_CONVECTION_MODEL(KTO)%NCLTOPCONV
-NCLBASCONV=>DEEP_CONVECTION_MODEL(KTO)%NCLBASCONV
-!XIC_RATE=>DEEP_CONVECTION_MODEL(KTO)%XIC_RATE !Done in FIELDLIST_GOTO_MODEL
-!XCG_RATE=>DEEP_CONVECTION_MODEL(KTO)%XCG_RATE !Done in FIELDLIST_GOTO_MODEL
-!XIC_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XIC_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
-!XCG_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XCG_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
-
 END SUBROUTINE DEEP_CONVECTION_GOTO_MODEL
 
 END MODULE MODD_DEEP_CONVECTION_n
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index af0ca344e..81b52ee41 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -167,11 +167,7 @@ INTEGER,            INTENT(IN) :: KSV          ! Number of Scalar Variables
 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
                                     !  at the open of the file
                                     !  LFI  routines 
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string 
-!
 CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be written
-CHARACTER(LEN=20) :: YCOMMENT       ! Comment string
 INTEGER           :: JT,JPROC,JMASK
 !
 !
@@ -1038,11 +1034,16 @@ SELECT CASE (CBUTYPE)
 !
 !*     3.1    storage of the masks  array
 !
-        WRITE(YRECFM,FMT="('MASK_',I4.4,'.MASK')") NBUTSHIFT
-        WRITE(YCOMMENT,FMT="('X_Y_MASK',I4.4)") NBUTSHIFT
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFILEDIA,YRECFM,HLUOUT,'XY',ZWORKMASK(:,:,:,:,:,:),IGRID, &
-                                   ILENCH,YCOMMENT,IRESP)
+        WRITE(TZFIELD%CMNHNAME,FMT="('MASK_',I4.4,'.MASK')") NBUTSHIFT
+        TZFIELD%CSTDNAME   = ''
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CUNITS     = ''
+        TZFIELD%CDIR       = 'XY'
+        WRITE(TZFIELD%CCOMMENT,FMT="('X_Y_MASK',I4.4)") NBUTSHIFT
+        TZFIELD%NGRID      = 0
+        TZFIELD%NTYPE      = TYPEREAL
+        TZFIELD%NDIMS      = 6
+        CALL IO_WRITE_FIELD(TPDIAFILE,TZFIELD,HLUOUT,IRESP,ZWORKMASK(:,:,:,:,:,:))
         WRITE(YRECFM,FMT="('MASK_',I4.4)") NBUTSHIFT
         CALL MENU_DIACHRO(TPDIAFILE,HLUOUT,YRECFM)
         DEALLOCATE(ZWORKMASK)
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 7beb7069c..a6f9c873e 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -473,9 +473,7 @@ IF(PRESENT(PMASK))THEN
   TZFIELD%NGRID      = KGRID(1)
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 6
-  !PW: not yet implemented CALL IO_WRITE_FIELD(TPDIAFILE,TZFIELD,HLUOUTDIA,IRESPDIA,PMASK)
-  CALL FMWRIT(TPDIAFILE%CNAME,TZFIELD%CMNHNAME,HLUOUTDIA,'XY',PMASK,KGRID(1),  &
-              LEN_TRIM(YCOMMENT),YCOMMENT,IRESPDIA)
+  CALL IO_WRITE_FIELD(TPDIAFILE,TZFIELD,HLUOUTDIA,IRESPDIA,PMASK)
 ENDIF
 !
 ! 9eme enregistrement TRAJY
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 70ab6b28e..c49ddf0aa 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -167,13 +167,6 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! Output file
 !
 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
                                     !  at the open of the file LFI routines 
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string 
-!
-CHARACTER(LEN=28) :: YFMFILE        ! Name of FM-file to write
-CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be written
-CHARACTER(LEN=100):: YCOMMENT       ! Comment string
-!
 INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
 INTEGER           :: IKRAD  
 ! 
@@ -214,8 +207,6 @@ TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2
 !
 !*       0.     ARRAYS BOUNDS INITIALIZATION
 !
-YFMFILE = TPFILE%CNAME
-!
 IIU=SIZE(XTHT,1)
 IJU=SIZE(XTHT,2)
 IKU=SIZE(XTHT,3)
@@ -230,17 +221,8 @@ ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
 !
 ! #ifdef MNH_NCWRIT
 ! IF (LNETCDF.AND..NOT.LCARTESIAN) THEN
-!   YRECFM='LAT'
-!   YCOMMENT='X_Y_latitude (degree)'
-!   IGRID=1
-!   ILENCH=LEN(YCOMMENT)
-!   CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XLAT,IGRID,ILENCH,YCOMMENT,IRESP)
-! !
-!   YRECFM='LON'
-!   YCOMMENT='X_Y_longitude (degree)'
-!   IGRID=1
-!   ILENCH=LEN(YCOMMENT)
-!   CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XLON,IGRID,ILENCH,YCOMMENT,IRESP)
+!   CALL IO_WRITE_FIELD(TPFILE,'LAT',CLUOUT,IRESP,XLAT)
+!   CALL IO_WRITE_FIELD(TPFILE,'LON',CLUOUT,IRESP,XLON)
 ! END IF
 ! #endif
 !
@@ -271,6 +253,7 @@ IF (NCONV_KF >= 0) THEN
   TZFIELD%NGRID      = 4
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 2
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK21)
 !
   ! base height (km) of convective clouds
   ZWORK21(:,:)= 0.
@@ -299,89 +282,110 @@ IF (NCONV_KF >= 1) THEN
   CALL IO_WRITE_FIELD(TPFILE,'DRICONV',CLUOUT,IRESP,XDRICONV)
 !  
   IF ( LCHTRANS .AND. NSV > 0 ) THEN
-    IGRID=1                                    
     ! User scalar variables
-    DO JSV = 1, NSV_USER
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A2,I3.3,A26)')'X_Y_Z_','SV',JSV,' CONVective tendency (1/s)'
-      ILENCH      = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),          &
-                  IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_USER>0) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = 1, NSV_USER
+        WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A2,I3.3,A20)')'X_Y_Z_','SV',JSV,' CONVective tendency'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
     ! microphysical C2R2 scheme scalar variables
-    DO JSV = NSV_C2R2BEG, NSV_C2R2END
-      YRECFM = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)), &
-                                  ' CONVective tendency (1/s)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_C2R2BEG, NSV_C2R2END
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//' CONVective tendency (1/s)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
     ! microphysical C3R5 scheme additional scalar variables
-    DO JSV = NSV_C1R3BEG,NSV_C1R3END
-      YRECFM='DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)), &
-                                  ' CONVective tendency (1/s)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
-                  IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_C1R3BEG,NSV_C1R3END
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//' CONVective tendency (1/s)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
     ! electrical scalar variables
-    DO JSV = NSV_ELECBEG,NSV_ELECEND
-      YRECFM = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)),&
-                                  ' CONVective tendency (1/s)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
-                  IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_ELECEND>=NSV_ELECBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_ELECBEG,NSV_ELECEND
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//' CONVective tendency (1/s)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
     ! chemical scalar variables
-    DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-      YRECFM = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
-      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CNAMES(JSV-NSV_CHEMBEG+1)), &
-                                  ' CONVective tendency (1/s)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
-                  IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_CHEMBEG, NSV_CHEMEND
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//' CONVective tendency (1/s)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
     ! lagrangian variables
-    DO JSV = NSV_LGBEG,NSV_LGEND
-      YRECFM='DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-       WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CLGNAMES(JSV-NSV_LGBEG+1)), &
-                                  ' CONVective tendency (1/s)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
-                  IGRID,ILENCH,YCOMMENT,IRESP)
-    END DO
+    IF (NSV_LGEND>=NSV_LGBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 's-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_LGBEG,NSV_LGEND
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//' CONVective tendency (1/s)'
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
+    END IF
   END IF
 !
 END IF
 IF (NCONV_KF >= 2) THEN
-!
-  YRECFM      = 'PRLFLXCONV'
-  YCOMMENT    = 'X_Y_Liquid Precipitation Convective Flux (m/s)'
-  IGRID       = 4
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XPRLFLXCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM      = 'PRSFLXCONV'
-  YCOMMENT    = 'X_Y_Solid Precipitation Convective Flux (m/s)'
-  IGRID       = 4
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XPRSFLXCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM      = 'UMFCONV'
-  YCOMMENT    = 'X_Y_Updraft Convective Mass Flux (kg/s m**2)'
-  IGRID       = 4
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XUMFCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM      = 'DMFCONV'
-  YCOMMENT    = 'X_Y_Downdraft Convective Mass Flux (kg/s m**2)'
-  IGRID       = 4
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDMFCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
+  CALL IO_WRITE_FIELD(TPFILE,'PRLFLXCONV',CLUOUT,IRESP,XPRLFLXCONV)
+  CALL IO_WRITE_FIELD(TPFILE,'PRSFLXCONV',CLUOUT,IRESP,XPRSFLXCONV)
+  CALL IO_WRITE_FIELD(TPFILE,'UMFCONV',   CLUOUT,IRESP,XUMFCONV)
+  CALL IO_WRITE_FIELD(TPFILE,'DMFCONV',   CLUOUT,IRESP,XDMFCONV)
 END IF
 !-------------------------------------------------------------------------------
 !
@@ -521,79 +525,18 @@ END IF
 !
 IF (NRAD_3D >= 0) THEN
   IF (CRAD /= 'NONE') THEN
-!
-    YRECFM      = 'DTHRAD'
-    YCOMMENT    = 'X_Y_Z_RADiative heating/cooling rate (K/s)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDTHRAD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'FLALWD'
-    YCOMMENT    = 'X_Y_Downward Long Waves on FLAT surface (W/M2)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XFLALWD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'DIRFLASWD'
-    YCOMMENT    = 'X_Y_DIRect Downward Short Waves on FLAT surface (W/M2)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDIRFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'SCAFLASWD'
-    YCOMMENT    = 'X_Y_SCAttered Downward Short Waves on FLAT surface (W/M2)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XSCAFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'DIRSRFSWD'
-    YCOMMENT    = 'X_Y_DIRect Downward Short Waves (W/M2)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDIRSRFSWD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'CLEARCOL_TM1'
-    YCOMMENT    = 'TRACE OF CLOUD'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',NCLEARCOL_TM1,IGRID,ILENCH,YCOMMENT,IRESP) 
-!
-    YRECFM      = 'ZENITH'
-    YCOMMENT    = 'X_Y_ZENITH (RAD)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XZENITH,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'AZIM'
-    YCOMMENT    = 'X_Y_AZIMuth (RAD)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XAZIM,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'DIR_ALB'
-    YCOMMENT    = 'X_Y_DIRect ALBedo (-)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDIR_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'SCA_ALB'
-    YCOMMENT    = 'X_Y_SCAttered ALBedo (-)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XSCA_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'EMIS'
-    YCOMMENT    = 'X_Y_EMISsivity (-)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XEMIS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM      = 'TSRAD'
-    YCOMMENT    = 'X_Y_RADiative Surface Temperature (K)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XTSRAD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
+    CALL IO_WRITE_FIELD(TPFILE,'DTHRAD',      CLUOUT,IRESP,XDTHRAD)
+    CALL IO_WRITE_FIELD(TPFILE,'FLALWD',      CLUOUT,IRESP,XFLALWD)
+    CALL IO_WRITE_FIELD(TPFILE,'DIRFLASWD',   CLUOUT,IRESP,XDIRFLASWD)
+    CALL IO_WRITE_FIELD(TPFILE,'SCAFLASWD',   CLUOUT,IRESP,XSCAFLASWD)
+    CALL IO_WRITE_FIELD(TPFILE,'DIRSRFSWD',   CLUOUT,IRESP,XDIRSRFSWD)
+    CALL IO_WRITE_FIELD(TPFILE,'CLEARCOL_TM1',CLUOUT,IRESP,NCLEARCOL_TM1)
+    CALL IO_WRITE_FIELD(TPFILE,'ZENITH',      CLUOUT,IRESP,XZENITH)
+    CALL IO_WRITE_FIELD(TPFILE,'AZIM',        CLUOUT,IRESP,XAZIM)
+    CALL IO_WRITE_FIELD(TPFILE,'DIR_ALB',     CLUOUT,IRESP,XDIR_ALB)
+    CALL IO_WRITE_FIELD(TPFILE,'SCA_ALB',     CLUOUT,IRESP,XSCA_ALB)
+    CALL IO_WRITE_FIELD(TPFILE,'EMIS',        CLUOUT,IRESP,XEMIS)
+    CALL IO_WRITE_FIELD(TPFILE,'TSRAD',       CLUOUT,IRESP,XTSRAD)
   ELSE
     PRINT*,'YOU WANT DIAGNOSTICS RELATED TO RADIATION'
     PRINT*,' BUT NO RADIATIVE SCHEME WAS ACTIVATED IN THE MODEL'
@@ -602,15 +545,21 @@ END IF
 IF (NRAD_3D >= 1) THEN
   IF (LDUST) THEN
 !Dust optical depth between two vertical levels
-    YRECFM      = 'DSTAOD3D'
-    YCOMMENT    = 'X_Y_Z_DuST Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
     ZWORK31(:,:,:)=0.
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)
     END DO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DSTAOD3D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: 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
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
 !Dust optical depth
     ZWORK21(:,:)=0.0
     DO JK=IKB,IKE
@@ -621,31 +570,49 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    YRECFM      = 'DSTAOD2D'
-    YCOMMENT    = 'X_Y_DuST Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DSTAOD2D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DSTAOD2D'
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_DuST Aerosol Optical Depth'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK21)
 !Dust extinction (optical depth per km)
-    YRECFM      = 'DSTEXT'
-    YCOMMENT    = 'X_Y_Z_DuST EXTinction (1/km) '
-    ILENCH=LEN(YCOMMENT)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DSTEXT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DSTEXT'
+    TZFIELD%CUNITS     = 'km-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_DuST EXTinction'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
   END IF
   IF (LSALT) THEN
 !Salt optical depth between two vertical levels
-    YRECFM      = 'SLTAOD3D'
-    YCOMMENT    = 'X_Y_Z_Salt Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
     ZWORK31(:,:,:)=0.
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)
     END DO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SLTAOD3D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: 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
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
 !Salt optical depth
     ZWORK21(:,:)=0.0
     DO JK=IKB,IKE
@@ -656,31 +623,49 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    YRECFM      = 'SLTAOD2D'
-    YCOMMENT    = 'X_Y_Salt Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SLTAOD2D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SLTAOD2D'
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Salt Aerosol Optical Depth'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK21)
 !Salt extinction (optical depth per km)
-    YRECFM      = 'SLTEXT'
-    YCOMMENT    = 'X_Y_Z_Salt EXTinction (1/km) '
-    ILENCH=LEN(YCOMMENT)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SLTEXT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SLTEXT'
+    TZFIELD%CUNITS     = 'km-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_Salt EXTinction'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
   END IF
   IF (LORILAM) THEN
 !Orilam anthropogenic optical depth between two vertical levels
-    YRECFM      = 'AERAOD3D'
-    YCOMMENT    = 'X_Y_Z_Anthropogenic Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
     ZWORK31(:,:,:)=0.
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)
     END DO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'AERAOD3D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: 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
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
 !Orilam anthropogenic optical depth
     ZWORK21(:,:)=0.0
     DO JK=IKB,IKE
@@ -691,21 +676,32 @@ IF (NRAD_3D >= 1) THEN
         ENDDO
       ENDDO
     ENDDO
-    YRECFM      = 'AERAOD2D'
-    YCOMMENT    = 'X_Y_Anthropogenic Aerosol Optical Depth (m)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'AERAOD2D'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: AERAOD2D'
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Anthropogenic Aerosol Optical Depth'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK21)
 !Orilam anthropogenic extinction (optical depth per km)
-    YRECFM      = 'AEREXT'
-    YCOMMENT    = 'X_Y_Z_Anthropogenic EXTinction (1/km) '
-    ILENCH=LEN(YCOMMENT)
     DO JK=IKB,IKE
       IKRAD = JK - JPVEXT
       ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
     ENDDO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'AEREXT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: AEREXT'
+    TZFIELD%CUNITS     = 'km-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_Anthropogenic EXTinction'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK31)
   END IF
-
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -756,17 +752,27 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
                      LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,              &
                      INDGEO(JI),VSIGQSAT ) 
     !
-    YRECFM      =TRIM(YNAM_SAT(JI))//'_IRBT'
-    YCOMMENT    =TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature (K)'
-    IGRID       =1
-    ILENCH      =LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZIRBT,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZIRBT)
     !
-    YRECFM      =TRIM(YNAM_SAT(JI))//'_WVBT'
-    YCOMMENT    =TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature (K)'
-    IGRID       =1
-    ILENCH      =LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWVBT,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWVBT)
   END DO
   DEALLOCATE(ZIRBT,ZWVBT)
 END IF
@@ -963,6 +969,13 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
     ZPRES(:,:,IPRES)=XISOPR(JI)*100.
   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
+  !
 !
 !*       Standard Variables
 !
@@ -972,12 +985,11 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   CALL PINTER(XTHT, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
   DO JK=1,IPRES
-    ZWORK21(:,:) = ZWRES(:,:,JK)
-    YRECFM='THT'//TRIM(YPRES(JK))//'HPA'
-    YCOMMENT='X_Y_potential temperature '//TRIM(YPRES(JK))//'hPa (K)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'THT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CCOMMENT   = 'X_Y_potential temperature '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWRES(:,:,JK))
   END DO
 ! *********************
 ! Wind
@@ -986,24 +998,22 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
   DO JK=1,IPRES
-    ZWORK21(:,:) = ZWRES(:,:,JK)
-    YRECFM='UT'//TRIM(YPRES(JK))//'HPA'
-    YCOMMENT='X_Y_U component of wind '//TRIM(YPRES(JK))//'hPa (m/s)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'UT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_U component of wind '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWRES(:,:,JK))
   END DO
   !
   ZWORK31(:,:,:) = MYF(XVT(:,:,:))
   CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
           IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
   DO JK=1,IPRES
-    ZWORK21(:,:) = ZWRES(:,:,JK)
-    YRECFM='VT'//TRIM(YPRES(JK))//'HPA'
-    YCOMMENT='X_Y_V component of wind '//TRIM(YPRES(JK))//'hPa (m/s)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'VT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWRES(:,:,JK))
   END DO
 ! *********************
 ! Water Vapour Mixing Ratio
@@ -1011,12 +1021,11 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   CALL PINTER(XRT(:,:,:,1), XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
   DO JK=1,IPRES
-    ZWORK21(:,:) = 1.E+3*ZWRES(:,:,JK)
-    YRECFM='MRV'//TRIM(YPRES(JK))//'HPA'
-    YCOMMENT='X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//'hPa (g/kg)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'MRV'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'g kg-1'
+    TZFIELD%CCOMMENT   = 'X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWRES(:,:,JK)*1.E3)
   END DO
 ! *********************
 ! Geopotential in meters
@@ -1025,12 +1034,11 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
            IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
   DO JK=1,IPRES
-    ZWORK21(:,:) = ZWRES(:,:,JK)
-    YRECFM='ALT'//TRIM(YPRES(JK))//'HPA'
-    YCOMMENT='X_Y_ALTitude '//TRIM(YPRES(JK))//'hPa (m)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'ALT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CCOMMENT   = 'X_Y_ALTitude '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWRES(:,:,JK))
   END DO
 !
   DEALLOCATE(ZWRES,ZPRES,ZWORK32,ZWORK33,ZWORK34)
@@ -1065,6 +1073,13 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   ZTH(:) = XISOTH(1:ITH)
 
   PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:)
+  !
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
+  !
 !
 !*       Standard Variables
 !
@@ -1073,12 +1088,11 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
 ! *********************
   CALL ZINTER(XPABST, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
   DO JK=1,ITH
-    ZWORK21(:,:) = ZWTH(:,:,JK)
-    YRECFM='PABST'//TRIM(YTH(JK))//'K'
-    YCOMMENT='X_Y_pressure '//TRIM(YTH(JK))//'K (Pa)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PABST'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'Pa'
+    TZFIELD%CCOMMENT   = 'X_Y_pressure '//TRIM(YTH(JK))//' K'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWTH(:,:,JK))
   END DO
 ! *********************
 ! Potential Vorticity
@@ -1102,12 +1116,11 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   ZPOVO(:,:,IKU)=-1.E+11
   CALL ZINTER(ZPOVO, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
   DO JK=1,ITH
-   ZWORK21(:,:) = ZWTH(:,:,JK)
-   YRECFM='POVOT'//TRIM(YTH(JK))//'K'
-   YCOMMENT='X_Y_POtential VOrticity '//TRIM(YTH(JK))//'K (PVU)'
-   IGRID=1
-   ILENCH=LEN(YCOMMENT)
-   CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'POVOT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'PVU'
+    TZFIELD%CCOMMENT   = 'X_Y_POtential VOrticity '//TRIM(YTH(JK))//' K'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWTH(:,:,JK))
   END DO
 ! *********************
 ! Wind
@@ -1115,23 +1128,21 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU))
   ZWORK31(:,:,:) = MXF(XUT(:,:,:))
   CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
   DO JK=1,ITH
-    ZWORK21(:,:) = ZWTH(:,:,JK)
-    YRECFM='UT'//TRIM(YTH(JK))//'K'
-    YCOMMENT='X_Y_U component of wind '//TRIM(YTH(JK))//'K (m/s)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'UT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_U component of wind '//TRIM(YTH(JK))//' K'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWTH(:,:,JK))
   END DO
   !
   ZWORK31(:,:,:) = MYF(XVT(:,:,:))
   CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
   DO JK=1,ITH
-    ZWORK21(:,:) = ZWTH(:,:,JK)
-    YRECFM='VT'//TRIM(YTH(JK))//'K'
-    YCOMMENT='X_Y_V component of wind '//TRIM(YTH(JK))//'K (m/s)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'VT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_V component of wind '//TRIM(YTH(JK))//' K'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWTH(:,:,JK))
   END DO
 !
   DEALLOCATE(ZWTH,ZTH,ZWORK32,ZWORK33,ZWORK34)
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 0c632e9c2..3eb1def7d 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -1464,12 +1464,14 @@ END SUBROUTINE WRITE_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD,        ONLY: TFIELDDATA, TYPEINT, TYPEREAL
 USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_MSG
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
-USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
+USE MODD_IO_ll,        ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,  ONLY : COUT, COUTFILE, NLUOUT
+USE MODD_CONF_n,       ONLY : CSTORAGE_TYPE
 !
 !
 IMPLICIT NONE
@@ -1488,9 +1490,9 @@ 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,KL1)  :: ITDATE
 CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH','writing '//TRIM(HREC))
@@ -1499,21 +1501,39 @@ IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(HREC)//' not written in file by externalized surface')
   RETURN
 ELSE
-!
-  YRECFM=TRIM(HREC)//'%TDATE'
-!
+  !
   ITDATE(1,:) = KYEAR  (:)
   ITDATE(2,:) = KMONTH (:)
   ITDATE(3,:) = KDAY   (:)
-  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE(:,:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
-!
+  !
+  TZFIELD%CMNHNAME   = TRIM(HREC)//'%TDATE'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(TZFIELD%CMNHNAME)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 2
+  !
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ITDATE(:,:))
+  !
   IF (KRESP /=0) THEN
     WRITE ( YMSG, '( I5 )' ) KRESP
     CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
   END IF
-!
-  YRECFM=TRIM(HREC)//'%TIME'
-  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME(:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
+  !
+  TZFIELD%CMNHNAME   = TRIM(HREC)//'%TIME'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(TZFIELD%CMNHNAME)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
+  !
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,PTIME(:))
 !
   IF (KRESP /=0) THEN
     WRITE ( YMSG, '( I5 )' ) KRESP
-- 
GitLab