Source code for capytaine.post_pro.kochin
"""Computation of the Kochin function."""
# Copyright (C) 2017-2019 Matthieu Ancellin
# See LICENSE file at <https://github.com/mancellin/capytaine>
import logging
import numpy as np
LOG = logging.getLogger(__name__)
[docs]
def compute_kochin(result, theta, ref_point=(0.0, 0.0)):
"""Compute the far field coefficient
Parameters
----------
result: LinearPotentialFlowResult
solved potential flow problem
theta: float or 1-dim array of floats
angles at which the coefficient is computed
ref_point: couple of float, optional
point of reference around which the far field coefficient is computed
Returns
-------
H: same type as theta
values of the Kochin function
"""
if result.forward_speed != 0.0:
LOG.warning("Kochin functions with forward speed have never been validated.")
if result.sources is None:
raise Exception(f"""The values of the sources of {result} cannot been found.
They probably have not been stored by the solver because the option keep_details=True have not been set.
Please re-run the resolution with this option.""")
k = result.wavenumber
h = result.water_depth
# omega_bar.shape = (nb_faces, 2) @ (2, nb_theta)
omega_bar = (result.body.mesh.faces_centers[:, 0:2] - ref_point) @ (np.cos(theta), np.sin(theta))
if 0 <= k*h < 20:
cih = np.cosh(k*(result.body.mesh.faces_centers[:, 2]+h))/np.cosh(k*h)
else:
cih = np.exp(k*result.body.mesh.faces_centers[:, 2])
# cih.shape = (nb_faces,)
# omega_bar.T.shape = (nb_theta, nb_faces)
# result.body.mesh.faces_areas.shape = (nb_faces,)
zs = cih * np.exp(-1j * k * omega_bar.T) * result.body.mesh.faces_areas
# zs.shape = (nb_theta, nb_faces)
# result.sources.shape = (nb_faces,)
return zs @ result.sources/(4*np.pi)