From 6d35ae01dc2e58b4464ed7796cc01dc19e4558af Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 3 Mar 2017 14:33:23 +0100
Subject: [PATCH] Philippe 03/03/2017: IO: modified WRITE_SURFxy_MNH calls to
 use IO_WRITE_FIELDS                          and PRINT_MSG                   
       Some calls are not yet (fully) ported

---
 src/LIB/SURCOUCHE/src/modd_io.f90 |    2 +
 src/MNH/modeln.f90                |    4 +-
 src/MNH/write_surf_mnh.f90        | 1052 +++++++++++++++--------------
 3 files changed, 562 insertions(+), 496 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index a19ff4c3e..d65039cd4 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -95,4 +95,6 @@ END TYPE TFILEDATA
 TYPE(TFILEDATA),POINTER,SAVE :: TFILE_FIRST => NULL()
 TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST  => NULL()
 
+TYPE(TFILEDATA),POINTER,SAVE :: TFILE_SURFEX  => NULL() !Pointer used to find the file used when writing SURFEX fields in write_surf_mnh.f90
+
 END MODULE MODD_IO_ll
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 3acb69448..a40eaa059 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -280,7 +280,7 @@ USE MODD_LUNIT
 USE MODD_GRID, ONLY: XLONORI,XLATORI
 USE MODD_SERIES, ONLY: LSERIES
 USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: TFILEDATA,TFILE_SURFEX
 !
 USE MODD_SUB_MODEL_n
 USE MODD_GET_n
@@ -928,8 +928,10 @@ IF (IBAK < NBAK_NUMB ) THEN
     COUTFMFILE = YFMFILE
     CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
     IF (CSURF=='EXTE') THEN
+      TFILE_SURFEX => TZBAKFILE
       CALL GOTO_SURFEX(IMI)
       CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.)
+      NULLIFY(TFILE_SURFEX)
     END IF
     !
     ! Reinitialize Lagragian variables at every model backup
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index 59923d9cc..8fa02f488 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -55,57 +55,56 @@
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
+USE MODE_MSG
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
-USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC), INTENT(IN)  :: HREC     ! name of the article to be read
-REAL,              INTENT(IN)  :: PFIELD   ! the real scalar to be read
-INTEGER,           INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100),INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+REAL,                   INTENT(IN)  :: PFIELD   ! the real scalar to write
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
+CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
+!
 !-------------------------------------------------------------------------------
 !
-
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX0_MNH','writing '//TRIM(HREC))
+!
 IF( ( HREC=='LAT0' .OR. HREC=='LON0' .OR. HREC=='RPK' .OR. HREC=='BETA'  &
                  .OR. HREC=='LATORI'.OR. HREC=='LONORI'                  )&
    .AND. CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU'                   ) THEN
-
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX0_MNH',TRIM(HREC)//' not written in file by externalized surface')
     RETURN
 !
 ELSE
-
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--',PFIELD,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
-  IF (KRESP /=0) THEN
 !
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
- !callabortstop
-    CALL ABORT
-    STOP
-
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,PFIELD)
+!
+  IF (KRESP /=0) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
   END IF
 END IF
-
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFX0_MNH
 !
@@ -150,57 +149,58 @@ END SUBROUTINE WRITE_SURFX0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODE_ll
-USE MODE_IO_ll
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
+USE MODE_MSG
+USE MODE_TOOLS_ll
 !
-USE MODD_PARAMETERS,  ONLY : XUNDEF, JPHEXT
-USE MODD_CONF_n,        ONLY : CSTORAGE_TYPE
-!
-USE MODD_IO_SURF_MNH, ONLY :COUT, COUTFILE , NLUOUT, NMASK, CMASK, &
-                            NIU, NJU, NIB, NJB, NIE, NJE,          &
-                            NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
-                            NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
-
-USE MODI_UNPACK_1D_2D
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY :COUT, NLUOUT, NMASK, CMASK, &
+                              NIU, NJU, NIB, NJB, NIE, NJE,          &
+                              NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
+                              NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
+USE MODD_PARAMETERS,    ONLY: XUNDEF, JPHEXT
 !
 USE MODI_GET_SURF_UNDEF
