LoopStructural 1.6.13__py3-none-any.whl → 1.6.15__py3-none-any.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.

Potentially problematic release.


This version of LoopStructural might be problematic. Click here for more details.

Files changed (32) hide show
  1. LoopStructural/datatypes/_bounding_box.py +23 -13
  2. LoopStructural/datatypes/_point.py +0 -1
  3. LoopStructural/export/exporters.py +2 -2
  4. LoopStructural/interpolators/__init__.py +43 -32
  5. LoopStructural/interpolators/_constant_norm.py +205 -0
  6. LoopStructural/interpolators/_discrete_interpolator.py +15 -14
  7. LoopStructural/interpolators/_finite_difference_interpolator.py +27 -21
  8. LoopStructural/interpolators/_geological_interpolator.py +1 -1
  9. LoopStructural/interpolators/_interpolatortype.py +22 -0
  10. LoopStructural/interpolators/_p1interpolator.py +7 -3
  11. LoopStructural/interpolators/_surfe_wrapper.py +4 -1
  12. LoopStructural/interpolators/supports/_2d_base_unstructured.py +1 -1
  13. LoopStructural/interpolators/supports/_2d_structured_grid.py +16 -0
  14. LoopStructural/interpolators/supports/_3d_base_structured.py +16 -0
  15. LoopStructural/interpolators/supports/_3d_structured_grid.py +3 -2
  16. LoopStructural/interpolators/supports/_3d_structured_tetra.py +7 -3
  17. LoopStructural/modelling/__init__.py +11 -3
  18. LoopStructural/modelling/core/geological_model.py +187 -234
  19. LoopStructural/modelling/features/_base_geological_feature.py +38 -2
  20. LoopStructural/modelling/features/builders/_geological_feature_builder.py +2 -2
  21. LoopStructural/modelling/features/fault/_fault_function.py +1 -1
  22. LoopStructural/modelling/intrusions/intrusion_builder.py +1 -1
  23. LoopStructural/modelling/intrusions/intrusion_frame_builder.py +1 -1
  24. LoopStructural/utils/__init__.py +1 -0
  25. LoopStructural/utils/helper.py +1 -24
  26. LoopStructural/utils/maths.py +74 -17
  27. LoopStructural/version.py +1 -1
  28. {loopstructural-1.6.13.dist-info → loopstructural-1.6.15.dist-info}/METADATA +2 -2
  29. {loopstructural-1.6.13.dist-info → loopstructural-1.6.15.dist-info}/RECORD +32 -30
  30. {loopstructural-1.6.13.dist-info → loopstructural-1.6.15.dist-info}/WHEEL +1 -1
  31. {loopstructural-1.6.13.dist-info → loopstructural-1.6.15.dist-info}/licenses/LICENSE +0 -0
  32. {loopstructural-1.6.13.dist-info → loopstructural-1.6.15.dist-info}/top_level.txt +0 -0
@@ -244,7 +244,7 @@ class BaseFeature(metaclass=ABCMeta):
244
244
  if self.model is None:
245
245
  return 0
246
246
 
247
- return np.nanmin(self.evaluate_value(self.model.regular_grid((10, 10, 10))))
247
+ return np.nanmin(self.evaluate_value(self.model.regular_grid(nsteps=(10, 10, 10))))
248
248
 
249
249
  def max(self):
250
250
  """Calculate the maximum value of the geological feature
@@ -257,7 +257,7 @@ class BaseFeature(metaclass=ABCMeta):
257
257
  """
258
258
  if self.model is None:
259
259
  return 0
260
- return np.nanmax(self.evaluate_value(self.model.regular_grid((10, 10, 10))))
260
+ return np.nanmax(self.evaluate_value(self.model.regular_grid(nsteps=(10, 10, 10))))
261
261
 
262
262
  def __tojson__(self):
263
263
  regions = [r.name for r in self.regions]
@@ -347,6 +347,42 @@ class BaseFeature(metaclass=ABCMeta):
347
347
  grid.cell_properties[self.name] = value
348
348
  return grid
349
349
 
350
+ def gradient_norm_scalar_field(self, bounding_box=None):
351
+ """Create a scalar field for the gradient norm of the feature
352
+
353
+ Parameters
354
+ ----------
355
+ bounding_box : Optional[BoundingBox], optional
356
+ bounding box to evaluate the scalar field in, by default None
357
+
358
+ Returns
359
+ -------
360
+ np.ndarray
361
+ scalar field of the gradient norm
362
+ """
363
+ if bounding_box is None:
364
+ if self.model is None:
365
+ raise ValueError("Must specify bounding box")
366
+ bounding_box = self.model.bounding_box
367
+ grid = bounding_box.structured_grid(name=self.name)
368
+ value = np.linalg.norm(
369
+ self.evaluate_gradient(bounding_box.regular_grid(local=False, order='F')),
370
+ axis=1,
371
+ )
372
+ if self.model is not None:
373
+ value = np.linalg.norm(
374
+ self.evaluate_gradient(
375
+ self.model.scale(bounding_box.regular_grid(local=False, order='F'))
376
+ ),
377
+ axis=1,
378
+ )
379
+ grid.properties[self.name] = value
380
+
381
+ value = np.linalg.norm(
382
+ self.evaluate_gradient(bounding_box.cell_centres(order='F')), axis=1
383
+ )
384
+ grid.cell_properties[self.name] = value
385
+ return grid
350
386
  def vector_field(self, bounding_box=None, tolerance=0.05, scale=1.0):
