From 1cd3f401b76ca0d4b007de494be4d80c692ea421 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Sep 2017 11:36:34 +0200
Subject: [PATCH] Philippe 22/09/2017: IO: use IO_READ_FIELD (no more FMREADs)
 Warning: not fully tested

---
 src/MNH/check_zhat.f90       |   29 +-
 src/MNH/check_zs.f90         |   33 +-
 src/MNH/compare_dad.f90      |  161 +--
 src/MNH/ini_lb.f90           | 1831 ++++++++++++++++++----------------
 src/MNH/ini_prog_var.f90     |  180 ++--
 src/MNH/init_for_convlfi.f90 |  165 +--
 src/MNH/mnh2lpdm.f90         |   15 +-
 src/MNH/mnh2lpdm_ech.f90     |   63 +-
 src/MNH/mnh2lpdm_ini.f90     |  100 +-
 src/MNH/read_field.f90       |  946 ++++++++++--------
 src/MNH/read_surf_mnh.f90    |  125 +--
 src/MNH/spawn_field2.f90     |  565 +++++++----
 12 files changed, 2234 insertions(+), 1979 deletions(-)

diff --git a/src/MNH/check_zhat.f90 b/src/MNH/check_zhat.f90
index ea44989be..6f0db0223 100644
--- a/src/MNH/check_zhat.f90
+++ b/src/MNH/check_zhat.f90
@@ -80,12 +80,14 @@ END MODULE MODI_CHECK_ZHAT
 USE MODE_FM
 !
 USE MODD_CONF           ! declaration modules
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_LUNIT
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
 !
 USE MODE_FMREAD
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_FIND_BYNAME
 !
 IMPLICIT NONE
 !
@@ -108,10 +110,8 @@ REAL                :: ZLEN2                ! Decay scale for small-scale topogr
 !
 INTEGER             :: IRESP                ! return-code if problems occured
 INTEGER             :: ILUOUT0              ! logical unit for file CLUOUT0
-INTEGER             :: IGRID,ILENCH         !   File 
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM    ! management
-CHARACTER (LEN=100) :: YCOMMENT             ! variables 
 LOGICAL             :: GTHINSHELL
+TYPE(TFILEDATA),POINTER :: TZFMFILE
 !
 !-------------------------------------------------------------------------------
 !
@@ -122,20 +122,17 @@ CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !*            1. Reading grid and dimension
 !                --------------------------
 !
-YRECFM='KMAX'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IKMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-ALLOCATE(ZZHAT(IKMAX+2*JPVEXT))
-YRECFM='ZHAT'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-YRECFM='THINSHELL'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',GTHINSHELL,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_FILE_FIND_BYNAME(TRIM(HFMFILE),TZFMFILE,IRESP)
 !
-CALL FMREAD(HFMFILE,'MASDEV',CLUOUT0,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'KMAX',IKMAX)
+ALLOCATE(ZZHAT(IKMAX+2*JPVEXT))
+CALL IO_READ_FIELD(TZFMFILE,'ZHAT',ZZHAT)
+CALL IO_READ_FIELD(TZFMFILE,'THINSHELL',GTHINSHELL)
+CALL IO_READ_FIELD(TZFMFILE,'MASDEV',IMASDEV)
 IF (IMASDEV<=46) THEN
   GSLEVE = .FALSE.
 ELSE
-  YRECFM='SLEVE'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',GSLEVE,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFMFILE,'SLEVE',GSLEVE)
 ENDIF
 !
 !*            2. Check dimensions
@@ -183,10 +180,8 @@ END IF
 !                -------------------------------------
 !
 IF ( GSLEVE .AND. LSLEVE ) THEN
-  YRECFM='LEN1'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZLEN1,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM='LEN2'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZLEN2,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFMFILE,'LEN1',ZLEN1)
+  CALL IO_READ_FIELD(TZFMFILE,'LEN2',ZLEN2)
   IF (ZLEN1 /= XLEN1 .OR. ZLEN2 /= XLEN2) THEN
     HDAD_NAME=' '
     WRITE (ILUOUT0,*) '********************************************************'
diff --git a/src/MNH/check_zs.f90 b/src/MNH/check_zs.f90
index 0bff2dd51..eb9f489ff 100644
--- a/src/MNH/check_zs.f90
+++ b/src/MNH/check_zs.f90
@@ -83,6 +83,7 @@ END MODULE MODI_CHECK_ZS
 !              ------------
 !
 USE MODD_CONF           ! declaration modules
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_LUNIT
 USE MODD_GRID_n
 USE MODD_DIM_n
@@ -91,6 +92,7 @@ USE MODD_NESTING
 !
 USE MODE_FM
 USE MODE_FMREAD
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_FIND_BYNAME
 !
 IMPLICIT NONE
 !
@@ -109,9 +111,6 @@ INTEGER,             INTENT(IN)    :: KJINF     ! domain, compared to the old
 !
 INTEGER             :: IRESP                ! return-code if problems occured
 INTEGER             :: ILUOUT0              ! logical unit for file CLUOUT0
-INTEGER             :: IGRID,ILENCH         !   File 
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM    ! management
-CHARACTER (LEN=100) :: YCOMMENT             ! variables 
 !
 INTEGER             :: IDXRATIO = 0         ! aspect ratios during previous
 INTEGER             :: IDYRATIO = 0         ! spawning (if any)
@@ -124,6 +123,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZZS2   !
 INTEGER                           :: IIMAXC ! inner dimensions of coarse
 INTEGER                           :: IJMAXC ! definition arrays
 INTEGER                           :: JI,JJ  ! loop counters
+TYPE(TFILEDATA),POINTER           :: TZFMFILE
 !-------------------------------------------------------------------------------
 !
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
@@ -133,8 +133,9 @@ CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !*            1. Reading of aspect ratios and dimensions
 !                ---------------------------------------
 !
-YRECFM='DXRATIO'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IDXRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_FILE_FIND_BYNAME(TRIM(HFMFILE),TZFMFILE,IRESP)
+!
+CALL IO_READ_FIELD(TZFMFILE,'DXRATIO',IDXRATIO,IRESP)
 IF ( IRESP /= 0 .OR. IDXRATIO == 0 ) THEN
   WRITE (ILUOUT0,*) '********************************************************'
   WRITE (ILUOUT0,*) 'resolution ratio in x direction not present in fmfile; no nesting allowed'
@@ -143,8 +144,7 @@ IF ( IRESP /= 0 .OR. IDXRATIO == 0 ) THEN
   RETURN
 END IF
 !
-YRECFM='DYRATIO'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IDYRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'DYRATIO',IDYRATIO,IRESP)
 IF ( IRESP /= 0 .OR. IDYRATIO == 0 ) THEN
   WRITE (ILUOUT0,*) '********************************************************'
   WRITE (ILUOUT0,*) 'resolution ratio in y direction not present in fmfile; no nesting allowed'
@@ -153,8 +153,7 @@ IF ( IRESP /= 0 .OR. IDYRATIO == 0 ) THEN
   RETURN 
 END IF
 !
-YRECFM='XOR'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',NXOR_ALL(1),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'XOR',NXOR_ALL(1),IRESP)
 IF ( IRESP /= 0 ) THEN
   WRITE (ILUOUT0,*) '********************************************************'
   WRITE (ILUOUT0,*) 'position XOR not present in fmfile; no nesting allowed'
@@ -163,8 +162,7 @@ IF ( IRESP /= 0 ) THEN
   RETURN
 END IF
 !
-YRECFM='YOR'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',NYOR_ALL(1),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'YOR',NYOR_ALL(1),IRESP)
 IF ( IRESP /= 0 ) THEN
   WRITE (ILUOUT0,*) '********************************************************'
   WRITE (ILUOUT0,*) 'resolution YOR not present in fmfile; no nesting allowed'
@@ -173,15 +171,11 @@ IF ( IRESP /= 0 ) THEN
   RETURN 
 END IF
 !
-YRECFM='IMAX'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='JMAX'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'IMAX',IIMAX)
+CALL IO_READ_FIELD(TZFMFILE,'JMAX',IJMAX)
 !
 ALLOCATE(ZZS(IIMAX+2*JPHEXT,IJMAX+2*JPHEXT))
-YRECFM='ZS'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZZS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'ZS',ZZS)
 !
 !*            2. Allocate coarse arrays
 !                ----------------------
@@ -247,8 +241,7 @@ END IF
 !
 IF (LSLEVE) THEN
 !
-  YRECFM='ZSMT'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZZS,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFMFILE,'ZSMT',ZZS)
 !
 !*            5. Average the smooth orographies
 !                ------------------------------
diff --git a/src/MNH/compare_dad.f90 b/src/MNH/compare_dad.f90
index 0eff596a5..675afaa56 100644
--- a/src/MNH/compare_dad.f90
+++ b/src/MNH/compare_dad.f90
@@ -69,21 +69,24 @@ END MODULE MODI_COMPARE_DAD
 !               ------------
 !
 !
+USE MODD_CONF
+USE MODD_IO_ll,      ONLY: TFILEDATA
+USE MODD_LUNIT_n
+USE MODD_PARAMETERS, ONLY: JPHEXT,JPVEXT,NMNHNAMELGTMAX
+!
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_GRIDPROJ
-USE MODD_LUNIT_n
-USE MODD_CONF
-USE MODD_PARAMETERS, ONLY: JPHEXT,JPVEXT,NMNHNAMELGTMAX
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 !
 !
 IMPLICIT NONE
 !
 !*       0.1  Declarations of dummy arguments :
 !
-CHARACTER (LEN=*),      INTENT(IN)  :: HDADINIFILE   ! Name of true DAD FM file
-CHARACTER (LEN=*),      INTENT(IN)  :: HDADSPAFILE   ! Name of Replaced DAD FM file
-INTEGER,               INTENT(OUT)  :: KRESP !  logical switch 
+CHARACTER (LEN=*), INTENT(IN)  :: HDADINIFILE   ! Name of true DAD FM file
+CHARACTER (LEN=*), INTENT(IN)  :: HDADSPAFILE   ! Name of Replaced DAD FM file
+INTEGER,           INTENT(OUT) :: KRESP
 !
 !
 !*       0.2  Declarations of local variables :
@@ -91,30 +94,25 @@ INTEGER,               INTENT(OUT)  :: KRESP !  logical switch
 !
 INTEGER :: IRESP    ! Return codes in FM routines
 INTEGER :: ILUOUT   ! Logical unit number for the output listing 
-INTEGER :: ININAR   ! Number of articles present in the LFIFM file
 INTEGER :: IMASDEV
 !
 INTEGER             :: IIU_1,IIU_2    ! Upper dimension in x direction
 INTEGER             :: IJU_1,IJU_2    ! Upper dimension in y direction
 INTEGER             :: IKU_1,IKU_2    ! Upper dimension in z direction
 !
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM
-INTEGER            :: ILENCH, IGRID
-CHARACTER (LEN=100):: YCOMMENT
-CHARACTER(LEN=2)    :: YDIR   ! Type  of the data field in LFIFM file
-!
 REAL                :: ZLON0_1,ZLAT0_1,ZBETA_1,ZRPK_1,ZLONORI_1,ZLATORI_1
 REAL                :: ZLON0_2,ZLAT0_2,ZBETA_2,ZRPK_2,ZLONORI_2,ZLATORI_2
-REAL, DIMENSION(:),ALLOCATABLE  :: ZXHAT_1,ZYHAT_1,XZHAT_1 ! Position x,y,height
-REAL, DIMENSION(:),ALLOCATABLE  :: ZXHAT_2,ZYHAT_2,XZHAT_2 ! Position x,y,height
+REAL, DIMENSION(:),ALLOCATABLE  :: ZXHAT_1,ZYHAT_1,ZZHAT_1 ! Position x,y,height
+REAL, DIMENSION(:),ALLOCATABLE  :: ZXHAT_2,ZYHAT_2,ZZHAT_2 ! Position x,y,height
 REAL, DIMENSION(:,:),ALLOCATABLE  :: ZZS_1  ! orography
 REAL, DIMENSION(:,:),ALLOCATABLE  :: ZZS_2  ! orography
 !
 INTEGER             :: IIMAX_1,IJMAX_1,IKMAX_1
 INTEGER             :: IIMAX_2,IJMAX_2,IKMAX_2
 !
-!-------------------------------------------------------------------------------
 REAL :: ZLATORI, ZLONORI, ZXHATM, ZYHATM
+TYPE(TFILEDATA),POINTER :: TZDADINIFILE => NULL()
+TYPE(TFILEDATA),POINTER :: TZDADSPAFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !*   1.    INITIALIZATIONS
@@ -141,64 +139,40 @@ ZLATORI_2=0.
 !*   2.    Read DAD of initial file
 !          ------------------------
 !
-CALL FMOPEN_ll(HDADINIFILE,'READ',CLUOUT,0,2,NVERB,ININAR,IRESP)
-!
-YRECFM='IMAX'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',IIMAX_1,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='JMAX'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',IJMAX_1,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_FILE_ADD2LIST(TZDADINIFILE,TRIM(HDADINIFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+CALL IO_FILE_OPEN_ll(TZDADINIFILE,CLUOUT,IRESP)
 !
-YRECFM='KMAX'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',IKMAX_1,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADINIFILE,'IMAX',IIMAX_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'JMAX',IJMAX_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'KMAX',IKMAX_1)
 !
 IIU_1=IIMAX_1 + 2 * JPHEXT
 IJU_1=IJMAX_1 + 2 * JPHEXT
 IKU_1=IKMAX_1 + 2 * JPVEXT
 !
 ALLOCATE(ZXHAT_1(IIU_1))
-YRECFM='XHAT'
-YDIR='XX'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZXHAT_1,IGRID,ILENCH,YCOMMENT,IRESP)
-!
 ALLOCATE(ZYHAT_1(IJU_1))
-YRECFM='YHAT'
-YDIR='YY'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZYHAT_1,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-ALLOCATE(XZHAT_1(IKU_1))
-YRECFM='ZHAT'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',XZHAT_1,IGRID,ILENCH,YCOMMENT,IRESP)
+ALLOCATE(ZZHAT_1(IKU_1))
+CALL IO_READ_FIELD(TZDADINIFILE,'XHAT',ZXHAT_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'YHAT',ZYHAT_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'ZHAT',ZZHAT_1)
 !
 ALLOCATE(ZZS_1(IIU_1,IJU_1))
-YRECFM='ZS'
-YDIR='XY'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,YDIR,ZZS_1,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LON0'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZLON0_1,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LAT0'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZLAT0_1,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADINIFILE,'ZS',ZZS_1)
 !
-YRECFM='BETA'
-CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZBETA_1,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADINIFILE,'LON0',ZLON0_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'LAT0',ZLAT0_1)
+CALL IO_READ_FIELD(TZDADINIFILE,'BETA',ZBETA_1)
 !
 IF (.NOT.LCARTESIAN) THEN
