From 55a83cfda44532895b7f7d763d8285cb68a4d2ea Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 20 Mar 2018 10:35:52 +0100
Subject: [PATCH] Philippe 20/03/2018: lfi2cdf: guess dimids in parse_infile
 instead of fill_ncdf

---
 LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90   |   6 +-
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 160 ++++++++---------------
 2 files changed, 54 insertions(+), 112 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 2589cf546..e00577fb0 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -109,21 +109,21 @@ program LFI2CDF
 
   IF (runmode == MODELFI2CDF) THEN
      ! Conversion LFI -> NetCDF
-     CALL parse_infiles(infiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
+     CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar,tzreclist,options)
      CALL def_ncdf(outfiles,tzreclist,nbvar,options)
      CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,ibuflen,options)
 
   ELSE IF (runmode == MODECDF2CDF) THEN
      ! Conversion netCDF -> netCDF
-     CALL parse_infiles(infiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
+     CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar,tzreclist,options)
      CALL def_ncdf(outfiles,tzreclist,nbvar,options)
      CALL fill_ncdf(infiles,outfiles,tzreclist,nbvar,ibuflen,options)
 
   ELSE
      ! Conversion NetCDF -> LFI
-     CALL parse_infiles(infiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
+     CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
      CALL build_lfi(infiles,outfiles,tzreclist,nbvar_infile,ibuflen)
   END IF
   
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 962ff3d88..3668a97b4 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -1,6 +1,7 @@
 MODULE mode_util
   USE MODD_IO_ll,  ONLY: TFILE_ELT
   USE MODD_NETCDF, ONLY: DIMCDF, IDCDF_KIND
+  USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
 
   USE MODE_FIELD
   USE MODE_FIELDTYPE
@@ -16,7 +17,6 @@ MODULE mode_util
   INTEGER,PARAMETER :: MAXRAW=10
   INTEGER,PARAMETER :: MAXLEN=512
   INTEGER,PARAMETER :: MAXFILES=100
-  INTEGER,PARAMETER :: MAXLFICOMMENTLENGTH=100
 
   INTEGER,PARAMETER :: FM_FIELD_SIZE = 32
 
@@ -47,6 +47,7 @@ MODULE mode_util
      LOGICAL                               :: tbw    ! to be written or not
      LOGICAL                               :: tbr    ! to be read or not
      LOGICAL                               :: LSPLIT = .FALSE. ! TRUE if variable is split by vertical level
+     INTEGER                               :: NSIZE = 0 ! Size of the variable (in number of elements)
      INTEGER                               :: NSRC = 0 ! Number of variables used to compute the variable (needed only if calc=.true.)
      INTEGER,DIMENSION(MAXRAW)             :: src    ! List of variables used to compute the variable (needed only if calc=.true.)
      INTEGER                               :: tgt    ! Target: id of the variable that use it (calc variable)
@@ -79,18 +80,21 @@ CONTAINS
 
   END FUNCTION str_replace
 
-  SUBROUTINE parse_infiles(infiles, nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw, tpreclist, kbuflen, options)
+  SUBROUTINE parse_infiles(infiles, outfiles, nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw, tpreclist, kbuflen, options)
     USE MODD_DIM_n,      ONLY: NIMAX_ll, NJMAX_ll, NKMAX
     USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT
 
+    USE MODE_NETCDF, ONLY: IO_GUESS_DIMIDS_NC4
+
     TYPE(filelist_struct),      INTENT(IN) :: infiles
+    TYPE(filelist_struct),      INTENT(IN) :: outfiles
     INTEGER,                    INTENT(IN) :: nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw
     TYPE(workfield), DIMENSION(:), POINTER :: tpreclist
     INTEGER,                   INTENT(OUT) :: kbuflen
     TYPE(option),DIMENSION(:), INTENT(IN)  :: options
 
     INTEGER                                  :: ji,jj, kcdf_id, kcdf_id2, itype
-    INTEGER                                  :: ndb, nde, ndey, idx, idx_var, maxvar
+    INTEGER                                  :: ndb, nde, ndey, idx, idx_out, idx_var, maxvar
     INTEGER                                  :: idims, idimtmp, jdim, status, var_id
     LOGICAL                                  :: ladvan
     INTEGER                                  :: ich, leng
@@ -106,6 +110,8 @@ CONTAINS
     LOGICAL                                  :: GISDATE, GISTIME
     LOGICAL                                  :: GOK
 
+    idx_out = 1
+
     IF (infiles%files(1)%format == LFI_FORMAT) THEN
       ilu = infiles%files(1)%lun_id
     ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
@@ -264,7 +270,7 @@ CONTAINS
               END IF
             END IF
             !Add maximum comment size (necessary when writing LFI files because the comment is stored with the field)
-            leng = leng + MAXLFICOMMENTLENGTH
+            leng = leng + NLFIMAXCOMMENTLENGTH
           END IF
 
           IF (.NOT.tpreclist(ji)%found) THEN
@@ -302,8 +308,9 @@ END DO
          DO ji=1,nbvar_infile
            CALL LFICAS(iresp2,ilu,yrecfm,ileng,ipos,ladvan)
            ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
-           tpreclist(ji)%name = trim(yrecfm)
+           tpreclist(ji)%name   = trim(yrecfm)
            tpreclist(ji)%found  = .TRUE.
+           tpreclist(ji)%NSIZE  = ileng - 2 - NLFIMAXCOMMENTLENGTH
            IF (ileng > sizemax) sizemax = ileng
 
            !Detect if date variable
@@ -383,10 +390,11 @@ END DO
                leng = leng*idimtmp
              END DO
            END IF
+           tpreclist(ji)%NSIZE  = leng
            IF (leng > sizemax) sizemax = leng
          END DO
          !Add maximum comment size (necessary when writing LFI files because the comment is stored with the field)
-         sizemax = sizemax + MAXLFICOMMENTLENGTH
+         sizemax = sizemax + NLFIMAXCOMMENTLENGTH
        END IF
 
        maxvar = nbvar_infile
@@ -421,6 +429,17 @@ END DO
         IF (IRESP==0) THEN
           tpreclist(ji)%TFIELD = TFIELDLIST(IID)
           ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS))
