resqpy 4.14.4__tar.gz → 4.15.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.
- {resqpy-4.14.4 → resqpy-4.15.1}/PKG-INFO +1 -1
- {resqpy-4.14.4 → resqpy-4.15.1}/pyproject.toml +1 -1
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/__init__.py +1 -1
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/__init__.py +4 -3
- resqpy-4.15.1/resqpy/property/attribute_property_set.py +273 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/LICENSE +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/README.md +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/crs.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_edges_per_column_property_array.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_faults.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_one_blocked_well_property.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_one_grid_property_array.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_single_cell_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_wells_from_ascii_file.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_zone_by_layer_property.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_coarsened_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_common.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_copy_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_drape_to_surface.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_extract_box.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_extract_box_for_well.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_fault_throw_scaling.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_gather_ensemble.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_interpolated_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_local_depth_adjustment.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_refined_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_tilted_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_unsplit_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_zonal_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_zone_layer_ranges_from_array.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/fault/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/fault/_gcs_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/fault/_grid_connection_set.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_cell_properties.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_connection_sets.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_create_grid_xml.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_defined_geometry.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_extract_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_face_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_faults.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_grid_types.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_intervals_info.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_moved_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_pillars.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_pixel_maps.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_points_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_regular_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_transmissibility.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_write_hdf5_from_caches.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_write_nexus_corp.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid/_xyz.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/_blocked_well_populate.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/_find_faces.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/_grid_skin.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/_grid_surface.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/_trajectory_intersects.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/grid_surface/grid_surface_cuda.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/lines/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/lines/_common.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/lines/_polyline.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/lines/_polyline_set.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_catalogue.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_context.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_forestry.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_grids.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_hdf5.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_model.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/model/_xml.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/_multiprocessing.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/wrappers/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/wrappers/blocked_well_mp.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/wrappers/grid_surface_mp.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/multi_processing/wrappers/mesh_mp.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/ab_toolbox.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/base.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/box_utilities.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/class_dict.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/consolidation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/data/build.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/data/properties.json +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/dataframe.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/exceptions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/factors.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/fine_coarse.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/grid_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/intersection.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/keyword_files.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/load_data.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/point_inclusion.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/random_seed.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/read_nexus_fault.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/relperm.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/simple_lines.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/time.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/trademark.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/transmission.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/triangulation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/uuid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/vdb.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/vector_utilities.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/volume.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/wellspec_keywords.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/write_data.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/write_hdf5.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/xml_et.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/xml_namespaces.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/olio/zmap_reader.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/_utils.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/boundary_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/boundary_feature_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/earth_model_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/fault_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/fluid_boundary_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/frontier_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/generic_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/genetic_boundary_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/geobody_boundary_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/geobody_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/geobody_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/geologic_unit_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/horizon_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/organization_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/rock_fluid_unit_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/structural_organization_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/tectonic_boundary_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/wellbore_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/organize/wellbore_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/_collection_add_part.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/_collection_create_xml.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/_collection_get_attributes.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/_collection_support.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/_property.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/grid_property_collection.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/property_collection.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/property_common.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/property_kind.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/string_lookup.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/well_interval_property.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/well_interval_property_collection.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/well_log.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/property/well_log_collection.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_add_ab_properties.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_add_surfaces.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_grid_from_cp.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_import_nexus.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_import_vdb_all_grids.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/rq_import/_import_vdb_ensemble.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_binary_contact_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_geologic_unit_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_strata_common.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_stratigraphic_column.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_stratigraphic_column_rank.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_stratigraphic_unit_feature.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/strata/_stratigraphic_unit_interpretation.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_base_surface.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_combined_surface.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_mesh.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_pointset.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_surface.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_tri_mesh.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_tri_mesh_stencil.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/surface/_triangulated_patch.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_any_time_series.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_from_nexus_summary.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_functions.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_geologic_time_series.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_time_duration.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/time_series/_time_series.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/_hexa_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/_prism_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/_pyramid_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/_tetra_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/unstructured/_unstructured_grid.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/weights_and_measures/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/weights_and_measures/nexus_units.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/weights_and_measures/weights_and_measures.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/__init__.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_blocked_well.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_deviation_survey.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_md_datum.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_trajectory.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_wellbore_frame.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_wellbore_marker.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/_wellbore_marker_frame.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/blocked_well_frame.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/well_object_funcs.py +0 -0
- {resqpy-4.14.4 → resqpy-4.15.1}/resqpy/well/well_utils.py +0 -0
@@ -1,14 +1,14 @@
|
|
1
1
|
"""Collections of properties for grids, wellbore frames, grid connection sets etc."""
|
2
2
|
|
3
3
|
__all__ = [
|
4
|
-
'PropertyCollection', 'Property', '
|
5
|
-
'WellLogCollection', 'StringLookup', 'PropertyKind', 'GridPropertyCollection',
|
4
|
+
'PropertyCollection', 'Property', 'AttributePropertySet', 'ApsProperty', 'WellLog', 'WellIntervalProperty',
|
5
|
+
'WellIntervalPropertyCollection', 'WellLogCollection', 'StringLookup', 'PropertyKind', 'GridPropertyCollection',
|
6
6
|
'property_over_time_series_from_collection', 'property_collection_for_keyword', 'infer_property_kind',
|
7
7
|
'write_hdf5_and_create_xml_for_active_property', 'reformat_column_edges_to_resqml_format',
|
8
8
|
'reformat_column_edges_from_resqml_format', 'same_property_kind', 'selective_version_of_collection',
|
9
9
|
'supported_local_property_kind_list', 'supported_property_kind_list', 'supported_facet_type_list',
|
10
10
|
'expected_facet_type_dict', 'create_transmisibility_multiplier_property_kind',
|
11
|
-
'property_kind_and_facet_from_keyword', 'guess_uom', 'property_parts', 'property_part'
|
11
|
+
'property_kind_and_facet_from_keyword', 'guess_uom', 'property_parts', 'property_part', 'make_aps_key'
|
12
12
|
]
|
13
13
|
|
14
14
|
from .property_common import property_collection_for_keyword, \
|
@@ -30,6 +30,7 @@ from .property_common import property_collection_for_keyword, \
|
|
30
30
|
from .property_kind import PropertyKind, create_transmisibility_multiplier_property_kind
|
31
31
|
from .string_lookup import StringLookup
|
32
32
|
from .property_collection import PropertyCollection
|
33
|
+
from .attribute_property_set import AttributePropertySet, ApsProperty, make_aps_key
|
33
34
|
from .grid_property_collection import GridPropertyCollection
|
34
35
|
from ._property import Property
|
35
36
|
from .well_interval_property import WellIntervalProperty
|
@@ -0,0 +1,273 @@
|
|
1
|
+
"""Class handling set of RESQML properties using attribute syntax for properties and their metadata."""
|
2
|
+
|
3
|
+
# Nexus is a registered trademark of the Halliburton Company
|
4
|
+
|
5
|
+
import logging
|
6
|
+
|
7
|
+
log = logging.getLogger(__name__)
|
8
|
+
|
9
|
+
import numpy as np
|
10
|
+
import numpy.ma as ma
|
11
|
+
|
12
|
+
import resqpy.property as rqp
|
13
|
+
|
14
|
+
|
15
|
+
class ApsProperty:
|
16
|
+
"""Class holding a single property with attribute style read access to metadata items."""
|
17
|
+
|
18
|
+
# note: this class could be private to the AttributePropertySet class
|
19
|
+
|
20
|
+
def __init__(self, aps, part):
|
21
|
+
"""Initialise a single property from a property set with attribute style read access to metadata items."""
|
22
|
+
self.aps = aps
|
23
|
+
self._part = part
|
24
|
+
self.key = aps._key(part)
|
25
|
+
|
26
|
+
# NB. the following are read-only attributes
|
27
|
+
|
28
|
+
@property
|
29
|
+
def part(self):
|
30
|
+
"""The part (string) identifier for this property."""
|
31
|
+
return self._part
|
32
|
+
|
33
|
+
@part.setter
|
34
|
+
def part(self, value):
|
35
|
+
self._part = value
|
36
|
+
|
37
|
+
@property
|
38
|
+
def node(self):
|
39
|
+
"""The xml root node for this property."""
|
40
|
+
return self.aps.node_for_part(self.part)
|
41
|
+
|
42
|
+
@property
|
43
|
+
def uuid(self):
|
44
|
+
"""The uuid for this property."""
|
45
|
+
return self.aps.uuid_for_part(self.part)
|
46
|
+
|
47
|
+
@property
|
48
|
+
def array_ref(self):
|
49
|
+
"""The cached numpy array of values for this property."""
|
50
|
+
return self.aps.cached_part_array_ref(self.part)
|
51
|
+
|
52
|
+
@property
|
53
|
+
def values(self):
|
54
|
+
"""A copy of the numpy array of values for this property."""
|
55
|
+
return self.array_ref.copy()
|
56
|
+
|
57
|
+
@property
|
58
|
+
def property_kind(self):
|
59
|
+
"""The property kind of this property."""
|
60
|
+
return self.aps.property_kind_for_part(self.part)
|
61
|
+
|
62
|
+
@property
|
63
|
+
def facet_type(self):
|
64
|
+
"""The facet type for this property (may be None)."""
|
65
|
+
return self.aps.facet_type_for_part(self.part)
|
66
|
+
|
67
|
+
@property
|
68
|
+
def facet(self):
|
69
|
+
"""The facet value for this property (may be None)."""
|
70
|
+
return self.aps.facet_for_part(self.part)
|
71
|
+
|
72
|
+
@property
|
73
|
+
def indexable(self):
|
74
|
+
"""The indexable element for this property (synonymous with indexable_element)."""
|
75
|
+
return self.aps.indexable_for_part(self.part)
|
76
|
+
|
77
|
+
@property
|
78
|
+
def indexable_element(self):
|
79
|
+
"""The indexable element for this property (synonymous with indexable)."""
|
80
|
+
return self.indexable
|
81
|
+
|
82
|
+
@property
|
83
|
+
def is_continuous(self):
|
84
|
+
"""Boolean indicating whether this property is continuous."""
|
85
|
+
return self.aps.continuous_for_part(self.part)
|
86
|
+
|
87
|
+
@property
|
88
|
+
def is_categorical(self):
|
89
|
+
"""Boolean indicating whether this property is categorical."""
|
90
|
+
return self.aps.part_is_categorical(self.part)
|
91
|
+
|
92
|
+
@property
|
93
|
+
def is_discrete(self):
|
94
|
+
"""Boolean indicating whether this property is discrete (False for categorical properties)."""
|
95
|
+
return not (self.is_continuous or self.is_categorical)
|
96
|
+
|
97
|
+
@property
|
98
|
+
def is_points(self):
|
99
|
+
"""Boolean indicating whether this is a points property."""
|
100
|
+
return self.aps.points_for_part(self.part)
|
101
|
+
|
102
|
+
@property
|
103
|
+
def count(self):
|
104
|
+
"""The count (number of sub-elements per element, usually 1) for this property."""
|
105
|
+
return self.aps.count_for_part(self.part)
|
106
|
+
|
107
|
+
@property
|
108
|
+
def uom(self):
|
109
|
+
"""The unit of measure for this property (will be None for discrete or categorical properties)."""
|
110
|
+
return self.aps.uom_for_part(self.part)
|
111
|
+
|
112
|
+
@property
|
113
|
+
def null_value(self):
|
114
|
+
"""The null value for this property (will be None for continuous properties, for which NaN is always the null value)."""
|
115
|
+
return self.aps.null_value_for_part(self.part)
|
116
|
+
|
117
|
+
@property
|
118
|
+
def realization(self):
|
119
|
+
"""The realisation number for this property (may be None)."""
|
120
|
+
return self.aps.realization_for_part(self.part)
|
121
|
+
|
122
|
+
@property
|
123
|
+
def time_index(self):
|
124
|
+
"""The time index for this property (may be None)."""
|
125
|
+
return self.aps.time_index_for_part(self.part)
|
126
|
+
|
127
|
+
@property
|
128
|
+
def title(self):
|
129
|
+
"""The citation title for this property (synonymous with citation_title)."""
|
130
|
+
return self.aps.citation_title_for_part(self.part)
|
131
|
+
|
132
|
+
@property
|
133
|
+
def citation_title(self):
|
134
|
+
"""The citation title for this property (synonymous with title)."""
|
135
|
+
return self.title
|
136
|
+
|
137
|
+
@property
|
138
|
+
def min_value(self):
|
139
|
+
"""The minimum value for this property, as stored in xml metadata."""
|
140
|
+
return self.aps.minimum_value_for_part(self.part)
|
141
|
+
|
142
|
+
@property
|
143
|
+
def max_value(self):
|
144
|
+
"""The maximum value for this property, as stored in xml metadata."""
|
145
|
+
return self.aps.maximum_value_for_part(self.part)
|
146
|
+
|
147
|
+
@property
|
148
|
+
def constant_value(self):
|
149
|
+
"""The constant value for this property, as stored in xml metadata (usually None)."""
|
150
|
+
return self.aps.constant_value_for_part(self.part)
|
151
|
+
|
152
|
+
@property
|
153
|
+
def extra(self):
|
154
|
+
"""The extra metadata for this property (synonymous with extra_metadata)."""
|
155
|
+
return self.aps.extra_metadata_for_part(self.part)
|
156
|
+
|
157
|
+
@property
|
158
|
+
def extra_metadata(self):
|
159
|
+
"""The extra metadata for this property (synonymous with extra)."""
|
160
|
+
return self.extra
|
161
|
+
|
162
|
+
@property
|
163
|
+
def support_uuid(self):
|
164
|
+
"""The uuid of the supporting representation for this property."""
|
165
|
+
return self.aps.support_uuid_for_part(self.part)
|
166
|
+
|
167
|
+
@property
|
168
|
+
def string_lookup_uuid(self):
|
169
|
+
"""The uuid of the string lookup table for a categorical property (otherwise None)."""
|
170
|
+
return self.aps.string_lookup_uuid_for_part(self.part)
|
171
|
+
|
172
|
+
@property
|
173
|
+
def time_series_uuid(self):
|
174
|
+
"""The uuid of the time series for this property (may be None)."""
|
175
|
+
return self.aps.time_series_uuid_for_part(self.part)
|
176
|
+
|
177
|
+
@property
|
178
|
+
def local_property_kind_uuid(self):
|
179
|
+
"""The uuid of the local property kind for this property (may be None)."""
|
180
|
+
return self.aps.local_property_kind_uuid(self.part)
|
181
|
+
|
182
|
+
|
183
|
+
class AttributePropertySet(rqp.PropertyCollection):
|
184
|
+
"""Class for set of RESQML properties for any supporting representation, using attribute syntax."""
|
185
|
+
|
186
|
+
def __init__(self, model = None, support = None, property_set_uuid = None, realization = None, key_mode = 'pk'):
|
187
|
+
"""Initialise an empty property set, optionally populate properties from a supporting representation.
|
188
|
+
|
189
|
+
arguments:
|
190
|
+
model (Model, optional): required if property_set_uuid is not None
|
191
|
+
support (optional): a grid.Grid object, or a well.BlockedWell, or a well.WellboreFrame object which belongs to a
|
192
|
+
resqpy.Model which includes associated properties; if this argument is given, and property_set_root is None,
|
193
|
+
the properties in the support's parent model which are for this representation (ie. have this object as the
|
194
|
+
supporting representation) are added to this collection as part of the initialisation
|
195
|
+
property_set_uuid (optional): if present, the collection is populated with the properties defined in the xml tree
|
196
|
+
of the property set
|
197
|
+
realization (integer, optional): if present, the single realisation (within an ensemble) that this collection is for;
|
198
|
+
if None, then the collection is either covering a whole ensemble (individual properties can each be flagged with a
|
199
|
+
realisation number), or is for properties that do not have multiple realizations
|
200
|
+
key_mode (str, default 'pk'): either 'pk' (for property kind) or 'title', identifying the basis of property attribute keys
|
201
|
+
|
202
|
+
note:
|
203
|
+
at present, if the collection is being initialised from a property set, the support argument must also be specified;
|
204
|
+
also for now, if not initialising from a property set, all properties related to the support are included, whether
|
205
|
+
the relationship is supporting representation or some other relationship;
|
206
|
+
|
207
|
+
:meta common:
|
208
|
+
"""
|
209
|
+
|
210
|
+
assert key_mode in ['pk', 'title']
|
211
|
+
assert property_set_uuid is None or model is not None
|
212
|
+
assert support is None or model is None or support.model is model
|
213
|
+
if property_set_uuid is None:
|
214
|
+
property_set_root = None
|
215
|
+
else:
|
216
|
+
property_set_root = model.root_for_uuid(property_set_uuid)
|
217
|
+
|
218
|
+
super().__init__(support = support, property_set_root = property_set_root, realization = realization)
|
219
|
+
self.key_mode = key_mode
|
220
|
+
self._make_attributes()
|
221
|
+
|
222
|
+
def keys(self):
|
223
|
+
"""Iterator over property keys within the set."""
|
224
|
+
for p in self.parts():
|
225
|
+
yield self._key(p)
|
226
|
+
|
227
|
+
def properties(self):
|
228
|
+
"""Iterator over ApsProperty members of the set."""
|
229
|
+
for k in self.keys():
|
230
|
+
yield getattr(self, k)
|
231
|
+
|
232
|
+
def items(self):
|
233
|
+
"""Iterator over (key, ApsProperty) members of the set."""
|
234
|
+
for k in self.keys():
|
235
|
+
yield (k, getattr(self, k))
|
236
|
+
|
237
|
+
def _key(self, part):
|
238
|
+
"""Returns the key (attribute name) for a given part."""
|
239
|
+
return make_aps_key(self.key_mode,
|
240
|
+
property_kind = self.property_kind_for_part(part),
|
241
|
+
title = self.citation_title_for_part(part),
|
242
|
+
facet = self.facet_for_part(part),
|
243
|
+
time_index = self.time_index_for_part(part),
|
244
|
+
realization = self.realization_for_part(part))
|
245
|
+
|
246
|
+
def _make_attributes(self):
|
247
|
+
"""Setup individual properties with attribute style read access to metadata."""
|
248
|
+
for part in self.parts():
|
249
|
+
key = self._key(part)
|
250
|
+
aps_property = ApsProperty(self, part)
|
251
|
+
setattr(self, key, aps_property)
|
252
|
+
|
253
|
+
def __len__(self):
|
254
|
+
"""Returns the number of properties in the set."""
|
255
|
+
return self.number_of_parts()
|
256
|
+
|
257
|
+
|
258
|
+
def make_aps_key(key_mode, property_kind = None, title = None, facet = None, time_index = None, realization = None):
|
259
|
+
"""Contructs the key (attribute name) for a property based on metadata items."""
|
260
|
+
if key_mode == 'pk':
|
261
|
+
assert property_kind is not None
|
262
|
+
key = property_kind
|
263
|
+
if facet is not None:
|
264
|
+
key += f'_{facet}'
|
265
|
+
else:
|
266
|
+
assert title is not None
|
267
|
+
key = title
|
268
|
+
key = key.replace(' ', '_')
|
269
|
+
if time_index is not None:
|
270
|
+
key += f'_t{time_index}'
|
271
|
+
if realization is not None:
|
272
|
+
key += f'_r{realization}'
|
273
|
+
return key
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{resqpy-4.14.4 → resqpy-4.15.1}/resqpy/derived_model/_add_edges_per_column_property_array.py
RENAMED
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|