From de828acca67a8934290257d40afd37e7abeb3f36 Mon Sep 17 00:00:00 2001 From: mingchen-NOAA Date: Wed, 5 Mar 2025 08:35:06 -0500 Subject: [PATCH] Write log files to indicate output files have been fully written (#1378) --- model/src/w3iogomd.F90 | 18 +++++++++++++++--- model/src/w3iopomd.F90 | 35 ++++++++++++++++++++++++++++------- model/src/w3iorsmd.F90 | 4 ++-- model/src/w3nmlshelmd.F90 | 8 ++++---- model/src/ww3_shel.F90 | 2 +- 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/model/src/w3iogomd.F90 b/model/src/w3iogomd.F90 index 72412bbd3..cceafe4fa 100644 --- a/model/src/w3iogomd.F90 +++ b/model/src/w3iogomd.F90 @@ -2579,7 +2579,8 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & ! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE CHARACTER(LEN=256) :: FNMPRE_LOCAL - + ! + INTEGER :: NDSOGLOG !/ !/ ------------------------------------------------------------------- / !/ @@ -2630,8 +2631,8 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & ! IF (LEN_TRIM(FNMGRD) .EQ. 0) THEN FNMPRE_LOCAL = FNMPRE - ELSE - FNMPRE_LOCAL = FNMGRD + ELSE + FNMPRE_LOCAL = FNMGRD END IF IF ( IPASS.EQ.1 .AND. OFILES(1) .EQ. 0) THEN @@ -4066,6 +4067,17 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & CALL W3SETA ( IGRD, NDSE, NDST ) #endif ! + ! ADD INDICATOR LOG AFTER THE GRIDDED OUTPUT HAS BEEN FULLY WRITTEN + IF ( WRITE .AND. (OFILES(1).EQ.1) ) THEN + NDSOGLOG = NDSOG + OPEN (NDSOGLOG,FILE=FNMPRE_LOCAL(:J)//'log.'//TIMETAG//'.out_grd.'//FILEXT(:I)//'.txt', & + form ='FORMATTED',ERR=800,IOSTAT=IERR) + WRITE (NDSOGLOG,*) 'The '//TRIM(TIMETAG)//'.out_grd.'//TRIM(FILEXT(:I))// & + ' file has been successfully written!' + CALL FLUSH (NDSOGLOG) + CLOSE (NDSOGLOG) + ENDIF + RETURN ! ! Escape locations read errors diff --git a/model/src/w3iopomd.F90 b/model/src/w3iopomd.F90 index 277d8dbd9..0e1f3c39c 100644 --- a/model/src/w3iopomd.F90 +++ b/model/src/w3iopomd.F90 @@ -1592,7 +1592,7 @@ END SUBROUTINE W3IOPON_READ !> !> @author Edward Hartnett @date 1-Nov-2023 !> - SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr) + SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr, NDSOP, fname, path) USE NETCDF USE W3GDATMD, ONLY: NTH, NK, NSPEC USE W3WDATMD, ONLY: TIME @@ -1612,6 +1612,11 @@ SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr) integer, intent(in) :: timestep_only ! 1 if only timestep should be written. character(*), intent(in) :: filename integer, intent(inout) :: ncerr + ! + INTEGER, INTENT(IN), OPTIONAL :: NDSOP + CHARACTER(LEN=124), INTENT(IN), OPTIONAL :: fname + CHARACTER(LEN=256), INTENT(IN), OPTIONAL :: path + ! integer :: ndim, nvar, fmt, itime, fh integer :: d_nopts, d_nspec, d_vsize, d_namelen, d_grdidlen, d_time integer :: v_idtst, v_vertst, v_nk, v_nth, v_ptloc, v_ptnme, v_time, v_ww3time @@ -1627,6 +1632,10 @@ SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr) integer :: curdate(8), refdate(8),ierr double precision :: outjulday + + ! INDICATOR LOG + INTEGER :: NDSOPLOG + !If first pass, or if you are writting a file for every time-step: IF ( IPASS.EQ.1 .OR. timestep_only.EQ.1 ) THEN ! Create the netCDF file. @@ -1887,6 +1896,17 @@ SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr) ncerr = nf90_close(fh) if (nf90_err(ncerr) .ne. 0) return + ! WRITE INDICATOR LOG AT THE END OF NETCDF OUTPUT + ! RE-USE NDSOP FOR NDSOPLOG + IF (timestep_only .EQ. 1) THEN + NDSOPLOG = NDSOP + OPEN(NDSOPLOG,FILE=path(:LEN_TRIM(path))//'log.'//TRIM(fname)//'.txt', & + form ='FORMATTED') + WRITE (NDSOPLOG,*) 'The '//TRIM(fname)//' file has been successfully written!' + CALL FLUSH (NDSOPLOG) + CLOSE (NDSOPLOG) + ENDIF + END SUBROUTINE W3IOPON_WRITE !> Read or write the netCDF point output file, @@ -1934,12 +1954,12 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD) CHARACTER(LEN=15) :: TIMETAG INTEGER :: IGRD - character(len = 124) :: filename + character(len = 256) :: filename integer :: ncerr ! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE CHARACTER(LEN=256) :: FNMPRE_LOCAL - + CHARACTER(LEN=124) :: FNAME #ifdef W3_S CALL STRACE (IENT, 'W3IOPON') #endif @@ -1970,8 +1990,8 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD) ! Determine filename. IF (LEN_TRIM(FNMPNT) .EQ. 0) THEN FNMPRE_LOCAL = FNMPRE - ELSE - FNMPRE_LOCAL = FNMPNT + ELSE + FNMPRE_LOCAL = FNMPNT END IF ! @@ -1979,6 +1999,7 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD) ! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2) filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc' + FNAME = TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT)) ELSE filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc' END IF @@ -1987,7 +2008,7 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD) IF (INXOUT .EQ. 'READ') THEN CALL W3IOPON_READ(IOTST, IMOD, filename, ncerr) ELSE - CALL W3IOPON_WRITE(OFILES(2), filename, ncerr) + CALL W3IOPON_WRITE(OFILES(2), filename, ncerr, NDSOP=NDSOP, fname=FNAME, path=FNMPRE_LOCAL) ENDIF if (nf90_err(ncerr) .ne. 0) then WRITE(NDSE,*) ' *** WAVEWATCH III ERROR IN W3IOPO :' @@ -2214,7 +2235,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD & ! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE CHARACTER(LEN=256) :: FNMPRE_LOCAL - + !/ !/ ------------------------------------------------------------------- / !/ diff --git a/model/src/w3iorsmd.F90 b/model/src/w3iorsmd.F90 index 11d49a2c1..b04e28534 100644 --- a/model/src/w3iorsmd.F90 +++ b/model/src/w3iorsmd.F90 @@ -463,8 +463,8 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT ) ! IF (LEN_TRIM(FNMRST) .EQ. 0) THEN FNMPRE_LOCAL = FNMPRE - ELSE - FNMPRE_LOCAL = FNMRST + ELSE + FNMPRE_LOCAL = FNMRST END IF ! diff --git a/model/src/w3nmlshelmd.F90 b/model/src/w3nmlshelmd.F90 index 26cefe134..7715a2bd2 100644 --- a/model/src/w3nmlshelmd.F90 +++ b/model/src/w3nmlshelmd.F90 @@ -326,10 +326,10 @@ SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, & CALL READ_OUTPUT_DATE_NML (NDSI, NML_OUTPUT_DATE) IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_OUTPUT_DATE_NML (NML_OUTPUT_DATE) - ! READ OUTPUT USER DEFINED PATH NAMELIST + ! READ OUTPUT USER DEFINED PATH NAMELIST CALL READ_OUTPUT_PATH_NML (NDSI, NML_OUTPUT_PATH) IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_OUTPUT_PATH_NML (NML_OUTPUT_PATH) - + ! read homogeneous namelist CALL READ_HOMOGENEOUS_NML (NDSI, NML_HOMOG_COUNT, NML_HOMOG_INPUT) IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_HOMOGENEOUS_NML (NML_HOMOG_COUNT, NML_HOMOG_INPUT) @@ -946,7 +946,7 @@ SUBROUTINE READ_OUTPUT_PATH_NML (NDSI, NML_OUTPUT_PATH) 'ERROR: READ_OUTPUT_PATH_NML: namelist read error', & 'ERROR: '//TRIM(MSG) CALL EXTCDE (8) - END IF + END IF ! SAVE NAMELIST NML_OUTPUT_PATH = PATH @@ -1632,7 +1632,7 @@ SUBROUTINE REPORT_OUTPUT_PATH_NML (NML_OUTPUT_PATH) 10 FORMAT (A,2X,A,A) - END SUBROUTINE REPORT_OUTPUT_PATH_NML + END SUBROUTINE REPORT_OUTPUT_PATH_NML !/ ------------------------------------------------------------------- / diff --git a/model/src/ww3_shel.F90 b/model/src/ww3_shel.F90 index fcba340ab..298863fc7 100644 --- a/model/src/ww3_shel.F90 +++ b/model/src/ww3_shel.F90 @@ -401,7 +401,7 @@ PROGRAM W3SHEL integer :: memunit LOGICAL :: DIR_EXISTS - INTEGER :: DIR_STATUS + INTEGER :: DIR_STATUS ! !/ !/ ------------------------------------------------------------------- /