From 8fdf76f5f9950b9ec9881e702b9e98c8714deb5c Mon Sep 17 00:00:00 2001 From: JessicaMeixner-NOAA Date: Tue, 16 Apr 2024 07:53:38 -0500 Subject: [PATCH] add a flag to stop at end of file for netcdf point read --- model/src/w3iopomd.F90 | 285 +++++++++++++++++++++-------------------- 1 file changed, 148 insertions(+), 137 deletions(-) diff --git a/model/src/w3iopomd.F90 b/model/src/w3iopomd.F90 index 7c7300bf7..2c873baa9 100644 --- a/model/src/w3iopomd.F90 +++ b/model/src/w3iopomd.F90 @@ -1151,8 +1151,8 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD, filename, ncerr) integer, intent(inout) :: ncerr INTEGER :: IGRD,MK,MTH integer :: fh - integer :: d_nopts, d_nspec, d_vsize, d_namelen, d_grdidlen - integer :: d_nopts_len, d_nspec_len, d_vsize_len, d_namelen_len, d_grdidlen_len + integer :: d_nopts, d_nspec, d_vsize, d_namelen, d_grdidlen, d_time + integer :: d_nopts_len, d_nspec_len, d_vsize_len, d_namelen_len, d_grdidlen_len, d_time_len integer :: v_idtst, v_vertst, v_nk, v_nth, v_ptloc, v_ptnme, v_time integer :: v_iw, v_ii, v_il, v_dpo, v_wao, v_wdo, v_tauao integer :: v_taido, v_dairo, v_zet_seto, v_aso, v_cao, v_cdo, v_iceo @@ -1216,155 +1216,166 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD, filename, ncerr) ncerr = nf90_inquire_dimension(fh, d_grdidlen, len = d_grdidlen_len) if (ncerr .ne. 0) return - IF ( IPASS.EQ.1 ) THEN + ! Read the dimention information from time - ! Read scalar variables. - ncerr = nf90_inq_varid(fh, VNAME_NK, v_nk) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_nk, MK) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_NTH, v_nth) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_nth, MTH) - if (ncerr .ne. 0) return - !read in written variables NK, NTH as MK and MTH - !and ensure they match - IF (NK.NE.MK .OR. NTH.NE.MTH) THEN - WRITE (NDSE,904) MK, MTH, NK, NTH - CALL EXTCDE ( 12 ) - END IF + ncerr = nf90_inq_dimid(fh, DNAME_TIME, d_time) + if (ncerr .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_time, len = d_time_len) + if (ncerr .ne. 0) return - !JDM TO DO: Missing check and reading of IDSTR, VEROPT + write(*,*) 'd_time_len', d_time_len - !check reading: - write(*,*) 'MK,MTH', MK, MTH - write(*,*) 'dimensions:', d_nopts_len,d_grdidlen_len, d_namelen_len,d_vsize_len,d_nspec_len + IF ( IPASS < d_time_len ) THEN - ! Allocate variables: - IF ( .NOT. O2INIT ) & - CALL W3DMO2 ( IGRD, NDSE, NDST, NOPTS ) + IF ( IPASS.EQ.1 ) THEN - ! Read vars with nopts as a dimension. - ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_ptloc, PTLOC, start = (/ 1, 1/), & - count = (/ d_vsize_len, d_nopts_len /)) - if (ncerr .ne. 0) return - write(*,*) 'PTLOC', PTLOC - ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme) + ! Read scalar variables. + ncerr = nf90_inq_varid(fh, VNAME_NK, v_nk) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_nk, MK) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_NTH, v_nth) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_nth, MTH) + if (ncerr .ne. 0) return + + !read in written variables NK, NTH as MK and MTH + !and ensure they match + IF (NK.NE.MK .OR. NTH.NE.MTH) THEN + WRITE (NDSE,904) MK, MTH, NK, NTH + CALL EXTCDE ( 12 ) + END IF + + !JDM TO DO: Missing check and reading of IDSTR, VEROPT + + + ! Allocate variables: + IF ( .NOT. O2INIT ) & + CALL W3DMO2 ( IGRD, NDSE, NDST, NOPTS ) + + ! Read vars with nopts as a dimension. + ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_ptloc, PTLOC, start = (/ 1, 1/), & + count = (/ d_vsize_len, d_nopts_len /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_ptnme, PTNME) + if (ncerr .ne. 0) return + END IF + write(*,*) 'IPASS=', IPASS + !JDM TO DO missing variable TIME??? + ncerr = nf90_inq_varid(fh, VNAME_TIME, v_time) if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_ptnme, PTNME) + ncerr = nf90_get_var(fh, v_time, TIME, start = (/ 1, IPASS/), & + count = (/ d_vsize_len, 1 /)) if (ncerr .ne. 0) return - END IF - write(*,*) 'IPASS=', IPASS - !JDM TO DO missing variable TIME??? - ncerr = nf90_inq_varid(fh, VNAME_TIME, v_time) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_time, TIME, start = (/ 1, IPASS/), & - count = (/ d_vsize_len, 1 /)) - if (ncerr .ne. 0) return - write(*,*) 'TIME', TIME - !JDM TO DO!! need to find out if IPASS is a valid time value, if not set flag to -1 - !and exit - ! All of the below variables are missing the "time" dimension... - ! the time dimension being read should be for "IPASS" - ncerr = nf90_inq_varid(fh, VNAME_IW, v_iw) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_iw, IW, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_II, v_ii) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_ii, II, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_IL, v_il) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_il, IL, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_DPO, v_dpo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_dpo, DPO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_WAO, v_wao) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_wao, WAO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_WDO, v_wdo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_wdo, WDO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return + ! All of the below variables are missing the "time" dimension... + ! the time dimension being read should be for "IPASS" + ncerr = nf90_inq_varid(fh, VNAME_IW, v_iw) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_iw, IW, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_II, v_ii) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_ii, II, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_IL, v_il) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_il, IL, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_DPO, v_dpo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_dpo, DPO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WAO, v_wao) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_wao, WAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WDO, v_wdo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_wdo, WDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return #ifdef W3_FLX5 - ncerr = nf90_inq_varid(fh, VNAME_TAUAO, v_tauao) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_tauao, TAUAO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_TAIDO, v_taido) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_taido, TAIDO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_DAIRO, v_dairo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_dairo, DAIRO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_TAUAO, v_tauao) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_tauao, TAUAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_TAIDO, v_taido) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_taido, TAIDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_DAIRO, v_dairo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_dairo, DAIRO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return #endif #ifdef W3_SETUP - ncerr = nf90_inq_varid(fh, ZET_SETO, v_zet_seto) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_zet_seto, ZET_SETO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, ZET_SETO, v_zet_seto) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_zet_seto, ZET_SETO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return #endif - ncerr = nf90_inq_varid(fh, VNAME_ASO, v_aso) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_aso, ASO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_CAO, v_cao) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_cao, CAO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_CDO, v_cdo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_cdo, CDO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_ICEO, v_iceo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_iceo, ICEO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_ICEHO, v_iceho) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_iceho, ICEHO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_ICEFO, v_icefo) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_icefo, ICEFO, start = (/ 1, IPASS/), & - count = (/ NOPTS, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_GRDID, v_grdid) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_grdid, GRDID, start = (/ 1, 1, IPASS/), & - count = (/ 13, nopts, 1 /)) - if (ncerr .ne. 0) return - ncerr = nf90_inq_varid(fh, VNAME_SPCO, v_spco) - if (ncerr .ne. 0) return - ncerr = nf90_get_var(fh, v_spco, SPCO, start = (/ 1, 1, IPASS/), & - count = (/nspec, nopts, 1 /)) - if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ASO, v_aso) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_aso, ASO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CAO, v_cao) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_cao, CAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CDO, v_cdo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_cdo, CDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEO, v_iceo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_iceo, ICEO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEHO, v_iceho) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_iceho, ICEHO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEFO, v_icefo) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_icefo, ICEFO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_GRDID, v_grdid) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_grdid, GRDID, start = (/ 1, 1, IPASS/), & + count = (/ 13, nopts, 1 /)) + if (ncerr .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_SPCO, v_spco) + if (ncerr .ne. 0) return + ncerr = nf90_get_var(fh, v_spco, SPCO, start = (/ 1, 1, IPASS/), & + count = (/nspec, nopts, 1 /)) + if (ncerr .ne. 0) return + + ELSE + ! Set flag to indicate IPASS > d_time_len + ! and are at the end of the + IOTST = -1 + END IF ! Close the file. ncerr = nf90_close(fh)