+          ! Determine TDIMS
+          CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx_out)%TFILE,tpreclist(ji)%TFIELD,tpreclist(ji)%NSIZE, &
+                                   tpreclist(ji)%TDIMS,IRESP)
+          IF (IRESP/=0) THEN
+            CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
+                                         ' => ignored')
+            tpreclist(ji)%tbw   = .FALSE.
+            tpreclist(ji)%tbr   = .FALSE.
+            tpreclist(ji)%found = .FALSE.
+            CYCLE
+          END IF
         ELSE !Field not found in list
           CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','variable '//TRIM(tpreclist(ji)%name)//' is not known => ignored')
           tpreclist(ji)%tbw   = .FALSE.
@@ -581,8 +600,6 @@ END DO
   SUBROUTINE fill_ncdf(infiles,outfiles,tpreclist,knaf,kbuflen,options)
     USE MODD_TYPE_DATE
 
-    USE MODE_NETCDF, ONLY: IO_GUESS_DIMIDS_NC4
-
     TYPE(filelist_struct),        INTENT(IN)    :: infiles, outfiles
     TYPE(workfield), DIMENSION(:),INTENT(INOUT) :: tpreclist
     INTEGER,                      INTENT(IN)    :: knaf
@@ -592,19 +609,16 @@ END DO
     INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork
     INTEGER                                  :: idx, ji,jj
     INTEGER                                  :: kcdf_id
-!     INTEGER                                  :: status
-    INTEGER                                  :: extent, ndims
+    INTEGER                                  :: ndims
     INTEGER                                  :: ich
     INTEGER                                  :: IID, IRESP2
     INTEGER                                  :: src
     INTEGER                                  :: level
     INTEGER(KIND=LFI_INT)                    :: iresp,ilu,ileng,ipos
-!     INTEGER,DIMENSION(3)                     :: idims, start
     INTEGER,DIMENSION(3)                     :: start
     INTEGER,DIMENSION(:),ALLOCATABLE         :: itab
     LOGICAL,DIMENSION(:),ALLOCATABLE         :: gtab
     REAL,DIMENSION(:),ALLOCATABLE    :: xtab
-!     CHARACTER, DIMENSION(:), ALLOCATABLE     :: ytab
     CHARACTER(LEN=:), ALLOCATABLE               :: ytab
     REAL, DIMENSION(:,:), ALLOCATABLE :: xtab2d
     REAL, DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2
@@ -640,38 +654,19 @@ INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN
          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)
-           extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-           ! Determine TDIMS
-           CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,extent,tpreclist(ji)%TDIMS,IRESP2)
-           IF (IRESP2/=0) THEN
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CYCLE
-           END IF
-           itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1)
+           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)
-           extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-           itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1)
-           ! Determine TDIMS
-           CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2)
-           IF (IRESP2/=0) THEN
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CYCLE
-           ELSE
-             tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
-           END IF
+           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:extent) = itab(1:extent) + iwork(3+iwork(2):3+iwork(2)+extent-1)
+             itab(1:tpreclist(ji)%NSIZE) = itab(1:tpreclist(ji)%NSIZE) + iwork(3+iwork(2):3+iwork(2)+tpreclist(ji)%NSIZE-1)
            END DO
          ENDIF
 
@@ -680,7 +675,7 @@ INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN
          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:extent))
+           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/)), &
@@ -760,43 +755,29 @@ print *,'PW:TODO'
          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)