-  YRECFM='RPK'
-  CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZRPK_1,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LATORI'
-  CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZLATORI_1,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM='LONORI'
-  CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',ZLONORI_1,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='MASDEV'
-  CALL FMREAD(HDADINIFILE,YRECFM,CLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZDADINIFILE,'RPK',ZRPK_1)
+  CALL IO_READ_FIELD(TZDADINIFILE,'LATORI',ZLATORI_1)
+  CALL IO_READ_FIELD(TZDADINIFILE,'LONORI',ZLONORI_1)
+  CALL IO_READ_FIELD(TZDADINIFILE,'MASDEV',IMASDEV)
   !
   IF (IMASDEV<=45) THEN
-    CALL FMREAD(HDADINIFILE,'LATOR',CLUOUT,'--',ZLATORI_1,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HDADINIFILE,'LONOR',CLUOUT,'--',ZLONORI_1,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZDADINIFILE,'LATOR',ZLATORI_1)
+    CALL IO_READ_FIELD(TZDADINIFILE,'LONOR',ZLONORI_1)
     ZXHATM = - 0.5 * (ZXHAT_1(1)+ZXHAT_1(2))
     ZYHATM = - 0.5 * (ZYHAT_1(1)+ZYHAT_1(2))
     CALL SM_LATLON(ZLATORI_1,ZLONORI_1,ZXHATM,ZYHATM,ZLATORI,ZLONORI)
@@ -207,74 +181,47 @@ IF (.NOT.LCARTESIAN) THEN
   END IF
 ENDIF
 !
-CALL FMCLOS_ll(HDADINIFILE,'KEEP',CLUOUT,IRESP)
+CALL IO_FILE_CLOSE_ll(TZDADINIFILE,CLUOUT,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
 !*   3.    Read DAD of spawning file 
 !          ------------------------
 !
-CALL FMOPEN_ll(HDADSPAFILE,'READ',CLUOUT,0,2,NVERB,ININAR,IRESP)
-!
-YRECFM='IMAX'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',IIMAX_2,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_FILE_ADD2LIST(TZDADSPAFILE,TRIM(HDADSPAFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+CALL IO_FILE_OPEN_ll(TZDADSPAFILE,CLUOUT,IRESP)
 !
-YRECFM='JMAX'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',IJMAX_2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='KMAX'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',IKMAX_2,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADSPAFILE,'IMAX',IIMAX_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'JMAX',IJMAX_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'KMAX',IKMAX_2)
 !
 IIU_2=IIMAX_2 + 2 * JPHEXT
 IJU_2=IJMAX_2 + 2 * JPHEXT
 IKU_2=IKMAX_2 + 2 * JPVEXT
 !
 ALLOCATE(ZXHAT_2(IIU_2))
-YRECFM='XHAT'
-YDIR='XX'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZXHAT_2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
 ALLOCATE(ZYHAT_2(IJU_2))
-YRECFM='YHAT'
-YDIR='YY'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZYHAT_2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-ALLOCATE(XZHAT_2(IKU_2))
-YRECFM='ZHAT'
-YDIR='--'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',XZHAT_2,IGRID,ILENCH,YCOMMENT,IRESP)
+ALLOCATE(ZZHAT_2(IKU_2))
+CALL IO_READ_FIELD(TZDADSPAFILE,'XHAT',ZXHAT_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'YHAT',ZYHAT_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'ZHAT',ZZHAT_2)
 !
 ALLOCATE(ZZS_2(IIU_2,IJU_2))
-YRECFM='ZS'
-YDIR='XY'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,YDIR,ZZS_2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LON0'
-YDIR='--'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZLON0_2,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADSPAFILE,'ZS',ZZS_2)
 !
-YRECFM='LAT0'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZLAT0_2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BETA'
-CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZBETA_2,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZDADSPAFILE,'LON0',ZLON0_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'LAT0',ZLAT0_2)
+CALL IO_READ_FIELD(TZDADSPAFILE,'BETA',ZBETA_2)
 !
 IF (.NOT.LCARTESIAN) THEN
-  YRECFM='RPK'
-  CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZRPK_2,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LATORI'
-  CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZLATORI_2,IGRID,ILENCH,YCOMMENT,IRESP)
-  ! 
-  YRECFM='LONORI'
-  CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',ZLONORI_2,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='MASDEV' 
-  CALL FMREAD(HDADSPAFILE,YRECFM,CLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZDADSPAFILE,'RPK',ZRPK_2)
+  CALL IO_READ_FIELD(TZDADSPAFILE,'LATORI',ZLATORI_2)
+  CALL IO_READ_FIELD(TZDADSPAFILE,'LONORI',ZLONORI_2)
+  CALL IO_READ_FIELD(TZDADSPAFILE,'MASDEV',IMASDEV)
   !
   IF (IMASDEV<=45) THEN
-    CALL FMREAD(HDADSPAFILE,'LATOR',CLUOUT,'--',ZLATORI_2,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HDADSPAFILE,'LONOR',CLUOUT,'--',ZLONORI_2,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZDADSPAFILE,'LATOR',ZLATORI_2)
+    CALL IO_READ_FIELD(TZDADSPAFILE,'LONOR',ZLONORI_2)
     ZXHATM = - 0.5 * (ZXHAT_2(1)+ZXHAT_2(2))
     ZYHATM = - 0.5 * (ZYHAT_2(1)+ZYHAT_2(2))
     CALL SM_LATLON(ZLATORI_2,ZLONORI_2,ZXHATM,ZYHATM,ZLATORI,ZLONORI)
@@ -283,7 +230,7 @@ IF (.NOT.LCARTESIAN) THEN
   END IF
 ENDIF  
 !
