resqpy 4.12.0__tar.gz → 4.12.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. {resqpy-4.12.0 → resqpy-4.12.2}/PKG-INFO +1 -1
  2. {resqpy-4.12.0 → resqpy-4.12.2}/pyproject.toml +1 -1
  3. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/__init__.py +1 -1
  4. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/lines/_polyline.py +13 -17
  5. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/lines/_polyline_set.py +9 -3
  6. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_blocked_well.py +20 -3
  7. {resqpy-4.12.0 → resqpy-4.12.2}/LICENSE +0 -0
  8. {resqpy-4.12.0 → resqpy-4.12.2}/README.md +0 -0
  9. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/crs.py +0 -0
  10. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/__init__.py +0 -0
  11. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_edges_per_column_property_array.py +0 -0
  12. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_faults.py +0 -0
  13. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_one_blocked_well_property.py +0 -0
  14. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_one_grid_property_array.py +0 -0
  15. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_single_cell_grid.py +0 -0
  16. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_wells_from_ascii_file.py +0 -0
  17. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_add_zone_by_layer_property.py +0 -0
  18. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_coarsened_grid.py +0 -0
  19. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_common.py +0 -0
  20. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_copy_grid.py +0 -0
  21. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_drape_to_surface.py +0 -0
  22. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_extract_box.py +0 -0
  23. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_extract_box_for_well.py +0 -0
  24. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_fault_throw_scaling.py +0 -0
  25. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_gather_ensemble.py +0 -0
  26. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_interpolated_grid.py +0 -0
  27. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_local_depth_adjustment.py +0 -0
  28. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_refined_grid.py +0 -0
  29. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_tilted_grid.py +0 -0
  30. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_unsplit_grid.py +0 -0
  31. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_zonal_grid.py +0 -0
  32. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/derived_model/_zone_layer_ranges_from_array.py +0 -0
  33. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/fault/__init__.py +0 -0
  34. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/fault/_gcs_functions.py +0 -0
  35. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/fault/_grid_connection_set.py +0 -0
  36. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/__init__.py +0 -0
  37. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_cell_properties.py +0 -0
  38. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_connection_sets.py +0 -0
  39. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_create_grid_xml.py +0 -0
  40. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_defined_geometry.py +0 -0
  41. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_extract_functions.py +0 -0
  42. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_face_functions.py +0 -0
  43. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_faults.py +0 -0
  44. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_grid.py +0 -0
  45. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_grid_types.py +0 -0
  46. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_intervals_info.py +0 -0
  47. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_moved_functions.py +0 -0
  48. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_pillars.py +0 -0
  49. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_pixel_maps.py +0 -0
  50. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_points_functions.py +0 -0
  51. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_regular_grid.py +0 -0
  52. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_transmissibility.py +0 -0
  53. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_write_hdf5_from_caches.py +0 -0
  54. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_write_nexus_corp.py +0 -0
  55. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid/_xyz.py +0 -0
  56. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/__init__.py +0 -0
  57. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/_blocked_well_populate.py +0 -0
  58. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/_find_faces.py +0 -0
  59. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/_grid_skin.py +0 -0
  60. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/_grid_surface.py +0 -0
  61. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/_trajectory_intersects.py +0 -0
  62. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/grid_surface/grid_surface_cuda.py +0 -0
  63. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/lines/__init__.py +0 -0
  64. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/lines/_common.py +0 -0
  65. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/__init__.py +0 -0
  66. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_catalogue.py +0 -0
  67. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_context.py +0 -0
  68. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_forestry.py +0 -0
  69. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_grids.py +0 -0
  70. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_hdf5.py +0 -0
  71. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_model.py +0 -0
  72. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/model/_xml.py +0 -0
  73. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/__init__.py +0 -0
  74. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/_multiprocessing.py +0 -0
  75. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/wrappers/__init__.py +0 -0
  76. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/wrappers/blocked_well_mp.py +0 -0
  77. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/wrappers/grid_surface_mp.py +0 -0
  78. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/multi_processing/wrappers/mesh_mp.py +0 -0
  79. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/__init__.py +0 -0
  80. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/ab_toolbox.py +0 -0
  81. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/base.py +0 -0
  82. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/box_utilities.py +0 -0
  83. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/class_dict.py +0 -0
  84. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/consolidation.py +0 -0
  85. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/data/build.py +0 -0
  86. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/data/properties.json +0 -0
  87. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/dataframe.py +0 -0
  88. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/exceptions.py +0 -0
  89. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/factors.py +0 -0
  90. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/fine_coarse.py +0 -0
  91. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/grid_functions.py +0 -0
  92. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/intersection.py +0 -0
  93. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/keyword_files.py +0 -0
  94. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/load_data.py +0 -0
  95. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/point_inclusion.py +0 -0
  96. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/random_seed.py +0 -0
  97. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/read_nexus_fault.py +0 -0
  98. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/relperm.py +0 -0
  99. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/simple_lines.py +0 -0
  100. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/time.py +0 -0
  101. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/trademark.py +0 -0
  102. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/transmission.py +0 -0
  103. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/triangulation.py +0 -0
  104. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/uuid.py +0 -0
  105. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/vdb.py +0 -0
  106. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/vector_utilities.py +0 -0
  107. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/volume.py +0 -0
  108. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/wellspec_keywords.py +0 -0
  109. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/write_data.py +0 -0
  110. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/write_hdf5.py +0 -0
  111. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/xml_et.py +0 -0
  112. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/xml_namespaces.py +0 -0
  113. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/olio/zmap_reader.py +0 -0
  114. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/__init__.py +0 -0
  115. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/_utils.py +0 -0
  116. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/boundary_feature.py +0 -0
  117. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/boundary_feature_interpretation.py +0 -0
  118. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/earth_model_interpretation.py +0 -0
  119. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/fault_interpretation.py +0 -0
  120. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/fluid_boundary_feature.py +0 -0
  121. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/frontier_feature.py +0 -0
  122. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/generic_interpretation.py +0 -0
  123. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/genetic_boundary_feature.py +0 -0
  124. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/geobody_boundary_interpretation.py +0 -0
  125. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/geobody_feature.py +0 -0
  126. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/geobody_interpretation.py +0 -0
  127. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/geologic_unit_feature.py +0 -0
  128. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/horizon_interpretation.py +0 -0
  129. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/organization_feature.py +0 -0
  130. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/rock_fluid_unit_feature.py +0 -0
  131. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/structural_organization_interpretation.py +0 -0
  132. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/tectonic_boundary_feature.py +0 -0
  133. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/wellbore_feature.py +0 -0
  134. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/organize/wellbore_interpretation.py +0 -0
  135. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/__init__.py +0 -0
  136. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/_collection_add_part.py +0 -0
  137. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/_collection_create_xml.py +0 -0
  138. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/_collection_get_attributes.py +0 -0
  139. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/_collection_support.py +0 -0
  140. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/_property.py +0 -0
  141. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/grid_property_collection.py +0 -0
  142. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/property_collection.py +0 -0
  143. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/property_common.py +0 -0
  144. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/property_kind.py +0 -0
  145. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/string_lookup.py +0 -0
  146. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/well_interval_property.py +0 -0
  147. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/well_interval_property_collection.py +0 -0
  148. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/well_log.py +0 -0
  149. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/property/well_log_collection.py +0 -0
  150. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/__init__.py +0 -0
  151. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_add_ab_properties.py +0 -0
  152. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_add_surfaces.py +0 -0
  153. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_grid_from_cp.py +0 -0
  154. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_import_nexus.py +0 -0
  155. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_import_vdb_all_grids.py +0 -0
  156. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/rq_import/_import_vdb_ensemble.py +0 -0
  157. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/__init__.py +0 -0
  158. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_binary_contact_interpretation.py +0 -0
  159. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_geologic_unit_interpretation.py +0 -0
  160. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_strata_common.py +0 -0
  161. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_stratigraphic_column.py +0 -0
  162. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_stratigraphic_column_rank.py +0 -0
  163. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_stratigraphic_unit_feature.py +0 -0
  164. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/strata/_stratigraphic_unit_interpretation.py +0 -0
  165. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/__init__.py +0 -0
  166. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_base_surface.py +0 -0
  167. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_combined_surface.py +0 -0
  168. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_mesh.py +0 -0
  169. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_pointset.py +0 -0
  170. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_surface.py +0 -0
  171. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_tri_mesh.py +0 -0
  172. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/surface/_triangulated_patch.py +0 -0
  173. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/__init__.py +0 -0
  174. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_any_time_series.py +0 -0
  175. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_from_nexus_summary.py +0 -0
  176. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_functions.py +0 -0
  177. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_geologic_time_series.py +0 -0
  178. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_time_duration.py +0 -0
  179. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/time_series/_time_series.py +0 -0
  180. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/__init__.py +0 -0
  181. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/_hexa_grid.py +0 -0
  182. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/_prism_grid.py +0 -0
  183. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/_pyramid_grid.py +0 -0
  184. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/_tetra_grid.py +0 -0
  185. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/unstructured/_unstructured_grid.py +0 -0
  186. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/weights_and_measures/__init__.py +0 -0
  187. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/weights_and_measures/nexus_units.py +0 -0
  188. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/weights_and_measures/weights_and_measures.py +0 -0
  189. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/__init__.py +0 -0
  190. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_deviation_survey.py +0 -0
  191. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_md_datum.py +0 -0
  192. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_trajectory.py +0 -0
  193. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_wellbore_frame.py +0 -0
  194. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_wellbore_marker.py +0 -0
  195. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/_wellbore_marker_frame.py +0 -0
  196. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/blocked_well_frame.py +0 -0
  197. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/well_object_funcs.py +0 -0
  198. {resqpy-4.12.0 → resqpy-4.12.2}/resqpy/well/well_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: resqpy
