From 8c414538edb03541e594f18c96d110afa57c0a39 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 10 Jan 2019 14:28:30 +0100
Subject: [PATCH] Philippe 10/01/2019: replace handle_err by io_handle_err_nc4
 for better netCDF error messages + some corrections in the error messages

---
 src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90  |   9 +-
 src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90  | 151 +++++++-------
 src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 |  66 +++---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 220 +++++++++++---------
 4 files changed, 231 insertions(+), 215 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90
index 8a6c45a71..34b375157 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2018-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -12,6 +12,7 @@
 !     Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN
 !                                    + move IOFREEFLU and IONEWFLU to mode_io_file_lfi.f90
 !                                    + move management of NNCID and NLFIFLU to the nc4 and lfi subroutines
+!     Philippe Wautelet: 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
 !
 !-----------------------------------------------------------------
 #if defined(MNH_IOCDF4)
@@ -20,7 +21,7 @@ module mode_io_file_nc4
 use modd_io_ll,  only: tfiledata
 use modd_netcdf, only: IDCDF_KIND
 
-use mode_io_tools_nc4, only: handle_err, io_set_knowndims_nc4, newiocdf
+use mode_io_tools_nc4, only: io_handle_err_nc4, io_set_knowndims_nc4, newiocdf
 use mode_msg
 
 use NETCDF,      only: NF90_CLOBBER, NF90_GLOBAL, NF90_NETCDF4, NF90_NOERR, NF90_NOWRITE,  &
