Post-processing

Free surface elevation

To compute the free surface elevation, let us first initialize a FreeSurface object:

from capytaine import FreeSurface
fs = FreeSurface(x_range=(-10, 10), nx=10, y_range=(-5, 5), ny=10)

The above code generates a regular free surface mesh of \(10 \times 10\) cells. This object can be used by the solver with a results object to get the free surface elevation:

fs_elevation = solver.get_free_surface_elevation(result, free_surface)

The output is a numpy array storing the free surface elevation in frequency domain as a complex number at each point of the free surface (in the present example an array of shape (10, 10)).

The result object should have been computed with the option keep_details=True. The solver does not need to be the one that computed the result object.

The undisturbed incoming waves (Airy waves) can be computed as follow:

incoming_waves = fs.incoming_waves(DiffractionProblem(omega=1.0, angle=pi/2))

See the examples in the Cookbook for usage in a 3D animation.

Impedance and RAO

The intrinsic impedance can be computed based on the hydrodynamics, hydrostatics, and inertial properties:

import numpy as np
import xarray as xr
from capytaine import BEMSolver
from capytaine.bodies.predefined.spheres import Sphere
from capytaine.post_pro import impedance

f = np.linspace(0.1, 2.0)
omega = 2*np.pi*f
rho_water = 1e3
r = 1

sphere = Sphere(radius=r, ntheta=3, nphi=12, clip_free_surface=True)
sphere.center_of_mass = np.array([0, 0, 0])
sphere.add_all_rigid_body_dofs()

sphere.inertia_matrix = sphere.compute_rigid_body_inertia(rho=rho_water)
sphere.hydrostatic_stiffness = sphere.compute_hydrostatic_stiffness(rho=rho_water)

solver = BEMSolver()
test_matrix = xr.Dataset(coords={
    'rho': rho_water,
    'water_depth': [np.infty],
    'omega': omega,
    'wave_direction': 0,
    'radiating_dof': list(sphere.dofs.keys()),
    })

data = solver.fill_dataset(test_matrix, sphere_fb,
                           hydrostatics=True,
                           mesh=True,
                           wavelength=True,
                           wavenumber=True)

Zi = impedance(data)

Note that we assigned the inertia and stiffness to attributes of body called inertia_matrix and hydrostatic_stiffness. These are the names expected by the fill_dataset and impedance functions to compute the impedance matrix.

By simple extension of incorporating the excitation transfer function response amplitude operator (RAO):

from capytaine.post_pro import rao
rao = rao(data)