From 38dd000fe0c2e36900dbc813fa1be4c5653e3f58 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 19 Apr 2018 11:22:16 +0200
Subject: [PATCH] Philippe 19/04/2018: IO: add possibility to choose directory
 for outputs, backups and diachronic files

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |  5 +-
 src/LIB/SURCOUCHE/src/mode_fm.f90             | 17 +++-
 src/LIB/SURCOUCHE/src/mode_io.f90             | 77 +++++++++++++------
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 27 ++++++-
 src/LIB/SURCOUCHE/src/modn_confio.f90         |  5 +-
 src/MNH/diag.f90                              |  5 +-
 src/MNH/ini_modeln.f90                        |  3 +-
 src/MNH/modd_bakout.f90                       |  2 +
 src/MNH/modd_parameters.f90                   |  1 +
 src/MNH/modn_backup.f90                       |  3 +-
 src/MNH/modn_output.f90                       |  3 +-
 src/MNH/set_mask.f90                          |  1 -
 12 files changed, 108 insertions(+), 41 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 5c8643728..21521c70c 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -10,7 +10,7 @@
 MODULE MODD_IO_ll
 !
 USE MODD_NETCDF,     ONLY: IDCDF_KIND, IOCDF
-USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX
+USE MODD_PARAMETERS, ONLY: NDIRNAMELGTMAX, NFILENAMELGTMAX
 !
 IMPLICIT NONE 
 !
@@ -42,6 +42,8 @@ INTEGER, SAVE :: NIO_ABORT_LEVEL = NVERB_ERROR   ! Level of IO error necessary t
 INTEGER, SAVE :: NGEN_VERB        = NVERB_WARNING ! Verbosity level for 'GEN' (generic) messages
 INTEGER, SAVE :: NGEN_ABORT_LEVEL = NVERB_ERROR   ! Level of 'GEN' error necessary to force stop of application
 
+CHARACTER(LEN=NDIRNAMELGTMAX) :: CIO_DIR = '' ! Directory for IO
+
 !Structure containing one pointer to a file
 !Useful to create arrays of pointers to files
 TYPE TFILE_ELT
@@ -62,6 +64,7 @@ END TYPE TOUTBAK
 !Structure describing the characteristics of a file
 TYPE TFILEDATA
   CHARACTER(LEN=NFILENAMELGTMAX) :: CNAME = '' !Filename
+  CHARACTER(LEN=:),ALLOCATABLE   :: CDIRNAME   !Directory name
   CHARACTER(LEN=13) :: CTYPE   = "UNKNOWN" !Filetype (backup, output, prepidealcase...)
   CHARACTER(LEN=7)  :: CFORMAT = "UNKNOWN" !Fileformat (NETCDF4, LFI, LFICDF4...)
   CHARACTER(LEN=7)  :: CMODE   = "UNKNOWN" !Opening mode (read, write...)
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index bbe135b02..434009ccf 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -240,7 +240,7 @@ CHARACTER(LEN=*),INTENT(IN),  OPTIONAL :: HPROGRAM_ORIG !To emulate a file comin
 INTEGER                 :: IFTYPE  ! type of FM-file
 INTEGER                 :: IROWF,IRESP
 CHARACTER(LEN=7)        :: YACTION ! Action upon the file ('READ' or 'WRITE')
-CHARACTER(LEN=28)       :: YFILEM  ! name of the file
+CHARACTER(LEN=:),ALLOCATABLE :: YFILEM  ! name of the file
 CHARACTER(LEN=8)        :: YRESP
 LOGICAL                 :: GSTATS
 LOGICAL, SAVE           :: GSFIRST=.TRUE.
@@ -259,9 +259,18 @@ INTEGER(KIND=IDCDF_KIND) :: INCERR
 #endif
 
 YACTION = TPFILE%CMODE
-YFILEM  = TPFILE%CNAME
 
-CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','opening '//TRIM(YFILEM)//' for '//TRIM(YACTION))
+CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','opening '//TRIM(TPFILE%CNAME)//' for '//TRIM(YACTION))
+
+IF (ALLOCATED(TPFILE%CDIRNAME)) THEN
+  IF(LEN_TRIM(TPFILE%CDIRNAME)>0) THEN
+    YFILEM = TRIM(TPFILE%CDIRNAME)//'/'//TRIM(TPFILE%CNAME)
+  ELSE
+    YFILEM = TRIM(TPFILE%CNAME)
+  END IF
+ELSE
+  YFILEM = TRIM(TPFILE%CNAME)
+END IF
 
 IF ( PRESENT(OPARALLELIO) ) THEN
   GPARALLELIO = OPARALLELIO
