Skip to content
Snippets Groups Projects
Commit 99b67ca9 authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 06/12/2018: added history attribute to netCDF files

parent 3fbf9da6
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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)
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment