Hi
These days, I have been working on implementing wave simulations with SWAVE in FVCOM, including two-way wave–current coupling. Among the available FVCOM test cases, the Inlet test provides some useful clues for this purpose. Although the INPUT file in the Inlet test is very similar to a standard SWAN setup, I have noticed some significant differences.
I have performed wave simulations with WaveWatch III on a global scale to extract the directional wave spectra along the open boundary. In the standard SWAN model, the BOUNDSPEC command is used to define the wave spectra at the open boundary. However, I could not find an equivalent setting in the INPUT file for SWAVE.
My question is: how should the directional wave spectra be prescribed at the open boundary in SWAVE?
Hi,
In general, I would recommend using the same wave model for both the parent and nested domains (e.g., WWIII-to-WWIII or SWAN-to-SWAN). This avoids the need to convert spectral boundary information between different model formats and is usually the most straightforward solution.
For FVCOM, WWIII coupling and nesting have already been implemented. You may find the following repository helpful:
If you would like to use spectra generated by a different wave model (e.g., WWIII) as the boundary condition for SWAVE, then the boundary file will likely need to be generated in the NetCDF format expected by SWAVE. You would need to create the SWAVE nesting file yourself. For reference, below is the header of a SWAVE spectral-density nesting NetCDF file, which should help identify the required variables and dimensions:
netcdf sci_nest {
dimensions:
nele = 68 ;
node = 70 ;
siglay = 45 ;
siglev = 46 ;
three = 3 ;
time = UNLIMITED ; // (1201 currently)
msc = 21 ;
mdc = 36 ;
variables:
int nprocs ;
nprocs:long_name = "number of processors" ;
int partition(nele) ;
partition:long_name = "partition" ;
float x(node) ;
x:long_name = "nodal x-coordinate" ;
x:units = "meters" ;
float y(node) ;
y:long_name = "nodal y-coordinate" ;
y:units = "meters" ;
float lon(node) ;
lon:long_name = "nodal longitude" ;
lon:standard_name = "longitude" ;
lon:units = "degrees_east" ;
float lat(node) ;
lat:long_name = "nodal latitude" ;
lat:standard_name = "latitude" ;
lat:units = "degrees_north" ;
float xc(nele) ;
xc:long_name = "zonal x-coordinate" ;
xc:units = "meters" ;
float yc(nele) ;
yc:long_name = "zonal y-coordinate" ;
yc:units = "meters" ;
float lonc(nele) ;
lonc:long_name = "zonal longitude" ;
lonc:standard_name = "longitude" ;
lonc:units = "degrees_east" ;
float latc(nele) ;
latc:long_name = "zonal latitude" ;
latc:standard_name = "latitude" ;
latc:units = "degrees_north" ;
float siglay(siglay, node) ;
siglay:long_name = "Sigma Layers" ;
siglay:standard_name = "ocean_sigma/general_coordinate" ;
siglay:positive = "up" ;
siglay:valid_min = -1.f ;
siglay:valid_max = 0.f ;
siglay:formula_terms = "sigma: siglay eta: zeta depth: h" ;
float siglev(siglev, node) ;
siglev:long_name = "Sigma Levels" ;
siglev:standard_name = "ocean_sigma/general_coordinate" ;
siglev:positive = "up" ;
siglev:valid_min = -1.f ;
siglev:valid_max = 0.f ;
siglev:formula_terms = "sigma:siglay eta: zeta depth: h" ;
float h(node) ;
h:long_name = "Bathymetry" ;
h:standard_name = "sea_floor_depth_below_geoid" ;
h:units = "m" ;
h:positive = "down" ;
h:grid = "Bathymetry_Mesh" ;
h:coordinates = "x y" ;
h:type = "data" ;
int nv(three, nele) ;
nv:long_name = "nodes surrounding element" ;
float siglay_center(siglay, nele) ;
siglay_center:long_name = "Sigma Layers" ;
siglay_center:standard_name = "ocean_sigma/general_coordinate" ;
siglay_center:positive = "up" ;
siglay_center:valid_min = -1.f ;
siglay_center:valid_max = 0.f ;
siglay_center:formula_terms = "sigma: siglay_center eta: zeta_center depth: h_center" ;
float siglev_center(siglev, nele) ;
siglev_center:long_name = "Sigma Levels" ;
siglev_center:standard_name = "ocean_sigma/general_coordinate" ;
siglev_center:positive = "up" ;
siglev_center:valid_min = -1.f ;
siglev_center:valid_max = 0.f ;
siglev_center:formula_terms = "sigma:siglay_center eta: zeta_center depth: h_center" ;
float h_center(nele) ;
h_center:long_name = "Bathymetry" ;
h_center:standard_name = "sea_floor_depth_below_geoid" ;
h_center:units = "m" ;
h_center:positive = "down" ;
h_center:grid = "grid1 grid3" ;
h_center:coordinates = "latc lonc" ;
h_center:grid_location = "center" ;
int iint(time) ;
iint:long_name = "internal mode iteration number" ;
float time(time) ;
time:long_name = "time" ;
time:units = "days since 1858-11-17 00:00:00" ;
time:format = "modified julian day (MJD)" ;
time:time_zone = "UTC" ;
int Itime(time) ;
Itime:units = "days since 1858-11-17 00:00:00" ;
Itime:format = "modified julian day (MJD)" ;
Itime:time_zone = "UTC" ;
int Itime2(time) ;
Itime2:units = "msec since 00:00:00" ;
Itime2:time_zone = "UTC" ;
float ac2(time, mdc, msc, node) ;
ac2:long_name = "Wave Spectral Density" ;
ac2:units = "m^2/hz^2" ;
ac2:grid = "fvcom_grid" ;
ac2:type = "data" ;
// global attributes:
:title = "FVCOM GOM NECOFS HINDCAST UPDATE" ;
:institution = "School for Marine Science and Technology" ;
:source = "FVCOM_4.4.1" ;
:history = "model started at: 08/07/2026 07:23" ;
:references = "http://fvcom.smast.umassd.edu, http://codfish.smast.umassd.edu" ;
:Conventions = "CF-1.0" ;
:CoordinateSystem = "Cartesian" ;
:CoordinateProjection = "init=nad83:1802" ;
:Tidal_Forcing = "TIDAL ELEVATION FORCING IS OFF!" ;
:River_Forcing = "THERE ARE NO RIVERS IN THIS MODEL" ;
:GroundWater_Forcing = "GROUND WATER FORCING IS OFF!" ;
:Surface_Heat_Forcing = "FVCOM variable surface heat forcing file:\nFILE NAME:wrf_for_xy.nc\nSOURCE:wrf2fvcom version 0.20 (2022-07-11) (Bulk method: COARE 2.6Z)\nMET DATA START DATE:2026-07-07_18:00:00" ;
:Surface_Wind_Forcing = "FVCOM variable surface Wind forcing:\nFILE NAME:wrf_for_xy.nc\nSOURCE:wrf2fvcom version 0.20 (2022-07-11) (Bulk method: COARE 2.6Z)\nMET DATA START DATE:2026-07-07_18:00:00" ;
:Surface_PrecipEvap_Forcing = "FVCOM periodic surface precip forcing:\nFILE NAME:wrf_for_xy.nc\nSOURCE:wrf2fvcom version 0.20 (2022-07-11) (Bulk method: COARE 2.6Z)\nMET DATA START DATE:2026-07-07_18:00:00" ;
}
Many thanks, Dr. Li, for your detailed reply.
Does NELE represent all elements in the model, or only the elements in the vicinity of the open boundary? The same question applies to the node-related parameters. Since we only need AC2 at the nodes along the open boundary, I am confused about why information for all elements and nodes would be required.
The NODE and NELE variables in the nesting file refer to the nesting region, not to all nodes and elements in the entire model domain.