-CALL FMCLOS_ll(HDADSPAFILE,'KEEP',CLUOUT,IRESP)
+CALL IO_FILE_CLOSE_ll(TZDADSPAFILE,CLUOUT,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
@@ -334,7 +281,7 @@ ENDIF
 !
 !    4.4 compare height
 !
-IF ( MINVAL(ABS(XZHAT_1(:)-XZHAT_2(:))) /= 0. ) KRESP=-1
+IF ( MINVAL(ABS(ZZHAT_1(:)-ZZHAT_2(:))) /= 0. ) KRESP=-1
 
 IF (KRESP == -1 ) THEN
   WRITE(ILUOUT,FMT=1) 'vertical grids',TRIM(HDADINIFILE),TRIM(HDADSPAFILE)
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index 14a91d660..018de6791 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -220,11 +220,7 @@ INTEGER             :: IRIMXU,IRIMYV ! Total size of the LB area (for the RIM di
 INTEGER             :: JSV,JRR                    ! Loop index for MOIST AND 
                                                   !  additional scalar variables 
 INTEGER             :: IRR                        !  counter for moist variables
-INTEGER             :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM   ! management
-CHARACTER (LEN=100) :: YCOMMENT            ! variables  
-CHARACTER (LEN=2)   :: YDIR
-CHARACTER (LEN=4)   :: YDIRLB
+INTEGER             :: IRESP
 INTEGER                :: ILUOUT   !  Logical unit number associated with HLUOUT
 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
@@ -511,342 +507,141 @@ IF (KSV > 0) THEN
   END IF
 END IF
 ! User scalar variables
-DO JSV = 1, NSV_USER     
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      WRITE(YRECFM,'(A6,I3.3)')'LBXSVM',JSV
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialze PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      WRITE(YRECFM,'(A6,I3.3)')'LBYSVM',JSV
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialze PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! C2R2 scalar variables 
-DO JSV = NSV_C2R2BEG, NSV_C2R2END
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM='LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize C2R2 PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM='LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize C2R2 PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! C1R3 scalar variables 
-DO JSV = NSV_C1R3BEG, NSV_C1R3END
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM='LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize C1R3 PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM='LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize C1R3 PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-!
-! LIMA: CCN and IFN scalar variables
-!
-IF (CCLOUD=='LIMA' ) THEN
-  DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
+IF (NSV_USER>0) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = 1, NSV_USER
     SELECT CASE(HGETSVM(JSV))
-    CASE ('READ')
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      !
-      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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_READ_FIELD_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
-              WRITE(ILUOUT,*) 'Pb to initialize CCN PLBXSVM '
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialze PLBXSVM '
 !callabortstop
-              CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-              CALL ABORT
-              STOP
-            ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
           END IF
         END IF
-      END IF
-!
-      IF (KSIZELBYSV_ll  /= 0 ) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
-        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_READ_FIELD_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
-              WRITE(ILUOUT,*) 'Pb to initialize CCN PLBYSVM '
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialze PLBYSVM '
 !callabortstop
-              CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-              CALL ABORT
-              STOP
-            ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
           END IF
         END IF
-      END IF
-    CASE('INIT')
-      IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-      IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+      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
+END IF
+! C2R2 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
+  !
+  DO JSV = NSV_C2R2BEG, NSV_C2R2END
     SELECT CASE(HGETSVM(JSV))
-    CASE ('READ')
-      TZFIELD%CSTDNAME   = ''
-      TZFIELD%CUNITS     = 'kg-1'
-      TZFIELD%CDIR       = 'XY'
-      TZFIELD%NGRID      = 1
-      TZFIELD%NTYPE      = TYPEREAL
-      TZFIELD%NDIMS      = 3
-      !
-      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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBX'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
-        CALL IO_READ_FIELD_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
-              WRITE(ILUOUT,*) 'Pb to initialize IFN'
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize C2R2 PLBXSVM '
 !callabortstop
-              CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-              CALL ABORT
-              STOP
-            ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
           END IF
         END IF
-      END IF
-!
-      IF (KSIZELBYSV_ll  /= 0 ) THEN
-        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-        TZFIELD%CLBTYPE    = 'LBY'
-        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
-        CALL IO_READ_FIELD_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
-              WRITE(ILUOUT,*) 'Pb to initialize IFN'
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize C2R2 PLBYSVM '
 !callabortstop
-              CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-              CALL ABORT
-              STOP
-            ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
           END IF
         END IF
-      END IF
-    CASE('INIT')
-      IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-      IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+      CASE('INIT')
+        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
     END SELECT
   END DO
-ENDIF
-! ELEC scalar variables 
-DO JSV = NSV_ELECBEG, NSV_ELECEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM='LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize ELEC PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM='LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize ELEC PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Chemical gas phase scalar variables
-IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
+END IF
+! C1R3 scalar variables
+IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg-1'
+  TZFIELD%CUNITS     = 'm-3'
   TZFIELD%CDIR       = 'XY'
   TZFIELD%NGRID      = 1
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 3
   !
-  DO JSV = NSV_CHGSBEG, NSV_CHGSEND
+  DO JSV = NSV_C1R3BEG, NSV_C1R3END
     SELECT CASE(HGETSVM(JSV))
       CASE ('READ')
         IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
+          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBX'
           WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
@@ -855,9 +650,9 @@ IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
             IF (IRESP/=0) THEN
               IF (PRESENT(PLBXSVMM)) THEN
                 PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBXSVM   will be initialized to 0'
+                WRITE(ILUOUT,*) 'C1R3 PLBXSVM   will be initialized to 0'
               ELSE
-                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBXSVM '
+                WRITE(ILUOUT,*) 'Pb to initialize C1R3 PLBXSVM '
 !callabortstop
                 CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
                 CALL ABORT
@@ -868,7 +663,7 @@ IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
         END IF
         !
         IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBY'
           WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
@@ -877,9 +672,9 @@ IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
             IF (IRESP/=0) THEN
               IF (PRESENT(PLBYSVMM)) THEN
                 PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Chemical PLBYSVM   will be initialized to 0'
+                WRITE(ILUOUT,*) 'C1R3 PLBYSVM   will be initialized to 0'
               ELSE
-                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBYSVM '
+                WRITE(ILUOUT,*) 'Pb to initialize C1R3 PLBYSVM '
 !callabortstop
                 CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
                 CALL ABORT
@@ -894,208 +689,136 @@ IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
     END SELECT
   END DO
 END IF
-! Chemical aqueous phase scalar variables
-DO JSV = NSV_CHACBEG, NSV_CHACEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize aqueous phase chemical PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
 !
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize aqueous phase chemical PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Chemical ice phase scalar variables
-DO JSV = NSV_CHICBEG, NSV_CHICEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize ice phase chemical PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
+! LIMA: CCN and IFN scalar variables
 !
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Ice phase chemical PLBYSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Orilam aerosol scalar variables
-DO JSV = NSV_AERBEG, NSV_AEREND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBXSVM '
+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       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBX'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+            CALL IO_READ_FIELD_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
+                  WRITE(ILUOUT,*) 'Pb to initialize CCN PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBYSVM '
+                  CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                  CALL ABORT
+                  STOP
+                ENDIF
+              END IF
+            END IF
+          END IF
+          !
+          IF (KSIZELBYSV_ll  /= 0 ) THEN
+            TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
+            TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBY'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+            CALL IO_READ_FIELD_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
+                  WRITE(ILUOUT,*) 'Pb to initialize CCN PLBYSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Orilam aerosols moist scalar variables
-DO JSV = NSV_AERDEPBEG, NSV_AERDEPEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBXSVM '
+                  CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                  CALL ABORT
+                  STOP
+                ENDIF
+              END IF
+            END IF
+          END IF
+        CASE('INIT')
+          IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+          IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+      END SELECT
+    END DO
+  END IF
+  !
+  IF (NSV_LIMA_IFN_FREE+NMOD_IFN-1 >= NSV_LIMA_IFN_FREE) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'kg-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBX'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+            CALL IO_READ_FIELD_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
+                  WRITE(ILUOUT,*) 'Pb to initialize IFN'
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBYSVM '
+                  CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                  CALL ABORT
+                  STOP
+                ENDIF
+              END IF
+            END IF
+          END IF
+          !
+          IF (KSIZELBYSV_ll  /= 0 ) THEN
+            TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
+            TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBY'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+            CALL IO_READ_FIELD_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
+                  WRITE(ILUOUT,*) 'Pb to initialize IFN'
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Dust scalar variables
-IF (NSV_DSTEND>=NSV_DSTBEG) THEN
+                  CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                  CALL ABORT
+                  STOP
+                ENDIF
+              END IF
+            END IF
+          END IF
+        CASE('INIT')
+          IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+          IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+      END SELECT
+    END DO
+  END IF
+ENDIF
+! ELEC scalar variables
+IF (NSV_ELECEND>=NSV_ELECBEG) THEN
   TZFIELD%CSTDNAME   = ''
   TZFIELD%CUNITS     = 'kg kg-1'
   TZFIELD%CDIR       = 'XY'
@@ -1103,11 +826,11 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 3
   !
-  DO JSV = NSV_DSTBEG, NSV_DSTEND
+  DO JSV = NSV_ELECBEG, NSV_ELECEND
     SELECT CASE(HGETSVM(JSV))
       CASE ('READ')
         IF ( KSIZELBXSV_ll /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBX'
           WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
@@ -1116,9 +839,9 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
             IF (IRESP/=0) THEN
               IF (PRESENT(PLBXSVMM)) THEN
                 PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-                WRITE(ILUOUT,*) 'Dust PLBXSVM   will be initialized to 0'
+                WRITE(ILUOUT,*) 'ELEC PLBXSVM   will be initialized to 0'
               ELSE
-                WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
+                WRITE(ILUOUT,*) 'Pb to initialize ELEC PLBXSVM '
 !callabortstop
                 CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
                 CALL ABORT
@@ -1129,18 +852,17 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
         END IF
         !
         IF (KSIZELBYSV_ll  /= 0 ) THEN
-          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
           CALL IO_READ_FIELD_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'
+                WRITE(ILUOUT,*) 'ELEC PLBYSVM   will be initialized to 0'
               ELSE
-                WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM '
+                WRITE(ILUOUT,*) 'Pb to initialize ELEC PLBYSVM '
 !callabortstop
                 CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
                 CALL ABORT
@@ -1155,342 +877,785 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
     END SELECT
   END DO
 END IF
-!
-DO JSV = NSV_DSTDEPBEG, NSV_DSTDEPEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
-!callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
-        END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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 CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          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
-! Sea salt scalar variables
-DO JSV = NSV_SLTBEG, NSV_SLTEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize sea salt PLBXSVM '
+! Chemical gas phase scalar variables
+IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize aqueous phase chemical PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize aqueous phase chemical PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize ice phase chemical PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Ice phase chemical PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Aerosol PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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 (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize sea salt PLBYSVM '
+IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         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
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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 CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize sea salt PLBXSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
+        END IF
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize sea salt PLBYSVM '
+!callabortstop
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              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
-DO JSV = NSV_PPBEG, NSV_PPEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_PP'
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
+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
+  !
+  DO JSV = NSV_PPBEG, NSV_PPEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_PP'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_PP'
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_PP'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBYSVMM)) THEN
+                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM   will be initialized to 0'
+              ELSE
+                PLBYSVM(:,:,:,JSV)=0.
+                WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM   will be initialized to 0'
+              ENDIF
+            END IF
+          END IF
         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
+      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
-DO JSV = NSV_FFBEG, NSV_FFEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_FF'
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
+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
+  !
+  DO JSV = NSV_FFBEG, NSV_FFEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_FF'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_FF'
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_FF'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBYSVMM)) THEN
+                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0'
+              ELSE
+                PLBYSVM(:,:,:,JSV)=0.
+                WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0'
+              ENDIF
+            END IF
+          END IF
         END IF
-      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
+      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
-DO JSV = NSV_CSBEG, NSV_CSEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_CS'
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
+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
+  !
+  DO JSV = NSV_CSBEG, NSV_CSEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_CS'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBXSVMM)) THEN
+                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Conditional sampling LBXSVM   will be initialized to 0'
+              ELSE
+                PLBXSVM(:,:,:,JSV)=0.
+                WRITE(ILUOUT,*) 'Conditional sampling PLBXSVM   will be initialized to 0'
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_CS'
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_CS'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
-      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
+      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
-DO JSV = NSV_LNOXBEG, NSV_LNOXEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_LINOX'
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Linox PLBXSVM '
+IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_LNOXBEG, NSV_LNOXEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_LINOX'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Linox PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_LINOX'
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize Linox PLBYSVM '
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_LINOX'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize Linox PLBYSVM '
 !calla bortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         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
+      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
-DO JSV = NSV_LGBEG, NSV_LGEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize lagrangian PLBXSVM '
+IF (NSV_LGEND>=NSV_LGBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'm'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize lagrangian PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,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
-            WRITE(ILUOUT,*) 'Pb to initialize lagrangian PLBYSVM '
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_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
+                WRITE(ILUOUT,*) 'Pb to initialize lagrangian PLBYSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         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
+      !
+      CASE('INIT')
+        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !-------------------------------------------------------------------------------
 !
 !*       3.    COMPUTE THE LB SOURCES
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 23eb1db97..fb462dc66 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -13,10 +13,10 @@
 INTERFACE
       SUBROUTINE INI_PROG_VAR(HLUOUT,PTKE_MX,PSV_MX,HCHEMFILE)
 !
-CHARACTER(LEN=*), INTENT(IN)       :: HLUOUT      ! Name of the output-listing
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTKE_MX
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV_MX
-CHARACTER(LEN=*), INTENT(IN), OPTIONAL  :: HCHEMFILE  ! Name of the chem file
+CHARACTER(LEN=*),       INTENT(IN)          :: HLUOUT     ! Name of the output-listing
+REAL,DIMENSION(:,:,:),  INTENT(IN)          :: PTKE_MX
+REAL,DIMENSION(:,:,:,:),INTENT(IN)          :: PSV_MX
+CHARACTER(LEN=*),       INTENT(IN),OPTIONAL :: HCHEMFILE  ! Name of the chem file
 END SUBROUTINE INI_PROG_VAR
 END INTERFACE
 END MODULE MODI_INI_PROG_VAR
@@ -104,6 +104,7 @@ END MODULE MODI_INI_PROG_VAR
 USE MODD_CONF  ! declaration modules
 USE MODD_CONF_n
 USE MODD_DYN_n
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_TURB_n
 USE MODD_PARAM_n
 USE MODD_LUNIT
@@ -125,8 +126,10 @@ USE MODI_CH_INIT_SCHEME_n
 USE MODI_CH_AER_INIT_SOA
 !
 USE MODE_POS
+USE MODE_FIELD,            ONLY : TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_FMREAD
 USE MODD_DIM_n
 !
@@ -134,19 +137,16 @@ IMPLICIT NONE
 !
 !*       0.1   declaration of arguments
 !
-CHARACTER(LEN=*), INTENT(IN)       :: HLUOUT      ! Name of the output-listing
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTKE_MX
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV_MX
-CHARACTER(LEN=*), INTENT(IN), OPTIONAL  :: HCHEMFILE  ! Name of the chem file
+CHARACTER(LEN=*),       INTENT(IN)          :: HLUOUT     ! Name of the output-listing
+REAL,DIMENSION(:,:,:),  INTENT(IN)          :: PTKE_MX
+REAL,DIMENSION(:,:,:,:),INTENT(IN)          :: PSV_MX
+CHARACTER(LEN=*),       INTENT(IN),OPTIONAL :: HCHEMFILE  ! Name of the chem file
 !
 !*       0.2   declaration of local variables
 !
 INTEGER                :: ILUOUT                     !  Logical unit number
                                                      ! associated with HLUOUT 
-INTEGER                :: IGRID,ILENCH,IRESP,ININAR      !  File 
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM                       ! management
-CHARACTER (LEN=100)    :: YCOMMENT                             ! variables 
-CHARACTER(LEN=2)       :: YDIR 
+INTEGER                :: IRESP
 CHARACTER(LEN=32)      :: YDESFM
 !
 INTEGER                :: IIMAX,IJMAX,IKMAX       !  Dimensions of the chem file
@@ -160,6 +160,8 @@ INTEGER :: JSV   ! Loop index
 INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX  ! dust modes
 INTEGER :: ILUDES                         !  logical unit numbers of DESFM file
 LOGICAL :: GFOUND                         ! Return code when searching namelist
+TYPE(TFIELDDATA)        :: TZFIELD
+TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 CALL GET_MODEL_NUMBER_ll(IMI)
@@ -226,38 +228,33 @@ IF(PRESENT(HCHEMFILE)) THEN
   CALL INI_NSV(1)
   ALLOCATE(XSVT(IIU,IJU,IKU,NSV))
   ! Read dimensions in chem file and checks with output file
-  CALL FMOPEN_ll(HCHEMFILE,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP)
-  YRECFM='IMAX'
-  YDIR='--'
-  CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,IIMAX,IGRID,ILENCH,         &
-              YCOMMENT,IRESP)
+  CALL IO_FILE_ADD2LIST(TZCHEMFILE,TRIM(HCHEMFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TZCHEMFILE,HLUOUT,IRESP)
+  !
+  CALL IO_READ_FIELD(TZCHEMFILE,'IMAX',IIMAX,IRESP)
   IF (IRESP/=0) THEN
-    WRITE(ILUOUT,FMT=9000) 
-    WRITE(ILUOUT,*) TRIM(YRECFM),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+    WRITE(ILUOUT,FMT=9000)
+    WRITE(ILUOUT,*) 'IMAX',' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
    !callabortstop
     CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
     CALL ABORT
     STOP
   END IF !IRESP
-  YRECFM='JMAX'
-  YDIR='--'
-  CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,IJMAX,IGRID,ILENCH,         &
-              YCOMMENT,IRESP)
+  !
+  CALL IO_READ_FIELD(TZCHEMFILE,'JMAX',IJMAX,IRESP)
   IF (IRESP/=0) THEN
-    WRITE(ILUOUT,FMT=9000) 
-    WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+    WRITE(ILUOUT,FMT=9000)
+    WRITE(ILUOUT,*) 'JMAX','NOT FOUND IN THE CHEM FILE ',HCHEMFILE
 !callabortstop
     CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
     CALL ABORT
     STOP
   END IF !IRESP
-  YRECFM='KMAX'
-  YDIR='--'
-  CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,IKMAX,IGRID,ILENCH,         &
-              YCOMMENT,IRESP)
+  !
+  CALL IO_READ_FIELD(TZCHEMFILE,'KMAX',IKMAX,IRESP)
   IF (IRESP/=0) THEN
-    WRITE(ILUOUT,FMT=9000) 
-    WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+    WRITE(ILUOUT,FMT=9000)
+    WRITE(ILUOUT,*) 'KMAX','NOT FOUND IN THE CHEM FILE ',HCHEMFILE
 !callabortstop
     CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
     CALL ABORT
@@ -265,7 +262,7 @@ IF(PRESENT(HCHEMFILE)) THEN
   END IF !IRESP
   IF ( (IIMAX/=(IIU_ll-2*JPHEXT)) .OR. (IJMAX/=(IJU_ll-2*JPHEXT))      &
                                   .OR. (IKMAX/=(IKU-2*JPVEXT)) ) THEN
-    WRITE(ILUOUT,FMT=9000) 
+    WRITE(ILUOUT,FMT=9000)
     WRITE(ILUOUT,*) 'THE GRIDS ARE DIFFERENT IN THE OUTPUT FILE :'
     WRITE(ILUOUT,*) IIU_ll-2*JPHEXT,'*',IJU_ll-2*JPHEXT,'*',IKU-2*JPVEXT
     WRITE(ILUOUT,*) 'AND IN THE CHEM FILE :',HCHEMFILE
@@ -276,14 +273,21 @@ IF(PRESENT(HCHEMFILE)) THEN
     STOP
   END IF ! IIMAX
   IF (.NOT.LDUST) THEN
-  ! Read scalars in chem file 
+  ! Read scalars in chem file
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-      YRECFM=TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
-      YDIR='XY'
-      CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+      CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
       IF (IRESP/=0) THEN
-        WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+        WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
         XSVT(:,:,:,JSV) = 0.
       END IF !IRESP
     END DO ! JSV
@@ -294,6 +298,13 @@ IF(PRESENT(HCHEMFILE)) THEN
   END IF
 
   IF (LDUST) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     LDSTINIT=.TRUE.
     LDSTPRES=.FALSE.
     YDESFM=TRIM(ADJUSTL(HCHEMFILE))//'.des'
@@ -309,13 +320,13 @@ IF(PRESENT(HCHEMFILE)) THEN
         JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
              +  1                 & !Number of moments in this mode
              + (NSV_DSTBEG -1)      !Previous list of tracers  
-        YRECFM = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'
-        YDIR='XY'
-        CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                    YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
         IF (IRESP/=0) THEN
-          WRITE(ILUOUT,FMT=9000) 
-          WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+          WRITE(ILUOUT,FMT=9000)
+          WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
           CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
           CALL ABORT
           STOP
@@ -328,13 +339,13 @@ IF(PRESENT(HCHEMFILE)) THEN
           JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
                + JMOM               & !Number of moments in this mode
                + (NSV_DSTBEG -1)      !Previous list of tracers
-          YRECFM = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'
-          YDIR='XY'
-          CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                      YCOMMENT,IRESP)
+          TZFIELD%CMNHNAME   = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+          CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
           IF (IRESP/=0) THEN
-            WRITE(ILUOUT,FMT=9000) 
-            WRITE(ILUOUT,*) TRIM(YRECFM),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+            WRITE(ILUOUT,FMT=9000)
+            WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
             STOP
           END IF !IRESP
         END DO ! JMOM
@@ -343,6 +354,13 @@ 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
+    !
     LSLTINIT=.TRUE.
     LSLTPRES=.FALSE.
     CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT)
@@ -356,13 +374,13 @@ IF(PRESENT(HCHEMFILE)) THEN
         JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
              +  1                 & !Number of moments in this mode
              + (NSV_SLTBEG -1)      !Previous list of tracers  
-        YRECFM = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T'
-        YDIR='XY'
-        CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                    YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
         IF (IRESP/=0) THEN
-          WRITE(ILUOUT,FMT=9000) 
-          WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+          WRITE(ILUOUT,FMT=9000)
+          WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
           CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
           CALL ABORT
           STOP
@@ -375,36 +393,46 @@ IF(PRESENT(HCHEMFILE)) THEN
           JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
                + JMOM               & !Number of moments in this mode
                + (NSV_SLTBEG -1)      !Previous list of tracers
-          YRECFM = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T'
-          YDIR='XY'
-          CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                      YCOMMENT,IRESP)
+          TZFIELD%CMNHNAME   = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+          CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
           IF (IRESP/=0) THEN
-            WRITE(ILUOUT,FMT=9000) 
-            WRITE(ILUOUT,*) TRIM(YRECFM),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+            WRITE(ILUOUT,FMT=9000)
+            WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE
             STOP
           END IF !IRESP
         END DO ! JMOM
       END DO !JMOD
     END IF !if IMOMENTS    
   END IF  ! LSALT
-
-  DO JSV = NSV_AERBEG,NSV_AEREND
-    YRECFM=TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T'
-    YDIR='XY'
-    CALL FMREAD(HCHEMFILE,YRECFM,HLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    IF (IRESP/=0) THEN
-      WRITE(ILUOUT,FMT=9000) 
-      WRITE(ILUOUT,*) TRIM(YRECFM),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
+  !
+  IF (NSV_AEREND>=NSV_AERBEG) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'ppp'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    DO JSV = NSV_AERBEG,NSV_AEREND
+      TZFIELD%CMNHNAME   = TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+      CALL IO_READ_FIELD(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP)
+      IF (IRESP/=0) THEN
+        WRITE(ILUOUT,FMT=9000)
+        WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE
 !callabortstop
 !CALL ABORT
 !      STOP
-      LORILAM=.FALSE.
-    END IF !IRESP
-  END DO ! JSV
-  CALL FMCLOS_ll(HCHEMFILE,'KEEP',HLUOUT,IRESP)
-
+        LORILAM=.FALSE.
+      END IF !IRESP
+    END DO ! JSV
+  END IF
+  !
+  CALL IO_FILE_CLOSE_ll(TZCHEMFILE,HLUOUT,IRESP)
+  !
 ELSE ! HCHEMFILE
   IF (NSV >=1) THEN
     ALLOCATE(XSVT(IIU,IJU,IKU,NSV))
diff --git a/src/MNH/init_for_convlfi.f90 b/src/MNH/init_for_convlfi.f90
index 155893be6..9e748d4cc 100644
--- a/src/MNH/init_for_convlfi.f90
+++ b/src/MNH/init_for_convlfi.f90
@@ -14,9 +14,11 @@ MODULE MODI_INIT_FOR_CONVLFI
 !
 !
 INTERFACE
-      SUBROUTINE INIT_FOR_CONVLFI(HINIFILE,HLUOUT)
+      SUBROUTINE INIT_FOR_CONVLFI(TPINIFILE,HLUOUT)
 !
-CHARACTER(LEN=28),      INTENT(IN)    :: HINIFILE    ! file being read
+USE MODD_IO_ll,ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),        INTENT(IN)    :: TPINIFILE   ! file being read
 CHARACTER(LEN=*),       INTENT(IN)    :: HLUOUT      ! output listing
 !
 END SUBROUTINE INIT_FOR_CONVLFI
