From 3b4531989f9e93019c63fba8d683dfa01efc0fcf Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 5 Dec 2017 16:16:23 +0100
Subject: [PATCH] Philippe 05/12/2017: IO: added TDESFILE and TDATAFILE fields
 to TFILEDATA structure + use them

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |  2 +
 src/LIB/SURCOUCHE/src/mode_fm.f90             |  2 +-
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 20 ++++++++-
 src/MNH/ini_prog_var.f90                      | 23 ++++-------
 src/MNH/ini_segn.f90                          | 41 ++++++++-----------
 src/MNH/modeln.f90                            |  4 +-
 src/MNH/prep_ideal_case.f90                   |  4 +-
 src/MNH/prep_real_case.f90                    |  4 +-
 src/MNH/read_desfmn.f90                       | 30 ++++++++------
 src/MNH/read_exsegn.f90                       | 23 +++++------
 src/MNH/read_surf_mnh.f90                     |  5 +--
 src/MNH/spawn_model2.f90                      |  6 +--
 src/MNH/write_desfmn.f90                      | 33 +++++++++------
 13 files changed, 104 insertions(+), 93 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index d3aa13599..f3f7f4f7b 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -105,6 +105,8 @@ TYPE TFILEDATA
   CHARACTER(LEN=10) :: CACCESS = "UNKNOWN" !Fortran ACCESS (DIRECT/SEQUENTIAL)
   !
   TYPE(TFILEDATA),POINTER :: TDADFILE   => NULL() !Corresponding dad file
+  TYPE(TFILEDATA),POINTER :: TDESFILE   => NULL() !Corresponding .des file
+  TYPE(TFILEDATA),POINTER :: TDATAFILE  => NULL() !Corresponding data file (if .des file)
   TYPE(TFILEDATA),POINTER :: TFILE_PREV => NULL()
   TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL()
 END TYPE TFILEDATA
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 3a5bc9b96..2f2ff7782 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -181,7 +181,7 @@ SELECT CASE(TPFILE%CTYPE)
   CASE DEFAULT
     !Do not open '.des' file if OUTPUT
     IF(TPFILE%CTYPE/='OUTPUT') THEN
-      CALL IO_FILE_ADD2LIST(TZFILE_DES,TRIM(TPFILE%CNAME)//'.des','DES',TPFILE%CMODE,OOLD=.TRUE.) !OOLD=T because the file may already be in the list
+      CALL IO_FILE_ADD2LIST(TZFILE_DES,TRIM(TPFILE%CNAME)//'.des','DES',TPFILE%CMODE,TPDATAFILE=TPFILE,OOLD=.TRUE.) !OOLD=T because the file may already be in the list
       CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','OPEN_ll for '//TRIM(TPFILE%CNAME)//'.des')
       CALL OPEN_ll(TZFILE_DES,FORM='FORMATTED',DELIM='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=OPARALLELIO)
       TZFILE_DES%LOPENED       = .TRUE.
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 44e18762d..03d3bc3d2 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -573,7 +573,8 @@ END SUBROUTINE POPULATE_STRUCT
 !
 END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT
 !
-SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,HFORM,HACCESS,KLFINPRAR,KLFITYPE,KLFIVERB,KRECL,TPDADFILE,OOLD)
+SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE, &
+                            HFORM,HACCESS,KLFINPRAR,KLFITYPE,KLFIVERB,KRECL,TPDADFILE,TPDATAFILE,OOLD)
 !
 USE MODD_BAKOUT,         ONLY : LOUT_COMPRESS,LOUT_REDUCE_FLOAT_PRECISION,NOUT_COMPRESS_LEVEL
 USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX
@@ -589,6 +590,7 @@ INTEGER,                OPTIONAL,INTENT(IN)    :: KLFITYPE  !Type of the file (u
 INTEGER,                OPTIONAL,INTENT(IN)    :: KLFIVERB  !LFI verbosity level
 INTEGER,                OPTIONAL,INTENT(IN)    :: KRECL     !Record length
 TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN)    :: TPDADFILE !Corresponding dad file
+TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN)    :: TPDATAFILE!Corresponding data file (used only for DES files)
 LOGICAL,                OPTIONAL,INTENT(IN)    :: OOLD      !FALSE if new file (should not be found)
                                                             !TRUE if the file could already be in the list
                                                             !     (add it only if not yet present)