@@ -178,7 +179,7 @@ subroutine io_set_cleanly_closed_nc4(tpfile)
   call print_msg(NVERB_DEBUG,'IO','io_set_cleanly_closed_nc4','called for '//trim(tpfile%cname))
 
   istatus = NF90_PUT_ATT(tpfile%nncid, NF90_GLOBAL, 'MNH_cleanly_closed', 'yes')
-  if (istatus /= NF90_NOERR) call handle_err(istatus,__LINE__,'io_set_cleanly_closed_nc4[NF90_PUT_ATT]')
+  if (istatus /= NF90_NOERR) call io_handle_err_nc4(istatus,'io_set_cleanly_closed_nc4','NF90_PUT_ATT','MNH_cleanly_closed')
 end subroutine io_set_cleanly_closed_nc4
 
 
@@ -190,7 +191,7 @@ subroutine io_set_not_cleanly_closed_nc4(tpfile)
   call print_msg(NVERB_DEBUG,'IO','io_set_not_cleanly_closed_nc4','called for '//trim(tpfile%cname))
 
   istatus = NF90_PUT_ATT(tpfile%nncid, NF90_GLOBAL, 'MNH_cleanly_closed', 'no')
-  if (istatus /= NF90_NOERR) call handle_err(istatus,__LINE__,'io_set_not_cleanly_closed_nc4[NF90_PUT_ATT]')
+  if (istatus /= NF90_NOERR) call io_handle_err_nc4(istatus,'io_set_not_cleanly_closed_nc4','NF90_PUT_ATT','MNH_cleanly_closed')
 end subroutine io_set_not_cleanly_closed_nc4
 
 end module mode_io_file_nc4
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index b5853626c..9fb6870ad 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -8,6 +8,7 @@
 !    J.Escobar   : 14/12/2017 : Correction for MNH_INT=8
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !    P. Wautelet : 13/12/2018 : split of mode_netcdf into multiple modules/files
+!  Philippe Wautelet: 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
 !-----------------------------------------------------------------
 #if defined(MNH_IOCDF4)
 module mode_io_read_nc4
@@ -16,7 +17,7 @@ use modd_io_ll,        only: tfiledata
 use modd_netcdf,       only: IDCDF_KIND
 
 use mode_field,        only: tfielddata
-use mode_io_tools_nc4, only: cleanmnhname, handle_err
+use mode_io_tools_nc4, only: cleanmnhname, io_handle_err_nc4
 use mode_msg
 
 use NETCDF,            only: NF90_CHAR, NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_INT1, NF90_INT64,  &
@@ -279,11 +280,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X0','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X0','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -292,7 +293,7 @@ IF (IDIMS == 0 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Read variable
   STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
   IF (STATUS /= NF90_NOERR) THEN
-    CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+    CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X0','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
     GOTO 1000
   END IF
   ! Read and check attributes of variable
@@ -336,11 +337,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X1','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X1','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -348,13 +349,13 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 1 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X1','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN == SIZE(PFIELD)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X1','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -403,11 +404,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -415,7 +416,7 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 !Treat special case of a degenerated 3D array (3rd dimension size is 1)
 IF (IDIMS==3) THEN
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   IF (IDIMLEN(3)==1) THEN
     CALL PRINT_MSG(NVERB_INFO,'IO','IO_READ_FIELD_NC4_X2',TRIM(TPFILE%CNAME)// &
                    ': reading 3D array with degenerated third dimension in 2D array for '//TRIM(YVARNAME))
@@ -428,15 +429,15 @@ END IF
 IF (IDIMS == 2 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN(1) == SIZE(PFIELD,1) .AND. IDIMLEN(2) == SIZE(PFIELD,2)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X2','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -485,11 +486,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -497,17 +498,17 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 3 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN(1) == SIZE(PFIELD,1) .AND. IDIMLEN(2) == SIZE(PFIELD,2) .AND. IDIMLEN(3) == SIZE(PFIELD,3)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X3','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -556,11 +557,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -568,20 +569,20 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 4 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(4), LEN=IDIMLEN(4))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF ( IDIMLEN(1) == SIZE(PFIELD,1) .AND. IDIMLEN(2) == SIZE(PFIELD,2) .AND. &
        IDIMLEN(3) == SIZE(PFIELD,3) .AND. IDIMLEN(4) == SIZE(PFIELD,4)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X4','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -630,11 +631,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -642,15 +643,15 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 5 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(4), LEN=IDIMLEN(4))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(5), LEN=IDIMLEN(5))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF ( IDIMLEN(1) == SIZE(PFIELD,1) .AND. IDIMLEN(2) == SIZE(PFIELD,2) .AND. &
        IDIMLEN(3) == SIZE(PFIELD,3) .AND. IDIMLEN(4) == SIZE(PFIELD,4) .AND. &
@@ -658,7 +659,7 @@ IF (IDIMS == 5 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X5','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -707,11 +708,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -719,17 +720,17 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 6 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(4), LEN=IDIMLEN(4))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(5), LEN=IDIMLEN(5))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(6), LEN=IDIMLEN(6))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF ( IDIMLEN(1) == SIZE(PFIELD,1) .AND. IDIMLEN(2) == SIZE(PFIELD,2) .AND. &
        IDIMLEN(3) == SIZE(PFIELD,3) .AND. IDIMLEN(4) == SIZE(PFIELD,4) .AND. &
@@ -737,7 +738,7 @@ IF (IDIMS == 6 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_X6','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -784,11 +785,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-   CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
-   GOTO 1000
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N0','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
+  GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_N0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N0','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -798,7 +799,7 @@ IF (IDIMS == 0 .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT64) ) THEN
    ! Read variable
    STATUS = NF90_GET_VAR(INCID, IVARID, KFIELD)
    IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N0','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
    END IF
    ! Read and check attributes of variable
@@ -842,11 +843,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N1[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N1','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_N1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N1','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -855,13 +856,13 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 1 .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT64 .OR. ITYPE == NF90_INT1) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N1[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N1','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN == SIZE(KFIELD)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, KFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N1[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N1','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -910,11 +911,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -922,7 +923,7 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 !Treat special case of a degenerated 3D array (3rd dimension size is 1)
 IF (IDIMS==3) THEN
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   IF (IDIMLEN(3)==1) THEN
     CALL PRINT_MSG(NVERB_INFO,'IO','IO_READ_FIELD_NC4_N2',TRIM(TPFILE%CNAME)// &
                    ': reading 3D array with degenerated third dimension in 2D array for '//TRIM(YVARNAME))
@@ -936,15 +937,15 @@ END IF
 IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT64 .OR. ITYPE == NF90_INT1) ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN(2))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN(1) == SIZE(KFIELD,1) .AND. IDIMLEN(2) == SIZE(KFIELD,2)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, KFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_N2','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
     ! Read and check attributes of variable
@@ -991,11 +992,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_L0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L0','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_L0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L0','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -1006,7 +1007,7 @@ IF (IDIMS == 0 .AND. (ITYPE == NF90_INT1 .OR. ITYPE == NF90_INT .OR. ITYPE == NF
   ! Read variable
   STATUS = NF90_GET_VAR(INCID, IVARID, IFIELD)
   IF (STATUS /= NF90_NOERR) THEN
-    CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_L0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+    CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L0','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
     GOTO 1000
   END IF
 
@@ -1064,11 +1065,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_L1[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L1','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
   GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_L1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L1','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 !Neglect the time dimension (of size 1)
 IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
@@ -1078,13 +1079,13 @@ IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
 IF (IDIMS == 1 .AND. (ITYPE == NF90_INT1 .OR. ITYPE == NF90_INT .OR. ITYPE == NF90_INT64)  ) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_L1[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L1','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
 
   IF (IDIMLEN == SIZE(OFIELD)) THEN
     ! Read variable
     STATUS = NF90_GET_VAR(INCID, IVARID, IFIELD)
     IF (STATUS /= NF90_NOERR) THEN
-      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_L1[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_L1','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
       GOTO 1000
     END IF
 
@@ -1150,22 +1151,22 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-   CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_C0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
-   GOTO 1000
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_C0','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
+  GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_C0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_C0','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 IF (IDIMS == 1 .AND. (ITYPE == NF90_CHAR) ) THEN
    ! Check size of variable before reading
    STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
-   IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_C0[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_C0','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
    !
    ALLOCATE(CHARACTER(LEN=IDIMLEN)::YSTR)
    ! Read variable
    STATUS = NF90_GET_VAR(INCID, IVARID, YSTR)
    IF (STATUS /= NF90_NOERR) THEN
-     CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_C0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+     CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_C0','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
      GOTO 1000
    END IF
    IF (LEN_TRIM(YSTR) > LEN(HFIELD)) &
@@ -1218,17 +1219,17 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 ! Get variable ID, NDIMS and TYPE
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
-   CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_T0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
-   GOTO 1000
+  CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_T0','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
+  GOTO 1000
 END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
-IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_T0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_T0','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
 
 IF (IDIMS == 0 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
   ! Read time
   STATUS = NF90_GET_VAR(INCID, IVARID, TPDATA%TIME)
   IF (STATUS /= NF90_NOERR) THEN
-    CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+    CALL IO_HANDLE_ERR_NC4(status,'IO_READ_FIELD_NC4_T0','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
     GOTO 1000
   END IF
   ! Read and check attributes of variable
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index a0c53f5fb..b66011fac 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -8,6 +8,7 @@
 !    J.Escobar   : 14/12/2017 : Correction for MNH_INT=8
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !    P. Wautelet : 13/12/2018 : split of mode_netcdf into multiple modules/files
+!  Philippe Wautelet: 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
 !-----------------------------------------------------------------
 #if defined(MNH_IOCDF4)
 module mode_io_tools_nc4
@@ -26,7 +27,7 @@ implicit none
 private
 
 public :: io_find_dim_byname_nc4, io_guess_dimids_nc4, io_set_knowndims_nc4
-public :: cleaniocdf, cleanmnhname, fillvdims, getdimcdf, getstrdimid, handle_err, newiocdf
+public :: cleaniocdf, cleanmnhname, fillvdims, getdimcdf, getstrdimid, io_handle_err_nc4, newiocdf
 
 contains
 
@@ -480,7 +481,7 @@ IF (.NOT. ASSOCIATED(TMP)) THEN
    TMP%NAME = YDIMNAME
    TMP%LEN = KLEN
    STATUS = NF90_DEF_DIM(TPFILE%NNCID, TMP%NAME, KLEN, TMP%ID)
-   IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETDIMCDF[NF90_DEF_DIM]')
+   IF (STATUS /= NF90_NOERR) CALL io_handle_err_nc4(status,'GETDIMCDF','NF90_DEF_DIM',trim(TMP%NAME))
    NULLIFY(TMP%NEXT)
    TMP%NEXT       => PIOCDF%DIMLIST
    PIOCDF%DIMLIST => TMP
@@ -523,7 +524,7 @@ IF (.NOT. ASSOCIATED(TMP)) THEN
    TMP%NAME = 'char'//TRIM(YSUFFIX)
    TMP%LEN = KLEN
    STATUS = NF90_DEF_DIM(TPFILE%NNCID, TMP%NAME, KLEN, TMP%ID)
-   IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETSTRDIMID[NF90_DEF_DIM]')
+   IF (STATUS /= NF90_NOERR) CALL io_handle_err_nc4(status,'GETSTRDIMID','NF90_DEF_DIM',trim(TMP%NAME))
    NULLIFY(TMP%NEXT)
    TMP%NEXT      => TPFILE%TNCDIMS%DIMSTR
    TZIOCDF => TPFILE%TNCDIMS
@@ -553,33 +554,28 @@ NEWIOCDF=>TZIOCDF
 END FUNCTION NEWIOCDF
 
 
-SUBROUTINE HANDLE_ERR(STATUS,LINE,TEXT,KRESP)
-INTEGER(KIND=IDCDF_KIND),INTENT(IN)  :: STATUS
-INTEGER,                 INTENT(IN)  :: LINE
-CHARACTER(LEN=*),        INTENT(IN)  :: TEXT
-INTEGER, OPTIONAL,       INTENT(OUT) :: KRESP
-
-CHARACTER(LEN=6) :: YLINE
-
-WRITE(YLINE,'( I6 )') LINE
-
-! Don't stop (by default) the code when KRESP is present
-! and ensure KRESP is a negative integer
-IF (STATUS /= NF90_NOERR) THEN
-  IF (PRESENT(KRESP)) THEN
-    IF (STATUS < 0) THEN
-      KRESP = STATUS
-    ELSE IF (STATUS == 0) THEN
-      KRESP = -1
-    ELSE
-      KRESP = -STATUS
-    END IF
-    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(TEXT),'netCDF error at line '//TRIM(YLINE)//': '//TRIM(NF90_STRERROR(STATUS)))
-  ELSE
-    CALL PRINT_MSG(NVERB_FATAL,'IO',TRIM(TEXT),'netCDF error at line '//TRIM(YLINE)//': '//TRIM(NF90_STRERROR(STATUS)))
-  END IF
-END IF
-END SUBROUTINE HANDLE_ERR
+subroutine io_handle_err_nc4(kstatus,hsubr,hncsubr,hvar,kresp)
+integer(kind=IDCDF_KIND),intent(in)  :: kstatus
+character(len=*),        intent(in)  :: hsubr
+character(len=*),        intent(in)  :: hncsubr
+character(len=*),        intent(in)  :: hvar
+integer, optional,       intent(out) :: kresp
+
+! Don't stop (by default) the code when kresp is present
+! and ensure kresp is a negative integer
+if (kstatus /= NF90_NOERR) then
+  if (present(kresp)) then
+    if (kstatus < 0) then
+      kresp = kstatus
+    else
+      kresp = -kstatus
+    end if
+    call print_msg(NVERB_WARNING,'IO',trim(hsubr),trim(hvar)//': '//trim(hncsubr)//': '//trim(NF90_STRERROR(kstatus)))
+  else
+    call print_msg(NVERB_ERROR,  'IO',trim(hsubr),trim(hvar)//': '//trim(hncsubr)//': '//trim(NF90_STRERROR(kstatus)))
+  end if
+end if
+end subroutine io_handle_err_nc4
 
 
 SUBROUTINE CLEANMNHNAME(HINNAME,HOUTNAME)
@@ -664,11 +660,11 @@ integer :: a, b
 CALL PRINT_MSG(NVERB_ERROR,'IO','getstrdimid','empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF')
 end function getstrdimid
 !
-subroutine handle_err(a, b, c, d)
+subroutine io_handle_err_nc4(a, b, c, d, e)
 use mode_msg
-integer :: a, b, c, d
-CALL PRINT_MSG(NVERB_ERROR,'IO','handle_err','empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF')
-end subroutine handle_err
+integer :: a, b, c, d, e
+CALL PRINT_MSG(NVERB_ERROR,'IO','io_handle_err_nc4','empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF')
+end subroutine io_handle_err_nc4
 !
 function newiocdf()
 use mode_msg
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index a95c75a37..fef41bd3c 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -8,6 +8,7 @@
 !    J.Escobar   : 14/12/2017 : Correction for MNH_INT=8
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !    P. Wautelet : 13/12/2018 : split of mode_netcdf into multiple modules/files
+!  Philippe Wautelet: 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages
 !-----------------------------------------------------------------
 #if defined(MNH_IOCDF4)
 module mode_io_write_nc4
@@ -16,7 +17,7 @@ use modd_io_ll,        only: gsmonoproc, tfiledata
 use modd_netcdf,       only: dimcdf, IDCDF_KIND, iocdf
 
 use mode_field,        only: tfielddata
-use mode_io_tools_nc4, only: cleanmnhname, fillvdims, getdimcdf, getstrdimid, handle_err
+use mode_io_tools_nc4, only: cleanmnhname, fillvdims, getdimcdf, getstrdimid, io_handle_err_nc4
 use mode_msg
 
 use NETCDF,            only: NF90_CHAR, NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_INT1, NF90_INT64, &
@@ -93,7 +94,8 @@ IF(LEN_TRIM(TPFIELD%CSTDNAME)==0) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','TPFIELD%CSTDNAME not set for variable '//TRIM(TPFIELD%CMNHNAME))
 ELSE
   STATUS = NF90_PUT_ATT(INCID, KVARID,'standard_name', TRIM(TPFIELD%CSTDNAME))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','standard_name for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! Long_name attribute definition (CF convention)
@@ -101,7 +103,8 @@ IF(LEN_TRIM(TPFIELD%CLONGNAME)==0) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','TPFIELD%CLONGNAME not set for variable '//TRIM(TPFIELD%CMNHNAME))
 ELSE
   STATUS = NF90_PUT_ATT(INCID, KVARID,'long_name', TRIM(TPFIELD%CLONGNAME))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','long_name for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! Canonical units attribute definition (CF convention)
@@ -109,7 +112,8 @@ IF(LEN_TRIM(TPFIELD%CUNITS)==0) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','TPFIELD%CUNITS not set for variable '//TRIM(TPFIELD%CMNHNAME))
 ELSE
   STATUS = NF90_PUT_ATT(INCID, KVARID,'units', TRIM(TPFIELD%CUNITS))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','units for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! GRID attribute definition
@@ -118,7 +122,8 @@ IF(TPFIELD%NGRID<0) THEN
 !Do not write GRID attribute if NGRID=0
 ELSE IF (TPFIELD%NGRID>0) THEN
   STATUS = NF90_PUT_ATT(INCID, KVARID, 'grid', TPFIELD%NGRID)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','grid for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! COMMENT attribute definition
@@ -126,14 +131,16 @@ IF(LEN_TRIM(TPFIELD%CCOMMENT)==0) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','TPFIELD%CCOMMENT not set for variable '//TRIM(TPFIELD%CMNHNAME))
 ELSE
   STATUS = NF90_PUT_ATT(INCID, KVARID,'comment', TRIM(TPFIELD%CCOMMENT))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','comment for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! Calendar (CF convention)
 IF(PRESENT(HCALENDAR)) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','CALENDAR provided for variable '//TRIM(TPFIELD%CMNHNAME))
   STATUS = NF90_PUT_ATT(INCID, KVARID,'calendar', TRIM(HCALENDAR))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','calendar for ' &
+                                                   //trim(TPFIELD%CMNHNAME))
 ENDIF
 !
 ! Coordinates (CF convention)
@@ -167,7 +174,7 @@ IF (.NOT.GISCOORD) THEN
         END SELECT
         !
         STATUS = NF90_PUT_ATT(INCID, KVARID,'coordinates',YCOORDS)
-        IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+        IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','coordinates')
         DEALLOCATE(YCOORDS)
       ELSE
         CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_ATTR_NC4','coordinates not implemented for variable ' &
@@ -190,15 +197,15 @@ IF(TPFIELD%NTYPE==TYPEINT .AND. TPFIELD%NDIMS>0) THEN
   !          * it cannot be modified if some data has already been written (->check OEXISTED)
   IF(.NOT.OEXISTED) THEN
     STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%NFILLVALUE)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','_FillValue')
   END IF
   !
   ! Valid_min/max (CF/COMODO convention)
   STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_min', TPFIELD%NVALIDMIN)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','valid_min')
   !
   STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_max',TPFIELD%NVALIDMAX)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','valid_max')
 ENDIF
 !
 IF(TPFIELD%NTYPE==TYPEREAL .AND. TPFIELD%NDIMS>0) THEN
@@ -216,7 +223,7 @@ IF(TPFIELD%NTYPE==TYPEREAL .AND. TPFIELD%NDIMS>0) THEN
     ELSE
       STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%XFILLVALUE)
     END IF
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','_FillValue')
   END IF
   !
   ! Valid_min/max (CF/COMODO convention)
@@ -225,14 +232,14 @@ IF(TPFIELD%NTYPE==TYPEREAL .AND. TPFIELD%NDIMS>0) THEN
   ELSE
     STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_min', TPFIELD%XVALIDMIN)
   END IF
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','valid_min')
   !
   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
     STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_max', REAL(TPFIELD%XVALIDMAX,KIND=4))
   ELSE
     STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_max',TPFIELD%XVALIDMAX)
   END IF
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_ATTR_NC4','NF90_PUT_ATT','valid_max')
 ENDIF
 !
 END SUBROUTINE IO_WRITE_FIELD_ATTR_NC4
@@ -275,7 +282,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X0','NF90_DEF_VAR',trim(YVARNAME))
      DEALLOCATE(IVDIMS)
    ELSE
      ! Define the scalar variable
@@ -284,7 +291,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVARID)
 #endif
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X0','NF90_DEF_VAR',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -295,7 +302,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X0
@@ -348,11 +355,11 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X1[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X1','NF90_DEF_VAR',trim(YVARNAME))
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X1[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X1','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -363,7 +370,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -443,11 +450,11 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X2','NF90_DEF_VAR',trim(YVARNAME))
    ! Add compression if asked for
    IF (TZFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TZFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X2','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -458,7 +465,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TZFILE,TZFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND),OISCOORD=OISCOORD)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X2','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -514,12 +521,13 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X3','NF90_DEF_VAR',trim(YVARNAME))
+
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X3[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X3','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X3[NF90_DEF_VAR]')
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X3',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -529,7 +537,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X3[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X3','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -585,12 +593,13 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X4','NF90_DEF_VAR',trim(YVARNAME))
+
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X4[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X4','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X4[NF90_DEF_VAR]')
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X4',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -600,7 +609,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X4[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X4','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -656,12 +665,13 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X5','NF90_DEF_VAR',trim(YVARNAME))
+
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X5','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_DEF_VAR]')
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X5',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -671,7 +681,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X5','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -727,12 +737,13 @@ IF (STATUS /= NF90_NOERR) THEN
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
 #endif
    END IF
-   ! Add compression if asked for
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X6','NF90_DEF_VAR',trim(YVARNAME))
+
+     ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X6[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X6','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X6[NF90_DEF_VAR]')
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X6',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -742,7 +753,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X6[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_X6','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -794,7 +805,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT64, IVDIMS, IVARID)
 #endif
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N0','NF90_DEF_VAR',trim(YVARNAME))
      DEALLOCATE(IVDIMS)
    ELSE
      ! Define the scalar variable
@@ -803,7 +814,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT64, IVARID)
 #endif
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N0','NF90_DEF_VAR',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -814,7 +825,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 !
 ! Use IMAX, JMAX, KMAX to define DIM_NI, DIM_NJ, DIM_LEVEL
@@ -888,7 +899,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT64, IVDIMS, IVARID)
 #endif
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N1[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N1','NF90_DEF_VAR',trim(YVARNAME))
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -898,7 +909,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -950,11 +961,11 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT64, IVDIMS, IVARID)
 #endif
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N2[NF90_DEF_VAR]')
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N2','NF90_DEF_VAR',trim(YVARNAME))
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N2[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N2','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -965,7 +976,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N2[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N2','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -1016,11 +1027,11 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT64, IVDIMS, IVARID)
 #endif
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3[NF90_DEF_VAR]')
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N3','NF90_DEF_VAR',trim(YVARNAME))
    ! Add compression if asked for
    IF (TPFILE%LNCCOMPRESS) THEN
      STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3[NF90_DEF_VAR_DEFLATE]')
+     IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N3','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -1031,7 +1042,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND))
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_N3','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -1075,13 +1086,13 @@ IF (STATUS /= NF90_NOERR) THEN
      ! Define the variable
      ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_L0','NF90_DEF_VAR',trim(YVARNAME))
      DEALLOCATE(IVDIMS)
    ELSE
      ! Define the scalar variable
      ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVARID)
-     IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_L0','NF90_DEF_VAR',trim(YVARNAME))
    END IF
 ELSE
    GEXISTED = .TRUE.
@@ -1099,7 +1110,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_L0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_L0
@@ -1147,7 +1158,7 @@ IF (STATUS /= NF90_NOERR) THEN
    ! Define the variable
    ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_L1','NF90_DEF_VAR',trim(YVARNAME))
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -1164,7 +1175,7 @@ END WHERE
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_L1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
 
@@ -1215,7 +1226,7 @@ IF (STATUS /= NF90_NOERR) THEN
    IVDIMS(1) = GETSTRDIMID(TPFILE,INT(ILEN,KIND=IDCDF_KIND))
    ! Define the variable
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_C0','NF90_DEF_VAR',trim(YVARNAME))
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_C0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -1228,7 +1239,7 @@ YFIELD(LEN_TRIM(HFIELD)+1:)=' '
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, YFIELD)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_C0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 DEALLOCATE(YFIELD)
 
 KRESP = IRESP
@@ -1285,7 +1296,7 @@ IF (STATUS /= NF90_NOERR) THEN
    IVDIMS(2) = IVDIMSTMP(1)
    ! Define the variable
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C1[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_C1','NF90_DEF_VAR',trim(YVARNAME))
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_C1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -1295,7 +1306,7 @@ END IF
 CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, HFIELD(1:ISIZE)(1:ILEN), START=(/IONE,IONE/), COUNT=(/ILEN,ISIZE/))
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_C1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF(ALLOCATED(IVDIMSTMP)) DEALLOCATE(IVDIMSTMP)
 
@@ -1372,7 +1383,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVARID)
 #endif
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_DEF_VAR',trim(YVARNAME))
 ELSE
    GEXISTED = .TRUE.
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
@@ -1386,7 +1397,7 @@ CALL DATETIME_DISTANCE(TZREF,TPDATA,ZDELTATIME)
 
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, ZDELTATIME)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
 
 IF (IRESP/=0) THEN
   KRESP = IRESP
@@ -1412,7 +1423,7 @@ IF (STATUS /= NF90_NOERR) THEN
 
    ! Define the variable
    STATUS = NF90_DEF_VAR(INCID, TZFIELD%CMNHNAME, NF90_INT, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]')
+     IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_DEF_VAR',trim(TZFIELD%CMNHNAME))
    CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,GEXISTED)
 ELSE
    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(TZFIELD%CMNHNAME)//' already defined')
@@ -1420,7 +1431,7 @@ END IF
 
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, ITDATE)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_PUT_VAR',trim(TZFIELD%CMNHNAME),IRESP)
 
 IF (IRESP/=0) THEN
   KRESP = IRESP
@@ -1443,7 +1454,7 @@ IF (STATUS /= NF90_NOERR) THEN
 #else
    STATUS = NF90_DEF_VAR(INCID, TZFIELD%CMNHNAME, NF90_FLOAT,  IVARID)
 #endif
-   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]')
+   IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_DEF_VAR',trim(TZFIELD%CMNHNAME))
    CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,GEXISTED)
 ELSE
    GEXISTED = .TRUE.
