From d19e24d13993a8452fc2f9e973f663cf373c7fc2 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 21 Mar 2018 14:40:47 +0100
Subject: [PATCH] Philippe 21/03/2018: lfi2cdf: improvements + simplification +
 cleaning in fill_ncdf

---
 LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90   |   4 +-
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 383 +++++++++--------------
 2 files changed, 143 insertions(+), 244 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 8495845bb..21c5f7c38 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -112,14 +112,14 @@ program LFI2CDF
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar_tbw,tzreclist,options)
      CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
      CALL def_ncdf(outfiles,tzreclist,nbvar,options)
-     CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,ibuflen,options)
+     CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,options)
 
   ELSE IF (runmode == MODECDF2CDF) THEN
      ! Conversion netCDF -> netCDF
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar_tbw,tzreclist,options)
      CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
      CALL def_ncdf(outfiles,tzreclist,nbvar,options)
-     CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,ibuflen,options)
+     CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,options)
 
   ELSE
      ! Conversion NetCDF -> LFI
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 181fdbc4c..6f1b0b9bf 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -609,263 +609,182 @@ END DO
     
   END SUBROUTINE def_ncdf
 
-  SUBROUTINE fill_ncdf(infiles,outfiles,tpreclist,knaf,kbuflen,options)
+  SUBROUTINE fill_ncdf(infiles,outfiles,tpreclist,knaf,options)
     USE MODD_TYPE_DATE
 
     TYPE(filelist_struct),        INTENT(IN)    :: infiles, outfiles
     TYPE(workfield), DIMENSION(:),INTENT(INOUT) :: tpreclist
     INTEGER,                      INTENT(IN)    :: knaf
-    INTEGER,                      INTENT(IN)    :: kbuflen
     TYPE(option),DIMENSION(:),    INTENT(IN)    :: options
 
-    INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork
-    INTEGER                                  :: idx, ji,jj
-    INTEGER                                  :: kcdf_id
-    INTEGER                                  :: ndims
-    INTEGER                                  :: ich
-    INTEGER                                  :: IID, IRESP2
+    INTEGER                                  :: idx, ji, jj
+    INTEGER                                  :: IDIMS
+    INTEGER                                  :: INSRC
     INTEGER                                  :: ISRC
-    INTEGER                                  :: src
-    INTEGER                                  :: level
-    INTEGER(KIND=LFI_INT)                    :: iresp,ilu,ileng,ipos
-    INTEGER,DIMENSION(3)                     :: start
-    INTEGER,DIMENSION(:),ALLOCATABLE         :: itab
-    LOGICAL,DIMENSION(:),ALLOCATABLE         :: gtab
-    REAL,DIMENSION(:),ALLOCATABLE    :: xtab
+    INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN
+
+    CHARACTER(LEN=:),       ALLOCATABLE :: YTAB0D
+    INTEGER,DIMENSION(:),   ALLOCATABLE :: ITAB1D, ITAB1D2
+    INTEGER,DIMENSION(:,:), ALLOCATABLE :: ITAB2D, ITAB2D2
+    LOGICAL,DIMENSION(:),   ALLOCATABLE :: GTAB1D
     REAL,DIMENSION(:),      ALLOCATABLE :: XTAB1D, XTAB1D2
     REAL,DIMENSION(:,:),    ALLOCATABLE :: XTAB2D, XTAB2D2
     REAL,DIMENSION(:,:,:),  ALLOCATABLE :: XTAB3D, XTAB3D2
     REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: XTAB4D, XTAB4D2
+    TYPE(DATE_TIME)                     :: TZDATE
 
-    CHARACTER(LEN=:), ALLOCATABLE               :: ytab
-    INTEGER,      DIMENSION(:,:,:), ALLOCATABLE :: itab3d, itab3d2
-    TYPE(DATE_TIME)                          :: TZDATE
-
-INTEGER(KIND=IDCDF_KIND) :: STATUS
-INTEGER(KIND=IDCDF_KIND) :: INCID
-INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND) :: IDIMS   ! number of dimensions
-INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IVDIMS
-INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN
-    !
-    IF (infiles%files(1)%format == LFI_FORMAT) ilu = infiles%files(1)%lun_id
-    !
-    ALLOCATE(iwork(kbuflen))
-    ALLOCATE(itab(kbuflen))
-    ALLOCATE(gtab(kbuflen))
-    ALLOCATE(xtab(kbuflen))
 
     idx = 1
     DO ji=1,knaf
        IF (.NOT.tpreclist(ji)%tbw) CYCLE
 
