This repository is an engineering and research toolchain for steady, two-dimensional, periodic gravity waves of finite amplitude. Its central purpose is to compute the wavelength, free-surface geometry, kinematics, and integral invariants of nonlinear waves in finite depth, optionally in the presence of a prescribed Eulerian current. The core physical model follows the stream-function / Fourier-approximation formulation implementation philosophy of Fenton’s steady-wave program lineage (Rienecker and Fenton, 1981; Fenton and Rienecker, 1982; Fenton, 1988; Fenton, 1990; Fenton, 1999a).
The suite contains a main GUI interactive solver, a monolithic C++ implementation, reusable wavelength APIs, batch table generation tools, multiple surrogate-model builders, Excel/VBA ports, and nomogram generators. The common scientific task behind all of them is the same:
given wave height
$H$ , wave period$T$ , water depth$d$ , and current$U_c$ , determine a dynamically consistent nonlinear wavelength$L$ and, when the full solver is used, reconstruct the entire steady wave field.
Two project-specific explicit approximate formulas are also documented in this manual. The first is the genetically evolved baseline-plus-correction formula. The second is an effective transformed-variable formula, in which modified effective period and effective depth are passed through a linear dispersion solve. Both should be understood as compact approximate surrogates layered on top of physically meaningful wavelength structure rather than as replacements for the fully nonlinear Fourier / stream-function solver.
The project is not a single calculator. It is a layered computational ecosystem composed of a reference fully nonlinear solver and several operational derivatives built around it.
fenton_gui.py and fenton_gui.exe
Main GUI interactive nonlinear-wave application. It runs the Fenton stream-function solver for a no-current case and a current case, then formats an engineering report.
function.py
Standalone wavelength API and CLI. It exposes L(H, T, d, Uc) for reuse by the rest of the toolchain.
fourier.cpp
Single-translation-unit modern C++ replica implementation of Fenton's steady-wave solver. It reads data.dat or CLI input, solves the nonlinear problem, and writes solution.res, surface.res, and flowfield.res.
tables.py
Batch table generator. It builds wavelength tables by repeatedly calling the external Fenton wavelength function.
pade.py
Piecewise Padé/rational surrogate builder. It fits shallow-, intermediate-, and deep-water rational corrections and emits standalone Python and VBA evaluators.
neural.py
Global neural surrogate builder. It selects features, trains a tanh hidden-layer network, and emits standalone Python and VBA evaluators.
genetic.py
Symbolic-regression system. It uses gene expression programming to evolve an explicit correction factor over a linear baseline.
nomogram_plots.py
Nomogram/report generator. It creates printable nomograms for a compact explicit surrogate.
nomogen_plots.py
Nomogen-based nomogram generator. It uses the same surrogate kernel but a different graphics engine and layout logic.
linear.bas
Excel/VBA linear baseline solver. It computes the Doppler-shifted Airy wavelength through Newton iteration.
fenton.bas
Excel/VBA nonlinear Fourier solver. It ports the continuation / Newton / SVD solver into VBA.
pade.bas
Excel/VBA Padé evaluator. It implements the emitted regime-based rational surrogate.
neural.bas
Excel/VBA neural evaluator. It implements the emitted tanh-network surrogate.
genetic.bas
Excel/VBA symbolic-regression evaluator. It implements the explicit GEP formula in Excel.
effective.bas
Excel/VBA effective transformed-variable evaluator. It computes an effective period and an effective depth from
wavelenght.xlsm
Excel workbook front-end. It is the operational spreadsheet wrapper exposing the VBA implementations.
The central physical reference is the Fenton Fourier / stream-function solver. Every other component falls into one of four categories:
- Direct nonlinear solvers:
fenton_gui.py,fourier.cpp,fenton.bas. - Exact or reference callable wavelength kernels:
function.py. - Reduced-order surrogates and explicit approximate formulas:
pade.py,neural.py,genetic.py,genetic.bas,effective.bas, and the other emitted VBA modules. - Presentation and tabulation tools: tables, nomogram generators, and the workbook interface.
The entire suite is based on the canonical problem of a steady progressive surface gravity wave travelling over a horizontal bed in an inviscid, incompressible fluid. The wave is assumed to be two-dimensional and periodic. Surface tension is neglected. The fluid density is constant, and the flow is irrotational unless otherwise stated.
Let
-
$x$ be the horizontal coordinate, -
$y$ be the vertical coordinate, positive upward, -
$y = -d$ be the impermeable flat bed, -
$y = \eta(x,t)$ be the free surface, -
$L$ be the wavelength, -
$H$ be the wave height, -
$k = 2\pi/L$ be the wavenumber, -
$T$ be the wave period, -
$\omega = 2\pi/T$ be the angular frequency.
A steady progressive wave of phase speed
In the frame moving with the wave, the solution becomes time-independent. This moving-frame formulation is essential because the fully nonlinear free-boundary problem then reduces to a steady boundary-value problem rather than an explicitly time-dependent one.
The horizontal and vertical velocities are
where
Because the flow is irrotational,
These conditions imply that both the velocity potential
For infinitesimal-amplitude waves in the absence of current, linear theory gives the classical dispersion relation
When wave amplitude is no longer negligible, the wavelength is no longer determined by linear dispersion alone. The phase speed, pressure field, crest-trough asymmetry, and free-surface curvature all modify the dynamically consistent wave state. For a given
from a nonlinear theory rather than from the Airy approximation.
The theoretical foundation is the exact inviscid free-surface formulation.
Since the flow is incompressible and irrotational, the velocity potential satisfies
throughout the fluid domain
Equivalently, the stream function
At the flat bed, the normal velocity must be zero:
In terms of the stream function, the bed is a streamline. This is one reason the stream-function formulation is especially attractive: impermeable boundaries are encoded very naturally.
A particle on the free surface remains on the free surface. In Eulerian form,
In the frame moving with speed
This expresses the fact that the free surface is itself a streamline in the moving frame.
Neglecting viscosity and surface tension, the pressure at the free surface is atmospheric and therefore constant. Bernoulli’s equation gives
where
where
This condition is strongly nonlinear because it contains the square of the velocity magnitude evaluated on the unknown boundary
The specified wave height is
This becomes one of the global constraints used to close the algebraic system in stream-function/Fourier implementations.
The wave is periodic with wavelength
and likewise for all flow quantities in the wave frame.
The classical fully nonlinear problem is converted into a time-independent problem by introducing the travelling coordinate
In the moving frame, the unknowns are no longer functions of both
The main unknowns in a steady-wave formulation are then:
- the free-surface profile
$\eta(\xi)$ , - the stream function or velocity potential in the fluid domain,
- the wave speed
$c$ or wavelength$L$ when the period is prescribed, - the Bernoulli constant,
- the Fourier or stream-function coefficients describing the field.
If
In a current-inclusive setting, care is required because several velocity measures coexist:
-
phase speed
$c$ , -
Eulerian current
$U_c$ , - relative speed in the wave frame,
- mass transport velocity or Stokes drift diagnostics.
The codebase explicitly manages this distinction, especially in fenton_gui.py, function.py, and fourier.cpp.
The modern fully nonlinear steady-wave solver in this suite is best understood through the stream function.
For a two-dimensional incompressible flow, define the stream function
This automatically satisfies continuity. Irrotationality then implies that
Because the bed is impermeable, it is a streamline. In the moving frame, the free surface is also a streamline by the kinematic boundary condition. Thus one may choose constants such that
or an equivalent pair depending on normalization. Here
This is one of the key simplifications of the stream-function method: the kinematic condition is built into the representation through the choice of streamlines.
A Fourier-like basis is selected to satisfy Laplace’s equation and the bed boundary condition exactly. The free surface is then determined by enforcing the surface streamline condition and Bernoulli condition at discrete collocation points. A standard representation is of the form
or a closely related equivalent normalization.
The exact coefficient names and scaling can differ between texts and codes, but the operational structure is the same:
- the vertical basis uses hyperbolic functions so that Laplace’s equation is satisfied exactly,
- the horizontal dependence uses trigonometric modes to enforce periodicity,
- the bed condition is satisfied identically,
- the free-surface conditions are imposed numerically.
The associated velocities become
These formulas are the backbone of the free-surface evaluation and of the velocity diagnostics produced in the implementation.
The free surface is periodic and symmetric about the crest for regular waves. It is therefore natural to write it as a cosine series:
or equivalently in a shifted normalization with
The coefficients
-
$a_1$ is the dominant fundamental mode, -
$a_2$ captures first nonlinear asymmetry, - higher modes encode increasingly sharp crest structure.
In the implementation, the surface unknowns may be represented either directly as coefficient vectors or as discrete free-surface ordinates at collocation points, depending on where one is in the solve/report pipeline.
The free surface is unknown, so the Bernoulli condition and streamline condition must be imposed on an unknown boundary. The standard numerical device is collocation.
Take
or a related crest-to-trough distribution.
At each point
A typical unknown vector contains:
- Fourier coefficients for the stream function,
- Fourier coefficients or ordinates for the surface,
- wavenumber
$k$ or wavelength$L$ , - Bernoulli constant
$R$ , - mean level correction,
- flux/current-related constants,
- one or more normalization parameters.
The exact dimension depends on the implementation and whether period, celerity, flux, or current is treated as prescribed.
The condition that the free surface is a streamline implies
for each collocation point, up to the chosen normalization.
At each collocation point,
Since both
Additional scalar conditions are required, such as:
- the specified wave height,
- the specified period or celerity relation,
- a mean water-level condition,
- flux/current consistency,
- a crest or trough phase normalization.
This closes the system.
The implementation philosophy used in fourier.cpp and echoed in the other solver paths belongs to the family introduced by Rienecker and Fenton. The method is often described as a Fourier approximation method or stream-function method. Its key ideas are:
- Expand the unknown harmonic field in a basis satisfying the bed condition and Laplace equation exactly.
- Represent the free surface by a truncated Fourier series or collocated ordinates.
- Enforce the streamline and Bernoulli conditions at surface collocation points.
- Solve the resulting nonlinear algebraic system by Newton iteration.
- Use continuation in wave height, current, or depth to reach strongly nonlinear states robustly.
This framework is more accurate and more general than low-order Stokes expansions because it is not based on a small-amplitude truncation of the governing equations. Instead, it solves the full nonlinear steady problem within spectral truncation error.
The resulting system can be written compactly as
where
with Jacobian matrix
The Jacobian contains derivatives of hyperbolic/trigonometric series evaluated on the unknown free surface. Terms arise from:
- direct coefficient differentiation,
- surface-elevation dependence in basis evaluation,
- Bernoulli quadratic velocity terms,
- wavelength dependence through
$k$ .
Strong nonlinearity near steep waves can make the Jacobian ill-conditioned.
To improve robustness, the solver often approaches the final target through a sequence of gradually increasing heights or currents. If the target state is
In practice, the Newton correction system may be solved by LU, QR, or SVD-based methods. The implementations in this suite use stabilization strategies that include singular value decomposition in the VBA solver lineage and condition-aware linear algebra in the higher-level Python/C++ stack.
When the Newton step is written as
an SVD factorization
allows one to compute a pseudoinverse-based correction,
with small singular values regularized or truncated if necessary. This materially improves robustness when the system is close to singularity, such as near limiting steepness or under poor initial guesses.
The steady-wave problem is not defined only by surface shape. It is also characterized by integral quantities that appear in Fenton’s papers and in the code output.
The mean flux in the wave frame is related to the stream function difference between the bed and the free surface. In many normalizations,
The exact sign depends on convention. This quantity is central in distinguishing solutions with the same geometric wave shape but different current definitions.
The mean free-surface elevation over a wavelength may be constrained or diagnosed as
Nonlinear periodic waves may exhibit a mean level shift relative to a chosen datum. Codes differ in whether they impose zero mean elevation, zero bed-to-mean depth change, or another normalization.
The total wave energy per unit horizontal area is the sum of potential and kinetic components. A standard decomposition is
with
and
relative to an appropriate reference state.
Momentum flux and related invariants can be derived from the pressure and velocity field. These quantities are relevant in hydrodynamic load and wave-current interaction analyses and appear conceptually across Fenton’s theoretical work.
Nonlinear waves generally induce net mass transport. Distinguishing Eulerian current, Lagrangian drift, and wave frame flux is crucial. The solver and surrounding utilities are built to keep this distinction explicit, especially when the user specifies a current
Even though the suite is devoted to nonlinear waves, linear theory remains operationally important.
Without current,
This can be written in wavelength form as
Deep water,
Shallow water,
These asymptotic limits are used for initialization and for sanity checks throughout the toolchain.
If a uniform current
Equivalently,
This relation is nonlinear in linear.bas and in the initialization logic of the surrogate builders. It is not the full nonlinear solution, but it provides a physically meaningful baseline wavelength
The full Fenton solver does not merely add a small correction to the linear wavelength; it solves the entire steady boundary-value problem. However, the surrogate models in the suite are often built around the idea of a multiplicative or additive correction to a linear baseline.
A generic structure is
where
Typical nondimensional variables used in these surrogates include:
- relative height:
$H/d$ , - relative depth:
$d/L_{lin}$ or$kd$ , - wave steepness:
$H/L_{lin}$ , - dimensionless period:
$T\sqrt{g/d}$ , - current Froude number:
$U_c/\sqrt{gd}$ , - Doppler factor:
$U_cT/L_{lin}$ , - Ursell number:
$Ur = \frac{H L^2}{d^3}$ , usually evaluated with a baseline or nonlinear wavelength.
These features appear explicitly in pade.py, neural.py, and genetic.py.
Low-order Stokes expansions approximate the wave field as a perturbation series in a small steepness parameter. They are useful but limited.
Stokes theories:
- lose accuracy at finite or large steepness,
- become awkward in intermediate and shallow depth,
- require order-by-order derivation,
- are not equally robust in the presence of current,
- may not preserve all nonlinear balances satisfactorily for engineering use.
The Fenton-style method:
- solves the full nonlinear steady free-boundary problem,
- works across shallow, intermediate, and deep depths,
- naturally resolves crest sharpening and higher harmonics,
- supports current/flux formulations,
- provides the full velocity and surface field, not just a low-order approximation.
For this reason the suite uses the Fenton solver as the physical reference and only then derives surrogates for speed.
This is the central theoretical section because fourier.cpp is the most explicit low-level implementation of the solver architecture. The file is effectively a monolithic implementation of the J.D. Fenton steady-wave Fourier / stream-function method and preserves the legacy unknown structure, nonlinear closures, and output logic in a particularly transparent way.
The solver constructs a nonlinear algebraic system whose unknowns represent the free surface and harmonic field. It then applies a continuation / Newton iteration loop. Once converged, it evaluates the solved field to produce:
- summary solution quantities,
- surface coordinates,
- subsurface kinematics,
- Bernoulli diagnostics,
- integral quantities such as current, discharge-related quantities, and wave invariants.
The code embodies the following conceptual decomposition:
- Input normalization and dimensional / nondimensional conversion.
- Initial guess construction, often starting from a linear or weakly nonlinear state.
- Assembly of residual equations for the collocation problem.
- Assembly or update of Jacobian information.
- Linear solve for the Newton correction.
- Continuation step control and convergence tests.
- Post-processing of integral and field quantities.
- Writing solution files.
The code uses three related coordinate systems.
with:
-
$x$ positive in the direction of propagation, -
$y$ positive upward, - bed at
$y=0$ in the finite-depth implementation, - mean free surface at
$y=d$ .
Thus:
- mean free surface is at
$y'=0$ , - bed is at
$y'=-d$ .
The nonlinear system is written in
Hence one wavelength corresponds to
and for finite depth the bed is located at
This coordinate choice is the reason the code repeatedly uses the quantity
In the travelling frame the wave is steady. If the laboratory-frame velocities are
In the stream-function formulation used by the code, the nondimensional travelling-frame velocities satisfy
which is the standard Fenton stream-function formulation. Because the flow is incompressible and irrotational, the stream function is harmonic:
A velocity potential
and the Cauchy-Riemann relations become
Let the free surface be written as
Then the finite-depth boundary conditions are:
Here:
-
$q$ is the streamline constant associated with the discharge in the travelling frame, -
$R$ is the Bernoulli constant in the solver nondimensionalisation.
For deep water, the bed condition is replaced by exponential decay as
The finite-depth stream-function representation can be written in a standard bed-based form as
where:
-
$k=2\pi/\lambda$ is the wavenumber, -
$\bar U$ is the mean travelling-frame speed, -
$B_j$ are Fourier coefficients, -
$N$ is the truncation order.
Because the implementation works in the shifted vertical coordinate
the hyperbolic basis is rewritten using
Define the finite-depth basis function
Then the solver evaluates the harmonic structure in terms of
so that
which is exactly the exponential vertical basis used in the deep-water branch.
The nonlinear solution uses a truncated spectral representation. Let the stream-function basis coefficients be
The free surface can be represented by a cosine series of the form
or equivalently through collocated nodal ordinates
The code uses a legacy 1-based unknown vector
A convenient interpretation of the leading scalar unknowns is:
Then:
-
$z_{10+m}$ , with$m=0,\dots,N$ , stores the collocated values of$k\eta_m$ , - the remaining entries store the Fourier coefficients
$B_j$ .
This interpretation is important because it explains how the code couples wavelength, current, free-surface elevation, and harmonic coefficients in a single nonlinear solve.
The code distinguishes between two mean-current definitions:
- Eulerian mean current
$\bar u_1$ , - Stokes / mass-transport current
$\bar u_2$ .
The travelling-frame mean speed
The discharge-related current is related to the mean discharge
This distinction matters because a period-specified problem with current is not fully defined until one decides which mean-current measure is being prescribed.
The code exploits crest-trough symmetry and solves only over half a wavelength, with collocation points
At each collocation point the residual vector contains two principal classes of equations.
In the internal shifted-coordinate implementation this is assembled using the equivalent constant combination involving
in solver nondimensional form. Because the code explicitly carries the travelling-frame mean speed, the relative horizontal velocity is represented through
where
The nonlinear system is closed by additional global constraints. These include:
or, in
If wavelength is specified, the closure is equivalent to prescribing
so that
If period is specified, then
but now
One additional scalar equation connects the selected current criterion to the unknowns
Differentiating the residual equations produces Jacobian contributions such as
and
Because
one obtains terms like
This dense coupling is one reason the algebra becomes stiff and ill-conditioned near steep or long waves.
The nonlinear system is solved by Newton iteration:
The code uses an SVD-based dense solve to stabilize the Newton correction. In abstract form,
so that a pseudoinverse-like step may be written as
with small singular values truncated or regularized. This is especially important near limiting waves, long shallow-water states, or strongly adverse currents.
The code can solve a sequence of increasing wave heights and extrapolate the unknowns between steps. This continuation strategy is one of the classic practical devices in Fenton-style solvers because the final target state can be difficult to reach directly for steep waves. In effect, the solver traces a branch of solutions rather than attempting to jump immediately to the final nonlinear state.
The program reports a quantity labelled mean square bed velocity, denoted ub2. In physical terms it is the phase average of the near-bed orbital horizontal velocity relative to the Eulerian mean current:
For a steady travelling wave, averaging over one period is equivalent to phase-averaging over one wavelength.
After convergence, the program evaluates:
-
$\eta(x)$ on a dense grid forsurface.res, -
$u(x,y)$ and$v(x,y)$ on a field grid forflowfield.res, - summary invariants and diagnostic scalars for
solution.res.
The output files therefore derive from the exact same spectral representation used in the solve; they are not separate approximate post-processors.
fourier.cpp is the clearest low-level embodiment of Fenton's full nonlinear hydrodynamic model, ported directly from Fenton's c++ original source code. Even when operational workflows are driven by fenton_gui.py, function.py, or the surrogate tools, the mathematical authority still comes from this Fourier / stream-function framework. For that reason, this chapter anchors the theoretical interpretation of the whole suite.
The Python GUI is the main operational front-end. Although it is a user-facing program, its internal logic is still mathematically structured.
The GUI computes two physically related but distinct problems:
- a nonlinear wave solution without prescribed current,
- a nonlinear wave solution with current
$U_c$ .
This dual presentation is important because it lets the user compare the effect of current on wavelength, celerity, and wave shape diagnostics. The report formatting logic is not superficial; it encodes a hydrodynamic comparison workflow.
The main inputs are:
- wave height
$H$ , - period
$T$ , - water depth
$d$ , - current
$U_c$ , - solver order / number of harmonics,
- numerical tolerances and internal settings,
- report options.
Within the GUI architecture, many displayed quantities are downstream of the computed wavelength. Once
- steepness
$H/L$ , - relative depth
$d/L$ , - wave number
$k=2\pi/L$ , - celerity
$c=L/T$ , - relative current indicators such as
$U_c/c$ and$U_c/\sqrt{gd}$ .
The GUI provides a user-friendly interface translating the nonlinear solution into engineering-readable outputs such as:
- wavelengths,
- celerities,
- regime indicators,
- possibly crest/trough elevations,
- comparison tables,
- textual interpretation.
Thus the code combines mathematical solving with presentation and validation logic.
The GUI and auxiliary utilities rely on a callable external wavelength function. This modularization means the exact nonlinear wavelength logic can be reused in tables, surrogates, and external workflows without repeating the full GUI stack.
function.py is strategically important because it compresses the nonlinear wavelength calculation into a reusable API.
It implements a callable mapping
This is exactly the engineering object the rest of the project needs. Unlike the full solver, which can return the entire wave field, function.py acts as a scalar nonlinear constitutive map from input wave parameters to wavelength.
Once a physically credible nonlinear wavelength function exists, many derivative tools become possible:
- batch tabulation,
- spreadsheet usage,
- surrogate model training,
- Monte Carlo sampling,
- design tables,
- parametric studies.
The script is designed so it can be called directly, for example:
python function.py 3 9 5 1which corresponds to
-
$H = 3$ m, -
$T = 9$ s, -
$d = 5$ m, -
$U_c = 1$ m/s.
The returned value L = 78.8272 m is Fenton's fully nonlinear wavelength associated with those inputs.
tables.py is not just a formatting script. It is an automation layer over the nonlinear wavelength kernel.
It samples the map
over a prescribed grid of input values and writes organized tables. These tables are useful because they provide a simple no-calculations way of obtaining a good estimate of Fenton's exact wavelenght.
By tabulating the exact or reference nonlinear function, the project creates practical design aids. A user can inspect how wavelength varies with:
- increasing height at fixed period and depth,
- increasing depth at fixed height,
- following current or opposing current,
- period changes across depth regimes.
A well-designed table generator may also compute:
These quantities provide immediate physical interpretation.
The Padé module creates a rational approximation to the nonlinear wavelength correction.
A Padé approximant represents a function as a ratio of polynomials:
Compared with an ordinary polynomial, a rational form can often capture curvature, asymptotes, and cross-regime behavior more efficiently.
The script often classifies data by relative depth, such as:
- shallow,
- intermediate,
- deep.
A representative criterion uses
with thresholds like
Separate Padé forms can then be fitted in each regime.
A common operational strategy is
where
The script logic uses physically meaningful engineered features such as:
The feature-selection stage ranks these by correlation or predictive relevance and fits compact rational models accordingly.
The script emits:
- a standalone Python evaluator,
- a VBA evaluator (
pade.bas), - diagnostics,
- fit reports.
Thus the theoretical role of pade.py is to compress the exact nonlinear solver into a portable analytic surrogate.
The neural module provides a universal-function approximation approach to the nonlinear wavelength map.
A single-hidden-layer feedforward network with tanh activation has the form
where:
-
$\mathbf{x}$ is the input feature vector, -
$M$ is the number of hidden neurons, -
$w_{ji}^{(h)}$ are input-to-hidden weights, -
$b_j$ are hidden biases, -
$w_j^{(o)}$ are hidden-to-output weights, -
$b_o$ is the output bias.
The output may represent either
Neural networks are usually trained with scaled inputs and outputs:
or via min-max scaling
The emitted evaluator must therefore reproduce the exact preprocessing constants used in training.
Training minimizes a loss such as mean squared error
or a relative-error variant if wavelength scaling varies significantly across the dataset.
The mapping
neural.py emits a self-contained function.py-style evaluator and a VBA module neural.bas so the trained model can be used without Python ML dependencies.
22. Genetic symbolic-regression theory in genetic.py and project-discovered explicit approximate formulas
The genetic module aims to discover an explicit formula rather than a black-box predictor. In this project it is especially important because it provides one of the two project-specific explicit wavelength surrogates discussed in this chapter, both anchored to physically meaningful wave-dispersion structure.
The goal is not to fit the wavelength with a purely arbitrary expression, but to evolve a symbolic correction to a baseline theory. The generic structure is
or, more abstractly,
where
The genetic model is scientifically appealing because it preserves three desirable properties at once:
- a physical baseline coming from linear wave theory,
- a compact explicit correction learned from nonlinear data,
- direct deployability to spreadsheet, VBA, and lightweight command-line environments.
In practical terms, the baseline is the linear wavelength
The baseline wavelength is obtained from the finite-depth Airy dispersion relation
Once
Equivalently, the baseline can be written as the implicit wavelength equation
This means the symbolic-regression model does not attempt to rediscover dispersion from nothing. Instead, it learns the nonlinear and current-related correction relative to a hydrodynamically meaningful starting point.
Gene expression programming (GEP) evolves populations of encoded symbolic expressions. The algorithm typically includes:
- chromosome initialization,
- fitness evaluation,
- selection,
- mutation,
- recombination,
- elitism,
- repeated generation cycling.
The search therefore explores a large symbolic-expression space while still allowing the final result to be exported as an explicit closed-form formula.
A representative fitness metric is based on mean absolute percentage error:
Other metrics may include RMSE, percentile error, worst-case error, or composite ranking scores. This is important because symbolic-regression formulas can appear good on average while failing in the tails of the parameter domain.
For engineering workflows, an explicit formula has several advantages:
- transparency,
- direct embedding in reports and spreadsheets,
- no hidden weights,
- no iterative nonlinear solve at runtime beyond the baseline dispersion solve,
- easier auditing and independent checking.
The trade-off is that uniformly small error over a broad nonlinear domain is difficult to achieve with a compact explicit expression.
The symbolic-regression workflow uses a set of engineered nondimensional features constructed from the physical variables and the baseline wavelength. A representative set is:
with
and also
The exact active subset depends on the evolved symbolic expression, but these variables capture relative depth, steepness, Ursell nonlinearity, current Froude-like intensity, and Doppler-type effects.
This project contains two project-specific explicit approximate wavelength formulas derived from the nonlinear-wave dataset and operationalized in the toolchain.
A particularly important result obtained in this project is the following explicit genetic evolutionary wavelength formula:
Here:
-
$L_{\text{genetic}}$ is the wavelength predicted by the project-specific symbolic-regression model, -
$L_{\text{lin}}$ is the baseline linear wavelength, -
$H$ is wave height, -
$T$ is wave period, -
$d$ is water depth, -
$U_c$ is current velocity, -
$g$ is gravitational acceleration.
A second project-specific explicit approximate formula used in this project is the effective transformed-variable formulation:
and the wavelength is then obtained from a linear finite-depth dispersion solve using these transformed variables:
where
The two discovered formulas have different mathematical architectures.
The genetic formula applies an explicit multiplicative correction to the linear baseline:
with
The effective formula modifies the inputs to dispersion rather than the wavelength directly:
with
The resulting wavelength is
In short, the genetic formula corrects wavelength directly, whereas the effective formula corrects the variables entering the linear dispersion relation.
The genetic formula is a direct nonlinear correction to
This distinction is the key conceptual separation between the two project formulas:
genetic.bas= baseline wavelength times explicit correction,effective.bas= transformed inputs followed by linear dispersion.
In the genetic formula, the dominant quantities are the baseline wavelength
In the effective formula, wave height and depth enter through
while current modifies both transformed variables through the terms proportional to
Both discovered formulas are operationally simple.
For the genetic formula:
- solve the standard linear dispersion relation for
$L_{\text{lin}}$ , - evaluate the explicit correction factor
$M$ , - compute
$L_{\text{genetic}} = L_{\text{lin}} M$ .
For the effective formula:
- compute
$T_{\text{eff}}$ , - compute
$d_{\text{eff}}$ , - solve the linear finite-depth dispersion relation with those transformed variables.
Neither formula requires the full continuation / Newton / SVD machinery of the exact Fenton solver.
The genetic formula contains logarithms and rational denominators. Therefore
requires
must remain away from zero. The argument
must also remain positive.
The effective formula contains nested square roots, so its raw mathematical form requires
and the transformed period must remain non-zero:
For spreadsheet robustness, effective.bas applies small numerical guards before solving the transformed linear dispersion relation.
These formulas matter because they provide two distinct explicit surrogate philosophies derived within the project:
- a direct baseline-correction formula (
genetic.bas), - a transformed-variable linear-dispersion formula (
effective.bas).
They are compact enough for VBA and spreadsheet deployment while remaining tied to physically meaningful wavelength structure.
The workbook implements both formulas directly:
-
genetic.basevaluates the symbolic-regression correction over$L_{\text{lin}}$ , -
effective.basevaluates$T_{\text{eff}}$ and$d_{\text{eff}}$ , then solves the linear dispersion relation.
This makes both formulas immediately usable in engineering spreadsheet workflows.
The two discovered formulas should be treated as fast explicit surrogates, not as replacements for the fully nonlinear Fourier / stream-function solver.
- Use
genetic.baswhen a direct explicit correction to the baseline wavelength is preferred. - Use
effective.baswhen a transformed-variable linear-dispersion structure is preferred. - Use the full Fenton solver when the nonlinear wave field itself, not only wavelength, is required.
Nomograms provide a graphical computational device that approximates the function
A nomogram arranges one or more scales such that a straightedge alignment or chart lookup approximates a multivariable functional relation. If the surrogate is simple enough,
or in reduced feature form
then the variables can be represented graphically.
They are useful when:
- no computation environment is available,
- quick field checks are needed,
- documentation benefits from visual design aids,
- one wants a compact engineering overview of parameter sensitivity.
nomogram_plots.pybuilds the plotting and report side directly.nomogen_plots.pyintegrates with a nomogram-generation engine and layout logic.
Both depend on a compact surrogate rather than the full Newton-based solver.
The workbook layer is operationally important because many engineering workflows still rely on Excel.
This module solves the linear Doppler-shifted dispersion relation. In terms of wavenumber,
A Newton iteration updates
The derivative is
Then
This module is the baseline initializer and sanity-check engine.
This is the VBA translation of Fenton's nonlinear Fourier/stream-function solver. It uses:
- continuation,
- Newton iteration,
- Jacobian assembly,
- SVD stabilization,
- spectral post-processing.
Thus this VBA script it is the spreadsheet exact equivalent of the reference nonlinear solver.
This module evaluates the emitted rational approximations. A representative form is
with regime-dependent coefficient sets.
This module implements the trained network in pure VBA using stored weights and biases, reproducing the preprocessing and the tanh activation exactly.
This module evaluates the explicit symbolic-regression formula found by GEP. It is the most transparent surrogate in the Excel layer.
The workbook is the front-end that exposes those modules to the user. Its main roles are:
- input collection,
- function selection,
- result display,
- spreadsheet integration.
The codebase repeatedly uses nondimensional variables because they improve both physical interpretation and numerical stability.
Using depth
Using wavelength:
A common dimensionless period is
Then linear theory can be written in terms of
These variables appear in approximate dispersion initializers and surrogates.
The Ursell number is
It measures the relative importance of nonlinearity and dispersion and is especially useful in shallow/intermediate depth.
This quantifies the importance of current relative to shallow-water gravity-wave speed.
This is useful as a feature describing the magnitude of current-induced phase advection over one period.
Current affects the problem in two distinct but coupled ways.
A following current increases observed wavelength for fixed period, while an opposing current decreases it. In linearized form this follows from
In the full nonlinear theory, current also changes the steady free-boundary structure through the relative flow field entering Bernoulli’s equation. Thus the effect is not merely a shifted linear wavelength; it is a modified nonlinear state.
A sufficiently adverse current can lead to a failure of physically admissible propagating solutions. In reduced-order tools this may appear as a rejected input where Doppler cancellation makes the wavelength undefined or nonphysical.
A fully nonlinear wave solver is numerically delicate near extreme conditions.
As the wave approaches the limiting steepness, crest curvature sharpens and higher harmonics grow. More modes and stronger continuation control are needed.
Hyperbolic/trigonometric basis terms and current coupling can produce strongly scaled coefficients, increasing conditioning sensitivity.
Opposing current can reduce intrinsic phase speed and produce near-blocking states, which are difficult for both exact and surrogate models.
No single reduced-order model is optimal everywhere. Rational, neural, and symbolic surrogates each trade off transparency, compactness, and accuracy differently.
This section is intentionally operational after the theory sections above.
Run:
python fenton_gui.pyWorkflow:
- Enter wave height
$H$ . - Enter period
$T$ . - Enter depth
$d$ . - Enter current
$U_c$ if requested. - Choose solver/report options.
- Run the nonlinear solve.
- Review the no-current and with-current results.
- Export or inspect the report.
Direct call:
python function.py H T d UcExample:
python function.py 3 9 5 1Programmatic use:
from function import fenton_wavelength
L = fenton_wavelength(3.0, 9.0, 5.0, 1.0)Run:
python tables.pyExpected behavior:
- samples parameter grids,
- calls the external wavelength function,
- writes formatted tables.
Run:
python pade.pyExpected outputs:
- fitted surrogate coefficients,
- diagnostics,
- standalone evaluator,
pade.bas.
Run:
python neural.pyExpected outputs:
- trained network,
- diagnostic reports,
- standalone evaluator,
neural.bas.
Run:
python genetic.pyExpected outputs:
- evolved symbolic formula,
- fit diagnostics,
genetic.bas.
Run:
python nomogram_plots.pyExpected outputs:
- printed or saved nomogram figures,
- compact report graphics.
Run:
python nomogen_plots.pyExpected outputs:
- nomogram layouts using the alternate plotting engine.
Compile, for example:
g++ -std=c++20 fourier.cpp -o fourier.exe -O2 -static ^
-static-libgcc -static-libstdc++Run:
fourier.exeTypical behavior:
- reads inputs,
- solves nonlinear steady wave,
- writes summary solution and field files.
Open wavelenght.xlsm, enable macros, and use the workbook interface to call the desired VBA module.
This is the principal nonlinear output. It should not be confused with the linear Airy wavelength unless the wave is weakly nonlinear.
indicates whether the state is shallow, intermediate, or deep.
indicates wave nonlinearity and crest sharpness tendency.
Comparing with-current and no-current outputs reveals the Doppler and nonlinear current effects.
A concise way to understand the suite is:
- Physics reference: fully nonlinear stream-function/Fourier solver.
- Reusable API: standalone nonlinear wavelength function.
- Acceleration layer: Padé, neural, and genetic surrogates.
- Delivery layer: tables, nomograms, Excel workbook, GUI reports.
The theory is unified even though the software forms differ.
The project stands within a well-established line of nonlinear wave theory:
- Airy theory for infinitesimal waves,
- Stokes perturbation expansions for weakly nonlinear waves,
- cnoidal theory for long shallow-water waves,
- stream-function and Fourier methods for strongly nonlinear finite-depth waves.
The specific methodological lineage behind the main solver is associated with work by Dean, Rienecker, and especially John D. Fenton, whose papers and reviews developed the modern engineering use of fully nonlinear steady periodic wave computation (Rienecker and Fenton, 1981; Fenton and Rienecker, 1982; Fenton, 1988; Fenton, 1990; Fenton, 1999a; Fenton, 1999b).
This is not redundancy. It is an engineering design choice.
- The exact solver provides physical authority.
- The surrogates provide speed and portability.
- The workbook provides accessibility.
- The tables and nomograms provide design usability.
Without the exact solver, the surrogates would have no trustworthy target. Without the surrogates, the exact solver would be too heavy for many batch or spreadsheet workflows.
The outputs are only as valid as the underlying steady-wave assumptions:
- two-dimensionality,
- periodicity,
- inviscid flow,
- irrotationality,
- no breaking,
- no surface tension,
- horizontal bed.
Very steep, breaking, strongly three-dimensional, or rapidly varying bathymetry cases lie outside the strict theory envelope.
The suite is best understood as a complete nonlinear wavelength and steady-wave-field ecosystem centered on the Fenton Fourier/stream-function solution of the exact free-surface problem. fourier.cpp is the clearest implementation of the core mathematics. fenton_gui.py is the main operational interface. function.py exposes the central nonlinear wavelength map. The remaining scripts and VBA modules either accelerate, tabulate, visualize, or operationalize that same physics.
At its heart, the entire project is built around one engineering truth:
once wave nonlinearity and current matter, and the physically consistent wavelength must be obtained from a nonlinear theory or from a surrogate trained against it.
For practical engineering use, the codebase should be read in the following order:
fourier.cppfor the core mathematics and solver architecture.fenton_gui.pyfor the operational report workflow.function.pyfor reusable scalar wavelength evaluation.tables.pyfor tabulation.pade.py,neural.py,genetic.pyfor fast surrogates.- VBA modules and workbook for deployment in Excel.
- nomogram tools for graphical aids.
That order mirrors the hierarchy from physics to deployment.
-
$H$ — wave height, defined as crest elevation minus trough elevation. In engineering terms, it is the total vertical wave amplitude from trough to crest. It is a primary prescribed input across the suite and also enters multiple nondimensional groups such as$H/d$ ,$H/L$ , and the Ursell number. -
$T$ — wave period, i.e. the time required for one full wave cycle to pass a fixed point. It is one of the main prescribed inputs for wavelength prediction and is related to angular frequency by$\omega = 2\pi/T$ . In the exact solver it may be prescribed while wavelength is solved for; in surrogate models it appears both directly and through nondimensional combinations such as$T\sqrt{g/d}$ . -
$d$ — still-water depth, measured vertically from the mean still-water level to the flat impermeable bed. It is the main depth scale in the project and is repeatedly used as the reference length in nondimensionalization. -
$L$ — wavelength, i.e. crest-to-crest horizontal distance of the steady periodic wave. It is the central predicted quantity of the whole project. -
$\lambda$ — alternative symbol for wavelength used in some closure equations and explanatory derivations. In this README it has the same physical meaning as$L$ . -
$k$ — wavenumber, defined by$k = \frac{2\pi}{L}.$ It is the reciprocal spatial scale of the wave and appears naturally in all Fourier, dispersion, and collocation formulations. -
$kd$ — relative depth parameter, defined by$kd = \frac{2\pi d}{L}.$ It is one of the most important regime indicators in wave mechanics, distinguishing shallow-, intermediate-, and deep-water behavior. -
$\omega$ — angular frequency, defined by$\omega = \frac{2\pi}{T}.$ It is the radian-frequency form of the wave period. -
$\tau$ — dimensionless period variable used in the depth-scaled formulation,$\tau = T\sqrt{\frac{g}{d}}.$ In some parts of the documentation it is also used as a period symbol in classical wave-theory notation; the local meaning should therefore be read from context. -
$\sigma$ — dimensionless angular frequency associated with$\tau$ , commonly written as$\sigma = \frac{2\pi}{\tau}.$ It appears in approximate dispersion initializers and theoretical nondimensional forms. -
$\alpha$ — squared dimensionless frequency parameter, introduced as$\alpha = \sigma^2.$ It is a compact helper variable in approximate dispersion relations. -
$c$ — phase speed or celerity, i.e. wave propagation speed,$c = \frac{L}{T}.$ In period-specified nonlinear problems it is not known a priori and must be solved consistently with the free-surface equations. -
$g$ — gravitational acceleration, the standard body-force constant controlling wave dispersion and hydraulic scaling. -
$\rho$ — fluid density, used in energy, momentum, impulse, and radiation-stress expressions.
-
$x$ — horizontal spatial coordinate in the direction of wave propagation. -
$y$ — vertical coordinate, taken positive upward. -
$t$ — time. -
$\xi$ — travelling-wave phase coordinate,$\xi = x - ct,$ used to convert the unsteady physical problem into a steady problem in the moving frame. -
$\eta(x,t)$ — free-surface elevation relative to the still-water level in the physical frame. -
$\eta(\xi)$ — steady free-surface profile in the travelling frame. -
$\eta(x)$ — shorthand for the free-surface elevation when the travelling-frame steady representation is already implied. -
$\eta_m$ — collocated free-surface ordinate at collocation point$m$ . These values are the unknown surface elevations enforced in the nonlinear algebraic system. -
$\eta_{\text{crest}}$ — crest elevation above the still-water level. -
$\eta_{\text{trough}}$ — trough elevation below the still-water level. -
$\eta_c,\eta_t$ — compact output-style notation for crest and trough elevations. -
$\bar{\eta}$ — mean free-surface elevation over one wavelength, used to diagnose or constrain set-up / set-down and mean-level normalization.
-
$\phi$ — velocity potential. For irrotational flow, the velocity field is the gradient of$\phi$ . -
$\psi$ — stream function. In the two-dimensional incompressible formulation it provides an equivalent harmonic representation of the flow and is especially convenient because both the bed and the free surface are streamlines in the moving frame. -
$u$ — horizontal velocity component. -
$v$ — vertical velocity component in the two-dimensional$(x,y)$ formulation. -
$w$ — vertical velocity component in sections or code comments using$(x,z)$ -style notation. It represents the same physical quantity as$v$ , just under a different coordinate-label convention. -
$u_m$ — horizontal velocity evaluated at collocation point$m$ on the free surface. -
$\tilde{u}_m$ — wave-induced part of the horizontal velocity at collocation point$m$ , separated from the travelling-frame mean contribution. -
$u_b$ — instantaneous horizontal velocity at the bed. -
$u_b^2$ orub^2— mean square orbital bed velocity, defined in the output glossary as the phase-averaged square of the oscillatory bed velocity relative to the Eulerian mean current. -
$u_{b,\mathrm{rms}}$ orub,rms— root-mean-square orbital bed velocity,$u_{b,\mathrm{rms}} = \sqrt{u_b^2}.$ -
$u_{\text{surf,max}}$ orusurf,max— maximum horizontal velocity at the free surface, obtained by scanning phase over one wave cycle. -
$u_{\text{bed,max}}$ orubed,max— maximum horizontal velocity at the bed, obtained by scanning phase over one wave cycle. -
$a_{x,\max}$ ora_x,max— maximum horizontal acceleration magnitude, typically based on the convective or total derivative of the horizontal velocity.
-
$U_c$ — prescribed Eulerian ambient current velocity used throughout the project. It is aligned with the direction of propagation and is the current variable appearing in linear, nonlinear, and surrogate formulations. -
$\bar{u}_1$ — Eulerian mean current in the exact-solver notation. It is related to the travelling-frame mean speed by$\bar{u}_1 = c - \bar{U}.$ -
$\bar{u}_2$ — Stokes / mass-transport current or discharge-related current, defined in the solver documentation by$\bar{u}_2 = c - \frac{Q}{d}.$ -
$\bar{U}$ — travelling-frame mean speed. This is a key exact-solver internal variable used to distinguish the wave frame from the prescribed Eulerian current. -
$\hat{U}_c$ — depth-scaled nondimensional current,$\hat{U}_c = \frac{U_c}{\sqrt{gd}}.$ -
$Q$ — volume flux per unit width or depth-integrated discharge in the moving frame. It is one of the most important integral invariants of the steady-wave problem and also acts as the streamline offset between free surface and bed depending on normalization. -
$q$ — wave volume flux correction / streamline-offset variable appearing in the collocation residual structure. In the output glossary it is written as$q = \bar{U}d - Q.$ -
$Fr_c$ — current Froude number,$Fr_c = \frac{U_c}{\sqrt{gd}},$ measuring current strength relative to the shallow-water gravity-wave speed. -
$D$ — Doppler factor,$D = \frac{U_c T}{L},$ used as a compact current-period-wavelength interaction measure.
-
$N$ — Fourier order or number of retained harmonics / collocation intervals, depending on context. It controls spectral resolution. -
$n$ — generic harmonic index in Fourier series. It usually runs from$1$ to$N$ . -
$m$ — collocation-point index. It usually runs from$0$ to$N$ . -
$a_n$ — Fourier coefficients of the free-surface elevation in the cosine-series representation$\eta(x) = \sum_{n=0}^{N} a_n \cos(nkx).$ -
$a_0$ — mean-level correction term in the free-surface cosine series. -
$a_1$ — fundamental free-surface harmonic coefficient. -
$a_2$ — first nonlinear correction harmonic of the free surface. -
$b_n$ — stream-function Fourier coefficients in the theoretical stream-function representation. -
$B$ — constant background term in the stream-function representation$\psi(x,y) = By + \sum_{n=1}^{N}\cdots$ It represents the linear-in-y part of the stream function. -
$B_j$ — implementation-level Fourier / harmonic coefficients of the nonlinear solver state vector. In the README these are the exact-solver coefficients stored in the unknown vector and used in collocation residual assembly.
-
$x_m$ — physical-space collocation coordinate used in the general theoretical presentation,$x_m = \frac{m\pi}{Nk}.$ -
$X_m$ — phase-based collocation coordinate used in the implementation-oriented nondimensional presentation,$X_m = \frac{m\pi}{N}.$ It represents the same collocation logic but in a shifted / scaled phase coordinate. -
$\mathbf{z}$ — global nonlinear unknown vector in Newton iteration. It contains all unknowns of the steady-wave problem, such as wavelength or wavenumber, surface ordinates, harmonic coefficients, current-related quantities, and Bernoulli constant. -
$\mathbf{z}^{(m)}$ — current Newton iterate at iteration$m$ . -
$\Delta\mathbf{z}^{(m)}$ — Newton correction vector applied to update the current iterate. -
$\mathbf{F}(\mathbf{z})$ — nonlinear residual vector of the full steady-wave system. The exact solution satisfies$\mathbf{F}(\mathbf{z}) = 0.$ -
$\mathbf{J}$ — Jacobian matrix of the nonlinear residual system. -
$\mathbf{J}_{ij}$ — Jacobian entry,$\mathbf{J}_{ij} = \frac{\partial F_i}{\partial z_j}.$ -
$R_m^{(\psi)}$ — streamline residual at collocation point$m$ ,$R_m^{(\psi)} = \psi(X_m,\eta_m) + q.$ It enforces the fact that the free surface is a streamline. -
$R_m^{(B)}$ — Bernoulli residual at collocation point$m$ , enforcing the dynamic free-surface condition in collocated form. -
$z_7$ — exact-solver state component associated in the README with$z_7 \leftrightarrow \bar{U}\sqrt{\frac{k}{g}}.$ -
$z_8$ — exact-solver state component associated with$z_8 \leftrightarrow \bar{U},kd - q.$ -
$z_9$ — exact-solver state component associated with the Bernoulli constant$R$ . -
$z_{10+m}$ — exact-solver state entries storing the collocated free-surface values$k\eta_m$ .
-
$R$ — Bernoulli constant in the moving-frame steady free-surface condition. It plays the role of a total-head constant and is one of the key scalar unknowns of the nonlinear wave problem. -
$r$ — reduced Bernoulli constant, defined in the output glossary as$r = R - gd.$ It is a shifted form of$R$ used for interpretation and reporting. -
$B(t)$ — time-dependent Bernoulli integration function appearing in the unsteady potential-flow Bernoulli equation before transforming to the steady moving frame. -
$C(t)$ — time-only integration function in the unsteady Bernoulli equation, removable by a redefinition of the potential in standard irrotational-flow theory.
-
$E$ — total wave energy density per unit horizontal area. In the exact problem it is the sum of potential and kinetic contributions. -
$E_p$ — potential energy density. -
$E_k$ — kinetic energy density. -
$T$ (hydraulic-output meaning) — kinetic energy density in the project output glossary. This symbol is overloaded with the wave period$T$ ; the surrounding section must therefore be read carefully. -
$V$ — potential energy density in the project output glossary. -
$I$ — wave impulse per unit width or wave momentum integral, used as an integral invariant and also in Stokes-drift-related diagnostics. -
$S$ — momentum flux in the moving frame. -
$S_{xx}$ — radiation stress component in the direction of propagation. -
$F$ (hydraulic-output meaning) — wave power / energy flux. This symbol is distinct from the nonlinear residual vector$\mathbf{F}(\mathbf{z})$ and from the scalar linear-dispersion residual$F(k)$ . -
$C_g$ — group velocity, defined in the project output glossary by$C_g = \frac{F}{E}.$ -
$PE$ — shorthand used in some code comments for potential energy. -
$KE$ — shorthand used in some code comments for kinetic energy. -
$P$ — shorthand used in code comments for power / energy flux.
-
$Ur$ or$U_r$ — Ursell number,$Ur = \frac{HL^2}{d^3},$ a standard measure of the relative importance of nonlinearity and dispersion. -
$H_{\max}$ orHmax— Miche limiting wave height, used as an engineering breaking / stability diagnostic. -
Saturation — breaking index defined conceptually as
$\frac{H}{H_{\max}}.$ Values above unity indicate instability / breaking in the simple Miche-limit interpretation. -
Regime — depth-regime classification, typically based on
$d/L$ , separating shallow, intermediate, and deep-water conditions. -
Asymmetry — velocity asymmetry measure, defined in the project output glossary as a crest-to-trough horizontal-velocity ratio such as
$|u_{\text{crest}}|/|u_{\text{trough}}|$ .
-
$\hat{H}$ — depth-scaled nondimensional wave height,$\hat{H} = \frac{H}{d}.$ -
$\hat{L}$ — depth-scaled nondimensional wavelength,$\hat{L} = \frac{L}{d}.$ -
$\hat{c}$ — depth-scaled nondimensional celerity,$\hat{c} = \frac{c}{\sqrt{gd}}.$ -
$\dfrac{H}{L}$ — wave steepness. -
$\dfrac{d}{L}$ — relative depth. -
$\dfrac{H}{d}$ — relative wave height. -
$\dfrac{\lambda}{d}$ — relative wavelength, used in wavelength-specified closure relations.
-
$F(k)$ — scalar residual of the Doppler-shifted linear dispersion relation inlinear.bas,$F(k) = \left(\frac{2\pi}{T} - kU_c\right)^2 - gk\tanh(kd).$ Its root defines the baseline wavenumber. -
$F'(k)$ — derivative of the scalar dispersion residual, used in Newton iteration for the baseline linear solver. -
$k_n$ — Newton iterate of the wavenumber in the scalar linear solver. -
$k_{n+1}$ — updated wavenumber iterate after one Newton step. -
$\frac{1}{\cosh(kd)}$ — hyperbolic secant appearing in the derivative of the Doppler-shifted dispersion residual.
-
$L_{\text{lin}}$ — baseline linear wavelength, used as the reference wavelength in surrogate formulas. -
$L_{\text{base}}$ — generic baseline wavelength symbol used in rational / Padé surrogate descriptions. -
$\mathcal{L}_{\text{lin}}(\cdot,\cdot)$ — linear finite-depth wavelength operator, i.e. the mapping that returns wavelength by solving the linear dispersion relation for the supplied effective period and depth.
-
$L_{\text{genetic}}$ — wavelength predicted by the project-specific genetic symbolic-regression formula. -
$M$ — multiplicative correction factor applied to the baseline linear wavelength in the genetic formula. -
$t_1,t_2,t_3$ — three explicit sub-terms making up the genetic multiplicative correction$M$ . They respectively represent an exponential current-period effect, a bounded rational current term, and a hyperbolic-tangent compensation term involving relative height and nondimensional period.
-
$T_{\text{eff}}$ — effective transformed period in the project-specific effective formula. It is not a measured period; it is an engineered surrogate variable passed into a linear dispersion solve. -
$d_{\text{eff}}$ — effective transformed depth in the effective formula. Like$T_{\text{eff}}$ , it is an apparent or transformed variable rather than a direct physical measurement. -
$\Delta_T$ — additive correction applied to the physical period such that$T_{\text{eff}} = T + \Delta_T.$ -
$\Delta_d$ — additive correction applied to the physical depth such that$d_{\text{eff}} = d + \Delta_d.$ -
$L_{\text{effective}}$ — wavelength predicted by the project-specific effective transformed-variable formula, obtained by solving the linear dispersion relation with$T_{\text{eff}}$ and$d_{\text{eff}}$ .
-
$p_0,p_1,p_2,\dots$ — numerator coefficients in the rational Padé-style surrogate representation. -
$q_1,q_2,\dots$ — denominator coefficients in the rational Padé-style surrogate representation. -
$x_1,x_2,\dots$ — generic surrogate feature variables entering the rational approximation. These stand for transformed combinations of the physical inputs, not for the physical horizontal coordinate.
-
$\mathbf{U}$ — left singular-vector matrix in the SVD factorization of the Jacobian. -
$\mathbf{\Sigma}$ — diagonal matrix of singular values in the SVD factorization. -
$\mathbf{V}^T$ — transpose of the right singular-vector matrix in the SVD factorization. -
$\mathbf{\Sigma}^{-1}$ — inverse or truncated inverse of the singular-value matrix, used to build the pseudoinverse correction.
Some symbols are intentionally overloaded across different parts of the README:
-
$T$ can mean wave period or, in the hydraulic-output glossary style, kinetic energy density. -
$F$ can mean the nonlinear residual vector$\mathbf{F}(\mathbf{z})$ , the scalar dispersion residual$F(k)$ , or wave power / energy flux. -
$R$ can mean the Bernoulli constant; residuals are therefore written explicitly as$R_m^{(\psi)}$ and$R_m^{(B)}$ to avoid confusion. -
$v$ and$w$ both denote the vertical velocity component, depending on whether the notation follows$(x,y)$ or$(x,z)$ -style conventions.
In all such cases, the local section context governs the intended meaning.
-
Fenton, J. D. (1999). Numerical methods for nonlinear waves. In P. L.-F. Liu (ed.), Advances in Coastal and Ocean Engineering, Vol. 5, World Scientific, Singapore, pp. 241–324.
Relevance: Review of fully nonlinear wave computation methods (Fourier, BIE, polynomial approximation).
URL: Fenton99Liu-Numerical-methods-for-nonlinear-waves.pdf -
Fenton, J. D. (1999). The cnoidal theory of water waves. In J. B. Herbich (ed.), Developments in Offshore Engineering, Gulf Publishing, Houston, pp. 275–337.
Relevance: Cnoidal-wave theory (finite-depth, long waves) and numerical formulations.
URL: Fenton99Cnoidal-The-cnoidal-theory-of-water-waves.pdf -
Fenton, J. D. & Kennedy, A. B. (1996). Fast methods for computing the shoaling of nonlinear waves. In Proceedings of the 25th International Conference on Coastal Engineering, Vol. 1, Orlando, pp. 1130–1143.
Relevance: Nonlinear wave propagation and shoaling over varying bathymetry.
URL: Fenton96+Kennedy-Fast-methods-for-computing-the-shoaling-of-nonlinear-waves.pdf -
Fenton, J. D. (1995). A numerical cnoidal theory for steady water waves. In Proceedings of the 12th Australasian Coastal and Ocean Engineering Conference, Melbourne, pp. 175–180.
Relevance: Cnoidal-wave theory (finite-depth, long waves) and numerical formulations.
URL: Fenton95-A-numerical-cnoidal-theory-for-steady-water-waves.pdf -
Townsend, M. & Fenton, J. D. (1995). Numerical comparisons of wave analysis methods. In Proceedings of the 12th Australasian Coastal and Ocean Engineering Conference, Melbourne, pp. 169–173.
Relevance: Wave analysis and inversion from pressure measurements; conditioning and method comparison.
URL: Townsend95+Fenton-Numerical-comparisons-of-wave-analysis-methods.pdf -
Kennedy, A. B. & Fenton, J. D. (1995). Simulation of the propagation of surface gravity waves using local polynomial approximation. In Proceedings of the 12th Australasian Coastal and Ocean Engineering Conference, Melbourne, pp. 287–292.
Relevance: Nonlinear wave propagation and shoaling over varying bathymetry.
URL: Kennedy95+Fenton-Simulation-of-the-propagation-of-surface-gravity-waves-using-local-polynomial-approximation.pdf -
Fenton, J. D. (1993). Simulating wave shoaling with boundary integral equations. In Proceedings of the 11th Australasian Conference on Coastal and Ocean Engineering, Townsville, pp. 71–76.
Relevance: Boundary-integral formulation for nonlinear wave transformation, with singularity subtraction.
URL: Fenton93-Simulating-wave-shoaling-with-boundary-integral-equations.pdf -
Fenton, J. D. (1990). Nonlinear wave theories. In B. Le Méhauté & D. M. Hanes (eds.), The Sea: Ocean Engineering Science, Part A, Vol. 9, Wiley, New York, pp. 3–25.
Relevance: Survey and selection guidance: Stokes, cnoidal, stream-function, and related theories.
URL: Fenton90b-Nonlinear-wave-theories.pdf -
Drennan, W. M., Fenton, J. D. & Donelan, M. A. (1990). Numerical simulation of nonlinear wave groups. In Proceedings of the 11th Annual Conference of the Canadian Applied Mathematics Society, Halifax.
Relevance: Relevant to nonlinear and free-surface wave modelling.
URL: Drennan90-Numerical-simulation-of-nonlinear-wave-groups.pdf -
Fenton, J. D. & McKee, W. D. (1990). On calculating the lengths of water waves. Coastal Engineering, 14, 499–513.
Relevance: Wavelength determination for nonlinear waves in finite depth.
URL: Fenton90c+McKee-On-calculating-the-lengths-of-water-waves.pdf -
Fenton, J. D. (1988). The numerical solution of steady water wave problems. Computers and Geosciences, 14, 357–368.
Relevance: Core stream-function / Fourier algorithm for steady, periodic nonlinear waves.
URL: Fenton88-The-numerical-solution-of-steady-water-wave-problems.pdf -
Fenton, J. D. (1986). Polynomial approximation and water waves. In Proceedings of the 20th International Conference on Coastal Engineering, Vol. 1, Taipei, pp. 193–207.
Relevance: Relevant to nonlinear and free-surface wave modelling.
URL: Fenton86-Polynomial-approximation-and-water-waves.pdf -
Fenton, J. D. (1985). A fifth-order Stokes theory for steady waves. Journal of Waterway, Port, Coastal, and Ocean Engineering, 111, 216–234.
Relevance: Closed-form fifth-order Stokes expansion for steady waves in finite depth.
URL: Fenton85d-A-fifth-order-Stokes-theory-for-steady-waves.pdf -
Fenton, J. D. (1983). On the application of steady wave theories. In Proceedings of the 6th Australasian Conference on Coastal and Ocean Engineering, Christchurch, pp. 65–70.
Relevance: Guidance on applicability and limits of steady-wave theories in engineering.
URL: Fenton83-On-the-application-of-steady-wave-theories.pdf -
Fenton, J. D. & Rienecker, M. M. (1982). A Fourier method for solving nonlinear water wave problems. Journal of Fluid Mechanics, 118, 411–443.
Relevance: Fourier-series method for solving fully nonlinear steady water waves.
URL: Fenton82c+Rienecker-A-Fourier-method-for-solving-nonlinear-water-wave-problems.pdf -
Schwartz, L. W. & Fenton, J. D. (1982). Strongly-nonlinear waves. In M. Van Dyke, J. V. Wehausen & J. L. Lumley (eds.), Annual Review of Fluid Mechanics, 14, 39–60.
Relevance: Fundamental properties and approximations for strongly nonlinear wave motion.
URL: Schwartz82-Strongly-nonlinear-waves.pdf -
Rienecker, M. M. & Fenton, J. D. (1981). A Fourier approximation method for steady water waves. Journal of Fluid Mechanics, 104, 119–137.
Relevance: Fourier-series method for solving fully nonlinear steady water waves.
URL: Rienecker81+Fenton-A-Fourier-approximation-method-for-steady-water-waves.pdf -
Fenton, J. D. & Rienecker, M. M. (1980). Accurate numerical solutions for nonlinear waves. In Proceedings of the 17th International Conference on Coastal Engineering, Sydney, pp. 50–69.
Relevance: Benchmark accurate numerical solutions for nonlinear wave profiles and kinematics.
URL: Fenton80+Rienecker-Accurate-numerical-solutions-for-nonlinear-waves.pdf -
Fenton, J. D. (1979). A high-order cnoidal wave theory. Journal of Fluid Mechanics, 94, 129–161.
Relevance: Cnoidal-wave theory for finite-depth long waves and associated numerical formulations.
URL: Fenton79-A-high-order-cnoidal-wave-theory.pdf -
Fenton, J. D. & Mills, D. A. (1976). Shoaling waves: numerical solution of exact equations. In D. G. Provis & R. Radok (eds.), Proceedings of the IUTAM Symposium on Waves on Water of Variable Depth, Canberra, Springer-Verlag, pp. 93–100.
Relevance: Nonlinear wave propagation and shoaling over varying bathymetry.
URL: Fenton76+Mills-Shoaling-waves-Numerical-solution-of-exact-equations.pdf -
Fenton, J. D. (1972). A ninth-order solution for the solitary wave. Journal of Fluid Mechanics, 53, 257–271.
Relevance: High-order analytic and series solution for solitary waves.
URL: Fenton72-A-ninth-order-solution-for-the-solitary-wave.pdf