@@ -24,7 +26,7 @@ END INTERFACE
 END MODULE MODI_INIT_FOR_CONVLFI
 !
 !     ############################################
-      SUBROUTINE INIT_FOR_CONVLFI(HINIFILE,HLUOUT)
+      SUBROUTINE INIT_FOR_CONVLFI(TPINIFILE,HLUOUT)
 !     ############################################
 !
 !!****  *INIT_FOR_CONVLFI * - light monitor to initialize the variables 
@@ -69,6 +71,7 @@ END MODULE MODI_INIT_FOR_CONVLFI
 !*       0.    DECLARATIONS
 !              ------------
 !
+USE MODD_IO_ll,ONLY: TFILEDATA
 USE MODD_PARAMETERS
 USE MODD_CONF
 USE MODD_CST
@@ -100,18 +103,13 @@ IMPLICIT NONE
 !
 !*       0.1   Arguments variables
 !
-CHARACTER(LEN=28),      INTENT(IN)    :: HINIFILE    ! file being read
+TYPE(TFILEDATA),        INTENT(IN)    :: TPINIFILE   ! file being read
 CHARACTER(LEN=*),       INTENT(IN)    :: HLUOUT      ! output listing
 !
 !*       0.2   Local variables
 !
-INTEGER  :: IGRID,ILENCH,IRESP,ILUOUT          ! return code of file management
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM       ! management
-CHARACTER (LEN=100)    :: YCOMMENT             ! variables
-CHARACTER (LEN=2)      :: YDIR                 !
-INTEGER, DIMENSION(3)  :: ITDATE               ! date array
+INTEGER  :: IRESP
 CHARACTER (LEN=40)     :: YTITLE               ! Title for date print
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCOEF
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ      ! Jacobian
 !
 REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
@@ -133,47 +131,32 @@ INTEGER             :: IMASDEV       ! masdev of the file
 !
 !*       1.1   Read the geometry kind in the LFIFM file (Cartesian or spherical)
 !
-YRECFM = 'CARTESIAN'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,LCARTESIAN,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'CARTESIAN',LCARTESIAN)
 !
 !*       1.2  Read configuration and dimensions in initial file and initialize
 !             subdomain dimensions and parallel variables
 !
-YRECFM='IMAX'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NIMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='JMAX'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NJMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'IMAX',NIMAX_ll)
+CALL IO_READ_FIELD(TPINIFILE,'JMAX',NJMAX_ll)
 !
-YRECFM = 'L1D'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,L1D,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'L1D',L1D,IRESP)
 IF (IRESP/=0) THEN
   L1D=.FALSE.
   IF( (NIMAX_ll == 1).AND.(NJMAX_ll == 1) ) L1D=.TRUE.
 ENDIF  
 !
-YRECFM = 'L2D'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,L2D,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'L2D',L2D,IRESP)
 IF (IRESP/=0) THEN
   L2D=.FALSE.
   IF( (NIMAX_ll /= 1).AND.(NJMAX_ll == 1) ) L2D=.TRUE.
 ENDIF  
 !
-YRECFM = 'PACK'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,LPACK,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'PACK',LPACK,IRESP)
 IF (IRESP/=0) LPACK=.TRUE.
 !
 CALL SET_FMPACK_ll(L1D,L2D,LPACK)
 !
-YRECFM='KMAX'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NKMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'KMAX',NKMAX)
 !
 CSPLIT ='BSPLITTING' ; NHALO = 1
 CALL SET_SPLITTING_ll(CSPLIT)
@@ -206,48 +189,21 @@ CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
 !
 !        2.1  reading
 !
-YRECFM='LON0'   
-YDIR='--'   
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLON0,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LAT0'
-YDIR='--'     
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BETA'  
-YDIR='--'       
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XBETA,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='XHAT'
-ALLOCATE(XXHAT(IIU))
-YDIR='XX'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='YHAT'
-ALLOCATE(XYHAT(IJU))
-YDIR='YY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'LAT0',XLAT0)
+CALL IO_READ_FIELD(TPINIFILE,'LON0',XLON0)
+CALL IO_READ_FIELD(TPINIFILE,'BETA',XBETA)
+CALL IO_READ_FIELD(TPINIFILE,'XHAT',XXHAT)
+CALL IO_READ_FIELD(TPINIFILE,'YHAT',XYHAT)
 !
 IF (.NOT.LCARTESIAN) THEN
-  YRECFM='MASDEV' 
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='RPK'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XRPK,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LONORI'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LATORI'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'MASDEV',IMASDEV)
+  CALL IO_READ_FIELD(TPINIFILE,'RPK',XRPK)
+  CALL IO_READ_FIELD(TPINIFILE,'LONORI',XLONORI)
+  CALL IO_READ_FIELD(TPINIFILE,'LATORI',XLATORI)
   !
   IF (IMASDEV<=45) THEN
-    CALL FMREAD(HINIFILE,'LONOR',HLUOUT,'--',XLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HINIFILE,'LATOR',HLUOUT,'--',XLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'LONOR',XLONORI)
+    CALL IO_READ_FIELD(TPINIFILE,'LATOR',XLATORI)
     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) !//
@@ -260,72 +216,29 @@ IF (.NOT.LCARTESIAN) THEN
   END IF
 END IF
 !
-YRECFM='ZS'
 ALLOCATE(XZS(IIU,IJU))
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZS',XZS,IRESP)
 IF (IRESP/=0) XZS(:,:)=0.
 !
-YRECFM='ZSMT'
 ALLOCATE(XZSMT(IIU,IJU))
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZSMT',XZSMT,IRESP)
 IF (IRESP/=0) XZSMT(:,:)=XZS(:,:)
 !
-YRECFM='ZHAT'
 ALLOCATE(XZHAT(IKU))
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
 !
-YRECFM='SLEVE'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,LSLEVE,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'SLEVE',LSLEVE,IRESP)
 IF (IRESP/=0) LSLEVE = .FALSE.
 !
 IF (LSLEVE) THEN
-  YRECFM='LEN1'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLEN1,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM='LEN2'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLEN2,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'LEN1',XLEN1)
+  CALL IO_READ_FIELD(TPINIFILE,'LEN2',XLEN2)
 END IF
 !
-YRECFM='DTEXP%TDATE' 
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TDTEXP%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3))  
-!
-YRECFM='DTEXP%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTEXP%TIME,IGRID,ILENCH,YCOMMENT,IRESP)
-!   
-YRECFM='DTMOD%TDATE' 
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TDTMOD%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3)) 
-!
-YRECFM='DTMOD%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTMOD%TIME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DTSEG%TDATE' 
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TDTSEG%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3)) 
-!
-YRECFM='DTSEG%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTSEG%TIME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DTCUR%TDATE' 
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TDTCUR%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3)) 
-!
-YRECFM='DTCUR%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTCUR%TIME,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'DTEXP',TDTEXP)
+CALL IO_READ_FIELD(TPINIFILE,'DTMOD',TDTMOD)
+CALL IO_READ_FIELD(TPINIFILE,'DTSEG',TDTSEG)
+CALL IO_READ_FIELD(TPINIFILE,'DTCUR',TDTCUR)
 !
 YTITLE='CURRENT DATE AND TIME'
 CALL SM_PRINT_TIME(TDTCUR,HLUOUT,YTITLE)
@@ -336,7 +249,6 @@ ALLOCATE(XDXHAT(IIU))
 ALLOCATE(XDYHAT(IJU))
 ALLOCATE(XZZ(IIU,IJU,IKU))
 ALLOCATE(ZJ(IIU,IJU,IKU))
-ALLOCATE(ZCOEF(IIU,IJU))
 !
 CALL INI_CST
 !
@@ -355,10 +267,7 @@ END IF
 !*       3.    INITIALIZE THE PROGNOSTIC AND SURFACE FIELDS (read_field)
 !              --------------------------------------------
 ALLOCATE(XPABST(IIU,IJU,IKU))
-!
-YDIR='XY'
-YRECFM = 'PABST'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XPABST,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'PABST',XPABST)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90
index 2cb695388..dd808b5dd 100644
--- a/src/MNH/mnh2lpdm.f90
+++ b/src/MNH/mnh2lpdm.f90
@@ -25,6 +25,10 @@
 USE MODD_MNH2LPDM
 USE MODI_IO_LL
 USE MODD_CONF, ONLY : CPROGRAM
+USE MODD_IO_ll,ONLY : TPTR2FILE
+!
+USE MODE_FM
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 !
 USE MODI_MNH2LPDM_INI
 USE MODI_MNH2LPDM_ECH
@@ -38,6 +42,7 @@ CHARACTER(LEN=28) :: YFNML,YFLOG        ! Nom   NAMELIST et LOG.
 INTEGER           :: IFNML,IFLOG        ! Unite NAMELIST et LOG.
 INTEGER           :: IFMTO,IFGRI,IFDAT  ! Unite METEO et GRILLE.
 INTEGER           :: IREP,IVERB,JFIC
+TYPE(TPTR2FILE),DIMENSION(JPMNHMAX) :: TZFMNH  ! MesoNH files
 !
 !
 !
@@ -51,9 +56,6 @@ YFLOG    = 'METEO.log'
 YFNML    = 'MNH2LPDM1.nam'
 IVERB    =  5
  CFMNH(:) = 'VIDE'
-IFLOG = 52
-IFGRI = 51
-IFDAT = 53
 !
 !
 !*	1.2 Initialisation routines LL.
@@ -82,8 +84,10 @@ CALL CLOSE_LL(YFNML,IREP,'KEEP')
 !
 IF (CFMNH(1).NE.'VIDE') THEN
    NBMNH=1
+   CALL IO_FILE_ADD2LIST(TZFMNH(1)%TZFILE,TRIM(CFMNH(1)),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=IVERB)
    DO WHILE (CFMNH(NBMNH+1).NE.'VIDE')
       NBMNH=NBMNH+1
+      CALL IO_FILE_ADD2LIST(TZFMNH(NBMNH)%TZFILE,TRIM(CFMNH(NBMNH)),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=IVERB)
    END DO
    print *,NBMNH,' fichiers a traiter.'
 ELSE
@@ -106,17 +110,16 @@ CALL OPEN_LL(UNIT=IFDAT,FILE=CFDAT,IOSTAT=IREP,FORM='FORMATTED', &
 !
 !*	2.2 Preparation du couplage.
 !
-CALL MNH2LPDM_INI(CFMNH(1),CFMNH(NBMNH),YFLOG,IFLOG,IFGRI,IFDAT,IVERB)
+CALL MNH2LPDM_INI(TZFMNH(1)%TZFILE,TZFMNH(NBMNH)%TZFILE,YFLOG,IFLOG,IFGRI,IFDAT)
 !
 !
 !*	2.3 Traitement des echeances.
 !
 DO JFIC=1,NBMNH
-   IFMTO = JFIC+60
    print*,"CFMTO(JFIC)=",CFMTO(JFIC)
    CALL OPEN_LL(UNIT=IFMTO,FILE=CFMTO(JFIC),IOSTAT=IREP,FORM='UNFORMATTED', &
       ACTION='WRITE',MODE='GLOBAL',RECL=100000000)
-   CALL MNH2LPDM_ECH(CFMNH(JFIC),IFMTO,YFLOG,IFLOG,IVERB)
+   CALL MNH2LPDM_ECH(TZFMNH(JFIC)%TZFILE,IFMTO,YFLOG)
    print*,"CLOSE_LL(CFMTO(JFIC)"
    CALL CLOSE_LL(CFMTO(JFIC),IREP,'KEEP')
 END DO
diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90
index 33fee06ae..fb4effaa6 100644
--- a/src/MNH/mnh2lpdm_ech.f90
+++ b/src/MNH/mnh2lpdm_ech.f90
@@ -3,7 +3,7 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ######spl
-        SUBROUTINE MNH2LPDM_ECH(HFM,KFMTO,HFLOG,KFLOG,KVERB)
+        SUBROUTINE MNH2LPDM_ECH(TPFILE,KFMTO,HFLOG)
 !	##################################################
 !-----------------------------------------------------------------------
 !****	MNH2S2_ECH TRAITEMENT D'UNE ECHEANCE.
@@ -20,6 +20,7 @@
 !
 !
 USE MODD_DIM_n
+USE MODD_IO_ll,ONLY : TFILEDATA
 USE MODD_TIME_n
 USE MODD_GRID_n
 !
@@ -29,6 +30,9 @@ USE MODD_TIME
 !
 USE MODD_MNH2LPDM
 !
+USE MODE_FM
+USE MODE_FMREAD
+!
 USE MODI_IO_LL
 USE MODI_FM_LL
 USE MODI_FMREAD_LL
@@ -39,22 +43,20 @@ IMPLICIT NONE
 !
 !*	0.2 Arguments.
 !
-CHARACTER(LEN=*), INTENT(IN)  :: HFM,HFLOG
-INTEGER, INTENT(IN)  :: KVERB,KFMTO
-INTEGER, INTENT(IN)  :: KFLOG
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE
+CHARACTER(LEN=*),       INTENT(IN)    :: HFLOG
+INTEGER,                INTENT(IN)    :: KFMTO
 !
 !
 !*	0.3 Variables locales.
 !
-CHARACTER(LEN=100)   :: YCOM                         ! Commentaire champ FM.
 CHARACTER(LEN=100)   :: YFTURB                       ! Stockage champs de turbulence.
 INTEGER              :: KFTURB
-INTEGER              :: IREP,INBART,IGRID,ILONCOM    ! Variables lecture FM.
-INTEGER,DIMENSION(3) :: IDATCUR                      ! Date dans FM.
-REAL                 :: ZSECCUR                      ! Heure (sec) dans FM.
+INTEGER              :: IREP
 INTEGER              :: ICURAA,ICURMM,ICURJJ         ! Date  courante.
 INTEGER              :: ICURHH,ICURMN,ICURSS         ! Heure courante.
 INTEGER              :: JI,JJ,JK
+TYPE(DATE_TIME)      :: TZDTCUR
 !
 !
 !
@@ -70,17 +72,16 @@ INTEGER              :: JI,JJ,JK
 !
 !*	2.1 Ouverture du fichier Meso-NH.
 !
-CALL FMOPEN_LL(HFM,'READ',HFLOG,0,2,KVERB,INBART,IREP)
+CALL IO_FILE_OPEN_ll(TPFILE,HFLOG,IREP)
 !
 !*	2.2 Date et heure courante.
 !
-CALL FMREAD(HFM,'DTCUR%TDATE',HFLOG,'--',IDATCUR,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'DTCUR%TIME', HFLOG,'--',ZSECCUR,IGRID,ILONCOM,YCOM,IREP)
+CALL IO_READ_FIELD(TPFILE,'DTCUR',TZDTCUR)
 ! 
-ICURAA=MOD(IDATCUR(1),100)  ! Annee sur 2 caracteres.
-ICURMM=IDATCUR(2)
-ICURJJ=IDATCUR(3)
-ICURSS=NINT(ZSECCUR)
+ICURAA=MOD(TZDTCUR%TDATE%YEAR,100)  ! Annee sur 2 caracteres.
+ICURMM=TZDTCUR%TDATE%MONTH
+ICURJJ=TZDTCUR%TDATE%DAY
+ICURSS=NINT(TZDTCUR%TIME)
 !
 ICURMN = NINT( (FLOAT(ICURSS)/60.0)/5.0 )*5   ! Heure arrondie a 5 minutes pres.
 ICURSS = 0
@@ -95,26 +96,28 @@ print 20300, ICURJJ,ICURMM,ICURAA,ICURHH,ICURMN,ICURSS
 !
 !*	2.3 Lecture des champs Meso-NH de base.
 !
-CALL FMREAD(HFM,'UT',HFLOG,'XY',XUT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'VT',HFLOG,'XY',XVT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'WT',HFLOG,'XY',XWT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'THT',HFLOG,'XY',XTHT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'TKET',HFLOG,'XY',XTKET,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'LM',HFLOG,'XY',XLM,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'THW_FLX',HFLOG,'XY',XWPTHP,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'DISS',HFLOG,'XY',XDISSIP,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'FMU',HFLOG,'XY',XSFU,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'FMV',HFLOG,'XY',XSFV,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'INPRT',HFLOG,'XY',XINRT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'RVT',HFLOG,'XY',XRMVT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'RCT',HFLOG,'XY',XRMCT,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM,'RRT',HFLOG,'XY',XRMRT,IGRID,ILONCOM,YCOM,IREP)
+CALL IO_READ_FIELD(TPFILE,'UT',     XUT)
+CALL IO_READ_FIELD(TPFILE,'VT',     XVT)
+CALL IO_READ_FIELD(TPFILE,'WT',     XWT)
+CALL IO_READ_FIELD(TPFILE,'THT',    XTHT)
+CALL IO_READ_FIELD(TPFILE,'TKET',   XTKET)
+!PW:TODO: where are these fields (LM,THW_FLX,DISS,FMU,FMV) written?
+!Warning: not in fieldlist => won't be found
+CALL IO_READ_FIELD(TPFILE,'LM',     XLM)
+CALL IO_READ_FIELD(TPFILE,'THW_FLX',XWPTHP)
+CALL IO_READ_FIELD(TPFILE,'DISS',   XDISSIP)
+CALL IO_READ_FIELD(TPFILE,'FMU',    XSFU)
+CALL IO_READ_FIELD(TPFILE,'FMV',    XSFV)
+CALL IO_READ_FIELD(TPFILE,'INPRT',  XINRT)
+CALL IO_READ_FIELD(TPFILE,'RVT',    XRMVT)
+CALL IO_READ_FIELD(TPFILE,'RCT',    XRMCT)
+CALL IO_READ_FIELD(TPFILE,'RRT',    XRMRT)
 !
 !              Lecture des donnees Meso-NH terminee.'
 !
 !*	2.4 Fermeture du fichier Meso-NH.
 !
-CALL FMCLOS_LL(HFM,'KEEP',HFLOG,IREP)
+CALL IO_FILE_CLOSE_ll(TPFILE,HFLOG,IREP)
 !
 !
 !*	3.  PREPARATION DES DONNEES.
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index d9784ea91..a55957ed6 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -3,7 +3,7 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ######spl
-        SUBROUTINE MNH2LPDM_INI(HFM1,HFM2,HFLOG,KFLOG,KFGRI,KFDAT,KVERB)
+        SUBROUTINE MNH2LPDM_INI(TPFILE1,TPFILE2,HFLOG,KFLOG,KFGRI,KFDAT)
 !--------------------------------------------------------------------------
 !* MNH2S2_INI    : INITIALISATION DU COUPLAGE MESO-NH / LPDM.
 !
@@ -18,7 +18,6 @@
 !	KFLOG   Unite logique du fichier-log.
 !	IFGRI   Unite logique du fichier GRILLE.
 !       IFDAT   Unite logique du fichier DATE
-!	KVERB   Niveau de blabla.
 !
 !--------------------------------------------------------------------------
 !
@@ -41,9 +40,9 @@ USE MODD_TIME
 USE MODD_TIME_n
 !
 USE MODE_FM
+USE MODE_FMREAD
 USE MODE_GRIDPROJ
 USE MODE_IO_ll
-USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 USE MODE_MODELN_HANDLER
 USE MODI_XYTOLATLON
 !
@@ -56,33 +55,30 @@ USE MODI_TEMPORAL_DIST
 !
 IMPLICIT NONE
 !
-CHARACTER(LEN=*), INTENT(IN)  :: HFM1,HFM2,HFLOG
-INTEGER,          INTENT(IN)  :: KFLOG,KFGRI,KFDAT,KVERB
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE1,TPFILE2
+CHARACTER(LEN=*),       INTENT(IN)    :: HFLOG
+INTEGER,                INTENT(IN)    :: KFLOG,KFGRI,KFDAT
 !
 !
 !*	0.3 Variables locales.
 !
 CHARACTER(LEN=28)     :: YNAME,YDAD     ! Noms du FM et de son papa.
-CHARACTER(LEN=100)    :: YCOM           ! Commentaire MNH.
 CHARACTER(LEN=2)      :: YSTORAGE       ! Type de variable.
 !
-INTEGER, DIMENSION(3) :: IDATMDL,IDATCUR1,IDATCUR2 ! Date  du modele, Date courante
-REAL                  :: ZSECMDL,ZSECCUR1,ZSECCUR2 ! Heure du modele, Heure courante
 REAL                  :: ZECHEANCE1,ZECHEANCE2     ! dist temp date modele - date courante
 INTEGER               :: IHHMDL,IMNMDL,ISSMDL ! h - mn - s du model
 INTEGER               :: IHHCUR1,IMNCUR1,ISSCUR1
 INTEGER               :: IHHCUR2,IMNCUR2,ISSCUR2
 CHARACTER(LEN=14)     :: YDATMDL,YDATCUR1,YDATCUR2
 !
-INTEGER               :: INBART,IGRID,ILONCOM,IREP
+INTEGER               :: IREP
 REAL                  :: XLATOR,XLONOR,XPTLAT,XPTLON
 REAL                  :: XXPTSOMNH,XYPTSOMNH
 INTEGER               :: JI,JJ,JK,a
 INTEGER               :: b,c,I
+INTEGER, DIMENSION(:),   ALLOCATABLE   :: TAB1D
 INTEGER, DIMENSION(:,:), ALLOCATABLE   :: TAB2D
-INTEGER, DIMENSION(:), ALLOCATABLE   :: TAB1D
-TYPE(TFILEDATA),POINTER :: TZFM1 => NULL()
-TYPE(TFILEDATA),POINTER :: TZFM2 => NULL()
+TYPE(DATE_TIME)         :: TZDTCUR1,TZDTCUR2,TZDTEXP1
 !
 !
 !
@@ -99,49 +95,44 @@ CALL GOTO_MODEL(1)
 !
 !*	2.1 Ouverture du fichier Meso-NH.
 !
-CALL IO_FILE_ADD2LIST(TZFM1,TRIM(HFM1),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=KVERB)
-CALL IO_FILE_ADD2LIST(TZFM2,TRIM(HFM2),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=KVERB)
-CALL IO_FILE_OPEN_ll(TZFM1,HFLOG,IREP)
-CALL IO_FILE_OPEN_ll(TZFM2,HFLOG,IREP)
+CALL IO_FILE_OPEN_ll(TPFILE1,HFLOG,IREP)
+CALL IO_FILE_OPEN_ll(TPFILE2,HFLOG,IREP)
 !
 !
 !*      2.2 Date et heure du modele.
 !
-CALL FMREAD(HFM1,'DTEXP%TDATE',HFLOG,'--',IDATMDL,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM1,'DTEXP%TIME', HFLOG,'--',ZSECMDL,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM1,'DTCUR%TDATE',HFLOG,'--',IDATCUR1,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM1,'DTCUR%TIME', HFLOG,'--',ZSECCUR1,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM2,'DTCUR%TDATE',HFLOG,'--',IDATCUR2,IGRID,ILONCOM,YCOM,IREP)
-CALL FMREAD(HFM2,'DTCUR%TIME', HFLOG,'--',ZSECCUR2,IGRID,ILONCOM,YCOM,IREP)
-!
-CALL TEMPORAL_DIST(IDATCUR1(1),IDATCUR1(2),IDATCUR1(3), &
-                   ZSECCUR1,IDATMDL(1),IDATMDL(2),IDATMDL(3), &
-                   ZSECMDL,ZECHEANCE1)
-CALL TEMPORAL_DIST(IDATCUR2(1),IDATCUR2(2),IDATCUR2(3), &
-                   ZSECCUR2,IDATMDL(1),IDATMDL(2),IDATMDL(3), &
-                   ZSECMDL,ZECHEANCE2)
-!
-IHHMDL=INT(ZSECMDL/3600)
-IMNMDL=INT((ZSECMDL-IHHMDL*3600)/60)
-ISSMDL=INT(ZSECMDL-IHHMDL*3600-IMNMDL*60)
-IHHCUR1=INT(ZSECCUR1/3600)
-IMNCUR1=INT((ZSECCUR1-IHHCUR1*3600)/60)
-ISSCUR1=INT(ZSECCUR1-IHHCUR1*3600-IMNCUR1*60)
-IHHCUR2=INT(ZSECCUR2/3600)
-IMNCUR2=INT((ZSECCUR2-IHHCUR2*3600)/60)
-ISSCUR2=INT(ZSECCUR2-IHHCUR2*3600-IMNCUR2*60)
-!
-WRITE(YDATMDL,'(I4.4,5I2.2)') IDATMDL(1), IDATMDL(2), IDATMDL(3), &
+CALL IO_READ_FIELD(TPFILE1,'DTEXP',TZDTEXP1)
+CALL IO_READ_FIELD(TPFILE1,'DTCUR',TZDTCUR1)
+CALL IO_READ_FIELD(TPFILE2,'DTCUR',TZDTCUR2)
+!
+CALL TEMPORAL_DIST(TZDTCUR1%TDATE%YEAR,TZDTCUR1%TDATE%MONTH,TZDTCUR1%TDATE%DAY,TZDTCUR1%TIME, &
+                   TZDTEXP1%TDATE%YEAR,TZDTEXP1%TDATE%MONTH,TZDTEXP1%TDATE%DAY,TZDTEXP1%TIME, &
+                   ZECHEANCE1)
+CALL TEMPORAL_DIST(TZDTCUR2%TDATE%YEAR,TZDTCUR2%TDATE%MONTH,TZDTCUR2%TDATE%DAY,TZDTCUR2%TIME, &
+                   TZDTEXP1%TDATE%YEAR,TZDTEXP1%TDATE%MONTH,TZDTEXP1%TDATE%DAY,TZDTEXP1%TIME, &
+                   ZECHEANCE2)
+!
+IHHMDL=INT(TZDTEXP1%TIME/3600)
+IMNMDL=INT((TZDTEXP1%TIME-IHHMDL*3600)/60)
+ISSMDL=INT(TZDTEXP1%TIME-IHHMDL*3600-IMNMDL*60)
+IHHCUR1=INT(TZDTCUR1%TIME/3600)
+IMNCUR1=INT((TZDTCUR1%TIME-IHHCUR1*3600)/60)
+ISSCUR1=INT(TZDTCUR1%TIME-IHHCUR1*3600-IMNCUR1*60)
+IHHCUR2=INT(TZDTCUR2%TIME/3600)
+IMNCUR2=INT((TZDTCUR2%TIME-IHHCUR2*3600)/60)
+ISSCUR2=INT(TZDTCUR2%TIME-IHHCUR2*3600-IMNCUR2*60)
+!
+WRITE(YDATMDL, '(I4.4,5I2.2)') TZDTEXP1%TDATE%YEAR, TZDTEXP1%TDATE%MONTH, TZDTEXP1%TDATE%DAY, &
                                IHHMDL, IMNMDL, ISSMDL
-WRITE(YDATCUR1,'(I4.4,5I2.2)') IDATCUR1(1), IDATCUR1(2), IDATCUR1(3), &
+WRITE(YDATCUR1,'(I4.4,5I2.2)') TZDTCUR1%TDATE%YEAR, TZDTCUR1%TDATE%MONTH, TZDTCUR1%TDATE%DAY, &
                                IHHCUR1, IMNCUR1, ISSCUR1
-WRITE(YDATCUR2,'(I4.4,5I2.2)') IDATCUR2(1), IDATCUR2(2), IDATCUR2(3), &
+WRITE(YDATCUR2,'(I4.4,5I2.2)') TZDTCUR2%TDATE%YEAR, TZDTCUR2%TDATE%MONTH, TZDTCUR2%TDATE%DAY, &
                                IHHCUR2, IMNCUR2, ISSCUR2
 ! 
-NMDLAA=MOD( IDATMDL(1), 100 )  ! Annee arrondi a 2 chiffres.
-NMDLMM=IDATMDL(2)
-NMDLJJ=IDATMDL(3)
-NMDLSS=NINT(ZSECMDL)
+NMDLAA=MOD( TZDTEXP1%TDATE%YEAR, 100 )  ! Annee arrondi a 2 chiffres.
+NMDLMM=TZDTEXP1%TDATE%MONTH
+NMDLJJ=TZDTEXP1%TDATE%DAY
+NMDLSS=NINT(TZDTEXP1%TIME)
 !
 !*	Heure du modele arrondie a 5 minutes pres.
 !
@@ -152,7 +143,7 @@ NMDLMN =NMDLMN-NMDLHH*60
 !
 !*	2.3 Grille horizontale.
 !
-CALL READ_HGRID(1,TZFM1,YNAME,YDAD,YSTORAGE)
+CALL READ_HGRID(1,TPFILE1,YNAME,YDAD,YSTORAGE)
 IF (YNAME == YDAD) THEN
 IGRILLE=1
 ELSE
@@ -172,7 +163,7 @@ NJE=NJU-JPHEXT
 !
 !*	2.4 Nombre de niveaux-verticaux.
 !
-CALL FMREAD(HFM1,'KMAX',HFLOG,'--',NKMAX,IGRID,ILONCOM,YCOM,IREP)
+CALL IO_READ_FIELD(TPFILE1,'KMAX',NKMAX)
 !WRITE(KFLOG,*) '%%% MNH2S2_INI Lecture du nombre de niveau OK.'
 !
 NKU = NKMAX+2*JPVEXT
@@ -202,15 +193,16 @@ ALLOCATE( XSFV(NIU,NJU))
 !
 !*	2.6 Decoupage vertical.
 !
-CALL FMREAD(HFM1,'ZHAT',HFLOG,'--',XZHAT,IGRID,ILONCOM,YCOM,IREP)
+CALL IO_READ_FIELD(TPFILE1,'ZHAT',XZHAT)
 !
 !*	2.7 Orographie. 
 !
-CALL FMREAD(HFM1,'ZS',HFLOG,'XY',XZS,IGRID,ILONCOM,YCOM,IREP)
+CALL IO_READ_FIELD(TPFILE1,'ZS',XZS)
 !
 !*	2.8 Rugosite Z0. 
 !
-CALL FMREAD(HFM1,'Z0',HFLOG,'XY',XZ0,IGRID,ILONCOM,YCOM,IREP)
+!PW:TODO: where is this field written? Warning: not in fieldlist => won't be found
+CALL IO_READ_FIELD(TPFILE1,'Z0',XZ0)
 !
 XXPTSOMNH=XXHAT(1)+(XXHAT(2)-XXHAT(1))/2
 XYPTSOMNH=XYHAT(1)+(XYHAT(2)-XYHAT(1))/2
@@ -435,8 +427,8 @@ DEALLOCATE(XZHAT)
 !
 !	 Fermeture du fichier Meso-NH.
 !
-CALL IO_FILE_CLOSE_ll(TZFM1,HFLOG,IREP)
-CALL IO_FILE_CLOSE_ll(TZFM2,HFLOG,IREP)
+CALL IO_FILE_CLOSE_ll(TPFILE1,HFLOG,IREP)
+CALL IO_FILE_CLOSE_ll(TPFILE2,HFLOG,IREP)
 !
 !
 !-------------------------------------------'
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index d0c81808c..d2bd7fa30 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -62,7 +62,7 @@ INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE
 INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
 ! sizes of the North-south total LB area
 INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
-INTEGER, INTENT(IN):: KSIZELBYTKE_ll                ! for TKE
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
 INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
 REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
 REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PDUM,PDVM,PDWM  ! Difference on U,V,W 
@@ -100,23 +100,23 @@ REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
 REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
 REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
 ! Forcing fields
-INTEGER,              INTENT(IN)  :: KFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTFRC ! date of forcing profs.
-REAL, DIMENSION(:,:), INTENT(OUT) :: PUFRC,PVFRC,PWFRC ! forcing variables
-REAL, DIMENSION(:,:), INTENT(OUT) :: PTHFRC,PRVFRC
-REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
-REAL, DIMENSION(:),   INTENT(OUT) :: PPGROUNDFRC
-REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PATC
-INTEGER,              INTENT(IN)  :: KADVFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTADVFRC ! date of forcing profs.
-REAL, DIMENSION(:,:,:,:),   INTENT(OUT) :: PDTHFRC, PDRVFRC
-INTEGER,              INTENT(IN)  :: KRELFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTRELFRC ! date of forcing profs.
-REAL, DIMENSION(:,:,:,:),   INTENT(OUT) :: PTHREL, PRVREL
-REAL, DIMENSION(:,:,:),     INTENT(OUT) :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS_CLD
-REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
+INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
+REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
+INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
+INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
+REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
 !
 !
 END SUBROUTINE READ_FIELD
@@ -124,7 +124,8 @@ END SUBROUTINE READ_FIELD
 END INTERFACE
 !
 END MODULE MODI_READ_FIELD
-!     ######spl
+!
+!     ########################################################################
       SUBROUTINE READ_FIELD(TPINIFILE,HLUOUT,KMASDEV,KIU,KJU,KKU,PTSTEP,     &
             HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,                &
             HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,     &
@@ -267,7 +268,7 @@ USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
 USE MODD_SALT
 USE MODD_TIME ! for type DATE_TIME
 !
-USE MODE_FIELD,           ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FIELD,           ONLY: TFIELDDATA,TYPEDATE,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll,           ONLY: UPCASE
@@ -312,7 +313,7 @@ INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE
 INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
 ! sizes of the North-south total LB area
 INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
-INTEGER, INTENT(IN):: KSIZELBYTKE_ll                ! for TKE
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
 INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
 !
 REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
@@ -354,57 +355,39 @@ REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-d
 !
 !       
 ! Forcing fields
-INTEGER,              INTENT(IN)  :: KFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTFRC ! date of forcing profs.
-REAL, DIMENSION(:,:), INTENT(OUT) :: PUFRC,PVFRC,PWFRC ! forcing variables
-REAL, DIMENSION(:,:), INTENT(OUT) :: PTHFRC,PRVFRC
-REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
-REAL, DIMENSION(:),   INTENT(OUT) :: PPGROUNDFRC
-REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PATC
-INTEGER,              INTENT(IN)  :: KADVFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTADVFRC ! date of forcing profs.
-REAL, DIMENSION(:,:,:,:),   INTENT(OUT) :: PDTHFRC, PDRVFRC
-INTEGER,              INTENT(IN)  :: KRELFRC              ! number of forcing
-TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTRELFRC ! date of forcing profs.
-REAL, DIMENSION(:,:,:,:),   INTENT(OUT) :: PTHREL, PRVREL
-REAL, DIMENSION(:,:,:),     INTENT(OUT) :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
-REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS_CLD
-REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
-!
+INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
+REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
+INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
+INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
+REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
 !
 !*       0.2   declarations of local variables
 !
-REAL, DIMENSION(KIU,KJU,KKU) :: Z3D               ! 3D array used to read  data
-                                                  ! in initial file 
-REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK             ! to compute supersaturation 
-INTEGER             :: IGRID,ILENCH,IRESP         !   File 
-CHARACTER (LEN=NMNHNAMELGTMAX) :: YRECFM                ! management
-CHARACTER (LEN=100) :: YCOMMENT                   ! variables 
-CHARACTER (LEN=2)   :: YDIR                       !
-INTEGER             :: ILUOUT                     ! Unit number for prints
-INTEGER             :: JSV                        ! Loop index for additional
-                                                  ! scalar variables
-INTEGER             :: ISV                        ! total number of  scalar variables
-INTEGER             :: JKLOOP,JRR                 ! Loop indexes
-INTEGER             :: IIUP,IJUP                  ! size  of working 
-                                                  ! window arrays
-REAL                :: Z1,Z2                      ! coeff. for the temporal 
-                                                  ! interpolation
-INTEGER             :: JT                  ! loop index
-REAL, DIMENSION(KKU)        :: Z1D    ! forcing working arrays
-INTEGER, DIMENSION(3)       :: ITDATE ! date array
-CHARACTER(LEN=3)            :: YFRC   ! To mark the different forcing dates
-LOGICAL :: GLSOURCE ! switch for the source term (for ini_ls and ini_lb)
-CHARACTER (LEN=2)      :: YSTORAGE_TYPE
-! ---------------------------------------------------------------------
-! Modif PP ADV FRC
-REAL, DIMENSION(KIU)        :: X1D    ! forcing working arrays
-REAL, DIMENSION(KIU,KJU,KKU):: XDTH3D,XDRV3D
-!
-CHARACTER(LEN=2)  :: INDICE
-INTEGER           :: I
-TYPE(TFIELDDATA)  :: TZFIELD
+INTEGER                      :: I
+INTEGER                      :: ILUOUT       ! Unit number for prints
+INTEGER                      :: IRESP
+INTEGER                      :: ISV          ! total number of  scalar variables
+INTEGER                      :: JSV          ! Loop index for additional scalar variables
+INTEGER                      :: JKLOOP,JRR   ! Loop indexes
+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)
+CHARACTER(LEN=2)             :: INDICE
+CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
+REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
+TYPE(TFIELDDATA)             :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -412,11 +395,8 @@ TYPE(TFIELDDATA)  :: TZFIELD
 !              ---------------
 !
 GLSOURCE=.FALSE.
-Z3D = 0.0 
 ZWORK = 0.0
 !
-IF (IRESP /= 0) YSTORAGE_TYPE='TT'
-!
 !-------------------------------------------------------------------------------
 !
 !*       2.    READ PROGNOSTIC VARIABLES
@@ -425,77 +405,52 @@ IF (IRESP /= 0) YSTORAGE_TYPE='TT'
 !*       2.1  Time t:
 !
 IF (KMASDEV<50) THEN
-  YRECFM = 'UM'
+  CALL IO_READ_FIELD(TPINIFILE,'UM',PUT)
+  CALL IO_READ_FIELD(TPINIFILE,'VM',PVT)
+  CALL IO_READ_FIELD(TPINIFILE,'WM',PWT)
+  CALL IO_READ_FIELD(TPINIFILE,'THM',PTHT)
+  CALL IO_READ_FIELD(TPINIFILE,'PABSM',PPABST)
 ELSE
-  YRECFM = 'UT'
+  CALL IO_READ_FIELD(TPINIFILE,'UT',PUT)
+  CALL IO_READ_FIELD(TPINIFILE,'VT',PVT)
+  CALL IO_READ_FIELD(TPINIFILE,'WT',PWT)
+  CALL IO_READ_FIELD(TPINIFILE,'THT',PTHT)
+  CALL IO_READ_FIELD(TPINIFILE,'PABST',PPABST)
 ENDIF
-CALL IO_READ_FIELD(TPINIFILE,YRECFM,PUT)
-!
-IF (KMASDEV<50) THEN
-  YRECFM = 'VM'
-ELSE
-  YRECFM = 'VT'
-END IF
-CALL IO_READ_FIELD(TPINIFILE,YRECFM,PVT)
-!
-IF (KMASDEV<50) THEN
-  YRECFM = 'WM'
-ELSE
-  YRECFM = 'WT'
-END IF
-CALL IO_READ_FIELD(TPINIFILE,YRECFM,PWT)
-!
-IF (KMASDEV<50) THEN
-  YRECFM = 'THM'
-ELSE
-  YRECFM = 'THT'
-END IF
-CALL IO_READ_FIELD(TPINIFILE,YRECFM,PTHT)
-!
-IF (KMASDEV<50) THEN
-  YRECFM = 'PABSM'
-ELSE
-  YRECFM = 'PABST'
-END IF
-CALL IO_READ_FIELD(TPINIFILE,YRECFM,PPABST)
-PPABSM = PPABST
 !
 SELECT CASE(HGETTKET)                   
   CASE('READ')
     IF (KMASDEV<50) THEN
-      YRECFM = 'TKEM'
+      CALL IO_READ_FIELD(TPINIFILE,'TKEM',PTKET)
     ELSE
-      YRECFM = 'TKET'
+      CALL IO_READ_FIELD(TPINIFILE,'TKET',PTKET)
     END IF
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PTKET)
     IF (KMASDEV>50 .AND. (CCONF == 'RESTA')) THEN
