diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index cf047fba4d9a0542d1af9c6eb744bde637a1616c..3e0a8b2d75ab14e94b8bb20b0cddcc38ea04fff9 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 @@ -134,14 +134,14 @@ program LFI2CDF ! Conversion LFI -> NetCDF IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options) CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode) - CALL def_ncdf(outfiles,nfiles_out) + CALL def_ncdf(infiles,outfiles,nfiles_out) CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) ELSE IF (runmode == MODECDF2CDF) THEN ! Conversion netCDF -> netCDF IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options) CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode) - CALL def_ncdf(outfiles,nfiles_out) + CALL def_ncdf(infiles,outfiles,nfiles_out) CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) ELSE diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 01d871f75510d95cb732139cb95a241e91edd56a..e30ba71e190ecf85378485046e8146d96addfae6 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -618,21 +618,47 @@ END DO END IF END SUBROUTINE HANDLE_ERR - SUBROUTINE def_ncdf(outfiles,KNFILES_OUT) + SUBROUTINE def_ncdf(infiles,outfiles,KNFILES_OUT) USE MODD_CONF, ONLY: NMNHVERSION USE MODE_NETCDF, ONLY: IO_WRITE_HEADER_NC4 + TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: infiles TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: outfiles INTEGER, INTENT(IN) :: KNFILES_OUT + CHARACTER(LEN=*),PARAMETER :: YUNKNOWNHIST = 'Previous history is unknown' + CHARACTER(LEN=16) :: YMNHVERSION - INTEGER :: ji + CHARACTER(LEN=:),ALLOCATABLE :: YHISTORY + INTEGER :: ilen, ji INTEGER(KIND=IDCDF_KIND) :: status INTEGER(KIND=IDCDF_KIND) :: kcdf_id CALL PRINT_MSG(NVERB_DEBUG,'IO','def_ncdf','called') + !Copy history attribute for netCDF files + IF( outfiles(1)%TFILE%CFORMAT=='NETCDF4' ) THEN + IF( infiles(1)%TFILE%CFORMAT=='NETCDF4' ) THEN + status = NF90_INQUIRE_ATTRIBUTE(infiles(1)%TFILE%NNCID, NF90_GLOBAL, 'history', LEN=ilen) + IF (status == NF90_NOERR) THEN + ALLOCATE(CHARACTER(LEN=ilen) :: YHISTORY) + status = NF90_GET_ATT(infiles(1)%TFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY) + ELSE + YHISTORY = YUNKNOWNHIST + END IF + ELSE + YHISTORY = YUNKNOWNHIST + END IF + + DO ji = 1,KNFILES_OUT + kcdf_id = outfiles(ji)%TFILE%NNCID + status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'history',YHISTORY) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) + END DO + END IF + + !Write header for netCDF files DO ji = 1,KNFILES_OUT kcdf_id = outfiles(ji)%TFILE%NNCID @@ -643,7 +669,7 @@ END DO status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'lfi2cdf_version',TRIM(YMNHVERSION)) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) END DO - + END SUBROUTINE def_ncdf SUBROUTINE fill_files(infiles,outfiles,tpreclist,knaf,options) diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 5449f9d3e6d06cc49b19d0c8c70a4b0ca77bec02..9f5aa1ba51bc758c3308d71c65e44235f81cd93a 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -697,7 +697,7 @@ USE MODD_IO_ll, ONLY: TFILEDATA ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File structure ! -INTEGER(KIND=IDCDF_KIND) :: ISTATUS +INTEGER(KIND=IDCDF_KIND) :: ISTATUS ! IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETURN ! @@ -723,7 +723,8 @@ IF (TPFILE%LMASTER) THEN !title -!history + !history + CALL IO_APPEND_HISTORY_NC4(TPFILE) !institution @@ -737,6 +738,62 @@ END IF END SUBROUTINE IO_WRITE_HEADER_NC4 +SUBROUTINE IO_APPEND_HISTORY_NC4(TPFILE) +! +USE MODD_IO_ll, ONLY: TFILEDATA +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File structure +! +INTEGER,PARAMETER :: YEAR=1, MONTH=2, DAY=3, HH=5, MM=6, SS=7 +! +CHARACTER(len=5) :: YZONE +CHARACTER(LEN=:),ALLOCATABLE :: YCMD, YHISTORY, YHISTORY_NEW, YHISTORY_PREV +INTEGER :: ILEN_CMD, ILEN_PREV +INTEGER(KIND=IDCDF_KIND) :: ISTATUS +INTEGER,DIMENSION(8) :: IDATETIME +! +IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETURN +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_APPEND_HISTORY_NC4','called for file '//TRIM(TPFILE%CNAME)) +! +IF (TPFILE%LMASTER) THEN + !Check if history attribute already exists in file and read it + ISTATUS = NF90_INQUIRE_ATTRIBUTE(TPFILE%NNCID, NF90_GLOBAL, 'history', LEN=ILEN_PREV) + 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]') + YHISTORY_PREV = YHISTORY_PREV + ELSE + ILEN_PREV = 0 + END IF + + !Get date and time + call DATE_AND_TIME( VALUES=IDATETIME, ZONE=YZONE ) + call GET_COMMAND(lENGTH=ILEN_CMD) + IF (ILEN_CMD>0) THEN + ALLOCATE(CHARACTER(ILEN_CMD) :: YCMD) + CALL GET_COMMAND(COMMAND=YCMD) + END IF + + !Prepare new history entry + ALLOCATE(CHARACTER(26+ILEN_CMD) :: YHISTORY_NEW) + WRITE(YHISTORY_NEW, '( I4.4,"-",I2.2,"-",I2.2,"T",I2.2,":",I2.2,":",I2.2,A5,": ", A )') & + IDATETIME(YEAR),IDATETIME(MONTH),IDATETIME(DAY),IDATETIME(HH),IDATETIME(MM),IDATETIME(SS),YZONE, YCMD + + !Write full history + IF (ILEN_PREV == 0) THEN + YHISTORY = YHISTORY_NEW + ELSE + 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]') +END IF + +END SUBROUTINE IO_APPEND_HISTORY_NC4 + + SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,KVARID,OEXISTED,KSHAPE,HCALENDAR,OISCOORD) ! USE MODD_CONF, ONLY: CPROGRAM, LCARTESIAN