+USE MODI_UNPACK_1D_2D
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),   INTENT(IN)  :: HREC     ! name of the article to be read
-INTEGER,             INTENT(IN)  :: KL       ! number of points
-REAL, DIMENSION(KL), INTENT(IN)  :: PFIELD   ! array containing the data field
-INTEGER,             INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100),  INTENT(IN)  :: HCOMMENT ! Comment string
-CHARACTER(LEN=1),    INTENT(IN)  :: HDIR     ! type of field :
-!                                            ! 'H' : field with
-!                                            !       horizontal spatial dim.
-!                                            ! 'A' : entire field with
-!                                            !       horizontal spatial dim. :
-!                                            !       It is not distributed on
-!                                            !       the processors
-!                                            ! '-' : no horizontal dim.
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+INTEGER,                INTENT(IN)  :: KL       ! number of points
+REAL, DIMENSION(KL),    INTENT(IN)  :: PFIELD   ! array containing the data field
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
+!                                               ! 'H' : field with
+!                                               !       horizontal spatial dim.
+!                                               ! 'A' : entire field with
+!                                               !       horizontal spatial dim. :
+!                                               !       It is not distributed on
+!                                               !       the processors
+!                                               ! '-' : no horizontal dim.
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
 INTEGER           :: J1D            ! loop counter
-INTEGER           :: I1D            ! 1D array size
 INTEGER           :: JILOOP,JJLOOP  ! loop indexes
-
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK  ! work array read in the file
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK  ! work array written in the file
 REAL, DIMENSION(:),   ALLOCATABLE :: ZW1D   ! 1D work array
 !
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
-REAL              :: ZUNDEF         ! undefined value in SURFEX
-
+REAL              :: ZUNDEF                       ! undefined value in SURFEX
+!
+CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH','writing '//TRIM(HREC))
+!
 !*       1.    Special cases with no writing
 !        -----------------------------------
 !
@@ -209,25 +209,15 @@ IF(        HREC=='LAT'                                  &
       .OR. HREC=='MESH_SIZE'                            &
       .OR. HREC=='DX'                                   &
       .OR. HREC=='DY'                                   ) THEN
-
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC,'  with mask ', CMASK
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(HREC)//' with mask '// &
+                   TRIM(CMASK)//' not written in file by externalized surface')
     RETURN
 !
 ELSE IF( (   (CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU') &
               .OR. CMASK/='FULL  ')                          &
           .AND. ( HREC=='ZS' .OR. HREC=='XX' .OR. HREC=='YY') ) THEN
-
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC,'  with mask ', CMASK
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(HREC)//' with mask '// &
+                   TRIM(CMASK)//' not written in file by externalized surface')
     RETURN
 !
 END IF
@@ -285,8 +275,6 @@ IF (HDIR=='H' .OR. HDIR=='A') THEN
   END IF
 END IF
 
-IGRID=4
-
  CALL GET_SURF_UNDEF(ZUNDEF)
  WHERE (ZWORK==ZUNDEF) ZWORK=XUNDEF
 !
@@ -308,10 +296,30 @@ IF (      (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
     ZW1D(IIB+1) =   1.5 * ZWORK(IIB,1+JPHEXT)
   END IF
 !
-  IF (HDIR=='A') &
-  CALL FMWRIT(COUTFILE,'XHAT',COUT,'--', ZW1D(:),4,LEN(HCOMMENT),HCOMMENT,KRESP)
-  IF (HDIR=='H') &
-  CALL FMWRIT(COUTFILE,'XHAT',COUT,'XX', ZW1D(1+NHALO:IIU-NHALO),4,LEN(HCOMMENT),HCOMMENT,KRESP)
+  IF (HDIR=='A') THEN
+    TZFIELD%CMNHNAME   = 'XHAT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: XHAT'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZW1D(:))
+  END IF
+  IF (HDIR=='H') THEN
+    TZFIELD%CMNHNAME   = 'XHAT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: XHAT'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XX'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZW1D(1+NHALO:IIU-NHALO))
+  END IF
   DEALLOCATE(ZW1D)
 ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
          .AND. CMASK=='FULL  ' .AND. (HREC=='YY' .OR. HREC=='DY') ) THEN
@@ -328,32 +336,70 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
     ZW1D(IJB)   =   0.5 * ZWORK(1+JPHEXT,IJB)
     ZW1D(IJB+1) =   1.5 * ZWORK(1+JPHEXT,IJB)
   END IF
-  IF (HDIR=='A') &
-  CALL FMWRIT(COUTFILE,'YHAT',COUT,'--', ZW1D(:),4,LEN(HCOMMENT),HCOMMENT,KRESP)
-  IF (HDIR=='H') &
-  CALL FMWRIT(COUTFILE,'YHAT',COUT,'YY', ZW1D(1+NHALO:IJU-NHALO),4,LEN(HCOMMENT),HCOMMENT,KRESP)
+  IF (HDIR=='A') THEN
+    TZFIELD%CMNHNAME   = 'YHAT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: YHAT'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZW1D(:))
+  END IF
+  IF (HDIR=='H') THEN
+    TZFIELD%CMNHNAME   = 'YHAT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: YHAT'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'YY'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 1
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZW1D(1+NHALO:IJU-NHALO))
+  END IF
   DEALLOCATE(ZW1D)
 ELSE IF (HDIR=='H') THEN