-      CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRTKEMS)
+      CALL IO_READ_FIELD(TPINIFILE,'TKEMS',PRTKEMS)
     END IF
   CASE('INIT')
-    PTKET(:,:,:)=XTKEMIN
-    PRTKEMS(:,:,:)=0.               
+    PTKET(:,:,:)   = XTKEMIN
+    PRTKEMS(:,:,:) = 0.
 END SELECT 
 !
 SELECT CASE(HGETRVT)             ! vapor
   CASE('READ')
     IF (KMASDEV<50) THEN
-      YRECFM = 'RVM'
+      CALL IO_READ_FIELD(TPINIFILE,'RVM',PRT(:,:,:,IDX_RVT))
     ELSE
-      YRECFM='RVT'
+      CALL IO_READ_FIELD(TPINIFILE,'RVT',PRT(:,:,:,IDX_RVT))
     END IF
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RVT))
   CASE('INIT')
-    PRT(:,:,:,IDX_RVT)=0.
+    PRT(:,:,:,IDX_RVT) = 0.
 END SELECT 
 !
 SELECT CASE(HGETRCT)             ! cloud 
   CASE('READ') 
     IF (KMASDEV<50) THEN
-      YRECFM = 'RCM'
+      CALL IO_READ_FIELD(TPINIFILE,'RCM',PRT(:,:,:,IDX_RCT))
     ELSE
-      YRECFM='RCT'
+      CALL IO_READ_FIELD(TPINIFILE,'RCT',PRT(:,:,:,IDX_RCT))
     END IF
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RCT))
   CASE('INIT')
     PRT(:,:,:,IDX_RCT) = 0.
 END SELECT
@@ -503,11 +458,10 @@ END SELECT
 SELECT CASE(HGETRRT)             ! rain 
   CASE('READ') 
     IF (KMASDEV<50) THEN
-      YRECFM = 'RRM'
+      CALL IO_READ_FIELD(TPINIFILE,'RRM',PRT(:,:,:,IDX_RRT))
     ELSE
-      YRECFM ='RRT'
+      CALL IO_READ_FIELD(TPINIFILE,'RRT',PRT(:,:,:,IDX_RRT))
     END IF 
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RRT))
   CASE('INIT')
     PRT(:,:,:,IDX_RRT) = 0.
 END SELECT
@@ -515,49 +469,45 @@ END SELECT
 SELECT CASE(HGETRIT)             ! cloud ice
   CASE('READ') 
     IF (KMASDEV<50) THEN
-      YRECFM = 'RIM'
+      CALL IO_READ_FIELD(TPINIFILE,'RIM',PRT(:,:,:,IDX_RIT))
     ELSE
-      YRECFM ='RIT'
+      CALL IO_READ_FIELD(TPINIFILE,'RIT',PRT(:,:,:,IDX_RIT))
     END IF 
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RIT))
   CASE('INIT')
-    PRT(:,:,:,IDX_RIT)=0.
+    PRT(:,:,:,IDX_RIT) = 0.
 END SELECT
 !
 SELECT CASE(HGETRST)             ! snow
   CASE('READ')
     IF (KMASDEV<50) THEN
-      YRECFM = 'RSM'
+      CALL IO_READ_FIELD(TPINIFILE,'RSM',PRT(:,:,:,IDX_RST))
     ELSE
-      YRECFM ='RST'
+      CALL IO_READ_FIELD(TPINIFILE,'RST',PRT(:,:,:,IDX_RST))
     END IF 
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RST))
   CASE('INIT')
-    PRT(:,:,:,IDX_RST)=0.
+    PRT(:,:,:,IDX_RST) = 0.
 END SELECT
 !
 SELECT CASE(HGETRGT)             ! graupel
   CASE('READ') 
     IF (KMASDEV<50) THEN
-      YRECFM = 'RGM'
+      CALL IO_READ_FIELD(TPINIFILE,'RGM',PRT(:,:,:,IDX_RGT))
     ELSE
-      YRECFM ='RGT'
+      CALL IO_READ_FIELD(TPINIFILE,'RGT',PRT(:,:,:,IDX_RGT))
     END IF 
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RGT))
   CASE('INIT')
-    PRT(:,:,:,IDX_RGT)=0.
+    PRT(:,:,:,IDX_RGT) = 0.
 END SELECT
 !
 SELECT CASE(HGETRHT)             ! hail
   CASE('READ') 
     IF (KMASDEV<50) THEN
-      YRECFM = 'RHM'
+      CALL IO_READ_FIELD(TPINIFILE,'RHM',PRT(:,:,:,IDX_RHT))
     ELSE
-      YRECFM ='RHT'
+      CALL IO_READ_FIELD(TPINIFILE,'RHT',PRT(:,:,:,IDX_RHT))
     END IF 
-    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RHT))
   CASE('INIT')
-    PRT(:,:,:,IDX_RHT)=0.
+    PRT(:,:,:,IDX_RHT) = 0.
 END SELECT
 !
 SELECT CASE(HGETCIT)             ! ice concentration
