Skip to content

Commit

Permalink
Merge branch 'NOAA-EMC:develop' into failed_nearest_point_fix
Browse files Browse the repository at this point in the history
  • Loading branch information
thesser1 authored Feb 24, 2025
2 parents 11e178a + aaff457 commit b7eb7b3
Show file tree
Hide file tree
Showing 11 changed files with 435 additions and 145 deletions.
21 changes: 21 additions & 0 deletions model/nml/ww3_shel.nml
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,27 @@



! -------------------------------------------------------------------- !
! Define user-defined output paths via OUTPUT_PATH_NML namelist
!
! * user-defined paths include: raw output out_grd, out_pnt, and restart
! * default path for these are set as './'
! * NOTE: using user-defined path may cause post-processing fail
! user-defined directroy must exist before execution
!
! * namelist must be terminated with /
! * definitions & defaults:
! PATH%GRD_OUT = './'
! PATH%PNT_OUT = './'
! PATH%RST_OUT = './'
! -------------------------------------------------------------------- !
&OUTPUT_PATH_NML
PATH%GRD_OUT = './'
/




! -------------------------------------------------------------------- !
! Define homogeneous input via HOMOG_COUNT_NML and HOMOG_INPUT_NML namelist
!
Expand Down
2 changes: 1 addition & 1 deletion model/src/w3gdatmd.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2095,7 +2095,7 @@ SUBROUTINE W3DIMS ( IMOD, MK, MTH, NDSE, NDST )
MPARS(IMOD)%SRCPS%CUMULW(MSPEC,MSPEC), &
STAT=ISTAT )
CHECK_ALLOC_STATUS ( ISTAT )
MPARS(IMOD)%SRCPS%SATINDICES(:,:)=0.
MPARS(IMOD)%SRCPS%SATINDICES(:,:)=1.
MPARS(IMOD)%SRCPS%SATWEIGHTS(:,:)=0.
MPARS(IMOD)%SRCPS%CUMULW(:,:)=0.
#endif
Expand Down
32 changes: 21 additions & 11 deletions model/src/w3iogomd.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2533,7 +2533,7 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
!/
USE W3ODATMD, ONLY: NOGRP, NGRPP, IDOUT, UNDEF, NDST, NDSE, &
FLOGRD, IPASS => IPASS1, WRITE => WRITE1, &
FNMPRE, NOSWLL, NOEXTR
FNMPRE, FNMGRD, NOSWLL, NOEXTR
!/
USE W3SERVMD, ONLY: EXTCDE
USE W3ODATMD, only : IAPROC
Expand Down Expand Up @@ -2576,6 +2576,10 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
#endif
CHARACTER(LEN=30) :: IDTST, TNAME
CHARACTER(LEN=10) :: VERTST

! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
CHARACTER(LEN=256) :: FNMPRE_LOCAL

!/
!/ ------------------------------------------------------------------- /
!/
Expand Down Expand Up @@ -2624,22 +2628,28 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
! open file ---------------------------------------------------------- *
! ( IPASS = 1 )
!
IF (LEN_TRIM(FNMGRD) .EQ. 0) THEN
FNMPRE_LOCAL = FNMPRE
ELSE
FNMPRE_LOCAL = FNMGRD
END IF

IF ( IPASS.EQ.1 .AND. OFILES(1) .EQ. 0) THEN
I = LEN_TRIM(FILEXT)
J = LEN_TRIM(FNMPRE)
J = LEN_TRIM(FNMPRE_LOCAL)
!
#ifdef W3_T
WRITE (NDST,9001) FNMPRE(:J)//'out_grd.'//FILEXT(:I)
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I)
#endif
IF ( WRITE ) THEN
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
form ='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
#ifdef W3_ASCII
OPEN (NDSOA,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I)//'.txt', &
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I)//'.txt', &
form ='FORMATTED',ERR=800,IOSTAT=IERR)
#endif
ELSE
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
END IF
!
Expand Down Expand Up @@ -2709,22 +2719,22 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
!
IF ( IPASS.GE.1 .AND. OFILES(1) .EQ. 1) THEN
I = LEN_TRIM(FILEXT)
J = LEN_TRIM(FNMPRE)
J = LEN_TRIM(FNMPRE_LOCAL)
!
! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
#ifdef W3_T
WRITE (NDST,9001) FNMPRE(:J)//TIMETAG//'.out_grd.'//FILEXT(:I)
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.'//FILEXT(:I)
#endif
IF ( WRITE ) THEN
OPEN (NDSOG,FILE=FNMPRE(:J)//TIMETAG//'.out_grd.' &
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.' &
//FILEXT(:I),form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
#ifdef W3_ASCII
OPEN (NDSOA,FILE=FNMPRE(:J)//TIMETAG//'.out_grd.' &
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.' &
//FILEXT(:I)//'.txt',form='FORMATTED',ERR=800,IOSTAT=IERR)
#endif
ELSE
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
END IF
!
Expand Down
83 changes: 60 additions & 23 deletions model/src/w3iopomd.F90
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_IOPP )
REAL, ALLOCATABLE :: EquLon(:),EquLat(:),StdLon(:),StdLat(:),AnglPT(:)
#endif
! Variables for NetCDF weights file for points
character(len = 124) :: filename
character(len = 124) :: filename, filenameout
logical :: pnt_wght_exists, pnt_wght_write
integer :: ncerr, fh
integer :: d_nopts, d_namelen, d_vsize, d_wghtlen
Expand Down Expand Up @@ -542,7 +542,7 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_IOPP )
END DO ! End loop over output points (IPT).
ELSE
! Saved weight file exists, read weights from file
IF ( IAPROC .EQ. 1 ) THEN
IF ( IAPROC .EQ. 1 ) THEN
! Open the netCDF file.
ncerr = nf90_open(filename, NF90_NOWRITE, fh)
if (nf90_err(ncerr) .ne. 0) return
Expand Down Expand Up @@ -596,14 +596,29 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_IOPP )
ncerr = nf90_get_var(fh, v_ptifac, PTIFAC, start = (/ 1, 1/), &
count = (/ d_wghtlen_len, d_nopts_len /))
if (nf90_err(ncerr) .ne. 0) return