-           extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-           ! Determine TDIMS
-           CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,extent,tpreclist(ji)%TDIMS,IRESP2)
-           IF (IRESP2/=0) THEN
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
+           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:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1)
+           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)
-           extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-           ! Determine TDIMS
-           CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2)
-           IF (IRESP2/=0) THEN
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                            ' => ignored')
-             CYCLE
-           ELSE
-             tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
-           END IF
-           itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1)
+           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:extent) = itab(1:extent) + iwork(3+iwork(2):3+iwork(2)+extent-1)
+             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,EXTENT
+         DO JJ=1,tpreclist(ji)%NSIZE
            IF (ITAB(JJ)==0) THEN
              GTAB(JJ) = .FALSE.
            ELSE
@@ -808,7 +789,7 @@ print *,'PW:TODO'
          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:extent),count=(/extent/))
+           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
@@ -877,28 +858,12 @@ print *,'PW:TODO'
            IF (.NOT.tpreclist(ji)%LSPLIT) THEN
              CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name),ileng,ipos)
              CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name),iwork,ileng)
-             extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-             ! Determine TDIMS
-             CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,extent,tpreclist(ji)%TDIMS,IRESP2)
-             IF (IRESP2/=0) THEN
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CYCLE
-             END IF
-             xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
+             xtab(1:tpreclist(ji)%NSIZE) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
            ELSE
              !We assume that split variables are always of size(IDIMX,IDMIY,IDIMZ)
              ALLOCATE(xtab3d(IDIMX,IDIMY,IDIMZ))
              CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ji)%TFIELD,XTAB3D)
-             extent = IDIMX*IDIMY*IDIMZ
-             ! Determine TDIMS
-             CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,extent,tpreclist(ji)%TDIMS,IRESP2)
-             IF (IRESP2/=0) THEN
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CYCLE
-             END IF
-             xtab(1:extent) = RESHAPE( xtab3d, (/extent/) )
+             xtab(1:tpreclist(ji)%NSIZE) = RESHAPE( xtab3d, (/tpreclist(ji)%NSIZE/) )
              DEALLOCATE(xtab3d)
            END IF
          ELSE
@@ -906,25 +871,14 @@ print *,'PW:TODO'
            IF (.NOT.tpreclist(ji)%LSPLIT) THEN
              CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name),ileng,ipos)
              CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name),iwork,ileng)
-             extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-             ! Determine TDIMS
-             CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2)
-             IF (IRESP2/=0) THEN
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CYCLE
-             ELSE
-               tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
-             END IF
-             xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
+             tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
+             xtab(1:tpreclist(ji)%NSIZE) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
              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
-               xtab(1:extent) = xtab(1:extent) + TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
+               xtab(1:tpreclist(ji)%NSIZE) = xtab(1:tpreclist(ji)%NSIZE) + TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
                jj=jj+1
              END DO
            ELSE !Split variable
@@ -932,25 +886,14 @@ print *,'PW:TODO'
              ALLOCATE(xtab3d(IDIMX,IDIMY,IDIMZ))
              ALLOCATE(xtab3d2(IDIMX,IDIMY,IDIMZ))
              CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(tpreclist(ji)%src(1))%TFIELD,XTAB3D)
-             extent = IDIMX*IDIMY*IDIMZ
-             ! Determine TDIMS
-             CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2)
-             IF (IRESP2/=0) THEN
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// &
-                              ' => ignored')
-               CYCLE
-             ELSE
                tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS
-             END IF
              jj = 2
              DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW)
                CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(tpreclist(ji)%src(jj))%TFIELD,XTAB3D2)
                XTAB3D(:,:,:) = XTAB3D(:,:,:) + XTAB3D2(:,:,:)
                jj=jj+1
              END DO
-             xtab(1:extent) = RESHAPE( xtab3d, (/extent/) )
+             xtab(1:tpreclist(ji)%NSIZE) = RESHAPE( xtab3d, (/tpreclist(ji)%NSIZE/) )
              DEALLOCATE(xtab3d,xtab3d2)
            END IF
          ENDIF
@@ -959,7 +902,7 @@ print *,'PW:TODO'
          CASE (0)
            CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1))
          CASE (1)
-           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:extent))
+           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:tpreclist(ji)%NSIZE))
          CASE (2)
            CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,tpreclist(ji)%TDIMS(1:2)%LEN))
          CASE (3)
@@ -1056,10 +999,9 @@ END IF
         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)
-         extent = ileng - 2 - iwork(2) !iwork(2) = comment length
-!          ALLOCATE(ytab(extent))
-         allocate(character(len=extent)::ytab)
-         DO jj=1,extent
+!          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)
@@ -1140,8 +1082,8 @@ END DO
        IF (.NOT.tpreclist(ivar)%tbw) CYCLE
 
        icomlen = LEN(tpreclist(ivar)%TFIELD%CCOMMENT)
-       IF (icomlen > MAXLFICOMMENTLENGTH) THEN
-         PRINT *,'ERROR: comment length is too big. Please increase MAXLFICOMMENTLENGTH'
+       IF (icomlen > NLFIMAXCOMMENTLENGTH) THEN
+         PRINT *,'ERROR: comment length is too big. Please increase NLFIMAXCOMMENTLENGTH'
          STOP
        END IF
 
-- 
GitLab