Source code for capytaine.bem.airy_waves
"""Computing the potential and velocity of Airy wave."""
# Copyright (C) 2017-2019 Matthieu Ancellin
# See LICENSE file at <https://github.com/mancellin/capytaine>
import numpy as np
from capytaine.tools.lists_of_points import _normalize_points, _normalize_free_surface_points
[docs]
def airy_waves_potential(points, pb):
"""Compute the potential for Airy waves at a given point (or array of points).
Parameters
----------
points: array of shape (3) or (N x 3)
coordinates of the points in which to evaluate the potential.
pb: DiffractionProblem
problem with the environmental conditions (g, rho, ...) of interest
Returns
-------
array of shape (1) or (N x 1)
The potential
"""
points, output_shape = _normalize_points(points)
x, y, z = points.T
k = pb.wavenumber
h = pb.water_depth
beta = pb.encounter_wave_direction
wbar = x * np.cos(beta) + y * np.sin(beta)
if 0 <= k*h < 20:
cih = np.cosh(k*(z+h))/np.cosh(k*h)
# sih = np.sinh(k*(z+h))/np.cosh(k*h)
else:
cih = np.exp(k*z)
# sih = np.exp(k*z)
phi = -1j*pb.g/pb.omega * cih * np.exp(1j * k * wbar)
return phi.reshape(output_shape)
[docs]
def airy_waves_velocity(points, pb):
"""Compute the fluid velocity for Airy waves at a given point (or array of points).
Parameters
----------
points: array of shape (3) or (N x 3)
coordinates of the points in which to evaluate the potential.
pb: DiffractionProblem
problem with the environmental conditions (g, rho, ...) of interest
Returns
-------
array of shape (3) or (N x 3)
the velocity vectors
"""
points, output_shape = _normalize_points(points)
x, y, z = points.T
k = pb.wavenumber
h = pb.water_depth
beta = pb.encounter_wave_direction
wbar = x * np.cos(beta) + y * np.sin(beta)
if 0 <= k*h < 20:
cih = np.cosh(k*(z+h))/np.cosh(k*h)
sih = np.sinh(k*(z+h))/np.cosh(k*h)
else:
cih = np.exp(k*z)
sih = np.exp(k*z)
v = pb.g*k/pb.omega * \
np.exp(1j * k * wbar) * \
np.array([np.cos(pb.wave_direction) * cih, np.sin(pb.wave_direction) * cih, -1j * sih])
return v.T.reshape((*output_shape, 3))
[docs]
def airy_waves_pressure(points, pb):
return 1j * pb.omega * pb.rho * airy_waves_potential(points, pb)
[docs]
def froude_krylov_force(pb):
return pb.body.integrate_pressure(airy_waves_pressure(pb.body.mesh.faces_centers, pb))
[docs]
def airy_waves_free_surface_elevation(points, pb):
"""Compute the free surface elevation at points of the undisturbed Airy waves
Parameters
----------
points: array of shape (3) or (N × 3) or (2) or (N × 2)
coordinates of the points in which to evaluate the potential.
If only two coordinates are passed, the last one is filled with zeros.
pb: DiffractionProblem
problem with the environmental conditions (g, rho, ...) of interest
Returns
-------
complex-valued array of shape (1,) or (N,)
the free surface elevations
"""
points, output_shape = _normalize_free_surface_points(points)
return 1j * pb.omega / pb.g * airy_waves_potential(points, pb).reshape(output_shape)