subsurface-terra 2025.1.0rc16__tar.gz → 2025.1.0rc17__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.
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/buildTypes/Subsurface_Testing.xml +1 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/PKG-INFO +1 -1
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/_version.py +3 -3
- subsurface_terra-2025.1.0rc17/subsurface/core/structs/base_structures/_aux.py +69 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/unstructured_data.py +19 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/read_grav3d.py +11 -42
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/PKG-INFO +1 -1
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/SOURCES.txt +1 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.env.example +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/buildTypes/Subsurface_ReleaseSubsurface.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/buildTypes/Subsurface_ReleaseSubsurface_2.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/project-config.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/vcsRoots/Subsurface_HttpsGithubComTerranigmaSolutionsSubsurfaceRefsHeadsMain.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/vcsRoots/Subsurface_HttpsGithubComTerranigmaSolutionsSubsurfaceRefsHeadsMain1.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/.teamcity/Subsurface/vcsRoots/Subsurface_HttpsGithubComTerranigmaSolutionsSubsurfaceRefsHeadsMain2.xml +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/LICENSE +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/README.rst +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_all.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_dev.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_geospatial.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_mesh.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_opt.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_plot.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_traces.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_volume.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_wells.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/setup.cfg +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/setup.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/interfaces/README.rst +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/interfaces/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/interfaces/stream.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/reader/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/reader/read_wells.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/_combine_trajectories.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/_map_attrs_to_survey.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/_survey_to_unstruct.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/boreholes.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/collars.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/boreholes/survey.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/geological_formats/fault.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/reader_helpers/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/reader_helpers/reader_unstruct.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/reader_helpers/readers_data.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/reader_helpers/readers_wells.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/README.rst +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/_liquid_earth_mesh.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/_unstructured_data_constructor.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/base_structures_enum.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/base_structures/structured_data.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/structured_elements/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/structured_elements/octree_mesh.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/structured_elements/structured_grid.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/structured_elements/structured_mesh.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/unstructured_elements/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/unstructured_elements/line_set.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/unstructured_elements/point_set.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/unstructured_elements/tetrahedron_mesh.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/unstructured_elements/triangular_surface.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/utils/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/utils/utils_core.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/README.rst +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/faults/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/faults/faults.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/from_binary.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/geo_object/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/NOTES.md +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/_GOCAD_mesh.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/_trimesh_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/csv_mesh_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/dxf_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/glb_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/mx_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/obj_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/omf_mesh_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/surface_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/mesh/surfaces_api.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/petrel/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/profiles/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/profiles/profiles_core.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/read_netcdf.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/topography/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/topography/topo_core.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/read_volume.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/segy_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/seismic.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/volume/volume_utils.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/DEP/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/DEP/_well_files_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/DEP/_wells_api.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/DEP/_welly_reader.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/DEP/pandas_to_welly.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/README.rst +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/_read_to_df.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/read_borehole_interface.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/wells/wells_utils.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/tools/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/tools/mocking_aux.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/visualization/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/visualization/to_pyvista.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_binary.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_liquid_earth/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/__init__.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/common.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/data_struct.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/doc/rex-spec-v1.md +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/doc/right-handed.png +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/doc/sketchup_example.jpg +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/gempy_to_rexfile.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/material_encoder.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/mesh_encoder.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/to_rex.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/writer/to_rex/utils.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/optional_requirements.py +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/dependency_links.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/not-zip-safe +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/requires.txt +0 -0
- {subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/top_level.txt +0 -0
|
@@ -150,6 +150,7 @@ python -m pytest --teamcity -v]]></param>
|
|
|
150
150
|
<param name="github_host" value="https://api.github.com" />
|
|
151
151
|
<param name="publisherId" value="githubStatusPublisher" />
|
|
152
152
|
<param name="secure:github_access_token" value="credentialsJSON:4df4bdb0-1278-4834-a702-18ae3a286003" />
|
|
153
|
+
<param name="vcsRootId" value="Subsurface_HttpsGithubComTerranigmaSolutionsSubsurfaceRefsHeadsMain2" />
|
|
153
154
|
</parameters>
|
|
154
155
|
</extension>
|
|
155
156
|
<extension id="BUILD_EXT_6" type="pullRequests">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: subsurface_terra
|
|
3
|
-
Version: 2025.1.
|
|
3
|
+
Version: 2025.1.0rc17
|
|
4
4
|
Summary: Subsurface data types and utilities. This version is the one used by Terranigma Solutions. Please feel free to take anything in this repository for the original one.
|
|
5
5
|
Home-page: https://softwareunderground.github.io/subsurface
|
|
6
6
|
Author: Software Underground
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '2025.1.
|
|
32
|
-
__version_tuple__ = version_tuple = (2025, 1, 0, '
|
|
31
|
+
__version__ = version = '2025.1.0rc17'
|
|
32
|
+
__version_tuple__ = version_tuple = (2025, 1, 0, 'rc17')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g55a3a27a3'
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def safe_convert_to_float32(df: pd.DataFrame, error_handling: str = 'raise') -> pd.DataFrame:
|
|
5
|
+
"""
|
|
6
|
+
Convert DataFrame columns to float32, handling non-convertible columns.
|
|
7
|
+
|
|
8
|
+
Args:
|
|
9
|
+
df: DataFrame to convert
|
|
10
|
+
error_handling: How to handle non-convertible columns:
|
|
11
|
+
- 'raise': Raise an error
|
|
12
|
+
- 'skip': Skip non-convertible columns
|
|
13
|
+
- 'drop': Drop non-convertible columns
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
DataFrame with converted columns
|
|
17
|
+
"""
|
|
18
|
+
convertible, non_convertible = _check_convertible_to_float32(df)
|
|
19
|
+
|
|
20
|
+
if non_convertible:
|
|
21
|
+
if error_handling == 'raise':
|
|
22
|
+
raise ValueError(
|
|
23
|
+
f"Cannot convert columns to float32: {non_convertible}. "
|
|
24
|
+
f"These columns contain non-numeric data."
|
|
25
|
+
)
|
|
26
|
+
elif error_handling == 'skip':
|
|
27
|
+
# Only convert the convertible columns
|
|
28
|
+
result = df.copy()
|
|
29
|
+
for col in convertible:
|
|
30
|
+
result[col] = df[col].astype('float32')
|
|
31
|
+
return result
|
|
32
|
+
elif error_handling == 'drop':
|
|
33
|
+
# Drop non-convertible columns
|
|
34
|
+
return df[convertible].astype('float32')
|
|
35
|
+
else:
|
|
36
|
+
raise ValueError(f"Invalid error_handling: {error_handling}")
|
|
37
|
+
|
|
38
|
+
return df.astype('float32')
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _check_convertible_to_float32(df: pd.DataFrame) -> tuple[list[str], list[str]]:
|
|
42
|
+
"""
|
|
43
|
+
Check which columns in a DataFrame can be safely converted to float32.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
tuple: (convertible_columns, non_convertible_columns)
|
|
47
|
+
"""
|
|
48
|
+
convertible = []
|
|
49
|
+
non_convertible = []
|
|
50
|
+
|
|
51
|
+
for col in df.columns:
|
|
52
|
+
if pd.api.types.is_numeric_dtype(df[col]):
|
|
53
|
+
# Already numeric, can convert
|
|
54
|
+
convertible.append(col)
|
|
55
|
+
elif pd.api.types.is_bool_dtype(df[col]):
|
|
56
|
+
# Boolean can be converted (True->1.0, False->0.0)
|
|
57
|
+
convertible.append(col)
|
|
58
|
+
elif pd.api.types.is_string_dtype(df[col]) or pd.api.types.is_object_dtype(df[col]):
|
|
59
|
+
# Try to convert to numeric
|
|
60
|
+
try:
|
|
61
|
+
pd.to_numeric(df[col], errors='raise')
|
|
62
|
+
convertible.append(col)
|
|
63
|
+
except (ValueError, TypeError):
|
|
64
|
+
non_convertible.append(col)
|
|
65
|
+
else:
|
|
66
|
+
# Other types (datetime, timedelta, categorical, etc.)
|
|
67
|
+
non_convertible.append(col)
|
|
68
|
+
|
|
69
|
+
return convertible, non_convertible
|
|
@@ -299,6 +299,25 @@ class UnstructuredData:
|
|
|
299
299
|
bytearray_le = vertex + cells + cell_attribute + vertex_attribute
|
|
300
300
|
return bytearray_le
|
|
301
301
|
|
|
302
|
+
def _to_bytearray(self, order):
|
|
303
|
+
from subsurface.core.structs.base_structures._aux import safe_convert_to_float32
|
|
304
|
+
vertex = self.vertex.astype('float32').tobytes(order)
|
|
305
|
+
cells = self.cells.astype('int32').tobytes(order)
|
|
306
|
+
|
|
307
|
+
# Only include numeric columns
|
|
308
|
+
cell_attribute = safe_convert_to_float32(
|
|
309
|
+
self.attributes,
|
|
310
|
+
error_handling='drop'
|
|
311
|
+
).values.tobytes(order)
|
|
312
|
+
|
|
313
|
+
vertex_attribute = safe_convert_to_float32(
|
|
314
|
+
self.points_attributes,
|
|
315
|
+
error_handling='drop'
|
|
316
|
+
).values.tobytes(order)
|
|
317
|
+
|
|
318
|
+
bytearray_le = vertex + cells + cell_attribute + vertex_attribute
|
|
319
|
+
return bytearray_le
|
|
320
|
+
|
|
302
321
|
def _validate(self):
|
|
303
322
|
try:
|
|
304
323
|
_ = self.data[self.cells_attr_name]['cell']
|
|
@@ -106,10 +106,9 @@ class GridData:
|
|
|
106
106
|
)
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
from typing import Literal
|
|
110
109
|
|
|
111
110
|
def read_msh_structured_grid(grid_stream: TextIO, values_stream: TextIO, missing_value: Optional[float],
|
|
112
|
-
attr_name: Optional[str]
|
|
111
|
+
attr_name: Optional[str]) -> StructuredData:
|
|
113
112
|
"""
|
|
114
113
|
Read a structured grid mesh and values from streams and return a StructuredData object.
|
|
115
114
|
|
|
@@ -121,12 +120,7 @@ def read_msh_structured_grid(grid_stream: TextIO, values_stream: TextIO, missing
|
|
|
121
120
|
values_stream: TextIO stream containing the property values (.mod format)
|
|
122
121
|
missing_value: Value to replace with NaN in the output array
|
|
123
122
|
attr_name: Name for the data attribute
|
|
124
|
-
|
|
125
|
-
- 'ijk': i (x) varies fastest, then j (y), then k (z)
|
|
126
|
-
- 'xyz': z varies fastest, then x, then y
|
|
127
|
-
- 'xyz_reverse': z varies fastest (reversed), then x, then y
|
|
128
|
-
Default is 'ijk'.
|
|
129
|
-
|
|
123
|
+
|
|
130
124
|
Returns:
|
|
131
125
|
StructuredData object containing the grid and property values
|
|
132
126
|
|
|
@@ -154,7 +148,7 @@ def read_msh_structured_grid(grid_stream: TextIO, values_stream: TextIO, missing
|
|
|
154
148
|
# Read all values from the stream
|
|
155
149
|
lines = [line.strip() for line in values_stream if line.strip()]
|
|
156
150
|
|
|
157
|
-
model_array = _parse_mod_file(grid, lines, missing_value=missing_value
|
|
151
|
+
model_array = _parse_mod_file(grid, lines, missing_value=missing_value)
|
|
158
152
|
|
|
159
153
|
except Exception as e:
|
|
160
154
|
# Add context to any errors
|
|
@@ -206,7 +200,7 @@ def read_msh_file(filepath: Union[str, Path]) -> GridData:
|
|
|
206
200
|
|
|
207
201
|
def read_mod_file(filepath: Union[str, Path], grid: GridData,
|
|
208
202
|
missing_value: float = -99_999.0,
|
|
209
|
-
|
|
203
|
+
) -> np.ndarray:
|
|
210
204
|
"""
|
|
211
205
|
Read a model file containing property values for a 3D grid.
|
|
212
206
|
|
|
@@ -217,11 +211,6 @@ def read_mod_file(filepath: Union[str, Path], grid: GridData,
|
|
|
217
211
|
filepath: Path to the model file
|
|
218
212
|
grid: GridData object containing the grid dimensions
|
|
219
213
|
missing_value: Value to replace with NaN in the output array (default: -99_999.0)
|
|
220
|
-
ordering: Data ordering in the file. Options:
|
|
221
|
-
- 'ijk': i (x) varies fastest, then j (y), then k (z) - standard VTK/Fortran ordering
|
|
222
|
-
- 'xyz': z varies fastest, then x, then y - legacy Grav3D ordering
|
|
223
|
-
- 'xyz_reverse': z varies fastest (reversed direction), then x, then y
|
|
224
|
-
Default is 'ijk'.
|
|
225
214
|
|
|
226
215
|
Returns:
|
|
227
216
|
3D numpy array of property values with shape (ny, nx, nz)
|
|
@@ -239,7 +228,7 @@ def read_mod_file(filepath: Union[str, Path], grid: GridData,
|
|
|
239
228
|
with open(filepath, 'r') as f:
|
|
240
229
|
lines = [line.strip() for line in f if line.strip()]
|
|
241
230
|
|
|
242
|
-
model_array = _parse_mod_file(grid, lines, missing_value
|
|
231
|
+
model_array = _parse_mod_file(grid, lines, missing_value)
|
|
243
232
|
|
|
244
233
|
return model_array
|
|
245
234
|
|
|
@@ -265,7 +254,7 @@ def structured_data_from(array: np.ndarray, grid: GridData,
|
|
|
265
254
|
ValueError: If array shape doesn't match grid dimensions
|
|
266
255
|
"""
|
|
267
256
|
# Verify array shape matches grid dimensions
|
|
268
|
-
expected_shape = (grid.dimensions.
|
|
257
|
+
expected_shape = (grid.dimensions.nx, grid.dimensions.ny, grid.dimensions.nz)
|
|
269
258
|
if array.shape != expected_shape:
|
|
270
259
|
raise ValueError(
|
|
271
260
|
f"Array shape {array.shape} doesn't match grid dimensions {expected_shape}"
|
|
@@ -277,7 +266,7 @@ def structured_data_from(array: np.ndarray, grid: GridData,
|
|
|
277
266
|
# Create the xarray DataArray with proper coordinates
|
|
278
267
|
xr_data_array = xr.DataArray(
|
|
279
268
|
data=array,
|
|
280
|
-
dims=['
|
|
269
|
+
dims=['x', 'y', 'z'], # Dimensions in the order they appear in the array
|
|
281
270
|
coords={
|
|
282
271
|
'x': centers['x'],
|
|
283
272
|
'y': centers['y'],
|
|
@@ -424,8 +413,7 @@ def _calculate_cell_centers(grid: GridData) -> Dict[str, np.ndarray]:
|
|
|
424
413
|
}
|
|
425
414
|
|
|
426
415
|
|
|
427
|
-
def _parse_mod_file(grid: GridData, lines: List[str], missing_value: Optional[float]
|
|
428
|
-
ordering: Literal['ijk', 'xyz', 'xyz_reverse'] = 'ijk') -> np.ndarray:
|
|
416
|
+
def _parse_mod_file(grid: GridData, lines: List[str], missing_value: Optional[float]) -> np.ndarray:
|
|
429
417
|
"""
|
|
430
418
|
Parse model file values into a 3D numpy array.
|
|
431
419
|
|
|
@@ -433,13 +421,9 @@ def _parse_mod_file(grid: GridData, lines: List[str], missing_value: Optional[fl
|
|
|
433
421
|
grid: GridData object containing grid dimensions
|
|
434
422
|
lines: List of lines containing the values
|
|
435
423
|
missing_value: Value to replace with NaN
|
|
436
|
-
ordering: Data ordering in the file:
|
|
437
|
-
- 'ijk': i (x) varies fastest, then j (y), then k (z)
|
|
438
|
-
- 'xyz': z varies fastest, then x, then y
|
|
439
|
-
- 'xyz_reverse': z varies fastest (reversed), then x, then y
|
|
440
424
|
|
|
441
425
|
Returns:
|
|
442
|
-
3D numpy array with shape (
|
|
426
|
+
3D numpy array with shape (nx, ny, nz)
|
|
443
427
|
"""
|
|
444
428
|
# Convert each line to a float
|
|
445
429
|
values = np.array([float(line) for line in lines], dtype=float)
|
|
@@ -453,23 +437,8 @@ def _parse_mod_file(grid: GridData, lines: List[str], missing_value: Optional[fl
|
|
|
453
437
|
f"Invalid model file: expected {expected_count} values, got {len(values)}"
|
|
454
438
|
)
|
|
455
439
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
# i (x) varies fastest, then j (y), then k (z)
|
|
459
|
-
# This is standard VTK/Fortran ordering: (k, j, i) in array dimensions
|
|
460
|
-
model_array = values.reshape((nz, ny, nx), order='C')
|
|
461
|
-
# Transpose to (ny, nx, nz) to match expected output shape
|
|
462
|
-
model_array = np.transpose(model_array, (1, 2, 0))
|
|
463
|
-
elif ordering == 'xyz':
|
|
464
|
-
# z varies fastest, then x, then y (legacy Grav3D ordering)
|
|
465
|
-
model_array = values.reshape((ny, nx, nz))
|
|
466
|
-
elif ordering == 'xyz_reverse':
|
|
467
|
-
# z varies fastest (but in reverse direction), then x, then y
|
|
468
|
-
model_array = values.reshape((ny, nx, nz))
|
|
469
|
-
# Reverse the z-axis (last dimension)
|
|
470
|
-
model_array = np.flip(model_array, axis=2)
|
|
471
|
-
else:
|
|
472
|
-
raise ValueError(f"Invalid ordering: {ordering}. Must be 'ijk', 'xyz', or 'xyz_reverse'")
|
|
440
|
+
model_array = values.reshape((nz, nx, ny), order='F')
|
|
441
|
+
model_array = np.transpose(model_array, (1, 2, 0))[:, :, ::-1]
|
|
473
442
|
|
|
474
443
|
# Replace missing values with NaN
|
|
475
444
|
if missing_value is not None:
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface_terra.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: subsurface_terra
|
|
3
|
-
Version: 2025.1.
|
|
3
|
+
Version: 2025.1.0rc17
|
|
4
4
|
Summary: Subsurface data types and utilities. This version is the one used by Terranigma Solutions. Please feel free to take anything in this repository for the original one.
|
|
5
5
|
Home-page: https://softwareunderground.github.io/subsurface
|
|
6
6
|
Author: Software Underground
|
|
@@ -45,6 +45,7 @@ subsurface/core/reader_helpers/readers_wells.py
|
|
|
45
45
|
subsurface/core/structs/README.rst
|
|
46
46
|
subsurface/core/structs/__init__.py
|
|
47
47
|
subsurface/core/structs/base_structures/__init__.py
|
|
48
|
+
subsurface/core/structs/base_structures/_aux.py
|
|
48
49
|
subsurface/core/structs/base_structures/_liquid_earth_mesh.py
|
|
49
50
|
subsurface/core/structs/base_structures/_unstructured_data_constructor.py
|
|
50
51
|
subsurface/core/structs/base_structures/base_structures_enum.py
|
|
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
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_all.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_dev.txt
RENAMED
|
File without changes
|
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_mesh.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_opt.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_plot.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_traces.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_volume.txt
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/requirements/requirements_wells.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/interfaces/README.rst
RENAMED
|
File without changes
|
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/interfaces/stream.py
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/reader/__init__.py
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/api/reader/read_wells.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
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/README.rst
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/structs/__init__.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
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/utils/__init__.py
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/core/utils/utils_core.py
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/__init__.py
RENAMED
|
File without changes
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/reader/README.rst
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
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/modules/tools/__init__.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
|
{subsurface_terra-2025.1.0rc16 → subsurface_terra-2025.1.0rc17}/subsurface/optional_requirements.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|