@@ -672,6 +674,9 @@ IF(.NOT.PRESENT(KRECL) .AND. TRIM(HTYPE)=='SURFACE_DATA') THEN
                                                          ' files in DIRECT access')
 END IF
 !
+IF (PRESENT(TPDATAFILE) .AND. TRIM(HTYPE)/='DES') &
+    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_ADD2LIST','optional argument TPDATAFILE is not used by '//TRIM(HTYPE)//' files')
+!
 IF (.NOT.ASSOCIATED(TFILE_LAST)) THEN
   ALLOCATE(TFILE_LAST)
   TFILE_FIRST => TFILE_LAST
@@ -707,6 +712,19 @@ SELECT CASE(TPFILE%CTYPE)
     TPFILE%CFORMAT = 'TEXT'
 
 
+  !DES files
+  CASE('DES')
+    TPFILE%CFORMAT = 'TEXT'
+    IF (.NOT.PRESENT(TPDATAFILE)) THEN
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','missing TPDATAFILE argument for DES file '//TRIM(HNAME))
+    ELSE
+      IF (.NOT.ASSOCIATED(TPDATAFILE)) &
+        CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','TPDATAFILE is not associated for DES file '//TRIM(HNAME))
+      TPFILE%TDATAFILE => TPDATAFILE
+      TPDATAFILE%TDESFILE => TPFILE
+    END IF
+
+
   !GPS files
   CASE('GPS')
     IF (TRIM(HMODE)/='WRITE') & !Invalid because not (yet) necessary
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index 1545a64d6..b8fa5f5db 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -104,18 +104,18 @@ END MODULE MODI_INI_PROG_VAR
 !
 !
 USE MODD_CH_AEROSOL
-USE MODD_CH_M9_n, ONLY : NEQ, CNAMES
-USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH 
+USE MODD_CH_M9_n,          ONLY: NEQ, CNAMES
+USE MODD_CH_MNHC_n,        ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH 
 USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_DIM_n
 USE MODD_DUST
 USE MODD_DYN_n
 USE MODD_FIELD_n
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll,            ONLY: TFILEDATA
 USE MODD_LSFIELD_n
 USE MODD_LUNIT
-USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_LUNIT_n,          ONLY: TLUOUT
 USE MODD_NSV
 USE MODD_PARAM_n
 USE MODD_PARAMETERS
@@ -123,9 +123,9 @@ USE MODD_SALT
 USE MODD_TURB_n
 !
 USE MODE_IO_ll
-USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
-USE MODE_FIELD,            ONLY : TFIELDDATA,TYPEREAL
-USE MODE_FM
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+USE MODE_FIELD,            ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll, IO_FILE_OPEN_ll
 USE MODE_FMREAD
 USE MODE_MODELN_HANDLER
 USE MODE_MSG
@@ -153,7 +153,6 @@ CHARACTER(LEN=*),       INTENT(IN),OPTIONAL :: HCHEMFILE  ! Name of the chem fil
 INTEGER                :: ILUOUT                     !  Logical unit number
                                                      ! associated with HLUOUT 
 INTEGER                :: IRESP
-CHARACTER(LEN=32)      :: YDESFM
 !
 INTEGER                :: IIMAX,IJMAX,IKMAX       !  Dimensions of the chem file
 INTEGER :: IMI ! model number
