Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ejh 0413 #37

Merged
merged 9 commits into from
Apr 16, 2024
Merged
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
Loading