-  CALL FMWRIT(COUTFILE,HREC,COUT,'XY', ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO))
 ELSE IF (HDIR=='A') THEN
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--', ZWORK(:,:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK(:,:))
 ELSE
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--', PFIELD(:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,PFIELD(:))
 END IF
 !
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    stop
-
- END IF
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+END IF
 !
 DEALLOCATE(ZWORK)
 DEALLOCATE(IMASK)
@@ -403,65 +449,66 @@ END SUBROUTINE WRITE_SURFX1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODE_ll
-USE MODE_IO_ll
-!
-USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
-USE MODD_PARAMETERS,  ONLY : XUNDEF, JPHEXT
-USE MODD_CONF_n,        ONLY : CSTORAGE_TYPE
-USE MODD_CONFZ ,        ONLY : NB_PROCIO_W
-!
-USE MODD_IO_SURF_MNH, ONLY :COUT, COUTFILE , NLUOUT, NMASK, CMASK, &
-                            NIU, NJU, NIB, NJB, NIE, NJE,          &
-                            NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
-                            NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
-
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG,TYPEREAL
+USE MODE_MSG
+USE MODE_TOOLS_ll
+!
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_DATA_COVER_PAR,ONLY : JPCOVER
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY :COUT, NLUOUT, NMASK, CMASK, &
+                              NIU, NJU, NIB, NJB, NIE, NJE,          &
+                              NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
+                              NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
+USE MODD_PARAMETERS,    ONLY: XUNDEF, JPHEXT
+!
+USE MODI_GET_SURF_UNDEF
 USE MODI_UNPACK_1D_2D
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),   INTENT(IN)  :: HREC     ! name of the article to be read
-INTEGER,             INTENT(IN)  :: KL1,KL2       ! number of points
-REAL, DIMENSION(KL1,KL2), INTENT(IN)  :: PFIELD   ! array containing the data field
-LOGICAL,DIMENSION(JPCOVER),   INTENT(IN)  ::OFLAG  ! mask for array filling
-INTEGER,             INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100),  INTENT(IN)  :: HCOMMENT ! Comment string
-CHARACTER(LEN=1),    INTENT(IN)  :: HDIR     ! type of field :
-!                                            ! 'H' : field with
-!                                            !       horizontal spatial dim.
-!                                            ! 'A' : entire field with
-!                                            !       horizontal spatial dim. :
-!                                            !       It is not distributed on
-!                                            !       the processors
-!                                            ! '-' : no horizontal dim.
+CHARACTER(LEN=LEN_HREC),   INTENT(IN)  :: HREC     ! name of the article to write
+INTEGER,                   INTENT(IN)  :: KL1,KL2  ! number of points
+REAL, DIMENSION(KL1,KL2),  INTENT(IN)  :: PFIELD   ! array containing the data field
+LOGICAL,DIMENSION(JPCOVER),INTENT(IN)  :: OFLAG    ! mask for array filling
+INTEGER,                   INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),        INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=1),          INTENT(IN)  :: HDIR     ! type of field :
+   !                                               ! 'H' : field with
+!                                                  !       horizontal spatial dim.
+!                                                  ! 'A' : entire field with
+!                                                  !       horizontal spatial dim. :
+!                                                  !       It is not distributed on
+!                                                  !       the processors
+!                                                  ! '-' : no horizontal dim.
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
 INTEGER           :: J1D            ! loop counter
-INTEGER           :: I1D            ! 1D array size
-INTEGER           :: JILOOP,JJLOOP  ! loop indexes
-
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK  ! work array read in the file
-REAL, DIMENSION(:),   ALLOCATABLE :: ZW1D   ! 1D work array
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK  ! work array written in the file
 !
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
-!
+REAL              :: ZUNDEF                       ! undefined value in SURFEX
+CHARACTER(LEN=2)  :: YDIR
 CHARACTER(LEN=LEN_HREC) :: YREC
-CHARACTER(LEN=100):: YCOMMENT
+!
 !JUANZ
 INTEGER           :: NCOVER,ICOVER,IKL2, JL2
 REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
 !JUANZ
-CHARACTER(LEN=2)  :: YDIR
 LOGICAL           :: GCOVER_PACKED   ! .T. if cover fields are all packed together
+!
+CHARACTER(LEN=5)  :: YMSG
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2COV_MNH','writing '//TRIM(HREC))
+!
 !*       2.    Ecriture
 !        --------------
 !
@@ -493,10 +540,18 @@ END IF
 ! with Z-splitting using NB_PROC_IO_W / NB_PROC_IO_W, so we do not use GCOVER_PACKED 
 !GCOVER_PACKED = ( NB_PROCIO_W /= 1 )
 GCOVER_PACKED = .FALSE.
-IGRID=0
-YREC='COVER_PACKED'
-YCOMMENT=''
-CALL FMWRIT(COUTFILE,YREC,COUT,'--',GCOVER_PACKED,IGRID,LEN(YCOMMENT),YCOMMENT,KRESP)
+!
+TZFIELD%CMNHNAME   = 'COVER_PACKED'
+TZFIELD%CSTDNAME   = ''
+TZFIELD%CLONGNAME  = 'SURFEX: COVER_PACKED'
+TZFIELD%CUNITS     = ''
+TZFIELD%CDIR       = '--'
+TZFIELD%CCOMMENT   = ''
+TZFIELD%NGRID      = 0
+TZFIELD%NTYPE      = TYPELOG
+TZFIELD%NDIMS      = 0
+CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,GCOVER_PACKED)
+
 !
 ALLOCATE(ZWORK(IIU,IJU))
 ZWORK(:,:) = XUNDEF
@@ -508,35 +563,44 @@ ICOVER=0
 DO IKL2=1,NCOVER
   CALL UNPACK_1D_2D(IMASK,PFIELD(:,IKL2),ZWORK3D(IIB:IIE,IJB:IJE,IKL2))
 END DO
-
-IGRID=4
-
+!
 IF (.NOT. GCOVER_PACKED) THEN
   ICOVER=0
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
   DO JL2=1,SIZE(OFLAG)
     WRITE(YREC,'(A5,I3.3)') 'COVER',JL2
+    TZFIELD%CMNHNAME   = TRIM(YREC)
+    TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(YREC)
+    TZFIELD%CDIR       = YDIR
     IF (OFLAG(JL2)) THEN
       ICOVER=ICOVER+1
-      CALL FMWRIT(COUTFILE,YREC,COUT,YDIR, ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,ICOVER),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+      CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,ICOVER))
     END IF
   END DO
 ELSE 
-  CALL FMWRIT(COUTFILE,HREC,COUT,YDIR, ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = YDIR
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:))
 END IF
 !
 DEALLOCATE(ZWORK3D)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    stop
-
- END IF
+!
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX2COV_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+END IF
 !
 DEALLOCATE(ZWORK)
 DEALLOCATE(IMASK)
@@ -586,54 +650,56 @@ END SUBROUTINE WRITE_SURFX2COV_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODE_ll
-USE MODE_IO_ll
-!
-USE MODD_PARAMETERS,     ONLY : XUNDEF
-!
-USE MODD_IO_SURF_MNH, ONLY :COUT, COUTFILE , NLUOUT, NMASK,        &
-                            NIU, NJU, NIB, NJB, NIE, NJE,          &
-                            NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
-                            NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG,TYPEREAL
+USE MODE_MSG
+USE MODE_TOOLS_ll
 !
-!
-USE MODI_UNPACK_1D_2D
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_DATA_COVER_PAR,ONLY : JPCOVER
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY :COUT, NLUOUT, NMASK, CMASK, &
+                              NIU, NJU, NIB, NJB, NIE, NJE,          &
+                              NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,    &
+                              NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
+USE MODD_PARAMETERS,    ONLY: XUNDEF
 !
 USE MODI_GET_SURF_UNDEF
+USE MODI_UNPACK_1D_2D
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),        INTENT(IN)  :: HREC     ! name of the article to be read
-INTEGER,                  INTENT(IN)  :: KL1      ! number of points
-INTEGER,                  INTENT(IN)  :: KL2      ! 2nd dimension
-REAL, DIMENSION(KL1,KL2), INTENT(IN)  :: PFIELD   ! array containing the data field
-INTEGER,                  INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100),       INTENT(IN)  :: HCOMMENT ! Comment string
-CHARACTER(LEN=1),         INTENT(IN)  :: HDIR     ! type of field :
-!                                                 ! 'H' : field with
-!                                                 !       horizontal spatial dim.
-!                                                 ! 'A' : entire field with
-!                                                 !       horizontal spatial dim. :
-!                                                 !       It is not distributed on
-!                                                 !       the processors
-!                                                 ! '-' : no horizontal dim.
+CHARACTER(LEN=LEN_HREC),   INTENT(IN)  :: HREC     ! name of the article to write
+INTEGER,                   INTENT(IN)  :: KL1,KL2  ! number of points
+REAL, DIMENSION(KL1,KL2),  INTENT(IN)  :: PFIELD   ! array containing the data field
+INTEGER,                   INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),        INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=1),          INTENT(IN)  :: HDIR     ! type of field :
+   !                                               ! 'H' : field with
+!                                                  !       horizontal spatial dim.
+!                                                  ! 'A' : entire field with
+!                                                  !       horizontal spatial dim. :
+!                                                  !       It is not distributed on
+!                                                  !       the processors
+!                                                  ! '-' : no horizontal dim.
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK  ! work array read in the file
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD  ! work array read in the file
-INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
-REAL              :: ZUNDEF         ! undefined value in SURFEX
-
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK  ! work array written in the file
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFIELD ! work array written in the file
+!
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
+INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
+REAL              :: ZUNDEF                       ! undefined value in SURFEX
+!
+CHARACTER(LEN=5)  :: YMSG
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2_MNH','writing '//TRIM(HREC))
+!
 IF (HDIR=='A') THEN
   IIU = NIU_ALL
   IJU = NJU_ALL