@@ -569,7 +519,6 @@ END SELECT
 !
 !  Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV
 !
-YDIR='XY'
 ISV= SIZE(PSVT,4)
 !
 IF (NSV_USER>0) THEN
@@ -696,19 +645,17 @@ DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
 ! N IMM nucl
     I = 0
     IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-    I = I + 1
-    WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
+      I = I + 1
+      WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
       TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
-  END IF
+    END IF
 ! Hom. freez. of CCN
-  IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
+    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
       TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'T'
-  END IF
-!
-  TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
-  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z3D)
+    END IF
 !
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
   CASE ('INIT')
     PSVT(:,:,:,JSV) = 0.
   END SELECT
@@ -808,29 +755,47 @@ IF (NSV_CHICEND>=NSV_CHICBEG) THEN
   END DO
 END IF
 !
-DO JSV = NSV_SLTBEG,NSV_SLTEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_SLTEND>=NSV_SLTBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_SLTBEG,NSV_SLTEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
 IF (NSV_DSTEND>=NSV_DSTBEG) THEN
   TZFIELD%CSTDNAME   = ''
@@ -846,7 +811,6 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
         TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
         TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
         WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
-        YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
         CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
       CASE ('INIT')
         PSVT(:,:,:,JSV) = 0.
@@ -854,123 +818,194 @@ IF (NSV_DSTEND>=NSV_DSTBEG) THEN
   END DO
 END IF
 !
-DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)  
-    CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-END SELECT
-END DO
-
-DO JSV = NSV_AERBEG,NSV_AEREND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)  
-    CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-END SELECT
-END DO
+IF (NSV_AEREND>=NSV_AERBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_AERBEG,NSV_AEREND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_LGBEG,NSV_LGEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_PPBEG,NSV_PPEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    IF ( IRESP ==0 ) THEN
-       PSVT(:,:,:,JSV) = Z3D(:,:,:)
-    ELSE
-       PSVT(:,:,:,JSV) = 0.
-    END IF
-    WRITE(YRECFM,'(A3,I3.3)')'ATC',JSV
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
-    IF (IRESP == 0) THEN
-      PATC(:,:,:,JSV-NSV_PPBEG+1) = Z3D(:,:,:)
-    ELSE
-      PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. 
-    ENDIF
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-    PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
-  END SELECT
-END DO
+IF (NSV_LGEND>=NSV_LGBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'm'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_LGBEG,NSV_LGEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(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
+  !
+  DO JSV = NSV_PPBEG,NSV_PPEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CUNITS     = 'kg kg-1'
+        CALL IO_READ_FIELD(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  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
+        TZFIELD%CUNITS     = 'm-3'
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PATC(:,:,:,JSV-NSV_PPBEG+1),IRESP)
+        IF (IRESP/=0) THEN
+          PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+        ENDIF
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+        PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+    END SELECT
+  END DO
+END IF
 !
 #ifdef MNH_FOREFIRE
-DO JSV = NSV_FFBEG,NSV_FFEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    IF (IRESP == 0) THEN
-       PSVT(:,:,:,JSV) = Z3D(:,:,:)
-    ELSE
-       PSVT(:,:,:,JSV) = 0.
-    END IF
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+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
+  !
+  DO JSV = NSV_FFBEG,NSV_FFEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(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
 !
-DO JSV = NSV_CSBEG,NSV_CSEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    IF ( IRESP ==0 ) THEN
-       PSVT(:,:,:,JSV) = Z3D(:,:,:)
-    ELSE
-       PSVT(:,:,:,JSV) = 0.
-    END IF
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+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
+  !
+  DO JSV = NSV_CSBEG,NSV_CSEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(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
 !
-DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM='LINOXT'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_LNOXBEG,NSV_LNOXEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = 'LINOXT'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
 IF (CCONF == 'RESTA') THEN
   CALL IO_READ_FIELD(TPINIFILE,'US_PRES',PRUS_PRES)
@@ -998,18 +1033,30 @@ IF (CCONF == 'RESTA') THEN
     END SELECT
   END DO
   DO JSV = NSV_C2R2BEG,NSV_C2R2END
-   IF (JSV == NSV_C2R2BEG ) THEN
-    YRECFM='RSVS_CLD1'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRSVS_CLD(:,:,:,JSV) = Z3D(:,:,:)
-   END IF
-   IF (JSV == NSV_C2R2BEG ) THEN
-    YRECFM='RSVS_CLD2'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRSVS_CLD(:,:,:,JSV) = Z3D(:,:,:)
-   END IF
+    IF (JSV == NSV_C2R2BEG ) THEN
+      TZFIELD%CMNHNAME   = 'RSVS_CLD1'
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: RSVS_CLD1'
+      TZFIELD%CUNITS     = '1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
+    END IF
+    IF (JSV == NSV_C2R2BEG ) THEN
+      TZFIELD%CMNHNAME   = 'RSVS_CLD2'
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: RSVS_CLD2'
+      TZFIELD%CUNITS     = '1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_RHS_CLD'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
+    END IF
   END DO
 END IF
 !
@@ -1056,8 +1103,7 @@ CALL IO_READ_FIELD(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass
 !
 SELECT CASE(HGETSRCT)                ! turbulent flux SRC at time t
   CASE('READ')
-    CALL IO_READ_FIELD(TPINIFILE,'SRCT',Z3D)
-    PSRCT(:,:,:)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,'SRCT',PSRCT)
   CASE('INIT')
     PSRCT(:,:,:)=0.
 END SELECT
@@ -1137,65 +1183,127 @@ IF ( LFORCING ) THEN
   DO JT=1,KFRC
 !
     WRITE (YFRC,'(I3.3)') JT
-    YRECFM='DTFRC'//YFRC//'%TDATE' ! array of rank 3 for date
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-    TPDTFRC(JT)%TDATE%YEAR  = ITDATE(1)
-    TPDTFRC(JT)%TDATE%MONTH = ITDATE(2)
-    TPDTFRC(JT)%TDATE%DAY   = ITDATE(3)
-    YRECFM='DTFRC'//YFRC//'%TIME'
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,TPDTFRC(JT)%TIME,IGRID,ILENCH, &
-                YCOMMENT,IRESP)
-!
-    YRECFM='UFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PUFRC(:,JT)=Z1D(:)
-!
-    YRECFM='VFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PVFRC(:,JT)=Z1D(:)
-!
-    YRECFM='WFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PWFRC(:,JT)=Z1D(:)
-!
-    YRECFM='THFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PTHFRC(:,JT)=Z1D(:)
-!
-    YRECFM='RVFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PRVFRC(:,JT)=Z1D(:)
-!
-    YRECFM='TENDTHFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PTENDTHFRC(:,JT)=Z1D(:)
-!
-    YRECFM='TENDRVFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PTENDRVFRC(:,JT)=Z1D(:)
-!
-    YRECFM='GXTHFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PGXTHFRC(:,JT)=Z1D(:)
-!
-    YRECFM='GYTHFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
-    PGYTHFRC(:,JT)=Z1D(:)
-!
-    YRECFM='PGROUNDFRC'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPGROUNDFRC(JT),IGRID,ILENCH,YCOMMENT,IRESP)
+!
+    TZFIELD%CMNHNAME   = 'DTFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPDTFRC(JT))
+!
+    TZFIELD%CMNHNAME   = 'UFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PUFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'VFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PVFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'WFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = 'Vertical forcing wind'
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PWFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'THFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = 'Forcing potential temperature'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PTHFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'RVFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PRVFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'TENDTHFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PTENDTHFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'TENDRVFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PTENDRVFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'GXTHFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PGXTHFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'GYTHFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PGYTHFRC(:,JT))
+!
+    TZFIELD%CMNHNAME   = 'PGROUNDFRC'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'Pa'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = 'Forcing ground pressure'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PPGROUNDFRC(JT))
 !
   END DO
 END IF
@@ -1204,88 +1312,96 @@ END IF
 IF (L2D_ADV_FRC) THEN
 
   DO JT=1,KADVFRC  
-
     WRITE (YFRC,'(I3.3)') JT
-    YRECFM='DTADV'//YFRC//'%TDATE' ! array of rank 3 for date
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-    TPDTADVFRC(JT)%TDATE%YEAR  = ITDATE(1)
-    TPDTADVFRC(JT)%TDATE%MONTH = ITDATE(2)
-    TPDTADVFRC(JT)%TDATE%DAY   = ITDATE(3)
     !
-    YRECFM='DTADV'//YFRC//'%TIME'
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,TPDTADVFRC(JT)%TIME,IGRID,ILENCH, &
-	    YCOMMENT,IRESP)
-    YRECFM='TH_ADV'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
-                                                         YCOMMENT,IRESP)
-    PDTHFRC(:,:,:,JT)=XDTH3D(:,:,:)
+    TZFIELD%CMNHNAME   = 'DTADV'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPDTADVFRC(JT))
     !
-    YRECFM='Q_ADV'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
-                                                         YCOMMENT,IRESP)
-    
-    PDRVFRC(:,:,:,JT)=XDRV3D(:,:,:)
+    TZFIELD%CMNHNAME   = 'TH_ADV'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K s-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDTHFRC(:,:,:,JT))
+    !
+    TZFIELD%CMNHNAME   = 'Q_ADV'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'kg kg-1 s-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDRVFRC(:,:,:,JT))
   ENDDO
 ENDIF
 !
 IF (L2D_REL_FRC) THEN
 
   DO JT=1,KRELFRC  
-
     WRITE (YFRC,'(I3.3)') JT
-    YRECFM='DTREL'//YFRC//'%TDATE' ! array of rank 3 for date
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-    TPDTRELFRC(JT)%TDATE%YEAR  = ITDATE(1)
-    TPDTRELFRC(JT)%TDATE%MONTH = ITDATE(2)
-    TPDTRELFRC(JT)%TDATE%DAY   = ITDATE(3)
-
+    !
+    TZFIELD%CMNHNAME   = 'DTREL'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//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
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPDTRELFRC(JT))
+    !
     ! Relaxation
-
-    YRECFM='TH_REL'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
-                                                         YCOMMENT,IRESP)
-    
-    PTHREL(:,:,:,JT)=XDTH3D(:,:,:)
+    TZFIELD%CMNHNAME   = 'TH_REL'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PTHREL(:,:,:,JT))
     !
-    YRECFM='Q_REL'//YFRC
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
-                                                         YCOMMENT,IRESP)
-
-    PRVREL(:,:,:,JT)=XDRV3D(:,:,:)
-
-    ENDDO
-
+    TZFIELD%CMNHNAME   = 'Q_REL'//YFRC
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'kg kg-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PRVREL(:,:,:,JT))
+  ENDDO
 ENDIF
-
 !
 IF (LUV_FLX) THEN
-   IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN 
-       YRECFM='VU_FLX'
-       YDIR='--'
-       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVU_FLUX_M,IGRID, &
-                   ILENCH,YCOMMENT,IRESP)
-   ELSE IF (CCONF == 'START') THEN
-       PVU_FLUX_M(:,:,:)=0.
-   END IF
+  IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN
+    CALL IO_READ_FIELD(TPINIFILE,'VU_FLX',PVU_FLUX_M)
+  ELSE IF (CCONF == 'START') THEN
+    PVU_FLUX_M(:,:,:)=0.
+  END IF
 ENDIF
 !
 IF (LTH_FLX) THEN
