resqpy 4.18.0__py3-none-any.whl → 4.18.2__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 CHANGED
@@ -28,6 +28,6 @@
28
28
 
29
29
  import logging
30
30
 
31
- __version__ = "4.18.0" # Set at build time
31
+ __version__ = "4.18.2" # Set at build time
32
32
  log = logging.getLogger(__name__)
33
33
  log.info(f"Imported resqpy version {__version__}")
@@ -865,7 +865,7 @@ def find_faces_to_represent_surface_regular_dense_optimised(grid,
865
865
  if progress_fn is not None:
866
866
  progress_fn(1.0)
867
867
 
868
- log.debug(f"finishing find_faces_to_represent_surface_regular_optimised for {name}")
868
+ log.debug(f"finishing find_faces_to_represent_surface_regular_dense_optimised for {name}")
869
869
 
870
870
  # if returning properties, construct dictionary
871
871
  if return_properties:
@@ -1537,7 +1537,7 @@ def packed_bisector_from_face_indices( # type: ignore
1537
1537
 
1538
1538
  # find the surface boundary (includes a buffer slice where surface does not reach edge of grid), and shrink the I axis
1539
1539
  box = get_packed_boundary_from_indices(k_faces_kji0, j_faces_kji0, i_faces_kji0, grid_extent_kji)
1540
- # set k_faces as uint8 packed bool arrays covering box
1540
+ # set k_faces, j_faces & i_faces as uint8 packed bool arrays covering box
1541
1541
  k_faces, j_faces, i_faces = _packed_box_face_arrays_from_indices(k_faces_kji0, j_faces_kji0, i_faces_kji0, box)
1542
1542
 
1543
1543
  box_shape = box[1, :] - box[0, :]
@@ -1562,9 +1562,10 @@ def packed_bisector_from_face_indices( # type: ignore
1562
1562
  else:
1563
1563
  open_i = np.invert(i_faces, dtype = np.uint8)
1564
1564
 
1565
- # close off faces in padding bits
1566
- tail = grid_extent_kji[2] % 8 # number of valid bits in padded byte
1567
- if tail:
1565
+ # close off faces in padding bits, if within box
1566
+ if box[1, 2] * 8 > grid_extent_kji[2]:
1567
+ tail = grid_extent_kji[2] % 8 # number of valid bits in padded byte
1568
+ assert tail
1568
1569
  m = np.uint8((255 << (8 - tail)) & 255)
1569
1570
  open_k[:, :, -1] &= m
1570
1571
  open_j[:, :, -1] &= m
@@ -1581,7 +1582,7 @@ def packed_bisector_from_face_indices( # type: ignore
1581
1582
  array[box[0, 0]:box[1, 0], box[0, 1]:box[1, 1], box[0, 2]:box[1, 2]] = box_array
1582
1583
 
1583
1584
  # set bisector values outside of the bounding box
1584
- _set_packed_bisector_outside_box(array, box, box_array)
1585
+ _set_packed_bisector_outside_box(array, box, box_array, grid_extent_kji[2] % 8)
1585
1586
 
1586
1587
  # check all array elements are not the same
1587
1588
  true_count = np.sum(bitwise_count(array)) # note: will usually include some padding bits, so not so true!
@@ -2127,7 +2128,7 @@ def _set_bisector_outside_box(a: np.ndarray, box: np.ndarray, box_array: np.ndar
2127
2128
  a[:, :, :box[0, 2]] = True
2128
2129
 
2129
2130
 
2130
- def _set_packed_bisector_outside_box(a: np.ndarray, box: np.ndarray, box_array: np.ndarray):
2131
+ def _set_packed_bisector_outside_box(a: np.ndarray, box: np.ndarray, box_array: np.ndarray, tail: int):
2131
2132
  # set values outside of the bounding box, working with packed arrays
2132
2133
  if box[1, 0] < a.shape[0] and np.any(box_array[-1, :, :]):
2133
2134
  a[box[1, 0]:, :, :] = 255
@@ -2141,6 +2142,9 @@ def _set_packed_bisector_outside_box(a: np.ndarray, box: np.ndarray, box_array:
2141
2142
  a[:, :, box[1, 2]:] = 255
2142
2143
  if box[0, 2] != 0:
2143
2144
  a[:, :, :box[0, 2]] = 255
2145
+ if tail:
2146
+ m = np.uint8((255 << (8 - tail)) & 255)
2147
+ a[:, :, -1] &= m
2144
2148
 
2145
2149
 
2146
2150
  def _box_face_arrays_from_indices( # type: ignore
@@ -18,32 +18,32 @@ import resqpy.surface as rqs
18
18
  import resqpy.olio.uuid as bu
19
19
 
20
20
 
21
- def find_faces_to_represent_surface_regular_wrapper(
22
- index: int,
23
- parent_tmp_dir: str,
24
- use_index_as_realisation: bool,
25
- grid_epc: str,
26
- grid_uuid: Union[UUID, str],
27
- surface_epc: str,
28
- surface_uuid: Union[UUID, str],
29
- name: str,
30
- title: Optional[str] = None,
31
- agitate: bool = False,
32
- random_agitation: bool = False,
33
- feature_type: str = 'fault',
34
- trimmed: bool = False,
35
- is_curtain = False,
36
- extend_fault_representation: bool = False,
37
- flange_inner_ring = False,
38
- saucer_parameter = None,
39
- retriangulate: bool = False,
40
- related_uuid = None,
41
- progress_fn: Optional[Callable] = None,
42
- extra_metadata = None,
43
- return_properties: Optional[List[str]] = None,
44
- raw_bisector: bool = False,
45
- use_pack: bool = False,
46
- flange_radius = None) -> Tuple[int, bool, str, List[Union[UUID, str]]]:
21
+ def find_faces_to_represent_surface_regular_wrapper(index: int,
22
+ parent_tmp_dir: str,
23
+ use_index_as_realisation: bool,
24
+ grid_epc: str,
25
+ grid_uuid: Union[UUID, str],
26
+ surface_epc: str,
27
+ surface_uuid: Union[UUID, str],
28
+ name: str,
29
+ title: Optional[str] = None,
30
+ agitate: bool = False,
31
+ random_agitation: bool = False,
32
+ feature_type: str = 'fault',
33
+ trimmed: bool = False,
34
+ is_curtain = False,
35
+ extend_fault_representation: bool = False,
36
+ flange_inner_ring = False,
37
+ saucer_parameter = None,
38
+ retriangulate: bool = False,
39
+ related_uuid = None,
40
+ progress_fn: Optional[Callable] = None,
41
+ extra_metadata = None,
42
+ return_properties: Optional[List[str]] = None,
43
+ raw_bisector: bool = False,
44
+ use_pack: bool = False,
45
+ flange_radius = None,
46
+ n_threads = 20) -> Tuple[int, bool, str, List[Union[UUID, str]]]:
47
47
  """Multiprocessing wrapper function of find_faces_to_represent_surface_regular_optimised.
48
48
 
49
49
  arguments:
@@ -92,10 +92,11 @@ def find_faces_to_represent_surface_regular_wrapper(
92
92
  the returned dictionary has the passed strings as keys and numpy arrays as values
93
93
  raw_bisector (bool, default False): if True and grid bisector is requested then it is left in a raw
94
94
  form without assessing which side is shallower (True values indicate same side as origin cell)
95
- use_pack (bool, default False): if True, boolean properties will be stored in numpy packed format,
96
- which will only be readable by resqpy based applications
95
+ use_pack (bool, default False): if True, boolean properties will be generated and stored in numpy
96
+ packed format, which will only be readable by resqpy based applications
97
97
  flange_radius (float, optional): the radial distance to use for outer flange extension points; if None,
98
98
  a large value will be calculated from the grid size; units are xy units of grid crs
99
+ n_threads (int, default 20): the number of parallel threads to use in numba points in triangles function
99
100
 
100
101
  returns:
101
102
  Tuple containing:
@@ -250,7 +251,9 @@ def find_faces_to_represent_surface_regular_wrapper(
250
251
  is_curtain,
251
252
  progress_fn,
252
253
  return_properties,
253
- raw_bisector = raw_bisector)
254
+ raw_bisector = raw_bisector,
255
+ n_batches = n_threads,
256
+ packed_bisectors = use_pack)
254
257
 
255
258
  success = False
256
259
 
@@ -340,17 +343,17 @@ def find_faces_to_represent_surface_regular_wrapper(
340
343
  if grid_pc is None:
341
344
  grid_pc = rqp.PropertyCollection()
342
345
  grid_pc.set_support(support = grid)
343
- grid_pc.add_cached_array_to_imported_list(
344
- array,
345
- f"from find_faces function for {surface.title}",
346
- f'{surface.title} {p_name}',
347
- discrete = True,
348
- property_kind = "grid bisector",
349
- facet_type = 'direction',
350
- facet = 'raw' if raw_bisector else ('vertical' if is_curtain else 'sloping'),
351
- realization = realisation,
352
- indexable_element = "columns" if is_curtain else "cells",
353
- )
346
+ grid_pc.add_cached_array_to_imported_list(array,
347
+ f"from find_faces function for {surface.title}",
348
+ f'{surface.title} {p_name}',
349
+ discrete = True,
350
+ property_kind = "grid bisector",
351
+ facet_type = 'direction',
352
+ facet = 'raw' if raw_bisector else
353
+ ('vertical' if is_curtain else 'sloping'),
354
+ realization = realisation,
355
+ indexable_element = "columns" if is_curtain else "cells",
356
+ pre_packed = use_pack)
354
357
  elif p_name == 'grid shadow':
355
358
  if grid_pc is None:
356
359
  grid_pc = rqp.PropertyCollection()
resqpy/olio/write_hdf5.py CHANGED
@@ -101,7 +101,7 @@ class H5Register():
101
101
  assert chunks is None or isinstance(chunks, str) or isinstance(chunks, tuple)
102
102
  assert compression is None or (isinstance(compression, str) and compression in ['gzip', 'lzf', 'none'])
103
103
  if str(dtype) == 'pack':
104
- a = np.packbits(a, axis = -1) # todo: check this returns uint8 array
104
+ a = np.packbits(a, axis = -1)
105
105
  dtype = 'uint8'
106
106
  elif dtype is not None:
107
107
  a = a.astype(dtype, copy = copy)
@@ -199,7 +199,7 @@ def _process_imported_property(collection, attributes, property_kind_uuid, strin
199
199
  extra_metadata, expand_const_arrays):
200
200
  (p_uuid, p_file_name, p_keyword, p_cached_name, p_discrete, p_uom, p_time_index, p_null_value, p_min_value,
201
201
  p_max_value, property_kind, facet_type, facet, realization, indexable_element, count, local_property_kind_uuid,
202
- const_value, points, p_time_series_uuid, p_string_lookup_uuid) = attributes
202
+ const_value, points, p_time_series_uuid, p_string_lookup_uuid, pre_packed) = attributes
203
203
 
204
204
  log.debug('processing imported property ' + str(p_keyword))
205
205
  assert not points or not p_discrete
@@ -214,7 +214,7 @@ def _process_imported_property(collection, attributes, property_kind_uuid, strin
214
214
  p_keyword, p_discrete, string_lookup_uuid, points)
215
215
 
216
216
  p_array = _process_imported_property_get_p_array(collection, p_cached_name)
217
- p_array_bool = isinstance(const_value, bool) if p_array is None else p_array.dtype in [bool, np.int8]
217
+ p_array_bool = isinstance(const_value, bool) if p_array is None else p_array.dtype in [bool, np.int8, np.uint8]
218
218
 
219
219
  add_min_max = pcga._process_imported_property_get_add_min_max(points, property_kind, string_lookup_uuid,
220
220
  local_property_kind_uuid, p_array_bool)
@@ -251,7 +251,8 @@ def _process_imported_property(collection, attributes, property_kind_uuid, strin
251
251
  find_local_property_kinds = find_local_property_kinds,
252
252
  extra_metadata = extra_metadata,
253
253
  const_value = const_value,
254
- expand_const_arrays = expand_const_arrays)
254
+ expand_const_arrays = expand_const_arrays,
255
+ pre_packed = pre_packed)
255
256
  if p_node is not None:
256
257
  return p_node
257
258
  else:
@@ -246,8 +246,10 @@ def _create_xml_facet_node(facet_type, facet, p_node):
246
246
  facet_value_node.text = facet
247
247
 
248
248
 
249
- def _check_shape_list(collection, indexable_element, direction, property_array, points, count):
249
+ def _check_shape_list(collection, indexable_element, direction, property_array, points, count, pre_packed):
250
250
  shape_list = collection.supporting_shape(indexable_element = indexable_element, direction = direction)
251
+ if pre_packed:
252
+ shape_list[-1] = (shape_list[-1] - 1) // 8 + 1
251
253
  if shape_list is not None:
252
254
  if count > 1:
253
255
  shape_list.append(count)
@@ -88,7 +88,7 @@ class PropertyCollection():
88
88
  # above is list of (uuid, source, keyword, cached_name, discrete, uom, time_index, null_value,
89
89
  # min_value, max_value, property_kind, facet_type, facet, realization,
90
90
  # indexable_element, count, local_property_kind_uuid, const_value, points,
91
- # time_series_uuid, string_lookup_uuid)
91
+ # time_series_uuid, string_lookup_uuid, pre_packed)
92
92
  self.guess_warning = False
93
93
  if support is not None:
94
94
  self.model = support.model
@@ -404,7 +404,8 @@ class PropertyCollection():
404
404
  call this method once for each group of differently sized properties; for very large collections
405
405
  it might also be necessary to divide the work into smaller groups to reduce memory usage;
406
406
  this method does not write to hdf5 nor create xml – use the usual methods for further processing
407
- of the imported list
407
+ of the imported list;
408
+ does not currently support packed arrays
408
409
  """
409
410
 
410
411
  source = 'sampled'
@@ -2219,7 +2220,8 @@ class PropertyCollection():
2219
2220
  const_value = None,
2220
2221
  points = False,
2221
2222
  time_series_uuid = None,
2222
- string_lookup_uuid = None):
2223
+ string_lookup_uuid = None,
2224
+ pre_packed = False):
2223
2225
  """Caches array and adds to the list of imported properties (but not to the collection dict).
2224
2226
 
2225
2227
  arguments:
@@ -2250,6 +2252,7 @@ class PropertyCollection():
2250
2252
  be provided when writing hdf5 and creating xml for the imported list
2251
2253
  string_lookup_uuid (UUID, optional): should be provided for categorical properties, though can alternatively
2252
2254
  be specified when creating xml
2255
+ pre_packed (bool, default False): set to True if the property is boolean and the array is already packed
2253
2256
 
2254
2257
  returns:
2255
2258
  uuid of nascent property object
@@ -2271,6 +2274,7 @@ class PropertyCollection():
2271
2274
  assert (cached_array is not None and const_value is None) or (cached_array is None and const_value is not None)
2272
2275
  assert not points or not discrete
2273
2276
  assert count > 0
2277
+ assert (not pre_packed) or ((cached_array is not None) and (cached_array.dtype == np.uint8))
2274
2278
  rqp_c.check_and_warn_property_kind(property_kind, 'adding property to imported list')
2275
2279
 
2276
2280
  if self.imported_list is None:
@@ -2288,7 +2292,7 @@ class PropertyCollection():
2288
2292
  self.imported_list.append(
2289
2293
  (uuid, source_info, keyword, cached_name, discrete, uom, time_index, null_value, min_value, max_value,
2290
2294
  property_kind, facet_type, facet, realization, indexable_element, count, local_property_kind_uuid,
2291
- const_value, points, time_series_uuid, string_lookup_uuid))
2295
+ const_value, points, time_series_uuid, string_lookup_uuid, pre_packed))
2292
2296
  return uuid
2293
2297
 
2294
2298
  def add_similar_to_imported_list(self,
@@ -2311,6 +2315,7 @@ class PropertyCollection():
2311
2315
  points = None,
2312
2316
  time_series_uuid = None,
2313
2317
  string_lookup_uuid = None,
2318
+ pre_packed = False,
2314
2319
  similar_model = None,
2315
2320
  title = None):
2316
2321
  """Caches array and adds to the list of imported properties using default metadata from a similar property.
@@ -2342,6 +2347,7 @@ class PropertyCollection():
2342
2347
  be provided when writing hdf5 and creating xml for the imported list
2343
2348
  string_lookup_uuid (UUID, optional): should be provided for categorical properties, though can alternatively
2344
2349
  be specified when creating xml
2350
+ pre_packed (bool, default False): set to True if the property is boolean and the cached array is packed
2345
2351
  similar_model (Model, optional): the model where the similar property resides, if not the same as this
2346
2352
  property collection
2347
2353
  title (str, optional): synonym for keyword argument
@@ -2398,6 +2404,7 @@ class PropertyCollection():
2398
2404
  args['string_lookup_uuid'] = get_arg(time_series_uuid, similar.string_lookup_uuid())
2399
2405
  em = similar.extra_metadata if hasattr(similar, 'extra_metadata') else {}
2400
2406
  args['source_info'] = get_arg(source_info, em.get('source'))
2407
+ args['pre_packed'] = pre_packed
2401
2408
 
2402
2409
  return self.add_cached_array_to_imported_list(cached_array, **args)
2403
2410
 
@@ -2445,7 +2452,8 @@ class PropertyCollection():
2445
2452
  as 32 bit; if None, the system default is to write as 32 bit; if True, 32 bit is used; if
2446
2453
  False, 64 bit data is written; ignored if dtype is not None
2447
2454
  use_pack (bool, default False): if True, bool arrays will be packed along their last axis; this
2448
- will generally result in hdf5 data that is not readable by non-resqpy applications
2455
+ will generally result in hdf5 data that is not readable by non-resqpy applications; leave
2456
+ as False for already packed arrays
2449
2457
  chunks (str, optional): if not None, one of 'auto', 'all', or 'slice', controlling hdf5 chunks
2450
2458
  compression (str, optional): if not None, one of 'gzip' or 'lzf' being the hdf5 compression
2451
2459
  algorithm to be used; gzip gives better compression ratio but is slower
@@ -2473,8 +2481,8 @@ class PropertyCollection():
2473
2481
  uuid = entry[0]
2474
2482
  cached_name = entry[3]
2475
2483
  tail = 'points_patch0' if entry[18] else 'values_patch0'
2476
- if use_pack and (str(dtype).startswith('bool') or
2477
- (dtype is None and str(self.__dict__[cached_name].dtype) == 'bool')):
2484
+ if use_pack and ('bool' in str(dtype) or
2485
+ (dtype is None and 'bool' in str(self.__dict__[cached_name].dtype))):
2478
2486
  dtype = 'pack'
2479
2487
  h5_reg.register_dataset(uuid, tail, self.__dict__[cached_name], dtype = dtype)
2480
2488
  h5_reg.write(file = file_name, mode = mode, use_int32 = use_int32)
@@ -2601,7 +2609,8 @@ class PropertyCollection():
2601
2609
  points = False,
2602
2610
  extra_metadata = {},
2603
2611
  const_value = None,
2604
- expand_const_arrays = False):
2612
+ expand_const_arrays = False,
2613
+ pre_packed = False):
2605
2614
  """Create a property xml node for a single property related to a given supporting representation node.
2606
2615
 
2607
2616
  arguments:
@@ -2661,6 +2670,8 @@ class PropertyCollection():
2661
2670
  const_value (float, int or bool, optional): if present, create xml for a constant array filled with this value
2662
2671
  expand_const_arrays (boolean, default False): if True, the hdf5 write must also have been called with the
2663
2672
  same argument and the xml will treat a constant array as a normal array
2673
+ pre_packed (boolean, default False): if True, the property is a boolean property and the array has already
2674
+ been packed into bits
2664
2675
 
2665
2676
  returns:
2666
2677
  the newly created property xml node
@@ -2688,7 +2699,7 @@ class PropertyCollection():
2688
2699
  direction = None if facet_type is None or facet_type != 'direction' else facet
2689
2700
 
2690
2701
  if self.support is not None:
2691
- pcxml._check_shape_list(self, indexable_element, direction, property_array, points, count)
2702
+ pcxml._check_shape_list(self, indexable_element, direction, property_array, points, count, pre_packed)
2692
2703
 
2693
2704
  # todo: assertions:
2694
2705
  # numpy data type matches discrete flag (and assumptions about precision)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: resqpy
3
- Version: 4.18.0
3
+ Version: 4.18.2
4
4
  Summary: Python API for working with RESQML models
5
5
  Home-page: https://github.com/bp/resqpy
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
- resqpy/__init__.py,sha256=S2prKms_0RorT6KXe8u1LxIRwdkwMJyiHcJIlp0qpFw,556
1
+ resqpy/__init__.py,sha256=x8ZNx5VINljpsdVs90zE08SbRx4LaxTtLTEVOc697cM,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
@@ -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=IlPwm6G7P_Vg_w7JHqSs-d_oxk2QmFtWGTk_vvr1qm8,2911
50
50
  resqpy/grid_surface/_blocked_well_populate.py,sha256=Lme1AR-nLWOUlNnmHMVThk6jEg_lAZxWWtL82Yksppw,35867
51
- resqpy/grid_surface/_find_faces.py,sha256=kJl9DEN2AdhKZH7xzmS6Pvp8wSy6antAwgl9I5CE-2w,104982
51
+ resqpy/grid_surface/_find_faces.py,sha256=iqXVt0VsiRjJ4rddrbNiBT2YzfWwhfRmOolhyFfWN0Y,105197
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=ZIYH34BfdFY7wkcxX3VycJtaFGL4NRpa8tQY391SzQs,23409
72
+ resqpy/multi_processing/wrappers/grid_surface_mp.py,sha256=rnq5i34MRnwFFTzjcs_TzL4Y_dVn68Eg6Jh9nvSNx8Y,25245
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
@@ -102,7 +102,7 @@ resqpy/olio/vector_utilities.py,sha256=B354cr9-nqqPcb3SAx1jD9Uk51sjkV95xToAiF3-W
102
102
  resqpy/olio/volume.py,sha256=F1pMnDoJ4ricy4dfdLuLuK1xkVgJckL9V06tUeyK6Wc,6185
103
103
  resqpy/olio/wellspec_keywords.py,sha256=ad3B727golWYiko54OZOw7vG21IvpNxCMCyLv8jSkcI,26533
104
104
  resqpy/olio/write_data.py,sha256=bIX7ilMkXWCMz_zQh-Gqk56sNzng4W5l4BahW2EV7Kw,5142
105
- resqpy/olio/write_hdf5.py,sha256=KXB2L6Qz3TFb9yDjT-Ty0CXgjyq0nhVp3GADlekWhMQ,19055
105
+ resqpy/olio/write_hdf5.py,sha256=iUIYPWlbJsSSq9UXXiXAW_S6TeK-N2M7QvlJJE43EK8,19015
106
106
  resqpy/olio/xml_et.py,sha256=aPjxr2XWvYcwlnckL_UiZmd5EGEoIfy_JxeOKOk3vwQ,25322
107
107
  resqpy/olio/xml_namespaces.py,sha256=PiQi2W7gRLxhMSEs26ahT4MlagYqsjMWJlNpIiZupoA,1824
108
108
  resqpy/olio/zmap_reader.py,sha256=YuhZjde_DZszVFsUKfu0XieKGg7ONXtJWskRV9Pw7VE,5709
@@ -128,14 +128,14 @@ resqpy/organize/tectonic_boundary_feature.py,sha256=mMSsIW8YJ6qpeOe-6gRFaQbK39-W
128
128
  resqpy/organize/wellbore_feature.py,sha256=E2gFwgPZGr8nkhRHAIR0wTZ8uwcze7y2WBIV7AXeW2A,1843
129
129
  resqpy/organize/wellbore_interpretation.py,sha256=jRAHq90tR2dCQSXsZicujXhSVHOEPoGjFgh5S87SMAI,6973
130
130
  resqpy/property/__init__.py,sha256=KegXDizklsMB-EnGFrzhCSszrXAHXEIoStdC5XmyifQ,2294
131
- resqpy/property/_collection_add_part.py,sha256=7GRtiYVP5nmIj48Xynbu19evhQslnbbfiM8Wfnz3vcU,17101
132
- resqpy/property/_collection_create_xml.py,sha256=E48fu8h64T_bz5k3OEqIzPvZAOYRTBgvQ75wreqMwZc,12915
131
+ resqpy/property/_collection_add_part.py,sha256=uM64TWqJ0aBUwP1u1OJNTUhKLGlmOQj14fGPLG-2pRs,17156
132
+ resqpy/property/_collection_create_xml.py,sha256=p9GASodhg4vQqDDvCOHScto_Qtz_nDADGtvZY92Dcu8,13001
133
133
  resqpy/property/_collection_get_attributes.py,sha256=MlontPfGo00lxt0SpB49YG9PRsi5oXPqduDgCSOSmzs,32441
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
137
  resqpy/property/grid_property_collection.py,sha256=37dVQSBSTpX22UfBcpPvwGjd8H3O2MepKpWXYc4yJvM,66858
138
- resqpy/property/property_collection.py,sha256=Ax1wzqE9xfsMaIIKVlVTxNaDRZ4RpEK9ZcBEf_JDtWU,152167
138
+ resqpy/property/property_collection.py,sha256=RqFzbN60P_Q973R9UsxXo2gBnwv-9NSuNPpo38fQgxY,152986
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
@@ -194,7 +194,7 @@ resqpy/well/_wellbore_marker_frame.py,sha256=xvYH2_2Ie3a18LReFymbUrZboOx7Rhv5DOD
194
194
  resqpy/well/blocked_well_frame.py,sha256=Rx8jwkCjchseDZaTttPkA1-f6l7W6vRGrxWtDHlEPx8,22560
195
195
  resqpy/well/well_object_funcs.py,sha256=tWufc8wahihzMEO-Ou1dncIttrf4bNo1qmLgh3I2pOM,24717
196
196
  resqpy/well/well_utils.py,sha256=zwpYjT85nXAwWBhYB1Pygu2SgouZ-44k6hEOnpoMfBI,5969
197
- resqpy-4.18.0.dist-info/LICENSE,sha256=2duHPIkKQyESMdQ4hKjL8CYEsYRHXaYxt0YQkzsUYE4,1059
198
- resqpy-4.18.0.dist-info/METADATA,sha256=odcTjgSWg-tflxhp7J5ixu9jQarKY5aStpB0ZRP_bNw,4028
199
- resqpy-4.18.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
200
- resqpy-4.18.0.dist-info/RECORD,,
197
+ resqpy-4.18.2.dist-info/LICENSE,sha256=2duHPIkKQyESMdQ4hKjL8CYEsYRHXaYxt0YQkzsUYE4,1059
198
+ resqpy-4.18.2.dist-info/METADATA,sha256=0pU9qfLEhFddkYoUstNROtZbXcxt2m4kg0l19rt7deI,4028
199
+ resqpy-4.18.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
200
+ resqpy-4.18.2.dist-info/RECORD,,