A spectral ocean wave modeling framework.
git clone --recursive https://github.com/wavebitscientific/wavy.git
FC=gfortran make
mkdir build
cd build
FC=gfortran cmake ..
make
ctest
Change the FC
value if building with a different Fortran compiler.
By default, wavy will be built in single precision (32-bit reals).
To build it in double (64-bit reals) or quadruple precision (128-bit reals),
use the -DREAL
argument when invoking cmake
:
FC=gfortran cmake .. -DREAL=64 # for double precision
or:
FC=gfortran cmake .. -DREAL=128 # for quad precision
wavy needs gcc-6.3.0 or later to succesfully build and pass all tests.
If you compiled wavy in wavy/build
, then the module files and the library
are located in wavy/build/include
and wavy/build/lib
, respectively.
For example, if we want to build a simple wavy hello world program from
the base directory, we could do it like this:
gfortran hello.f90 -o hello -Ibuild/include -Lbuild/lib -lwavy
Initialize a omnidirectional spectrum instance in the frequency range from 0.04 to 2 Hz with logarithmic increment of 1.1, in mean water depth of 1000 m:
use mod_spectrum,only:spectrum_type
type(spectrum_type) :: spec
! initialize a spectrum instance
spec = spectrum_type(fmin=0.04,fmax=2.,df=1.1,ndirs=1,depth=1000.)
Same as above, but directional spectrum with 36 directional bins:
spec = spectrum_type(fmin=0.04,fmax=2.,df=1.1,ndirs=36,depth=1000.)
Initialize omnidirectional spectrum with JONSWAP shape at wind speed of 10 m/s, and fetch of 100 km:
use mod_spectrum,only:spectrum_type
use mod_spectral_shapes,only:jonswap
type(spectrum_type) :: spec
! initialize a spectrum instance
spec = spectrum_type(fmin=0.04,fmax=2.,df=1.1,ndirs=1,depth=1000.)
! assign a JONSWAP-shape spectrum to the instance
spec = jonswap(spec % getFrequency(),wspd=10.,fetch=1e5,grav=9.8)
Above examples will work with default precision (REAL32
).
To write code that is always compatible with precision specified at
build time, use mod_precision
module:
use mod_precision,only:rk => realkind
use mod_spectrum,only:spectrum_type
use mod_spectral_shapes,only:jonswap
type(spectrum_type) :: spec
! initialize a spectrum instance
spec = spectrum_type(fmin=0.04_rk,fmax=2._rk,df=1.1_rk,ndirs=1,depth=1000._rk)
! assign a JONSWAP-shape spectrum to the instance
spec = jonswap(spec % getFrequency(),wspd=10._rk,fetch=1e5_rk,grav=9.8_rk)
There are many pre-built diagnostics that can be output from a spectrum
instance, here is a taste of a few:
write(*,*)'Significant wave height [m]: ',spec % significantWaveHeight()
write(*,*)' Mean wave period [s]: ',spec % meanPeriod()
write(*,*)' Mean square slope [-]: ',spec % meanSquareSlope()
write(*,*)' Stokes drift [m/s]: ',spec % stokesDrift([0._rk])
outputs:
Significant wave height [m]: 2.13949418
Mean wave period [s]: 5.20506239
Mean square slope [-]: 2.39831898E-02
Stokes drift [m/s]: 4.87080999E-02
Classes:
Source functions:
Parametric spectra:
Grid projections:
Time integration scheme:
Advection schemes:
Stokes drift:
Parallel execution:
Input/Output:
Full API documentation is available here.
wavy is in early development. Contributors are highly needed, especially for implementing source functions. You can start contributing by opening an issue.