capytaine 2.3__cp313-cp313-win_amd64.whl → 3.0.0a1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. capytaine/__about__.py +7 -2
  2. capytaine/__init__.py +11 -15
  3. capytaine/bem/engines.py +234 -354
  4. capytaine/bem/problems_and_results.py +30 -21
  5. capytaine/bem/solver.py +205 -81
  6. capytaine/bodies/bodies.py +279 -862
  7. capytaine/bodies/dofs.py +136 -9
  8. capytaine/bodies/hydrostatics.py +540 -0
  9. capytaine/bodies/multibodies.py +216 -0
  10. capytaine/green_functions/{libs/Delhommeau_float32.cp313-win_amd64.dll.a → Delhommeau_float32.cp313-win_amd64.dll.a} +0 -0
  11. capytaine/green_functions/Delhommeau_float32.cp313-win_amd64.pyd +0 -0
  12. capytaine/green_functions/{libs/Delhommeau_float64.cp313-win_amd64.dll.a → Delhommeau_float64.cp313-win_amd64.dll.a} +0 -0
  13. capytaine/green_functions/Delhommeau_float64.cp313-win_amd64.pyd +0 -0
  14. capytaine/green_functions/abstract_green_function.py +2 -2
  15. capytaine/green_functions/delhommeau.py +50 -31
  16. capytaine/green_functions/hams.py +19 -13
  17. capytaine/io/legacy.py +3 -103
  18. capytaine/io/xarray.py +15 -10
  19. capytaine/meshes/__init__.py +2 -6
  20. capytaine/meshes/abstract_meshes.py +375 -0
  21. capytaine/meshes/clean.py +302 -0
  22. capytaine/meshes/clip.py +347 -0
  23. capytaine/meshes/export.py +89 -0
  24. capytaine/meshes/geometry.py +244 -394
  25. capytaine/meshes/io.py +433 -0
  26. capytaine/meshes/meshes.py +621 -676
  27. capytaine/meshes/predefined/cylinders.py +22 -56
  28. capytaine/meshes/predefined/rectangles.py +26 -85
  29. capytaine/meshes/predefined/spheres.py +4 -11
  30. capytaine/meshes/quality.py +118 -407
  31. capytaine/meshes/surface_integrals.py +48 -29
  32. capytaine/meshes/symmetric_meshes.py +641 -0
  33. capytaine/meshes/visualization.py +353 -0
  34. capytaine/post_pro/free_surfaces.py +1 -4
  35. capytaine/post_pro/kochin.py +10 -10
  36. capytaine/tools/block_circulant_matrices.py +275 -0
  37. capytaine/tools/lists_of_points.py +2 -2
  38. capytaine/tools/memory_monitor.py +45 -0
  39. capytaine/tools/symbolic_multiplication.py +31 -5
  40. capytaine/tools/timer.py +68 -42
  41. capytaine-3.0.0a1.dist-info/DELVEWHEEL +2 -0
  42. {capytaine-2.3.dist-info → capytaine-3.0.0a1.dist-info}/METADATA +8 -14
  43. capytaine-3.0.0a1.dist-info/RECORD +70 -0
  44. capytaine/bodies/predefined/__init__.py +0 -6
  45. capytaine/bodies/predefined/cylinders.py +0 -151
  46. capytaine/bodies/predefined/rectangles.py +0 -111
  47. capytaine/bodies/predefined/spheres.py +0 -70
  48. capytaine/green_functions/FinGreen3D/.gitignore +0 -1
  49. capytaine/green_functions/FinGreen3D/FinGreen3D.f90 +0 -3589
  50. capytaine/green_functions/FinGreen3D/LICENSE +0 -165
  51. capytaine/green_functions/FinGreen3D/Makefile +0 -16
  52. capytaine/green_functions/FinGreen3D/README.md +0 -24
  53. capytaine/green_functions/FinGreen3D/test_program.f90 +0 -39
  54. capytaine/green_functions/LiangWuNoblesse/.gitignore +0 -1
  55. capytaine/green_functions/LiangWuNoblesse/LICENSE +0 -504
  56. capytaine/green_functions/LiangWuNoblesse/LiangWuNoblesseWaveTerm.f90 +0 -751
  57. capytaine/green_functions/LiangWuNoblesse/Makefile +0 -18
  58. capytaine/green_functions/LiangWuNoblesse/README.md +0 -2
  59. capytaine/green_functions/LiangWuNoblesse/test_program.f90 +0 -28
  60. capytaine/green_functions/libs/Delhommeau_float32.cp313-win_amd64.pyd +0 -0
  61. capytaine/green_functions/libs/Delhommeau_float64.cp313-win_amd64.pyd +0 -0
  62. capytaine/green_functions/libs/__init__.py +0 -0
  63. capytaine/io/mesh_loaders.py +0 -1086
  64. capytaine/io/mesh_writers.py +0 -692
  65. capytaine/io/meshio.py +0 -38
  66. capytaine/matrices/__init__.py +0 -16
  67. capytaine/matrices/block.py +0 -592
  68. capytaine/matrices/block_toeplitz.py +0 -325
  69. capytaine/matrices/builders.py +0 -89
  70. capytaine/matrices/linear_solvers.py +0 -232
  71. capytaine/matrices/low_rank.py +0 -395
  72. capytaine/meshes/clipper.py +0 -465
  73. capytaine/meshes/collections.py +0 -334
  74. capytaine/meshes/mesh_like_protocol.py +0 -37
  75. capytaine/meshes/properties.py +0 -276
  76. capytaine/meshes/quadratures.py +0 -80
  77. capytaine/meshes/symmetric.py +0 -392
  78. capytaine/tools/lru_cache.py +0 -49
  79. capytaine/ui/vtk/__init__.py +0 -3
  80. capytaine/ui/vtk/animation.py +0 -329
  81. capytaine/ui/vtk/body_viewer.py +0 -28
  82. capytaine/ui/vtk/helpers.py +0 -82
  83. capytaine/ui/vtk/mesh_viewer.py +0 -461
  84. capytaine-2.3.dist-info/DELVEWHEEL +0 -2
  85. capytaine-2.3.dist-info/RECORD +0 -97
  86. {capytaine-2.3.dist-info → capytaine-3.0.0a1.dist-info}/LICENSE +0 -0
  87. {capytaine-2.3.dist-info → capytaine-3.0.0a1.dist-info}/WHEEL +0 -0
  88. {capytaine-2.3.dist-info → capytaine-3.0.0a1.dist-info}/entry_points.txt +0 -0