@@ -654,44 +720,64 @@ ELSE
   IMASK = NMASK
 END IF
 !
-IGRID=4
 CALL GET_SURF_UNDEF(ZUNDEF)
-
+!
 IF (HDIR=='H' .OR. HDIR=='A') THEN
   ALLOCATE(ZWORK(IIU,IJU,SIZE(PFIELD,2)))
   ZWORK(:,:,:) = XUNDEF
   CALL UNPACK_1D_2D(NMASK,PFIELD(:,:),ZWORK(IIB:IIE,IJB:IJE,:))
   WHERE (ZWORK==ZUNDEF) ZWORK=XUNDEF
-
-  IF (HDIR=='H') &
-  CALL FMWRIT(COUTFILE,HREC,COUT,'XY', ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
-  IF (HDIR=='A') &
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--', ZWORK(:,:,:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
-
+!
+  IF (HDIR=='H') THEN
+    TZFIELD%CMNHNAME   = TRIM(HREC)
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:))
+  END IF
+  IF (HDIR=='A') THEN
+    TZFIELD%CMNHNAME   = TRIM(HREC)
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZWORK(:,:,:))
+  END IF
+!
   DEALLOCATE(ZWORK)
   DEALLOCATE(IMASK)
 ELSE IF (HDIR=='-') THEN
   ALLOCATE(ZFIELD(KL1,KL2))
   ZFIELD=PFIELD
   WHERE (ZFIELD==ZUNDEF) ZFIELD=XUNDEF
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--', ZFIELD(:,:),IGRID,LEN(HCOMMENT),HCOMMENT,KRESP)
+!
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,ZFIELD(:,:))
+!
   DEALLOCATE(ZFIELD)
 END IF
 !
-!
 IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
- END IF
-!
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX2_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+END IF
 !
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFX2_MNH
@@ -737,68 +823,60 @@ END SUBROUTINE WRITE_SURFX2_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODE_ll
-USE MODE_IO_ll
-!
-!
-USE MODD_PARAMETERS,     ONLY : XUNDEF
-!
-USE MODD_IO_SURF_MNH,    ONLY : COUT, COUTFILE, NLUOUT, NIU_ALL, NJU_ALL
-USE MODD_CONF_n,           ONLY : CSTORAGE_TYPE
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT
+USE MODE_MSG
 !
-!
-USE MODI_UNPACK_1D_2D
-!
-USE MODD_PARAMETERS, ONLY : JPHEXT
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT, NIU_ALL, NJU_ALL
+USE MODD_PARAMETERS,    ONLY: JPHEXT
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),   INTENT(IN)  :: HREC     ! name of the article to be read
-INTEGER,             INTENT(IN)  :: KFIELD   ! the integer to be read
-INTEGER,             INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100),  INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+INTEGER,                INTENT(IN)  :: KFIELD   ! the integer to write
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER :: IFIELD
+INTEGER          :: IFIELD
+TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5) :: YMSG
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH','writing '//TRIM(HREC))
+!
 IF( (HREC=='IMAX' .OR. HREC=='JMAX' .OR. HREC=='KMAX') .AND.  &
      CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU'            ) THEN
-
-
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(HREC)//' not written in file by externalized surface')
     RETURN
 !
 ELSE
   IFIELD = KFIELD
   IF (HREC=='IMAX') IFIELD = NIU_ALL-2*JPHEXT
   IF (HREC=='JMAX') IFIELD = NJU_ALL-2*JPHEXT
-  CALL FMWRIT(COUTFILE,HREC,COUT,'--',IFIELD,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
-  IF (KRESP /=0) THEN
 !
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
-  END IF
- END IF
-
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,IFIELD)
+END IF
+!
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFN0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+END IF
+!
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFN0_MNH
 !
@@ -843,17 +921,14 @@ END SUBROUTINE WRITE_SURFN0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODE_ll
-USE MODE_IO_ll
-!
-!
-USE MODD_PARAMETERS,  ONLY : NUNDEF
-!
-USE MODD_IO_SURF_MNH, ONLY :COUT, COUTFILE , NLUOUT, NMASK, CMASK, &
-                            NIU, NJU, NIB, NJB, NIE, NJE
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT
+USE MODE_MSG
 !
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT, NMASK, CMASK,  &
+                              NIU, NJU, NIB, NJB, NIE, NJE
+USE MODD_PARAMETERS,    ONLY: NUNDEF
 !
 USE MODI_UNPACK_1D_2D
 !
@@ -861,10 +936,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),      INTENT(IN)  :: HREC     ! name of the article to be read
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
 INTEGER,                INTENT(IN)  :: KL       ! number of points
