resqpy 4.17.0__tar.gz → 4.17.1__tar.gz

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.
Files changed (200) hide show
  1. {resqpy-4.17.0 → resqpy-4.17.1}/PKG-INFO +1 -1
  2. {resqpy-4.17.0 → resqpy-4.17.1}/pyproject.toml +1 -1
  3. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/__init__.py +1 -1
  4. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/fault/_grid_connection_set.py +150 -16
  5. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/__init__.py +4 -0
  6. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/_find_faces.py +727 -209
  7. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/vector_utilities.py +175 -1
  8. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_surface.py +25 -14
  9. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_triangulated_patch.py +46 -38
  10. {resqpy-4.17.0 → resqpy-4.17.1}/LICENSE +0 -0
  11. {resqpy-4.17.0 → resqpy-4.17.1}/README.md +0 -0
  12. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/crs.py +0 -0
  13. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/__init__.py +0 -0
  14. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_edges_per_column_property_array.py +0 -0
  15. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_faults.py +0 -0
  16. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_one_blocked_well_property.py +0 -0
  17. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_one_grid_property_array.py +0 -0
  18. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_single_cell_grid.py +0 -0
  19. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_wells_from_ascii_file.py +0 -0
  20. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_add_zone_by_layer_property.py +0 -0
  21. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_coarsened_grid.py +0 -0
  22. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_common.py +0 -0
  23. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_copy_grid.py +0 -0
  24. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_drape_to_surface.py +0 -0
  25. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_extract_box.py +0 -0
  26. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_extract_box_for_well.py +0 -0
  27. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_fault_throw_scaling.py +0 -0
  28. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_gather_ensemble.py +0 -0
  29. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_interpolated_grid.py +0 -0
  30. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_local_depth_adjustment.py +0 -0
  31. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_refined_grid.py +0 -0
  32. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_tilted_grid.py +0 -0
  33. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_unsplit_grid.py +0 -0
  34. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_zonal_grid.py +0 -0
  35. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/derived_model/_zone_layer_ranges_from_array.py +0 -0
  36. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/fault/__init__.py +0 -0
  37. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/fault/_gcs_functions.py +0 -0
  38. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/__init__.py +0 -0
  39. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_cell_properties.py +0 -0
  40. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_connection_sets.py +0 -0
  41. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_create_grid_xml.py +0 -0
  42. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_defined_geometry.py +0 -0
  43. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_extract_functions.py +0 -0
  44. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_face_functions.py +0 -0
  45. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_faults.py +0 -0
  46. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_grid.py +0 -0
  47. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_grid_types.py +0 -0
  48. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_intervals_info.py +0 -0
  49. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_moved_functions.py +0 -0
  50. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_pillars.py +0 -0
  51. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_pixel_maps.py +0 -0
  52. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_points_functions.py +0 -0
  53. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_regular_grid.py +0 -0
  54. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_transmissibility.py +0 -0
  55. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_write_hdf5_from_caches.py +0 -0
  56. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_write_nexus_corp.py +0 -0
  57. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid/_xyz.py +0 -0
  58. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/_blocked_well_populate.py +0 -0
  59. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/_grid_skin.py +0 -0
  60. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/_grid_surface.py +0 -0
  61. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/_trajectory_intersects.py +0 -0
  62. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/grid_surface/grid_surface_cuda.py +0 -0
  63. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/lines/__init__.py +0 -0
  64. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/lines/_common.py +0 -0
  65. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/lines/_polyline.py +0 -0
  66. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/lines/_polyline_set.py +0 -0
  67. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/__init__.py +0 -0
  68. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_catalogue.py +0 -0
  69. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_context.py +0 -0
  70. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_forestry.py +0 -0
  71. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_grids.py +0 -0
  72. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_hdf5.py +0 -0
  73. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_model.py +0 -0
  74. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/model/_xml.py +0 -0
  75. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/__init__.py +0 -0
  76. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/_multiprocessing.py +0 -0
  77. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/wrappers/__init__.py +0 -0
  78. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/wrappers/blocked_well_mp.py +0 -0
  79. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/wrappers/grid_surface_mp.py +0 -0
  80. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/multi_processing/wrappers/mesh_mp.py +0 -0
  81. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/__init__.py +0 -0
  82. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/ab_toolbox.py +0 -0
  83. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/base.py +0 -0
  84. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/box_utilities.py +0 -0
  85. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/class_dict.py +0 -0
  86. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/consolidation.py +0 -0
  87. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/data/build.py +0 -0
  88. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/data/properties.json +0 -0
  89. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/dataframe.py +0 -0
  90. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/exceptions.py +0 -0
  91. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/factors.py +0 -0
  92. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/fine_coarse.py +0 -0
  93. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/grid_functions.py +0 -0
  94. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/intersection.py +0 -0
  95. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/keyword_files.py +0 -0
  96. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/load_data.py +0 -0
  97. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/point_inclusion.py +0 -0
  98. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/random_seed.py +0 -0
  99. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/read_nexus_fault.py +0 -0
  100. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/relperm.py +0 -0
  101. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/simple_lines.py +0 -0
  102. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/time.py +0 -0
  103. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/trademark.py +0 -0
  104. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/transmission.py +0 -0
  105. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/triangulation.py +0 -0
  106. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/uuid.py +0 -0
  107. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/vdb.py +0 -0
  108. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/volume.py +0 -0
  109. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/wellspec_keywords.py +0 -0
  110. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/write_data.py +0 -0
  111. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/write_hdf5.py +0 -0
  112. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/xml_et.py +0 -0
  113. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/xml_namespaces.py +0 -0
  114. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/olio/zmap_reader.py +0 -0
  115. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/__init__.py +0 -0
  116. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/_utils.py +0 -0
  117. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/boundary_feature.py +0 -0
  118. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/boundary_feature_interpretation.py +0 -0
  119. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/earth_model_interpretation.py +0 -0
  120. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/fault_interpretation.py +0 -0
  121. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/fluid_boundary_feature.py +0 -0
  122. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/frontier_feature.py +0 -0
  123. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/generic_interpretation.py +0 -0
  124. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/genetic_boundary_feature.py +0 -0
  125. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/geobody_boundary_interpretation.py +0 -0
  126. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/geobody_feature.py +0 -0
  127. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/geobody_interpretation.py +0 -0
  128. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/geologic_unit_feature.py +0 -0
  129. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/horizon_interpretation.py +0 -0
  130. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/organization_feature.py +0 -0
  131. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/rock_fluid_unit_feature.py +0 -0
  132. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/structural_organization_interpretation.py +0 -0
  133. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/tectonic_boundary_feature.py +0 -0
  134. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/wellbore_feature.py +0 -0
  135. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/organize/wellbore_interpretation.py +0 -0
  136. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/__init__.py +0 -0
  137. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/_collection_add_part.py +0 -0
  138. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/_collection_create_xml.py +0 -0
  139. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/_collection_get_attributes.py +0 -0
  140. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/_collection_support.py +0 -0
  141. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/_property.py +0 -0
  142. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/attribute_property_set.py +0 -0
  143. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/grid_property_collection.py +0 -0
  144. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/property_collection.py +0 -0
  145. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/property_common.py +0 -0
  146. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/property_kind.py +0 -0
  147. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/string_lookup.py +0 -0
  148. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/well_interval_property.py +0 -0
  149. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/well_interval_property_collection.py +0 -0
  150. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/well_log.py +0 -0
  151. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/property/well_log_collection.py +0 -0
  152. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/__init__.py +0 -0
  153. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_add_ab_properties.py +0 -0
  154. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_add_surfaces.py +0 -0
  155. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_grid_from_cp.py +0 -0
  156. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_import_nexus.py +0 -0
  157. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_import_vdb_all_grids.py +0 -0
  158. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/rq_import/_import_vdb_ensemble.py +0 -0
  159. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/__init__.py +0 -0
  160. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_binary_contact_interpretation.py +0 -0
  161. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_geologic_unit_interpretation.py +0 -0
  162. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_strata_common.py +0 -0
  163. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_stratigraphic_column.py +0 -0
  164. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_stratigraphic_column_rank.py +0 -0
  165. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_stratigraphic_unit_feature.py +0 -0
  166. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/strata/_stratigraphic_unit_interpretation.py +0 -0
  167. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/__init__.py +0 -0
  168. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_base_surface.py +0 -0
  169. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_combined_surface.py +0 -0
  170. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_mesh.py +0 -0
  171. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_pointset.py +0 -0
  172. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_tri_mesh.py +0 -0
  173. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/surface/_tri_mesh_stencil.py +0 -0
  174. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/__init__.py +0 -0
  175. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_any_time_series.py +0 -0
  176. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_from_nexus_summary.py +0 -0
  177. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_functions.py +0 -0
  178. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_geologic_time_series.py +0 -0
  179. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_time_duration.py +0 -0
  180. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/time_series/_time_series.py +0 -0
  181. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/__init__.py +0 -0
  182. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/_hexa_grid.py +0 -0
  183. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/_prism_grid.py +0 -0
  184. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/_pyramid_grid.py +0 -0
  185. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/_tetra_grid.py +0 -0
  186. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/unstructured/_unstructured_grid.py +0 -0
  187. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/weights_and_measures/__init__.py +0 -0
  188. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/weights_and_measures/nexus_units.py +0 -0
  189. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/weights_and_measures/weights_and_measures.py +0 -0
  190. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/__init__.py +0 -0
  191. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_blocked_well.py +0 -0
  192. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_deviation_survey.py +0 -0
  193. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_md_datum.py +0 -0
  194. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_trajectory.py +0 -0
  195. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_wellbore_frame.py +0 -0
  196. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_wellbore_marker.py +0 -0
  197. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/_wellbore_marker_frame.py +0 -0
  198. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/blocked_well_frame.py +0 -0
  199. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/well_object_funcs.py +0 -0
  200. {resqpy-4.17.0 → resqpy-4.17.1}/resqpy/well/well_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: resqpy