@@ -295,7 +304,7 @@ CASE(10:)
   IMELEV=2
 END SELECT
 
-IROWF=LEN_TRIM(YFILEM)
+IROWF=LEN_TRIM(TPFILE%CNAME)
 
 IF (IROWF.EQ.0) THEN
   IRESP=-45
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index f98e29509..d33461393 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -235,7 +235,6 @@ CONTAINS
     !JUANZ
     CHARACTER(len=5)                      :: CFILE
     INTEGER                               :: IFILE, IRANK_PROCIO
-    CHARACTER(len=128)                    :: YFILE_IOZ
     INTEGER(KIND=LFI_INT)                 :: IRESOU,IMELEV,INPRAR
     INTEGER(KIND=LFI_INT)                 :: ININAR8
     LOGICAL(KIND=LFI_INT)                 :: GNAMFI8,GFATER8,GSTATS8 
@@ -265,6 +264,7 @@ CONTAINS
     ! didier
     LOGICAL               :: GPARALLELIO
     TYPE(TFILEDATA),POINTER :: TZSPLITFILE
+    CHARACTER(LEN=:),ALLOCATABLE :: YPREFILENAME !To store the directory + filename
 
     CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','opening '//TRIM(TPFILE%CNAME)//' for '//TRIM(TPFILE%CMODE))
     !
@@ -358,6 +358,16 @@ CONTAINS
     ENDIF
 #endif
 
+    IF (ALLOCATED(TPFILE%CDIRNAME)) THEN
+      IF(LEN_TRIM(TPFILE%CDIRNAME)>0) THEN
+        YPREFILENAME = TRIM(TPFILE%CDIRNAME)//'/'//TRIM(TPFILE%CNAME)
+      ELSE
+        YPREFILENAME = TRIM(TPFILE%CNAME)
+      END IF
+    ELSE
+      YPREFILENAME = TRIM(TPFILE%CNAME)
+    END IF
+
     SELECT CASE(YMODE)
 
     CASE('GLOBAL')