capytaine/bodies/dofs.py CHANGED
@@ -1,19 +1,146 @@
1
1
  # Copyright (C) 2017-2022 Matthieu Ancellin
2
2
  # See LICENSE file at <https://github.com/capytaine/capytaine>
3
3
 
4
+ from abc import ABC, abstractmethod
5
+ from functools import lru_cache
6
+ import logging
4
7
 
5
- class RigidBodyDofsPlaceholder:
6
- """Pass an instance of this class to the FloatingBody initializer to initialize the 6 ridig body dofs."""
8
+ import numpy as np
9
+ import xarray as xr
7
10
 
8
- def __init__(self, rotation_center=None):
9
- self.rotation_center = rotation_center
11
+ LOG = logging.getLogger(__name__)
12
+
13
+
14
+ class AbstractDof(ABC):
15
+ @abstractmethod
16
+ def evaluate_motion(self, mesh):
17
+ ...
18
+
19
+ @abstractmethod
20
+ def evaluate_gradient_of_motion(self, mesh):
21
+ ...
22
+
23
+
24
+ class TranslationDof(AbstractDof):
25
+ def __init__(self, direction):
26
+ self.direction = np.asarray(direction)
27
+ assert self.direction.shape == (3,)
10
28
 
11
29
  def __str__(self):