3
- Version: 4.17.0
3
+ Version: 4.17.1
4
4
  Summary: Python API for working with RESQML models
5
5
  Home-page: https://github.com/bp/resqpy
6
6
  License: MIT
@@ -9,7 +9,7 @@ build-backend = "poetry.masonry.api"
9
9
 
10
10
  [tool.poetry]
11
11
  name = "resqpy"
12
- version = "4.17.0" # Set at build time
12
+ version = "4.17.1" # Set at build time
13
13
  description = "Python API for working with RESQML models"
14
14
  authors = ["BP"]
15
15
  license = "MIT"
@@ -28,6 +28,6 @@
28
28
 
29
29
  import logging
30
30
 
31
- __version__ = "4.17.0" # Set at build time
31
+ __version__ = "4.17.1" # Set at build time
32
32
  log = logging.getLogger(__name__)
33
33
  log.info(f"Imported resqpy version {__version__}")
@@ -10,6 +10,7 @@ import math as maths
10
10
  import numpy as np
11
11
  import pandas as pd
12
12
 
13
+ import resqpy.grid as grr
13
14
  import resqpy.fault
14
15
  import resqpy.olio.read_nexus_fault as rnf
15
16
  import resqpy.olio.trademark as tm
@@ -199,6 +200,109 @@ class GridConnectionSet(BaseResqpy):
199
200
  self.extract_property_collection()
