def kochin_data_array( results: Sequence[LinearPotentialFlowResult], theta_range: Sequence[float], **kwargs, ) -> xr.Dataset: """Compute the Kochin function for a list of results and fills a dataset. .. seealso:: :meth:`~capytaine.post_pro.kochin.compute_kochin` The present function is just a wrapper around :code:`compute_kochin`. """ records = pd.DataFrame([ dict(**result._asdict(), theta=theta, kochin=kochin) for result in results for theta, kochin in zip( theta_range.data, compute_kochin(result, theta_range, **kwargs)) ]) kochin_data = {} if 'wave_direction' in records.columns: diffraction = _dataset_from_dataframe( records[~records['wave_direction'].isnull()], ['kochin'], dimensions=['omega', 'wave_direction', 'theta'], optional_dims=['g', 'rho', 'body_name', 'water_depth']) kochin_data['kochin_diffraction'] = diffraction['kochin'] if 'radiating_dof' in records.columns: radiation = _dataset_from_dataframe( records[~records['radiating_dof'].isnull()], variables=['kochin'], dimensions=['omega', 'radiating_dof', 'theta'], optional_dims=['g', 'rho', 'body_name', 'water_depth']) kochin_data['kochin'] = radiation['kochin'] return kochin_data
def test_floating_sphere_finite_depth(): """Compare with Nemoh 2.0 for some cases of a heaving sphere at the free surface in finite depth.""" sphere = Sphere(radius=1.0, ntheta=3, nphi=12, clip_free_surface=True) sphere.add_translation_dof(direction=(0, 0, 1), name="Heave") # omega = 1, radiation problem = RadiationProblem(body=sphere, omega=1.0, radiating_dof="Heave", sea_bottom=-10.0) result = solver.solve(problem, keep_details=True) assert np.isclose(result.added_masses["Heave"], 1740.6, atol=1e-3*sphere.volume*problem.rho) assert np.isclose(result.radiation_dampings["Heave"], 380.46, atol=1e-3*sphere.volume*problem.rho) kochin = compute_kochin(result, np.linspace(0, np.pi, 3)) assert np.allclose(kochin, np.roll(kochin, 1)) # The far field is the same in all directions. assert np.isclose(kochin[0], -0.2267+3.49e-3j, rtol=1e-3) # omega = 1, diffraction problem = DiffractionProblem(body=sphere, omega=1.0, wave_direction=0.0, sea_bottom=-10.0) result = solver.solve(problem) assert np.isclose(result.forces["Heave"], 1749.4 * np.exp(-2.922j), rtol=1e-3) # omega = 2, radiation problem = RadiationProblem(body=sphere, omega=2.0, radiating_dof="Heave", sea_bottom=-10.0) result = solver.solve(problem) assert np.isclose(result.added_masses["Heave"], 1375.0, atol=1e-3*sphere.volume*problem.rho) assert np.isclose(result.radiation_dampings["Heave"], 1418.0, atol=1e-3*sphere.volume*problem.rho) # omega = 2, diffraction problem = DiffractionProblem(body=sphere, omega=2.0, wave_direction=0.0, sea_bottom=-10.0) result = solver.solve(problem) assert np.isclose(result.forces["Heave"], 5872.8 * np.exp(-2.627j), rtol=1e-3)
def test_floating_sphere_finite_freq(): """Compare with Nemoh 2.0 for some cases of a heaving sphere at the free surface in infinite depth.""" sphere = Sphere(radius=1.0, ntheta=3, nphi=12, clip_free_surface=True) sphere.add_translation_dof(direction=(0, 0, 1), name="Heave") # omega = 1, radiation problem = RadiationProblem(body=sphere, omega=1.0, sea_bottom=-np.infty) result = solver.solve(problem, keep_details=True) assert np.isclose(result.added_masses["Heave"], 1819.6, atol=1e-3*sphere.volume*problem.rho) assert np.isclose(result.radiation_dampings["Heave"], 379.39, atol=1e-3*sphere.volume*problem.rho) # omega = 1, free surface free_surface = FreeSurface(x_range=(-62.5, 62.5), nx=5, y_range=(-62.5, 62.5), ny=5) eta = solver.get_free_surface_elevation(result, free_surface) ref = np.array( [[-0.4340802E-02-0.4742809E-03j, -0.7986111E-03+0.4840984E-02j, 0.2214827E-02+0.4700642E-02j, -0.7986111E-03+0.4840984E-02j, -0.4340803E-02-0.4742807E-03j], [-0.7986111E-03+0.4840984E-02j, 0.5733187E-02-0.2179381E-02j, 0.9460892E-03-0.7079404E-02j, 0.5733186E-02-0.2179381E-02j, -0.7986110E-03+0.4840984E-02j], [0.2214827E-02+0.4700643E-02j, 0.9460892E-03-0.7079403E-02j, -0.1381670E-01+0.6039315E-01j, 0.9460892E-03-0.7079405E-02j, 0.2214827E-02+0.4700643E-02j], [-0.7986111E-03+0.4840984E-02j, 0.5733186E-02-0.2179381E-02j, 0.9460891E-03-0.7079404E-02j, 0.5733187E-02-0.2179380E-02j, -0.7986113E-03+0.4840984E-02j], [-0.4340803E-02-0.4742807E-03j, -0.7986111E-03+0.4840984E-02j, 0.2214827E-02+0.4700643E-02j, -0.7986113E-03+0.4840983E-02j, -0.4340803E-02-0.4742809E-03j]] ) assert np.allclose(eta.reshape((5, 5)), ref, rtol=1e-4) # omega = 1, diffraction problem = DiffractionProblem(body=sphere, omega=1.0, sea_bottom=-np.infty) result = solver.solve(problem, keep_details=True) assert np.isclose(result.forces["Heave"], 1834.9 * np.exp(-2.933j), rtol=1e-3) # omega = 1, Kochin function of diffraction problem kochin = compute_kochin(result, np.linspace(0, np.pi, 10)) ref_kochin = np.array([ 0.20229*np.exp(-1.5872j), 0.20369*np.exp(-1.5871j), 0.20767*np.exp(-1.5868j), 0.21382*np.exp(-1.5863j), 0.22132*np.exp(-1.5857j), 0.22931*np.exp(-1.5852j), 0.23680*np.exp(-1.5847j), 0.24291*np.exp(-1.5843j), 0.24688*np.exp(-1.5841j), 0.24825*np.exp(-1.5840j), ]) assert np.allclose(kochin, ref_kochin, rtol=1e-3) # omega = 2, radiation problem = RadiationProblem(body=sphere, omega=2.0, sea_bottom=-np.infty) result = solver.solve(problem) assert np.isclose(result.added_masses["Heave"], 1369.3, atol=1e-3*sphere.volume*problem.rho) assert np.isclose(result.radiation_dampings["Heave"], 1425.6, atol=1e-3*sphere.volume*problem.rho) # omega = 2, diffraction problem = DiffractionProblem(body=sphere, omega=2.0, sea_bottom=-np.infty) result = solver.solve(problem) assert np.isclose(result.forces["Heave"], 5846.6 * np.exp(-2.623j), rtol=1e-3)
def kochin_data_array( results: Sequence[LinearPotentialFlowResult], theta_range: Sequence[float], **kwargs, ) -> xr.Dataset: """Compute the Kochin function for a list of results and fills a dataset. .. seealso:: :meth:`~capytaine.post_pro.kochin.compute_kochin` The present function is just a wrapper around :code:`compute_kochin`. """ records = pd.DataFrame([ dict(result.settings_dict, theta=theta, kochin=kochin) for result in results for theta, kochin in zip( theta_range.data, compute_kochin(result, theta_range, **kwargs)) ]) ds = _dataset_from_dataframe( records, ['kochin'], dimensions=['omega', 'radiating_dof', 'theta'], optional_dims=['g', 'rho', 'body_name', 'water_depth']) return ds['kochin']