@@ -223,6 +222,8 @@ IF(PRESENT(HCHEMFILE)) THEN
   CALL IO_FILE_ADD2LIST(TZCHEMFILE,TRIM(HCHEMFILE),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
   CALL IO_FILE_OPEN_ll(TZCHEMFILE)
   !
+  ILUDES = TZCHEMFILE%TDESFILE%NLU
+  !
   CALL IO_READ_FIELD(TZCHEMFILE,'IMAX',IIMAX,IRESP)
   IF (IRESP/=0) THEN
    !callabortstop
@@ -256,24 +257,18 @@ IF(PRESENT(HCHEMFILE)) THEN
     LUSECHEM = .TRUE.
   END IF
   IF (LORILAM) THEN
-    YDESFM=TRIM(ADJUSTL(HCHEMFILE))//'.des'
-    CALL FMLOOK_ll(YDESFM,HLUOUT,ILUDES,IRESP)
     CALL POSNAM(ILUDES,'NAM_CH_ORILAM',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM)
   ENDIF
   IF (LDUST) THEN
     LDSTINIT=.TRUE.
     LDSTPRES=.FALSE.
-    YDESFM=TRIM(ADJUSTL(HCHEMFILE))//'.des'
-    CALL FMLOOK_ll(YDESFM,HLUOUT,ILUDES,IRESP)
     CALL POSNAM(ILUDES,'NAM_DUST',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DUST)
   ENDIF
   IF (LSALT) THEN
     LSLTINIT=.TRUE.
     LSLTPRES=.FALSE.
-    YDESFM=TRIM(ADJUSTL(HCHEMFILE))//'.des'
-    CALL FMLOOK_ll(YDESFM,HLUOUT,ILUDES,IRESP)
     CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT)
     IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT)
   ! initialise NSV_* variables
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 59375f20c..ff854ef15 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -171,21 +171,21 @@ END MODULE MODI_INI_SEG_n
 !*       0.    DECLARATIONS
 !              ------------
 USE MODD_CONF
-USE MODD_CONF_n, ONLY : CSTORAGE_TYPE
+USE MODD_CONF_n,           ONLY: CSTORAGE_TYPE
 USE MODN_CONFZ
 USE MODD_DYN
-USE MODD_IO_ll,   ONLY : ISP,LIOCDF4,LLFIREAD,NVERB_FATAL,NVERB_WARNING,TFILE_OUTPUTLISTING,TFILEDATA
+USE MODD_IO_ll,            ONLY: ISP,LIOCDF4,LLFIREAD,NVERB_FATAL,NVERB_WARNING,TFILE_OUTPUTLISTING,TFILEDATA
 USE MODD_LUNIT
-USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL
-USE MODD_PARAM_n, ONLY : CSURF
+USE MODD_LUNIT_n,          ONLY: CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL
+USE MODD_PARAM_n,          ONLY: CSURF
 USE MODD_PARAMETERS
-USE MODD_REF,   ONLY : LBOUSS
+USE MODD_REF,              ONLY: LBOUSS
 !
 USE MODE_FIELD
 USE MODE_FMREAD
-USE MODE_FM
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll, IO_FILE_OPEN_ll
 USE MODE_IO_ll
-USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 USE MODE_MSG
 USE MODE_POS
 !
@@ -194,7 +194,7 @@ USE MODI_READ_DESFM_n
 USE MODI_READ_EXSEG_n
 USE MODI_WRITE_DESFM_n
 !
-USE MODN_CONFIO, ONLY : NAM_CONFIO
+USE MODN_CONFIO,           ONLY: NAM_CONFIO
 USE MODN_LUNIT_n
 !
 IMPLICIT NONE
@@ -210,7 +210,6 @@ REAL,DIMENSION(:),          INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL mod
 !*       0.1   declarations of local variables
 !
 LOGICAL            :: GFOUND              ! Return code when searching namelist
-CHARACTER (LEN=32) :: YEXSEG,YDESFM               ! name of descriptor files
 CHARACTER (LEN=28) :: YINIFILE                    ! name of initial file
 CHARACTER (LEN=2)  :: YMI                         ! string for model index
 INTEGER            :: IMASDEV                     ! version of MESOHN file  
@@ -277,10 +276,8 @@ WRITE(UNIT=ILUOUT,FMT='(50("*"),/,"*",17X,"MODEL ",I1," LISTING",16X,"*",/,  &
             & 50("*"))') KMI
 !
 IF (CPROGRAM=='MESONH') THEN
