Skip to content

Commit

Permalink
Merge pull request #37 from edwardhartnett/ejh_0413
Browse files Browse the repository at this point in the history
Ejh 0413
  • Loading branch information
edwardhartnett authored Apr 16, 2024
2 parents 9b414f9 + 99f9e85 commit 1a1f16b
Show file tree
Hide file tree
Showing 4 changed files with 278 additions and 115 deletions.
276 changes: 164 additions & 112 deletions model/src/w3iopomd.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1145,13 +1145,13 @@ end function nf90_err
!>
!> @author Edward Hartnett @date 1-Nov-2023
!>
SUBROUTINE W3IOPON_READ(IOTST, IMOD, filename, ncerr)
SUBROUTINE W3IOPON_READ(IOTST, IMOD_IN, filename, ncerr)
USE NetCDF
USE W3GDATMD, ONLY: NTH, NK, NSPEC, FILEXT
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
IL, IW, II, PTLOC, PTIFAC, DPO, WAO, WDO, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
GRDID, ICEO, ICEHO, ICEFO
GRDID, ICEO, ICEHO, ICEFO, W3DMO2
USE W3SERVMD, ONLY: EXTCDE
#ifdef W3_FLX5
USE W3ODATMD, ONLY: TAUAO, TAUDO, DAIRO
Expand All @@ -1162,7 +1162,7 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD, filename, ncerr)
IMPLICIT NONE

INTEGER, INTENT(OUT) :: IOTST
INTEGER, INTENT(IN), OPTIONAL :: IMOD
INTEGER, INTENT(IN), OPTIONAL :: IMOD_IN
character(*), intent(in) :: filename
integer, intent(inout) :: ncerr
INTEGER :: MK,MTH
Expand All @@ -1173,167 +1173,215 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD, filename, ncerr)
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
integer :: v_iceho, v_icefo, v_grdid, v_spco
integer :: imod

if (present(IMOD_IN)) then
imod = imod_in
else
imod = 1
endif

IOTST = 0
IF ( IPASS.EQ.1 ) THEN
! Open the netCDF file.
ncerr = nf90_open(filename, NF90_NOWRITE, fh)
if (nf90_err(ncerr) .ne. 0) return

! Read and check the version:
! TO DO add reading of IDTST and VERTST and make checks:
! IF ( IDTST .NE. IDSTR ) THEN
! WRITE (NDSE,902) IDTST, IDSTR
! CALL EXTCDE ( 10 )
! END IF
! IF ( VERTST .NE. VEROPT ) THEN
! WRITE (NDSE,903) VERTST, VEROPT
! CALL EXTCDE ( 11 )
! END IF
print *, 'w3iopon_read'

! Open the netCDF file.
ncerr = nf90_open(filename, NF90_NOWRITE, fh)
if (nf90_err(ncerr) .ne. 0) return

! Read the dimension information for NOPTS.
ncerr = nf90_inq_dimid(fh, DNAME_NOPTS, d_nopts)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_nopts, len = d_nopts_len)
if (nf90_err(ncerr) .ne. 0) return
! Read and check the version:
! TO DO add reading of IDTST and VERTST and make checks:
! IF ( IDTST .NE. IDSTR ) THEN
! WRITE (NDSE,902) IDTST, IDSTR
! CALL EXTCDE ( 10 )
! END IF
! IF ( VERTST .NE. VEROPT ) THEN
! WRITE (NDSE,903) VERTST, VEROPT
! CALL EXTCDE ( 11 )
! END IF

! Read the dimension information for NSPEC.
ncerr = nf90_inq_dimid(fh, DNAME_NSPEC, d_nspec)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_nspec, len = d_nspec_len)
if (nf90_err(ncerr) .ne. 0) return

! Read the dimension information for VSIZE.
ncerr = nf90_inq_dimid(fh, DNAME_VSIZE, d_vsize)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_vsize, len = d_vsize_len)
if (nf90_err(ncerr) .ne. 0) return
! Read the dimension information for NOPTS.
ncerr = nf90_inq_dimid(fh, DNAME_NOPTS, d_nopts)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_nopts, len = d_nopts_len)
if (nf90_err(ncerr) .ne. 0) return
nopts = d_nopts_len

