Skip to content

Commit aaff457

Browse files
authoredFeb 14, 2025··
User-defined path feature development (NOAA-EMC#1369)
1 parent a27375f commit aaff457

8 files changed

+360
-68
lines changed
 

‎model/nml/ww3_shel.nml

+21
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,27 @@
316316

317317

318318

319+
! -------------------------------------------------------------------- !
320+
! Define user-defined output paths via OUTPUT_PATH_NML namelist
321+
!
322+
! * user-defined paths include: raw output out_grd, out_pnt, and restart
323+
! * default path for these are set as './'
324+
! * NOTE: using user-defined path may cause post-processing fail
325+
! user-defined directroy must exist before execution
326+
!
327+
! * namelist must be terminated with /
328+
! * definitions & defaults:
329+
! PATH%GRD_OUT = './'
330+
! PATH%PNT_OUT = './'
331+
! PATH%RST_OUT = './'
332+
! -------------------------------------------------------------------- !
333+
&OUTPUT_PATH_NML
334+
PATH%GRD_OUT = './'
335+
/
336+
337+
338+
339+
319340
! -------------------------------------------------------------------- !
320341
! Define homogeneous input via HOMOG_COUNT_NML and HOMOG_INPUT_NML namelist
321342
!

‎model/src/w3iogomd.F90

+21-11
Original file line numberDiff line numberDiff line change
@@ -2533,7 +2533,7 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
25332533
!/
25342534
USE W3ODATMD, ONLY: NOGRP, NGRPP, IDOUT, UNDEF, NDST, NDSE, &
25352535
FLOGRD, IPASS => IPASS1, WRITE => WRITE1, &
2536-
FNMPRE, NOSWLL, NOEXTR
2536+
FNMPRE, FNMGRD, NOSWLL, NOEXTR
25372537
!/
25382538
USE W3SERVMD, ONLY: EXTCDE
25392539
USE W3ODATMD, only : IAPROC
@@ -2576,6 +2576,10 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
25762576
#endif
25772577
CHARACTER(LEN=30) :: IDTST, TNAME
25782578
CHARACTER(LEN=10) :: VERTST
2579+
2580+
! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
2581+
CHARACTER(LEN=256) :: FNMPRE_LOCAL
2582+
25792583
!/
25802584
!/ ------------------------------------------------------------------- /
25812585
!/
@@ -2624,22 +2628,28 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
26242628
! open file ---------------------------------------------------------- *
26252629
! ( IPASS = 1 )
26262630
!
2631+
IF (LEN_TRIM(FNMGRD) .EQ. 0) THEN
2632+
FNMPRE_LOCAL = FNMPRE
2633+
ELSE
2634+
FNMPRE_LOCAL = FNMGRD
2635+
END IF
2636+
26272637
IF ( IPASS.EQ.1 .AND. OFILES(1) .EQ. 0) THEN
26282638
I = LEN_TRIM(FILEXT)
2629-
J = LEN_TRIM(FNMPRE)
2639+
J = LEN_TRIM(FNMPRE_LOCAL)
26302640
!
26312641
#ifdef W3_T
2632-
WRITE (NDST,9001) FNMPRE(:J)//'out_grd.'//FILEXT(:I)
2642+
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I)
26332643
#endif
26342644
IF ( WRITE ) THEN
2635-
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
2645+
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
26362646
form ='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
26372647
#ifdef W3_ASCII
2638-
OPEN (NDSOA,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I)//'.txt', &
2648+
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I)//'.txt', &
26392649
form ='FORMATTED',ERR=800,IOSTAT=IERR)
26402650
#endif
26412651
ELSE
2642-
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
2652+
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
26432653
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
26442654
END IF
26452655
!
@@ -2709,22 +2719,22 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD &
27092719
!
27102720
IF ( IPASS.GE.1 .AND. OFILES(1) .EQ. 1) THEN
27112721
I = LEN_TRIM(FILEXT)
2712-
J = LEN_TRIM(FNMPRE)
2722+
J = LEN_TRIM(FNMPRE_LOCAL)
27132723
!
27142724
! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
27152725
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
27162726
#ifdef W3_T
2717-
WRITE (NDST,9001) FNMPRE(:J)//TIMETAG//'.out_grd.'//FILEXT(:I)
2727+
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.'//FILEXT(:I)
27182728
#endif
27192729
IF ( WRITE ) THEN
2720-
OPEN (NDSOG,FILE=FNMPRE(:J)//TIMETAG//'.out_grd.' &
2730+
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.' &
27212731
//FILEXT(:I),form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
27222732
#ifdef W3_ASCII
2723-
OPEN (NDSOA,FILE=FNMPRE(:J)//TIMETAG//'.out_grd.' &
2733+
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_grd.' &
27242734
//FILEXT(:I)//'.txt',form='FORMATTED',ERR=800,IOSTAT=IERR)
27252735
#endif
27262736
ELSE
2727-
OPEN (NDSOG,FILE=FNMPRE(:J)//'out_grd.'//FILEXT(:I), &
2737+
OPEN (NDSOG,FILE=FNMPRE_LOCAL(:J)//'out_grd.'//FILEXT(:I), &
27282738
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
27292739
END IF
27302740
!

‎model/src/w3iopomd.F90

+36-15
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,7 @@ SUBROUTINE W3IOPON_READ(IOTST, IMOD_IN, filename, ncerr)
13241324
USE W3GDATMD, ONLY: NTH, NK, NSPEC, FILEXT
13251325
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
13261326
IL, IW, II, PTLOC, PTIFAC, DPO, WAO, WDO, &
1327-
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
1327+
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
13281328
GRDID, ICEO, ICEHO, ICEFO, W3DMO2
13291329
USE W3SERVMD, ONLY: EXTCDE
13301330
#ifdef W3_FLX5
@@ -1598,7 +1598,7 @@ SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr)
15981598
USE W3WDATMD, ONLY: TIME
15991599
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
16001600
PTLOC, PTIFAC, DPO, WAO, WDO, &
1601-
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
1601+
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
16021602
GRDID, ICEO, ICEHO, ICEFO
16031603
USE W3TIMEMD, ONLY: CALTYPE, T2D, U2D, TSUB
16041604
#ifdef W3_FLX5
@@ -1918,7 +1918,7 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
19181918
USE W3ODATMD, ONLY: W3SETO
19191919
USE W3GDATMD, ONLY: FILEXT
19201920
USE W3WDATMD, ONLY: TIME
1921-
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, FNMPRE
1921+
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, FNMPRE, FNMPNT
19221922
USE W3ODATMD, ONLY: OFILES
19231923
USE W3SERVMD, ONLY: EXTCDE
19241924
#ifdef W3_S
@@ -1937,6 +1937,9 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
19371937
character(len = 124) :: filename
19381938
integer :: ncerr
19391939

1940+
! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
1941+
CHARACTER(LEN=256) :: FNMPRE_LOCAL
1942+
19401943
#ifdef W3_S
19411944
CALL STRACE (IENT, 'W3IOPON')
19421945
#endif
@@ -1965,12 +1968,19 @@ SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD)
19651968
END IF
19661969

19671970
! Determine filename.
1971+
IF (LEN_TRIM(FNMPNT) .EQ. 0) THEN
1972+
FNMPRE_LOCAL = FNMPRE
1973+
ELSE
1974+
FNMPRE_LOCAL = FNMPNT
1975+
END IF
1976+
!
1977+
19681978
IF ( OFILES(2) .EQ. 1 ) THEN
19691979
! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
19701980
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
1971-
filename = FNMPRE(:LEN_TRIM(FNMPRE))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
1981+
filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
19721982
ELSE
1973-
filename = FNMPRE(:LEN_TRIM(FNMPRE))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
1983+
filename = FNMPRE_LOCAL(:LEN_TRIM(FNMPRE_LOCAL))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc'
19741984
END IF
19751985

19761986
! Do a read or a write of the point file.
@@ -2158,7 +2168,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
21582168
USE W3WDATMD, ONLY: TIME
21592169
USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, &
21602170
IL, IW, II, PTLOC, PTIFAC, DPO, WAO, WDO, &
2161-
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, &
2171+
ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, FNMPNT, &
21622172
GRDID, ICEO, ICEHO, ICEFO
21632173
#ifdef W3_FLX5
21642174
USE W3ODATMD, ONLY: TAUAO, TAUDO, DAIRO
@@ -2201,6 +2211,10 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
22012211
CHARACTER(LEN=10) :: VERTST
22022212
!/
22032213
CHARACTER(LEN=15) :: TIMETAG
2214+
2215+
! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
2216+
CHARACTER(LEN=256) :: FNMPRE_LOCAL
2217+
22042218
!/
22052219
!/ ------------------------------------------------------------------- /
22062220
!/
@@ -2239,23 +2253,30 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
22392253
!
22402254
! open file ---------------------------------------------------------- *
22412255
!
2256+
IF (LEN_TRIM(FNMPNT) .EQ. 0) THEN
2257+
FNMPRE_LOCAL = FNMPRE
2258+
ELSE
2259+
FNMPRE_LOCAL = FNMPNT
2260+
END IF
2261+
!
2262+
22422263
IF ( IPASS.EQ.1 .AND. OFILES(2) .EQ. 0 ) THEN
22432264

22442265
I = LEN_TRIM(FILEXT)
2245-
J = LEN_TRIM(FNMPRE)
2266+
J = LEN_TRIM(FNMPRE_LOCAL)
22462267

22472268
#ifdef W3_T
2248-
WRITE (NDST,9001) FNMPRE(:J)//'out_pnt.'//FILEXT(:I)
2269+
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I)
22492270
#endif
22502271
IF ( WRITE ) THEN
2251-
OPEN (NDSOP,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I), &
2272+
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I), &
22522273
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
22532274
#ifdef W3_ASCII
2254-
OPEN (NDSOA,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I)//'.txt', &
2275+
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I)//'.txt', &
22552276
form='FORMATTED', ERR=800,IOSTAT=IERR)
22562277
#endif
22572278
ELSE
2258-
OPEN (NDSOP,FILE=FNMPRE(:J)//'out_pnt.'//FILEXT(:I), &
2279+
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//'out_pnt.'//FILEXT(:I), &
22592280
form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR,STATUS='OLD')
22602281
END IF
22612282
!
@@ -2336,20 +2357,20 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD &
23362357
IF ( IPASS.GE.1 .AND. OFILES(2) .EQ. 1) THEN
23372358
!
23382359
I = LEN_TRIM(FILEXT)
2339-
J = LEN_TRIM(FNMPRE)
2360+
J = LEN_TRIM(FNMPRE_LOCAL)
23402361