-  YEXSEG='EXSEG'//TRIM(ADJUSTL(YMI))//'.nam'
-  CALL IO_FILE_ADD2LIST(TZFILE_DES,TRIM(YEXSEG),'NML','READ')
+  CALL IO_FILE_ADD2LIST(TZFILE_DES,'EXSEG'//TRIM(ADJUSTL(YMI))//'.nam','NML','READ')
   CALL IO_FILE_OPEN_ll(TZFILE_DES)
-  ILUSEG=TZFILE_DES%NLU
 !
 !*       1.3   SPAWNING or SPEC or REAL program case
 !              ---------------------
@@ -288,20 +285,18 @@ IF (CPROGRAM=='MESONH') THEN
 ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL  '.OR. CPROGRAM=='SPEC  ') THEN
   YINIFILE    = CINIFILE_n
   HINIFILEPGD = CINIFILEPGD_n
-  YEXSEG=TRIM(ADJUSTL(CINIFILE_n))//'.des'
   CALL IO_FILE_ADD2LIST(TPINIFILE,TRIM(YINIFILE),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
   CALL IO_FILE_OPEN_ll(TPINIFILE)
-  CALL FMLOOK_ll(YEXSEG,CLUOUT0,ILUSEG,IRESP)
+  TZFILE_DES => TPINIFILE%TDESFILE
 !
 !*       1.3bis   DIAG program case
 !
 ELSE IF (CPROGRAM=='DIAG  ') THEN
   YINIFILE    = CINIFILE_n
   HINIFILEPGD = CINIFILEPGD_n
-  YEXSEG=TRIM(ADJUSTL(CINIFILE_n))//'.des'
   CALL IO_FILE_ADD2LIST(TPINIFILE,TRIM(YINIFILE),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
   CALL IO_FILE_OPEN_ll(TPINIFILE)
-  CALL FMLOOK_ll(YEXSEG,CLUOUT0,ILUSEG,IRESP)
+  TZFILE_DES => TPINIFILE%TDESFILE
 !   
 !*       1.4   Other program cases
 !              -------------------
@@ -311,6 +306,8 @@ ELSE
   CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','should not be called for CPROGRAM='//TRIM(CPROGRAM))
 ENDIF
 !
+ILUSEG = TZFILE_DES%NLU
+!
 !-------------------------------------------------------------------------------
 !
 !*      2.    SET DEFAULT VALUES
@@ -355,18 +352,16 @@ END IF
 !*      4.    READ DESFM FILE
 !             ---------------
 !
-YDESFM=TRIM(ADJUSTL(YINIFILE))//'.des'
-!
-CALL READ_DESFM_n(KMI,YDESFM,YCONF,GFLAT,GUSERV,GUSERC,                     &
+CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC,                  &
                 GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,GUSECHAQ,&
                 GUSECHIC,GCH_PH,GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,      &
                 GDEPOS_DST, GCHTRANS, GORILAM,                              &
-                GDEPOS_AER, GLG, GPASPOL, &
+                GDEPOS_AER, GLG, GPASPOL,                                   &
 #ifdef MNH_FOREFIRE
-                GFOREFIRE, &
+                GFOREFIRE,                                                  &
 #endif
                 GLNOX_EXPLICIT,                                             &
-                GCONDSAMP, IRIMX,IRIMY,ISV,       &
+                GCONDSAMP, IRIMX,IRIMY,ISV,                                 &
                 YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS   )
 !
 !-------------------------------------------------------------------------------
@@ -447,7 +442,7 @@ END IF
 ! routine which read related informations in the EXSEG descriptor in order to 
 ! check coherence between both informations.
 !
-CALL READ_EXSEG_n(KMI,YEXSEG,YCONF,GFLAT,GUSERV,GUSERC,                     &
+CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC,                 &
                 GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,         &
                 GUSECHAQ,GUSECHIC,GCH_PH,                                   &
                 GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,GDEPOS_DST,GCHTRANS,  &
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 97ea0b143..c6633090e 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -614,7 +614,7 @@ IF (KTCOUNT == 1) THEN
   CALL IO_FILE_OPEN_ll(TDIAFILE)
 !
   CALL IO_WRITE_HEADER(TDIAFILE)
-  CALL WRITE_DESFM_n(IMI,TRIM(TDIAFILE%CNAME)//'.des')
+  CALL WRITE_DESFM_n(IMI,TDIAFILE)
   CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE)
 !
 !*       1.4   Initialization of the list of fields for the halo updates
@@ -922,7 +922,7 @@ IF (IBAK < NBAK_NUMB ) THEN
     !
     CALL IO_FILE_OPEN_ll(TZBAKFILE)
     !
-    CALL WRITE_DESFM_n(IMI,TRIM(TZBAKFILE%CNAME)//'.des')
+    CALL WRITE_DESFM_n(IMI,TZBAKFILE)
     CALL IO_WRITE_HEADER(TBACKUPN(IBAK)%TFILE)
     CALL WRITE_LFIFM_n(TBACKUPN(IBAK)%TFILE,TBACKUPN(IBAK)%TFILE%TDADFILE%CNAME)
     COUTFMFILE = TZBAKFILE%CNAME
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 55fbf54b3..a49e987af 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -459,7 +459,6 @@ INTEGER :: JLOOP,JILOOP,JJLOOP     ! Loop indexes
 INTEGER :: NIB,NJB,NKB             ! Begining useful area  in x,y,z directions
 INTEGER :: NIE,NJE                 ! Ending useful area  in x,y directions
 INTEGER :: NIU,NJU,NKU             ! Upper bounds in x,y,z directions
-CHARACTER (LEN=32) :: CDESFM             ! Name of DESFM file 
 CHARACTER(LEN=4)   :: CIDEAL ='CSTN'     ! kind of idealized fields
                                          ! 'CSTN' : Nv=cste case 
                                          ! 'RSOU' : radiosounding case
@@ -1738,7 +1737,6 @@ NNPRAR = 22 + 2*(NRR+NSV)   &    ! 22 = number of grid variables + reference
                                  ! 2*(8+NRR+NSV) + 1 = number of prognostic
                                  ! variables at time t and t-dt
 NTYPE=1
-CDESFM=ADJUSTL(ADJUSTR(CINIFILE)//'.des')
 !
 CALL IO_FILE_ADD2LIST(TINIFILE,TRIM(CINIFILE),'PREPIDEALCASE','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
 !
@@ -1746,7 +1744,7 @@ CALL IO_FILE_OPEN_ll(TINIFILE)
 !
 CALL IO_WRITE_HEADER(TINIFILE)
 !
-CALL WRITE_DESFM_n(1,CDESFM)
+CALL WRITE_DESFM_n(1,TINIFILE)
 !
 CALL WRITE_LFIFM_n(TINIFILE,'')  ! There is no DAD model for PREP_IDEAL_CASE
 !
diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90
index eaef806ea..a3fe2ae9c 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -493,7 +493,6 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE:: ZJ       ! Jacobian
 !
 !* file management variables and counters
 !
-CHARACTER (LEN=32)                :: YDESFM   ! Name of DESFM file 
 INTEGER                           :: ILUOUT0  ! logical unit for listing file
 INTEGER                           :: IPRE_REAL1 ! logical unit for namelist file
 INTEGER                           :: IRESP    ! return code in FM routines
@@ -1061,8 +1060,7 @@ IF (YATMFILETYPE=='GRIBEX') THEN
   END DO
 END IF
 !
-YDESFM=TRIM(TINIFILE%CNAME)//'.des'
-CALL WRITE_DESFM_n(1,YDESFM)
+CALL WRITE_DESFM_n(1,TINIFILE)
 CALL IO_WRITE_HEADER(TINIFILE,HDAD_NAME=YDAD_NAME)
 CALL WRITE_LFIFM_n(TINIFILE,YDAD_NAME)
 ! 
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index b80401660..e2bbb87cd 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -13,7 +13,7 @@
 !
 INTERFACE
 !
-      SUBROUTINE READ_DESFM_n(KMI,HDESFM,HCONF,OFLAT,OUSERV,                     &
+      SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV,                 &
                    OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,             &
                    OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,       &
                    ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS,                        &
@@ -25,9 +25,12 @@ INTERFACE
                    OCONDSAMP,                                                    &
                    KRIMX,KRIMY,KSV_USER,                                         &
                    HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,HEQNSYS     )
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_PARAMETERS
+!
 INTEGER,            INTENT(IN)  :: KMI    ! Model index
-CHARACTER (LEN=32), INTENT(IN)  :: HDESFM ! name of the DESFM file
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
 CHARACTER (LEN=5),  INTENT(OUT) :: HCONF  ! configuration var. linked to FMfile
 LOGICAL,            INTENT(OUT) :: OFLAT  ! Logical for zero orography 
 LOGICAL,            INTENT(OUT) :: OUSERV ! use Rv mixing ratio               
@@ -77,7 +80,7 @@ END INTERFACE
 !
 END MODULE MODI_READ_DESFM_n
 !     #########################################################################
-      SUBROUTINE READ_DESFM_n(KMI,HDESFM,HCONF,OFLAT,OUSERV,                     &
+      SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV,                 &
                    OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,             &
                    OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,       &
                    ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS,                        &
@@ -101,8 +104,7 @@ END MODULE MODI_READ_DESFM_n
 !!
 !!**  METHOD
 !!    ------
-!!      Logical unit number of DESFM file is retrieved by calling FMLOOK.
-!!      Then, the descriptor file is read. Namelists (NAMXXXn) which contain
+!!      The descriptor file is read. Namelists (NAMXXXn) which contain
 !!    informations linked to one nested model are at the beginning of the file.
 !!    Namelists (NAMXXX) which contain variables common to all models
 !!    are at the end of the file. When the  model index is different from 1, 
@@ -129,7 +131,6 @@ END MODULE MODI_READ_DESFM_n
 !!
 !!    EXTERNAL
 !!    --------
-!!      FMLOOK : to retrieve the logical unit number of descriptor or LFI files
 !!
 !!
 !!    IMPLICIT ARGUMENTS
@@ -195,7 +196,7 @@ END MODULE MODI_READ_DESFM_n
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODD_IO_ll,   ONLY: NVERB_FATAL
+USE MODD_IO_ll,   ONLY: NVERB_FATAL, TFILEDATA
 USE MODD_LUNIT_n, ONLY: TLUOUT
 USE MODD_PARAMETERS
 !
@@ -259,7 +260,6 @@ USE MODN_PARAM_LIMA
 !
 USE MODE_MSG
 USE MODE_POS
-USE MODE_FM
 !
 IMPLICIT NONE
 !
@@ -268,7 +268,7 @@ IMPLICIT NONE
 !
 !
 INTEGER,            INTENT(IN)  :: KMI    ! Model index
-CHARACTER (LEN=32), INTENT(IN)  :: HDESFM ! name of the DESFM file
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
 CHARACTER (LEN=5),  INTENT(OUT) :: HCONF  ! configuration var. linked to FMfile
 LOGICAL,            INTENT(OUT) :: OFLAT  ! Logical for zero orography 
 LOGICAL,            INTENT(OUT) :: OUSERV ! use Rv mixing ratio               
@@ -316,8 +316,8 @@ LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_AER    ! Aerosols Wet Deposi
 !
 !*       0.2   declarations of local variables 
 !
-INTEGER :: IRESP,ILUDES, & ! return code of FMLOOK and logical unit numbers of
-              ILUOUT       ! DESFM file and output listing
+INTEGER :: ILUDES, & ! logical unit numbers of
+           ILUOUT    ! DESFM file and output listing
 LOGICAL :: GFOUND          ! Return code when searching namelist
 LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_DST ! Dust Moist flag
 LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_SLT ! Sea Salt Moist flag
@@ -328,9 +328,13 @@ LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_AER ! Orilam Moist flag
 !*       1.    READ DESFM FILE
 !              ---------------
 !
-CALL FMLOOK_ll(HDESFM,TLUOUT%CNAME,ILUDES,IRESP)
-ILUOUT = TLUOUT%NLU
+CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME))
 !
+IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) &
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME))
+!
+ILUDES = TPDATAFILE%TDESFILE%NLU
+ILUOUT = TLUOUT%NLU
 !
 CALL POSNAM(ILUDES,'NAM_LUNITN',GFOUND)
 CALL INIT_NAM_LUNITN
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index fe5d95a7e..075ccbe3d 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -14,7 +14,7 @@
 !
 INTERFACE
 !
-      SUBROUTINE READ_EXSEG_n(KMI,HEXSEG,HCONF,OFLAT,OUSERV,                       &
+      SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV,                  &
                    OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,               &
                    OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,         &
                    ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS,                         &
@@ -27,8 +27,11 @@ INTERFACE
                    KRIMX,KRIMY, KSV_USER,                                          &
                    HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,              &
                    HEQNSYS,PTSTEP_ALL,HSTORAGE_TYPE,HINIFILEPGD                    )
+!
+USE MODD_IO_ll,   ONLY: TFILEDATA
+!
 INTEGER,            INTENT(IN) :: KMI    ! Model index
-CHARACTER (LEN=*),  INTENT(IN) :: HEXSEG ! name of the EXSEG file
+TYPE(TFILEDATA),    INTENT(IN) :: TPEXSEGFILE ! EXSEG file
 !     The following variables are read by READ_DESFM in DESFM descriptor : 
 CHARACTER (LEN=*),  INTENT(IN) :: HCONF  ! configuration var. linked to FMfile
 LOGICAL,            INTENT(IN) :: OFLAT  ! Logical for zero orography
@@ -83,7 +86,7 @@ END MODULE MODI_READ_EXSEG_n
 !
 !
 !     #########################################################################
-      SUBROUTINE READ_EXSEG_n(KMI,HEXSEG,HCONF,OFLAT,OUSERV,                       &
+      SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV,                  &
                    OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,               &
                    OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,         &
                    ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS,                         &
@@ -160,8 +163,6 @@ END MODULE MODI_READ_EXSEG_n
 !!
 !!    EXTERNAL
 !!    --------
-!!      FMLOOK      : to retrieve the logical unit number of descriptor
-!!                    or LFI files
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -297,7 +298,7 @@ USE MODD_PARAMETERS
 USE MODD_CONF
 USE MODD_CONFZ
 USE MODD_CONF_n,  ONLY: CSTORAGE_TYPE
-USE MODD_IO_ll,   ONLY: NVERB_FATAL
+USE MODD_IO_ll,   ONLY: TFILEDATA
 USE MODD_LUNIT_n, ONLY: TLUOUT
 USE MODD_VAR_ll,  ONLY: NPROC
 !
@@ -348,7 +349,6 @@ USE MODD_GET_n
 USE MODD_GR_FIELD_n
 !
 USE MODE_POS
-USE MODE_FM
 USE MODE_IO_ll
 USE MODE_MSG
 !
@@ -379,7 +379,7 @@ IMPLICIT NONE
 !
 !
 INTEGER,            INTENT(IN) :: KMI    ! Model index
-CHARACTER (LEN=*),  INTENT(IN) :: HEXSEG ! name of the EXSEG file
+TYPE(TFILEDATA),    INTENT(IN) :: TPEXSEGFILE ! EXSEG file
 !     The following variables are read by READ_DESFM in DESFM descriptor : 
 CHARACTER (LEN=*),  INTENT(IN) :: HCONF  ! configuration var. linked to FMfile
 LOGICAL,            INTENT(IN) :: OFLAT  ! Logical for zero orography
@@ -428,8 +428,7 @@ CHARACTER (LEN=*),  INTENT(IN) :: HINIFILEPGD ! name of PGD file
 !
 !*       0.2   declarations of local variables
 !
-INTEGER :: IRESP,ILUSEG,ILUOUT ! return code of FMLOOK and logical unit numbers
-                               ! of EXSEG file and outputlisting
+INTEGER :: ILUSEG,ILUOUT ! logical unit numbers of EXSEG file and outputlisting
 INTEGER :: JS,JCI,JI,JSV       ! Loop indexes 
 LOGICAL :: GRELAX              
 LOGICAL :: GFOUND              ! Return code when searching namelist
@@ -441,9 +440,9 @@ INTEGER :: IMOMENTS, JMODE, IMODEIDX, JMOM, JSV_NAME, JMOD, I
 !*       1.    READ EXSEG FILE
 !              ---------------
 !
-CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_EXSEG_n','called for '//TRIM(HEXSEG))
+CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_EXSEG_n','called for '//TRIM(TPEXSEGFILE%CNAME))
 !
-CALL FMLOOK_ll(HEXSEG,TLUOUT%CNAME,ILUSEG,IRESP)
+ILUSEG = TPEXSEGFILE%NLU
 ILUOUT = TLUOUT%NLU
 !
 CALL INIT_NAM_LUNITN
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index cd2588081..8562c486c 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -1286,7 +1286,6 @@ END SUBROUTINE READ_SURFN1_MNH
 !
 USE MODE_ll
 USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR
-USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
 USE MODE_POS
@@ -1314,7 +1313,6 @@ INTEGER           :: ILUOUT
 !
 INTEGER           :: IMASDEV      ! mesonh version of the input file
 INTEGER           :: ILUDES       ! .des file logical unit
-CHARACTER(LEN=32) :: YDESFM       ! .des file
 !
 LOGICAL           :: GFOUND
 CHARACTER(LEN=4)  :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC
@@ -1357,8 +1355,7 @@ ELSE IF ( (HREC=='NATURE'.OR.HREC=='SEA   '.OR.HREC=='WATER ' &
        CGROUND='ISBA'
      ELSE
        CGROUND='NONE'
-       YDESFM=ADJUSTL(ADJUSTR(TPINFILE%CNAME)//'.des')
-       CALL FMLOOK_ll(YDESFM,TOUT%CNAME,ILUDES,IRESP)
+       ILUDES = TPINFILE%TDESFILE%NLU
        CALL POSNAM(ILUDES,'NAM_PARAMN',GFOUND,ILUOUT)
        IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAMn)
      END IF
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index 14779a7f5..4eca7fe7c 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -314,8 +314,6 @@ LOGICAL,               INTENT(IN) :: OSPAWN_SURF  ! flag to spawn surface fields
 INTEGER :: ILUOUT   ! Logical unit number for the output listing 
 INTEGER(KIND=LFI_INT) :: INPRAR ! Number of articles predicted in the LFIFM file
 !
-CHARACTER (LEN=32) :: YDESFM          ! Name of the desfm part of the FM-file
-!  
 !
 INTEGER             :: IIU            ! Upper dimension in x direction
 INTEGER             :: IJU            ! Upper dimension in y direction
@@ -1441,9 +1439,7 @@ CALL IO_FILE_ADD2LIST(TZFILE,CMY_NAME(2),'SPAWNING','WRITE',KLFINPRAR=INPRAR,KLF
 !
 CALL IO_FILE_OPEN_ll(TZFILE)
 !
-YDESFM=ADJUSTL(ADJUSTR(CMY_NAME(2))//'.des')
-!
-CALL WRITE_DESFM_n(2,YDESFM)
+CALL WRITE_DESFM_n(2,TZFILE)
 !
 IF (LBAL_ONLY) THEN  ! same relation with its DAD for model2 and for model1
   NDXRATIO_ALL(2) = NDXRATIO_ALL(1)
diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90
index 17bcb859b..7b004bd8e 100644
--- a/src/MNH/write_desfmn.f90
+++ b/src/MNH/write_desfmn.f90
@@ -13,9 +13,13 @@
 !
 INTERFACE
 !
-SUBROUTINE WRITE_DESFM_n(KMI,HDESFM)   
-INTEGER,            INTENT(IN)  :: KMI    ! Model index
-CHARACTER (LEN=*),  INTENT(IN)  :: HDESFM ! name of the DESFM file
+SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+INTEGER,            INTENT(IN)  :: KMI        ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
+!
 END SUBROUTINE WRITE_DESFM_n
 !
 END INTERFACE
@@ -24,7 +28,7 @@ END MODULE MODI_WRITE_DESFM_n
 !
 !
 !     ###################################################
-      SUBROUTINE WRITE_DESFM_n(KMI,HDESFM)
+      SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE)
 !     ###################################################
 !
 !!****  *WRITE_DESFM_n * - routine to write a descriptor file ( DESFM )
@@ -146,12 +150,13 @@ END MODULE MODI_WRITE_DESFM_n
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODE_FM
-!
-USE MODD_PARAMETERS
 USE MODD_CONF
-USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA
-USE MODD_LUNIT_n, ONLY : TLUOUT
+USE MODD_DYN_n,   ONLY: LHORELAX_SVLIMA
+USE MODD_IO_ll,   ONLY: TFILEDATA
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_PARAMETERS
+!
+USE MODE_MSG
 !
 USE MODN_BACKUP
 USE MODN_CONF
@@ -200,8 +205,8 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
-INTEGER,            INTENT(IN)  :: KMI    ! Model index
-CHARACTER (LEN=*),  INTENT(IN)  :: HDESFM ! name of the DESFM part
+INTEGER,            INTENT(IN)  :: KMI     ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
 !
 !*       0.2   declarations of local variables
 !
@@ -227,8 +232,12 @@ LOGICAL, DIMENSION(JPSVMAX) ::  GHORELAX_SV
 !*       1.    UPDATE DESFM FILE
 !              -----------------
 !
-CALL FMLOOK_ll(HDESFM,TLUOUT%CNAME,ILUSEG,IRESP)
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME))
+!
+IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) &
+  CALL PRINT_MSG(NVERB_FATAL,'IO','WRITE_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME))
 !
+ILUSEG = TPDATAFILE%TDESFILE%NLU
 !
 CALL INIT_NAM_LUNITn
 WRITE(UNIT=ILUSEG,NML=NAM_LUNITn)
-- 
GitLab