200
201
  self._set_cell_index_dtype()
201
202
 
203
+ @classmethod
204
+ def from_faces_indices(cls,
205
+ grid,
206
+ k_faces_kji0,
207
+ j_faces_kji0,
208
+ i_faces_kji0,
209
+ remove_duplicates = True,
210
+ k_properties = None,
211
+ j_properties = None,
212
+ i_properties = None,
213
+ feature_name = None,
214
+ feature_type = 'fault',
215
+ create_organizing_objects_where_needed = True,
216
+ title = None,
217
+ originator = None,
218
+ extra_metadata = None):
219
+ """Create a GridConnectionSet given a grid and 3 list-like arrays identifying faces by indices.
220
+
221
+ arguments:
222
+ - grid (Grid): the single grid to be referenced by the grid connection set
223
+ - k_faces_kji0 (numpy int array of shape (Nk, 3)): indices of cells on negative side of desired K faces
224
+ - j_faces_kji0 (numpy int array of shape (Nj, 3)): indices of cells on negative side of desired J faces
225
+ - i_faces_kji0 (numpy int array of shape (Ni, 3)): indices of cells on negative side of desired I faces
226
+ - remove_duplicates (bool, default True): if True, indices are sorted and duplicates removed
227
+ - k_properties (list of 1D numpy arrays, optional): if present and remove_duplicates is True, each array
228
+ is sorted and has elements removed to keep them compatible with the indices
229
+ - j_properties (list of 1D numpy arrays, optional): if present and remove_duplicates is True, each array
230
+ is sorted and has elements removed to keep them compatible with the indices
231
+ - i_properties (list of 1D numpy arrays, optional): if present and remove_duplicates is True, each array
232
+ is sorted and has elements removed to keep them compatible with the indices
233
+ - feature_name (string, optional): the feature name to use when setting from faces
234
+ - feature_type (string, default 'fault'): 'fault', 'horizon' or 'geobody boundary'
235
+ - create_organizing_objects_where_needed (boolean, default True): if True, a fault interpretation object
236
+ and tectonic boundary feature object will be created if such objects do not exist for the feature;
237
+ if False, missing organizational objects will cause an error to be logged
238
+ - title (str, optional): the citation title to use for a new grid connection set
239
+ - originator (str, optional): the name of the person creating the new grid connection set, defaults to login id
240
+ - extra_metadata (dict, optional): string key, value pairs to add as extra metadata for the grid connection set
241
+
242
+ returns:
243
+ - a new GridConnectionSet populated based on the faces indices
244
+
245
+ notes:
246
+ - this method only supports creation of single grid connection sets
247
+ - the faces indices are for cells on the negative side of the face
248
+ - the paired cell is implicitly the neighbouring cell in the positive direction of the axis
249
+ - the indices must therefore not include the last cell in the axis, though this is not checked
250
+ - if properties are passed, they should be passed in list variables which have their elements
251
+ replaced; individual property arrays should therefore be extracted from the lists afterwards
252
+ """
253
+ assert isinstance(grid, grr.Grid)
254
+
255
+ gcs = cls(grid.model, title = title, originator = originator, extra_metadata = extra_metadata)
256
+
257
+ gcs._sort_out_organizing_objects(feature_type, feature_name, create_organizing_objects_where_needed)
258
+
259
+ nj_ni = grid.nj * grid.ni
260
+ if k_faces_kji0 is not None and len(k_faces_kji0) > 0:
261
+ ci = grid.natural_cell_indices(k_faces_kji0)
262
+ if remove_duplicates:
263
+ ci = _sort_and_remove_duplicates(ci, k_properties)
264
+ cip = np.empty((ci.size, 2), dtype = gcs.cell_index_dtype)
265
+ cip[:, 0] = ci
266
+ cip[:, 1] = ci + nj_ni
267
+ fip = np.empty(cip.shape, dtype = np.int8)
268
+ fip[:, 0] = gcs.face_index_map[0, 1]
269
+ fip[:, 1] = gcs.face_index_map[0, 0]
270
+ else:
271
+ cip = np.empty((0, 2), dtype = gcs.cell_index_dtype)
272
+ fip = np.empty((0, 2), dtype = np.int8)
273
+ if j_faces_kji0 is not None and len(j_faces_kji0) > 0:
274
+ ci = grid.natural_cell_indices(j_faces_kji0)
275
+ if remove_duplicates:
276
+ ci = _sort_and_remove_duplicates(ci, j_properties)
277
+ j_cip = np.empty((ci.size, 2), dtype = gcs.cell_index_dtype)
278
+ j_cip[:, 0] = ci
279
+ j_cip[:, 1] = ci + grid.ni
280
+ j_fip = np.empty(j_cip.shape, dtype = np.int8)
281
+ j_fip[:, 0] = gcs.face_index_map[1, 1]
282
+ j_fip[:, 1] = gcs.face_index_map[1, 0]
283
+ cip = np.concatenate((cip, j_cip), axis = 0)
284
+ fip = np.concatenate((fip, j_fip), axis = 0)
285
+ del j_cip, j_fip
286
+ if i_faces_kji0 is not None and len(i_faces_kji0) > 0:
287
+ ci = grid.natural_cell_indices(i_faces_kji0)
288
+ if remove_duplicates:
289
+ ci = _sort_and_remove_duplicates(ci, i_properties)
290
+ i_cip = np.empty((ci.size, 2), dtype = gcs.cell_index_dtype)
291
+ i_cip[:, 0] = ci
292
+ i_cip[:, 1] = ci + 1
293
+ i_fip = np.empty(i_cip.shape, dtype = np.int8)
294
+ i_fip[:, 0] = gcs.face_index_map[2, 1]
295
+ i_fip[:, 1] = gcs.face_index_map[2, 0]
296
+ cip = np.concatenate((cip, i_cip), axis = 0)
297
+ fip = np.concatenate((fip, i_fip), axis = 0)
298
+ del i_cip, i_fip
299
+ gcs.cell_index_pairs = cip
300
+ gcs.face_index_pairs = fip
301
+ gcs.count = len(gcs.cell_index_pairs)
302
+ gcs.feature_indices = np.zeros(gcs.count, dtype = np.int8)
303
+ assert len(gcs.face_index_pairs) == gcs.count
304
+ return gcs
305
+
202
306
  @classmethod
