From 4c13cd773ca1bf609ab736e3703a1800950ca8b2 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 5 Dec 2018 16:06:30 +0100
Subject: [PATCH] Philippe 05/12/2018: cdf2cdf: better support for older files
 (<5.4.0) and special treatment for EMIS

---
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 31 ++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 7c43d3df6..01d871f75 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -375,6 +375,9 @@ END DO
             CALL IO_GUESS_DIMIDS_NC4(outfiles(idx_out)%TFILE,tpreclist(ji)%TFIELD,&
                                      tpreclist(ji)%NSIZE,tpreclist(ji)%TDIMS,IRESP)
           ELSE !If we read netCDF4, we already have all necessary data
+            !Special case for EMIS (only the first band is read/written) -> NDIMS reduced to 2
+            if(tpreclist(ji)%TFIELD%CMNHNAME=="EMIS") tpreclist(ji)%TFIELD%NDIMS = 2
+
             CALL IO_FILL_DIMS_NC4(outfiles(idx_out)%TFILE,tpreclist(ji),IRESP)
           ENDIF
           IF (IRESP/=0) THEN
@@ -657,6 +660,7 @@ END DO
     INTEGER                                  :: INSRC
     INTEGER                                  :: ISRC
     INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN
+    logical,dimension(knaf)                  :: gtimedep_in, gtimedep_out
 
     CHARACTER(LEN=:),       ALLOCATABLE :: YTAB0D
     INTEGER,DIMENSION(:),   ALLOCATABLE :: ITAB1D, ITAB1D2
@@ -671,6 +675,16 @@ END DO
 
     CALL PRINT_MSG(NVERB_DEBUG,'IO','fill_files','called')
 
+    ! For versions of MesoNH <5.4.0, fields were not stored with a time dimension
+    ! ->necessary to remove it when reading and to restore to the correct one when writing
+    if( infiles(1)%TFILE%NMNHVERSION(1)<5 .OR. &
+       (infiles(1)%TFILE%NMNHVERSION(1)==5 .AND. infiles(1)%TFILE%NMNHVERSION(2)<4) ) then
+      gtimedep_in(:)  = .false.
+    else
+      gtimedep_in(:)  = tpreclist(:)%TFIELD%LTIMEDEP
+    end if
+    gtimedep_out(:)   = tpreclist(:)%TFIELD%LTIMEDEP
+
     idx = 1
     DO ji=1,knaf
       IF (.NOT.tpreclist(ji)%tbw) CYCLE
@@ -689,6 +703,7 @@ END DO
           ISRC  = tpreclist(ji)%src(1)
         END IF
 
+        tpreclist(ISRC)%TFIELD%LTIMEDEP = gtimedep_in(ISRC)
         SELECT CASE(IDIMS)
         CASE (0)
           ALLOCATE(ITAB1D(1))
@@ -710,6 +725,7 @@ END DO
 
         DO JJ=2,INSRC
           ISRC = tpreclist(ji)%src(jj)
+          tpreclist(ISRC)%TFIELD%LTIMEDEP = gtimedep_in(ISRC)
 
           SELECT CASE(IDIMS)
           CASE (0)
@@ -724,6 +740,7 @@ END DO
           END SELECT
         END DO
 
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
         SELECT CASE(IDIMS)
         CASE (0)
           CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D(1))
@@ -740,23 +757,26 @@ END DO
         END SELECT
 
 
-        CASE (TYPELOG)
+      CASE (TYPELOG)
         IDIMLEN(1:IDIMS) = tpreclist(ji)%TDIMS(1:IDIMS)%LEN
 
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_in(ji)
         SELECT CASE(IDIMS)
         CASE (0)
           ALLOCATE(GTAB1D(1))
           CALL IO_READ_FIELD (INFILES(1)%TFILE,   tpreclist(ji)%TFIELD,GTAB1D(1))
+          tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
           CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D(1))
           DEALLOCATE(GTAB1D)
         CASE (1)
           ALLOCATE(GTAB1D(IDIMLEN(1)))
           CALL IO_READ_FIELD (INFILES(1)%TFILE,   tpreclist(ji)%TFIELD,GTAB1D)
+          tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
           CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D)
           DEALLOCATE(GTAB1D)
         CASE DEFAULT
           CALL PRINT_MSG(NVERB_WARNING,'IO','fill_files','too many dimensions for ' &
-                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+                         //TRIM(tpreclist(ji)%name)//' => ignored')
           CYCLE
         END SELECT
 
@@ -772,6 +792,7 @@ END DO
           ISRC  = tpreclist(ji)%src(1)
         END IF
 
+        tpreclist(ISRC)%TFIELD%LTIMEDEP = gtimedep_in(ISRC)
         SELECT CASE(IDIMS)
         CASE (0)
           ALLOCATE(XTAB1D(1))
@@ -801,6 +822,7 @@ END DO
 
         DO JJ=2,INSRC
           ISRC = tpreclist(ji)%src(jj)
+          tpreclist(ISRC)%TFIELD%LTIMEDEP = gtimedep_in(ISRC)
 
           SELECT CASE(IDIMS)
           CASE (0)
@@ -821,6 +843,7 @@ END DO
           END SELECT
         END DO
 
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
         SELECT CASE(IDIMS)
         CASE (0)
           CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D(1))
@@ -855,7 +878,9 @@ END DO
         END IF
 
         ALLOCATE(CHARACTER(LEN=tpreclist(ji)%NSIZE)::YTAB0D)
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_in(ji)
         CALL IO_READ_FIELD (INFILES(1)%TFILE,   tpreclist(ji)%TFIELD,YTAB0D)
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
         CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,YTAB0D)
         DEALLOCATE(YTAB0D)
 
@@ -868,7 +893,9 @@ END DO
                          //TRIM(tpreclist(ISRC)%name)//' => ignored')
           CYCLE
         END IF
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_in(ji)
         CALL IO_READ_FIELD (INFILES(1)%TFILE,   tpreclist(ji)%TFIELD%CMNHNAME,TZDATE)
+        tpreclist(ji)%TFIELD%LTIMEDEP = gtimedep_out(ji)
         CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE)
 
 
-- 
GitLab