351
387
  """Create a vector field for the feature
352
388
 
@@ -86,7 +86,7 @@ class GeologicalFeatureBuilder(BaseBuilder):
86
86
  self._orthogonal_features = {}
87
87
  self._equality_constraints = {}
88
88
  # add default parameters
89
- self.update_build_arguments({'cpw':1.0,'npw':1.0,'regularisation':1.0,'nelements':self.interpolator.n_elements})
89
+ self.update_build_arguments({'cpw':1.0,'npw':1.0,'regularisation':.10,'nelements':self.interpolator.n_elements})
90
90
  def set_not_up_to_date(self, caller):
91
91
  logger.info(
92
92
  f"Setting {self.name} to not up to date from an instance of {caller.__class__.__name__}"
@@ -452,7 +452,7 @@ class GeologicalFeatureBuilder(BaseBuilder):
452
452
  self.interpolator.support.rotation_xy = rotation
453
453
  self._up_to_date = False
454
454
 
455
- while self.interpolator.nx < 100:
455
+ while self.interpolator.dof < 100:
456
456
  self.interpolator.support.step_vector = self.interpolator.support.step_vector * 0.9
457
457
 
458
458
  def check_interpolation_geometry(self, data, buffer=0.3):
@@ -12,7 +12,7 @@ logger = getLogger(__name__)
12
12
  def smooth_peak(x):
13
13
  v = np.zeros(x.shape)
14
14
  mask = np.logical_and(x >= -1, x <= 1)
15
- v[mask] = 0.25 * x[mask] ** 2 + 0.5 * x[mask] ** 4 - 1.75 * x[mask] ** 2 + 1
15
+ v[mask] = x[mask] ** 4 - 2 * x[mask] ** 2 + 1
16
16
  return v
17
17
 
18
18
  class FaultProfileFunction(metaclass=ABCMeta):
@@ -82,7 +82,7 @@ class IntrusionBuilder(BaseBuilder):
82
82
  if spacing is None:
83
83
  spacing = self.model.nsteps
84
84
 
85
- grid_points = self.model.regular_grid(spacing, shuffle=False)
85
+ grid_points = self.model.regular_grid(nsteps=spacing, shuffle=False)
86
86
 
87
87
  grid_points_coord0 = self.intrusion_frame[0].evaluate_value(grid_points)
88
88
 
@@ -168,7 +168,7 @@ class IntrusionFrameBuilder(StructuralFrameBuilder):
168
168
  if spacing is None:
169
169
  spacing = self.model.nsteps
170
170
 
171
- grid_points = self.model.regular_grid(spacing, shuffle=False)
171
+ grid_points = self.model.regular_grid(nsteps=spacing, shuffle=False)
172
172
 
173
173
  self.grid_to_evaluate_ifx = grid_points
174
174
 
@@ -23,6 +23,7 @@ from .maths import (
23
23
  get_strike_vector,
24
24
  get_vectors,
25
25
  strikedip2vector,
26
+ plungeazimuth2vector,
26
27
  azimuthplunge2vector,
27
28
  normal_vector_to_strike_and_dip,
28
29
  rotate,
@@ -107,30 +107,7 @@ def get_data_bounding_box(xyz, buffer):
107
107
  return bb, region
108
108
 
109
109
 
110
- # def azimuthplunge2vector(
111
- # plunge: Union[np.ndarray, list], plunge_dir: Union[np.ndarray, list]
112
- # ) -> np.ndarray:
113
- # """Convert plunge and plunge direction to a vector
114
-
115
- # Parameters
116
- # ----------
117
- # plunge : Union[np.ndarray, list]
118
- # array or array like of plunge values
119
- # plunge_dir : Union[np.ndarray, list]
120
- # array or array like of plunge direction values
121
-
122
- # Returns
123
- # -------
124
- # np.array
125
- # nx3 vector
126
- # """
127
- # plunge = np.deg2rad(plunge)
128
- # plunge_dir = np.deg2rad(plunge_dir)
129
- # vec = np.zeros(3)
130
- # vec[0] = np.sin(plunge_dir) * np.cos(plunge)
131
- # vec[1] = np.cos(plunge_dir) * np.cos(plunge)
132
- # vec[2] = -np.sin(plunge)
133
- # return vec
110
+
134
111
 
135
112
 
136
113
  def create_surface(bounding_box, nstep):
@@ -28,20 +28,28 @@ def strikedip2vector(strike: NumericInput, dip: NumericInput) -> np.ndarray:
28
28
  vec /= np.linalg.norm(vec, axis=1)[:, None]
29
29
  return vec
30
30
 