203
307
  def from_gcs_uuid_list(cls,
204
308
  parent_model,
@@ -448,24 +552,13 @@ class GridConnectionSet(BaseResqpy):
448
552
  create_organizing_objects_where_needed,
449
553
  feature_type = feature_type)
450
554
 
451
- def set_pairs_from_face_masks(
452
- self,
453
- k_faces,
454
- j_faces,
455
- i_faces,
456
- feature_name,
457
- create_organizing_objects_where_needed,
458
- feature_type = 'fault', # other feature_type values: 'horizon', 'geobody boundary'
459
- k_sides = None,
460
- j_sides = None,
461
- i_sides = None):
462
- """Sets cell_index_pairs and face_index_pairs based on triple face masks, using simple no throw pairing."""
463
-
555
+ def _sort_out_organizing_objects(self, feature_type, feature_name, create_organizing_objects_where_needed):
556
+ """Finds or creates interpretation and feature objects."""
464
557
  assert feature_type in ['fault', 'horizon', 'geobody boundary']
465
558
  if feature_name is None:
466
- feature_name = 'feature from face masks' # not sure this default is wise
559
+ feature_name = 'feature from faces' # not sure this default is wise
467
560
  if len(self.grid_list) > 1:
468
- log.warning('setting grid connection set pairs from face masks for first grid in list only')
561
+ log.warning('setting grid connection set pairs from faces for first grid in list only')
469
562
  grid = self.grid_list[0]
470
563
  if feature_type == 'fault':
471
564
  feature_flavour = 'TectonicBoundaryFeature'
@@ -522,6 +615,23 @@ class GridConnectionSet(BaseResqpy):
522
615
  log.error('no interpretation found for feature: ' + feature_name)
523
616
  return
524
617
  self.feature_list = [('obj_' + interpretation_flavour, fi_uuid, str(feature_name))]
618
+
619
+ def set_pairs_from_face_masks(
620
+ self,
621
+ k_faces,
622
+ j_faces,
623
+ i_faces,
624
+ feature_name,
625
+ create_organizing_objects_where_needed,
626
+ feature_type = 'fault', # other feature_type values: 'horizon', 'geobody boundary'
627
+ k_sides = None,
628
+ j_sides = None,
629
+ i_sides = None):
630
+ """Sets cell_index_pairs and face_index_pairs based on triple face masks, using simple no throw pairing."""
631
+
632
+ self._sort_out_organizing_objects(feature_type, feature_name, create_organizing_objects_where_needed)
633
+
634
+ grid = self.grid_list[0]
525
635
  cell_pair_list = []
526
636
  face_pair_list = []
527
637
  nj_ni = grid.nj * grid.ni
@@ -561,7 +671,7 @@ class GridConnectionSet(BaseResqpy):
561
671
  self.cell_index_pairs = np.array(cell_pair_list, dtype = self.cell_index_dtype)
