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
         
     |