-INTEGER, DIMENSION(KL), INTENT(IN)  :: KFIELD   ! the integer to be read
-INTEGER,                INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
+INTEGER, DIMENSION(KL), INTENT(IN)  :: KFIELD   ! the integers to be written
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
 CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !                                               ! 'H' : field with
@@ -873,42 +948,54 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array written in the file
 !
+CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN1_MNH','writing '//TRIM(HREC))
+!
 IF (HDIR=='-') THEN
 !
- CALL FMWRIT(COUTFILE,HREC,COUT,'--',KFIELD,0,LEN(HCOMMENT),HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 1
+CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFN1_MNH','not yet fully implemented')
+RETURN
+!PW: TODO !  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,KFIELD)
 !
 ELSE IF (HDIR=='H') THEN
-
+!
   ALLOCATE(IWORK(NIU,NJU))
   IWORK(:,:) = NUNDEF
-  !
-  !
+!
   CALL UNPACK_1D_2D(NMASK,KFIELD,IWORK(NIB:NIE,NJB:NJE))
-
-  CALL FMWRIT(COUTFILE,HREC,COUT,'XY', IWORK(:,:),4,LEN(HCOMMENT),HCOMMENT,KRESP)
-  !
+!
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 2
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,IWORK(:,:))
+!
   DEALLOCATE(IWORK)
-
-  IF (KRESP /=0) THEN
+END IF
 !
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
-  END IF
-
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFN1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
 END IF
-
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFN1_MNH
 !
@@ -953,28 +1040,32 @@ END SUBROUTINE WRITE_SURFN1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-!
-USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
-USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPECHAR,TYPELOG
+USE MODE_MSG
 !
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT, NIU_ALL, NJU_ALL
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),  INTENT(IN)  :: HREC     ! name of the article to be read
-CHARACTER(LEN=40),  INTENT(IN)  :: HFIELD   ! the integer to be read
-INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+CHARACTER(LEN=40),      INTENT(IN)  :: HFIELD   ! the string to write
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-LOGICAL            :: GCARTESIAN
-CHARACTER(LEN=100) :: YCOMMENT
+LOGICAL          :: GCARTESIAN
+TYPE(TFIELDDATA) :: TZFIELD
+CHARACTER(LEN=5) :: YMSG
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFC0_MNH','writing '//TRIM(HREC))
+!
 IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
      .AND. HREC=='GRID_TYPE       '                  ) THEN
   IF (HFIELD(1:10)=='CONF PROJ ') THEN
@@ -982,24 +1073,35 @@ IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
   ELSE IF (HFIELD(1:10)=='CARTESIAN ') THEN
     GCARTESIAN = .TRUE.
   END IF
-  YCOMMENT = '(-)'
-  CALL FMWRIT(COUTFILE,'CARTESIAN',COUT,'--',GCARTESIAN,0,LEN(YCOMMENT),YCOMMENT,KRESP)
+!
+  TZFIELD%CMNHNAME   = 'CARTESIAN'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: CARTESIAN'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,GCARTESIAN)
+!
+END IF
+!
+TZFIELD%CMNHNAME   = TRIM(HREC)
+TZFIELD%CSTDNAME   = ''
+TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+TZFIELD%CUNITS     = ''
+TZFIELD%CDIR       = '--'
+TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+TZFIELD%NGRID      = 0
+TZFIELD%NTYPE      = TYPECHAR
+TZFIELD%NDIMS      = 0
+CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,HFIELD)
+!
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFC0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
 END IF