! Read the dimension information for NAMELEN.
ncerr = nf90_inq_dimid(fh, DNAME_NAMELEN, d_namelen)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_namelen, len = d_namelen_len)
if (nf90_err(ncerr) .ne. 0) return
! Read the dimension information for NSPEC.
ncerr = nf90_inq_dimid(fh, DNAME_NSPEC, d_nspec)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_nspec, len = d_nspec_len)
if (nf90_err(ncerr) .ne. 0) return

! Read the dimension information for GRDIDLEN.
ncerr = nf90_inq_dimid(fh, DNAME_GRDIDLEN, d_grdidlen)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_grdidlen, len = d_grdidlen_len)
if (nf90_err(ncerr) .ne. 0) return
! Read the dimension information for VSIZE.
ncerr = nf90_inq_dimid(fh, DNAME_VSIZE, d_vsize)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_vsize, len = d_vsize_len)
if (nf90_err(ncerr) .ne. 0) return

! Read scalar variables.
ncerr = nf90_inq_varid(fh, VNAME_NK, v_nk)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_nk, MK)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inq_varid(fh, VNAME_NTH, v_nth)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_nth, MTH)
if (nf90_err(ncerr) .ne. 0) return
! Read the dimension information for NAMELEN.
ncerr = nf90_inq_dimid(fh, DNAME_NAMELEN, d_namelen)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_namelen, len = d_namelen_len)
if (nf90_err(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
! Read the dimension information for GRDIDLEN.
ncerr = nf90_inq_dimid(fh, DNAME_GRDIDLEN, d_grdidlen)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inquire_dimension(fh, d_grdidlen, len = d_grdidlen_len)
if (nf90_err(ncerr) .ne. 0) return

! Read vars with nopts as a dimension.
ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc)
if (nf90_err(ncerr) .ne. 0) return
if (associated(PTLOC)) then
ncerr = nf90_get_var(fh, v_ptloc, PTLOC)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme)
if (nf90_err(ncerr) .ne. 0) return
if (associated(PTNME)) then
ncerr = nf90_get_var(fh, v_ptnme, PTNME)
if (nf90_err(ncerr) .ne. 0) return
endif
! Read scalar variables.
ncerr = nf90_inq_varid(fh, VNAME_NK, v_nk)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_nk, MK)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_inq_varid(fh, VNAME_NTH, v_nth)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_nth, MTH)
if (nf90_err(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

! Initialize an individual data storage for point output.
if (.not. o2init) call w3dmo2(imod, ndse, ndst, nopts)

! Read vars with nopts as a dimension.
ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc)
if (nf90_err(ncerr) .ne. 0) return
if (associated(PTLOC)) then
ncerr = nf90_get_var(fh, v_ptloc, PTLOC)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme)
if (nf90_err(ncerr) .ne. 0) return
if (associated(PTNME)) then
ncerr = nf90_get_var(fh, v_ptnme, PTNME)
if (nf90_err(ncerr) .ne. 0) return
endif

!missing variable TIME???