@@ -384,7 +394,7 @@ CONTAINS
           TPFILE%NLU = IONEWFLU()
 #ifdef MNH_VPP
           OPEN(UNIT=TPFILE%NLU,        &
-               FILE=TRIM(TPFILE%CNAME),&
+               FILE=TRIM(YPREFILENAME),&
                STATUS=STATUS,          &
                ACCESS=ACCESS,          &
                IOSTAT=IOS,             &
@@ -401,7 +411,7 @@ CONTAINS
           !JUAN : 31/03/2000 modif pour acces direct
           IF (YACCESS=='STREAM') THEN
              OPEN(UNIT=TPFILE%NLU,        &
-                  FILE=TRIM(TPFILE%CNAME),&
+                  FILE=TRIM(YPREFILENAME),&
                   STATUS=YSTATUS,         &
                   ACCESS=YACCESS,         &
                   IOSTAT=IOS,             &
@@ -409,7 +419,7 @@ CONTAINS
                   ACTION=YACTION)
           ELSEIF (YACCESS=='DIRECT') THEN
              OPEN(UNIT=TPFILE%NLU,        &
-                  FILE=TRIM(TPFILE%CNAME),&
+                  FILE=TRIM(YPREFILENAME),&
                   STATUS=YSTATUS,         &
                   ACCESS=YACCESS,         &
                   IOSTAT=IOS,             &
@@ -420,7 +430,7 @@ CONTAINS
              IF (YFORM=="FORMATTED") THEN
                IF (YACTION=='READ') THEN
                 OPEN(UNIT=TPFILE%NLU,        &
-                     FILE=TRIM(TPFILE%CNAME),&
+                     FILE=TRIM(YPREFILENAME),&
                      STATUS=YSTATUS,         &
                      ACCESS=YACCESS,         &
                      IOSTAT=IOS,             &
@@ -433,7 +443,7 @@ CONTAINS
                      PAD=YPAD)
                ELSE
                 OPEN(UNIT=TPFILE%NLU,        &
-                     FILE=TRIM(TPFILE%CNAME),&
+                     FILE=TRIM(YPREFILENAME),&
                      STATUS=YSTATUS,         &
                      ACCESS=YACCESS,         &
                      IOSTAT=IOS,             &
@@ -447,7 +457,7 @@ CONTAINS
                ENDIF
              ELSE
                 OPEN(UNIT=TPFILE%NLU,        &
-                     FILE=TRIM(TPFILE%CNAME),&
+                     FILE=TRIM(YPREFILENAME),&
                      STATUS=YSTATUS,         &
                      ACCESS=YACCESS,         &
                      IOSTAT=IOS,             &
@@ -461,7 +471,7 @@ CONTAINS
 
           !print*,' OPEN_ll'
           !print*,' OPEN(UNIT=',TPFILE%NLU
-          !print*,' FILE=',TRIM(TPFILE%CNAME)
+          !print*,' FILE=',TRIM(YPREFILENAME)
           !print*,' STATUS=',YSTATUS       
           !print*,' ACCESS=',YACCESS
           !print*,' IOSTAT=',IOS
@@ -474,7 +484,7 @@ CONTAINS
           !print*,' PAD=',YPAD
 #else
           OPEN(UNIT=TPFILE%NLU,        &
-               FILE=TRIM(TPFILE%CNAME),&
+               FILE=TRIM(YPREFILENAME),&
                STATUS=STATUS,          &
                ACCESS=ACCESS,          &
                IOSTAT=IOS,             &
@@ -505,7 +515,7 @@ CONTAINS
 
 #ifdef MNH_VPP
        OPEN(UNIT=TPFILE%NLU,                       &
-            FILE=TRIM(TPFILE%CNAME)//SUFFIX(".P"), &
+            FILE=TRIM(YPREFILENAME)//SUFFIX(".P"), &
             STATUS=STATUS,                         &
             ACCESS=ACCESS,                         &
             IOSTAT=IOS,                            &
@@ -521,7 +531,7 @@ CONTAINS
 #if defined(MNH_SX5) || defined(MNH_SP4) || defined(NAGf95) || defined(MNH_LINUX)
        IF (ACCESS=='DIRECT') THEN
           OPEN(UNIT=TPFILE%NLU,                       &
-               FILE=TRIM(TPFILE%CNAME)//SUFFIX(".P"), &
+               FILE=TRIM(YPREFILENAME)//SUFFIX(".P"), &
                STATUS=YSTATUS,                        &
                ACCESS=YACCESS,                        &
                IOSTAT=IOS,                            &
@@ -531,7 +541,7 @@ CONTAINS
        ELSE
         IF (YACTION=='READ') THEN
           OPEN(UNIT=TPFILE%NLU,                        &
-               FILE=TRIM(TPFILE%CNAME)//SUFFIX(".P"),  &
+               FILE=TRIM(YPREFILENAME)//SUFFIX(".P"),  &
                STATUS=YSTATUS,                         &
                ACCESS=YACCESS,                         &
                IOSTAT=IOS,                             &
@@ -544,7 +554,7 @@ CONTAINS
                PAD=YPAD)
          ELSE
           OPEN(UNIT=TPFILE%NLU,                        &
-               FILE=TRIM(TPFILE%CNAME)//SUFFIX(".P"),  &
+               FILE=TRIM(YPREFILENAME)//SUFFIX(".P"),  &
                STATUS=YSTATUS,                         &
                ACCESS=YACCESS,                         &
                IOSTAT=IOS,                             &
@@ -559,7 +569,7 @@ CONTAINS
        ENDIF
 #else
        OPEN(UNIT=TPFILE%NLU,                       &
-            FILE=TRIM(TPFILE%CNAME)//SUFFIX(".P"), &
+            FILE=TRIM(YPREFILENAME)//SUFFIX(".P"), &
             STATUS=STATUS,                         &
             ACCESS=ACCESS,                         &
             IOSTAT=IOS,                            &
@@ -624,15 +634,32 @@ CONTAINS
           DO IFILE=1,TPFILE%NSUBFILES_IOZ
              IRANK_PROCIO = 1 + IO_RANK(IFILE-1,ISNPROC,TPFILE%NSUBFILES_IOZ)
              WRITE(CFILE ,'(".Z",i3.3)') IFILE
-             YFILE_IOZ           = TRIM(TPFILE%CNAME)//CFILE//".lfi"
 
              CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//TRIM(CFILE),TZSPLITFILE,IRESP)
 
              IF (IRESP/=0) THEN !File not yet in filelist => add it (nothing to do if already in list)
-               CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE,        &
-                                     KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB, &
-                                     HFORMAT=TPFILE%CFORMAT)
+               IF (ALLOCATED(TPFILE%CDIRNAME)) THEN
+                 CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE,        &
+                                       HDIRNAME=TPFILE%CDIRNAME,                                                     &
+                                       KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB, &
+                                       HFORMAT=TPFILE%CFORMAT)
+               ELSE
+                 CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE,        &
+                                       KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB, &
+                                       HFORMAT=TPFILE%CFORMAT)
+               END IF
              END IF
+
+             IF (ALLOCATED(TPFILE%CDIRNAME)) THEN
+               IF (LEN_TRIM(TZSPLITFILE%CDIRNAME)>0) THEN
+                 YPREFILENAME = TRIM(TZSPLITFILE%CDIRNAME)//'/'//TRIM(TZSPLITFILE%CNAME)
+               ELSE
+                 YPREFILENAME = TRIM(TZSPLITFILE%CNAME)
+               END IF
+             ELSE
+               YPREFILENAME = TRIM(TZSPLITFILE%CNAME)
+             END IF
+
              TPFILE%TFILES_IOZ(IFILE)%TFILE => TZSPLITFILE
              !Done outside of the previous IF to prevent problems with .OUT files
              TZSPLITFILE%NMPICOMM      = ICOMM
@@ -647,10 +674,10 @@ CONTAINS
                    IF (YACTION == 'READ') THEN
                       ! Open NetCDF File for reading
                       TZSPLITFILE%TNCDIMS => NEWIOCDF()
-                      CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_OPEN(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//CFILE//'.nc')
-                      IOSCDF = NF90_OPEN(TRIM(TPFILE%CNAME)//CFILE//".nc", NF90_NOWRITE, TZSPLITFILE%NNCID)
+                      CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_OPEN(IO_ZSPLIT) for '//TRIM(TZSPLITFILE%CNAME)//'.nc')
+                      IOSCDF = NF90_OPEN(TRIM(YPREFILENAME)//".nc", NF90_NOWRITE, TZSPLITFILE%NNCID)
                       IF (IOSCDF /= NF90_NOERR) THEN
-                        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll','NF90_OPEN for '//TRIM(TPFILE%CNAME)//CFILE//'.nc: '// &
+                        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll','NF90_OPEN for '//TRIM(TZSPLITFILE%CNAME)//'.nc: '// &
                                                                   NF90_STRERROR(IOSCDF))
                       ELSE
                          IOS = 0
@@ -666,11 +693,11 @@ CONTAINS
                       ! YACTION == 'WRITE'
                       ! Create NetCDF File for writing
                       TZSPLITFILE%TNCDIMS => NEWIOCDF()
-                      CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_CREATE(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//CFILE//'.nc')
-                      IOSCDF = NF90_CREATE(TRIM(TPFILE%CNAME)//CFILE//".nc", &
+                      CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_CREATE(IO_ZSPLIT) for '//TRIM(TZSPLITFILE%CNAME)//'.nc')
+                      IOSCDF = NF90_CREATE(TRIM(YPREFILENAME)//".nc", &
                            &IOR(NF90_CLOBBER,NF90_NETCDF4), TZSPLITFILE%NNCID)
                       IF (IOSCDF /= NF90_NOERR) THEN
-                        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll','NF90_CREATE for '//TRIM(TPFILE%CNAME)//CFILE//'.nc: '// &
+                        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll','NF90_CREATE for '//TRIM(TZSPLITFILE%CNAME)//'.nc: '// &
                                                                   NF90_STRERROR(IOSCDF))
                       ELSE
                          IOS = 0
@@ -701,7 +728,7 @@ CONTAINS
                    CALL LFIOUV(IRESOU,                   &
                         TZSPLITFILE%NLFIFLU,             &
                         GNAMFI8,                         &
-                        TRIM(TZSPLITFILE%CNAME)//'.lfi', &
+                        TRIM(YPREFILENAME)//'.lfi',      &
                         "UNKNOWN",                       &
                         GFATER8,                         &
                         GSTATS8,                         &
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index a7332d359..e717d2017 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -501,8 +501,18 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
             NOUT_COMPRESS_LEVEL(IMI) = 4
           END IF
           TPBAKOUTN(IPOS)%TFILE%NNCCOMPRESS_LEVEL = NOUT_COMPRESS_LEVEL(IMI)
+          IF (LEN_TRIM(COUT_DIR)>0) THEN
+            TPBAKOUTN(IPOS)%TFILE%CDIRNAME=TRIM(COUT_DIR)
+          ELSE IF (LEN_TRIM(CIO_DIR)>0) THEN
+            TPBAKOUTN(IPOS)%TFILE%CDIRNAME=TRIM(CIO_DIR)
+          END IF
         ELSE IF (TRIM(HFILETYPE)=='BACKUP') THEN
           TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//'.'//YNUMBER)
+          IF (LEN_TRIM(CBAK_DIR)>0) THEN
+            TPBAKOUTN(IPOS)%TFILE%CDIRNAME=TRIM(CBAK_DIR)
+          ELSE IF (LEN_TRIM(CIO_DIR)>0) THEN
+            TPBAKOUTN(IPOS)%TFILE%CDIRNAME=TRIM(CIO_DIR)
+          END IF
         ELSE
           CALL PRINT_MSG(NVERB_FATAL,'IO','POPULATE_STRUCT','unknown filetype ('//TRIM(HFILETYPE)//')')
         ENDIF
@@ -539,6 +549,8 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
             TPBAKOUTN(IPOS)%TFILE%TFILES_IOZ(JI)%TFILE%CMODE="WRITE"
             WRITE (YNUMBER,FMT="(I3.3)") JI
             TPBAKOUTN(IPOS)%TFILE%TFILES_IOZ(JI)%TFILE%CNAME = TRIM(TPBAKOUTN(IPOS)%TFILE%CNAME)//'.Z'//YNUMBER
+            IF(ALLOCATED(TPBAKOUTN(IPOS)%TFILE%CDIRNAME)) &
+              TPBAKOUTN(IPOS)%TFILE%TFILES_IOZ(JI)%TFILE%CDIRNAME = TRIM(TPBAKOUTN(IPOS)%TFILE%CDIRNAME)
             IF (TRIM(HFILETYPE)=='OUTPUT') THEN
               !Reduce the float precision if asked
               TPBAKOUTN(IPOS)%TFILE%TFILES_IOZ(JI)%TFILE%LNCREDUCE_FLOAT_PRECISION = LOUT_REDUCE_FLOAT_PRECISION(IMI)
@@ -574,9 +586,10 @@ END SUBROUTINE POPULATE_STRUCT
 !
 END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT
 !
-SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,                                &
-                            HFORM,HACCESS,HFORMAT,KLFINPRAR,KLFITYPE,KLFIVERB,KRECL, &
-                            KMODEL,TPDADFILE,TPDATAFILE,OOLD)
+SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,                 &
+                            HFORM,HACCESS,HFORMAT,HDIRNAME,           &
+                            KLFINPRAR,KLFITYPE,KLFIVERB,KRECL,KMODEL, &
+                            TPDADFILE,TPDATAFILE,OOLD)
 !
 USE MODD_BAKOUT,         ONLY: LOUT_COMPRESS,LOUT_REDUCE_FLOAT_PRECISION,NOUT_COMPRESS_LEVEL
 USE MODD_CONF,           ONLY: CPROGRAM
@@ -590,6 +603,7 @@ CHARACTER(LEN=*),                INTENT(IN)    :: HMODE     !Opening mode (read,
 CHARACTER(LEN=*),       OPTIONAL,INTENT(IN)    :: HFORM     !Formatted/unformatted
 CHARACTER(LEN=*),       OPTIONAL,INTENT(IN)    :: HACCESS   !Direct/sequential
 CHARACTER(LEN=*),       OPTIONAL,INTENT(IN)    :: HFORMAT   !Fileformat (NETCDF4, LFI, LFICDF4...)
+CHARACTER(LEN=*),       OPTIONAL,INTENT(IN)    :: HDIRNAME  !File directory
 INTEGER(KIND=LFI_INT),  OPTIONAL,INTENT(IN)    :: KLFINPRAR !Number of predicted articles of the LFI file (non crucial)
 INTEGER,                OPTIONAL,INTENT(IN)    :: KLFITYPE  !Type of the file (used to generate list of files to transfers)
 INTEGER,                OPTIONAL,INTENT(IN)    :: KLFIVERB  !LFI verbosity level
@@ -715,6 +729,10 @@ TPFILE => TFILE_LAST
 TPFILE%CNAME = HNAME
 TPFILE%CTYPE = HTYPE
 !
+IF (PRESENT(HDIRNAME)) THEN
+  IF (LEN_TRIM(HDIRNAME)>0) TPFILE%CDIRNAME=TRIM(HDIRNAME)
+END IF
+!
 IF (TRIM(HMODE)/='READ' .AND. TRIM(HMODE)/='WRITE') THEN
   CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','unknown mode ('//TRIM(HMODE)//') for file '//TRIM(HNAME))
 END IF
@@ -746,6 +764,9 @@ SELECT CASE(TPFILE%CTYPE)
         CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','TPDATAFILE is not associated for DES file '//TRIM(HNAME))
       TPFILE%TDATAFILE => TPDATAFILE
       TPDATAFILE%TDESFILE => TPFILE
+      IF (PRESENT(HDIRNAME)) &
+        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_ADD2LIST','HDIRNAME argument ignored for DES file '//TRIM(HNAME))
+      IF (ALLOCATED(TPDATAFILE%CDIRNAME)) TPFILE%CDIRNAME = TPDATAFILE%CDIRNAME
     END IF
 
 
diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90
index 3f41d09f3..a9c647314 100644
--- a/src/LIB/SURCOUCHE/src/modn_confio.f90
+++ b/src/LIB/SURCOUCHE/src/modn_confio.f90
@@ -36,7 +36,8 @@
 !             ------------
 !
 USE MODD_IO_ll, ONLY : LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, &
-                       NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL
+                       NIO_VERB, NIO_ABORT_LEVEL, NGEN_VERB, NGEN_ABORT_LEVEL, &
+                       CIO_DIR
 !
 IMPLICIT NONE
 !
@@ -48,7 +49,7 @@ LOGICAL,SAVE :: LLFIREAD = .FALSE. ! TRUE : enable LFI reading (disable NetCDF4
 NAMELIST/NAM_CONFIO/LCDF4, LLFIOUT, LLFIREAD,                 &
                     LVERB_OUTLST, LVERB_STDOUT, LVERB_ALLPRC, &
                     NIO_VERB,  NIO_ABORT_LEVEL,               &
-                    NGEN_VERB, NGEN_ABORT_LEVEL
+                    NGEN_VERB, NGEN_ABORT_LEVEL, CIO_DIR
 !
 END MODULE MODN_CONFIO
 
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index e8a868dba..632b7c6ea 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -105,7 +105,7 @@ USE MODD_FIELD_n
 USE MODD_GR_FIELD_n
 USE MODD_GRID,             ONLY: XLONORI,XLATORI
 USE MODD_GRID_n
-USE MODD_IO_ll,            ONLY: NIO_VERB,NVERB_DEBUG,TFILEDATA,TFILE_SURFEX
+USE MODD_IO_ll,            ONLY: CIO_DIR,NIO_VERB,NVERB_DEBUG,TFILEDATA,TFILE_SURFEX
 USE MODD_LBC_n
 USE MODD_LES
 USE MODD_LES_BUDGET
@@ -514,7 +514,8 @@ ZTIME1=ZTIME2
 !
 IF ( LAIRCRAFT_BALLOON ) THEN
 !
-  CALL IO_FILE_ADD2LIST(TZDIACFILE,TRIM(CINIFILE)//'BAL','DIACHRONIC','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
+  CALL IO_FILE_ADD2LIST(TZDIACFILE,TRIM(CINIFILE)//'BAL','DIACHRONIC','WRITE', &
+                        HDIRNAME=CIO_DIR,KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
 !
   CALL IO_FILE_OPEN_ll(TZDIACFILE)
 !
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 7f2e2fac7..8591f8e3b 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -418,7 +418,7 @@ USE MODD_ADVFRC_n
 USE MODD_RELFRC_n
 USE MODD_2D_FRC
 USE MODD_IO_SURF_MNH, ONLY : IO_SURF_MNH_MODEL
-USE MODD_IO_ll,       ONLY : TFILEDATA,TFILE_FIRST,TFILE_LAST
+USE MODD_IO_ll,       ONLY : CIO_DIR,TFILEDATA,TFILE_FIRST,TFILE_LAST
 !
 USE MODD_CH_PRODLOSSTOT_n
 USE MODI_CH_INIT_PRODLOSSTOT_n
@@ -1530,6 +1530,7 @@ IF (KMI == 1) THEN
     WRITE(IO_SURF_MNH_MODEL(IMI)%COUTFILE,'(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))
     WRITE(YNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000'
     CALL IO_FILE_ADD2LIST(LUNIT_MODEL(IMI)%TDIAFILE,YNAME,'DIACHRONIC','WRITE',     &
+                          HDIRNAME=CIO_DIR,                                         &
                           KLFINPRAR=INT(50,KIND=LFI_INT),KLFITYPE=1,KLFIVERB=NVERB, &
                           TPDADFILE=LUNIT_MODEL(NDAD(IMI))%TDIAFILE )
   END DO
diff --git a/src/MNH/modd_bakout.f90 b/src/MNH/modd_bakout.f90
index 79e3d137d..487cd4426 100644
--- a/src/MNH/modd_bakout.f90
+++ b/src/MNH/modd_bakout.f90
@@ -70,5 +70,7 @@ REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0., XOUT_TIME_FREQ_FIR
 ! Time for first backup/output for each model (if XBAK/OUT_TIME_FREQ is set)
 CHARACTER(LEN=NMNHNAMELGTMAX),SAVE,ALLOCATABLE,DIMENSION(:,:) :: COUT_VAR ! Name of the fields to output
 !
+!Directory names for backups/outputs
+CHARACTER(LEN=NDIRNAMELGTMAX) :: CBAK_DIR='', COUT_DIR=''
 !
 END MODULE MODD_BAKOUT
diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index 18c76d4c9..b24a62e89 100644
--- a/src/MNH/modd_parameters.f90
+++ b/src/MNH/modd_parameters.f90
@@ -80,6 +80,7 @@ INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in
 INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name
 INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard name of a variable (CF convention)
 !
+INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name
 INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI)
 INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary
                                               ! to keep backward compatibility), MUST BE 28
diff --git a/src/MNH/modn_backup.f90 b/src/MNH/modn_backup.f90
index 5d681ce14..1a0e842a5 100644
--- a/src/MNH/modn_backup.f90
+++ b/src/MNH/modn_backup.f90
@@ -45,6 +45,7 @@ IMPLICIT NONE
 NAMELIST/NAM_BACKUP/LBAK_BEG,LBAK_END,&
                    XBAK_TIME,NBAK_STEP,&
                    NBAK_STEP_FREQ,NBAK_STEP_FREQ_FIRST,&
-                   XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST
+                   XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST,&
+                   CBAK_DIR
 !
 END MODULE MODN_BACKUP
diff --git a/src/MNH/modn_output.f90 b/src/MNH/modn_output.f90
index 268632de0..0ac56ebdd 100644
--- a/src/MNH/modn_output.f90
+++ b/src/MNH/modn_output.f90
@@ -49,6 +49,7 @@ NAMELIST/NAM_OUTPUT/LOUT_BEG,LOUT_END,&
                    XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST, &
                    COUT_VAR, &
                    LOUT_REDUCE_FLOAT_PRECISION, &
-                   LOUT_COMPRESS, NOUT_COMPRESS_LEVEL
+                   LOUT_COMPRESS, NOUT_COMPRESS_LEVEL,&
+                   COUT_DIR
 !
 END MODULE MODN_OUTPUT
diff --git a/src/MNH/set_mask.f90 b/src/MNH/set_mask.f90
index 3a7f61314..81f58e13a 100644
--- a/src/MNH/set_mask.f90
+++ b/src/MNH/set_mask.f90
@@ -77,7 +77,6 @@ INTEGER                    :: IIB,IJB       ! Lower bounds of the physical
                                             ! sub-domain in x and y directions
 INTEGER                    :: IIE,IJE       ! Upper bounds of the physical
                                             ! sub-domain in x and y directions
-INTEGER :: IID, IRESP
 !-------------------------------------------------------------------------------
 !
 !*       1.    COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
-- 
GitLab