diff --git a/model/nml/ww3_shel.nml b/model/nml/ww3_shel.nml index b6ae8cfef..b91fff57a 100644 --- a/model/nml/ww3_shel.nml +++ b/model/nml/ww3_shel.nml @@ -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 ! diff --git a/model/src/w3gdatmd.F90 b/model/src/w3gdatmd.F90 index e73957128..28af7329e 100644 --- a/model/src/w3gdatmd.F90 +++ b/model/src/w3gdatmd.F90 @@ -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 diff --git a/model/src/w3iogomd.F90 b/model/src/w3iogomd.F90 index 7a9fca02a..72412bbd3 100644 --- a/model/src/w3iogomd.F90 +++ b/model/src/w3iogomd.F90 @@ -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 @@ -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 + !/ !/ ------------------------------------------------------------------- / !/ @@ -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 ! @@ -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 ! diff --git a/model/src/w3iopomd.F90 b/model/src/w3iopomd.F90 index fec758638..277d8dbd9 100644 --- a/model/src/w3iopomd.F90 +++ b/model/src/w3iopomd.F90 @@ -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 @@ -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 @@ -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 @@ -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. @@ -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 @@ -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 @@ -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 @@ -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 @@ -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. @@ -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 @@ -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 + !/ !/ ------------------------------------------------------------------- / !/ @@ -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 ! @@ -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 diff --git a/model/src/w3iorsmd.F90 b/model/src/w3iorsmd.F90 index 5253a66ab..11d49a2c1 100644 --- a/model/src/w3iorsmd.F90 +++ b/model/src/w3iorsmd.F90 @@ -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, & @@ -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 + !/ !/ ------------------------------------------------------------------- / !/ @@ -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 @@ -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 diff --git a/model/src/w3nmlshelmd.F90 b/model/src/w3nmlshelmd.F90 index ac53104b2..26cefe134 100644 --- a/model/src/w3nmlshelmd.F90 +++ b/model/src/w3nmlshelmd.F90 @@ -129,6 +129,12 @@ MODULE W3NMLSHELMD TYPE(NML_OUTPUT_TIME_T) :: COUPLING END TYPE NML_OUTPUT_DATE_T + ! NEW TYPE FOR USER DEFINED PATH + TYPE NML_OUTPUT_PATH_T + CHARACTER(LEN=256) :: GRD_OUT + CHARACTER(LEN=256) :: PNT_OUT + CHARACTER(LEN=256) :: RST_OUT + END TYPE NML_OUTPUT_PATH_T ! homogeneous input structure TYPE NML_HOMOG_COUNT_T @@ -169,7 +175,7 @@ MODULE W3NMLSHELMD !/ ------------------------------------------------------------------- / SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, & - NML_INPUT, NML_OUTPUT_TYPE, NML_OUTPUT_DATE, & + NML_INPUT, NML_OUTPUT_TYPE, NML_OUTPUT_DATE, NML_OUTPUT_PATH, & NML_HOMOG_COUNT, NML_HOMOG_INPUT, IERR) !/ !/ +-----------------------------------+ @@ -263,6 +269,7 @@ SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, & TYPE(NML_INPUT_T), INTENT(INOUT) :: NML_INPUT TYPE(NML_OUTPUT_TYPE_T), INTENT(INOUT) :: NML_OUTPUT_TYPE TYPE(NML_OUTPUT_DATE_T), INTENT(INOUT) :: NML_OUTPUT_DATE + TYPE(NML_OUTPUT_PATH_T), INTENT(INOUT) :: NML_OUTPUT_PATH ! USER DEFINED PATH TYPE(NML_HOMOG_COUNT_T), INTENT(INOUT) :: NML_HOMOG_COUNT TYPE(NML_HOMOG_INPUT_T), ALLOCATABLE, INTENT(INOUT) :: NML_HOMOG_INPUT(:) INTEGER, INTENT(OUT) :: IERR @@ -318,7 +325,11 @@ SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, & ! read output date namelist 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 + 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) @@ -838,6 +849,117 @@ END SUBROUTINE READ_OUTPUT_DATE_NML + !/ ------------------------------------------------------------------- / + + SUBROUTINE READ_OUTPUT_PATH_NML (NDSI, NML_OUTPUT_PATH) + !/ + !/ +-----------------------------------+ + !/ | WAVEWATCH III NOAA/NCEP | + !/ | M. Chen | + !/ | | + !/ | FORTRAN 90 | + !/ | Last update : 13-Jan-2025 | + !/ +-----------------------------------+ + !/ + !/ + ! 1. Purpose : + ! + ! + ! 2. Method : + ! + ! See source term routines. + ! + ! 3. Parameters : + ! + ! Parameter list + ! ---------------------------------------------------------------- + ! NDSI Int. + ! NML_OUTPUT_PATH Type. + ! ---------------------------------------------------------------- + ! + ! 4. Subroutines used : + ! + ! Name Type Module Description + ! ---------------------------------------------------------------- + ! STRACE Subr. W3SERVMD SUBROUTINE tracing. + ! ---------------------------------------------------------------- + ! + ! 5. Called by : + ! + ! Name Type Module Description + ! ---------------------------------------------------------------- + ! W3NMLSHEL Subr. N/A Namelist configuration routine. + ! ---------------------------------------------------------------- + ! + ! 6. Error messages : + ! + ! None. + ! + ! 7. Remarks : + ! + ! 8. Structure : + ! + ! See source code. + ! + ! 9. Switches : + ! + ! !/MPI Uses MPI communications + ! + ! 10. Source code : + ! + !/ ------------------------------------------------------------------- / + + USE WMMDATMD, ONLY: MDSE + USE W3SERVMD, ONLY: EXTCDE +#ifdef W3_S + USE W3SERVMD, ONLY: STRACE +#endif + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: NDSI + TYPE(NML_OUTPUT_PATH_T), INTENT(INOUT) :: NML_OUTPUT_PATH + + ! LOCALS + INTEGER :: IERR + TYPE(NML_OUTPUT_PATH_T) :: PATH + NAMELIST /OUTPUT_PATH_NML/ PATH +#ifdef W3_S + INTEGER, SAVE :: IENT = 0 +#endif + + IERR = 0 +#ifdef W3_S + CALL STRACE (IENT, 'READ_OUTPUT_PATH_NML') +#endif + + ! SET DEFAULT VALUES FOR OUTPUT USER DEFINED PATH + PATH%GRD_OUT = './' + PATH%PNT_OUT = './' + PATH%RST_OUT = './' + + ! READ OUTPUT USER DEFINED PATH NAMELIST + REWIND (NDSI) + READ (NDSI, nml=OUTPUT_PATH_NML, iostat=IERR, iomsg=MSG) + IF (IERR.GT.0) THEN + WRITE (MDSE,'(A,/A)') & + 'ERROR: READ_OUTPUT_PATH_NML: namelist read error', & + 'ERROR: '//TRIM(MSG) + CALL EXTCDE (8) + END IF + + ! SAVE NAMELIST + NML_OUTPUT_PATH = PATH + + END SUBROUTINE READ_OUTPUT_PATH_NML + + !/ ------------------------------------------------------------------- / + + + + + + !/ ------------------------------------------------------------------- / SUBROUTINE READ_HOMOGENEOUS_NML (NDSI, NML_HOMOG_COUNT, NML_HOMOG_INPUT) @@ -1184,9 +1306,9 @@ SUBROUTINE REPORT_INPUT_NML (NML_INPUT) WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_DENSITY = ', NML_INPUT%FORCING%MUD_DENSITY WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_THICKNESS = ', NML_INPUT%FORCING%MUD_THICKNESS WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_VISCOSITY = ', NML_INPUT%FORCING%MUD_VISCOSITY - WRITE (NDSN,10) TRIM(MSG),'ASSIM % MEAN = ', NML_INPUT%ASSIM%MEAN - WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC1D = ', NML_INPUT%ASSIM%SPEC1D - WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC2D = ', NML_INPUT%ASSIM%SPEC2D + WRITE (NDSN,10) TRIM(MSG),'ASSIM % MEAN = ', NML_INPUT%ASSIM%MEAN + WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC1D = ', NML_INPUT%ASSIM%SPEC1D + WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC2D = ', NML_INPUT%ASSIM%SPEC2D 10 FORMAT (A,2X,A,A) @@ -1279,9 +1401,9 @@ SUBROUTINE REPORT_OUTPUT_TYPE_NML (NML_OUTPUT_TYPE) WRITE (MSG,'(A)') 'OUTPUT TYPE % ' WRITE (NDSN,'(A)') - WRITE (NDSN,10) TRIM(MSG),'FIELD % LIST = ', TRIM(NML_OUTPUT_TYPE%FIELD%LIST) - WRITE (NDSN,10) TRIM(MSG),'POINT % FILE = ', TRIM(NML_OUTPUT_TYPE%POINT%FILE) - WRITE (NDSN,13) TRIM(MSG),'TRACK % FORMAT = ', NML_OUTPUT_TYPE%TRACK%FORMAT + WRITE (NDSN,10) TRIM(MSG),'FIELD % LIST = ', TRIM(NML_OUTPUT_TYPE%FIELD%LIST) + WRITE (NDSN,10) TRIM(MSG),'POINT % FILE = ', TRIM(NML_OUTPUT_TYPE%POINT%FILE) + WRITE (NDSN,13) TRIM(MSG),'TRACK % FORMAT = ', NML_OUTPUT_TYPE%TRACK%FORMAT WRITE (NDSN,11) TRIM(MSG),'PARTITION % X0 = ', NML_OUTPUT_TYPE%PARTITION%X0 WRITE (NDSN,11) TRIM(MSG),'PARTITION % XN = ', NML_OUTPUT_TYPE%PARTITION%XN WRITE (NDSN,11) TRIM(MSG),'PARTITION % NX = ', NML_OUTPUT_TYPE%PARTITION%NX @@ -1290,11 +1412,11 @@ SUBROUTINE REPORT_OUTPUT_TYPE_NML (NML_OUTPUT_TYPE) WRITE (NDSN,11) TRIM(MSG),'PARTITION % NY = ', NML_OUTPUT_TYPE%PARTITION%NY WRITE (NDSN,13) TRIM(MSG),'PARTITION % FORMAT = ', NML_OUTPUT_TYPE%PARTITION%FORMAT #ifdef W3_COU - WRITE (NDSN,10) TRIM(MSG),'COUPLING % SENT = ', TRIM(NML_OUTPUT_TYPE%COUPLING%SENT) - WRITE (NDSN,10) TRIM(MSG),'COUPLING % RECEIVED = ', TRIM(NML_OUTPUT_TYPE%COUPLING%RECEIVED) - WRITE (NDSN,13) TRIM(MSG),'COUPLING % COUPLET0 = ', NML_OUTPUT_TYPE%COUPLING%COUPLET0 + WRITE (NDSN,10) TRIM(MSG),'COUPLING % SENT = ', TRIM(NML_OUTPUT_TYPE%COUPLING%SENT) + WRITE (NDSN,10) TRIM(MSG),'COUPLING % RECEIVED = ', TRIM(NML_OUTPUT_TYPE%COUPLING%RECEIVED) + WRITE (NDSN,13) TRIM(MSG),'COUPLING % COUPLET0 = ', NML_OUTPUT_TYPE%COUPLING%COUPLET0 #endif - WRITE (NDSN,10) TRIM(MSG),'RESTART % EXTRA = ', TRIM(NML_OUTPUT_TYPE%RESTART%EXTRA) + WRITE (NDSN,10) TRIM(MSG),'RESTART % EXTRA = ', TRIM(NML_OUTPUT_TYPE%RESTART%EXTRA) 10 FORMAT (A,2X,A,A) 11 FORMAT (A,2X,A,I8) @@ -1387,31 +1509,31 @@ SUBROUTINE REPORT_OUTPUT_DATE_NML (NML_OUTPUT_DATE) WRITE (MSG,'(A)') 'OUTPUT DATE MODEL GRID % ' WRITE (NDSN,'(A)') - WRITE (NDSN,10) TRIM(MSG),'FIELD % START = ', TRIM(NML_OUTPUT_DATE%FIELD%START) - WRITE (NDSN,10) TRIM(MSG),'FIELD % STRIDE = ', TRIM(NML_OUTPUT_DATE%FIELD%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'FIELD % STOP = ', TRIM(NML_OUTPUT_DATE%FIELD%STOP) - WRITE (NDSN,10) TRIM(MSG),'POINT % START = ', TRIM(NML_OUTPUT_DATE%POINT%START) - WRITE (NDSN,10) TRIM(MSG),'POINT % STRIDE = ', TRIM(NML_OUTPUT_DATE%POINT%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'POINT % STOP = ', TRIM(NML_OUTPUT_DATE%POINT%STOP) - WRITE (NDSN,10) TRIM(MSG),'TRACK % START = ', TRIM(NML_OUTPUT_DATE%TRACK%START) - WRITE (NDSN,10) TRIM(MSG),'TRACK % STRIDE = ', TRIM(NML_OUTPUT_DATE%TRACK%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'TRACK % STOP = ', TRIM(NML_OUTPUT_DATE%TRACK%STOP) - WRITE (NDSN,10) TRIM(MSG),'RESTART % START = ', TRIM(NML_OUTPUT_DATE%RESTART%START) - WRITE (NDSN,10) TRIM(MSG),'RESTART % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'RESTART % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART%STOP) - WRITE (NDSN,10) TRIM(MSG),'RESTART2 % START = ', TRIM(NML_OUTPUT_DATE%RESTART2%START) - WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART2%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART2%STOP) - WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % START = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%START) - WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STRIDE = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STOP = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STOP) + WRITE (NDSN,10) TRIM(MSG),'FIELD % START = ', TRIM(NML_OUTPUT_DATE%FIELD%START) + WRITE (NDSN,10) TRIM(MSG),'FIELD % STRIDE = ', TRIM(NML_OUTPUT_DATE%FIELD%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'FIELD % STOP = ', TRIM(NML_OUTPUT_DATE%FIELD%STOP) + WRITE (NDSN,10) TRIM(MSG),'POINT % START = ', TRIM(NML_OUTPUT_DATE%POINT%START) + WRITE (NDSN,10) TRIM(MSG),'POINT % STRIDE = ', TRIM(NML_OUTPUT_DATE%POINT%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'POINT % STOP = ', TRIM(NML_OUTPUT_DATE%POINT%STOP) + WRITE (NDSN,10) TRIM(MSG),'TRACK % START = ', TRIM(NML_OUTPUT_DATE%TRACK%START) + WRITE (NDSN,10) TRIM(MSG),'TRACK % STRIDE = ', TRIM(NML_OUTPUT_DATE%TRACK%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'TRACK % STOP = ', TRIM(NML_OUTPUT_DATE%TRACK%STOP) + WRITE (NDSN,10) TRIM(MSG),'RESTART % START = ', TRIM(NML_OUTPUT_DATE%RESTART%START) + WRITE (NDSN,10) TRIM(MSG),'RESTART % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'RESTART % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART%STOP) + WRITE (NDSN,10) TRIM(MSG),'RESTART2 % START = ', TRIM(NML_OUTPUT_DATE%RESTART2%START) + WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART2%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART2%STOP) + WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % START = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%START) + WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STRIDE = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STOP = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STOP) WRITE (NDSN,10) TRIM(MSG),'PARTITION % START = ', TRIM(NML_OUTPUT_DATE%PARTITION%START) WRITE (NDSN,10) TRIM(MSG),'PARTITION % STRIDE = ', TRIM(NML_OUTPUT_DATE%PARTITION%STRIDE) WRITE (NDSN,10) TRIM(MSG),'PARTITION % STOP = ', TRIM(NML_OUTPUT_DATE%PARTITION%STOP) #ifdef W3_COU - WRITE (NDSN,10) TRIM(MSG),'COUPLING % START = ', TRIM(NML_OUTPUT_DATE%COUPLING%START) - WRITE (NDSN,10) TRIM(MSG),'COUPLING % STRIDE = ', TRIM(NML_OUTPUT_DATE%COUPLING%STRIDE) - WRITE (NDSN,10) TRIM(MSG),'COUPLING % STOP = ', TRIM(NML_OUTPUT_DATE%COUPLING%STOP) + WRITE (NDSN,10) TRIM(MSG),'COUPLING % START = ', TRIM(NML_OUTPUT_DATE%COUPLING%START) + WRITE (NDSN,10) TRIM(MSG),'COUPLING % STRIDE = ', TRIM(NML_OUTPUT_DATE%COUPLING%STRIDE) + WRITE (NDSN,10) TRIM(MSG),'COUPLING % STOP = ', TRIM(NML_OUTPUT_DATE%COUPLING%STOP) #endif @@ -1426,6 +1548,99 @@ END SUBROUTINE REPORT_OUTPUT_DATE_NML + !/ ------------------------------------------------------------------- / + + SUBROUTINE REPORT_OUTPUT_PATH_NML (NML_OUTPUT_PATH) + !/ + !/ +-----------------------------------+ + !/ | WAVEWATCH III NOAA/NCEP | + !/ | M. Chen | + !/ | | + !/ | FORTRAN 90 | + !/ | Last update : 13-Jan-2025 | + !/ +-----------------------------------+ + !/ + !/ + ! 1. Purpose : + ! + ! + ! 2. Method : + ! + ! See source term routines. + ! + ! 3. Parameters : + ! + ! Parameter list + ! ---------------------------------------------------------------- + ! NML_OUTPUT_PATH Type. + ! ---------------------------------------------------------------- + ! + ! 4. Subroutines used : + ! + ! Name Type Module Description + ! ---------------------------------------------------------------- + ! STRACE Subr. W3SERVMD SUBROUTINE tracing. + ! ---------------------------------------------------------------- + ! + ! 5. Called by : + ! + ! Name Type Module Description + ! ---------------------------------------------------------------- + ! W3NMLSHEL Subr. N/A Namelist configuration routine. + ! ---------------------------------------------------------------- + ! + ! 6. Error messages : + ! + ! None. + ! + ! 7. Remarks : + ! + ! 8. Structure : + ! + ! See source code. + ! + ! 9. Switches : + ! + ! !/MPI Uses MPI communications + ! + ! 10. Source code : + ! + !/ ------------------------------------------------------------------- / + +#ifdef W3_S + USE W3SERVMD, ONLY: STRACE +#endif + + IMPLICIT NONE + + TYPE(NML_OUTPUT_PATH_T), INTENT(IN) :: NML_OUTPUT_PATH + + ! LOCALS +#ifdef W3_S + INTEGER, SAVE :: IENT = 0 +#endif + +#ifdef W3_S + CALL STRACE (IENT, 'REPORT_OUTPUT_PATH_NML') +#endif + + WRITE (MSG,'(A)') 'OUTPUT PATH % ' + WRITE (NDSN,'(A)') + WRITE (NDSN,10) TRIM(MSG),'GRD_OUT = ', TRIM(NML_OUTPUT_PATH%GRD_OUT) + WRITE (NDSN,10) TRIM(MSG),'PNT_OUT = ', TRIM(NML_OUTPUT_PATH%PNT_OUT) + WRITE (NDSN,10) TRIM(MSG),'RST_OUT = ', TRIM(NML_OUTPUT_PATH%RST_OUT) + +10 FORMAT (A,2X,A,A) + + END SUBROUTINE REPORT_OUTPUT_PATH_NML + + !/ ------------------------------------------------------------------- / + + + + + + !/ ------------------------------------------------------------------- / SUBROUTINE REPORT_HOMOGENEOUS_NML (NML_HOMOG_COUNT, NML_HOMOG_INPUT) diff --git a/model/src/w3oacpmd.F90 b/model/src/w3oacpmd.F90 index 72e48e4e1..19f1421f1 100644 --- a/model/src/w3oacpmd.F90 +++ b/model/src/w3oacpmd.F90 @@ -162,13 +162,16 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) !/ | Last update : April-2016 | !/ +-----------------------------------+ !/ - !/ Jul-2013 : Origination. ( version 4.18 ) - !/ April-2016 : Add comments (J. Pianezze) ( version 5.07 ) - !/ Sept-2016 : Correct bug MPI (J. Pianezze) ( version 5.12 ) + !/ Jul-2013 : Origination. ( version 4.18 ) + !/ April-2016 : Add comments (J. Pianezze) ( version 5.07 ) + !/ Sept-2016 : Correct bug MPI (J. Pianezze) ( version 5.12 ) + !/ Jan-2025 : Use scrip format (J.M. Castillo) ( version x.xx ) !/ ! 1. Purpose : ! - ! Grid data file definition + ! Grid data file definition in the scrip format. + ! In this format, grid corners are specified in counterclockwise + ! order, being the first corner the one at the bottom left. ! ! 2. Method : ! 3. Parameters : @@ -250,41 +253,30 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) NYS=1 NYN=NY ! - ! lat/lon ALLOCATE ( LON(NNODES,1), LAT(NNODES,1) ) - I = 0 - DO IY = NYS, NYN - DO IX = NXW, NXE - I = I+1 - LON(I,1)=XGRD(IY,IX)*FACTOR - LAT(I,1)=YGRD(IY,IX)*FACTOR - END DO - END DO - ! - ! areas, corners ALLOCATE ( AREA(NNODES,1), CORLON(NNODES,1,4), CORLAT(NNODES,1,4) ) - I = 0 - DO IY = NYS, NYN - DO IX = NXW, NXE - I = I+1 - CORLON(I,1,1)=LON(I,1)+HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,2)=LON(I,1)-HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,3)=LON(I,1)-HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,4)=LON(I,1)+HPFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,1)=LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,2)=LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,3)=LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,4)=LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR - AREA(I,1)=HPFAC(IY,IX)*HQFAC(IY,IX) - END DO - END DO - ! - ! Model grid mask ALLOCATE ( MASK(NNODES,1) ) + ! I = 0 DO IY = NYS, NYN DO IX = NXW, NXE I = I+1 + ! lat/lon + LON(I,1) = XGRD(IY,IX)*FACTOR + LAT(I,1) = YGRD(IY,IX)*FACTOR + ! + ! areas, corners + CORLON(I,1,1) = LON(I,1)-HPFAC(IY,IX)/2.*FACTOR + CORLON(I,1,2) = LON(I,1)+HPFAC(IY,IX)/2.*FACTOR + CORLON(I,1,3) = CORLON(I,1,2) + CORLON(I,1,4) = CORLON(I,1,1) + CORLAT(I,1,1) = LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR + CORLAT(I,1,2) = CORLAT(I,1,1) + CORLAT(I,1,3) = LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR + CORLAT(I,1,4) = CORLAT(I,1,3) + AREA(I,1) = HPFAC(IY,IX)*HQFAC(IY,IX) + ! + ! Model grid mask ! Get the mask : 0 - sea / 1 - open boundary cells (the land is already excluded) IF ((MAPSTA(IY,IX) .EQ. 1)) THEN MASK(I,1) = 0 @@ -317,13 +309,13 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) CORLON(I,1,3) = CORLON(I,1,2) CORLON(I,1,4) = CORLON(I,1,1) CORLAT(I,1,1) = Y0 + IJKCel(2,I)*DLAT - CORLAT(I,1,2)=CORLAT(I,1,1) + CORLAT(I,1,2) = CORLAT(I,1,1) CORLAT(I,1,3) = Y0 + (IJKCel(2,I) + IJKCel(4,I))*DLAT - CORLAT(I,1,4)=CORLAT(I,1,3) + CORLAT(I,1,4) = CORLAT(I,1,3) ! areas AREA(I,1) = 0.25 * IJKCEL(3,I)*DLON * IJKCEL(4,I)*DLAT - ! Model grid mask - MASK(I,1) = 1 + ! Model grid mask: 0 - sea / 1 - open boundary cells (the land is already excluded) + MASK(I,1) = 0 ENDDO #endif ! @@ -376,6 +368,7 @@ SUBROUTINE CPL_OASIS_DEFINE(NDSO,RCV_STR,SND_STR) !/ (R. Baraille & J. Pianezze) !/ April-2016 : Add comments (J. Pianezze) ( version 5.07 ) !/ 08-Jun-2018 : use INIT_GET_ISEA ( version 6.04 ) + !/ Feb-2025 : OASIS points partition (J.M. Castillo) ( version X.XX ) !/ ! 1. Purpose : ! @@ -427,58 +420,41 @@ SUBROUTINE CPL_OASIS_DEFINE(NDSO,RCV_STR,SND_STR) !/ ------------------------------------------------------------------- / !/ Local parameters !/ - INTEGER :: IB_I,I + INTEGER :: IB_I INTEGER :: IL_PART_ID ! PartitionID INTEGER, ALLOCATABLE, DIMENSION(:) :: ILA_PARAL ! Description of the local partition in the global index space INTEGER, DIMENSION(4) :: ILA_SHAPE ! Vector giving the min & max index for each dim of the fields INTEGER, DIMENSION(2) :: ILA_VAR_NODIMS ! rank of fields & number of bundles (1 with OASIS3-MCT) INTEGER :: ISEA, JSEA, IX, IY - INTEGER :: NHXW, NHXE, NHYS, NHYN ! size of the halo at the western, eastern, southern, northern boundaries - LOGICAL :: LL_MPI_FILE ! to check if there an mpi.txt file for domain decompasition !/ !/ ------------------------------------------------------------------- / !/ Executable part !/ ! + ALLOCATE(ILA_PARAL(2+NSEAL)) + ! + ! * Define the partition : OASIS POINTS partition + ILA_PARAL(1) = 4 + ! + ! * total number of segments of the global domain + ILA_PARAL(2) = NSEAL + ! IF (GTYPE .EQ. RLGTYPE .OR. GTYPE .EQ. CLGTYPE) THEN ! ! 1.1. regular and curvilinear grids ! ---------------------------------- - NHXW = 1 ; NHXE = NX ; NHYS = 1 ; NHYN = NY - NHXW = NHXW - 1 - NHXE = NX - NHXE - NHYS = NHYS - 1 - NHYN = NY - NHYN - ! - ALLOCATE(ILA_PARAL(2+NSEAL*2)) - ! - ! * Define the partition : OASIS ORANGE partition - ILA_PARAL(1) = 3 - ! - ! * total number of segments of the global domain - ILA_PARAL(2) = NSEAL - ! DO JSEA=1, NSEAL CALL INIT_GET_ISEA(ISEA,JSEA) IX = MAPSF(ISEA,1) IY = MAPSF(ISEA,2) - ILA_PARAL(JSEA*2+1) = (IY - NHYN -1)*(NX - NHXE - NHXW) + (IX - NHXW - 1) - ILA_PARAL(JSEA*2+2) = 1 + ILA_PARAL(JSEA+2) = (IY - 1)*NX + IX END DO #ifdef W3_SMC ELSE IF( GTYPE .EQ. SMCTYPE ) THEN ! ! 1.2. SMC grids ! ---------------------------------- - ALLOCATE(ILA_PARAL(2+NSEAL)) - ! - ! * Define the partition : OASIS POINTS partition - ILA_PARAL(1) = 4 - ! - ! * total number of segments of the global domain - ILA_PARAL(2) = NSEAL - ! DO JSEA=1, NSEAL ILA_PARAL(JSEA+2) = IAPROC + (JSEA-1)*NAPROC ENDDO @@ -492,8 +468,7 @@ SUBROUTINE CPL_OASIS_DEFINE(NDSO,RCV_STR,SND_STR) STOP ! DO JSEA=1,NSEAL - ILA_PARAL(JSEA*2+1) = (IAPROC-1) + (JSEA-1)*NAPROC - ILA_PARAL(JSEA*2+2) = 1 + ILA_PARAL(JSEA+2) = IAPROC + (JSEA-1)*NAPROC END DO ! ENDIF @@ -505,6 +480,8 @@ SUBROUTINE CPL_OASIS_DEFINE(NDSO,RCV_STR,SND_STR) CALL OASIS_ABORT(IL_COMPID, 'CPL_OASIS_DEFINE', 'Problem during oasis_def_partition') ENDIF ! + DEALLOCATE(ILA_PARAL) + ! ! 3. Coupling fields declaration ! ---------------------------------- ILA_SHAPE(:) = (/1, NSEAL, 1, 1 /) diff --git a/model/src/w3odatmd.F90 b/model/src/w3odatmd.F90 index 3a667ebbf..9c9b43e8d 100644 --- a/model/src/w3odatmd.F90 +++ b/model/src/w3odatmd.F90 @@ -328,6 +328,12 @@ MODULE W3ODATMD INTEGER, PARAMETER :: NOEXTR= 2 CHARACTER(LEN=20) :: IDOUT(NOGRP,NGRPP) CHARACTER(LEN=80) :: FNMPRE = './' + + ! SET GLOBAL PATH FOR USER DEFINED OUTPUT, DEFAULT CURRENT PATH + CHARACTER(LEN=256) :: FNMGRD = './' + CHARACTER(LEN=256) :: FNMPNT = './' + CHARACTER(LEN=256) :: FNMRST = './' + !Moved UNDEF to constants and included above !REAL :: UNDEF = -999.9 LOGICAL :: UNIPTS = .FALSE., UPPROC = .FALSE. @@ -1096,6 +1102,11 @@ SUBROUTINE W3DMO2 ( IMOD, NDSE, NDST, NPT ) CHECK_ALLOC_STATUS ( ISTAT ) ! OUTPTS(IMOD)%OUT2%O2INIT = .TRUE. + !Initialize: + OUTPTS(IMOD)%OUT2%IPTINT=0 + OUTPTS(IMOD)%OUT2%PTNME='' + OUTPTS(IMOD)%OUT2%PTLOC=0. + OUTPTS(IMOD)%OUT2%PTIFAC=0. ! #ifdef W3_T WRITE (NDST,9001) diff --git a/model/src/ww3_outf.F90 b/model/src/ww3_outf.F90 index 590518037..02f5efa85 100644 --- a/model/src/ww3_outf.F90 +++ b/model/src/ww3_outf.F90 @@ -170,7 +170,7 @@ PROGRAM W3OUTF HCMAXE, HMAXD, HCMAXD, MSSD, MSCD, WBT, & WNMEAN, TAUA, TAUADIR USE W3ODATMD, ONLY: NDSO, NDSE, NDST, NOGRP, NGRPP, IDOUT, & - UNDEF, FLOGRD, FNMPRE, NOSWLL, NOGE + UNDEF, FLOGRD, FNMPRE, FNMGRD, FNMPNT, FNMRST, NOSWLL, NOGE ! IMPLICIT NONE !/ diff --git a/model/src/ww3_shel.F90 b/model/src/ww3_shel.F90 index 4bb888b48..fcba340ab 100644 --- a/model/src/ww3_shel.F90 +++ b/model/src/ww3_shel.F90 @@ -269,7 +269,7 @@ PROGRAM W3SHEL #endif USE W3ODATMD, ONLY: W3NOUT, W3SETO USE W3ODATMD, ONLY: NAPROC, IAPROC, NAPOUT, NAPERR, NOGRP, & - NGRPP, IDOUT, FNMPRE, IOSTYP, NOTYPE + NGRPP, IDOUT, FNMPRE, FNMGRD, FNMPNT, FNMRST, IOSTYP, NOTYPE USE W3ODATMD, ONLY: FLOGRR, FLOGR, OFILES !/ USE W3FLDSMD @@ -326,6 +326,7 @@ PROGRAM W3SHEL TYPE(NML_INPUT_T) :: NML_INPUT TYPE(NML_OUTPUT_TYPE_T) :: NML_OUTPUT_TYPE TYPE(NML_OUTPUT_DATE_T) :: NML_OUTPUT_DATE + TYPE(NML_OUTPUT_PATH_T) :: NML_OUTPUT_PATH TYPE(NML_HOMOG_COUNT_T) :: NML_HOMOG_COUNT TYPE(NML_HOMOG_INPUT_T), ALLOCATABLE :: NML_HOMOG_INPUT(:) ! @@ -398,6 +399,9 @@ PROGRAM W3SHEL #endif character(len=10) :: jchar integer :: memunit + + LOGICAL :: DIR_EXISTS + INTEGER :: DIR_STATUS ! !/ !/ ------------------------------------------------------------------- / @@ -695,8 +699,8 @@ PROGRAM W3SHEL IF (FLGNML) THEN ! Read namelist CALL W3NMLSHEL (MPI_COMM, NDSI, TRIM(FNMPRE)//'ww3_shel.nml', & - NML_DOMAIN, NML_INPUT, NML_OUTPUT_TYPE, & - NML_OUTPUT_DATE, NML_HOMOG_COUNT, & + NML_DOMAIN, NML_INPUT, NML_OUTPUT_TYPE, & + NML_OUTPUT_DATE, NML_OUTPUT_PATH, NML_HOMOG_COUNT, & NML_HOMOG_INPUT, IERR) ! 2.1 forcing flags @@ -1192,6 +1196,10 @@ PROGRAM W3SHEL ! END IF ! FLHOM + ! USER DEFINED OUTPUT PATH FROM NAMELIST + FNMGRD = NML_OUTPUT_PATH%GRD_OUT + FNMPNT = NML_OUTPUT_PATH%PNT_OUT + FNMRST = NML_OUTPUT_PATH%RST_OUT END IF ! FLGNML @@ -1986,7 +1994,7 @@ PROGRAM W3SHEL #ifdef W3_OASIS , .TRUE., .FALSE., MPI_COMM, TIMEN & #endif - ) + ) ! GOTO 2222 ! diff --git a/smc_docs/SMCG_TKs/G50SMCSRGD.f90 b/smc_docs/SMCG_TKs/G50SMCSRGD.f90 index 8f1b0f325..7373fd5d9 100644 --- a/smc_docs/SMCG_TKs/G50SMCSRGD.f90 +++ b/smc_docs/SMCG_TKs/G50SMCSRGD.f90 @@ -28,7 +28,7 @@ !! J G Li 14 Oct 2010 !! New AngleD program for SMC grid only. !! J G Li 21 Apr 2010 -!! Test Gulf of Mexico area for high coastal waves. +!! Test Gulf of America area for high coastal waves. !! J G Li 4 May 2010 !! Adapted for SMC50 grid global + Arctic test. !! J G Li 26 Oct 2011 @@ -1178,7 +1178,7 @@ SUBROUTINE SPECUUVV CNST2 = 1.0/(0.5 + 5.0/DLat) CNST1 = CNST2*DLon/DLat -! Gulf of Mexico patch to test coastal high waves. JGLi 04May2011 +! Gulf of America patch to test coastal high waves. JGLi 04May2011 ii=NINT(270.0/DLon) jj=NINT( 25.0/DLat) @@ -1194,7 +1194,7 @@ SUBROUTINE SPECUUVV C(i)=SWH0 ENDIF -!! A round patch in Gulf of Mexico same as Arctic one +!! A round patch in Gulf of America same as Arctic one CNST5 = Real( ICE(1,i) - ii )*CNST1*CCLat(kk) CNST6 = Real( kk - jj )*CNST2 CNST4 = CNST5*CNST5 + CNST6*CNST6