31
-
32
31
  def azimuthplunge2vector(
32
+ plunge: NumericInput,
33
+ azimuth: NumericInput,
34
+ degrees: bool = True,
35
+ ) -> np.ndarray:
36
+ raise DeprecationWarning(
37
+ "azimuthplunge2vector is deprecated, use plungeazimuth2vector instead"
38
+ )
39
+
40
+ def plungeazimuth2vector(
33
41
  plunge: NumericInput,
34
- plunge_dir: NumericInput,
42
+ azimuth: NumericInput,
35
43
  degrees: bool = True,
36
44
  ) -> np.ndarray:
37
45
  """Convert plunge and plunge direction to a vector
38
46
 
39
47
  Parameters
40
48
  ----------
49
+ azimuth : Union[np.ndarray, list]
50
+ array or array like of plunge direction values
41
51
  plunge : Union[np.ndarray, list]
42
52
  array or array like of plunge values
43
- plunge_dir : Union[np.ndarray, list]
44
- array or array like of plunge direction values
45
53
 
46
54
  Returns
47
55
  -------
@@ -52,16 +60,16 @@ def azimuthplunge2vector(
52
60
  plunge = np.array([plunge], dtype=float)
53
61
  else:
54
62
  plunge = np.array(plunge, dtype=float)
55
- if isinstance(plunge_dir, numbers.Number):
56
- plunge_dir = np.array([plunge_dir], dtype=float)
63
+ if isinstance(azimuth, numbers.Number):
64
+ azimuth = np.array([azimuth], dtype=float)
57
65
  else:
58
- plunge_dir = np.array(plunge_dir, dtype=float)
66
+ azimuth = np.array(azimuth, dtype=float)
59
67
  if degrees:
60
68
  plunge = np.deg2rad(plunge)
61
- plunge_dir = np.deg2rad(plunge_dir)
69
+ azimuth = np.deg2rad(azimuth)
62
70
  vec = np.zeros((len(plunge), 3))
63
- vec[:, 0] = np.sin(plunge_dir) * np.cos(plunge)
64
- vec[:, 1] = np.cos(plunge_dir) * np.cos(plunge)
71
+ vec[:, 0] = np.sin(azimuth) * np.cos(plunge)
72
+ vec[:, 1] = np.cos(azimuth) * np.cos(plunge)
65
73
  vec[:, 2] = -np.sin(plunge)
66
74
  return vec
67
75
 
@@ -204,19 +212,21 @@ def get_vectors(normal: NumericInput) -> Tuple[np.ndarray, np.ndarray]:
204
212
 
205
213
 
206
214
  def get_strike_vector(strike: NumericInput, degrees: bool = True) -> np.ndarray:
207
- """Return the vector aligned with the strike direction
215
+ """Return strike direction vector(s) from strike angle(s).
208
216
 
209
217
  Parameters
210
218
  ----------
211
- strike : np.ndarray
212
- strike direction
219
+ strike : NumericInput
220
+ Single strike angle or array-like of strike angles, measured clockwise from North.
213
221
  degrees : bool, optional
214
- whether to return in degrees or radians, by default True
222
+ Whether the input angles are in degrees. If False, angles are assumed to be in radians.
223
+ Default is True.
215
224
 
216
225
  Returns
217
226
  -------
218
227
  np.ndarray
219
- vector aligned with strike direction
228
+ Array of shape (3, n) where each column is a 3D unit vector (x, y, z) representing
229
+ the horizontal strike direction. The z-component is always 0.
220
230
 
221
231
  """
222
232
  if isinstance(strike, numbers.Number):
@@ -236,6 +246,21 @@ def get_strike_vector(strike: NumericInput, degrees: bool = True) -> np.ndarray:
236
246
 
237
247
 
238
248
  def get_dip_vector(strike, dip):