3
- Version: 4.12.0
3
+ Version: 4.12.2
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.12.0" # Set at build time
12
+ version = "4.12.2" # 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.12.0" # Set at build time
31
+ __version__ = "4.12.2" # Set at build time
32
32
  log = logging.getLogger(__name__)
33
33
  log.info(f"Imported resqpy version {__version__}")
@@ -8,15 +8,15 @@ import math as maths
8
8
  import numpy as np
9
9
  import warnings
10
10
 
11
- import resqpy.olio.intersection as meet
12
- import resqpy.lines
11
+ import resqpy.crs as rqc
12
+ import resqpy.lines._common as rql_c
13
13
  import resqpy.property as rqp
14
14
  import resqpy.olio.point_inclusion as pip
15
15
  import resqpy.olio.uuid as bu
16
16
  import resqpy.olio.vector_utilities as vu
17
17
  import resqpy.olio.write_hdf5 as rwh5
18
18
  import resqpy.olio.xml_et as rqet
19
- import resqpy.lines._common as rql_c
19
+ import resqpy.olio.intersection as meet
20
20
  from resqpy.olio.xml_namespaces import curly_namespace as ns
21
21
 
22
22
 
@@ -330,21 +330,17 @@ class Polyline(rql_c._BasePolyline):
330
330
  return result