562
672
  self.face_index_pairs = np.array(face_pair_list, dtype = np.int8)
563
673
  self.count = len(self.cell_index_pairs)
564
- self.feature_indices = np.zeros(self.count, dtype = np.int32)
674
+ self.feature_indices = np.zeros(self.count, dtype = np.int8)
565
675
  assert len(self.face_index_pairs) == self.count
566
676
 
567
677
  def set_pairs_from_faces_df(self,
@@ -2190,3 +2300,27 @@ def _copy_organisation_objects(target_model, source_model, gcs):
2190
2300
  for _, uuid, _ in gcs.feature_list:
2191
2301
  target_model.copy_uuid_from_other_model(source_model,
2192
2302
  uuid) # will copy related features as well as interpretations
2303
+
2304
+
2305
+ def _sort_and_remove_duplicates(a, props = None):
2306
+ """Return copy of 1D array a, sorted and with duplicates removed; secondary arrays can be kept in alignment."""
2307
+ if a is None or a.size <= 1:
2308
+ return a
2309
+ assert a.ndim == 1
2310
+ si = None
2311
+ no_props = (props is None or len(props) == 0)
2312
+ if no_props:
2313
+ a = np.sort(a)
2314
+ else:
2315
+ si = np.argsort(a)
2316
+ a = a[si]
2317
+ m = np.empty(a.size, dtype = bool)
2318
+ m[0] = True
2319
+ m[1:] = (a[1:] != a[:-1])
2320
+ if np.all(m):
2321
+ return a
2322
+ if not no_props:
2323
+ for i in range(len(props)):
2324
+ p = props[i][si]
2325
+ props[i] = p[m]
2326
+ return a[m]
@@ -20,11 +20,13 @@ __all__ = [
20
20
  "find_faces_to_represent_surface_staffa",
21
21
  "find_faces_to_represent_surface_regular",
22
22
  "find_faces_to_represent_surface_regular_optimised",
23
+ "find_faces_to_represent_surface_regular_dense_optimised",
23
24
  "find_faces_to_represent_surface",
24
25
  "bisector_from_faces",
25
26
  "column_bisector_from_faces",
26
27
  "shadow_from_faces",
27
28
  "get_boundary",
29
+ "get_boundary_dict",
28
30
  "_where_true",
29
31
  "_first_true",
30
32
  "intersect_numba",
@@ -56,11 +58,13 @@ from ._find_faces import (
56
58
  find_faces_to_represent_surface_staffa,
57
59
  find_faces_to_represent_surface_regular,
58
60
  find_faces_to_represent_surface_regular_optimised,
61
+ find_faces_to_represent_surface_regular_dense_optimised,
59
62
  find_faces_to_represent_surface,
60
63
  bisector_from_faces,
61
64
  column_bisector_from_faces,
62
65
  shadow_from_faces,
63
66
  get_boundary,
67
+ get_boundary_dict,
64
68
  _where_true,
65
69
  _first_true,
66
70
  intersect_numba,