249
+ """Return the dip vector based on strike and dip angles.
250
+
251
+ Parameters
252
+ ----------
253
+ strike : float
254
+ Strike angle in degrees, measured clockwise from North.
255
+ dip : float
256
+ Dip angle in degrees, measured from the horizontal plane.
257
+
258
+ Returns
259
+ -------
260
+ np.ndarray
261
+ Unit vector (length 3) representing the dip direction in 3D space.
262
+
263
+ """
239
264
  v = np.array(
240
265
  [
241
266
  -np.cos(np.deg2rad(-strike)) * np.cos(-np.deg2rad(dip)),
@@ -247,6 +272,23 @@ def get_dip_vector(strike, dip):
247
272
 
248
273
 
249
274
  def regular_tetraherdron_for_points(xyz, scale_parameter):
275
+ """Generate regular tetrahedrons centered at given 3D points.
276
+
277
+ Parameters
278
+ ----------
279
+ xyz : np.ndarray
280
+ Array of shape (n, 3) representing the coordinates of n points in 3D space,
281
+ which will serve as the centers of the generated tetrahedrons.
282
+ scale_parameter : float
283
+ Scaling factor controlling the size of the regular tetrahedrons.
284
+
285
+ Returns
286
+ -------
287
+ np.ndarray
288
+ Array of shape (n, 4, 3) representing n regular tetrahedrons, where each
289
+ tetrahedron has 4 vertices in 3D space, positioned relative to the corresponding center point.
290
+
291
+ """
250
292
  regular_tetrahedron = np.array(
251
293
  [
252
294
  [np.sqrt(8 / 9), 0, -1 / 3],
@@ -264,8 +306,23 @@ def regular_tetraherdron_for_points(xyz, scale_parameter):
264
306
 
265
307
 
266
308
  def gradient_from_tetrahedron(tetrahedron, value):
267
- """
268
- Calculate the gradient from a tetrahedron
309
+ """Compute the gradient of values within tetrahedral elements
310
+
311
+ Parameters
312
+ ----------
313
+ tetrahedron : np.ndarray
314
+ Array of shape (n, 4, 3) representing the coordinates of tetrahedral elements,
315
+ where each tetrahedron is defined by 4 vertices in 3D space.
316
+ value : np.ndarray
317
+ Array of shape (n, 4) representing the scalar values at the 4 vertices
318
+ of each tetrahedron.
319
+
320
+ Returns
321
+ -------
322
+ np.ndarray
323
+ Array of shape (n, 3) representing the gradient vector of the scalar field
324
+ inside each tetrahedral element.
325
+
269
326
  """
270
327
  tetrahedron = tetrahedron.reshape(-1, 4, 3)
271
328
  m = np.array(
LoopStructural/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.6.13"
1
+ __version__ = "1.6.15"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: LoopStructural
3
- Version: 1.6.13
3
+ Version: 1.6.15
4
4
  Summary: 3D geological modelling
5
5
  Author-email: Lachlan Grose <lachlan.grose@monash.edu>
6
6
  License: MIT
@@ -34,7 +34,7 @@ Requires-Dist: tqdm; extra == "all"
34
34
  Provides-Extra: visualisation
35
35
  Requires-Dist: matplotlib; extra == "visualisation"
36
36
  Requires-Dist: pyvista; extra == "visualisation"
37
- Requires-Dist: loopstructuralviusualisation>=0.1.14; extra == "visualisation"
37
+ Requires-Dist: loopstructuralvisualisation>=0.1.14; extra == "visualisation"
38
38
  Provides-Extra: export
39
39
  Requires-Dist: geoh5py; extra == "export"
40
40
  Requires-Dist: pyevtk; extra == "export"
@@ -1,5 +1,5 @@
1
1
  LoopStructural/__init__.py,sha256=fg_Vm1aMDYIf_CffTFopLsTx21u6deLaI7JMVpRYdOI,1378
2
- LoopStructural/version.py,sha256=SVPBACE1uUZFOAHuNVOfFUNhVa6mv28StfR80qCbEYs,23
2
+ LoopStructural/version.py,sha256=Pie9fpkEEQtWduVE5VudTkNuOKHw2-cSLQQzkG-8ENk,23
3
3
  LoopStructural/datasets/__init__.py,sha256=ylb7fzJU_DyQ73LlwQos7VamqkDSGITbbnoKg7KAOmE,677
4
4
  LoopStructural/datasets/_base.py,sha256=FB_D5ybBYHoaNbycdkpZcRffzjrrL1xp9X0k-pyob9Y,7618
5
5
  LoopStructural/datasets/_example_models.py,sha256=Zg33IeUyh4C-lC0DRMLqCDP2IrX8L-gNV1WxJwBGjzM,113
@@ -29,50 +29,52 @@ LoopStructural/datasets/data/geological_map_data/stratigraphic_order.csv,sha256=
29
29
  LoopStructural/datasets/data/geological_map_data/stratigraphic_orientations.csv,sha256=RysyqUAIjY6iIDUfTh11n9QUQWXB_qxKnZeN_DqNzlY,26745
30
30
  LoopStructural/datasets/data/geological_map_data/stratigraphic_thickness.csv,sha256=pnSmG-wL8-kxuoHo_pgpJrfTmsZOzc8L0vxpBRh3r8A,355
31
31
  LoopStructural/datatypes/__init__.py,sha256=lVg64DnynMm58qvYTjLrcyWH7vk2ngr9JGMo5FaiALI,160
32
- LoopStructural/datatypes/_bounding_box.py,sha256=0bTujF745De-MzIch5Wzb7PD1J9j65PqHkamhLW5dZ4,18368
33
- LoopStructural/datatypes/_point.py,sha256=qg3lXUA1rnu1N1cEWG0WvhvJuENfDgpEDIeYldWBaG8,7740
32
+ LoopStructural/datatypes/_bounding_box.py,sha256=wjjqTTbdvBbmdCZZNhLe2lsnOtJd9PRv9r1djeZK2S4,18961
33
+ LoopStructural/datatypes/_point.py,sha256=R-PY8PfN72fLY3OmnlyHxTxSXZAzwbVbbjQ7qV_Ef-0,7679
34
34
  LoopStructural/datatypes/_structured_grid.py,sha256=mc-UM1Gh_BjHFItuPE4FF5wvGzJnSqF2MTx_xvrwcTk,5088
35
35
  LoopStructural/datatypes/_surface.py,sha256=5BpPKVS4X3Kq1k3YxxAofKMgxdXhnOIcDi6NzKn2p2Q,6652
36
- LoopStructural/export/exporters.py,sha256=BniZu-PqQvHqCU6GIuJQ5FPzI9Dx_T6rI8EW1pykois,17209
36
+ LoopStructural/export/exporters.py,sha256=ObnNL2MxBzmPHYuiq5DAo14dJ9Mrk-_gZWoo6mATDgI,17223
37
37
  LoopStructural/export/file_formats.py,sha256=0xKyYSW4Jv_4jsXwusg-WO6PNUhZKd6HdWSqGSaPve8,232
38
38
  LoopStructural/export/geoh5.py,sha256=jLFKC5EB0azT3PgJPtkJzi3_CG28RLgP2FuENAGCQMI,4313
39
39
  LoopStructural/export/gocad.py,sha256=cQ6v7ZD0CVubt3c2f9EwAYrziu5bEFSWBtx0uade5mg,3370
40
40
  LoopStructural/export/omf_wrapper.py,sha256=4vcF4WOQIVEYsWrfATgKCDh8nUybLTbrlXnCxZ_3fkU,3392
41
- LoopStructural/interpolators/__init__.py,sha256=8uFSHumlOuHzs_3i26DCW1QWO93en_AzAmUEJy5iUXA,3451
41
+ LoopStructural/interpolators/__init__.py,sha256=g3XgNg3KcWef4kCNPFeqSuiml2LXVZ8xbIoCphpWntQ,4180
42
42
  LoopStructural/interpolators/_api.py,sha256=EC4ogG2uPq-z_pgNGd_eTieTl92eaZ-rjyoFwXiHL_s,7839
43
43
  LoopStructural/interpolators/_builders.py,sha256=B49KsxB8RRN6IHDfGT43nXWe_Av1SVVT8vm2Nh1oEiQ,6758
44
+ LoopStructural/interpolators/_constant_norm.py,sha256=gGaDGDoEzfnL4b6386YwInCxIA-Rog2p288Z4HsXMaA,7708
44
45
  LoopStructural/interpolators/_discrete_fold_interpolator.py,sha256=eDe0R1lcQ0AuMcv7zlpu5c-soCv7AybIqQAuN2vFE3M,6542
45
- LoopStructural/interpolators/_discrete_interpolator.py,sha256=i_joZ8HOf_s6Q2L8gHFnhkdtgyED1SjATxRsRd1HxRU,26038
46
- LoopStructural/interpolators/_finite_difference_interpolator.py,sha256=mZ89FWQZ5RbzhL9UYH8VzWME-28dy331KXtYtpqepHo,18351
47
- LoopStructural/interpolators/_geological_interpolator.py,sha256=hcQuyv1zYakJ7mcDFlLj-YarjnMQvlP6pVbK1KuxBWs,11195
46
+ LoopStructural/interpolators/_discrete_interpolator.py,sha256=bPGJ1CrvLmz3m86JkXAiw7WbfbGEeGXR5cklDX54PQU,26083
47
+ LoopStructural/interpolators/_finite_difference_interpolator.py,sha256=qc7zpqJka16I7yv-GigjQxF0hWRRHyWpHm8dHersy_8,18712
48
+ LoopStructural/interpolators/_geological_interpolator.py,sha256=BXUJD1OrSbgZbJwe884FDkew0m1XxiG1mtY5Og_CFJE,11196
48
49
  LoopStructural/interpolators/_interpolator_builder.py,sha256=Z8bhmco5aSQX19A8It2SB_rG61wnlyshWfp3ivm8rU0,4586
49
50
  LoopStructural/interpolators/_interpolator_factory.py,sha256=fbjebXSe5IgTol1tnBlnsw9gD426v-TGkX3gquIg7LI,2782
51
+ LoopStructural/interpolators/_interpolatortype.py,sha256=q8U9JGyFpO2FBA9XsMI5ojv3TV1LYqyvYHzLAbHcj9A,593
50
52
  LoopStructural/interpolators/_operator.py,sha256=PZOUzq9OMaJdG151dSLIo7AxRuhTj6-zEAzFZo-EOJU,1114
51
- LoopStructural/interpolators/_p1interpolator.py,sha256=4rjj4iaw2c8hOfBS9u8ycxzijYdmvpeijvhYRwUwZg0,8736
53
+ LoopStructural/interpolators/_p1interpolator.py,sha256=o602nLrUbBQTG9G2nBtv9xUQtlgs0kyT8G1wZuyZl2M,8955
52
54
  LoopStructural/interpolators/_p2interpolator.py,sha256=UT-As5RNsmOwHOzO_6FiRcAwlNHfi4ILbJw2LGpwKAw,10274
53
- LoopStructural/interpolators/_surfe_wrapper.py,sha256=Qdz-SuPBVh7gIw4-ZLdDqHkpezmq-Y3IhtRsbW417Xk,6837
55
+ LoopStructural/interpolators/_surfe_wrapper.py,sha256=BwHOR2aV-SZU0IgcN03iZT_T-Z5EVXjDQ7Pr-a6t4uI,6932
54
56
  LoopStructural/interpolators/_cython/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- LoopStructural/interpolators/supports/_2d_base_unstructured.py,sha256=3HHZZR_YyNRRE6zNhncwopAmbhZvCNLGdpDEXOFWoTI,11878
57
+ LoopStructural/interpolators/supports/_2d_base_unstructured.py,sha256=1bOP-BZk1AcBSVRh2IVPCpKSYibwgzbnlC_2xX0xBGA,11879
56
58
  LoopStructural/interpolators/supports/_2d_p1_unstructured.py,sha256=okcy56nyjuedmknQn_95V2tm0kdMA-oJcD3U2jU8u0w,2637
57
59
  LoopStructural/interpolators/supports/_2d_p2_unstructured.py,sha256=TeBVtT1PMV7CKzmnFZke37acMoFxouer20cskS7pVoE,10422
58
- LoopStructural/interpolators/supports/_2d_structured_grid.py,sha256=Pt9fiXyTS-RTd3mxXr3EUQfB6DhKChHQ5zbWub54nW0,16347
60
+ LoopStructural/interpolators/supports/_2d_structured_grid.py,sha256=mqHkb_J2zQ09JuFXtZ-0iXlKMQlFM7voTdicCURaiqA,17004
59
61
  LoopStructural/interpolators/supports/_2d_structured_tetra.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- LoopStructural/interpolators/supports/_3d_base_structured.py,sha256=PYIkgWCTHk0OHn-T9wpF4ZFYnKyvXNZgUyqO7YcoFjU,16481
62
+ LoopStructural/interpolators/supports/_3d_base_structured.py,sha256=h0lDiZLwk08cGS4YGix3oaHJ1uFsdCGQlKUGb_Wy0Mc,17134
61
63
  LoopStructural/interpolators/supports/_3d_p2_tetra.py,sha256=CqGVJRUMxbPQZDhhopNt_s9gVhMqh4YbjQyDZonoyxc,11574
62
- LoopStructural/interpolators/supports/_3d_structured_grid.py,sha256=x9NoZRsl58iowcObavgb0nY_C335BmcIYgec9REsFpU,17366
63
- LoopStructural/interpolators/supports/_3d_structured_tetra.py,sha256=5zUNtvEXDvbCHZCu6Fz9WjGbnrMaq-sYJqNUufyLcq8,26505
64
+ LoopStructural/interpolators/supports/_3d_structured_grid.py,sha256=ha32EmyN4EouxEeEPIMiQL3yq8zDHQZRcg2yOkiDPmY,17476
65
+ LoopStructural/interpolators/supports/_3d_structured_tetra.py,sha256=zF76el1JuNTEaWonqH2MnzcFn4DmnCAwURN6PQ8N_Ig,26577
64
66
  LoopStructural/interpolators/supports/_3d_unstructured_tetra.py,sha256=_peXMTMxctuWNOL74AHxzw0b_1sP5glvbJigIvIkK9I,23867
65
67
  LoopStructural/interpolators/supports/__init__.py,sha256=V0JjixoBIUZVAo5MmqARR67xDOoQwnb4G3SXeOMRSyQ,1603
66
68
  LoopStructural/interpolators/supports/_aabb.py,sha256=Z-kH_u6c6izak0aHG3Uo14PEKQeZmYlevLDC32Q06xk,3208
67
69
  LoopStructural/interpolators/supports/_base_support.py,sha256=pYzsmeBu4kLaD9ZKsz_dfjVpfuAd00xENqOQC9Xw5QY,2501
68
70
  LoopStructural/interpolators/supports/_face_table.py,sha256=Hyj4Io63NkPRN8ab9uDHyec-2Kb8BLY_xBF6STNlvBw,3095
69
71
  LoopStructural/interpolators/supports/_support_factory.py,sha256=XNAxnr-JS3KEhdsoZeJ-VaLTJwlvxgBuRMCqYrCDW18,1485
70
- LoopStructural/modelling/__init__.py,sha256=oW7dz6c8K1A0VcW7-mVcyqcENUrtybCb3eVUNXFvMfA,656
72
+ LoopStructural/modelling/__init__.py,sha256=a-bq2gDhyUlcky5l9kl_IP3ExMdohkgYjQz2V8madQE,902
71
73
  LoopStructural/modelling/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- LoopStructural/modelling/core/geological_model.py,sha256=okbEwjL8-wGKeWhvYE-1XSOE2C1nHX7M2AR__42pyAk,66464
74
+ LoopStructural/modelling/core/geological_model.py,sha256=2NIVrPHu_8rx3Cgp9oPgFazBWHUI0dLs7vWFngfN3g0,65272
73
75
  LoopStructural/modelling/features/__init__.py,sha256=Vf-qd5EDBtJ1DpuXXyCcw2-wf6LWPRW5wzxDEO3vOc8,939
74
76
  LoopStructural/modelling/features/_analytical_feature.py,sha256=U_g86LgQhYY2359rdsDqpvziYwqrWkc5EdvhJARiUWo,3597
75
- LoopStructural/modelling/features/_base_geological_feature.py,sha256=hx1EmDGWCE8YhypWuet6SUfpoGQCSecXj6zTF-CLRRg,12179
77
+ LoopStructural/modelling/features/_base_geological_feature.py,sha256=kGyrbb8nNzfi-M8WSrVMEQYKtxThdcBxaji5HKXtAqw,13483
76
78
  LoopStructural/modelling/features/_cross_product_geological_feature.py,sha256=GIyCHUdE6F-bse2e4puG9V2f7qRtDVfby5PRe2BboD4,3021
77
79
  LoopStructural/modelling/features/_geological_feature.py,sha256=u6pbKj9BujX1Ijj5eVdhwGDNjrIAI16CpiAn5n8g3RY,11279
78
80
  LoopStructural/modelling/features/_lambda_geological_feature.py,sha256=GiB19l6v5WvvR8CitATZvCwaOfRyLuzchoXzpNupsfM,5743
@@ -84,10 +86,10 @@ LoopStructural/modelling/features/builders/__init__.py,sha256=Gqld1C-PcaXfJ8vpkW
84
86
  LoopStructural/modelling/features/builders/_base_builder.py,sha256=N3txGC98V08A8-k2TLdoIWgWLfblZ91kaTvciPq_QVM,3750
85
87
  LoopStructural/modelling/features/builders/_fault_builder.py,sha256=CeQnvgDrgMIbyPV6nB0qnpY5PJG1OYTJIukRXv4df1E,25324
86
88
  LoopStructural/modelling/features/builders/_folded_feature_builder.py,sha256=1_0BVTzcvmFl6K3_lX-jF0tiMFPmS8j6vPeSLn9MbrE,6607
87
- LoopStructural/modelling/features/builders/_geological_feature_builder.py,sha256=jn2BiZlzXyWl0_TrsajpFR2wegGOpbuO5yFu2FamuYA,22014
89
+ LoopStructural/modelling/features/builders/_geological_feature_builder.py,sha256=tQJJol1U5wH6V0Rw3OgigCFPssv8uOPQ5jdwdLFg3cc,22015
88
90
  LoopStructural/modelling/features/builders/_structural_frame_builder.py,sha256=ms3-fuFpDEarjzYU5W499TquOIlTwHPUibVxIypfmWY,8019
89
91
  LoopStructural/modelling/features/fault/__init__.py,sha256=4u0KfYzmoO-ddFGo9qd9ov0gBoLqBiPAUsaw5zhEOAQ,189
90
- LoopStructural/modelling/features/fault/_fault_function.py,sha256=xvyoFA3dOtYilKycPotAzLkzYvy-kk-4qilhqt8Q8-8,12686
92
+ LoopStructural/modelling/features/fault/_fault_function.py,sha256=QEPh2jIvgD68hEJc5SM5xuMzZw-93V1me1ZbK9G2TB0,12655
91
93
  LoopStructural/modelling/features/fault/_fault_function_feature.py,sha256=4m0jVNx7ewrVI0pECI1wNciv8Cy8FzhZrYDjKJ_e2GU,2558
92
94
  LoopStructural/modelling/features/fault/_fault_segment.py,sha256=dNTCY0ZyC8krrL1suSnhywSE_i5V_VZ4DJ2BieirkhI,18305
93
95
  LoopStructural/modelling/features/fold/__init__.py,sha256=pOv20yQvshZozvmO_YFw2E7Prp9DExlm855N-0SnxbQ,175
@@ -108,11 +110,11 @@ LoopStructural/modelling/input/project_file.py,sha256=WhJkMfDK9uE7MK7HK-YK6ZOBAd
108
110
  LoopStructural/modelling/intrusions/__init__.py,sha256=EpZK3cHJwGQhPUYIwKCKu8vkNdt_nOgWF0zfhiqDYDA,712
109
111
  LoopStructural/modelling/intrusions/geom_conceptual_models.py,sha256=jwTlhYySUj7z4DEnJoi4AINZB_N3-SW6ONRFL66OsW0,3665
110
112
  LoopStructural/modelling/intrusions/geometric_scaling_functions.py,sha256=PK3qf0TiK-WYIBGG7fYhTD1hwlUN0s75BK8d53SLYuQ,3209
111
- LoopStructural/modelling/intrusions/intrusion_builder.py,sha256=1cJjPyRUf3ZDkpwgGJ7TvY-kpqFgG9pXD8yrGfhqwYg,26381
113
+ LoopStructural/modelling/intrusions/intrusion_builder.py,sha256=PtNLDreUZTGodMwtk302TV_ifcyaR0GQPx-G7XL6wkQ,26388
112
114
  LoopStructural/modelling/intrusions/intrusion_feature.py,sha256=ESjtikHFJQzUnowbYiY7UZ_kYdV2QHobQoRJ2far9Vc,15489
113
- LoopStructural/modelling/intrusions/intrusion_frame_builder.py,sha256=Q1TPHxREcrO7Rw71nUfACZHfYnISLjqlgkUNTPT324k,40143
115
+ LoopStructural/modelling/intrusions/intrusion_frame_builder.py,sha256=YEJv2GURAL8bW6J1KscM69ZVx9yoKVQKF_gXbjB513I,40150
114
116
  LoopStructural/modelling/intrusions/intrusion_support_functions.py,sha256=wodakheMD62WJyoKnyX8UO-C1pje0I-5kHQEoDqShzo,13951
115
- LoopStructural/utils/__init__.py,sha256=OJqNSu40SYJeC26IhoBBXDqQOogWjMGA-YokKVRrwMs,924
117
+ LoopStructural/utils/__init__.py,sha256=t-vJQ0cF2DrjSRtAfuPEL4hc73XJyQno7PucBnd-fu8,950
116
118
  LoopStructural/utils/_surface.py,sha256=Eg7x1GGfELl7bPe21_wU96Dn4JWJNReEFxwq-aIV4A4,6165
117
119
  LoopStructural/utils/_transformation.py,sha256=peuLPH3BJ5DxnPbOuNKcqK4eXhAXdbT540L1OIsO3v0,5404
118
120
  LoopStructural/utils/colours.py,sha256=-KRf1MXKx4L8TXnwyiunmKAX4tfy0qG68fRadyfn_bM,1163
@@ -120,17 +122,17 @@ LoopStructural/utils/config.py,sha256=ITGOtZTo2_QBwXkG_0AFANfE90J9siCXLzxypVmg9Q
120
122
  LoopStructural/utils/dtm_creator.py,sha256=-yqGG0wyEJfTCCDghz058wull1q3zGFASjeu8oDgYnk,535
121
123
  LoopStructural/utils/exceptions.py,sha256=SJboJ7ncMqVX-ib7MMizClwMrFZRHQhjZr2eCnVwnQE,500
122
124
  LoopStructural/utils/features.py,sha256=WCatS4lYBrURNvWvWwhOsDVUod9KIPNq3x0OHPbWctU,241
123
- LoopStructural/utils/helper.py,sha256=An9NuRH16cASUWq2ZakHc1tZt_AvUpgx8tv4cyWZEQk,6581
125
+ LoopStructural/utils/helper.py,sha256=2yt_kdQIhRfik2zSAu4UhPigAM7eif1OB093ddAYtXQ,5857
124
126
  LoopStructural/utils/json_encoder.py,sha256=5YNouf1TlhjEqOYgthd07MRXc0JLgxern-nyKSZ__ws,403
125
127
  LoopStructural/utils/linalg.py,sha256=tBXyu6NXcG2AcPuzUMnkVI4ncZWtE_MPHGj2PLXRwfY,123
126
128
  LoopStructural/utils/logging.py,sha256=dIUWEsS2lT4G1dsf4ZYXknTR7eQkrgvGA4b_E0vMIRU,2402
127
- LoopStructural/utils/maths.py,sha256=8iqdQdB2-bf14SzIzfFxvjWbzmPknqK9DI7CWEcW6XU,8402
129
+ LoopStructural/utils/maths.py,sha256=KaLj9RHsxdaSkEHm4t0JEzykhiuETAV14KpjL6lknWY,10374
128
130
  LoopStructural/utils/regions.py,sha256=SjCC40GI7_n03G4mlcmvyrBgJFbxnvB3leBzXWco37o,3891
129
131
  LoopStructural/utils/typing.py,sha256=29uVSTZdzXXH-jdlaYyBWZ1gQ2-nlZ2-XoVgG_PXNFY,157
130
132
  LoopStructural/utils/utils.py,sha256=2Z4zVE6G752-SPmM29zebk82bROJxEwi_YiiJjcVED4,2438
131
133
  LoopStructural/visualisation/__init__.py,sha256=5BDgKor8-ae6DrS7IZybJ3Wq_pTnCchxuY4EgzA7v1M,318
132
- loopstructural-1.6.13.dist-info/licenses/LICENSE,sha256=ZqGeNFOgmYevj7Ld7Q-kR4lAxWXuBRUdUmPC6XM_py8,1071
133
- loopstructural-1.6.13.dist-info/METADATA,sha256=EwFSrenvuB1yMD-jpnkD6tmiESkC-xgJVTo7-lcmL3I,6454
134
- loopstructural-1.6.13.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
135
- loopstructural-1.6.13.dist-info/top_level.txt,sha256=QtQErKzYHfg6ddxTQ1NyaTxXBVM6qAqrM_vxEPyXZLg,15
136
- loopstructural-1.6.13.dist-info/RECORD,,
134
+ loopstructural-1.6.15.dist-info/licenses/LICENSE,sha256=ZqGeNFOgmYevj7Ld7Q-kR4lAxWXuBRUdUmPC6XM_py8,1071
135
+ loopstructural-1.6.15.dist-info/METADATA,sha256=2aOi3Osgig1KIQcpmKAyTDOJbo1DksD-mA3SICfAbI0,6453
136
+ loopstructural-1.6.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
137
+ loopstructural-1.6.15.dist-info/top_level.txt,sha256=QtQErKzYHfg6ddxTQ1NyaTxXBVM6qAqrM_vxEPyXZLg,15
138
+ loopstructural-1.6.15.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5