-
-CALL FMWRIT(COUTFILE,HREC,COUT,'--',HFIELD,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
- END IF
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFC0_MNH
 !
@@ -1044,22 +1146,25 @@ END SUBROUTINE WRITE_SURFC0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-USE MODI_UNPACK_1D_2D
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT,TYPELOG
+USE MODE_MSG
 !
-USE MODD_IO_SURF_MNH, ONLY :COUT, COUTFILE , NLUOUT, NMASK, CMASK, &
-                            NIU, NJU, NIB, NJB, NIE, NJE
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT, NMASK, CMASK, &
+                              NIU, NJU, NIB, NJB, NIE, NJE
 !
+USE MODI_UNPACK_1D_2D
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),      INTENT(IN)  :: HREC     ! name of the article to be read
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
 INTEGER,                INTENT(IN)  :: KL       ! number of points
 LOGICAL, DIMENSION(KL), INTENT(IN)  :: OFIELD   ! array containing the data field
-INTEGER,                INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
 CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !                                               ! 'H' : field with
@@ -1070,68 +1175,64 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK  ! work array written in the file
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array written in the file
-
+!
+CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
-
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH','writing '//TRIM(HREC))
+!
 IF (HDIR=='-') THEN
   IF( (CMASK /= 'FULL  ').AND. (HREC=='COVER') ) THEN
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC,'  with MASK ',CMASK
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH',TRIM(HREC)//' with mask '// &
+                   TRIM(CMASK)//' not written in file by externalized surface')
     RETURN
-  !
   ELSE
-    CALL FMWRIT(COUTFILE,HREC,COUT,'--',OFIELD(:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
-    IF (KRESP /=0) THEN
-!
-      WRITE(NLUOUT,*) ' '
-      WRITE(NLUOUT,*) 'WARNING'
-      WRITE(NLUOUT,*) '-------'
-      WRITE(NLUOUT,*) ' '
-      WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-      WRITE(NLUOUT,*) ' '
-      CALL ABORT
-      STOP
-
-    END IF
-
+    TZFIELD%CMNHNAME   = TRIM(HREC)
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPELOG
+    TZFIELD%NDIMS      = 1
+CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFL1_MNH','not yet fully implemented')
+RETURN
+!PW: TODO !  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,OFIELD(:))
   END IF
-
+!
 ELSE IF (HDIR=='H') THEN
-
+!
   ALLOCATE(GWORK(NIU,NJU))
   GWORK(:,:) = .FALSE.
-  !
-  !
+!
   CALL UNPACK_1D_2D(NMASK,OFIELD,GWORK(NIB:NIE,NJB:NJE))
-
+!
   ALLOCATE(IWORK(NIU,NJU))
   IWORK = 0
   WHERE(GWORK) IWORK = 1
-  CALL FMWRIT(COUTFILE,HREC,COUT,'XY', IWORK(:,:),4,LEN(HCOMMENT),HCOMMENT,KRESP)
-  DEALLOCATE(IWORK)
+!
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 2
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,IWORK(:,:))
   !
+  DEALLOCATE(IWORK)
   DEALLOCATE(GWORK)
-
-  IF (KRESP /=0) THEN
 !
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
-  END IF
-
 END IF
 !
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFL1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+END IF
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFL1_MNH
 !
@@ -1176,50 +1277,50 @@ END SUBROUTINE WRITE_SURFL1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FM
-USE MODE_FMWRIT
-!
-USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT, CMASK
+USE MODE_IO_WRITE_FIELD
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG
+USE MODE_MSG
 !
+USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+USE MODD_IO_ll,         ONLY: TFILE_SURFEX
+USE MODD_IO_SURF_MNH,   ONLY: COUT, NLUOUT, CMASK
 !
 IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-CHARACTER(LEN=LEN_HREC),  INTENT(IN)  :: HREC     ! name of the article to be read
-LOGICAL,            INTENT(IN)  :: OFIELD   ! array containing the data field
-INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
-CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+LOGICAL,                INTENT(IN)  :: OFIELD   ! array containing the data field
+INTEGER,                INTENT(OUT) :: KRESP    ! return-code if a problem appears
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !
 !*      0.2   Declarations of local variables
 !
-
-
-IF( (CMASK /= 'FULL  ').AND. (HREC=='COVER') ) THEN
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC,'  with MASK ',CMASK
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
-    RETURN
+CHARACTER(LEN=5) :: YMSG
+TYPE(TFIELDDATA) :: TZFIELD
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH','writing '//TRIM(HREC))
+!
+IF( (CMASK /= 'FULL  ').AND. (HREC=='COVER') ) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH',TRIM(HREC)//' with mask '// &
+                 TRIM(CMASK)//' not written in file by externalized surface')
+  RETURN
 ELSE
-CALL FMWRIT(COUTFILE,HREC,COUT,'--',OFIELD,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
- END IF
-
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,COUT,KRESP,OFIELD)
+END IF
+!
+IF (KRESP /=0) THEN
+  WRITE ( YMSG, '( I5 )' ) KRESP
+  CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFL0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
 END IF
 !-------------------------------------------------------------------------------
 END SUBROUTINE WRITE_SURFL0_MNH