! Close the file.
ncerr = nf90_close(fh)
if (nf90_err(ncerr) .ne. 0) return

END IF

#ifdef W3_MPI
! Broadcast weight info to all MPI tasks:
! Broadcast weight info to all MPI tasks:

!First broadcast NOPTS, used in the next calls:
CALL MPI_BCAST(NOPTS,1,MPI_INTEGER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(PTNME,40*NPT,MPI_CHARACTER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(PTLOC,2*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(IPTINT,2*4*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(PTIFAC,4*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_Barrier(MPI_COMM_IOPP,IERR_MPI)

CALL MPI_BCAST(PTLOC,2*NPT,MPI_REAL,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(PTIFAC,4*NPT,MPI_REAL,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)
CALL MPI_BCAST(IPTINT(:,:,1:NOPTS),2*4*NOPTS,MPI_INTEGER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)

!Send point names individually
DO IPT=1, NOPTS
CALL MPI_BCAST(PTNME(IPT),40,MPI_CHARACTER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI)
ENDDO

CALL MPI_Barrier(MPI_COMM_IOPP,IERR_MPI)
#endif
ENDIF !end if point weight file exists
Expand All @@ -612,7 +627,8 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_IOPP )
IF ( pnt_wght_write .AND. (NOPTS > 0) ) THEN
IF ( IAPROC .EQ. 1 ) THEN
! Create the netCDF file.
ncerr = nf90_create(filename, NF90_NETCDF4, fh)
filenameout = 'out.pnt_wght.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
ncerr = nf90_create(filenameout, NF90_NETCDF4, fh)
if (nf90_err(ncerr) .ne. 0) return

! Define dimensions.
Expand Down Expand Up @@ -1308,7 +1324,7 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD_IN, filename, ncerr)
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, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
GRDID, ICEO, ICEHO, ICEFO, W3DMO2
USE W3SERVMD, ONLY: EXTCDE
#ifdef W3_FLX5
Expand Down Expand Up @@ -1582,7 +1598,7 @@ SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr)
USE W3WDATMD, ONLY: TIME
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
PTLOC, PTIFAC, DPO, WAO, WDO, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
GRDID, ICEO, ICEHO, ICEFO
USE W3TIMEMD, ONLY: CALTYPE, T2D, U2D, TSUB
#ifdef W3_FLX5
Expand Down Expand Up @@ -1902,7 +1918,7 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
USE W3ODATMD, ONLY: W3SETO
USE W3GDATMD, ONLY: FILEXT
USE W3WDATMD, ONLY: TIME
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, FNMPRE
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, FNMPRE, FNMPNT
USE W3ODATMD, ONLY: OFILES
USE W3SERVMD, ONLY: EXTCDE
#ifdef W3_S
Expand All @@ -1921,6 +1937,9 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
character(len = 124) :: filename
integer :: ncerr

! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
CHARACTER(LEN=256) :: FNMPRE_LOCAL

#ifdef W3_S
CALL STRACE (IENT, 'W3IOPON')
#endif
Expand Down Expand Up @@ -1949,12 +1968,19 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
END IF

! Determine filename.
IF (LEN_TRIM(FNMPNT) .EQ. 0) THEN
FNMPRE_LOCAL = FNMPRE
ELSE
FNMPRE_LOCAL = FNMPNT
END IF
!

IF ( OFILES(2) .EQ. 1 ) THEN
! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
filename = FNMPRE(:LEN_TRIM(FNMPRE))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
ELSE
filename = FNMPRE(:LEN_TRIM(FNMPRE))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
END IF

! Do a read or a write of the point file.
Expand Down Expand Up @@ -2142,7 +2168,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
USE W3WDATMD, ONLY: TIME
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
IL, IW, II, PTLOC, PTIFAC, DPO, WAO, WDO, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
GRDID, ICEO, ICEHO, ICEFO
#ifdef W3_FLX5
USE W3ODATMD, ONLY: TAUAO, TAUDO, DAIRO
Expand Down Expand Up @@ -2185,6 +2211,10 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
CHARACTER(LEN=10) :: VERTST
!/
CHARACTER(LEN=15) :: TIMETAG

! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
CHARACTER(LEN=256) :: FNMPRE_LOCAL

!/
!/ ------------------------------------------------------------------- /
!/
Expand Down Expand Up @@ -2223,23 +2253,30 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
!
! open file ---------------------------------------------------------- *
!
IF (LEN_TRIM(FNMPNT) .EQ. 0) THEN
FNMPRE_LOCAL = FNMPRE
ELSE
FNMPRE_LOCAL = FNMPNT
END IF
!

IF ( IPASS.EQ.1 .AND. OFILES(2) .EQ. 0 ) THEN

I = LEN_TRIM(FILEXT)
J = LEN_TRIM(FNMPRE)
J = LEN_TRIM(FNMPRE_LOCAL)

#ifdef W3_T
WRITE (NDST,9001) FNMPRE(:J)//'out_pnt.'//FILEXT(:I)
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I)
#endif
IF ( WRITE ) THEN
OPEN (NDSOP,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I), &
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I), &
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
#ifdef W3_ASCII
OPEN (NDSOA,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I)//'.txt', &
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I)//'.txt', &
form='FORMATTED', ERR=800,IOSTAT=IERR)
#endif
ELSE
OPEN (NDSOP,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I), &
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I), &
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
END IF
!
Expand Down Expand Up @@ -2320,20 +2357,20 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
IF ( IPASS.GE.1 .AND. OFILES(2) .EQ. 1) THEN
!
I = LEN_TRIM(FILEXT)
J = LEN_TRIM(FNMPRE)
J = LEN_TRIM(FNMPRE_LOCAL)

! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
!
#ifdef W3_T
WRITE (NDST,9001) FNMPRE(:J)//TIMETAG//'.out_pnt.'// &
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.'// &
FILEXT(:I)
#endif
IF ( WRITE ) THEN
OPEN (NDSOP,FILE=FNMPRE(:J)//TIMETAG//'.out_pnt.' &
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.' &
//FILEXT(:I),form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
#ifdef W3_ASCII
OPEN (NDSOA,FILE=FNMPRE(:J)//TIMETAG//'.out_pnt.' &
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.' &
//FILEXT(:I)//'.txt',form='FORMATTED', ERR=800,IOSTAT=IERR)
#endif
END IF
Expand Down
19 changes: 15 additions & 4 deletions model/src/w3iorsmd.F90
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
USE W3IDATMD, ONLY: WXNwrst, WYNwrst
#endif
USE W3ODATMD, ONLY: NDSE, NDST, IAPROC, NAPROC, NAPERR, NAPRST, &
IFILE => IFILE4, FNMPRE, NTPROC, IOSTYP, &
IFILE => IFILE4, FNMPRE, FNMRST, NTPROC, IOSTYP, &
FLOGRR, NOGRP, NGRPP, SCREEN
#ifdef W3_MPI
USE W3ODATMD, ONLY: NRQRS, NBLKRS, RSBLKS, IRQRS, IRQRSS, &
Expand Down Expand Up @@ -380,6 +380,10 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
CHARACTER(LEN=26) :: IDTST
CHARACTER(LEN=30) :: TNAME
CHARACTER(LEN=15) :: TIMETAG

! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
CHARACTER(LEN=256) :: FNMPRE_LOCAL

!/
!/ ------------------------------------------------------------------- /
!/
Expand Down Expand Up @@ -457,8 +461,15 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
!
! open file ---------------------------------------------------------- *
!
IF (LEN_TRIM(FNMRST) .EQ. 0) THEN
FNMPRE_LOCAL = FNMPRE
ELSE
FNMPRE_LOCAL = FNMRST
END IF
!

I = LEN_TRIM(FILEXT)
J = LEN_TRIM(FNMPRE)
J = LEN_TRIM(FNMPRE_LOCAL)
!
!CHECKPOINT RESTART FILE
ITMP=0
Expand Down Expand Up @@ -495,10 +506,10 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )

IF ( WRITE ) THEN
IF ( .NOT.IOSFLG .OR. IAPROC.EQ.NAPRST ) &
OPEN (NDSR,FILE=FNMPRE(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
OPEN (NDSR,FILE=FNMPRE_LOCAL(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
ACCESS='STREAM',ERR=800,IOSTAT=IERR)
ELSE
OPEN (NDSR,FILE=FNMPRE(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
OPEN (NDSR,FILE=FNMPRE_LOCAL(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
ACCESS='STREAM',ERR=800,IOSTAT=IERR, &
STATUS='OLD',ACTION='READ')
END IF
Expand Down
Loading

0 comments on commit b7eb7b3

Please sign in to comment.