331
331
 
332
332
  def is_clockwise(self, trust_metadata = True):
333
- """Returns True if first non-straight triplet of nodes is clockwise in the xy plane; False if anti-clockwise.
334
-
335
- note:
336
- this method currently assumes that the xy axes are left-handed
337
- """
333
+ """Returns True if closed polyline is clockwise when viewed from above; False if anti-clockwise."""
338
334
 
335
+ assert self.isclosed, 'Polyline.is_clockwise() called for open polyline (only applicable to closed polylines)'
339
336
  if trust_metadata and self.extra_metadata is not None and 'is_clockwise' in self.extra_metadata.keys():
340
337
  return str(self.extra_metadata['is_clockwise']).lower() == 'true'
341
- result = None
342
- for node in range(3, len(self.coordinates)):
343
- cw = vu.clockwise(self.coordinates[node - 2], self.coordinates[node - 1], self.coordinates[node])
344
- if cw == 0.0:
345
- continue # striaght line section
346
- result = (cw > 0.0)
347
- break
338
+ centre = np.mean(self.coordinates, axis = 0)
339
+ cw = vu.clockwise(centre, self.coordinates[0], self.coordinates[1])
340
+ result = (cw > 0.0)
341
+ crs = rqc.Crs(self.model, uuid = self.crs_uuid)
342
+ if crs.is_right_handed_xy():
343
+ result = not result
348
344
  if result is not None:
349
345
  self.append_extra_metadata({'is_clockwise': str(result).lower()})
350
346
  return result
@@ -716,8 +712,8 @@ class Polyline(rql_c._BasePolyline):
716
712
 
717
713
  assert mode in ['square', 'perimeter', 'circle']
718
714
  assert 0.0 <= norm_x <= 1.0 and 0.0 <= norm_y <= 1.0
719
- assert self.is_convex(
720
- ), 'attempt to find denormalised x,y within a polyline that is not a closed convex polygon'
715
+ assert self.is_convex(), \
716
+ 'attempt to find denormalised x,y within a polyline that is not a closed convex polygon'
721
717
  centre_xy = self.balanced_centre()[:2]
722
718
  x, y = None, None
723
719
  if mode == 'square':
@@ -466,23 +466,29 @@ class PolylineSet(rql_c._BasePolyline):
466
466
  closed_node = rqet.find_nested_tags(self.root, ['LinePatch', 'ClosedPolylines'])
467
467
  if closed_node is not None:
468
468
  closed_array[:] = self.get_bool_array(closed_node)
469
+ else:
470
+ closed_array = None
469
471
  if coordinates is None:
