Example #1
0
    def write_bem(self, fpath:str=None):
        """
        Write the BEM solution to netCDF file

        Parameters
        ----------
        fpath : str, optional
            DESCRIPTION. The default is the WEC's wrk_dir.
        """
        if fpath is None:
            fpath = os.path.join(self.params['wrk_dir'], self.params['name'] + '.nc')
        assert isinstance(fpath, str), 'fpath must be type(str), received {:}'.format(type(fpath))
        
        separate_complex_values(self.hydro).to_netcdf(fpath)
Example #2
0
    def solve_tube_hydrodynamics(self):
        """

        """
        #print('\tSolving tube hydrodynamics.')

        solver = cpt.BEMSolver()
        problems = [
            cpt.RadiationProblem(omega=omega,
                                 body=self.tube,
                                 radiating_dof=dof,
                                 rho=self.rho,
                                 sea_bottom=self.water_depth)
            for dof in self.tube.dofs for omega in self.wave_frequencies
        ]
        problems += [
            cpt.DiffractionProblem(omega=omega,
                                   body=self.tube,
                                   wave_direction=self.wave_direction,
                                   rho=self.rho,
                                   sea_bottom=self.water_depth)
            for omega in self.wave_frequencies
        ]
        results = solver.solve_all(problems, keep_details=False)
        result_data = cpt.assemble_dataset(results)

        if self.save_results:
            from capytaine.io.xarray import separate_complex_values
            save_file_name = 'flexible_tube_results__rs_le_zs__{:.2f}_{:.1f}_{:.2f}__with_{}_cells.nc' \
                                .format(self.static_radius, self.length, self.submergence, self.tube.mesh.nb_faces)
            separate_complex_values(result_data).to_netcdf(
                save_file_name,
                encoding={
                    'radiating_dof': {
                        'dtype': 'U'
                    },
                    'influenced_dof': {
                        'dtype': 'U'
                    }
                })

        self.result_data = result_data
    def solve_beam_hydrodynamics(self, save_results):
        """

        """
        bem_solver = cpt.BEMSolver()
        problems = [
            cpt.RadiationProblem(sea_bottom=self.water_depth,
                                 body=self.beam_mesh,
                                 radiating_dof=dof,
                                 omega=omega) for dof in self.beam_mesh.dofs
            for omega in self.wave_frequencies
        ]
        problems += [
            cpt.DiffractionProblem(sea_bottom=self.water_depth,
                                   body=self.beam_mesh,
                                   wave_direction=self.wave_direction,
                                   omega=omega)
            for omega in self.wave_frequencies
        ]
        results = [bem_solver.solve(problem) for problem in problems]
        result_data = cpt.assemble_dataset(results)

        if save_results:
            from capytaine.io.xarray import separate_complex_values
            separate_complex_values(result_data).to_netcdf(
                'beam_hydrodynamics_results.nc',
                encoding={
                    'radiating_dof': {
                        'dtype': 'U'
                    },
                    'influenced_dof': {
                        'dtype': 'U'
                    }
                })

        return result_data
Example #4
0
def test_remove_complex_values():
    original_dataset = xr.Dataset(
        data_vars={
            'variable1': (['x', 'y'], np.random.rand(4, 5)),
            'variable2': (['x', 'y', 'z'], np.random.rand(4, 5, 3) + 1j * np.random.rand(4, 5, 3)),
            'variable3': (['y', 'z'], np.random.rand(5, 3) + 1j * np.random.rand(5, 3)),
        },
        coords={
            'x': (['x'], np.linspace(0, 10, 4))
        })

    real_dataset = separate_complex_values(original_dataset)
    assert np.allclose(real_dataset['variable3'].sel(complex='re').data,
                       np.real(original_dataset['variable3'].data),
                       atol=0.1)
    assert set(original_dataset.dims) == set(real_dataset.dims) - {'complex'}

    complex_dataset = merge_complex_values(real_dataset)
    assert set(original_dataset.dims) == set(complex_dataset.dims)
Example #5
0
def generate_mesh() -> cpt.FloatingBody:
    boat = cpt.FloatingBody.from_file(r"C:\data\docker\output.stl", file_format="stl", name="cheetah")

    # boat.clip(Plane(normal=(0, 0, 1), point=(0, 0, -0.01)))  # <-- optional, depending on the input mesh
    boat.add_all_rigid_body_dofs()
    boat.keep_immersed_part()

    return boat



if __name__ == '__main__':

    omega = [0.01, 0.02, 0.04,0.06,0.08,0.1,0.15, 0.2,0.25, 0.3,0.35, 0.4,0.45, 0.5,0.55, 0.6,0.65, 0.7, 0.8,0.9, 1.0,1.1,1.2,1.4,1.6,1.8,2.0,4.0]

    body = generate_mesh()
    # body = generate_boat()

    body.show()

    dataset = make_database(body=body, omegas=omega, wave_directions=np.linspace(0,pi,9))
    print(dataset)

    from capytaine.io.xarray import separate_complex_values
    sep = separate_complex_values(dataset)
    sep.to_netcdf(r"C:\data\python\rao\docs\examples\cheetah.nc",
                  encoding={'radiating_dof': {'dtype': 'U'},
                            'influenced_dof': {'dtype': 'U'},
                            'diffraction_result': {'dtype': 'U'}})