@@ -1267,6 +1368,7 @@ END SUBROUTINE WRITE_SURFL0_MNH
 !
 USE MODE_FM
 USE MODE_FMWRIT
+USE MODE_MSG
 !
 USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
 USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
@@ -1289,61 +1391,39 @@ CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
 !
 CHARACTER(LEN=LEN_HREC)      :: YRECFM    ! Name of the article to be written
 INTEGER, DIMENSION(3)  :: ITDATE
+CHARACTER(LEN=5) :: YMSG
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH','writing '//TRIM(HREC))
 !
 IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
-    RETURN
-!
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(HREC)//' not written in file by externalized surface')
+  RETURN
 ELSE
 
-
-YRECFM=TRIM(HREC)//'%TDATE'
+  YRECFM=TRIM(HREC)//'%TDATE'
 !
-ITDATE(1)=KYEAR
-ITDATE(2)=KMONTH
-ITDATE(3)=KDAY
-CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
- END IF
+  ITDATE(1)=KYEAR
+  ITDATE(2)=KMONTH
+  ITDATE(3)=KDAY
+  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE,0,LEN(HCOMMENT),HCOMMENT,KRESP)
 !
-YRECFM=TRIM(HREC)//'%TIME'
-CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME,0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    CALL ABORT
-    STOP
-
- END IF
-
+  IF (KRESP /=0) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+  END IF
+!
+  YRECFM=TRIM(HREC)//'%TIME'
+  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME,0,LEN(HCOMMENT),HCOMMENT,KRESP)
+!
+  IF (KRESP /=0) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+  END IF
 END IF
-
+!
 END SUBROUTINE WRITE_SURFT0_MNH
-
+!
 !     #############################################################
       SUBROUTINE WRITE_SURFT1_MNH(HREC,KL1,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
 !     #############################################################
@@ -1386,6 +1466,7 @@ END SUBROUTINE WRITE_SURFT0_MNH
 !
 USE MODE_FM
 USE MODE_FMWRIT
+USE MODE_MSG
 !
 USE MODD_IO_SURF_MNH,        ONLY : COUT, COUTFILE, NLUOUT
 USE MODD_CONF_n,               ONLY : CSTORAGE_TYPE
@@ -1409,55 +1490,36 @@ CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! Comment string
 !
 CHARACTER(LEN=LEN_HREC)      :: YRECFM    ! Name of the article to be written
 INTEGER, DIMENSION(3,KL1)  :: ITDATE
+CHARACTER(LEN=5) :: YMSG
 !-------------------------------------------------------------------------------
 !
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH','writing '//TRIM(HREC))
 !
 IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN
-!    WRITE(NLUOUT,*) ' MESO-NH writing'
-!    WRITE(NLUOUT,*) '-------'
-!    WRITE(NLUOUT,*) ' '
-!    WRITE(NLUOUT,*) 'article ', HREC
-!    WRITE(NLUOUT,*) 'not written in file by externalized surface'
-!    WRITE(NLUOUT,*) ' '
-    RETURN
-!
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(HREC)//' not written in file by externalized surface')
+  RETURN
 ELSE
-
-
-YRECFM=TRIM(HREC)//'%TDATE'
 !
-ITDATE(1,:) = KYEAR  (:)
-ITDATE(2,:) = KMONTH (:)
-ITDATE(3,:) = KDAY   (:)
-CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE(:,:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    stop
-
- END IF
+  YRECFM=TRIM(HREC)//'%TDATE'
+!
+  ITDATE(1,:) = KYEAR  (:)
+  ITDATE(2,:) = KMONTH (:)
+  ITDATE(3,:) = KDAY   (:)
+  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',ITDATE(:,:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
+!
+  IF (KRESP /=0) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+  END IF
+!
+  YRECFM=TRIM(HREC)//'%TIME'
+  CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME(:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
+!
+  IF (KRESP /=0) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
+  END IF
 !
-YRECFM=TRIM(HREC)//'%TIME'
-CALL FMWRIT(COUTFILE,YRECFM,COUT,'--',PTIME(:),0,LEN(HCOMMENT),HCOMMENT,KRESP)
-
- IF (KRESP /=0) THEN
-!
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) ' '
-    WRITE(NLUOUT,*) 'error when writing article', HREC,'KRESP=',KRESP
-    WRITE(NLUOUT,*) ' '
-    stop
-
- END IF
-
 END IF
-
+!
 END SUBROUTINE WRITE_SURFT1_MNH
-- 
GitLab