-       kcdf_id = outfiles%files(idx)%lun_id
-
-       ndims = tpreclist(ji)%TFIELD%NDIMS
-
-       SELECT CASE(tpreclist(ji)%TFIELD%NTYPE)
-       CASE (TYPEINT)
-        IF (infiles%files(1)%format == LFI_FORMAT) THEN
-         IF (.NOT.tpreclist(ji)%calc) THEN
-           CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name),iwork,ileng)
-           itab(1:tpreclist(ji)%NSIZE) = iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-         ELSE
-           src=tpreclist(ji)%src(1)
-           CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name),iwork,ileng)
-           itab(1:tpreclist(ji)%NSIZE) = iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-           tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS !Dimensions of calculated variable are the same as its sources
-           jj = 2
-           DO jj=2,tpreclist(ji)%NSRC
-             src=tpreclist(ji)%src(jj)
-             CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name),iwork,ileng)
-!PW: TODO: check same dimensions
-             itab(1:tpreclist(ji)%NSIZE) = itab(1:tpreclist(ji)%NSIZE) + iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-           END DO
-         ENDIF
-
-!TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
-         SELECT CASE(ndims)
-         CASE (0)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1))
-         CASE (1)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:tpreclist(ji)%NSIZE))
-         CASE (2)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(itab,tpreclist(ji)%TDIMS(1:2)%LEN))
-!            status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(itab,(/ptdimx%len,ptdimy%len/)), &
-!                                  start = (/1,1,level/) )
-         CASE (3)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(itab,tpreclist(ji)%TDIMS(1:3)%LEN))
-         CASE DEFAULT
-           print *,'Error: arrays with ',ndims,' dimensions are not supported'
-         END SELECT
-
-        ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
-INCID = infiles%TFILES(1)%TFILE%NNCID
-STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-if (ndims/=idims) then
-print *,'aieeeeeee'
-stop
-end if
-DO JJ=1,IDIMS
-  STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ))
-  IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-END DO
-         SELECT CASE(ndims)
-         CASE (0)
-           CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,itab(1))
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1))
-         CASE (1)
-           CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,itab(1:IDIMLEN(1)))
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:IDIMLEN(1)))
-         CASE (2)
-print *,'PW:TODO'
-         CASE (3)
-print *,'PW:TODO'
-         CASE DEFAULT
-           print *,'Error: arrays with ',ndims,' dimensions are not supported'
-         END SELECT
-        END IF
+       IDIMS = tpreclist(ji)%TFIELD%NDIMS
 
-         
-       CASE (TYPELOG)
-        IF (infiles%files(1)%format == LFI_FORMAT) THEN
-         IF (.NOT.tpreclist(ji)%calc) THEN
-           CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name),iwork,ileng)
-           IF (iwork(2) /= NLFIMAXCOMMENTLENGTH) THEN
-             CALL PRINT_MSG(NVERB_ERROR,'IO','fill_ncdf','unexpected comment size for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CYCLE
-           END IF
-           itab(1:tpreclist(ji)%NSIZE) = iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-         ELSE
-           src=tpreclist(ji)%src(1)
-           CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name),iwork,ileng)
-           tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
-           itab(1:tpreclist(ji)%NSIZE) = iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-           jj = 2
-           DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW)
-             src=tpreclist(ji)%src(jj)
-             CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name),iwork,ileng)
-!PW: TODO: check same dimensions
-             itab(1:tpreclist(ji)%NSIZE) = itab(1:tpreclist(ji)%NSIZE) + iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
-             jj=jj+1
-           END DO
-         ENDIF
-
-         DO JJ=1,tpreclist(ji)%NSIZE
-           IF (ITAB(JJ)==0) THEN
-             GTAB(JJ) = .FALSE.
-           ELSE
-             GTAB(JJ) = .TRUE.
-           END IF
-         END DO
+      SELECT CASE(tpreclist(ji)%TFIELD%NTYPE)
+      CASE (TYPEINT)
+        IDIMLEN(1:IDIMS) = tpreclist(ji)%TDIMS(1:IDIMS)%LEN
 
-         SELECT CASE(ndims)
-         CASE (0)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1))
-         CASE (1)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:tpreclist(ji)%NSIZE),count=(/tpreclist(ji)%NSIZE/))
-         CASE DEFAULT
-           print *,'Error: arrays with ',ndims,' dimensions are not supported'
-         END SELECT
-
-        ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
-INCID = infiles%TFILES(1)%TFILE%NNCID
-STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-if (ndims/=idims) then
-print *,'aieeeeeee'
-stop
-end if
-DO JJ=1,IDIMS
-  STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ))
-  IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-END DO
-         SELECT CASE(ndims)
-         CASE (0)
-           CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,gtab(1))
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1))
-         CASE (1)
-           CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,gtab(1:IDIMLEN(1)))
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1:IDIMLEN(1)))
-         CASE (2)
-print *,'PW:TODO'
-         CASE (3)
-print *,'PW:TODO'
-         CASE DEFAULT
-           print *,'Error: arrays with ',ndims,' dimensions are not supported'
-         END SELECT
+        IF (.NOT.tpreclist(ji)%calc) THEN
+          INSRC = 1
+          ISRC = ji
+        ELSE
+          INSRC = tpreclist(ji)%NSRC
+          ISRC  = tpreclist(ji)%src(1)
         END IF
 
