Source code for capytaine.bem.airy_waves

#!/usr/bin/env python
# coding: utf-8
"""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


[docs]def airy_waves_potential(points, pb, convention="Nemoh"): """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 convention: str, optional convention for the incoming wave field. Accepted values: "Nemoh", "WAMIT". Returns ------- array of shape (1) or (N x 1) The potential """ assert convention.lower() in ["nemoh", "wamit"], \ "Convention for wave field should be either Nemoh or WAMIT." x, y, z = points.T k = pb.wavenumber h = pb.depth wbar = x * np.cos(pb.wave_direction) + y * np.sin(pb.wave_direction) 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) if convention.lower() == "wamit": return 1j*pb.g/pb.omega * cih * np.exp(-1j * k * wbar) else: return -1j*pb.g/pb.omega * cih * np.exp(1j * k * wbar)
[docs]def airy_waves_velocity(points, pb, convention="Nemoh"): """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 convention: str, optional convention for the incoming wave field. Accepted values: "Nemoh", "WAMIT". Returns ------- array of shape (3) or (N x 3) the velocity vectors """ assert convention.lower() in ["nemoh", "wamit"], \ "Convention for wave field should be either Nemoh or WAMIT." x, y, z = points.T k = pb.wavenumber h = pb.depth wbar = x * np.cos(pb.wave_direction) + y * np.sin(pb.wave_direction) 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]) if convention.lower() == "wamit": return np.conjugate(v.T) else: return v.T
[docs]def froude_krylov_force(pb, convention="Nemoh"): pressure = 1j * pb.omega * pb.rho * airy_waves_potential(pb.body.mesh.faces_centers, pb, convention=convention) return pb.body.integrate_pressure(pressure)