resqpy 4.16.6__py3-none-any.whl → 4.16.8__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.
- resqpy/__init__.py +1 -1
- resqpy/fault/_gcs_functions.py +4 -4
- resqpy/fault/_grid_connection_set.py +29 -19
- resqpy/grid/_defined_geometry.py +3 -3
- resqpy/grid/_points_functions.py +1 -1
- resqpy/grid_surface/_find_faces.py +29 -13
- resqpy/multi_processing/wrappers/grid_surface_mp.py +2 -1
- resqpy/olio/transmission.py +8 -8
- resqpy/olio/vector_utilities.py +1 -1
- resqpy/olio/wellspec_keywords.py +3 -3
- resqpy/property/grid_property_collection.py +1 -1
- resqpy/property/property_collection.py +9 -9
- resqpy/surface/_surface.py +1 -1
- resqpy/surface/_tri_mesh.py +2 -2
- resqpy/surface/_tri_mesh_stencil.py +4 -4
- resqpy/unstructured/_prism_grid.py +1 -1
- resqpy/well/_blocked_well.py +2 -2
- {resqpy-4.16.6.dist-info → resqpy-4.16.8.dist-info}/METADATA +1 -1
- {resqpy-4.16.6.dist-info → resqpy-4.16.8.dist-info}/RECORD +21 -21
- {resqpy-4.16.6.dist-info → resqpy-4.16.8.dist-info}/LICENSE +0 -0
- {resqpy-4.16.6.dist-info → resqpy-4.16.8.dist-info}/WHEEL +0 -0
resqpy/__init__.py
CHANGED
resqpy/fault/_gcs_functions.py
CHANGED
@@ -423,15 +423,15 @@ def combined_tr_mult_from_gcs_mults(model,
|
|
423
423
|
|
424
424
|
if grid is None: # first gcs: grab grid and initialise combined tr mult arrays
|
425
425
|
grid = gcs.grid_list[0]
|
426
|
-
combo_trm_k = np.full((grid.nk + 1, grid.nj, grid.ni), np.
|
427
|
-
combo_trm_j = np.full((grid.nk, grid.nj + 1, grid.ni), np.
|
428
|
-
combo_trm_i = np.full((grid.nk, grid.nj, grid.ni + 1), np.
|
426
|
+
combo_trm_k = np.full((grid.nk + 1, grid.nj, grid.ni), np.nan, dtype = float)
|
427
|
+
combo_trm_j = np.full((grid.nk, grid.nj + 1, grid.ni), np.nan, dtype = float)
|
428
|
+
combo_trm_i = np.full((grid.nk, grid.nj, grid.ni + 1), np.nan, dtype = float)
|
429
429
|
else: # check same grid is referenced by this gcs
|
430
430
|
assert bu.matching_uuids(gcs.grid_list[0].uuid, grid.uuid)
|
431
431
|
|
432
432
|
# get gcs tr mult data in form of triplet of grid faces arrays
|
433
433
|
gcs_trm_k, gcs_trm_j, gcs_trm_i = gcs.grid_face_arrays(tr_mult_uuid,
|
434
|
-
default_value = np.
|
434
|
+
default_value = np.nan,
|
435
435
|
active_only = active_only,
|
436
436
|
lazy = not sided,
|
437
437
|
baffle_uuid = baffle_uuid)
|
@@ -249,6 +249,7 @@ class GridConnectionSet(BaseResqpy):
|
|
249
249
|
gcs.model = parent_model
|
250
250
|
gcs.uuid = bu.new_uuid() # not strictly necessary as append will cause a new uuid as well
|
251
251
|
gcs.title = title
|
252
|
+
gcs.property_collection = None
|
252
253
|
# append data from the remaining grid connection sets
|
253
254
|
for another_uuid in gcs_uuid_list[1:]:
|
254
255
|
another_gcs = GridConnectionSet(source_model, uuid = another_uuid)
|
@@ -1557,7 +1558,7 @@ class GridConnectionSet(BaseResqpy):
|
|
1557
1558
|
log.info(
|
1558
1559
|
f'Property name {property_name} not found in extra_metadata for {self.model.citation_title_for_part(self.model.part_for_uuid(feature_uuid))}'
|
1559
1560
|
)
|
1560
|
-
value_list.append(np.
|
1561
|
+
value_list.append(np.nan)
|
1561
1562
|
else:
|
1562
1563
|
value_list.append(float(feat.extra_metadata[property_name]))
|
1563
1564
|
return value_list
|
@@ -2042,14 +2043,15 @@ class GridConnectionSet(BaseResqpy):
|
|
2042
2043
|
feature_index = None,
|
2043
2044
|
active_only = True,
|
2044
2045
|
lazy = False,
|
2045
|
-
baffle_uuid = None
|
2046
|
+
baffle_uuid = None,
|
2047
|
+
dtype = None):
|
2046
2048
|
"""Creates a triplet of grid face numpy arrays populated from a property for this gcs.
|
2047
2049
|
|
2048
2050
|
arguments:
|
2049
2051
|
property_uuid (UUID): the uuid of the gcs property
|
2050
2052
|
default_value (float or int, optional): the value to use in the grid property
|
2051
2053
|
on faces that do not appear in the grid connection set; will default to
|
2052
|
-
np.
|
2054
|
+
np.nan for continuous properties, -1 for categorical or discrete
|
2053
2055
|
feature_index (int, optional): if present, only faces for this feature are used
|
2054
2056
|
active_only (bool, default True): if True and an active property exists for the
|
2055
2057
|
grid connection set, then only active faces are used when populating the
|
@@ -2060,6 +2062,8 @@ class GridConnectionSet(BaseResqpy):
|
|
2060
2062
|
baffle_uuid (uuid, optional): if present, the uuid of a discrete (bool) property
|
2061
2063
|
of the gcs holding baffle flags; where True the output face value is set
|
2062
2064
|
to zero regardless of the main property value
|
2065
|
+
dtype (type or str, optional): the element type for the returned arrays; defaults
|
2066
|
+
to float for continuous properties or int for discrete properties; see notes
|
2063
2067
|
|
2064
2068
|
returns:
|
2065
2069
|
triple numpy arrays: identifying the K, J & I direction grid face property values;
|
@@ -2069,7 +2073,9 @@ class GridConnectionSet(BaseResqpy):
|
|
2069
2073
|
can only be used on single grid gcs; gcs property must have indexable of faces;
|
2070
2074
|
at present generates grid properties with indexable 'faces' not 'faces per cell',
|
2071
2075
|
which might not be appropriate for grids with split pillars (structural faults);
|
2072
|
-
points properties not currently supported; count must be 1
|
2076
|
+
points properties not currently supported; count must be 1;
|
2077
|
+
if the property is a boolean array and may have been written to hdf5 using packing,
|
2078
|
+
then the dtype argument must be set to bool or np.uint8 to ensure unpacking
|
2073
2079
|
"""
|
2074
2080
|
|
2075
2081
|
assert self.number_of_grids() == 1
|
@@ -2077,7 +2083,7 @@ class GridConnectionSet(BaseResqpy):
|
|
2077
2083
|
active_mask = None
|
2078
2084
|
if active_only:
|
2079
2085
|
pc = self.extract_property_collection()
|
2080
|
-
active_mask = pc.single_array_ref(property_kind = 'active')
|
2086
|
+
active_mask = pc.single_array_ref(property_kind = 'active', dtype = bool)
|
2081
2087
|
if active_mask is not None:
|
2082
2088
|
assert active_mask.shape == (self.count,)
|
2083
2089
|
gcs_prop = rqp.Property(self.model, uuid = property_uuid)
|
@@ -2085,10 +2091,12 @@ class GridConnectionSet(BaseResqpy):
|
|
2085
2091
|
assert bu.matching_uuids(gcs_prop.collection.support_uuid, self.uuid)
|
2086
2092
|
assert gcs_prop.count() == 1
|
2087
2093
|
assert not gcs_prop.is_points()
|
2088
|
-
|
2094
|
+
if dtype is None:
|
2095
|
+
dtype = float if gcs_prop.is_continuous() else int
|
2089
2096
|
if default_value is None:
|
2090
|
-
default_value = -1 if dtype is int else np.
|
2091
|
-
gcs_prop_array = gcs_prop.array_ref()
|
2097
|
+
default_value = -1 if dtype is int else np.nan
|
2098
|
+
gcs_prop_array = gcs_prop.array_ref(dtype = dtype)
|
2099
|
+
assert gcs_prop_array.shape == (self.count,)
|
2092
2100
|
log.debug(f'preparing grid face arrays from gcs property: {gcs_prop.title}; from gcs:{self.title}')
|
2093
2101
|
|
2094
2102
|
baffle_mask = None
|
@@ -2102,29 +2110,31 @@ class GridConnectionSet(BaseResqpy):
|
|
2102
2110
|
ai = np.full((nk, nj, ni + 1), default_value, dtype = dtype)
|
2103
2111
|
|
2104
2112
|
# populate arrays from faces of gcs, optionally filtered by feature index
|
2105
|
-
cip, fip = self.list_of_cell_face_pairs_for_feature_index(
|
2106
|
-
assert len(cip) == self.count and len(fip) == self.count
|
2107
|
-
assert gcs_prop_array.shape == (self.count,)
|
2108
|
-
if feature_index is None:
|
2109
|
-
indices = np.arange(self.count, dtype = int)
|
2110
|
-
else:
|
2111
|
-
indices = self.indices_for_feature_index(feature_index)
|
2112
|
-
|
2113
|
-
side_list = ([0] if lazy else [0, 1])
|
2113
|
+
cip, fip = self.list_of_cell_face_pairs_for_feature_index(feature_index)
|
2114
2114
|
|
2115
2115
|
value_array = gcs_prop_array.copy()
|
2116
|
+
|
2116
2117
|
if baffle_mask is not None:
|
2117
2118
|
value_array[baffle_mask] = 0 # will be cast to float (or bool) if needed
|
2119
|
+
|
2120
|
+
if feature_index is not None:
|
2121
|
+
indices = self.indices_for_feature_index(feature_index)
|
2122
|
+
value_array = value_array[indices]
|
2123
|
+
if active_mask is not None:
|
2124
|
+
active_mask = active_mask[indices]
|
2125
|
+
|
2118
2126
|
if active_mask is not None:
|
2119
2127
|
cip = cip[active_mask, :, :]
|
2120
2128
|
value_array = value_array[active_mask]
|
2121
2129
|
|
2130
|
+
side_list = ([0] if lazy else [0, 1])
|
2131
|
+
|
2122
2132
|
for side in side_list:
|
2123
2133
|
cell_kji0 = cip[:, side].copy() # shape (N, 3)
|
2124
2134
|
axis = fip[:, side, 0] # shape (N,)
|
2125
2135
|
polarity = fip[:, side, 1] # shape (N,)
|
2126
|
-
assert 0 <= np.min(axis) and np.max(axis) <= 2
|
2127
|
-
assert 0 <= np.min(polarity) and np.max(polarity) <= 1
|
2136
|
+
# assert 0 <= np.min(axis) and np.max(axis) <= 2
|
2137
|
+
# assert 0 <= np.min(polarity) and np.max(polarity) <= 1
|
2128
2138
|
|
2129
2139
|
axis_mask = (axis == 0).astype(bool)
|
2130
2140
|
ak_kji0 = cell_kji0[axis_mask, :]
|
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
|
|
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
|
@@ -815,7 +815,7 @@ def find_faces_to_represent_surface_regular_optimised(grid,
|
|
815
815
|
related_uuid = surface.uuid)
|
816
816
|
assert (flange_bool_uuid is not None), f"No flange bool property found for surface: {surface.title}"
|
817
817
|
flange_bool = rqp.Property(surface.model, uuid = flange_bool_uuid)
|
818
|
-
flange_array = flange_bool.array_ref()
|
818
|
+
flange_array = flange_bool.array_ref(dtype = bool)
|
819
819
|
all_flange = np.take(flange_array, all_tris)
|
820
820
|
assert all_flange.shape == (gcs.count,)
|
821
821
|
|
@@ -994,12 +994,23 @@ def bisector_from_faces( # type: ignore
|
|
994
994
|
changing_array = np.zeros_like(bounding_array, dtype = np.bool_)
|
995
995
|
|
996
996
|
# Repeatedly spreading True values to neighbouring cells that are not the other side of a face.
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
997
|
+
# yapf: disable
|
998
|
+
open_k = np.logical_not(k_faces)[
|
999
|
+
boundary["k_min"]:boundary["k_max"],
|
1000
|
+
boundary["j_min"]:boundary["j_max"] + 1,
|
1001
|
+
boundary["i_min"]:boundary["i_max"] + 1,
|
1002
|
+
]
|
1003
|
+
open_j = np.logical_not(j_faces)[
|
1004
|
+
boundary["k_min"]:boundary["k_max"] + 1,
|
1005
|
+
boundary["j_min"]:boundary["j_max"],
|
1006
|
+
boundary["i_min"]:boundary["i_max"] + 1,
|
1007
|
+
]
|
1008
|
+
open_i = np.logical_not(i_faces)[
|
1009
|
+
boundary["k_min"]:boundary["k_max"] + 1,
|
1010
|
+
boundary["j_min"]:boundary["j_max"] + 1,
|
1011
|
+
boundary["i_min"]:boundary["i_max"],
|
1012
|
+
]
|
1013
|
+
# yapf: enable
|
1003
1014
|
while True:
|
1004
1015
|
changing_array[:] = False
|
1005
1016
|
|
@@ -1027,8 +1038,13 @@ def bisector_from_faces( # type: ignore
|
|
1027
1038
|
|
1028
1039
|
# Setting up the full bisectors array and assigning the bounding box values.
|
1029
1040
|
array = np.zeros(grid_extent_kji, dtype = np.bool_)
|
1030
|
-
|
1031
|
-
|
1041
|
+
# yapf: disable
|
1042
|
+
array[
|
1043
|
+
boundary["k_min"]:boundary["k_max"] + 1,
|
1044
|
+
boundary["j_min"]:boundary["j_max"] + 1,
|
1045
|
+
boundary["i_min"]:boundary["i_max"] + 1,
|
1046
|
+
] = bounding_array
|
1047
|
+
# yapf: enable
|
1032
1048
|
|
1033
1049
|
# Setting values outside of the bounding box.
|
1034
1050
|
if boundary["k_max"] != grid_extent_kji[0] - 1 and np.any(bounding_array[-1, :, :]):
|
@@ -1140,18 +1156,18 @@ def shadow_from_faces(extent_kji, k_faces):
|
|
1140
1156
|
c = np.logical_and(shadow[:-1] == 0, shadow[1:] == 1)
|
1141
1157
|
if np.count_nonzero(c) == 0:
|
1142
1158
|
break
|
1143
|
-
shadow[:-1] =
|
1159
|
+
shadow[:-1][c] = 1
|
1144
1160
|
for _ in range(limit):
|
1145
1161
|
c = np.logical_and(shadow[1:] == 0, shadow[:-1] == 2)
|
1146
1162
|
if np.count_nonzero(c) == 0:
|
1147
1163
|
break
|
1148
|
-
shadow[1:] =
|
1164
|
+
shadow[1:][c] = 2
|
1149
1165
|
for _ in range(limit):
|
1150
1166
|
c = np.logical_and(shadow[:-1] >= 2, shadow[1:] == 1)
|
1151
1167
|
if np.count_nonzero(c) == 0:
|
1152
1168
|
break
|
1153
|
-
shadow[:-1] =
|
1154
|
-
shadow[1:] =
|
1169
|
+
shadow[:-1][c] = 3
|
1170
|
+
shadow[1:][c] = 3
|
1155
1171
|
return shadow
|
1156
1172
|
|
1157
1173
|
|
@@ -235,7 +235,8 @@ def find_faces_to_represent_surface_regular_wrapper(
|
|
235
235
|
property_kind = 'flange bool',
|
236
236
|
find_local_property_kind = True,
|
237
237
|
indexable_element = 'faces',
|
238
|
-
discrete = True
|
238
|
+
discrete = True,
|
239
|
+
dtype = np.uint8)
|
239
240
|
uuid_list.append(flange_p.uuid)
|
240
241
|
uuid_list.append(surface_uuid)
|
241
242
|
|
resqpy/olio/transmission.py
CHANGED
@@ -260,10 +260,10 @@ def half_cell_t_irregular(grid,
|
|
260
260
|
zero_length_mask = np.logical_or(np.any(np.isnan(half_axis_vectors), axis = -1),
|
261
261
|
half_axis_length_sqr < tolerance_sqr)
|
262
262
|
minus_face_t = np.where(
|
263
|
-
zero_length_mask, np.
|
263
|
+
zero_length_mask, np.nan,
|
264
264
|
perm_k * np.sum(half_axis_vectors * minus_face_areas, axis = -1) / half_axis_length_sqr)
|
265
265
|
plus_face_t = np.where(
|
266
|
-
zero_length_mask, np.
|
266
|
+
zero_length_mask, np.nan,
|
267
267
|
perm_k * np.sum(half_axis_vectors * plus_face_areas, axis = -1) / half_axis_length_sqr)
|
268
268
|
|
269
269
|
elif axis == 1: # j
|
@@ -303,10 +303,10 @@ def half_cell_t_irregular(grid,
|
|
303
303
|
half_axis_length_sqr = np.sum(half_axis_vectors * half_axis_vectors, axis = -1)
|
304
304
|
zero_length_mask = (half_axis_length_sqr < tolerance_sqr)
|
305
305
|
minus_face_t = np.where(
|
306
|
-
zero_length_mask, np.
|
306
|
+
zero_length_mask, np.nan,
|
307
307
|
perm_j * np.sum(half_axis_vectors * minus_face_areas, axis = -1) / half_axis_length_sqr)
|
308
308
|
plus_face_t = np.where(
|
309
|
-
zero_length_mask, np.
|
309
|
+
zero_length_mask, np.nan,
|
310
310
|
perm_j * np.sum(half_axis_vectors * plus_face_areas, axis = -1) / half_axis_length_sqr)
|
311
311
|
|
312
312
|
else: # i
|
@@ -345,10 +345,10 @@ def half_cell_t_irregular(grid,
|
|
345
345
|
half_axis_length_sqr = np.sum(half_axis_vectors * half_axis_vectors, axis = -1)
|
346
346
|
zero_length_mask = (half_axis_length_sqr < tolerance_sqr)
|
347
347
|
minus_face_t = np.where(
|
348
|
-
zero_length_mask, np.
|
348
|
+
zero_length_mask, np.nan,
|
349
349
|
perm_i * np.sum(half_axis_vectors * minus_face_areas, axis = -1) / half_axis_length_sqr)
|
350
350
|
plus_face_t = np.where(
|
351
|
-
zero_length_mask, np.
|
351
|
+
zero_length_mask, np.nan,
|
352
352
|
perm_i * np.sum(half_axis_vectors * plus_face_areas, axis = -1) / half_axis_length_sqr)
|
353
353
|
|
354
354
|
if axis != 0 and ntg is not None:
|
@@ -417,14 +417,14 @@ def half_cell_t_vertical_prism(vpg,
|
|
417
417
|
# compute transmissibilities
|
418
418
|
tr = np.zeros((vpg.cell_count, 5), dtype = float)
|
419
419
|
# vertical
|
420
|
-
tr[:, 0] = np.where(half_thickness < tolerance, np.
|
420
|
+
tr[:, 0] = np.where(half_thickness < tolerance, np.nan, (perm_k.reshape(
|
421
421
|
(vpg.nk, -1)) * triangle_areas / half_thickness)).flatten()
|
422
422
|
tr[:, 1] = tr[:, 0]
|
423
423
|
# horizontal
|
424
424
|
# TODO: compute dip adjustments for non-vertical transmissibilities
|
425
425
|
dt_full = np.empty((vpg.nk, vpg.cell_count // vpg.nk, 3), dtype = float)
|
426
426
|
dt_full[:] = d_t
|
427
|
-
tr[:, 2:] = np.where(dt_full < tolerance, np.
|
427
|
+
tr[:, 2:] = np.where(dt_full < tolerance, np.nan,
|
428
428
|
triple_perm_horizontal.reshape((vpg.nk, -1, 3)) * a_t.reshape((1, -1, 3)) / dt_full).reshape(
|
429
429
|
(-1, 3))
|
430
430
|
if ntg is not None:
|
resqpy/olio/vector_utilities.py
CHANGED
@@ -999,7 +999,7 @@ def vertical_intercept_nan(x: float, x_value_0: float, x_value_1: float, y_value
|
|
999
999
|
y (float): y value of the straight line segment between point 1 and point 2,
|
1000
1000
|
evaluated at x; if x is outside the x values range, y is NaN
|
1001
1001
|
"""
|
1002
|
-
y = np.
|
1002
|
+
y = np.nan
|
1003
1003
|
if x_value_1 < x_value_0:
|
1004
1004
|
x_value_0, x_value_1 = x_value_1, x_value_0
|
1005
1005
|
y_value_0, y_value_1 = y_value_1, y_value_0
|
resqpy/olio/wellspec_keywords.py
CHANGED
@@ -482,11 +482,11 @@ def get_well_data(
|
|
482
482
|
if column_list[col_index].upper() == "GRID":
|
483
483
|
data[col].append("ROOT")
|
484
484
|
else:
|
485
|
-
data[col].append(np.
|
485
|
+
data[col].append(np.nan)
|
486
486
|
else:
|
487
487
|
value = words[column_map[col_index]]
|
488
488
|
if value == "NA":
|
489
|
-
data[col].append(np.
|
489
|
+
data[col].append(np.nan)
|
490
490
|
elif value == "#":
|
491
491
|
data[col].append(value)
|
492
492
|
elif value:
|
@@ -496,7 +496,7 @@ def get_well_data(
|
|
496
496
|
else:
|
497
497
|
for col, value in zip(columns_present, words[:len(columns_present)]):
|
498
498
|
if value == "NA":
|
499
|
-
data[col].append(np.
|
499
|
+
data[col].append(np.nan)
|
500
500
|
elif value == "#":
|
501
501
|
data[col].append(value)
|
502
502
|
elif value:
|
@@ -824,7 +824,7 @@ def _coarsening_sum(coarsening, a, axis = None):
|
|
824
824
|
return a_coarsened
|
825
825
|
|
826
826
|
|
827
|
-
def _coarsening_weighted_mean(coarsening, a, fine_weight, coarse_weight = None, zero_weight_result = np.
|
827
|
+
def _coarsening_weighted_mean(coarsening, a, fine_weight, coarse_weight = None, zero_weight_result = np.nan):
|
828
828
|
a_coarsened = np.empty(tuple(coarsening.coarse_extent_kji))
|
829
829
|
assert a.shape == tuple(coarsening.fine_extent_kji)
|
830
830
|
assert fine_weight.shape == a.shape
|
@@ -1085,17 +1085,17 @@ class PropertyCollection():
|
|
1085
1085
|
return meta
|
1086
1086
|
|
1087
1087
|
def null_value_for_part(self, part):
|
1088
|
-
"""Returns the null value for the (discrete) property part; np.
|
1088
|
+
"""Returns the null value for the (discrete) property part; np.nan for continuous parts.
|
1089
1089
|
|
1090
1090
|
arguments:
|
1091
1091
|
part (string): the part name for which the null value is required
|
1092
1092
|
|
1093
1093
|
returns:
|
1094
|
-
int or np.
|
1094
|
+
int or np.nan
|
1095
1095
|
"""
|
1096
1096
|
|
1097
1097
|
if self.continuous_for_part(part):
|
1098
|
-
return np.
|
1098
|
+
return np.nan
|
1099
1099
|
return self.element_for_part(part, 19)
|
1100
1100
|
|
1101
1101
|
def continuous_for_part(self, part):
|
@@ -1683,7 +1683,7 @@ class PropertyCollection():
|
|
1683
1683
|
exclude_inactive (boolean, default True): elements which are flagged as inactive in the supporting representation
|
1684
1684
|
are masked out if this argument is True
|
1685
1685
|
exclude_value (float or int, optional): if present, elements which match this value are masked out; if not None
|
1686
|
-
then usually set to np.
|
1686
|
+
then usually set to np.nan for continuous data or null_value_for_part() for discrete data
|
1687
1687
|
points (boolean, default False): if True, the simple array is expected to have an extra dimension of extent 3,
|
1688
1688
|
relative to the inactive attribute of the support
|
1689
1689
|
|
@@ -1771,7 +1771,7 @@ class PropertyCollection():
|
|
1771
1771
|
representation object with the attribute name 'inactive', to multiple properties (this will only work
|
1772
1772
|
if the indexable element is set to the typical value for the class of supporting representation, eg.
|
1773
1773
|
'cells' for grid objects); if exclude_null is set True then null value elements will also be masked out
|
1774
|
-
(as long as masked is True); however, it is recommended simply to use np.
|
1774
|
+
(as long as masked is True); however, it is recommended simply to use np.nan values in floating point
|
1775
1775
|
property arrays if the commonality is not needed;
|
1776
1776
|
set use_pack True if the hdf5 data may have been written with a similar setting
|
1777
1777
|
|
@@ -1948,7 +1948,7 @@ class PropertyCollection():
|
|
1948
1948
|
the maximum realization number present and slices for any missing realizations will be filled with fill_value;
|
1949
1949
|
if False, the extent of the first axis will only cpver the number pf realizations actually present (see also notes)
|
1950
1950
|
fill_value (int or float, optional): the value to use for missing realization slices; if None, will default to
|
1951
|
-
np.
|
1951
|
+
np.nan if data is continuous, -1 otherwise; irrelevant if fill_missing is False
|
1952
1952
|
indexable_element (string, optional): the indexable element for the properties in the collection; if None, will
|
1953
1953
|
be determined from the data
|
1954
1954
|
|
@@ -1968,7 +1968,7 @@ class PropertyCollection():
|
|
1968
1968
|
r_list, continuous = pcga._realizations_array_ref_initial_checks(self)
|
1969
1969
|
|
1970
1970
|
if fill_value is None:
|
1971
|
-
fill_value = np.
|
1971
|
+
fill_value = np.nan if continuous else -1
|
1972
1972
|
if indexable_element is None:
|
1973
1973
|
indexable_element = self.indexable_for_part(self.parts()[0])
|
1974
1974
|
|
@@ -1997,7 +1997,7 @@ class PropertyCollection():
|
|
1997
1997
|
the maximum time index present and slices for any missing indices will be filled with fill_value; if False,
|
1998
1998
|
the extent of the first axis will only cpver the number pf time indices actually present (see also notes)
|
1999
1999
|
fill_value (int or float, optional): the value to use for missing time index slices; if None, will default to
|
2000
|
-
np.
|
2000
|
+
np.nan if data is continuous, -1 otherwise; irrelevant if fill_missing is False
|
2001
2001
|
indexable_element (string, optional): the indexable element for the properties in the collection; if None, will
|
2002
2002
|
be determined from the data
|
2003
2003
|
|
@@ -2018,7 +2018,7 @@ class PropertyCollection():
|
|
2018
2018
|
ti_list, continuous = pcga._time_array_ref_initial_checks(self)
|
2019
2019
|
|
2020
2020
|
if fill_value is None:
|
2021
|
-
fill_value = np.
|
2021
|
+
fill_value = np.nan if continuous else -1
|
2022
2022
|
|
2023
2023
|
if indexable_element is None:
|
2024
2024
|
indexable_element = self.indexable_for_part(self.parts()[0])
|
resqpy/surface/_surface.py
CHANGED
@@ -1029,7 +1029,7 @@ class Surface(rqsb.BaseSurface):
|
|
1029
1029
|
t, p = self.triangles_and_points(patch = patch)
|
1030
1030
|
p_list = vec.points_in_triangles_njit(sample_xy, p[t], 1)
|
1031
1031
|
vertical = np.array((0.0, 0.0, 1.0), dtype = float)
|
1032
|
-
z = np.full(sample_xy.shape[0], np.
|
1032
|
+
z = np.full(sample_xy.shape[0], np.nan, dtype = float)
|
1033
1033
|
for triangle_index, p_index, _ in p_list:
|
1034
1034
|
# todo: replace following with cheaper trilinear interpolation, given vertical intersection line
|
1035
1035
|
xyz = meet.line_triangle_intersect_numba(sample_xy[p_index], vertical, p[t[triangle_index]], t_tol = 0.05)
|
resqpy/surface/_tri_mesh.py
CHANGED
@@ -241,8 +241,8 @@ class TriMesh(rqs.Mesh):
|
|
241
241
|
fy[am] = 1.0 - fy[am]
|
242
242
|
j[mask] = -1
|
243
243
|
i[mask] = -1
|
244
|
-
fx[mask] = np.
|
245
|
-
fy[mask] = np.
|
244
|
+
fx[mask] = np.nan
|
245
|
+
fy[mask] = np.nan
|
246
246
|
|
247
247
|
return (np.stack((j, i), axis = -1), np.stack((1.0 - (fx + fy), fx, fy), axis = -1))
|
248
248
|
|
@@ -94,7 +94,7 @@ class TriMeshStencil:
|
|
94
94
|
# convert into representation more njit & numpy friendly
|
95
95
|
self.start_ip = np.array([ip for (ip, _, _) in half_hex], dtype = int)
|
96
96
|
self.row_length = np.array([rl for (_, rl, _) in half_hex], dtype = int)
|
97
|
-
self.half_hex = np.full((self.n, 2 * self.n - 1), np.
|
97
|
+
self.half_hex = np.full((self.n, 2 * self.n - 1), np.nan, dtype = float)
|
98
98
|
for jp in range(self.n):
|
99
99
|
self.half_hex[jp, :self.row_length[jp]] = half_hex[jp][2]
|
100
100
|
|
@@ -210,7 +210,7 @@ class TriMeshStencil:
|
|
210
210
|
|
211
211
|
# todo: class methods for mexican hat
|
212
212
|
|
213
|
-
def apply(self, tri_mesh, handle_nan = True, border_value = np.
|
213
|
+
def apply(self, tri_mesh, handle_nan = True, border_value = np.nan, preserve_nan = False, title = None):
|
214
214
|
"""Return a new tri mesh with z values generated by applying the stencil to z values of an existing tri mesh.
|
215
215
|
|
216
216
|
arguments:
|
@@ -250,7 +250,7 @@ class TriMeshStencil:
|
|
250
250
|
if not np.any(nan_mask):
|
251
251
|
nan_mask = None
|
252
252
|
z_values[border:border + tri_mesh.nj, border:border + tri_mesh.ni] = tm_z
|
253
|
-
applied = np.full((e_nj, e_ni), np.
|
253
|
+
applied = np.full((e_nj, e_ni), np.nan, dtype = float)
|
254
254
|
|
255
255
|
if handle_nan:
|
256
256
|
_apply_stencil_nanmean(self.n, self.start_ip, self.row_length, self.half_hex, z_values, applied, border,
|
@@ -262,7 +262,7 @@ class TriMeshStencil:
|
|
262
262
|
# restore NaN values where they were present in input, if requested
|
263
263
|
tm_z_applied = applied[border:border + tri_mesh.nj, border:border + tri_mesh.ni]
|
264
264
|
if nan_mask is not None:
|
265
|
-
tm_z_applied[nan_mask] = np.
|
265
|
+
tm_z_applied[nan_mask] = np.nan
|
266
266
|
|
267
267
|
# create a new tri mesh object using the values from the applied array for z
|
268
268
|
tm = rqs.TriMesh(tri_mesh.model,
|
@@ -335,7 +335,7 @@ class VerticalPrismGrid(PrismGrid):
|
|
335
335
|
if surf == 0:
|
336
336
|
# allow NaN entries to handle unused distant circumcentres in Voronoi graph data
|
337
337
|
# assert not np.any(nan_lines), 'top surface does not cover all column points'
|
338
|
-
single_intersects[nan_lines] = np.
|
338
|
+
single_intersects[nan_lines] = np.nan
|
339
339
|
else:
|
340
340
|
single_intersects[nan_lines] = points[surf - 1][nan_lines]
|
341
341
|
# populate z values for layer of points
|
resqpy/well/_blocked_well.py
CHANGED
@@ -2579,7 +2579,7 @@ class BlockedWell(BaseResqpy):
|
|
2579
2579
|
entry_xyz, exit_xyz, ee_crs, pc, pc_titles, ci):
|
2580
2580
|
"""Get the x, y and z location of the midpoint of the interval."""
|
2581
2581
|
|
2582
|
-
xyz = (np.
|
2582
|
+
xyz = (np.nan, np.nan, np.nan)
|
2583
2583
|
if doing_xyz:
|
2584
2584
|
xyz = self.__get_xyz_if_doing_xyz(length_mode = length_mode,
|
2585
2585
|
md = md,
|
@@ -2734,7 +2734,7 @@ class BlockedWell(BaseResqpy):
|
|
2734
2734
|
dtype = np.int32
|
2735
2735
|
else:
|
2736
2736
|
null_value = None
|
2737
|
-
na_value = np.
|
2737
|
+
na_value = np.nan
|
2738
2738
|
dtype = float
|
2739
2739
|
# 'SKIN': use defaults for now; todo: create local property kind for skin
|
2740
2740
|
if column == 'STAT':
|
@@ -1,4 +1,4 @@
|
|
1
|
-
resqpy/__init__.py,sha256=
|
1
|
+
resqpy/__init__.py,sha256=KePPe4noY_Ul661qHQxi-2dxmtmaw7TVFqT9bx2kV80,556
|
2
2
|
resqpy/crs.py,sha256=R7DfcTP5xGv5pu9Y8RHA2WVM9DjBCSVMoHcz4RmQ7Yw,27646
|
3
3
|
resqpy/derived_model/__init__.py,sha256=NFvMSOKI3cxmH7lAbddV43JjoUj-r2G7ExEfOqinD1I,1982
|
4
4
|
resqpy/derived_model/_add_edges_per_column_property_array.py,sha256=cpW3gwp6MSYIrtvFmCjoJXcyUsgGuCDbgmwlJCJebUs,6410
|
@@ -24,13 +24,13 @@ resqpy/derived_model/_unsplit_grid.py,sha256=aqcdyn4WhDy7Kys3wnb55QwVXehmir4VW7T
|
|
24
24
|
resqpy/derived_model/_zonal_grid.py,sha256=H-IGMudUV-tiRHZqvl9B1wxMQNjeAM2zHvTllNiagPA,18825
|
25
25
|
resqpy/derived_model/_zone_layer_ranges_from_array.py,sha256=4pHkp7yqvkif_pC59VEK0g0JeFx7kt8mqhqADTOcucI,4358
|
26
26
|
resqpy/fault/__init__.py,sha256=IStX_EhPnppIExf_mgYrBddC4KP26VcqblcfXiBT614,996
|
27
|
-
resqpy/fault/_gcs_functions.py,sha256=
|
28
|
-
resqpy/fault/_grid_connection_set.py,sha256=
|
27
|
+
resqpy/fault/_gcs_functions.py,sha256=NRyhKkYChRaKDUIQ6pfVQiD67e4TTm3LnBvWEPtpkDU,29569
|
28
|
+
resqpy/fault/_grid_connection_set.py,sha256=icHKPcoGLUapWt33vL5dHMubah7kXUI7fAk8LU20LFU,117732
|
29
29
|
resqpy/grid/__init__.py,sha256=WsfOnR5lHcnpJEx8ZZ3lhd4dImEiieJLM7eFPxMi3u8,692
|
30
30
|
resqpy/grid/_cell_properties.py,sha256=pbyAK2eV9n4teOxm2q5hyBinohEbevFPrCfMcpGiqUU,20689
|
31
31
|
resqpy/grid/_connection_sets.py,sha256=-277bh9pMoeESSzy9oZehL-vc82aMGZuSLQs2KJ4Wfg,10120
|
32
32
|
resqpy/grid/_create_grid_xml.py,sha256=p-jKo1BZ-DlhEYixVzadtY-QsqA8ygcXvMYS_TvQCjg,22837
|
33
|
-
resqpy/grid/_defined_geometry.py,sha256=
|
33
|
+
resqpy/grid/_defined_geometry.py,sha256=QYQ3wLbPrlPobgUi9R1izTD4JD9qMGf5eyqbM68Hg-0,32297
|
34
34
|
resqpy/grid/_extract_functions.py,sha256=n_SmfkvEssX09SrlvUMe7y-4eOuVckhL_M6tFTg1bRg,28203
|
35
35
|
resqpy/grid/_face_functions.py,sha256=0I7O6DDz7nJWczi_G2bE3L2XUr4acxREwKygXWEp6F4,16516
|
36
36
|
resqpy/grid/_faults.py,sha256=OmukVoLpdrndqDxwE6Rj7Ul5tj3FUQVPhE0raH2FHpg,12236
|
@@ -40,7 +40,7 @@ resqpy/grid/_intervals_info.py,sha256=ODjDz22n8U9pSpO0Muj8mJr2hYWauFDzgcVQ0RM3cs
|
|
40
40
|
resqpy/grid/_moved_functions.py,sha256=XboxA0pE55j-P_x5g051WheVamxkAatQGbU5aq2GkaE,604
|
41
41
|
resqpy/grid/_pillars.py,sha256=WXvLjORlNHnm0KI3qgoRtCyXdcT9vQBkJDQWL2wtJwg,7243
|
42
42
|
resqpy/grid/_pixel_maps.py,sha256=Aqn9dpDKjX_v8BnWMdN__ulqjeuXfE6W2_Z7EDaUqdE,5386
|
43
|
-
resqpy/grid/_points_functions.py,sha256=
|
43
|
+
resqpy/grid/_points_functions.py,sha256=72dCLWHrOUM9xSwSaEuxPUA__b6WAdk5rbeWatILdaI,70585
|
44
44
|
resqpy/grid/_regular_grid.py,sha256=6lXWSsgzVAB4QwGOwhB7Gb9_kiU2rNM55xWIf9qT3GI,45758
|
45
45
|
resqpy/grid/_transmissibility.py,sha256=cLtuVaLgBQqRXa-_YQ5mjR_QC842Jxn2d-Hl6171yOY,22575
|
46
46
|
resqpy/grid/_write_hdf5_from_caches.py,sha256=s3gcoilsFCCSw_wjnTjWe1xMHEWr_cessoGVgzqiqVI,9707
|
@@ -48,7 +48,7 @@ resqpy/grid/_write_nexus_corp.py,sha256=yEVfiObsedEAXX6UG6ZTf56kZnQVkd3lLqE2NpL-
|
|
48
48
|
resqpy/grid/_xyz.py,sha256=RLQWOdM_DRoCj4JypwB5gUJ78HTdk5JnZHSeAzuU634,13087
|
49
49
|
resqpy/grid_surface/__init__.py,sha256=iyK3_Vlg9mXffc_1gjvRdKwQE0zicbNXya0tryHkr04,2593
|
50
50
|
resqpy/grid_surface/_blocked_well_populate.py,sha256=MQIHf7Sh_XR3cUCfGhvlu4Xl498DtIKH2ffo4iud93w,35843
|
51
|
-
resqpy/grid_surface/_find_faces.py,sha256=
|
51
|
+
resqpy/grid_surface/_find_faces.py,sha256=CRt0jBl28WUdsqW7kp9LUMHXVjWge6vtFjl4qBMT9HA,65537
|
52
52
|
resqpy/grid_surface/_grid_skin.py,sha256=D0cjHkcuT5KCKb-8EZfXgh0GgJj3kzOBS2wVNXg4bfY,26056
|
53
53
|
resqpy/grid_surface/_grid_surface.py,sha256=l2NJo7Kiucolbb_TlLPC7NGdksg_JahkihfsrJVq99w,14379
|
54
54
|
resqpy/grid_surface/_trajectory_intersects.py,sha256=Och9cZYU9Y7ofovhPzsLyIblRUl2xj9_5nHH3fMZp-A,22498
|
@@ -69,7 +69,7 @@ resqpy/multi_processing/__init__.py,sha256=ZRudHfN9aaZjxvat7t8BZr6mwMi9baiCNjczw
|
|
69
69
|
resqpy/multi_processing/_multiprocessing.py,sha256=bnCKfSC1tWwvZmZ7BZqCyje0C93m6q7HZPxNpx8xoxA,7301
|
70
70
|
resqpy/multi_processing/wrappers/__init__.py,sha256=7vjuTWdHnp3rN9Ud8ljpDnt1NbBAyhA08lv-sQ9Kf3o,72
|
71
71
|
resqpy/multi_processing/wrappers/blocked_well_mp.py,sha256=_2fEsSmJVQCnbQIjTHqmnNEugfhN1KvX-o4ZbvtChdI,5952
|
72
|
-
resqpy/multi_processing/wrappers/grid_surface_mp.py,sha256=
|
72
|
+
resqpy/multi_processing/wrappers/grid_surface_mp.py,sha256=ZIYH34BfdFY7wkcxX3VycJtaFGL4NRpa8tQY391SzQs,23409
|
73
73
|
resqpy/multi_processing/wrappers/mesh_mp.py,sha256=0VYoqtgBFfrlyYB6kkjbdrRQ5FKe6t5pHJO3wD9b8Fc,5793
|
74
74
|
resqpy/olio/__init__.py,sha256=j2breqKYVufhw5k8qS2uZwB3tUKT7FhdZ23ninS75YA,84
|
75
75
|
resqpy/olio/ab_toolbox.py,sha256=bZlAhOJVS0HvIYBW0Lg68re17N8eltoQhIUh0xuUyVc,2147
|
@@ -94,13 +94,13 @@ resqpy/olio/relperm.py,sha256=VSyqVz_OsjCL9tB7jBnjVdLA4F5yiKYJthIghux8_aI,17135
|
|
94
94
|
resqpy/olio/simple_lines.py,sha256=qaR11W5UPgRmtMeFQ-pXg0jOvkJZ_XPzSUpAXqeYtlc,12189
|
95
95
|
resqpy/olio/time.py,sha256=LtoSIf1A6wunHSpDgKsSGEr0rbcSQyy35TgJvY37PrI,760
|
96
96
|
resqpy/olio/trademark.py,sha256=p_EWvUUnfalOA0RC94fSWMDgdGY9-FdZuGtAjg3wNcY,822
|
97
|
-
resqpy/olio/transmission.py,sha256=
|
97
|
+
resqpy/olio/transmission.py,sha256=auz_12TKtSPy6Fv3wmKn5lXPRAEnn2tYVyTQfsj37xU,61869
|
98
98
|
resqpy/olio/triangulation.py,sha256=JA4LN4uASqkN_gx4eE_cAHNOJfTqAQQPYET_cLPJuU8,45621
|
99
99
|
resqpy/olio/uuid.py,sha256=JRMi-RZNeGm8tGNloIwTATzNtdj29lBQDV9OILboPRI,7324
|
100
100
|
resqpy/olio/vdb.py,sha256=lQYuK1kr1Wnucq2EoKgT6lrR7vloCemnCKZktzBcLUc,45231
|
101
|
-
resqpy/olio/vector_utilities.py,sha256=
|
101
|
+
resqpy/olio/vector_utilities.py,sha256=zPJHAcdEvuHNm2L3ldEHztBxVSHVJaSSClCO4ooFRG8,53546
|
102
102
|
resqpy/olio/volume.py,sha256=F1pMnDoJ4ricy4dfdLuLuK1xkVgJckL9V06tUeyK6Wc,6185
|
103
|
-
resqpy/olio/wellspec_keywords.py,sha256=
|
103
|
+
resqpy/olio/wellspec_keywords.py,sha256=QHITeHjd24HGvGVFKcTvtlqRn5v8Gq4d4Pe4dqyw3Gk,26265
|
104
104
|
resqpy/olio/write_data.py,sha256=bIX7ilMkXWCMz_zQh-Gqk56sNzng4W5l4BahW2EV7Kw,5142
|
105
105
|
resqpy/olio/write_hdf5.py,sha256=KXB2L6Qz3TFb9yDjT-Ty0CXgjyq0nhVp3GADlekWhMQ,19055
|
106
106
|
resqpy/olio/xml_et.py,sha256=aPjxr2XWvYcwlnckL_UiZmd5EGEoIfy_JxeOKOk3vwQ,25322
|
@@ -134,8 +134,8 @@ resqpy/property/_collection_get_attributes.py,sha256=MlontPfGo00lxt0SpB49YG9PRsi
|
|
134
134
|
resqpy/property/_collection_support.py,sha256=77_DG-0pzhMWdG_mNDiGfihXD7Pp-CvDSGCV8ZlDjj4,5889
|
135
135
|
resqpy/property/_property.py,sha256=JcG7h6k4cJ4l3WC_VCsvoqHM3FBxrnUuxbIK2Ono1M0,24426
|
136
136
|
resqpy/property/attribute_property_set.py,sha256=gATFe-vI00GrgaJNMHSKbM0xmlxIsO5DT1qRSU9snYI,12295
|
137
|
-
resqpy/property/grid_property_collection.py,sha256=
|
138
|
-
resqpy/property/property_collection.py,sha256=
|
137
|
+
resqpy/property/grid_property_collection.py,sha256=oZr2uZ06Rvc_Ddt4Qykm4vlZJOCqIdw5PYsWudbGPc4,66946
|
138
|
+
resqpy/property/property_collection.py,sha256=Ax1wzqE9xfsMaIIKVlVTxNaDRZ4RpEK9ZcBEf_JDtWU,152167
|
139
139
|
resqpy/property/property_common.py,sha256=wf429weNtgf6J4gCNNoRwj64elQvUPI_ZWzg4qI7l6c,35993
|
140
140
|
resqpy/property/property_kind.py,sha256=6SK0La09eisHPYOSgdx69K_Ordrq0x2tz4IAyurVyY8,5557
|
141
141
|
resqpy/property/string_lookup.py,sha256=eH-lbLRbb8JKtO91FTtyuYseRGwPkmsghcXbKUTvVgI,7737
|
@@ -163,9 +163,9 @@ resqpy/surface/_base_surface.py,sha256=LsWrDrbuuaEVRgf2Dlbc-6ZvGQpjtrKuxF7Jjebvl
|
|
163
163
|
resqpy/surface/_combined_surface.py,sha256=8TnNbSywjej6tW_vRr5zoVgBbvnadCaqWk6WyHWHTYQ,3082
|
164
164
|
resqpy/surface/_mesh.py,sha256=bhHfIjRg9xWhv1aWW9oDhTK6LlwS5rZBST1ONJuG8pg,42192
|
165
165
|
resqpy/surface/_pointset.py,sha256=niTkBik9hAvqrY8340K1TRG7mg4FMQbbp12WZiiXPMs,27416
|
166
|
-
resqpy/surface/_surface.py,sha256=
|
167
|
-
resqpy/surface/_tri_mesh.py,sha256=
|
168
|
-
resqpy/surface/_tri_mesh_stencil.py,sha256=
|
166
|
+
resqpy/surface/_surface.py,sha256=mylFBhkxey5pQBd_Tmn56bFtNn35ldw9M-yCXUvxHco,70786
|
167
|
+
resqpy/surface/_tri_mesh.py,sha256=o_s_vHHMIb1BbfTGUtXOm7c6ODXPTTIuSlX4HFR1yrg,26465
|
168
|
+
resqpy/surface/_tri_mesh_stencil.py,sha256=eXt_HIKvsXGsjQ7nm_NbozR6ProQxPbeO52r79j80ig,16087
|
169
169
|
resqpy/surface/_triangulated_patch.py,sha256=cmZVssA5Yde0JzgawkahlZFNFcmgxJS59HxirOu7nQ4,25907
|
170
170
|
resqpy/time_series/__init__.py,sha256=jiB3HJUWe47OOJTVmRJ4Gh5vm-XdMaMXmD52kAGr2zY,1074
|
171
171
|
resqpy/time_series/_any_time_series.py,sha256=43q5hV-VKReZ6rRMEFHx977OVcOKwPvWOJbB9fj3SFQ,8755
|
@@ -176,7 +176,7 @@ resqpy/time_series/_time_duration.py,sha256=bzRf0fynlB68KUYKa0Ih7qwd4ZJnRjl_Y6Ax
|
|
176
176
|
resqpy/time_series/_time_series.py,sha256=ceCuFbmYmppx0jBitdyjtSKkcLxjZ-qyhFN_HQX-3CQ,10818
|
177
177
|
resqpy/unstructured/__init__.py,sha256=8te-ghWhkDGe0QaLDClvVEkSMtnDtX46K1QODmJU8Xw,603
|
178
178
|
resqpy/unstructured/_hexa_grid.py,sha256=bRzx0PHUtOziEeVk7nZv5aQlogYnqvtbrVMTXsSVcQU,15328
|
179
|
-
resqpy/unstructured/_prism_grid.py,sha256=
|
179
|
+
resqpy/unstructured/_prism_grid.py,sha256=rejFlW6yukHicGeBc5gNZQom2q7gwuB2zEK1QEwEXw0,35856
|
180
180
|
resqpy/unstructured/_pyramid_grid.py,sha256=qDn7FlhLfDuqJYS88tomwuv5CH7RJd7avl-qK7CUy_4,7862
|
181
181
|
resqpy/unstructured/_tetra_grid.py,sha256=IkRRaxulhH42fE2EysLI9gfUf19YoO3nFA_Uq6CrxmI,12453
|
182
182
|
resqpy/unstructured/_unstructured_grid.py,sha256=OTYOSGrKoE51KpRhn4818tdvmZ-q9nmahk_7wC56mvc,51550
|
@@ -184,7 +184,7 @@ resqpy/weights_and_measures/__init__.py,sha256=Kp1pPZFH4rS5_PkCERZBEzGoat6n_dSS0
|
|
184
184
|
resqpy/weights_and_measures/nexus_units.py,sha256=pHqcFbe-8nyqozFgN5Ce-W-UvEnXQ6yiaX3dP1ONtAQ,5434
|
185
185
|
resqpy/weights_and_measures/weights_and_measures.py,sha256=1WnrmhtcyCgY2crClNddmfwtf33JdVZy9wNhqPQIvuc,16210
|
186
186
|
resqpy/well/__init__.py,sha256=v5_gd7sSPRM9q2KsLiLWaw3jbnXFZkou38qeB7_HSN4,990
|
187
|
-
resqpy/well/_blocked_well.py,sha256=
|
187
|
+
resqpy/well/_blocked_well.py,sha256=ZMuasUs_c3SIBMnF05tEAM44X3okC30YiF-iDryS64o,192115
|
188
188
|
resqpy/well/_deviation_survey.py,sha256=d3u31JbBqMCsaz6MUrtZium90wrC3omtm46A755fvgk,23115
|
189
189
|
resqpy/well/_md_datum.py,sha256=rRrDQckTJwZtIEh28dlgXj32kcBSu-ZvHFYZOiQsyqg,7154
|
190
190
|
resqpy/well/_trajectory.py,sha256=QGFgdYVvA_gJth3n-RaFPS71S5KGgECnNMx0dp1r4Tw,52771
|
@@ -194,7 +194,7 @@ resqpy/well/_wellbore_marker_frame.py,sha256=xvYH2_2Ie3a18LReFymbUrZboOx7Rhv5DOD
|
|
194
194
|
resqpy/well/blocked_well_frame.py,sha256=Lg7TgynfPv9WkklXTLt9VN6uBXWUqX1LI-Xmv_FBqYk,22555
|
195
195
|
resqpy/well/well_object_funcs.py,sha256=LYTcC07ezlBxClfrug_B4iXXZUkXDPgsVufNzp361Wo,24703
|
196
196
|
resqpy/well/well_utils.py,sha256=zwpYjT85nXAwWBhYB1Pygu2SgouZ-44k6hEOnpoMfBI,5969
|
197
|
-
resqpy-4.16.
|
198
|
-
resqpy-4.16.
|
199
|
-
resqpy-4.16.
|
200
|
-
resqpy-4.16.
|
197
|
+
resqpy-4.16.8.dist-info/LICENSE,sha256=2duHPIkKQyESMdQ4hKjL8CYEsYRHXaYxt0YQkzsUYE4,1059
|
198
|
+
resqpy-4.16.8.dist-info/METADATA,sha256=iffFlvprjtp-dkRvmXhdy0uQ4gngo_adfj7frRrWFqU,4028
|
199
|
+
resqpy-4.16.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
200
|
+
resqpy-4.16.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|