! 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 (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_iw, IW)
if (nf90_err(ncerr) .ne. 0) return
if (associated(IW)) then
ncerr = nf90_get_var(fh, v_iw, IW)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_II, v_ii)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_ii, II)
if (nf90_err(ncerr) .ne. 0) return
if (associated(II)) then
ncerr = nf90_get_var(fh, v_ii, II)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_IL, v_il)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_il, IL)
if (nf90_err(ncerr) .ne. 0) return
if (associated(IL)) then
ncerr = nf90_get_var(fh, v_il, IL)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_DPO, v_dpo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_dpo, DPO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(DPO)) then
ncerr = nf90_get_var(fh, v_dpo, DPO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_WAO, v_wao)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_wao, WAO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(WAO)) then
ncerr = nf90_get_var(fh, v_wao, WAO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_WDO, v_wdo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_wdo, WDO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(WDO)) then
ncerr = nf90_get_var(fh, v_wdo, WDO)
if (nf90_err(ncerr) .ne. 0) return
endif
#ifdef W3_FLX5
ncerr = nf90_inq_varid(fh, VNAME_TAUAO, v_tauao)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_tauao, TAUAO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(TAUAO)) then
ncerr = nf90_get_var(fh, v_tauao, TAUAO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_TAIDO, v_taido)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_taido, TAIDO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(TAIDO)) then
ncerr = nf90_get_var(fh, v_taido, TAIDO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_DAIRO, v_dairo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_dairo, DAIRO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(DAIRO)) then
ncerr = nf90_get_var(fh, v_dairo, DAIRO)
if (nf90_err(ncerr) .ne. 0) return
endif
#endif
#ifdef W3_SETUP
ncerr = nf90_inq_varid(fh, ZET_SETO, v_zet_seto)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_zet_seto, ZET_SETO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(ZET_SETO)) then
ncerr = nf90_get_var(fh, v_zet_seto, ZET_SETO)
if (nf90_err(ncerr) .ne. 0) return
endif
#endif
ncerr = nf90_inq_varid(fh, VNAME_ASO, v_aso)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_aso, ASO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(ASO)) then
ncerr = nf90_get_var(fh, v_aso, ASO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_CAO, v_cao)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_cao, CAO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(CAO)) then
ncerr = nf90_get_var(fh, v_cao, CAO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_CDO, v_cdo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_cdo, CDO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(CDO)) then
ncerr = nf90_get_var(fh, v_cdo, CDO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_ICEO, v_iceo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_iceo, ICEO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(ICEO)) then
ncerr = nf90_get_var(fh, v_iceo, ICEO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_ICEHO, v_iceho)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_iceho, ICEHO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(ICEHO)) then
ncerr = nf90_get_var(fh, v_iceho, ICEHO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_ICEFO, v_icefo)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_icefo, ICEFO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(ICEFO)) then
ncerr = nf90_get_var(fh, v_icefo, ICEFO)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_GRDID, v_grdid)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_grdid, GRDID)
if (nf90_err(ncerr) .ne. 0) return
if (associated(GRDID)) then
ncerr = nf90_get_var(fh, v_grdid, GRDID)
if (nf90_err(ncerr) .ne. 0) return
endif
ncerr = nf90_inq_varid(fh, VNAME_SPCO, v_spco)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_get_var(fh, v_spco, SPCO)
if (nf90_err(ncerr) .ne. 0) return
if (associated(SPCO)) then
ncerr = nf90_get_var(fh, v_spco, SPCO)
if (nf90_err(ncerr) .ne. 0) return
endif

! Close the file.
ncerr = nf90_close(fh)
Expand Down Expand Up @@ -1491,10 +1539,14 @@ SUBROUTINE W3IOPON_WRITE(timestep_only, IMOD, filename, ncerr)

write(*,*) 'JDM e'
! Write the data with NOPTS as a dimension.
ncerr = nf90_put_var(fh, v_ptloc, PTLOC)
if (nf90_err(ncerr) .ne. 0) return
ncerr = nf90_put_var(fh, v_ptnme, PTNME)
if (nf90_err(ncerr) .ne. 0) return
if (associated(PTLOC)) then
ncerr = nf90_put_var(fh, v_ptloc, PTLOC)
if (nf90_err(ncerr) .ne. 0) return
endif
if (associated(PTNME)) then
ncerr = nf90_put_var(fh, v_ptnme, PTNME)
if (nf90_err(ncerr) .ne. 0) return
endif

ELSE
write(*,*) 'JDM else'
Expand Down Expand Up @@ -1825,8 +1877,8 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD &

900 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPO :'/ &
' ILEGAL INXOUT VALUE: ',A/)
901 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPO :'/ &
' MIXED READ/WRITE, LAST REQUEST: ',A/)
! 901 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPO :'/ &
! ' MIXED READ/WRITE, LAST REQUEST: ',A/)
END SUBROUTINE W3IOPON

!/ ------------------------------------------------------------------- /
Expand Down
1 change: 1 addition & 0 deletions regtests/unittests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ copy_test_data_2(ww3_grid.inp ww3_grid.inp)
unit_test(test_io_points_bin)
unit_test(test_io)
unit_test(test_io2)
unit_test(test_io3)
unit_test(test_io_restart_bin)


Loading

0 comments on commit 1a1f16b

Please sign in to comment.