@@ -1452,7 +1463,7 @@ END IF
 
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, TPDATA%TIME)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP)
+IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'IO_WRITE_FIELD_NC4_T0','NF90_PUT_VAR',trim(TZFIELD%CMNHNAME),IRESP)
 #endif
 
 KRESP = IRESP
@@ -1672,31 +1683,33 @@ SUBROUTINE WRITE_HOR_COORD(TDIM,HLONGNAME,HSTDNAME,HAXIS,PSHIFT,KBOUNDLOW,KBOUND
 #else
       STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIM, IVARID)
 #endif
-      IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_DEF_VAR]')
+      IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_DEF_VAR',trim(YVARNAME))
     ELSE
-      CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_NC_COORDS_VAR',TRIM(YVARNAME)//' already defined')
+      CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_HOR_COORD',TRIM(YVARNAME)//' already defined')
     END IF
 
     ! Write metadata
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'long_name',HLONGNAME)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','long_name for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'standard_name',HSTDNAME)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','standard_name for '//trim(YVARNAME))
     IF (PRESENT(PCOORDS)) THEN
       STATUS = NF90_PUT_ATT(INCID, IVARID, 'units','m')
-      IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+      IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','units for '//trim(YVARNAME))
     END IF
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'axis',HAXIS)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','axis for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'c_grid_axis_shift',PSHIFT)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','c_grid_axis_shift for ' &
+                                                     //trim(YVARNAME))
     WRITE(YRANGE,'( I0,":",I0 )') 1+KBOUNDLOW,ISIZE-KBOUNDHIGH
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'c_grid_dynamic_range',TRIM(YRANGE))
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_ATT','c_grid_dynamic_range for ' &
+                                                     //trim(YVARNAME))
 
     ! Write the data
     STATUS = NF90_PUT_VAR(INCID, IVARID, ZTAB)