12
- return "RigidBodyDofsPlaceholder()"
30
+ return f"TranslationDof(direction={self.direction})"
31
+
32
+ @lru_cache
33
+ def evaluate_motion(self, mesh) -> np.array:
34
+ return np.tile(self.direction, (mesh.nb_faces, 1))
35
+
36
+ @lru_cache
37
+ def evaluate_gradient_of_motion(self, mesh) -> np.array:
38
+ return np.zeros((mesh.nb_faces, 3, 3))
39
+
40
+
41
+ class RotationDof(AbstractDof):
42
+ def __init__(self, rotation_center, direction):
43
+ self.direction = np.asarray(direction)
44
+ assert self.direction.shape == (3,)
45
+ if rotation_center is None:
46
+ self.rotation_center = np.array([0, 0, 0])
47
+ LOG.warning("Rigid body rotation dof has been initialized "
48
+ "around the origin of the domain (0, 0, 0).")
49
+ else:
50
+ self.rotation_center = np.asarray(rotation_center)
51
+ assert self.rotation_center.shape == (3,)
52
+
53
+ def __str__(self):
54
+ return f"RotationDof(rotation_center={self.rotation_center}, direction={self.direction})"
55
+
56
+ @lru_cache
57
+ def evaluate_motion(self, mesh) -> np.array:
58
+ if mesh.nb_faces == 0:
59
+ return np.empty((mesh.nb_faces, 3))
60
+ else:
61
+ motion = np.cross(self.direction, mesh.faces_centers - self.rotation_center)
62
+ return motion
63
+
64
+ @lru_cache
65
+ def evaluate_gradient_of_motion(self, mesh) -> np.array:
66
+ grad = np.cross(self.direction, np.eye(3))
67
+ return np.tile(grad, (mesh.nb_faces, 1, 1))
68
+
69
+
70
+ class DofOnSubmesh(AbstractDof):
71
+ def __init__(self, dof: AbstractDof, faces):
72
+ self.dof = dof
73
+ self.faces = faces
74
+
75
+ def evaluate_motion(self, mesh):
76
+ motion = np.zeros((mesh.nb_faces, 3))
77
+ motion[self.faces, :] = self.dof.evaluate_motion(mesh.extract_faces(self.faces))
78
+ return motion
79
+
80
+ def evaluate_gradient_of_motion(self, mesh) -> np.array:
81
+ grad = np.zeros((mesh.nb_faces, 3, 3))
82
+ grad[self.faces, :, :] = self.dof.evaluate_gradient_of_motion(mesh.extract_faces(self.faces))
83
+ return grad
84
+
85
+
86
+ def is_rigid_body_dof(dof):
87
+ return (
88
+ isinstance(dof, TranslationDof)
89
+ or isinstance(dof, RotationDof)
90
+ # or (isinstance(dof, DofOnSubmesh) and is_rigid_body_dof(dof.dof))
91
+ )
92
+
93
+
94
+ def rigid_body_dofs(only=None, rotation_center=None):
95
+ """Pass this to FloatingBody initializer to give it rigid body dofs.
96
+
97
+ Parameters
98
+ ----------
99
+ only: sequence of str, optional
100
+ list of the name of the rigid body dofs to be included.
101
+ By default: all six of them
102
+ rotation_center: np.array, optional
103
+ the center for the definition of the rotations
104
+ """
105
+ if rotation_center is None:
106
+ rotation_center = np.array([0, 0, 0])
107
+
108
+ if not (only is not None
109
+ and set(only).issubset({"Surge", "Sway", "Heave"})
110
+ ): # Skip the warning if only translations are required.
111
+ LOG.warning("Rigid body rotation dofs have been initialized "
112
+ "around the origin of the domain (0, 0, 0).")
113
+ # This warning is redundant with the one in RotationDof.__init__,
114
+ # but it is done here to have a single warning displayed on screen
115
+ # when a rigid body is initialized.
116
+
117
+ dofs = {
118
+ "Surge": TranslationDof(direction=(1, 0, 0)),
119
+ "Sway": TranslationDof(direction=(0, 1, 0)),
120
+ "Heave": TranslationDof(direction=(0, 0, 1)),
121
+ "Roll": RotationDof(rotation_center=rotation_center, direction=(1, 0, 0)),
122
+ "Pitch": RotationDof(rotation_center=rotation_center, direction=(0, 1, 0)),
123
+ "Yaw": RotationDof(rotation_center=rotation_center, direction=(0, 0, 1)),
124
+ }
125
+ if only is not None:
126
+ dofs = {k: v for k, v in dofs.items() if k in only}
127
+ return dofs
128
+
129
+
130
+ def normalize_name(name):
131
+ return name[0].upper() + name[1:].lower()
13
132
 
14
- def _repr_pretty_(self, p, cycle):
15
- p.text(self.__str__())
16
133
 
134
+ def add_dofs_labels_to_vector(dof_names, vector):
135
+ """Helper function turning a bare vector into a vector labelled by the name of the dofs,
136
+ to be used for instance for the computation of RAO."""
137
+ return xr.DataArray(data=np.asarray(vector), dims=['influenced_dof'],
138
+ coords={'influenced_dof': list(dof_names)},
139
+ )
17
140
 
18
- def rigid_body_dofs(rotation_center=None):
19
- return RigidBodyDofsPlaceholder(rotation_center=rotation_center)
141
+ def add_dofs_labels_to_matrix(dof_names, matrix):
142
+ """Helper function turning a bare matrix into a matrix labelled by the name of the dofs,
143
+ to be used for instance for the computation of RAO."""
144
+ return xr.DataArray(data=np.asarray(matrix), dims=['influenced_dof', 'radiating_dof'],
145
+ coords={'influenced_dof': list(dof_names), 'radiating_dof': list(dof_names)},
146
+ )