+        SELECT CASE(IDIMS)
+        CASE (0)
+          ALLOCATE(ITAB1D(1))
+          IF (tpreclist(ji)%calc) ALLOCATE(ITAB1D2(1))
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D(1))
+        CASE (1)
+          ALLOCATE(ITAB1D(IDIMLEN(1)))
+          IF (tpreclist(ji)%calc) ALLOCATE(ITAB1D2(IDIMLEN(1)))
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D)
+        CASE (2)
+          ALLOCATE(ITAB2D(IDIMLEN(1),IDIMLEN(2)))
+          IF (tpreclist(ji)%calc) ALLOCATE(ITAB2D2(IDIMLEN(1),IDIMLEN(2)))
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D)
+        CASE DEFAULT
+          CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','too many dimensions for ' &
+                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+          CYCLE
+        END SELECT
+
+        DO JJ=2,INSRC
+          ISRC = tpreclist(ji)%src(jj)
+
+          SELECT CASE(IDIMS)
+          CASE (0)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2(1))
+            ITAB1D(1) = ITAB1D(1) + ITAB1D2(1)
+          CASE (1)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2)
+            ITAB1D(:) = ITAB1D(:) + ITAB1D2(:)
+          CASE (2)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D2)
+            ITAB2D(:,:) = ITAB2D(:,:) + ITAB2D2(:,:)
+          END SELECT
+        END DO
+
+        SELECT CASE(IDIMS)
+        CASE (0)
+          CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D(1))
+          DEALLOCATE(ITAB1D)
+          IF (tpreclist(ji)%calc) DEALLOCATE(ITAB1D2)
+        CASE (1)
+          CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D)
+          DEALLOCATE(ITAB1D)
+          IF (tpreclist(ji)%calc) DEALLOCATE(ITAB1D2)
+        CASE (2)
+          CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB2D)
+          DEALLOCATE(ITAB2D)
+          IF (tpreclist(ji)%calc) DEALLOCATE(ITAB2D2)
+        END SELECT
+
+
+        CASE (TYPELOG)
+        IDIMLEN(1:IDIMS) = tpreclist(ji)%TDIMS(1:IDIMS)%LEN
+
+        SELECT CASE(IDIMS)
+        CASE (0)
+          ALLOCATE(GTAB1D(1))
+          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,GTAB1D(1))
+          CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D(1))
+          DEALLOCATE(GTAB1D)
+        CASE (1)
+          ALLOCATE(GTAB1D(IDIMLEN(1)))
+          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,GTAB1D)
+          CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D)
+          DEALLOCATE(GTAB1D)
+        CASE DEFAULT
+          CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','too many dimensions for ' &
+                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+          CYCLE
+        END SELECT
+
 
       CASE (TYPEREAL)
-        IDIMLEN(1:ndims) = tpreclist(ji)%TDIMS(1:ndims)%LEN
+        IDIMLEN(1:IDIMS) = tpreclist(ji)%TDIMS(1:IDIMS)%LEN
 
         IF (.NOT.tpreclist(ji)%calc) THEN
-          ISRC = 1
-          src = ji
+          INSRC = 1
+          ISRC = ji
         ELSE
-          ISRC = tpreclist(ji)%NSRC
-          src = tpreclist(ji)%src(1)
+          INSRC = tpreclist(ji)%NSRC
+          ISRC  = tpreclist(ji)%src(1)
         END IF
 
-        SELECT CASE(ndims)
+        SELECT CASE(IDIMS)
         CASE (0)
-         ALLOCATE(XTAB1D(1))
-         IF (tpreclist(ji)%calc) ALLOCATE(XTAB1D2(1))
-         CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB1D(1))
+          ALLOCATE(XTAB1D(1))
+          IF (tpreclist(ji)%calc) ALLOCATE(XTAB1D2(1))
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D(1))
         CASE (1)
           ALLOCATE(XTAB1D(IDIMLEN(1)))
           IF (tpreclist(ji)%calc) ALLOCATE(XTAB1D2(IDIMLEN(1)))
-          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB1D)
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D)
         CASE (2)
           ALLOCATE(XTAB2D(IDIMLEN(1),IDIMLEN(2)))
           IF (tpreclist(ji)%calc) ALLOCATE(XTAB2D2(IDIMLEN(1),IDIMLEN(2)))