-    IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_HOR_COORD','NF90_PUT_VAR',trim(YVARNAME),IRESP)
   END IF
 
   IF (GALLOC) DEALLOCATE(ZTAB)
@@ -1777,55 +1790,60 @@ SUBROUTINE WRITE_VER_COORD(TDIM,HLONGNAME,HSTDNAME,HCOMPNAME,PSHIFT,KBOUNDLOW,KB
   IF (STATUS /= NF90_NOERR) THEN
     ! Define the coordinate variable
 #if (MNH_REAL == 8)
-      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIM, IVARID)
+    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIM, IVARID)
 #else
-      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIM, IVARID)
+    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIM, IVARID)
 #endif
-    IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_DEF_VAR]')
+    IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_DEF_VAR',trim(YVARNAME))
   ELSE
-    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_NC_COORDS_VAR',TRIM(YVARNAME)//' already defined')
+    CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_VER_COORD',TRIM(YVARNAME)//' already defined')
   END IF
 
   ! Write metadata
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'long_name',HLONGNAME)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','long_name for '//trim(YVARNAME))
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'standard_name',HSTDNAME)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','standard_name for '//trim(YVARNAME))
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'units','m')
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','units for '//trim(YVARNAME))
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'axis','Z')
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','axis for '//trim(YVARNAME))
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'positive','up')
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','positive for '//trim(YVARNAME))
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'c_grid_axis_shift',PSHIFT)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','c_grid_axis_shift for ' &
+                                                   //trim(YVARNAME))
   WRITE(YRANGE,'( I0,":",I0 )') 1+KBOUNDLOW,ISIZE-KBOUNDHIGH
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'c_grid_dynamic_range',TRIM(YRANGE))
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','c_grid_dynamic_range for ' &
+                                                   //trim(YVARNAME))
   !
   IF (GSLEVE) THEN
     !Remark: ZS, ZSMT and ZTOP in the formula are the same for mass point or flux point
     STATUS = NF90_PUT_ATT(INCID, IVARID,'formula_terms','s: '//TRIM(YVARNAME)//                   &
                                         ' height: ZTOP oro_ls: ZSMT oro: ZS len1: LEN1 len2: LEN2')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','formula_terms for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'formula_definition','z(n,k,j,i)=s(k)'//                                      &
                           '+ oro_ls(j,i)*sinh((height/len1)**1.35-(s(k)/len1)**1.35)/sinh((s(k)/len1)**1.35)'//        &
                           '+(oro(j,i)-oro_ls(j,i))*sinh((height/len2)**1.35-(s(k)/len2)**1.35)/sinh((s(k)/len2)**1.35)')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','formula_definition for ' &