23412362
! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix
23422363
WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2)
23432364
!
23442365
#ifdef W3_T
2345-
WRITE (NDST,9001) FNMPRE(:J)//TIMETAG//'.out_pnt.'// &
2366+
WRITE (NDST,9001) FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.'// &
23462367
FILEXT(:I)
23472368
#endif
23482369
IF ( WRITE ) THEN
2349-
OPEN (NDSOP,FILE=FNMPRE(:J)//TIMETAG//'.out_pnt.' &
2370+
OPEN (NDSOP,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.' &
23502371
//FILEXT(:I),form='UNFORMATTED', convert=file_endian,ERR=800,IOSTAT=IERR)
23512372
#ifdef W3_ASCII
2352-
OPEN (NDSOA,FILE=FNMPRE(:J)//TIMETAG//'.out_pnt.' &
2373+
OPEN (NDSOA,FILE=FNMPRE_LOCAL(:J)//TIMETAG//'.out_pnt.' &
23532374
//FILEXT(:I)//'.txt',form='FORMATTED', ERR=800,IOSTAT=IERR)
23542375
#endif
23552376
END IF

‎model/src/w3iorsmd.F90

+15-4
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
308308
USE W3IDATMD, ONLY: WXNwrst, WYNwrst
309309
#endif
310310
USE W3ODATMD, ONLY: NDSE, NDST, IAPROC, NAPROC, NAPERR, NAPRST, &
311-
IFILE => IFILE4, FNMPRE, NTPROC, IOSTYP, &
311+
IFILE => IFILE4, FNMPRE, FNMRST, NTPROC, IOSTYP, &
312312
FLOGRR, NOGRP, NGRPP, SCREEN
313313
#ifdef W3_MPI
314314
USE W3ODATMD, ONLY: NRQRS, NBLKRS, RSBLKS, IRQRS, IRQRSS, &
@@ -380,6 +380,10 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
380380
CHARACTER(LEN=26) :: IDTST
381381
CHARACTER(LEN=30) :: TNAME
382382
CHARACTER(LEN=15) :: TIMETAG
383+
384+
! DEFINED A LOCAL FNMPRE TO AVOID CHANGE THE GLOBAL VALUE
385+
CHARACTER(LEN=256) :: FNMPRE_LOCAL
386+
383387
!/
384388
!/ ------------------------------------------------------------------- /
385389
!/
@@ -457,8 +461,15 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
457461
!
458462
! open file ---------------------------------------------------------- *
459463
!
464+
IF (LEN_TRIM(FNMRST) .EQ. 0) THEN
465+
FNMPRE_LOCAL = FNMPRE
466+
ELSE
467+
FNMPRE_LOCAL = FNMRST
468+
END IF
469+
!
470+
460471
I = LEN_TRIM(FILEXT)
461-
J = LEN_TRIM(FNMPRE)
472+
J = LEN_TRIM(FNMPRE_LOCAL)
462473
!
463474
!CHECKPOINT RESTART FILE
464475
ITMP=0
@@ -495,10 +506,10 @@ SUBROUTINE W3IORS ( INXOUT, NDSR, DUMFPI, IMOD, FLRSTRT )
495506

496507
IF ( WRITE ) THEN
497508
IF ( .NOT.IOSFLG .OR. IAPROC.EQ.NAPRST ) &
498-
OPEN (NDSR,FILE=FNMPRE(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
509+
OPEN (NDSR,FILE=FNMPRE_LOCAL(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
499510
ACCESS='STREAM',ERR=800,IOSTAT=IERR)
500511
ELSE
501-
OPEN (NDSR,FILE=FNMPRE(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
512+
OPEN (NDSR,FILE=FNMPRE_LOCAL(:J)//FNAME,form='UNFORMATTED', convert=file_endian, &
502513
ACCESS='STREAM',ERR=800,IOSTAT=IERR, &
503514
STATUS='OLD',ACTION='READ')
504515
END IF

‎model/src/w3nmlshelmd.F90

+248-33
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ MODULE W3NMLSHELMD
129129
TYPE(NML_OUTPUT_TIME_T) :: COUPLING
130130
END TYPE NML_OUTPUT_DATE_T
131131

132+
! NEW TYPE FOR USER DEFINED PATH
133+
TYPE NML_OUTPUT_PATH_T
134+
CHARACTER(LEN=256) :: GRD_OUT
135+
CHARACTER(LEN=256) :: PNT_OUT
136+
CHARACTER(LEN=256) :: RST_OUT
137+
END TYPE NML_OUTPUT_PATH_T
132138

133139
! homogeneous input structure
134140
TYPE NML_HOMOG_COUNT_T
@@ -169,7 +175,7 @@ MODULE W3NMLSHELMD
169175

170176
!/ ------------------------------------------------------------------- /
171177
SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, &
172-
NML_INPUT, NML_OUTPUT_TYPE, NML_OUTPUT_DATE, &
178+
NML_INPUT, NML_OUTPUT_TYPE, NML_OUTPUT_DATE, NML_OUTPUT_PATH, &
173179
NML_HOMOG_COUNT, NML_HOMOG_INPUT, IERR)
174180
!/
175181
!/ +-----------------------------------+
@@ -263,6 +269,7 @@ SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, &
263269
TYPE(NML_INPUT_T), INTENT(INOUT) :: NML_INPUT
264270
TYPE(NML_OUTPUT_TYPE_T), INTENT(INOUT) :: NML_OUTPUT_TYPE
265271
TYPE(NML_OUTPUT_DATE_T), INTENT(INOUT) :: NML_OUTPUT_DATE
272+
TYPE(NML_OUTPUT_PATH_T), INTENT(INOUT) :: NML_OUTPUT_PATH ! USER DEFINED PATH
266273
TYPE(NML_HOMOG_COUNT_T), INTENT(INOUT) :: NML_HOMOG_COUNT
267274
TYPE(NML_HOMOG_INPUT_T), ALLOCATABLE, INTENT(INOUT) :: NML_HOMOG_INPUT(:)
268275
INTEGER, INTENT(OUT) :: IERR
@@ -318,7 +325,11 @@ SUBROUTINE W3NMLSHEL (MPI_COMM, NDSI, INFILE, NML_DOMAIN, &
318325
! read output date namelist
319326
CALL READ_OUTPUT_DATE_NML (NDSI, NML_OUTPUT_DATE)
320327
IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_OUTPUT_DATE_NML (NML_OUTPUT_DATE)
321-
328+
329+
! READ OUTPUT USER DEFINED PATH NAMELIST
330+
CALL READ_OUTPUT_PATH_NML (NDSI, NML_OUTPUT_PATH)
331+
IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_OUTPUT_PATH_NML (NML_OUTPUT_PATH)
332+
322333
! read homogeneous namelist
323334
CALL READ_HOMOGENEOUS_NML (NDSI, NML_HOMOG_COUNT, NML_HOMOG_INPUT)
324335
IF ( IMPROC .EQ. NMPLOG ) CALL REPORT_HOMOGENEOUS_NML (NML_HOMOG_COUNT, NML_HOMOG_INPUT)
@@ -838,6 +849,117 @@ END SUBROUTINE READ_OUTPUT_DATE_NML
838849

839850

840851

852+
!/ ------------------------------------------------------------------- /
853+
854+
SUBROUTINE READ_OUTPUT_PATH_NML (NDSI, NML_OUTPUT_PATH)
855+
!/
856+
!/ +-----------------------------------+
857+
!/ | WAVEWATCH III NOAA/NCEP |
858+
!/ | M. Chen |
859+
!/ | |
860+
!/ | FORTRAN 90 |
861+
!/ | Last update : 13-Jan-2025 |
862+
!/ +-----------------------------------+
863+
!/
864+
!/
865+
! 1. Purpose :
866+
!
867+
!
868+
! 2. Method :
869+
!
870+
! See source term routines.
871+
!
872+
! 3. Parameters :
873+
!
874+
! Parameter list
875+
! ----------------------------------------------------------------
876+
! NDSI Int.
877+
! NML_OUTPUT_PATH Type.
878+
! ----------------------------------------------------------------
879+
!
880+
! 4. Subroutines used :
881+
!
882+
! Name Type Module Description
883+
! ----------------------------------------------------------------
884+
! STRACE Subr. W3SERVMD SUBROUTINE tracing.
885+
! ----------------------------------------------------------------
886+
!
887+
! 5. Called by :
888+
!
889+
! Name Type Module Description
890+
! ----------------------------------------------------------------
891+
! W3NMLSHEL Subr. N/A Namelist configuration routine.
892+
! ----------------------------------------------------------------
893+
!
894+
! 6. Error messages :
895+
!
896+
! None.
897+
!
898+
! 7. Remarks :
899+
!
900+
! 8. Structure :
901+
!
902+
! See source code.
903+
!
904+
! 9. Switches :
905+
!
906+
! !/MPI Uses MPI communications
907+
!
908+
! 10. Source code :
909+
!
910+
!/ ------------------------------------------------------------------- /
911+
912+
USE WMMDATMD, ONLY: MDSE
913+
USE W3SERVMD, ONLY: EXTCDE
914+
#ifdef W3_S
915+
USE W3SERVMD, ONLY: STRACE
916+
#endif
917+
918+
IMPLICIT NONE
919+
920+
INTEGER, INTENT(IN) :: NDSI
921+
TYPE(NML_OUTPUT_PATH_T), INTENT(INOUT) :: NML_OUTPUT_PATH
922+
923+
! LOCALS
924+
INTEGER :: IERR
925+
TYPE(NML_OUTPUT_PATH_T) :: PATH
926+
NAMELIST /OUTPUT_PATH_NML/ PATH
927+
#ifdef W3_S
928+
INTEGER, SAVE :: IENT = 0
929+
#endif
930+
931+
IERR = 0
932+
#ifdef W3_S
933+
CALL STRACE (IENT, 'READ_OUTPUT_PATH_NML')
934+
#endif
935+
936+
! SET DEFAULT VALUES FOR OUTPUT USER DEFINED PATH
937+
PATH%GRD_OUT = './'
938+
PATH%PNT_OUT = './'
939+
PATH%RST_OUT = './'
940+
941+
! READ OUTPUT USER DEFINED PATH NAMELIST
942+
REWIND (NDSI)
943+
READ (NDSI, nml=OUTPUT_PATH_NML, iostat=IERR, iomsg=MSG)
944+
IF (IERR.GT.0) THEN
945+
WRITE (MDSE,'(A,/A)') &
946+
'ERROR: READ_OUTPUT_PATH_NML: namelist read error', &
947+
'ERROR: '//TRIM(MSG)
948+
CALL EXTCDE (8)
949+
END IF
950+
951+
! SAVE NAMELIST
952+
NML_OUTPUT_PATH = PATH
953+
954+
END SUBROUTINE READ_OUTPUT_PATH_NML
955+
956+
!/ ------------------------------------------------------------------- /
957+
958+
959+
960+
961+
962+
841963
!/ ------------------------------------------------------------------- /
842964

843965
SUBROUTINE READ_HOMOGENEOUS_NML (NDSI, NML_HOMOG_COUNT, NML_HOMOG_INPUT)
@@ -1184,9 +1306,9 @@ SUBROUTINE REPORT_INPUT_NML (NML_INPUT)
11841306
WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_DENSITY = ', NML_INPUT%FORCING%MUD_DENSITY
11851307
WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_THICKNESS = ', NML_INPUT%FORCING%MUD_THICKNESS
11861308
WRITE (NDSN,10) TRIM(MSG),'FORCING % MUD_VISCOSITY = ', NML_INPUT%FORCING%MUD_VISCOSITY
1187-
WRITE (NDSN,10) TRIM(MSG),'ASSIM % MEAN = ', NML_INPUT%ASSIM%MEAN
1188-
WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC1D = ', NML_INPUT%ASSIM%SPEC1D
1189-
WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC2D = ', NML_INPUT%ASSIM%SPEC2D
1309+
WRITE (NDSN,10) TRIM(MSG),'ASSIM % MEAN = ', NML_INPUT%ASSIM%MEAN
1310+
WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC1D = ', NML_INPUT%ASSIM%SPEC1D
1311+
WRITE (NDSN,10) TRIM(MSG),'ASSIM % SPEC2D = ', NML_INPUT%ASSIM%SPEC2D
11901312

11911313

11921314
10 FORMAT (A,2X,A,A)
@@ -1279,9 +1401,9 @@ SUBROUTINE REPORT_OUTPUT_TYPE_NML (NML_OUTPUT_TYPE)
12791401

12801402
WRITE (MSG,'(A)') 'OUTPUT TYPE % '
12811403
WRITE (NDSN,'(A)')
1282-
WRITE (NDSN,10) TRIM(MSG),'FIELD % LIST = ', TRIM(NML_OUTPUT_TYPE%FIELD%LIST)
1283-
WRITE (NDSN,10) TRIM(MSG),'POINT % FILE = ', TRIM(NML_OUTPUT_TYPE%POINT%FILE)
1284-
WRITE (NDSN,13) TRIM(MSG),'TRACK % FORMAT = ', NML_OUTPUT_TYPE%TRACK%FORMAT
1404+
WRITE (NDSN,10) TRIM(MSG),'FIELD % LIST = ', TRIM(NML_OUTPUT_TYPE%FIELD%LIST)
1405+
WRITE (NDSN,10) TRIM(MSG),'POINT % FILE = ', TRIM(NML_OUTPUT_TYPE%POINT%FILE)
1406+
WRITE (NDSN,13) TRIM(MSG),'TRACK % FORMAT = ', NML_OUTPUT_TYPE%TRACK%FORMAT
12851407
WRITE (NDSN,11) TRIM(MSG),'PARTITION % X0 = ', NML_OUTPUT_TYPE%PARTITION%X0
12861408
WRITE (NDSN,11) TRIM(MSG),'PARTITION % XN = ', NML_OUTPUT_TYPE%PARTITION%XN
12871409
WRITE (NDSN,11) TRIM(MSG),'PARTITION % NX = ', NML_OUTPUT_TYPE%PARTITION%NX
@@ -1290,11 +1412,11 @@ SUBROUTINE REPORT_OUTPUT_TYPE_NML (NML_OUTPUT_TYPE)
12901412
WRITE (NDSN,11) TRIM(MSG),'PARTITION % NY = ', NML_OUTPUT_TYPE%PARTITION%NY
12911413
WRITE (NDSN,13) TRIM(MSG),'PARTITION % FORMAT = ', NML_OUTPUT_TYPE%PARTITION%FORMAT
12921414
#ifdef W3_COU
1293-
WRITE (NDSN,10) TRIM(MSG),'COUPLING % SENT = ', TRIM(NML_OUTPUT_TYPE%COUPLING%SENT)
1294-
WRITE (NDSN,10) TRIM(MSG),'COUPLING % RECEIVED = ', TRIM(NML_OUTPUT_TYPE%COUPLING%RECEIVED)
1295-
WRITE (NDSN,13) TRIM(MSG),'COUPLING % COUPLET0 = ', NML_OUTPUT_TYPE%COUPLING%COUPLET0
1415+
WRITE (NDSN,10) TRIM(MSG),'COUPLING % SENT = ', TRIM(NML_OUTPUT_TYPE%COUPLING%SENT)
1416+
WRITE (NDSN,10) TRIM(MSG),'COUPLING % RECEIVED = ', TRIM(NML_OUTPUT_TYPE%COUPLING%RECEIVED)
1417+
WRITE (NDSN,13) TRIM(MSG),'COUPLING % COUPLET0 = ', NML_OUTPUT_TYPE%COUPLING%COUPLET0
12961418
#endif
1297-
WRITE (NDSN,10) TRIM(MSG),'RESTART % EXTRA = ', TRIM(NML_OUTPUT_TYPE%RESTART%EXTRA)
1419+
WRITE (NDSN,10) TRIM(MSG),'RESTART % EXTRA = ', TRIM(NML_OUTPUT_TYPE%RESTART%EXTRA)
12981420

12991421
10 FORMAT (A,2X,A,A)
13001422
11 FORMAT (A,2X,A,I8)
@@ -1387,31 +1509,31 @@ SUBROUTINE REPORT_OUTPUT_DATE_NML (NML_OUTPUT_DATE)
13871509

13881510
WRITE (MSG,'(A)') 'OUTPUT DATE MODEL GRID % '
13891511
WRITE (NDSN,'(A)')
1390-
WRITE (NDSN,10) TRIM(MSG),'FIELD % START = ', TRIM(NML_OUTPUT_DATE%FIELD%START)
1391-
WRITE (NDSN,10) TRIM(MSG),'FIELD % STRIDE = ', TRIM(NML_OUTPUT_DATE%FIELD%STRIDE)
1392-
WRITE (NDSN,10) TRIM(MSG),'FIELD % STOP = ', TRIM(NML_OUTPUT_DATE%FIELD%STOP)
1393-
WRITE (NDSN,10) TRIM(MSG),'POINT % START = ', TRIM(NML_OUTPUT_DATE%POINT%START)
1394-
WRITE (NDSN,10) TRIM(MSG),'POINT % STRIDE = ', TRIM(NML_OUTPUT_DATE%POINT%STRIDE)
1395-
WRITE (NDSN,10) TRIM(MSG),'POINT % STOP = ', TRIM(NML_OUTPUT_DATE%POINT%STOP)
1396-
WRITE (NDSN,10) TRIM(MSG),'TRACK % START = ', TRIM(NML_OUTPUT_DATE%TRACK%START)
1397-
WRITE (NDSN,10) TRIM(MSG),'TRACK % STRIDE = ', TRIM(NML_OUTPUT_DATE%TRACK%STRIDE)
1398-
WRITE (NDSN,10) TRIM(MSG),'TRACK % STOP = ', TRIM(NML_OUTPUT_DATE%TRACK%STOP)
1399-
WRITE (NDSN,10) TRIM(MSG),'RESTART % START = ', TRIM(NML_OUTPUT_DATE%RESTART%START)
1400-
WRITE (NDSN,10) TRIM(MSG),'RESTART % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART%STRIDE)
1401-
WRITE (NDSN,10) TRIM(MSG),'RESTART % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART%STOP)
1402-
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % START = ', TRIM(NML_OUTPUT_DATE%RESTART2%START)
1403-
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART2%STRIDE)
1404-
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART2%STOP)
1405-
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % START = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%START)
1406-
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STRIDE = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STRIDE)
1407-
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STOP = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STOP)
1512+
WRITE (NDSN,10) TRIM(MSG),'FIELD % START = ', TRIM(NML_OUTPUT_DATE%FIELD%START)
1513+
WRITE (NDSN,10) TRIM(MSG),'FIELD % STRIDE = ', TRIM(NML_OUTPUT_DATE%FIELD%STRIDE)
1514+
WRITE (NDSN,10) TRIM(MSG),'FIELD % STOP = ', TRIM(NML_OUTPUT_DATE%FIELD%STOP)
1515+
WRITE (NDSN,10) TRIM(MSG),'POINT % START = ', TRIM(NML_OUTPUT_DATE%POINT%START)
1516+
WRITE (NDSN,10) TRIM(MSG),'POINT % STRIDE = ', TRIM(NML_OUTPUT_DATE%POINT%STRIDE)
1517+
WRITE (NDSN,10) TRIM(MSG),'POINT % STOP = ', TRIM(NML_OUTPUT_DATE%POINT%STOP)
1518+
WRITE (NDSN,10) TRIM(MSG),'TRACK % START = ', TRIM(NML_OUTPUT_DATE%TRACK%START)
1519+
WRITE (NDSN,10) TRIM(MSG),'TRACK % STRIDE = ', TRIM(NML_OUTPUT_DATE%TRACK%STRIDE)
1520+
WRITE (NDSN,10) TRIM(MSG),'TRACK % STOP = ', TRIM(NML_OUTPUT_DATE%TRACK%STOP)
1521+
WRITE (NDSN,10) TRIM(MSG),'RESTART % START = ', TRIM(NML_OUTPUT_DATE%RESTART%START)
1522+
WRITE (NDSN,10) TRIM(MSG),'RESTART % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART%STRIDE)
1523+
WRITE (NDSN,10) TRIM(MSG),'RESTART % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART%STOP)
1524+
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % START = ', TRIM(NML_OUTPUT_DATE%RESTART2%START)
1525+
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STRIDE = ', TRIM(NML_OUTPUT_DATE%RESTART2%STRIDE)
1526+
WRITE (NDSN,10) TRIM(MSG),'RESTART2 % STOP = ', TRIM(NML_OUTPUT_DATE%RESTART2%STOP)
1527+
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % START = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%START)
1528+
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STRIDE = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STRIDE)
1529+
WRITE (NDSN,10) TRIM(MSG),'BOUNDARY % STOP = ', TRIM(NML_OUTPUT_DATE%BOUNDARY%STOP)
14081530
WRITE (NDSN,10) TRIM(MSG),'PARTITION % START = ', TRIM(NML_OUTPUT_DATE%PARTITION%START)
14091531
WRITE (NDSN,10) TRIM(MSG),'PARTITION % STRIDE = ', TRIM(NML_OUTPUT_DATE%PARTITION%STRIDE)
14101532
WRITE (NDSN,10) TRIM(MSG),'PARTITION % STOP = ', TRIM(NML_OUTPUT_DATE%PARTITION%STOP)
14111533
#ifdef W3_COU
1412-
WRITE (NDSN,10) TRIM(MSG),'COUPLING % START = ', TRIM(NML_OUTPUT_DATE%COUPLING%START)
1413-
WRITE (NDSN,10) TRIM(MSG),'COUPLING % STRIDE = ', TRIM(NML_OUTPUT_DATE%COUPLING%STRIDE)
1414-
WRITE (NDSN,10) TRIM(MSG),'COUPLING % STOP = ', TRIM(NML_OUTPUT_DATE%COUPLING%STOP)
1534+
WRITE (NDSN,10) TRIM(MSG),'COUPLING % START = ', TRIM(NML_OUTPUT_DATE%COUPLING%START)
1535+
WRITE (NDSN,10) TRIM(MSG),'COUPLING % STRIDE = ', TRIM(NML_OUTPUT_DATE%COUPLING%STRIDE)
1536+
WRITE (NDSN,10) TRIM(MSG),'COUPLING % STOP = ', TRIM(NML_OUTPUT_DATE%COUPLING%STOP)
14151537
#endif
14161538

14171539

@@ -1426,6 +1548,99 @@ END SUBROUTINE REPORT_OUTPUT_DATE_NML
14261548

14271549

14281550

1551+
!/ ------------------------------------------------------------------- /
1552+
1553+
SUBROUTINE REPORT_OUTPUT_PATH_NML (NML_OUTPUT_PATH)
1554+
!/
1555+
!/ +-----------------------------------+
1556+
!/ | WAVEWATCH III NOAA/NCEP |
1557+
!/ | M. Chen |
1558+
!/ | |
1559+
!/ | FORTRAN 90 |
1560+
!/ | Last update : 13-Jan-2025 |
1561+
!/ +-----------------------------------+
1562+
!/
1563+
!/
1564+
! 1. Purpose :
1565+
!
1566+
!
1567+
! 2. Method :
1568+
!
1569+
! See source term routines.
1570+
!
1571+
! 3. Parameters :
1572+
!
1573+
! Parameter list
1574+
! ----------------------------------------------------------------
1575+
! NML_OUTPUT_PATH Type.
1576+
! ----------------------------------------------------------------
1577+
!
1578+
! 4. Subroutines used :
1579+
!
1580+
! Name Type Module Description
1581+
! ----------------------------------------------------------------
1582+
! STRACE Subr. W3SERVMD SUBROUTINE tracing.
1583+
! ----------------------------------------------------------------
1584+
!
1585+
! 5. Called by :
1586+
!
1587+
! Name Type Module Description
1588+
! ----------------------------------------------------------------
1589+
! W3NMLSHEL Subr. N/A Namelist configuration routine.
1590+
! ----------------------------------------------------------------
1591+
!
1592+
! 6. Error messages :
1593+
!
1594+
! None.
1595+
!
1596+
! 7. Remarks :
1597+
!
1598+
! 8. Structure :
1599+
!
1600+
! See source code.
1601+
!
1602+
! 9. Switches :
1603+
!
1604+
! !/MPI Uses MPI communications
1605+
!
1606+
! 10. Source code :
1607+
!
1608+
!/ ------------------------------------------------------------------- /
1609+
1610+
#ifdef W3_S
1611+
USE W3SERVMD, ONLY: STRACE
1612+
#endif
1613+
1614+
IMPLICIT NONE
1615+
1616+
TYPE(NML_OUTPUT_PATH_T), INTENT(IN) :: NML_OUTPUT_PATH
1617+
1618+
! LOCALS
1619+
#ifdef W3_S
1620+
INTEGER, SAVE :: IENT = 0
1621+
#endif
1622+
1623+
#ifdef W3_S
1624+
CALL STRACE (IENT, 'REPORT_OUTPUT_PATH_NML')
1625+
#endif
1626+
1627+
WRITE (MSG,'(A)') 'OUTPUT PATH % '
1628+
WRITE (NDSN,'(A)')
1629+
WRITE (NDSN,10) TRIM(MSG),'GRD_OUT = ', TRIM(NML_OUTPUT_PATH%GRD_OUT)
1630+
WRITE (NDSN,10) TRIM(MSG),'PNT_OUT = ', TRIM(NML_OUTPUT_PATH%PNT_OUT)
1631+
WRITE (NDSN,10) TRIM(MSG),'RST_OUT = ', TRIM(NML_OUTPUT_PATH%RST_OUT)
1632+
1633+
10 FORMAT (A,2X,A,A)
1634+
1635+
END SUBROUTINE REPORT_OUTPUT_PATH_NML
1636+
1637+
!/ ------------------------------------------------------------------- /
1638+
1639+
1640+
1641+
1642+
1643+
14291644
!/ ------------------------------------------------------------------- /
14301645

14311646
SUBROUTINE REPORT_HOMOGENEOUS_NML (NML_HOMOG_COUNT, NML_HOMOG_INPUT)

‎model/src/w3odatmd.F90

+6
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,12 @@ MODULE W3ODATMD
328328
INTEGER, PARAMETER :: NOEXTR= 2
329329
CHARACTER(LEN=20) :: IDOUT(NOGRP,NGRPP)
330330
CHARACTER(LEN=80) :: FNMPRE = './'
331+
332+
! SET GLOBAL PATH FOR USER DEFINED OUTPUT, DEFAULT CURRENT PATH
333+
CHARACTER(LEN=256) :: FNMGRD = './'
334+
CHARACTER(LEN=256) :: FNMPNT = './'
335+
CHARACTER(LEN=256) :: FNMRST = './'
336+
331337
!Moved UNDEF to constants and included above
332338
!REAL :: UNDEF = -999.9
333339
LOGICAL :: UNIPTS = .FALSE., UPPROC = .FALSE.

‎model/src/ww3_outf.F90

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ PROGRAM W3OUTF
170170
HCMAXE, HMAXD, HCMAXD, MSSD, MSCD, WBT, &
171171
WNMEAN, TAUA, TAUADIR
172172
USE W3ODATMD, ONLY: NDSO, NDSE, NDST, NOGRP, NGRPP, IDOUT, &
173-
UNDEF, FLOGRD, FNMPRE, NOSWLL, NOGE
173+
UNDEF, FLOGRD, FNMPRE, FNMGRD, FNMPNT, FNMRST, NOSWLL, NOGE
174174
!
175175
IMPLICIT NONE
176176
!/

‎model/src/ww3_shel.F90

+12-4
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ PROGRAM W3SHEL
269269
#endif
270270
USE W3ODATMD, ONLY: W3NOUT, W3SETO
271271
USE W3ODATMD, ONLY: NAPROC, IAPROC, NAPOUT, NAPERR, NOGRP, &
272-
NGRPP, IDOUT, FNMPRE, IOSTYP, NOTYPE
272+
NGRPP, IDOUT, FNMPRE, FNMGRD, FNMPNT, FNMRST, IOSTYP, NOTYPE
273273
USE W3ODATMD, ONLY: FLOGRR, FLOGR, OFILES
274274
!/
275275
USE W3FLDSMD
@@ -326,6 +326,7 @@ PROGRAM W3SHEL
326326
TYPE(NML_INPUT_T) :: NML_INPUT
327327
TYPE(NML_OUTPUT_TYPE_T) :: NML_OUTPUT_TYPE
328328
TYPE(NML_OUTPUT_DATE_T) :: NML_OUTPUT_DATE
329+
TYPE(NML_OUTPUT_PATH_T) :: NML_OUTPUT_PATH
329330
TYPE(NML_HOMOG_COUNT_T) :: NML_HOMOG_COUNT
330331
TYPE(NML_HOMOG_INPUT_T), ALLOCATABLE :: NML_HOMOG_INPUT(:)
331332
!
@@ -398,6 +399,9 @@ PROGRAM W3SHEL
398399
#endif
399400
character(len=10) :: jchar
400401
integer :: memunit
402+
403+
LOGICAL :: DIR_EXISTS
404+
INTEGER :: DIR_STATUS
401405
!
402406
!/
403407
!/ ------------------------------------------------------------------- /
@@ -695,8 +699,8 @@ PROGRAM W3SHEL
695699
IF (FLGNML) THEN
696700
! Read namelist
697701
CALL W3NMLSHEL (MPI_COMM, NDSI, TRIM(FNMPRE)//'ww3_shel.nml', &
698-
NML_DOMAIN, NML_INPUT, NML_OUTPUT_TYPE, &
699-
NML_OUTPUT_DATE, NML_HOMOG_COUNT, &
702+
NML_DOMAIN, NML_INPUT, NML_OUTPUT_TYPE, &
703+
NML_OUTPUT_DATE, NML_OUTPUT_PATH, NML_HOMOG_COUNT, &
700704
NML_HOMOG_INPUT, IERR)
701705

702706
! 2.1 forcing flags
@@ -1192,6 +1196,10 @@ PROGRAM W3SHEL
11921196
!
11931197
END IF ! FLHOM
11941198

1199+
! USER DEFINED OUTPUT PATH FROM NAMELIST
1200+
FNMGRD = NML_OUTPUT_PATH%GRD_OUT
1201+
FNMPNT = NML_OUTPUT_PATH%PNT_OUT
1202+
FNMRST = NML_OUTPUT_PATH%RST_OUT
11951203

11961204
END IF ! FLGNML
11971205

@@ -1986,7 +1994,7 @@ PROGRAM W3SHEL
19861994
#ifdef W3_OASIS
19871995
, .TRUE., .FALSE., MPI_COMM, TIMEN &
19881996
#endif
1989-
)
1997+
)
19901998
!
19911999
GOTO 2222
19922000
!

0 commit comments

Comments
 (0)
Please sign in to comment.