-          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB2D)
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D)
         CASE (3)
           ALLOCATE(XTAB3D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3)))
           IF (tpreclist(ji)%calc) ALLOCATE(XTAB3D2(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3)))
-          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB3D)
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D)
         CASE (4)
           ALLOCATE(XTAB4D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3),IDIMLEN(4)))
           IF (tpreclist(ji)%calc) ALLOCATE(XTAB4D2(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3),IDIMLEN(4)))
-          CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB4D)
+          CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D)
         CASE DEFAULT
-          CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','number of dimensions not supported for '//TRIM(tpreclist(src)%name))
+          CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','too many dimensions for ' &
+                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+          CYCLE
         END SELECT
 
-        DO JJ=2,ISRC
-          src = tpreclist(ji)%src(jj)
+        DO JJ=2,INSRC
+          ISRC = tpreclist(ji)%src(jj)
 
-          SELECT CASE(ndims)
+          SELECT CASE(IDIMS)
           CASE (0)
-            CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB1D2(1))
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2(1))
             XTAB1D(1) = XTAB1D(1) + XTAB1D2(1)
           CASE (1)
-            CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB1D2)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2)
             XTAB1D(:) = XTAB1D(:) + XTAB1D2(:)
           CASE (2)
-            CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB2D2)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D2)
             XTAB2D(:,:) = XTAB2D(:,:) + XTAB2D2(:,:)
           CASE (3)
-            CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB3D2)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D2)
             XTAB3D(:,:,:) = XTAB3D(:,:,:) + XTAB3D2(:,:,:)
           CASE (4)
-            CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,tpreclist(src)%TFIELD,XTAB4D2)
+            CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D2)
             XTAB4D(:,:,:,:) = XTAB4D(:,:,:,:) + XTAB4D2(:,:,:,:)
           END SELECT
         END DO
 
-        SELECT CASE(ndims)
+        SELECT CASE(IDIMS)
         CASE (0)
           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D(1))
           DEALLOCATE(XTAB1D)
@@ -889,56 +808,36 @@ print *,'PW:TODO'
         END SELECT
 
 
-       CASE (TYPECHAR)
-         IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPECHAR')
-        IF (infiles%files(1)%format == LFI_FORMAT) THEN
-         CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name),ileng,ipos)
-         CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name),iwork,ileng)
-!          ALLOCATE(ytab(tpreclist(ji)%NSIZE))
-         allocate(character(len=tpreclist(ji)%NSIZE)::ytab)
-         DO jj=1,tpreclist(ji)%NSIZE
-           ich = iwork(2+iwork(2)+jj)
-!            ytab(jj) = CHAR(ich)
-           ytab(jj:jj) = CHAR(ich)
-         END DO
-         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,trim(ytab))
-         DEALLOCATE(ytab)
-        ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
-INCID = infiles%TFILES(1)%TFILE%NNCID
-STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS)
-IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-! if (ndims/=idims) then
-if (idims/=1) then
-print *,'aieeeeeee'
-stop
-end if
-DO JJ=1,IDIMS
-  STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ))
-  IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-END DO
-         allocate(character(len=IDIMLEN(1))::ytab)
-         CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,ytab)
-         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ytab)
-         DEALLOCATE(ytab)
+      CASE (TYPECHAR)
+        IF (IDIMS/=0) THEN
+          CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','too many dimensions for ' &
+                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+          CYCLE
         END IF
 
-       CASE (TYPEDATE)
-         IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPEDATE')
-!PW: TODO: tpreclist(ji)%TFIELD%CMNHNAME => tpreclist(ji)%TFIELD
-         CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD%CMNHNAME,TZDATE)
-         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE)
+        ALLOCATE(CHARACTER(LEN=tpreclist(ji)%NSIZE)::YTAB0D)
+        CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD,YTAB0D)
+        CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,YTAB0D)
+        DEALLOCATE(YTAB0D)
+
 
-       CASE default
-         CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','invalid datatype')
+      CASE (TYPEDATE)
+        IF (IDIMS/=0) THEN
+          CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','too many dimensions for ' &
+                         //TRIM(tpreclist(ISRC)%name)//' => ignored')
+          CYCLE
+        END IF
+        CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD%CMNHNAME,TZDATE)
+        CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE)
+
+      CASE default
+        CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','invalid datatype for ' &
+                       //TRIM(tpreclist(ISRC)%name)//' => ignored')
 
-       END SELECT
+      END SELECT
 
-       if (options(OPTSPLIT)%set) idx = idx + 1
+      if (options(OPTSPLIT)%set) idx = idx + 1
     END DO
-    DEALLOCATE(itab,gtab,xtab)
-    DEALLOCATE(iwork)
   END SUBROUTINE fill_ncdf
 
   SUBROUTINE build_lfi(infiles,outfiles,tpreclist,knaf,kbuflen)
-- 
GitLab