+                                                     //trim(YVARNAME))
   ELSE
     !Remark: ZS and ZTOP in the formula are the same for mass point or flux point
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'formula_terms','s: '//TRIM(YVARNAME)//' height: ZTOP orog: ZS')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','formula_terms for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'formula_definition','z(n,k,j,i)=s(k)*(height-orog(j,i))/height+orog(j,i)')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','formula_definition for ' &
+                                                     //trim(YVARNAME))
   ENDIF
   !
   STATUS = NF90_PUT_ATT(INCID, IVARID, 'computed_standard_name',HCOMPNAME)
-  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_ATT','computed_standard_name for ' &
+                                                   //trim(YVARNAME))
 
   ! Write the data
   STATUS = NF90_PUT_VAR(INCID, IVARID, PCOORDS)
-  IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_VER_COORD','NF90_PUT_VAR',trim(YVARNAME))
 
 END SUBROUTINE WRITE_VER_COORD
 
@@ -1860,24 +1878,24 @@ SUBROUTINE WRITE_TIME_COORD(TDIM)
 #else
       STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIM, IVARID)
 #endif
-      IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_TIME_COORD[NF90_DEF_VAR]')
+      IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_DEF_VAR',trim(YVARNAME))
     ELSE
       CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_TIME_COORD',TRIM(YVARNAME)//' already defined')
     END IF
 
     ! Write metadata
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'long_name','time axis')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_ATT','long_name for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'standard_name','time')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_ATT','standard_name for '//trim(YVARNAME))
     WRITE(YUNITS,'( "seconds since ",I4.4,"-",I2.2,"-",I2.2," 00:00:00 +0:00" )') &
           TDTMOD%TDATE%YEAR,TDTMOD%TDATE%MONTH,TDTMOD%TDATE%DAY
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'units',YUNITS)
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_ATT','units for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID, 'axis','T')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_ATT','axis for '//trim(YVARNAME))
     STATUS = NF90_PUT_ATT(INCID, IVARID,'calendar','standard')
