subsurface-terra 2025.1.0rc19__py3-none-any.whl → 2026.1.1rc1__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.
subsurface/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2025.1.0rc19'
32
- __version_tuple__ = version_tuple = (2025, 1, 0, 'rc19')
31
+ __version__ = version = '2026.1.1rc1'
32
+ __version_tuple__ = version_tuple = (2026, 1, 1, 'rc1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -216,7 +216,7 @@ def _map_attrs_to_measured_depths(attrs: pd.DataFrame, survey_trajectory: LineSe
216
216
  continue
217
217
 
218
218
  attr_values = attrs_well[col]
219
- is_categorical = attr_values.dtype == 'O' or isinstance(attr_values.dtype, pd.CategoricalDtype)
219
+ is_categorical = attr_values.dtype == 'O' or isinstance(attr_values.dtype, pd.CategoricalDtype) or isinstance(attr_values.dtype, pd.StringDtype)
220
220
 
221
221
  # Skip columns that can't be interpolated and aren't categorical
222
222
  if is_categorical and col not in ['lith_ids', 'component lith']:
@@ -231,6 +231,11 @@ def _map_attrs_to_measured_depths(attrs: pd.DataFrame, survey_trajectory: LineSe
231
231
  is_categorical
232
232
  )
233
233
 
234
+ # Convert to appropriate dtype to avoid pandas 3.0 dtype coercion errors
235
+ target_dtype = new_attrs[col].dtype
236
+ if pd.api.types.is_numeric_dtype(target_dtype) and not is_categorical:
237
+ interpolated_values = np.asarray(interpolated_values, dtype=target_dtype)
238
+
234
239
  new_attrs.loc[well_mask, col] = interpolated_values
235
240
 
236
241
  return new_attrs
@@ -32,7 +32,7 @@ class GenericReaderFilesHelper(BaseModel):
32
32
  index_map: Optional[dict] = None # Adjusted for serialization
33
33
  columns_map: Optional[dict] = None # Adjusted for serialization
34
34
  additional_reader_kwargs: dict = Field(default_factory=dict)
35
- encoding: str = "ISO-8859-1"
35
+ encoding: str = "utf-8"
36
36
  index_col: Optional[Union[int, str, bool]] = False
37
37
  header: Union[None, int, List[int]] = 0
38
38
 
@@ -14,6 +14,10 @@ class StructuredDataType(enum.Enum):
14
14
  IRREGULAR_AXIS_ALIGNED = 2 #: Irregular axis aligned grid. Distance between consecutive points is not constant
15
15
  IRREGULAR_AXIS_UNALIGNED = 3 #: Irregular axis unaligned grid. Distance between consecutive points is not constant
16
16
 
17
+ # [CLN] This terminology looks odd to me.
18
+ # "Uniform" vs. "non-uniform" is what PyVista uses instead of "regular" vs. "irregular".
19
+ # "Rectilinear" vs. "curvilinear" is what Pyvista uses instead of "axis-aligned" vs "axis-unaligned".
20
+ # As of right now it's not clear to me that anything other than REGULAR_AXIS_ALIGNED is actually valid in this file.
17
21
 
18
22
  @dataclass(frozen=False)
19
23
  class StructuredData:
@@ -85,12 +89,49 @@ class StructuredData:
85
89
  return cls(dataset, data_array_name)
86
90
 
87
91
  @classmethod
88
- def from_pyvista_structured_grid(
92
+ def from_pyvista(
89
93
  cls,
90
- grid: Union["pyvista.ExplicitStructuredGrid", "pyvista.StructuredGrid"],
94
+ pyvista_object: 'pyvista.DataSet',
91
95
  data_array_name: str = "data_array"
92
96
  ):
93
97
  pyvista = require_pyvista()
98
+
99
+ def rectilinear_is_uniform(
100
+ rectilinear_grid: pyvista.RectilinearGrid,
101
+ relative_tolerance: float = 1e-6,
102
+ absolute_tolerance: float = 1e-12,
103
+ ) -> bool:
104
+
105
+ def axis_is_uniform(v: np.ndarray) -> bool:
106
+ v = np.asarray(v, dtype=float)
107
+ if v.size <= 2:
108
+ # 0, 1 or 2 points → treat as uniform for our purposes
109
+ return True
110
+ diffs = np.diff(v)
111
+ first = diffs[0]
112
+ return np.allclose(diffs, first, rtol=relative_tolerance, atol=absolute_tolerance)
113
+
114
+ return (axis_is_uniform(rectilinear_grid.x)
115
+ and axis_is_uniform(rectilinear_grid.y)
116
+ and axis_is_uniform(rectilinear_grid.z))
117
+
118
+ extended_help_message = "Only uniform rectilinear grids are currently supported. The VTK format is developed by KitWare and you can use their free software ParaView to further inspect your file. In ParaView, in Information > Data Statistics, the Type must be Image (Uniform Rectilinear Grid). Furthermore, you can use ParaView to interpolate your data on to a uniform rectilinear grid and to export it as Image type."
119
+
120
+ match pyvista_object:
121
+ case pyvista.UnstructuredGrid():
122
+ # In a previous version of Subsurface there was an ill-formed attempt at supporting some unstructured grids here.
123
+ # I've left this function to minimize downstream changes and also in case we decide to revive anything in that direction.
124
+ raise ValueError(f"Cannot generally convert unstructured grids to structured grids. {extended_help_message}")
125
+ case pyvista.ImageData():
126
+ pass
127
+ case pyvista.RectilinearGrid() as rectilinear:
128
+ if not rectilinear_is_uniform(rectilinear):
129
+ raise NotImplementedError(f"Non-uniform rectilinear grid conversion is not yet implemented. {extended_help_message}")
130
+ case _:
131
+ raise ValueError(f"Unexpected VTK grid type. {extended_help_message}")
132
+
133
+ grid = pyvista_object.cast_to_structured_grid()
134
+
94
135
  # Extract p
95
136
 
96
137
  # Extract cell data and point data (if any)
@@ -82,7 +82,7 @@ def _process_mesh(mesh_lines) -> Optional[GOCADMesh]:
82
82
  in_header = False
83
83
  in_coord_sys = False
84
84
  in_property_class_header = False
85
- in_tface = False
85
+ in_geometry = False
86
86
  current_property_class_header = {}
87
87
  vertex_list = []
88
88
  vertex_indices = []
@@ -152,11 +152,16 @@ def _process_mesh(mesh_lines) -> Optional[GOCADMesh]:
152
152
  current_property_class_header[line.strip()] = None
153
153
  continue
154
154
 
155
- if line == 'TFACE':
156
- in_tface = True
157
- continue
155
+ if not in_geometry:
156
+ if line == 'TFACE':
157
+ in_geometry = True
158
+ continue
159
+ if line.startswith(("VRTX", "PVRTX", "ATOM", "TRGL", "BSTONE", "BORDER")):
160
+ # Some TSurf files omit TFACE; geometry can start immediately.
161
+ in_geometry = True
162
+ # Do not `continue`. The geometry is already in the current line.
158
163
 
159
- if in_tface:
164
+ if in_geometry:
160
165
  if line.startswith('VRTX') or line.startswith('PVRTX'):
161
166
  # Parse vertex line
162
167
  parts = line.split()
@@ -207,7 +212,7 @@ def _process_mesh(mesh_lines) -> Optional[GOCADMesh]:
207
212
  mesh.borders.append({'id': int(bid), 'v1': int(v1), 'v2': int(v2)})
208
213
  continue
209
214
  elif line == 'END':
210
- in_tface = False
215
+ in_geometry = False
211
216
  continue
212
217
  else:
213
218
  pass
@@ -32,19 +32,14 @@ def read_VTK_structured_grid(file_or_buffer: Union[str, BytesIO], active_scalars
32
32
  else:
33
33
  # If it's a file path, read directly
34
34
  pyvista_obj = pv.read(file_or_buffer)
35
+
35
36
  try:
36
- pyvista_struct: pv.ExplicitStructuredGrid = pv_cast_to_explicit_structured_grid(pyvista_obj)
37
+ struct: StructuredData = StructuredData.from_pyvista(
38
+ pyvista_object=pyvista_obj,
39
+ data_array_name=active_scalars
40
+ )
37
41
  except Exception as e:
38
- raise ValueError(f"The file is not a structured grid: {e}")
39
-
40
- if PLOT := False:
41
- pyvista_struct.set_active_scalars(active_scalars)
42
- pyvista_struct.plot()
43
-
44
- struct: StructuredData = StructuredData.from_pyvista_structured_grid(
45
- grid=pyvista_struct,
46
- data_array_name=active_scalars
47
- )
42
+ raise ValueError(f"Failed to convert to StructuredData: {e}")
48
43
 
49
44
  return struct
50
45
 
@@ -102,230 +97,13 @@ def read_volumetric_mesh_attr_file(reader_helper: GenericReaderFilesHelper) -> p
102
97
  return df
103
98
 
104
99
 
105
- def pv_cast_to_explicit_structured_grid(pyvista_object: 'pv.DataSet') -> 'pv.ExplicitStructuredGrid':
100
+ def pv_cast_to_structured_grid(pyvista_object: 'pv.DataSet') -> 'pv.StructuredGrid':
106
101
  pv = optional_requirements.require_pyvista()
107
102
 
108
103
  match pyvista_object:
109
- case pv.RectilinearGrid() as rectl_grid:
110
- return __pv_convert_rectilinear_to_explicit(rectl_grid)
111
- case pv.UnstructuredGrid() as unstr_grid:
112
- return __pv_convert_unstructured_to_explicit(unstr_grid)
104
+ case pv.UnstructuredGrid():
105
+ # In a previous version of Subsurface there was an ill-formed attempt at supporting some unstructured grids here.
106
+ # I've left this function to minimize downstream changes and also in case we decide to revive anything in that direction.
107
+ raise ValueError("Cannot generally convert unstructured grids to structured grids.")
113
108
  case _:
114
- return pyvista_object.cast_to_explicit_structured_grid()
115
-
116
-
117
- def __pv_convert_unstructured_to_explicit(unstr_grid):
118
- """
119
- Convert a PyVista UnstructuredGrid to an ExplicitStructuredGrid if possible.
120
- """
121
- pv = optional_requirements.require_pyvista()
122
-
123
- # First check if the grid has the necessary attributes to be treated as structured
124
- if not hasattr(unstr_grid, 'n_cells') or unstr_grid.n_cells == 0:
125
- raise ValueError("The unstructured grid has no cells.")
126
-
127
- # Try to detect if the grid has a structured topology
128
- # Check if the grid has cell type 11 (VTK_VOXEL) or 12 (VTK_HEXAHEDRON)
129
- cell_types = unstr_grid.celltypes
130
-
131
- # Voxels (11) and hexahedra (12) are the cell types used in structured grids
132
- if not all(ct in [11, 12] for ct in cell_types):
133
- raise ValueError("The unstructured grid contains non-hexahedral cells and cannot be converted to explicit structured.")
134
-
135
- # Try to infer dimensions from the grid
136
- try:
137
- # Method 1: Try PyVista's built-in conversion if available
138
- return unstr_grid.cast_to_explicit_structured_grid()
139
- except (AttributeError, TypeError):
140
- pass
141
-
142
- try:
143
- # Method 2: If the grid has dimensions stored as field data
144
- if "dimensions" in unstr_grid.field_data:
145
- dims = unstr_grid.field_data["dimensions"]
146
- if len(dims) == 3:
147
- nx, ny, nz = dims
148
- # Verify that dimensions match the number of cells
149
- if (nx-1)*(ny-1)*(nz-1) != unstr_grid.n_cells:
150
- raise ValueError("Stored dimensions do not match the number of cells.")
151
-
152
- # Extract points and reorder if needed
153
- points = unstr_grid.points.reshape((nx, ny, nz, 3))
154
-
155
- # Create explicit structured grid
156
- explicit_grid = pv.ExplicitStructuredGrid((nx, ny, nz), points.reshape((-1, 3)))
157
- explicit_grid.compute_connectivity()
158
-
159
- # Transfer data arrays
160
- for name, array in unstr_grid.cell_data.items():
161
- explicit_grid.cell_data[name] = array.copy()
162
- for name, array in unstr_grid.point_data.items():
163
- explicit_grid.point_data[name] = array.copy()
164
- for name, array in unstr_grid.field_data.items():
165
- if name != "dimensions": # Skip dimensions field
166
- explicit_grid.field_data[name] = array.copy()
167
-
168
- return explicit_grid
169
- except (ValueError, KeyError):
170
- pass
171
-
172
- # If none of the above methods work, use PyVista's extract_cells function
173
- # to reconstruct the structured grid if possible
174
- try:
175
- # This is a best-effort approach that tries multiple strategies
176
- return pv.core.filters.convert_unstructured_to_structured_grid(unstr_grid)
177
- except Exception as e:
178
- raise ValueError(f"Failed to convert unstructured grid to explicit structured grid: {e}")
179
-
180
-
181
- def __pv_convert_rectilinear_to_explicit(rectl_grid, *, temp_dtype=None):
182
- """
183
- Convert a PyVista RectilinearGrid to an ExplicitStructuredGrid with low peak memory.
184
-
185
- Behavior:
186
- - Output points are in world coordinates, dtype matches rectl_grid.points.dtype.
187
- - Data arrays are shallow-transferred (no deep copies).
188
- - temp_dtype controls the large temporary `corners` buffer dtype.
189
- * If temp_dtype is None (default), use float32 when the output dtype is wider (e.g., float64),
190
- else use the output dtype. This reduces peak memory automatically.
191
- * If temp_dtype < output dtype, coordinates are recentred for precision and origin is added back after.
192
-
193
- Parameters
194
- ----------
195
- rectl_grid : pv.RectilinearGrid
196
- temp_dtype : numpy dtype or None
197
- Dtype for building the temporary `corners` array. Examples:
198
- - None (default): auto -> float32 if output dtype is wider, else output dtype.
199
- - np.float32: memory-friendly; auto recenters & restores origin.
200
- - np.float64: highest precision (more memory).
201
-
202
- Returns
203
- -------
204
- pv.ExplicitStructuredGrid
205
- """
206
- import numpy as np
207
- pv = optional_requirements.require_pyvista()
208
-
209
- # Output dtype follows source grid points (usually float64)
210
- out_dtype = getattr(rectl_grid.points, "dtype", np.float64)
211
-
212
- # Auto-pick temp dtype: prefer float32 when output is wider (e.g., float64)
213
- if temp_dtype is None:
214
- temp_dtype = np.float32 if (
215
- np.dtype(out_dtype).kind == 'f' and np.dtype(out_dtype).itemsize > 4) else out_dtype
216
-
217
- # Coordinate arrays
218
- x = np.asarray(rectl_grid.x)
219
- y = np.asarray(rectl_grid.y)
220
- z = np.asarray(rectl_grid.z)
221
-
222
- # Decide if we must recenter (when temp dtype is lower precision than output dtype)
223
- def _is_lower_precision(src, dst):
224
- s, d = np.dtype(src), np.dtype(dst)
225
- if s.kind != 'f' or d.kind != 'f':
226
- return s != d
227
- return s.itemsize < d.itemsize
228
-
229
- if _is_lower_precision(temp_dtype, out_dtype):
230
- origin = np.array([x[0], y[0], z[0]], dtype=np.float64)
231
- x_base, y_base, z_base = x - origin[0], y - origin[1], z - origin[2]
232
- else:
233
- origin = None
234
- x_base, y_base, z_base = x, y, z
235
-
236
- # Double coordinates (interior duplication expected by ExplicitStructuredGrid ctor)
237
- def _doubled(arr):
238
- # [a,b,c,d] -> [a, b,b, c,c, d]
239
- return np.repeat(arr, 2)[1:-1]
240
-
241
- xcorn = _doubled(x_base)
242
- ycorn = _doubled(y_base)
243
- zcorn = _doubled(z_base)
244
-
245
- nx2, ny2, nz2 = len(xcorn), len(ycorn), len(zcorn)
246
- slab = ny2 * nz2
247
- N = nx2 * slab
248
-
249
- # Build corners via slab/chunked fill (avoids N-sized intermediates)
250
- yz = np.empty((slab, 2), dtype=temp_dtype)
251
- yz[:, 0] = np.repeat(ycorn, nz2).astype(temp_dtype, copy=False) # Y pattern
252
- yz[:, 1] = np.tile(zcorn, ny2).astype(temp_dtype, copy=False) # Z pattern
253
-
254
- corners = np.empty((N, 3), dtype=temp_dtype)
255
- for i, xv in enumerate(xcorn):
256
- start = i * slab
257
- end = start + slab
258
- corners[start:end, 0] = xv
259
- corners[start:end, 1:3] = yz
260
-
261
- # Construct explicit grid
262
- dims = (len(x), len(y), len(z))
263
- explicit = pv.ExplicitStructuredGrid(dims, corners)
264
- explicit.compute_connectivity()
265
-
266
- # Always return world coordinates; add origin back and cast to out_dtype in one fused pass
267
- if origin is not None:
268
- new_pts = np.empty_like(explicit.points, dtype=out_dtype)
269
- np.add(explicit.points, origin, out=new_pts, dtype=out_dtype)
270
- explicit.points = new_pts
271
- else:
272
- if explicit.points.dtype != out_dtype:
273
- explicit.points = explicit.points.astype(out_dtype, copy=False)
274
-
275
- # Shallow-transfer all data arrays (no deep copies)
276
- for name, arr in rectl_grid.cell_data.items():
277
- explicit.cell_data[name] = arr
278
- for name, arr in rectl_grid.point_data.items():
279
- explicit.point_data[name] = arr
280
- for name, arr in rectl_grid.field_data.items():
281
- explicit.field_data[name] = arr
282
-
283
- __validate_rectilinear_to_explicit_conversion(rectl_grid, explicit)
284
-
285
- return explicit
286
-
287
-
288
- def __validate_rectilinear_to_explicit_conversion(rectl_grid, explicit_grid, *, atol=1e-6, rtol=1e-8) -> None:
289
- """
290
- Validate core equivalence between a RectilinearGrid and its ExplicitStructuredGrid.
291
- Raises ValueError on mismatch. Avoids large 3D uniques / big temporaries.
292
- """
293
- import numpy as np
294
-
295
- # dims & counts
296
- nx, ny, nz = map(int, rectl_grid.dimensions)
297
- if tuple(map(int, explicit_grid.dimensions)) != (nx, ny, nz):
298
- raise ValueError(f"Dimensions differ: explicit {tuple(explicit_grid.dimensions)} vs rect {tuple(rectl_grid.dimensions)}")
299
-
300
- expected_cells = (nx - 1) * (ny - 1) * (nz - 1)
301
- if explicit_grid.n_cells != expected_cells:
302
- raise ValueError(f"Cell count mismatch: explicit {explicit_grid.n_cells} vs expected {expected_cells}")
303
-
304
- # Accept either nodes (M) or corners (N) for n_points, depending on PyVista/VTK version
305
- M = nx * ny * nz
306
- N = (2 * (nx - 1)) * (2 * (ny - 1)) * (2 * (nz - 1))
307
- if explicit_grid.n_points not in (M, N):
308
- raise ValueError(
309
- f"Point count unexpected: explicit {explicit_grid.n_points}; expected either nodes {M} or corners {N}"
310
- )
311
-
312
- # bounds
313
- if not np.allclose(explicit_grid.bounds, rectl_grid.bounds, rtol=rtol, atol=atol):
314
- raise ValueError(f"Bounds differ: explicit {explicit_grid.bounds} vs rect {rectl_grid.bounds}")
315
-
316
- # axis coordinates (order-independent, light memory use: 1D uniques per axis)
317
- pts = explicit_grid.points # may be M×3 (unique nodes) or N×3 (corner lattice)
318
- x_exp = np.unique(pts[:, 0])
319
- y_exp = np.unique(pts[:, 1])
320
- z_exp = np.unique(pts[:, 2])
321
-
322
- x_rect = np.asarray(rectl_grid.x)
323
- y_rect = np.asarray(rectl_grid.y)
324
- z_rect = np.asarray(rectl_grid.z)
325
-
326
- if len(x_exp) != len(x_rect) or not np.allclose(x_exp, x_rect, rtol=rtol, atol=atol):
327
- raise ValueError("X axis coordinates differ.")
328
- if len(y_exp) != len(y_rect) or not np.allclose(y_exp, y_rect, rtol=rtol, atol=atol):
329
- raise ValueError("Y axis coordinates differ.")
330
- if len(z_exp) != len(z_rect) or not np.allclose(z_exp, z_rect, rtol=rtol, atol=atol):
331
- raise ValueError("Z axis coordinates differ.")
109
+ return pyvista_object.cast_to_structured_grid()
@@ -16,6 +16,7 @@ def check_format_and_read_to_df(reader_helper: GenericReaderFilesHelper) -> pd.D
16
16
  d = reader(
17
17
  filepath_or_buffer=reader_helper.file_or_buffer,
18
18
  sep=reader_helper.separator,
19
+ engine='python',
19
20
  **reader_helper.pandas_reader_kwargs
20
21
  )
21
22
  case (bytes() | io.BytesIO() | io.StringIO() | io.TextIOWrapper()), _:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: subsurface_terra
3
- Version: 2025.1.0rc19
3
+ Version: 2026.1.1rc1
4
4
  Summary: Subsurface data types and utilities. This version is the one used by Terranigma Solutions. Please feel free to take anything in this repository for the original one.
5
5
  Home-page: https://softwareunderground.github.io/subsurface
6
6
  Author: Software Underground
@@ -1,5 +1,5 @@
1
1
  subsurface/__init__.py,sha256=7_KttQl8rZeJG2AIZUEA_oXRWZYkJ6DUqKjqlLgF9cA,899
2
- subsurface/_version.py,sha256=Eu71ydzhRm4du5tKL1VhSCZmifO4qCBWUC1Wgfjx7ag,722
2
+ subsurface/_version.py,sha256=x_XUkgur2S5FBHy9HGt2HBG6flOou1FypU142m3se8w,720
3
3
  subsurface/optional_requirements.py,sha256=SLaMSoiGTx8ea8rpHee4Zs4te0BXcxxDWC4SF0g0RuE,2767
4
4
  subsurface/api/__init__.py,sha256=Lfx7Dq0GzQsea19w8YO4v1ZSmgeLRgR6IvjvDDjjpDY,356
5
5
  subsurface/api/interfaces/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
@@ -11,14 +11,14 @@ subsurface/core/geological_formats/__init__.py,sha256=jOyPsC3ZEMFljo9SGk0ym7cmBZ
11
11
  subsurface/core/geological_formats/fault.py,sha256=Rsy8uvtOQCd9qxI6pfNDNE9DE3XTY4R7_ibU8ZQyG7Y,1500
12
12
  subsurface/core/geological_formats/boreholes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  subsurface/core/geological_formats/boreholes/_combine_trajectories.py,sha256=2CC_zp_ZpWw7RM7vSbFRWWpTYchs0h6Qagm-HumqJyw,5129
14
- subsurface/core/geological_formats/boreholes/_map_attrs_to_survey.py,sha256=Sb7wZOrryoNWjWehhDPCdvPIcsAzv8oHTMlar2GIqPo,8858
14
+ subsurface/core/geological_formats/boreholes/_map_attrs_to_survey.py,sha256=BC143dgj6DzBmAerqDzo6pfqU1gUh3cQe6_LrZDnaSY,9230
15
15
  subsurface/core/geological_formats/boreholes/_survey_to_unstruct.py,sha256=toQvj1rgkucYyvjSlh0zsbP3fcJAXLCYLIbZh-boSsU,6430
16
16
  subsurface/core/geological_formats/boreholes/boreholes.py,sha256=wFeyT_G4N8bh6eYGQshOic_2bs8OGIv32Kr7SrSI5r4,6405
17
17
  subsurface/core/geological_formats/boreholes/collars.py,sha256=JdcrIy1JN7QS6gL1SzzqUwelanIX8geAH4r57HdhdGA,724
18
18
  subsurface/core/geological_formats/boreholes/survey.py,sha256=ajb0Y9nylmIiK9J3MyGF8kDp5MO5MdH-Z62-ubbOrbM,3500
19
19
  subsurface/core/reader_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  subsurface/core/reader_helpers/reader_unstruct.py,sha256=qoPR2q3jGLL4NeRKM38C4PEi92EA7w8vOLaYu2TVn6g,386
21
- subsurface/core/reader_helpers/readers_data.py,sha256=3NEB4A48mBBUx9XM5NRZeavCn5XAw9PWIclHqKzYrcA,4865
21
+ subsurface/core/reader_helpers/readers_data.py,sha256=arpac1A2v2BhwvjYF5TghQY_JdK-xlwno2qNPpY_ny0,4860
22
22
  subsurface/core/reader_helpers/readers_wells.py,sha256=7ja2UJRe2oB3a4LReDfrt6rAEdNnFyUB9-pBqFKfYUc,392
23
23
  subsurface/core/structs/__init__.py,sha256=e0kDVRU-5aHrVGnHrjplXDr_HFcIAnd_coFC5cc-ytg,172
24
24
  subsurface/core/structs/base_structures/__init__.py,sha256=K3eZixAH9bbN156a7OS9mS-qd3pmBZrrOn1y9ISTHJI,92
@@ -26,7 +26,7 @@ subsurface/core/structs/base_structures/_aux.py,sha256=lJ40ELPHoZRDvXjBZd1j3r_aj
26
26
  subsurface/core/structs/base_structures/_liquid_earth_mesh.py,sha256=ZIGLdxbOyC0avIXR6w5JMhk08JtPKJDnGd2Athtx7DM,5729
27
27
  subsurface/core/structs/base_structures/_unstructured_data_constructor.py,sha256=nSsmRqyGyrU5DKb0YQKy6FwZm6GVBTPwwTLZJsXPcyk,2671
28
28
  subsurface/core/structs/base_structures/base_structures_enum.py,sha256=_B1rsaTnPw6mJhYea0ZIfKmaF3mfkojh-3N5hGG6o5w,90
29
- subsurface/core/structs/base_structures/structured_data.py,sha256=N6KcAeZJSfd4Wa0PID8aOcw9IIXrNRZ_DspBzF8JPTY,10310
29
+ subsurface/core/structs/base_structures/structured_data.py,sha256=Zy1xrsSotzNXKybs1OwBomE5Bj81TV0EOx2D9hIUZAc,12802
30
30
  subsurface/core/structs/base_structures/unstructured_data.py,sha256=8HzBq5gR_bw4xDa96Zwqhu4mmDx8seanNUWPfYISgCk,13727
31
31
  subsurface/core/structs/structured_elements/__init__.py,sha256=wQ8z6vioC98TNwnqMHlDMVFJ1yOKsmlVa6kHL1SOfZQ,43
32
32
  subsurface/core/structs/structured_elements/octree_mesh.py,sha256=3WIgKGPJ3xjjV06gGlLuW7W7POfsJi2z7p4egYD-Y7s,230
@@ -52,7 +52,7 @@ subsurface/modules/reader/mesh/_trimesh_reader.py,sha256=d1gaVDHg9uIjz3F-7ivZBt_
52
52
  subsurface/modules/reader/mesh/csv_mesh_reader.py,sha256=pSuGdzhLXuesCDBudfvgDOsRef4Ns2vUsXa6x_noZNE,1916
53
53
  subsurface/modules/reader/mesh/dxf_reader.py,sha256=0jKnt9FxIgIxkK4OX56maw82XwnqxVVv6jPxjqkz3v4,6348
54
54
  subsurface/modules/reader/mesh/glb_reader.py,sha256=-ykfmRZTFhK_8OZ2qxw1HL6YWg6wkHdkI63cf-12owI,1088
55
- subsurface/modules/reader/mesh/mx_reader.py,sha256=5HJ5_kMF35NY3EI2nvVQy3EGIigO3yFkbuBWOhGe3Y8,8355
55
+ subsurface/modules/reader/mesh/mx_reader.py,sha256=PiBERySW8xK4AojPQtY9z7JibENU6y2kdKC1Q-7IWGA,8690
56
56
  subsurface/modules/reader/mesh/obj_reader.py,sha256=7caSKDFjoKH0K7D_nEgfXAWS1xYVtPShwNcvjUdyOH8,2154
57
57
  subsurface/modules/reader/mesh/omf_mesh_reader.py,sha256=oH0eLzcw125BN3Haau73FUWFgbyz3XdwpXqYPsJPX9A,1393
58
58
  subsurface/modules/reader/mesh/surface_reader.py,sha256=_ogAF1C9IbaENC5tVVPUWRwV7_kmnVYcsYOitL1OrwY,2364
@@ -64,12 +64,12 @@ subsurface/modules/reader/topography/__init__.py,sha256=U41kQFNPpfYV6KJpMnkqgqLk
64
64
  subsurface/modules/reader/topography/topo_core.py,sha256=EzcRFJ_zBojVtZkZHbYaUpEIyFUiVaf6zeSWMuyAxxk,3442
65
65
  subsurface/modules/reader/volume/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  subsurface/modules/reader/volume/read_grav3d.py,sha256=5-g65mOMYiOiLqGu3_foDZDGFUIiavkKFC7uZ99v4Dk,14493
67
- subsurface/modules/reader/volume/read_volume.py,sha256=pWZMCzJ6tDnJnVmeO8_ATRBWdXM3VG1J9qX3wN4g6NA,13789
67
+ subsurface/modules/reader/volume/read_volume.py,sha256=W1meuMPbkW8S3Nh7KN2DnNWNFoHHgOp0kv7GQkL7oM8,4386
68
68
  subsurface/modules/reader/volume/segy_reader.py,sha256=Yd1fguaKMrgv514Yc8tBm1NxDhWNtI1qOYWWTF_TgPU,3853
69
69
  subsurface/modules/reader/volume/seismic.py,sha256=Iy5zKpjVy7vV6lKyfh_MsUpex6yBMGbovu640NlKkMM,4777
70
70
  subsurface/modules/reader/volume/volume_utils.py,sha256=7Ih6JLrMRotQHO9g0bS43IgsefpiXwcx79EKUBDLhdE,1324
71
71
  subsurface/modules/reader/wells/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- subsurface/modules/reader/wells/_read_to_df.py,sha256=vbiQXxKOyVTbRNdSCByK8In-JKJ5sOo4J583NfkhvmA,2237
72
+ subsurface/modules/reader/wells/_read_to_df.py,sha256=bAfh-K372qXwRDEBYIyS4Vy1qOg1OYaOXjGDQoa0fx0,2270
73
73
  subsurface/modules/reader/wells/read_borehole_interface.py,sha256=9b9evxY7HScOF51Iaa7Om3ImQypaSBuoCx8uV53oQeI,5751
74
74
  subsurface/modules/reader/wells/wells_utils.py,sha256=46o3mm9hpreaeo4P7izx7tLC6wGyynRMUU1JMnK9930,2138
75
75
  subsurface/modules/reader/wells/DEP/__init__.py,sha256=IV0_m6AY2NM-IVImhBZnLmIaQIzunt7wg79sqPrxV2I,1844
@@ -92,8 +92,8 @@ subsurface/modules/writer/to_rex/material_encoder.py,sha256=J5x1PCW2ljw4JZXLvefG
92
92
  subsurface/modules/writer/to_rex/mesh_encoder.py,sha256=dTGqHGbJKgtPgrrG2lrks5r8timfzluqj7JLMC-EBWQ,6291
93
93
  subsurface/modules/writer/to_rex/to_rex.py,sha256=dFCCWudTUzZebNrPxnM353_vaykE8PQobVtBAPQkb3E,3685
94
94
  subsurface/modules/writer/to_rex/utils.py,sha256=BmMT49WRvbbSuiW_muIvFm4ILR1vcVqh_J23leiMB44,364
95
- subsurface_terra-2025.1.0rc19.dist-info/licenses/LICENSE,sha256=QEY_TMj0mh5hY6jh6avflZOz0GmH1PgurVoF3FvwXaY,11403
96
- subsurface_terra-2025.1.0rc19.dist-info/METADATA,sha256=GS3ViagAJ5WQfn0XCWo8aiHTmUJ98m_AM4WpLQog6rE,6978
97
- subsurface_terra-2025.1.0rc19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
98
- subsurface_terra-2025.1.0rc19.dist-info/top_level.txt,sha256=f32R_tUSf83CfkpB4vjv5m2XcD8TmDX9h7F4rnEXt5A,11
99
- subsurface_terra-2025.1.0rc19.dist-info/RECORD,,
95
+ subsurface_terra-2026.1.1rc1.dist-info/licenses/LICENSE,sha256=QEY_TMj0mh5hY6jh6avflZOz0GmH1PgurVoF3FvwXaY,11403
96
+ subsurface_terra-2026.1.1rc1.dist-info/METADATA,sha256=BGDU1h_Urn7IMMscBrp8tpM7mSobDMcDsxWEd58_Jxg,6977
97
+ subsurface_terra-2026.1.1rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
98
+ subsurface_terra-2026.1.1rc1.dist-info/top_level.txt,sha256=f32R_tUSf83CfkpB4vjv5m2XcD8TmDX9h7F4rnEXt5A,11
99
+ subsurface_terra-2026.1.1rc1.dist-info/RECORD,,