resqpy 4.14.1__py3-none-any.whl → 5.1.5__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- resqpy/__init__.py +1 -1
- resqpy/fault/_gcs_functions.py +10 -10
- resqpy/fault/_grid_connection_set.py +277 -113
- resqpy/grid/__init__.py +2 -3
- resqpy/grid/_defined_geometry.py +3 -3
- resqpy/grid/_extract_functions.py +2 -1
- resqpy/grid/_grid.py +95 -12
- resqpy/grid/_grid_types.py +22 -7
- resqpy/grid/_points_functions.py +1 -1
- resqpy/grid/_regular_grid.py +6 -2
- resqpy/grid_surface/__init__.py +17 -38
- resqpy/grid_surface/_blocked_well_populate.py +5 -5
- resqpy/grid_surface/_find_faces.py +1349 -253
- resqpy/lines/_polyline.py +24 -33
- resqpy/model/_catalogue.py +9 -0
- resqpy/model/_forestry.py +18 -14
- resqpy/model/_hdf5.py +11 -3
- resqpy/model/_model.py +85 -10
- resqpy/model/_xml.py +38 -13
- resqpy/multi_processing/wrappers/grid_surface_mp.py +92 -37
- resqpy/olio/read_nexus_fault.py +8 -2
- resqpy/olio/relperm.py +1 -1
- resqpy/olio/transmission.py +8 -8
- resqpy/olio/triangulation.py +36 -30
- resqpy/olio/vector_utilities.py +340 -6
- resqpy/olio/volume.py +0 -20
- resqpy/olio/wellspec_keywords.py +19 -13
- resqpy/olio/write_hdf5.py +1 -1
- resqpy/olio/xml_et.py +12 -0
- resqpy/property/__init__.py +6 -4
- resqpy/property/_collection_add_part.py +4 -3
- resqpy/property/_collection_create_xml.py +4 -2
- resqpy/property/_collection_get_attributes.py +4 -0
- resqpy/property/attribute_property_set.py +311 -0
- resqpy/property/grid_property_collection.py +11 -11
- resqpy/property/property_collection.py +79 -31
- resqpy/property/property_common.py +3 -8
- resqpy/rq_import/_add_surfaces.py +34 -14
- resqpy/rq_import/_grid_from_cp.py +2 -2
- resqpy/rq_import/_import_nexus.py +75 -48
- resqpy/rq_import/_import_vdb_all_grids.py +64 -52
- resqpy/rq_import/_import_vdb_ensemble.py +12 -13
- resqpy/surface/_mesh.py +4 -0
- resqpy/surface/_surface.py +593 -118
- resqpy/surface/_tri_mesh.py +22 -12
- resqpy/surface/_tri_mesh_stencil.py +4 -4
- resqpy/surface/_triangulated_patch.py +71 -51
- resqpy/time_series/_any_time_series.py +7 -4
- resqpy/time_series/_geologic_time_series.py +1 -1
- resqpy/unstructured/_hexa_grid.py +6 -2
- resqpy/unstructured/_prism_grid.py +13 -5
- resqpy/unstructured/_pyramid_grid.py +6 -2
- resqpy/unstructured/_tetra_grid.py +6 -2
- resqpy/unstructured/_unstructured_grid.py +6 -2
- resqpy/well/_blocked_well.py +1986 -1946
- resqpy/well/_deviation_survey.py +3 -3
- resqpy/well/_md_datum.py +11 -21
- resqpy/well/_trajectory.py +10 -5
- resqpy/well/_wellbore_frame.py +10 -2
- resqpy/well/blocked_well_frame.py +3 -3
- resqpy/well/well_object_funcs.py +7 -9
- resqpy/well/well_utils.py +33 -0
- {resqpy-4.14.1.dist-info → resqpy-5.1.5.dist-info}/METADATA +8 -9
- {resqpy-4.14.1.dist-info → resqpy-5.1.5.dist-info}/RECORD +66 -66
- {resqpy-4.14.1.dist-info → resqpy-5.1.5.dist-info}/WHEEL +1 -1
- resqpy/grid/_moved_functions.py +0 -15
- {resqpy-4.14.1.dist-info → resqpy-5.1.5.dist-info}/LICENSE +0 -0
resqpy/grid/__init__.py
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
"""The Grid Module."""
|
2
2
|
|
3
3
|
__all__ = [
|
4
|
-
'Grid', 'RegularGrid', 'extract_grid_parent', '
|
5
|
-
'
|
4
|
+
'Grid', 'RegularGrid', 'extract_grid_parent', 'find_cell_for_x_sect_xz', 'grid_flavour', 'is_regular_grid',
|
5
|
+
'any_grid'
|
6
6
|
]
|
7
7
|
|
8
8
|
from ._grid import Grid
|
9
9
|
from ._regular_grid import RegularGrid
|
10
10
|
from ._grid_types import grid_flavour, is_regular_grid, any_grid
|
11
|
-
from ._moved_functions import establish_zone_property_kind
|
12
11
|
from ._extract_functions import extract_grid_parent, extent_kji_from_root
|
13
12
|
from ._points_functions import find_cell_for_x_sect_xz
|
14
13
|
|
resqpy/grid/_defined_geometry.py
CHANGED
@@ -293,7 +293,7 @@ def set_geometry_is_defined(grid,
|
|
293
293
|
|
294
294
|
assert not np.all(nan_mask), 'grid does not have any geometry defined'
|
295
295
|
|
296
|
-
points[np.where(np.repeat(np.expand_dims(nan_mask, axis = nan_mask.ndim), 3, axis = -1))] = np.
|
296
|
+
points[np.where(np.repeat(np.expand_dims(nan_mask, axis = nan_mask.ndim), 3, axis = -1))] = np.nan
|
297
297
|
|
298
298
|
surround_z = grid.xyz_box(lazy = False)[1 if grid.z_inc_down() else 0, 2]
|
299
299
|
|
@@ -335,7 +335,7 @@ def set_geometry_is_defined(grid,
|
|
335
335
|
if nullify_partial_pillars:
|
336
336
|
partial_pillar_mask = np.logical_and(pillar_defined_mask, np.any(nan_mask, axis = 0).flatten())
|
337
337
|
if np.any(partial_pillar_mask):
|
338
|
-
points.reshape((grid.nk_plus_k_gaps + 1, -1, 3))[:, partial_pillar_mask, :] = np.
|
338
|
+
points.reshape((grid.nk_plus_k_gaps + 1, -1, 3))[:, partial_pillar_mask, :] = np.nan
|
339
339
|
grid.geometry_defined_for_all_pillars_cached = False
|
340
340
|
cells_update_needed = True
|
341
341
|
elif complete_partial_pillars:
|
@@ -416,7 +416,7 @@ def __handle_areal_dots(areal_dots, grid, nan_mask):
|
|
416
416
|
primaries = (grid.nj + 1) * (grid.ni + 1)
|
417
417
|
nan_mask[:, :primaries] = np.logical_or(nan_mask[:, :primaries], dot_mask.reshape((-1, primaries)))
|
418
418
|
else:
|
419
|
-
nan_mask = np.where(dot_mask, np.
|
419
|
+
nan_mask = np.where(dot_mask, np.nan, nan_mask)
|
420
420
|
return nan_mask
|
421
421
|
|
422
422
|
|
@@ -501,7 +501,7 @@ def extract_inactive_mask(grid, check_pinchout = False):
|
|
501
501
|
geom_defined = grr_dg.cell_geometry_is_defined_ref(grid)
|
502
502
|
if grid.inactive is None:
|
503
503
|
if geom_defined is None or geom_defined is True:
|
504
|
-
grid.inactive = np.zeros(tuple(grid.extent_kji)) # ie. all active
|
504
|
+
grid.inactive = np.zeros(tuple(grid.extent_kji), dtype = bool) # ie. all active
|
505
505
|
else:
|
506
506
|
grid.inactive = np.logical_not(grr_dg.cell_geometry_is_defined_ref(grid))
|
507
507
|
if check_pinchout:
|
@@ -524,6 +524,7 @@ def extract_inactive_mask(grid, check_pinchout = False):
|
|
524
524
|
active_gpc = rprop.selective_version_of_collection(active_gpc,
|
525
525
|
time_index = grid.time_index,
|
526
526
|
time_series_uuid = grid.time_series_uuid)
|
527
|
+
active_parts = active_gpc.parts()
|
527
528
|
else:
|
528
529
|
active_parts = []
|
529
530
|
for part in active_gpc.parts():
|
resqpy/grid/_grid.py
CHANGED
@@ -15,6 +15,7 @@ import resqpy.grid as grr
|
|
15
15
|
import resqpy.grid_surface as rqgs
|
16
16
|
import resqpy.fault as rqf
|
17
17
|
import resqpy.property as rqp
|
18
|
+
import resqpy.lines as rql
|
18
19
|
import resqpy.olio.grid_functions as gf
|
19
20
|
import resqpy.olio.uuid as bu
|
20
21
|
import resqpy.olio.write_hdf5 as rwh5
|
@@ -75,7 +76,8 @@ class Grid(BaseResqpy):
|
|
75
76
|
geometry_required = True,
|
76
77
|
title = None,
|
77
78
|
originator = None,
|
78
|
-
extra_metadata = {}
|
79
|
+
extra_metadata = {},
|
80
|
+
load_inactive = True):
|
79
81
|
"""Create a Grid object and optionally populate from xml tree.
|
80
82
|
|
81
83
|
arguments:
|
@@ -91,6 +93,8 @@ class Grid(BaseResqpy):
|
|
91
93
|
ignored if loading from xml
|
92
94
|
extra_metadata (dict, optional): dictionary of extra metadata items to add to the grid;
|
93
95
|
ignored if loading from xml
|
96
|
+
load_inactive (bool, default True): if True and uuid is provided, the inactive attribubte is
|
97
|
+
populated if a property of kind 'active' is found for the grid
|
94
98
|
|
95
99
|
returns:
|
96
100
|
a newly created Grid object
|
@@ -147,6 +151,8 @@ class Grid(BaseResqpy):
|
|
147
151
|
self.title = 'ROOT'
|
148
152
|
|
149
153
|
if uuid is not None:
|
154
|
+
if load_inactive:
|
155
|
+
self.extract_inactive_mask()
|
150
156
|
if geometry_required:
|
151
157
|
assert self.geometry_root is not None, 'grid geometry not present in xml'
|
152
158
|
if find_properties:
|
@@ -185,7 +191,6 @@ class Grid(BaseResqpy):
|
|
185
191
|
self.extract_parent()
|
186
192
|
self.extract_children()
|
187
193
|
# self.create_column_pillar_mapping() # mapping now created on demand in other methods
|
188
|
-
self.extract_inactive_mask()
|
189
194
|
self.extract_stratigraphy()
|
190
195
|
self.get_represented_interpretation()
|
191
196
|
|
@@ -265,6 +270,10 @@ class Grid(BaseResqpy):
|
|
265
270
|
return np.count_nonzero(self.array_cell_geometry_is_defined)
|
266
271
|
return None
|
267
272
|
|
273
|
+
def is_big(self):
|
274
|
+
"""Returns True if number of cells exceeds 2^31 - 1, otherwise False."""
|
275
|
+
return (np.prod(self.extent_kji) >= 2_147_483_648)
|
276
|
+
|
268
277
|
def natural_cell_index(self, cell_kji0):
|
269
278
|
"""Returns a single integer for the cell, being the index into a flattened array."""
|
270
279
|
|
@@ -671,13 +680,7 @@ class Grid(BaseResqpy):
|
|
671
680
|
return _create_grid_xml(self, ijk, ext_uuid, add_as_part, add_relationships, write_active, write_geometry,
|
672
681
|
use_lattice, use_parametric_lines)
|
673
682
|
|
674
|
-
|
675
|
-
"""Deprecated: please use `unsplit_x_section_points` instead."""
|
676
|
-
warnings.warn('Deprecated: please use `unsplit_x_section_points` instead.', DeprecationWarning)
|
677
|
-
|
678
|
-
return unsplit_x_section_points(self, axis, ref_slice0 = ref_slice0, plus_face = plus_face, masked = masked)
|
679
|
-
|
680
|
-
# The implementations of the below functions have been moved to separate modules.
|
683
|
+
# the implementations of the functions below have been moved to separate modules
|
681
684
|
|
682
685
|
def cell_geometry_is_defined(self, cell_kji0 = None, cell_geometry_is_defined_root = None, cache_array = True):
|
683
686
|
"""Returns True if the geometry of the specified cell is defined.
|
@@ -1489,6 +1492,86 @@ class Grid(BaseResqpy):
|
|
1489
1492
|
"""
|
1490
1493
|
return z_corner_point_depths(self, order = order)
|
1491
1494
|
|
1495
|
+
def frontier(self, set_z_zero = True, title = None, add_as_part = True, mode = 'mean'):
|
1496
|
+
"""Returns a frontier polygon (closed polyline) based on midpoints of edge coordinate lines, with z set to zero.
|
1497
|
+
|
1498
|
+
arguments:
|
1499
|
+
- set_z_zero (bool, default True): if True, the z values of the returned polyline are all set to zero; if False,
|
1500
|
+
they are left at the midpoint z values from the edge coordinate lines
|
1501
|
+
- title (str, optional): the citation title for the polyline; if None, one is generated using the grid title
|
1502
|
+
- add_as_part (bool default True): if True, the xml is created for the polyline and it is added as a part to
|
1503
|
+
the model; if False, the create_xml() method is not called fot the polyline
|
1504
|
+
- mode (str, default 'mean'): one of 'mean', 'top', 'base', 'inner', 'outer' determining how a non-vertical
|
1505
|
+
edge coordinate line is converted to a point to include in the frontier
|
1506
|
+
|
1507
|
+
returns:
|
1508
|
+
- closed Polyline representing the frontier of the grid in plan view
|
1509
|
+
"""
|
1510
|
+
|
1511
|
+
def get_point(clep, mode, centrum):
|
1512
|
+
if mode == 'mean':
|
1513
|
+
return np.nanmean(clep, axis = 0)
|
1514
|
+
if mode == 'top':
|
1515
|
+
return clep[0]
|
1516
|
+
if mode == 'base':
|
1517
|
+
return clep[-1]
|
1518
|
+
assert mode in ['inner', 'outer'], f'unrecognised frontier mode: {mode}'
|
1519
|
+
vp = clep - np.expand_dims(centrum, axis = 0)
|
1520
|
+
dp = np.sum(vp * vp, axis = -1)
|
1521
|
+
if (dp[0] < dp[1] and mode == 'inner') or (dp[0] > dp[1] and mode == 'outer'):
|
1522
|
+
return clep[0]
|
1523
|
+
return clep[-1]
|
1524
|
+
|
1525
|
+
assert mode in ['mean', 'top', 'base', 'inner', 'outer']
|
1526
|
+
coords = self.coordinate_line_end_points()
|
1527
|
+
centrum = None
|
1528
|
+
if mode in ['inner', 'outer']:
|
1529
|
+
centrum = np.nanmean(np.concatenate((coords[0, 0], coords[0, -1], coords[-1, 0], coords[-1, -1]), axis = 0),
|
1530
|
+
axis = 0)
|
1531
|
+
assert not np.any(
|
1532
|
+
np.isnan(centrum)), f'trying to make frontier polygon in mode {mode} when corners of grid not defined'
|
1533
|
+
nj = self.nj
|
1534
|
+
ni = self.ni
|
1535
|
+
frontier = np.zeros((2 * (nj + ni), 3), dtype = float)
|
1536
|
+
f_i = 0
|
1537
|
+
for i in range(self.ni):
|
1538
|
+
c = get_point(coords[0, i], mode, centrum)
|
1539
|
+
if np.any(np.isnan(c)):
|
1540
|
+
continue
|
1541
|
+
frontier[f_i] = c
|
1542
|
+
f_i += 1
|
1543
|
+
for j in range(self.nj):
|
1544
|
+
c = get_point(coords[j, ni], mode, centrum)
|
1545
|
+
if np.any(np.isnan(c)):
|
1546
|
+
continue
|
1547
|
+
frontier[f_i] = c
|
1548
|
+
f_i += 1
|
1549
|
+
for i in range(self.ni, 0, -1):
|
1550
|
+
c = get_point(coords[nj, i], mode, centrum)
|
1551
|
+
if np.any(np.isnan(c)):
|
1552
|
+
continue
|
1553
|
+
frontier[f_i] = c
|
1554
|
+
f_i += 1
|
1555
|
+
for j in range(self.nj, 0, -1):
|
1556
|
+
c = get_point(coords[j, 0], mode, centrum)
|
1557
|
+
if np.any(np.isnan(c)):
|
1558
|
+
continue
|
1559
|
+
frontier[f_i] = c
|
1560
|
+
f_i += 1
|
1561
|
+
assert 4 <= f_i <= 2 * (nj + ni), 'failed to define frontier polygon (NaNs in grid geometry?)'
|
1562
|
+
if set_z_zero:
|
1563
|
+
frontier[:, 2] = 0.0
|
1564
|
+
if not title:
|
1565
|
+
title = f'frontier of {self.title}'
|
1566
|
+
pl = rql.Polyline(self.model,
|
1567
|
+
set_coord = frontier[:f_i],
|
1568
|
+
set_crs = self.crs_uuid,
|
1569
|
+
is_closed = True,
|
1570
|
+
title = title)
|
1571
|
+
if add_as_part:
|
1572
|
+
pl.create_xml()
|
1573
|
+
return pl
|
1574
|
+
|
1492
1575
|
def corner_points(self, cell_kji0 = None, points_root = None, cache_resqml_array = True, cache_cp_array = False):
|
1493
1576
|
"""Returns a numpy array of corner points for a single cell or the whole grid.
|
1494
1577
|
|
@@ -2255,9 +2338,9 @@ class Grid(BaseResqpy):
|
|
2255
2338
|
pc = self.extract_property_collection()
|
2256
2339
|
|
2257
2340
|
if baffle_triplet is not None:
|
2258
|
-
trm_k[1:-1]
|
2259
|
-
trm_j[:, 1:-1]
|
2260
|
-
trm_i[:, :, 1:-1]
|
2341
|
+
trm_k[1:-1][baffle_triplet[0]] = 0.0
|
2342
|
+
trm_j[:, 1:-1][baffle_triplet[1]] = 0.0
|
2343
|
+
trm_i[:, :, 1:-1][baffle_triplet[2]] = 0.0
|
2261
2344
|
|
2262
2345
|
if composite_property:
|
2263
2346
|
tr_composite = np.concatenate((trm_k.flat, trm_j.flat, trm_i.flat))
|
resqpy/grid/_grid_types.py
CHANGED
@@ -51,13 +51,15 @@ def is_regular_grid(grid_root):
|
|
51
51
|
return grid_flavour(grid_root) == 'IjkBlockGrid'
|
52
52
|
|
53
53
|
|
54
|
-
def any_grid(parent_model, uuid = None, find_properties = True):
|
54
|
+
def any_grid(parent_model, uuid = None, find_properties = True, load_inactive = True):
|
55
55
|
"""Returns a Grid or RegularGrid or UnstructuredGrid object depending on the extra metadata in the xml.
|
56
56
|
|
57
57
|
arguments:
|
58
58
|
parent_model (Model): the model within which the grid exists
|
59
59
|
uuid (UUID): the uuid of the grid object to be instantiated
|
60
60
|
find_properties (bool, default True): passed onward to the instantiation method
|
61
|
+
load_inactive (bool, default True): if True and uuid is provided, the inactive attribubte is
|
62
|
+
populated if a property of kind 'active' is found for the grid
|
61
63
|
|
62
64
|
note:
|
63
65
|
full list of resqpy grid class objects which could be returned:
|
@@ -70,17 +72,30 @@ def any_grid(parent_model, uuid = None, find_properties = True):
|
|
70
72
|
if flavour is None:
|
71
73
|
return None
|
72
74
|
if flavour == 'IjkGrid':
|
73
|
-
return grr.Grid(parent_model, uuid = uuid, find_properties = find_properties)
|
75
|
+
return grr.Grid(parent_model, uuid = uuid, find_properties = find_properties, load_inactive = load_inactive)
|
74
76
|
if flavour == 'IjkBlockGrid':
|
75
|
-
return grr.RegularGrid(parent_model,
|
77
|
+
return grr.RegularGrid(parent_model,
|
78
|
+
extent_kji = None,
|
79
|
+
uuid = uuid,
|
80
|
+
find_properties = find_properties,
|
81
|
+
load_inactive = load_inactive)
|
76
82
|
if flavour == 'UnstructuredGrid':
|
77
|
-
return rug.UnstructuredGrid(parent_model,
|
83
|
+
return rug.UnstructuredGrid(parent_model,
|
84
|
+
uuid = uuid,
|
85
|
+
find_properties = find_properties,
|
86
|
+
load_inactive = load_inactive)
|
78
87
|
if flavour == 'TetraGrid':
|
79
|
-
return rug.TetraGrid(parent_model,
|
88
|
+
return rug.TetraGrid(parent_model,
|
89
|
+
uuid = uuid,
|
90
|
+
find_properties = find_properties,
|
91
|
+
load_inactive = load_inactive)
|
80
92
|
if flavour == 'HexaGrid':
|
81
|
-
return rug.HexaGrid(parent_model, uuid = uuid, find_properties = find_properties)
|
93
|
+
return rug.HexaGrid(parent_model, uuid = uuid, find_properties = find_properties, load_inactive = load_inactive)
|
82
94
|
if flavour == 'PyramidGrid':
|
83
95
|
return rug.PyramidGrid(parent_model, uuid = uuid, find_properties = find_properties)
|
84
96
|
if flavour == 'PrismGrid':
|
85
|
-
return rug.PrismGrid(parent_model,
|
97
|
+
return rug.PrismGrid(parent_model,
|
98
|
+
uuid = uuid,
|
99
|
+
find_properties = find_properties,
|
100
|
+
load_inactive = load_inactive)
|
86
101
|
return None
|
resqpy/grid/_points_functions.py
CHANGED
@@ -790,7 +790,7 @@ def corner_points(grid, cell_kji0 = None, points_root = None, cache_resqml_array
|
|
790
790
|
# note: this function returns a derived object rather than a native resqml object
|
791
791
|
|
792
792
|
def one_cell_cp(grid, cell_kji0, points_root, cache_array):
|
793
|
-
cp = np.full((2, 2, 2, 3), np.
|
793
|
+
cp = np.full((2, 2, 2, 3), np.nan)
|
794
794
|
if not grr_dg.geometry_defined_for_all_cells(grid):
|
795
795
|
if not grr_dg.cell_geometry_is_defined(grid, cell_kji0 = cell_kji0, cache_array = cache_array):
|
796
796
|
return cp
|
resqpy/grid/_regular_grid.py
CHANGED
@@ -46,7 +46,8 @@ class RegularGrid(grr_g.Grid):
|
|
46
46
|
find_properties = True,
|
47
47
|
title = None,
|
48
48
|
originator = None,
|
49
|
-
extra_metadata = {}
|
49
|
+
extra_metadata = {},
|
50
|
+
load_inactive = True):
|
50
51
|
"""Creates a regular grid object based on dxyz, or derived from a Mesh object.
|
51
52
|
|
52
53
|
arguments:
|
@@ -82,6 +83,8 @@ class RegularGrid(grr_g.Grid):
|
|
82
83
|
ignored if loading from xml
|
83
84
|
extra_metadata (dict, optional): dictionary of extra metadata items to add to the grid;
|
84
85
|
ignored if loading from xml
|
86
|
+
load_inactive (bool, default True): if True and uuid is provided, the inactive attribubte is
|
87
|
+
populated if a property of kind 'active' is found for the grid
|
85
88
|
|
86
89
|
returns:
|
87
90
|
a newly created RegularGrid object with inheritance from the Grid class
|
@@ -184,7 +187,8 @@ class RegularGrid(grr_g.Grid):
|
|
184
187
|
geometry_required = False,
|
185
188
|
title = title,
|
186
189
|
originator = originator,
|
187
|
-
extra_metadata = extra_metadata
|
190
|
+
extra_metadata = extra_metadata,
|
191
|
+
load_inactive = load_inactive)
|
188
192
|
|
189
193
|
self.geometry_defined_for_all_cells_cached = True
|
190
194
|
self.geometry_defined_for_all_pillars_cached = True
|
resqpy/grid_surface/__init__.py
CHANGED
@@ -1,33 +1,19 @@
|
|
1
1
|
"""Classes for RESQML objects related to surfaces."""
|
2
2
|
|
3
3
|
__all__ = [
|
4
|
-
"GridSkin",
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"
|
8
|
-
"generate_untorn_surface_for_x_section",
|
9
|
-
"point_is_within_cell",
|
10
|
-
"create_column_face_mesh_and_surface",
|
11
|
-
"find_intersections_of_trajectory_with_surface",
|
12
|
-
"find_intersections_of_trajectory_with_layer_interface",
|
13
|
-
"find_first_intersection_of_trajectory_with_surface",
|
4
|
+
"GridSkin", "generate_untorn_surface_for_layer_interface", "generate_torn_surface_for_layer_interface",
|
5
|
+
"generate_torn_surface_for_x_section", "generate_untorn_surface_for_x_section", "point_is_within_cell",
|
6
|
+
"create_column_face_mesh_and_surface", "find_intersections_of_trajectory_with_surface",
|
7
|
+
"find_intersections_of_trajectory_with_layer_interface", "find_first_intersection_of_trajectory_with_surface",
|
14
8
|
"find_first_intersection_of_trajectory_with_layer_interface",
|
15
9
|
"find_first_intersection_of_trajectory_with_cell_surface",
|
16
|
-
"find_intersection_of_trajectory_interval_with_column_face",
|
17
|
-
"
|
18
|
-
"
|
19
|
-
"
|
20
|
-
"
|
21
|
-
"
|
22
|
-
"
|
23
|
-
"find_faces_to_represent_surface",
|
24
|
-
"bisector_from_faces",
|
25
|
-
"column_bisector_from_faces",
|
26
|
-
"shadow_from_faces",
|
27
|
-
"get_boundary",
|
28
|
-
"_where_true",
|
29
|
-
"_first_true",
|
30
|
-
"intersect_numba",
|
10
|
+
"find_intersection_of_trajectory_interval_with_column_face", "trajectory_grid_overlap",
|
11
|
+
"populate_blocked_well_from_trajectory", "generate_surface_for_blocked_well_cells",
|
12
|
+
"find_faces_to_represent_surface_staffa", "find_faces_to_represent_surface_regular",
|
13
|
+
"find_faces_to_represent_surface_regular_optimised", "find_faces_to_represent_surface_regular_dense_optimised",
|
14
|
+
"find_faces_to_represent_surface", "bisector_from_faces", "bisector_from_face_indices",
|
15
|
+
"packed_bisector_from_face_indices", "column_bisector_from_faces", "shadow_from_faces", "get_boundary",
|
16
|
+
"get_boundary_dict", "_where_true", "_first_true", "intersect_numba", "get_box"
|
31
17
|
]
|
32
18
|
|
33
19
|
from ._grid_skin import GridSkin
|
@@ -52,19 +38,12 @@ from ._blocked_well_populate import (
|
|
52
38
|
populate_blocked_well_from_trajectory,
|
53
39
|
generate_surface_for_blocked_well_cells,
|
54
40
|
)
|
55
|
-
from ._find_faces import (
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
column_bisector_from_faces,
|
62
|
-
shadow_from_faces,
|
63
|
-
get_boundary,
|
64
|
-
_where_true,
|
65
|
-
_first_true,
|
66
|
-
intersect_numba,
|
67
|
-
)
|
41
|
+
from ._find_faces import (find_faces_to_represent_surface_staffa, find_faces_to_represent_surface_regular,
|
42
|
+
find_faces_to_represent_surface_regular_optimised,
|
43
|
+
find_faces_to_represent_surface_regular_dense_optimised, find_faces_to_represent_surface,
|
44
|
+
bisector_from_faces, bisector_from_face_indices, packed_bisector_from_face_indices,
|
45
|
+
column_bisector_from_faces, shadow_from_faces, get_boundary, get_boundary_dict, _where_true,
|
46
|
+
_first_true, intersect_numba, get_box)
|
68
47
|
|
69
48
|
# Set "module" attribute of all public objects to this path.
|
70
49
|
for _name in __all__:
|
@@ -118,7 +118,7 @@ def populate_blocked_well_from_trajectory(blocked_well,
|
|
118
118
|
if xyz is None:
|
119
119
|
log.error('failed to lazily find intersection of trajectory with top surface of grid')
|
120
120
|
return None
|
121
|
-
cell_kji0 = np.array((0, col_ji0[0], col_ji0[1]), dtype =
|
121
|
+
cell_kji0 = np.array((0, col_ji0[0], col_ji0[1]), dtype = np.int32)
|
122
122
|
axis = 0
|
123
123
|
polarity = 0
|
124
124
|
|
@@ -133,7 +133,7 @@ def populate_blocked_well_from_trajectory(blocked_well,
|
|
133
133
|
else:
|
134
134
|
log.debug(f"skin intersection x,y,z: {xyz}; knot: {entry_knot}; cell kji0: {cell_kji0}; face: "
|
135
135
|
f"{'KJI'[axis]}{'-+'[polarity]}")
|
136
|
-
cell_kji0 = np.array(cell_kji0, dtype =
|
136
|
+
cell_kji0 = np.array(cell_kji0, dtype = np.int32)
|
137
137
|
|
138
138
|
previous_kji0 = cell_kji0.copy()
|
139
139
|
previous_kji0[axis] += polarity * 2 - 1 # note: previous may legitimately be 'beyond' edge of grid
|
@@ -244,9 +244,9 @@ def populate_blocked_well_from_trajectory(blocked_well,
|
|
244
244
|
|
245
245
|
blocked_well.node_mds = np.array(node_mds_list, dtype = float)
|
246
246
|
blocked_well.node_count = node_count
|
247
|
-
blocked_well.grid_indices = np.array(grid_indices_list, dtype =
|
248
|
-
blocked_well.cell_indices = np.array(cell_indices_list, dtype =
|
249
|
-
blocked_well.face_pair_indices = np.array(face_pairs_list, dtype =
|
247
|
+
blocked_well.grid_indices = np.array(grid_indices_list, dtype = np.int32)
|
248
|
+
blocked_well.cell_indices = np.array(cell_indices_list, dtype = np.int64)
|
249
|
+
blocked_well.face_pair_indices = np.array(face_pairs_list, dtype = np.int8)
|
250
250
|
blocked_well.cell_count = cell_count
|
251
251
|
blocked_well.grid_list = [grid]
|
252
252
|
|