-    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_ATT]')
+    IF (STATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_ATT','calendar for '//trim(YVARNAME))
 
     ! Model beginning date (TDTMOD%TDATE) is used as the reference date
     ! Reference time is set to 0.
@@ -1887,7 +1905,7 @@ SUBROUTINE WRITE_TIME_COORD(TDIM)
     CALL DATETIME_DISTANCE(TZREF,TDTCUR,ZDELTATIME)
     ! Write the data
     STATUS = NF90_PUT_VAR(INCID, IVARID, ZDELTATIME)
-    IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    IF (status /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(status,'WRITE_TIME_COORD','NF90_PUT_VAR',trim(YVARNAME))
   END IF
 
 END SUBROUTINE WRITE_TIME_COORD
@@ -1907,21 +1925,21 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_HEADER_NC4','called for file '//TRIM(T
 !
 IF (TPFILE%LMASTER)  THEN
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.7 COMODO-1.4')
-  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
+  IF (ISTATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(istatus,'IO_FILE_WRITE_HEADER','NF90_PUT_ATT','Conventions')
 
 #if (MNH_REAL == 8)
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'MNH_REAL', '8')
 #else
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'MNH_REAL', '4')
 #endif
-  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
+  IF (ISTATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(istatus,'IO_FILE_WRITE_HEADER','NF90_PUT_ATT','MNH_REAL')
 
 #if (MNH_INT == 4)
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'MNH_INT', '4')
 #else
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'MNH_INT', '8')
 #endif
-  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
+  IF (ISTATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(istatus,'IO_FILE_WRITE_HEADER','NF90_PUT_ATT','MNH_INT')
 
 !title
 
@@ -1964,7 +1982,7 @@ IF (TPFILE%LMASTER)  THEN
   IF (ISTATUS == NF90_NOERR) THEN
     ALLOCATE(CHARACTER(LEN=ILEN_PREV) :: YHISTORY_PREV)
     ISTATUS = NF90_GET_ATT(TPFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY_PREV)
-    IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_APPEND_HISTORY_NC4[NF90_GET_ATT]')
+    IF (ISTATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(ISTATUS,'IO_APPEND_HISTORY_NC4','NF90_GET_ATT','history')
     YHISTORY_PREV = YHISTORY_PREV
   ELSE
     ILEN_PREV = 0
@@ -1990,7 +2008,7 @@ IF (TPFILE%LMASTER)  THEN
     YHISTORY = YHISTORY_NEW//NEW_LINE('A')//YHISTORY_PREV
   END IF
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY  )
-  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_APPEND_HISTORY_NC4[NF90_PUT_ATT]')
+  IF (ISTATUS /= NF90_NOERR) CALL IO_HANDLE_ERR_NC4(istatus,'IO_APPEND_HISTORY_NC4','NF90_PUT_ATT','history')
 END IF
 
 END SUBROUTINE IO_APPEND_HISTORY_NC4
-- 
GitLab