-   IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN 
-       YRECFM='VT_FLX'
-       YDIR='--'
-       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVTH_FLUX_M,IGRID, &
-                   ILENCH,YCOMMENT,IRESP)
-       YRECFM='WT_FLX'
-       YDIR='--'
-       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWTH_FLUX_M,IGRID, &
-                   ILENCH,YCOMMENT,IRESP)       
+  IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN
+    CALL IO_READ_FIELD(TPINIFILE,'VT_FLX',PVTH_FLUX_M)
+    CALL IO_READ_FIELD(TPINIFILE,'WT_FLX',PWTH_FLUX_M)
    ELSE IF (CCONF == 'START') THEN
        PWTH_FLUX_M(:,:,:)=0.
        PVTH_FLUX_M(:,:,:)=0.
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index 0c19c6baf..8008ce226 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -1062,24 +1062,7 @@ CHARACTER(LEN=100),     INTENT(OUT) :: HCOMMENT ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-INTEGER           :: IMASDEV        ! mesonh version of the input file
-INTEGER           :: IBUGFIX        ! mesonh bugfix version of the input file
-INTEGER           :: IIMAX, IJMAX
-!
-REAL              :: ZDIM_SUM
-INTEGER           :: INFO_ll
-!
-!* variables for reading of old (masdev4_5 and before) files
-LOGICAL, DIMENSION(255) :: GCOVER
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOVER
-INTEGER :: JCOVER
-CHARACTER(LEN=LEN_HREC) :: YRECFM
-!JUANZ
-INTEGER           :: NCOVER,ICOVER,IKL2
-REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
-!JUANZ
+INTEGER          :: IIMAX, IJMAX
 TYPE(TFIELDDATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
@@ -1088,78 +1071,7 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFN0_MNH',TRIM(TPINFILE%CNAME)//': readi
 !
 KRESP=0
 !
-CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
-CALL IO_READ_FIELD(TPINFILE,'BUGFIX',IBUGFIX)
-!
-IF ((HREC=='DIM_FULL' .OR. HREC=='DIM_NATURE' .OR. HREC=='DIM_SEA'  &
-                      .OR. HREC=='DIM_WATER'  .OR. HREC=='DIM_TOWN')&
-    .AND. (IMASDEV<46 .OR. (IMASDEV==46 .AND. IBUGFIX<=2))          ) THEN
-
-  IF (HREC=='DIM_FULL') THEN
-    KFIELD=SIZE(NMASK)
-  ELSE
-    YRECFM='LCOVER'
-    CALL FMREAD(CFILE,YRECFM,COUT,'XY',GCOVER(:),IGRID,ILENCH,HCOMMENT,KRESP)
-    IF (KRESP/=0) THEN
-      !* ground_ocean case
-      KFIELD=SIZE(NMASK)
-      KRESP=0
-    ELSE
-      ALLOCATE(ZCOVER(NIU,NJU,255))
-      ZCOVER(:,:,:) = 0.
-      DO JCOVER=1,255
-        IF (.NOT. GCOVER(JCOVER)) CYCLE
-        WRITE(YRECFM,'(A5,I3.3)') 'COVER',JCOVER
-        CALL FMREAD(CFILE,YRECFM,COUT,'XY',ZCOVER(:,:,JCOVER),IGRID,ILENCH,HCOMMENT,KRESP)
-      END DO
-      SELECT CASE (HREC)
-         CASE('DIM_SEA')
-           KFIELD=COUNT(ZCOVER(NIB:NIE,NJB:NJE,1)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,242) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,243)>0.)
-         CASE('DIM_TOWN')
-           KFIELD=COUNT(ZCOVER(NIB:NIE,NJB:NJE,7)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,151) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,152) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,153) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,154) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,155) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,156) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,157) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,158) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,159) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,160) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,161)>0.)
-         CASE('DIM_WATER')
-           KFIELD=COUNT(ZCOVER(NIB:NIE,NJB:NJE,2)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,3)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,124) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,125) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,176) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,238) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,239) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,240) &
-                       +ZCOVER(NIB:NIE,NJB:NJE,241)>0.)
-         CASE('DIM_NATURE')
-           KFIELD=COUNT(ZCOVER(NIB:NIE,NJB:NJE,1)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,2)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,3)   &
-                       +ZCOVER(NIB:NIE,NJB:NJE,243)<1.-1.E-8)
-      END SELECT
-      DEALLOCATE(ZCOVER)
-    END IF
-  END IF
-
-  ZDIM_SUM = FLOAT(KFIELD)
-  IF (CPROGRAM/='PGD   ' .AND. CPROGRAM/='NESPGD') THEN
-     CALL REDUCESUM_ll(ZDIM_SUM,INFO_ll)
-     KFIELD=NINT(ZDIM_SUM)
-  ENDIF
-  HCOMMENT = ' '
-  KRESP = 0
-  WRITE(NLUOUT,*) 'HREC=', HREC, 'KFIELD=', KFIELD
-
-ELSE IF (HREC=='DIM_FULL' .AND. ( CPROGRAM=='IDEAL ' .OR.  &
+IF (HREC=='DIM_FULL' .AND. ( CPROGRAM=='IDEAL ' .OR.  &
                                   CPROGRAM=='SPAWN ' .OR. CPROGRAM=='ZOOMPG' ))THEN
    CALL IO_READ_FIELD(TPINFILE,'IMAX',IIMAX)
    CALL IO_READ_FIELD(TPINFILE,'JMAX',IJMAX)
@@ -1866,7 +1778,7 @@ END SUBROUTINE READ_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR
+USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR,TYPEINT,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
@@ -1929,12 +1841,22 @@ END IF
 !  RETURN
 !END IF
 !
-YRECFM=TRIM(HREC)//'%TDATE'
-CALL FMREAD(CFILE,YRECFM,COUT,'--',ITDATE(:,:),IGRID,ILENCH,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_READ_FIELD(TPINFILE,TZFIELD,ITDATE(:,:),KRESP)
+!
 KYEAR(:)  = ITDATE(1,:)
 KMONTH(:) = ITDATE(2,:)
 KDAY(:)   = ITDATE(3,:)
-
+!
 IF (KRESP /=0) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
@@ -1943,9 +1865,18 @@ IF (KRESP /=0) THEN
   WRITE(NLUOUT,*) ' '
 ENDIF
 !
-YRECFM=TRIM(HREC)//'%TIME'
-CALL FMREAD(CFILE,YRECFM,COUT,'--',PTIME(:),IGRID,ILENCH,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_READ_FIELD(TPINFILE,TZFIELD,PTIME(:),KRESP)
+!
 IF (KRESP /=0) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 9b05fd882..efbac78f8 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -153,50 +153,43 @@ END MODULE MODI_SPAWN_FIELD2
 !*       0.     DECLARATIONS
 !               ------------
 !
-USE MODD_IO_ll, ONLY : TFILEDATA
-USE MODD_PARAMETERS       ! Declarative modules 
+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_CONF_n,   ONLY:  CONF_MODEL
-USE MODD_LBC_n,    ONLY:  LBC_MODEL
-USE MODD_LUNIT_n,  ONLY:  LUNIT_MODEL
-USE MODD_FIELD_n,  ONLY:  FIELD_MODEL
-USE MODD_REF_n,    ONLY:  REF_MODEL
-!
-USE MODD_NSV
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
+USE MODD_CONF_n,          ONLY:  CONF_MODEL
 USE MODD_DUST,            ONLY: CDUSTNAMES
-USE MODD_SALT,            ONLY: CSALTNAMES
-USE MODD_CH_AEROSOL,      ONLY: CAERONAMES
-USE MODD_LG,              ONLY: CLGNAMES
 USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
-!
-USE MODD_BIKHARDT_n
-USE MODD_LUNIT_n
-USE MODD_SPAWN
-!
-USE MODI_BIKHARDT
-!
-USE MODE_FMREAD
-USE MODE_THERMO
-USE MODE_MODELN_HANDLER
-USE MODE_IO_ll, ONLY: UPCASE
-!
+USE MODD_FIELD_n,         ONLY:  FIELD_MODEL
+USE MODD_IO_ll,           ONLY : TFILEDATA
+USE MODD_LATZ_EDFLX
+USE MODD_LBC_n,           ONLY:  LBC_MODEL
+USE MODD_LG,              ONLY: CLGNAMES
+USE MODD_LUNIT_n,         ONLY:  CLUOUT,LUNIT_MODEL
+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_ADVFRC_n 
+USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
 USE MODD_RELFRC_n 
-USE MODD_2D_FRC
-!
-USE MODD_LATZ_EDFLX
+USE MODD_SALT,            ONLY: CSALTNAMES
+USE MODD_SPAWN
 !
-USE MODE_MPPDB
+USE MODE_FIELD,           ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FMREAD
+USE MODE_IO_ll,           ONLY: UPCASE
 USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_THERMO
+!
+USE MODI_BIKHARDT
 !
 IMPLICIT NONE
 !
@@ -271,15 +264,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZPABST1,ZHUT1
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1
 LOGICAL :: GUSERV
 !
-INTEGER             :: IGRID,ILENCH   !   File
-CHARACTER (LEN=NMNHNAMELGTMAX)  :: YRECFM         ! management
-CHARACTER (LEN=NMNHNAMELGTMAX)  :: YRECFM_T        ! management
-CHARACTER (LEN=NMNHNAMELGTMAX)  :: YRECFM_M        ! management
-CHARACTER (LEN=100) :: YCOMMENT       ! variables
-CHARACTER (LEN=2)   :: YDIR
-!
 CHARACTER(LEN=2)  :: INDICE
 INTEGER           :: I
+TYPE(TFIELDDATA)             :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -727,7 +714,6 @@ END IF
 ! (LS fields are not treated because they are identical in the father file)
 !
 IF (PRESENT(TPSONFILE)) THEN
-  YDIR='XY'
   !
   !variables which always exist
   !
@@ -743,44 +729,37 @@ IF (PRESENT(TPSONFILE)) THEN
   IRR=1
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     GUSERV=.TRUE.
-    YRECFM='RVT'             ! Vapor at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RVT',ZWORK3D,IRESP) ! Vapor at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RCT'             ! Cloud at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RCT',ZWORK3D,IRESP) ! Cloud at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RRT'             ! Rain at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RRT',ZWORK3D,IRESP) ! Rain at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RIT'             ! Ice at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RIT',ZWORK3D,IRESP) ! Ice at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RST'             ! Snow at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RST',ZWORK3D,IRESP) ! Snow at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RGT'             ! Graupel at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'RGT',ZWORK3D,IRESP) ! Graupel at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
-    YRECFM='RHT'             ! Hail at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'HVT',ZWORK3D,IRESP) ! Hail at time t
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
@@ -788,11 +767,9 @@ IF (PRESENT(TPSONFILE)) THEN
   WRITE(ILUOUT,FMT=*) 'SPAWN_FIELD2: spawing with a SON input file'
   WRITE(ILUOUT,FMT=*) '    ',CONF_MODEL(1)%NRR,' moist variables in model1 and model2, ',    &
                              IRR,' moist variables in input SON'
-  YRECFM='THT'               ! Theta at time t
-  CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPSONFILE,'THT',ZWORK3D) ! Theta at time t
   ZTHT1(:,:,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-  YRECFM='PABST'             ! Pressure at time t
-  CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPSONFILE,'PABST',ZWORK3D) ! Pressure at time t
   ZPABST1(:,:,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   !
   CALL COMPUTE_THV_HU(GUSERV,ZRT1,ZTHT1,ZPABST1,ZTHVT1,ZHUT1)
@@ -806,184 +783,380 @@ IF (PRESENT(TPSONFILE)) THEN
   ! TKE variables
   !
   IF (HTURB/='NONE') THEN
-    YRECFM='TKET'             ! Turbulence Kinetic Energy at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'TKET',ZWORK3D,IRESP) ! Turbulence Kinetic Energy at time t
     IF(IRESP==0) PTKET(KIB2:KIE2,KJB2:KJE2,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   END IF
   !
   ! Scalar variables
   !
   IF (NSV /= 0) THEN
-    DO JSV = 1, NSV_USER      ! Users Scalar Variables
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_C2R2BEG,NSV_C2R2END  ! C2R2 Scalar Variables
-      YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-!
-! LIMA variables
-!
+    ! 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
+      !
+      DO JSV = 1, NSV_USER      ! Users Scalar Variables
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(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
+      !
+      DO JSV = NSV_C2R2BEG,NSV_C2R2END
+        TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(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
-! Nc
+      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
+      ! Nc
       IF (JSV .EQ. NSV_LIMA_NC) THEN
-         YRECFM_T=TRIM(CLIMA_WARM_NAMES(1))//'T'
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(1))//'T'
       END IF
-! Nr
+      ! Nr
       IF (JSV .EQ. NSV_LIMA_NR) THEN
-         YRECFM_T=TRIM(CLIMA_WARM_NAMES(2))//'T'
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(2))//'T'
       END IF
-! N CCN free
+      ! 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)
-         YRECFM_T=TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
+        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
       END IF
-! N CCN acti
+      ! 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)
-         YRECFM_T=TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
+        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
       END IF
-! Scavenging
+      ! Scavenging
       IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-         YRECFM_T=TRIM(CAERO_MASS(1))//'T'
+        TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
+        TZFIELD%CUNITS     = 'kg kg-1'
       END IF
-! Ni
+      ! Ni
       IF (JSV .EQ. NSV_LIMA_NI) THEN
-         YRECFM_T=TRIM(CLIMA_COLD_NAMES(1))//'T'
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(1))//'T'
       END IF
-! N IFN free
+      ! 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)
-         YRECFM_T=TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T'
+        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T'
       END IF
-! N IFN nucl
+      ! 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)
-         YRECFM_T=TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T'
+        WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T'
       END IF
-! N IMM nucl
+      ! N IMM nucl
       I = 0
       IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
-         I = I + 1
-         WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
-         YRECFM_T=TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
+        I = I + 1
+        WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
       END IF
-! Hom. freez. of CCN
+      ! Hom. freez. of CCN
       IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-         YRECFM_T=TRIM(CLIMA_COLD_NAMES(5))//'T'
+        TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'T'
       END IF
-! time t
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM_T,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-!
-    DO JSV = NSV_ELECBEG,NSV_ELECEND  ! ELEC Scalar Variables
-      YRECFM=TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_CHEMBEG,NSV_CHEMEND ! Chemical Scalar Variables
-      YRECFM=TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_CHICBEG,NSV_CHICEND ! Ice phase chemical Scalar Variables
-      YRECFM=TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_AERBEG,NSV_AEREND ! Orilam Scalar Variables
-      YRECFM=TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_DSTBEG,NSV_DSTEND ! Dust Scalar Variables
-      YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_SLTBEG,NSV_SLTEND ! Sea Salt Scalar Variables
-      YRECFM=TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_LGBEG,NSV_LGEND     ! LG Scalar Variables
-      YRECFM=TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_LNOXBEG,NSV_LNOXEND     ! LNOx Scalar Variables
-      YRECFM='LINOX'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = NSV_PPBEG,NSV_PPEND     ! Passive scalar variables
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      ! time t
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      CALL IO_READ_FIELD(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
+      !
+      DO JSV = NSV_ELECBEG,NSV_ELECEND
+        TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//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,A8)')'X_Y_Z_','SVT',JSV,' (C/m3)'
+        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_READ_FIELD(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     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_CHEMBEG,NSV_CHEMEND
+        TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+        CALL IO_READ_FIELD(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
+      CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_CHICBEG,NSV_CHICEND
+        TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
+    !
+    ! Orilam Scalar Variables
+    !
+    IF (NSV_AEREND>=NSV_AERBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_AERBEG,NSV_AEREND
+        TZFIELD%CMNHNAME   = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
+    !
+    ! Dust Scalar Variables
+    !
+    IF (NSV_DSTEND>=NSV_DSTBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_DSTBEG,NSV_DSTEND
+        TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
+    !
+    ! Sea Salt Scalar Variables
+    !
+    IF (NSV_SLTEND>=NSV_SLTBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_SLTBEG,NSV_SLTEND
+        TZFIELD%CMNHNAME   = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(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
+      !
+      DO JSV = NSV_LGBEG,NSV_LGEND
+        TZFIELD%CMNHNAME   = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
+    !
+    ! LNOx Scalar Variables
+    !
+!PW:TODO/bug1?: LINOX or LINOXT?
+!PW:TODO/bug2?: Same name of variable in a loop!
+    IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp' !PW: TODO: not sure (depends if LINOX or LINOXT)
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_LNOXBEG,NSV_LNOXEND
+        TZFIELD%CMNHNAME   = 'LINOX'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(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
+      !
+      DO JSV = NSV_PPBEG,NSV_PPEND
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
 #ifdef MNH_FOREFIRE
-    DO JSV = NSV_FFBEG,NSV_FFEND     ! ForeFire variables
-      WRITE(YRECFM,'(A3,I3.3)')'SVM',JSV
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
+    !
+    ! 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
+      !
+      DO JSV = NSV_FFBEG,NSV_FFEND
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
 #endif
-    DO JSV = NSV_CSBEG,NSV_CSEND     ! Passive scalar variables
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
-    DO JSV = 1,NSV_PP               ! Passive scalar variables
-      YRECFM='ATC'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
-      IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
+    !
+    ! Passive scalar variables
+    !
+    IF (NSV_CSEND>=NSV_CSBEG) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'kg kg-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = NSV_CSBEG,NSV_CSEND
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(TPSONFILE,TZFIELD,ZWORK3D,IRESP)
+        IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
+      END DO
+    END IF
+    !
+    ! Passive scalar variables
+    !
+    IF (NSV_PP>=1) THEN
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'm-3'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      DO JSV = 1,NSV_PP
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
+        CALL IO_READ_FIELD(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
-   DO JSV = 1,NSV_FF               ! ForeFire variables
-      YRECFM='ATC'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
-      IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-    END DO
+    !
+    ! 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
+      !
+      DO JSV = 1,NSV_FF
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_FFBEG-1
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_FFBEG-1
+        CALL IO_READ_FIELD(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
   !
   ! Secondary pronostic variables
   !
   IF (HTURB /= 'NONE' .AND. IRR>1) THEN
-    YRECFM='SRCT'                  ! turbulent flux SRC at time t
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
-    IF( IRESP /= 0 ) THEN
-      YRECFM='SRC'
-      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,          &
-                  YCOMMENT,IRESP)
-    END IF
+    CALL IO_READ_FIELD(TPSONFILE,'SRCT',ZWORK3D,IRESP) ! turbulent flux SRC at time t
     IF(IRESP == 0) PSRCT(KIB2:KIE2,KJB2:KJE2,:) =                    &
                                         ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-
-    YRECFM='SIGS'                  ! subgrid condensation
-    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPSONFILE,'SIGS',ZWORK3D,IRESP) ! subgrid condensation
     IF(IRESP == 0) PSIGS(KIB2:KIE2,KJB2:KJE2,:) =                    &
                                         ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   END IF
-- 
GitLab