470
472
  coordinates = self.coordinates
471
473
  if crs_uuid is None:
472
474
  crs_uuid = self.crs_uuid
473
475
  if rep_int_root is None:
474
476
  rep_int_root = self.rep_int_root
477
+
475
478
  polys = []
476
479
  count = 0
477
480
  for i in range(len(count_perpol)):
478
481
  if i != len(count_perpol) - 1:
479
482
  subset = coordinates[count:int(count_perpol[i]) + count].copy()
480
483
  else:
481
- subset = coordinates[count:int(count_perpol[i]) + count + 1].copy()
482
- if vu.isclose(subset[0], subset[-1]):
483
- isclosed = True
484
+ subset = coordinates[count:int(count_perpol[i]) + count + 1].copy() # is this correct?
485
+ duplicated_end_points = np.all(np.isclose(subset[0], subset[-1])) and len(subset) > 2
486
+ if closed_array is None:
487
+ isclosed = duplicated_end_points
484
488
  else:
485
489
  isclosed = closed_array[i]
490
+ if isclosed and duplicated_end_points:
491
+ subset = subset[:-1]
486
492
  count += int(count_perpol[i])
487
493
  subtitle = f"{self.title} {i+1}"
488
494
  polys.append(
@@ -1,7 +1,7 @@
1
1
  """BlockedWell class."""
2
2
 
3
3
  # Nexus is a registered trademark of the Halliburton Company
4
- # RMS and ROXAR are registered trademarks of Roxar Software Solutions AS, an Emerson company
4
+ # RMS and ROXAR are registered trademarks of Roxar Software Solutions AS, an AspenTech company
5
5
 
6
6
  import logging
7
7
 
@@ -301,7 +301,20 @@ class BlockedWell(BaseResqpy):
301
301
  gi_node = rqet.find_tag(node, 'GridIndices')
302
302
  assert gi_node is not None, 'blocked well grid indices hdf5 reference not found in xml'
303
303
  rqwu.load_hdf5_array(self, gi_node, 'grid_indices', dtype = 'int')
304
- assert self.grid_indices is not None and self.grid_indices.ndim == 1 and self.grid_indices.size == self.node_count - 1
304
+ # assert self.grid_indices is not None and self.grid_indices.ndim == 1 and self.grid_indices.size == self.node_count - 1
305
+ # temporary code to handle blocked wells with incorrectly shaped grid indices wrt. nodes
306
+ assert self.grid_indices is not None and self.grid_indices.ndim == 1
307
+ if self.grid_indices.size != self.node_count - 1:
308
+ if self.grid_indices.size == self.cell_count and self.node_count == 2 * self.cell_count:
309
+ log.warning(f'handling node duplication or missing unblocked intervals in blocked well: {self.title}')
310
+
311
+ expanded_grid_indices = np.full(self.node_count - 1, -1, dtype = int)
312
+ expanded_grid_indices[::2] = self.grid_indices
313
+ self.grid_indices = expanded_grid_indices
314
+ else:
315
+ raise ValueError(
316
+ f'incorrect grid indices size with respect to node count in blocked well: {self.title}')
317
+ # end of temporary code
305
318
  unique_grid_indices = np.unique(self.grid_indices) # sorted list of unique values
306
319
  self.gridind_null = rqet.find_tag_int(gi_node, 'NullValue')
307
320
  if self.gridind_null is None:
@@ -1477,6 +1490,10 @@ class BlockedWell(BaseResqpy):
1477
1490
 
1478
1491
  grid_crs_list = self.__verify_number_of_grids_and_crs_units(column_list = column_list)
1479
1492
 
1493
+ if doing_kh or doing_xyz or doing_angles or doing_entry_exit:
1494
+ for grid in self.grid_list:
1495
+ grid.cache_all_geometry_arrays()
1496
+
1480
1497
  k_face_check = np.zeros((2, 2), dtype = int)
1481
1498
  k_face_check[1, 1] = 1 # now represents entry, exit of K-, K+
1482
1499
  k_face_check_end = k_face_check.copy()
@@ -3057,7 +3074,7 @@ class BlockedWell(BaseResqpy):
3057
3074
  if BlockedWell.__is_float_column(col_name):
3058
3075
  form = '{0:>' + str(width) + '.3f}'
3059
3076
  value = row[col_name]
3060
- if col_name == 'ANGLA' and (np.isnan(value) or value is None):
3077
+ if col_name == 'ANGLA' and (pd.isna(row[col_name]) or value is None or np.isnan(value)):
3061
3078
  value = 0.0
3062
3079
  fp.write(sep + form.format(float(value)))
3063
3080
  else:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes