From 843a029ba8757c472b16b1b33d0c8d10a77adfbc Mon Sep 17 00:00:00 2001 From: benjamink Date: Wed, 25 Mar 2026 12:42:24 -0700 Subject: [PATCH 01/21] PlateOptions composed of PlateModel --- .../uijson/plate_simulation.ui.json | 4 +- simpeg_drivers/plate_simulation/driver.py | 20 +++++----- .../plate_simulation/match/driver.py | 10 ++--- .../plate_simulation/models/options.py | 40 ++++++------------- .../plate_simulation/models/parametric.py | 32 ++++++--------- simpeg_drivers/utils/synthetics/options.py | 4 +- tests/plate_simulation/models/events_test.py | 17 +++++--- tests/plate_simulation/runtest/driver_test.py | 34 ++++++++-------- .../plate_simulation/runtest/gravity_test.py | 25 +++++++----- tests/plate_simulation/runtest/match_test.py | 4 +- tests/plate_simulation/runtest/sweep_test.py | 2 +- 11 files changed, 92 insertions(+), 100 deletions(-) diff --git a/simpeg_drivers-assets/uijson/plate_simulation.ui.json b/simpeg_drivers-assets/uijson/plate_simulation.ui.json index 47fe0a05..a7c5037c 100644 --- a/simpeg_drivers-assets/uijson/plate_simulation.ui.json +++ b/simpeg_drivers-assets/uijson/plate_simulation.ui.json @@ -33,7 +33,7 @@ "tooltip": "Value of the basement resisitivity (ohm-m), density (g/cc) or susceptibility (SI)", "enabled": true }, - "overburden": { + "overburden_property": { "main": true, "group": "Overburden", "label": "Physical property (SI)", @@ -65,7 +65,7 @@ "enabled": true, "tooltip": "Spacing between plates" }, - "plate": { + "plate_property": { "main": true, "group": "Plate", "label": "Physical property (SI)", diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index 95ee6e00..b01898e8 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -131,24 +131,24 @@ def plates(self) -> list[Plate]: """Generate sequence of plates.""" if self._plates is None: offset = ( - self.params.model.overburden_model.thickness - if self.params.model.plate_model.reference_surface == "overburden" + self.params.model.overburden.thickness + if self.params.model.plate.reference_surface == "overburden" else 0.0 ) - center = self.params.model.plate_model.center( + center = self.params.model.plate.center( self.survey, self.topography, depth_offset=-1 * offset, ) plate = Plate( - self.params.model.plate_model, + self.params.model.plate, center, ) self._plates = self.replicate( plate, - self.params.model.plate_model.number, - self.params.model.plate_model.spacing, - self.params.model.plate_model.dip_direction, + self.params.model.plate.number, + self.params.model.plate.spacing, + self.params.model.plate.geometry.direction, ) return self._plates @@ -198,12 +198,12 @@ def make_model(self) -> FloatData: overburden = Overburden( topography=self.simulation_parameters.active_cells.topography_object, - thickness=self.params.model.overburden_model.thickness, - value=self.params.model.overburden_model.overburden, + thickness=self.params.model.overburden.thickness, + value=self.params.model.overburden.overburden_property, ) dikes = DikeSwarm( - [Anomaly(plate, plate.params.plate) for plate in self.plates], + [Anomaly(plate, plate.params.plate_property) for plate in self.plates], name="plates", ) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index 03b27248..ac858873 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -192,7 +192,7 @@ def _create_plate_from_parameters( """ center = self.params.survey.vertices[index_center] center[2] = ( - self._drape_heights[index_center] - model_options.overburden_model.thickness + self._drape_heights[index_center] - model_options.overburden.thickness ) indices = self.params.survey.get_segment_indices( index_center, self.params.max_distance @@ -208,10 +208,10 @@ def _create_plate_from_parameters( "y": center[1], "z": center[2], }, - "width": model_options.plate_model.dip_length, - "thickness": model_options.plate_model.width, - "length": model_options.plate_model.strike_length, - "dip": model_options.plate_model.dip, + "width": model_options.plate.geometry.dip_length, + "thickness": model_options.plate.geometry.width, + "length": model_options.plate.geometry.strike_length, + "dip": model_options.plate.geometry.dip, "dip_direction": (azimuth + strike_angle) % 360, } ) diff --git a/simpeg_drivers/plate_simulation/models/options.py b/simpeg_drivers/plate_simulation/models/options.py index 8805cbb8..7b2dfa9e 100644 --- a/simpeg_drivers/plate_simulation/models/options.py +++ b/simpeg_drivers/plate_simulation/models/options.py @@ -11,6 +11,7 @@ from typing import TypeVar import numpy as np +from geoapps_utils.modelling.plates import PlateModel from geoh5py.objects import Points from pydantic import ( BaseModel, @@ -29,20 +30,12 @@ class PlateOptions(BaseModel): Parameters describing an anomalous plate. :param plate: Value given to the plate(s). - :param width: V-size of the plate. - :param strike_length: U-size of the plate. - :param dip_length: W-size of the plate. - :param dip: Orientation of the v-axis in degree from horizontal. - :param dip_direction: Orientation of the u axis in degree from north. + :param geometry: Parameters describing the plate geometry. :param reference: Point of rotation to be 'center' or 'top'. :param number: Number of offset plates to be created. :param spacing: Spacing between plates. :param relative_locations: If True locations are relative to survey in xy and mean topography in z. - :param easting: Easting offset relative to survey. - :param northing: Northing offset relative to survey. - :param elevation: plate(s) elevation. May be true elevation or relative to - overburden or topography. :param reference_surface: Switches between using topography and overburden as elevation reference of the plate. :param reference_type: Type of reference for plate elevation. Can be 'mean' @@ -53,18 +46,11 @@ class PlateOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "Plate" - plate: float - width: float - strike_length: float - dip_length: float - dip: float = 90.0 - dip_direction: float = 90.0 + plate_property: float + geometry: PlateModel number: int = 1 spacing: float = 0.0 relative_locations: bool = False - easting: float = 0.0 - northing: float = 0.0 - elevation: float reference_surface: str = "topography" reference_type: str = "mean" @@ -82,7 +68,7 @@ def single_plate(self): @property def halfplate(self): """Compute half the z-projection length of the plate.""" - return 0.5 * self.dip_length * np.sin(np.deg2rad(self.dip)) + return 0.5 * self.geometry.dip_length * np.sin(np.deg2rad(self.geometry.dip)) def center( self, @@ -104,11 +90,11 @@ def _get_xy(self, survey: Points) -> tuple[float, float]: if self.relative_locations: return ( - survey.vertices[:, 0].mean() + self.easting, - survey.vertices[:, 1].mean() + self.northing, + survey.vertices[:, 0].mean() + self.geometry.origin[0], + survey.vertices[:, 1].mean() + self.geometry.origin[1], ) - return self.easting, self.northing + return self.geometry.origin[0], self.geometry.origin[1] def _get_z(self, surface: Points, offset: float = 0.0) -> float: """ @@ -122,9 +108,9 @@ def _get_z(self, surface: Points, offset: float = 0.0) -> float: raise ValueError("Topography object has no vertices.") if self.relative_locations: z = getattr(surface.vertices[:, 2], self.reference_type)() - z += offset + self.elevation - self.halfplate + z += offset + self.geometry.elevation - self.halfplate else: - z = self.elevation + z = self.geometry.elevation return z @@ -138,7 +124,7 @@ class OverburdenOptions(BaseModel): """ thickness: float - overburden: float + overburden_property: float class ModelOptions(BaseModel): @@ -153,5 +139,5 @@ class ModelOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) background: float - overburden_model: OverburdenOptions - plate_model: PlateOptions + overburden: OverburdenOptions + plate: PlateOptions diff --git a/simpeg_drivers/plate_simulation/models/parametric.py b/simpeg_drivers/plate_simulation/models/parametric.py index 360b1cfb..6b840595 100644 --- a/simpeg_drivers/plate_simulation/models/parametric.py +++ b/simpeg_drivers/plate_simulation/models/parametric.py @@ -128,12 +128,12 @@ def triangles(self) -> np.ndarray: def vertices(self) -> np.ndarray: """Vertices for triangulation of a rectangular prism in 3D space.""" - u_1 = self.center[0] - (self.params.strike_length / 2.0) - u_2 = self.center[0] + (self.params.strike_length / 2.0) - v_1 = self.center[1] - (self.params.dip_length / 2.0) - v_2 = self.center[1] + (self.params.dip_length / 2.0) - w_1 = self.center[2] - (self.params.width / 2.0) - w_2 = self.center[2] + (self.params.width / 2.0) + u_1 = self.center[0] - (self.params.geometry.strike_length / 2.0) + u_2 = self.center[0] + (self.params.geometry.strike_length / 2.0) + v_1 = self.center[1] - (self.params.geometry.dip_length / 2.0) + v_2 = self.center[1] + (self.params.geometry.dip_length / 2.0) + w_1 = self.center[2] - (self.params.geometry.width / 2.0) + w_2 = self.center[2] + (self.params.geometry.width / 2.0) vertices = np.array( [ @@ -159,29 +159,21 @@ def workspace(self) -> Workspace: def _rotate(self, vertices: np.ndarray) -> np.ndarray: """Rotate vertices and adjust for reference point.""" - theta = -1 * self.params.dip_direction - phi = -1 * self.params.dip + theta = -1 * self.params.geometry.direction + phi = -1 * self.params.geometry.dip rotated_vertices = rotate_xyz(vertices, self.center, theta, phi) return rotated_vertices def mask(self, mesh: Octree) -> np.ndarray: - plate = PlateModel( - strike_length=self.params.strike_length, - dip_length=self.params.dip_length, - width=self.params.width, - direction=self.params.dip_direction, - dip=self.params.dip, - origin=self.center, - ) rotations = [ - z_rotation_matrix(np.deg2rad(self.params.dip_direction)), - x_rotation_matrix(np.deg2rad(self.params.dip)), + z_rotation_matrix(np.deg2rad(self.params.geometry.direction)), + x_rotation_matrix(np.deg2rad(self.params.geometry.dip)), ] rotated_centers = rotate_points( - mesh.centroids, origin=plate.origin, rotations=rotations + mesh.centroids, origin=self.params.geometry.origin, rotations=rotations ) - return inside_plate(rotated_centers, plate) + return inside_plate(rotated_centers, self.params.geometry) class Body(Parametric): diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index 94995583..f37e112a 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -56,7 +56,9 @@ class ModelOptions(BaseModel): strike_length=40.0, dip_length=40.0, width=40.0, - origin=(0.0, 0.0, 10.0), + easting=0.0, + northing=0.0, + elevation=10.0, ) name: str = "model" diff --git a/tests/plate_simulation/models/events_test.py b/tests/plate_simulation/models/events_test.py index ced9033b..4c030054 100644 --- a/tests/plate_simulation/models/events_test.py +++ b/tests/plate_simulation/models/events_test.py @@ -9,6 +9,7 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np +from geoapps_utils.modelling.plates import PlateModel from geoh5py import Workspace from geoh5py.objects import Surface @@ -87,11 +88,17 @@ def test_anomaly(tmp_path): _, octree = get_topo_mesh(workspace) params = PlateOptions( name="my plate", - plate=10.0, - elevation=-1.5, - width=10.0, - strike_length=10.0, - dip_length=1.0, + plate_property=10.0, + geometry=PlateModel( + easting=0.0, + northing=0.0, + elevation=-1.5, + width=10.0, + strike_length=10.0, + dip_length=1.0, + dip_direction=90, + dip=90, + ), ) plate = Plate(params, center=(5.0, 5.0, -1.5)) diff --git a/tests/plate_simulation/runtest/driver_test.py b/tests/plate_simulation/runtest/driver_test.py index 9eae3291..1af9fd2e 100644 --- a/tests/plate_simulation/runtest/driver_test.py +++ b/tests/plate_simulation/runtest/driver_test.py @@ -75,9 +75,9 @@ def test_plate_simulation_params_from_input_file(tmp_path): # Add model parameters ifile.data["background"] = 1000.0 - ifile.data["overburden"] = 5.0 + ifile.data["overburden_property"] = 5.0 ifile.data["thickness"] = 50.0 - ifile.data["plate"] = 2.0 + ifile.data["plate_property"] = 2.0 ifile.data["width"] = 100.0 ifile.data["strike_length"] = 100.0 ifile.data["dip_length"] = 100.0 @@ -117,20 +117,20 @@ def test_plate_simulation_params_from_input_file(tmp_path): assert not params.mesh.diagonal_balance assert isinstance(params.model, ModelOptions) - assert params.model.plate_model.name == "test_gravity_plate_simulation" + assert params.model.plate.name == "test_gravity_plate_simulation" assert params.model.background == 1000.0 - assert params.model.overburden_model.thickness == 50.0 - assert params.model.overburden_model.overburden == 5.0 - assert params.model.plate_model.plate == 2.0 - assert params.model.plate_model.width == 100.0 - assert params.model.plate_model.strike_length == 100.0 - assert params.model.plate_model.dip_length == 100.0 - assert params.model.plate_model.dip == 0.0 - assert params.model.plate_model.dip_direction == 0.0 + assert params.model.overburden.thickness == 50.0 + assert params.model.overburden.overburden_property == 5.0 + assert params.model.plate.plate_property == 2.0 + assert params.model.plate.geometry.width == 100.0 + assert params.model.plate.geometry.strike_length == 100.0 + assert params.model.plate.geometry.dip_length == 100.0 + assert params.model.plate.geometry.dip == 0.0 + assert params.model.plate.geometry.direction == 0.0 - assert params.model.plate_model.number == 9 - assert params.model.plate_model.spacing == 10.0 - assert params.model.plate_model.relative_locations - assert params.model.plate_model.easting == 10.0 - assert params.model.plate_model.northing == 10.0 - assert params.model.plate_model.elevation == -250.0 + assert params.model.plate.number == 9 + assert params.model.plate.spacing == 10.0 + assert params.model.plate.relative_locations + assert params.model.plate.geometry.easting == 10.0 + assert params.model.plate.geometry.northing == 10.0 + assert params.model.plate.geometry.elevation == -250.0 diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 130517bb..878b4808 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -9,6 +9,7 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np +from geoapps_utils.modelling.plates import PlateModel from geoh5py.groups import SimPEGGroup from simpeg_drivers.plate_simulation.driver import PlateSimulationDriver @@ -51,25 +52,29 @@ def test_gravity_plate_simulation(tmp_path): max_distance=200.0, ) - overburden_params = OverburdenOptions(thickness=50.0, overburden=0.2) + overburden_params = OverburdenOptions(thickness=50.0, overburden_property=0.2) plate_params = PlateOptions( name="plate", - plate=0.5, - elevation=-250.0, - width=100.0, - strike_length=100.0, - dip_length=100.0, - dip=0.0, - dip_direction=0.0, + geometry=PlateModel( + easting=0.0, + northing=0.0, + elevation=-250.0, + width=100.0, + strike_length=100.0, + dip_length=100.0, + dip=0.0, + dip_direction=0.0, + ), + plate_property=0.5, reference="center", ) model_params = ModelOptions( name="density", background=0.0, - overburden_model=overburden_params, - plate_model=plate_params, + overburden=overburden_params, + plate=plate_params, ) options = GravityForwardOptions.build( diff --git a/tests/plate_simulation/runtest/match_test.py b/tests/plate_simulation/runtest/match_test.py index d122ebce..2eb064a1 100644 --- a/tests/plate_simulation/runtest/match_test.py +++ b/tests/plate_simulation/runtest/match_test.py @@ -142,8 +142,8 @@ def test_matching_driver(tmp_path: Path): ifile.data["simulation"] = fwr_driver.out_group plate_options = PlateSimulationOptions.build(ifile.data) - plate_options.model.overburden_model.thickness = 40.0 - plate_options.model.plate_model.dip_length = 300.0 + plate_options.model.overburden.thickness = 40.0 + plate_options.model.plate.geometry.dip_length = 300.0 driver = PlateSimulationDriver(plate_options) driver.run() diff --git a/tests/plate_simulation/runtest/sweep_test.py b/tests/plate_simulation/runtest/sweep_test.py index 9977c378..de339049 100644 --- a/tests/plate_simulation/runtest/sweep_test.py +++ b/tests/plate_simulation/runtest/sweep_test.py @@ -44,7 +44,7 @@ def setup_plate_sweep(workspace) -> SimPEGGroup: plate_ifile = InputFile.read_ui_json(options.default_ui_json) options_dict = plate_ifile.ui_json options_dict["simulation"]["value"] = str(gravity.uid) - options_dict["overburden"]["value"] = 100.0 + options_dict["overburden_property"]["value"] = 100.0 options_dict["thickness"]["value"] = 20.0 options_dict["u_cell_size"]["value"] = 10.0 options_dict["v_cell_size"]["value"] = 10.0 From 7a36da56561a1c0b10c0ef1673dabf70ad77e0d8 Mon Sep 17 00:00:00 2001 From: benjamink Date: Tue, 31 Mar 2026 12:37:23 -0700 Subject: [PATCH 02/21] fix tests --- simpeg_drivers/plate_simulation/driver.py | 31 ++++++-- .../plate_simulation/models/parametric.py | 24 +++--- simpeg_drivers/utils/synthetics/meshes.py | 23 +++--- tests/plate_simulation/models/events_test.py | 6 +- tests/plate_simulation/models/params_test.py | 41 ++++++----- tests/plate_simulation/models/plates_test.py | 73 ++++++++++++------- tests/run_tests/driver_airborne_fem_test.py | 4 +- tests/run_tests/driver_app_con_test.py | 4 +- .../driver_dc_2d_rotated_gradients_test.py | 4 +- tests/run_tests/driver_dc_2d_test.py | 4 +- tests/run_tests/driver_ground_tem_test.py | 8 +- tests/run_tests/driver_ip_2d_test.py | 4 +- .../driver_rotated_gradients_test.py | 4 +- .../oriented_airborne_fem_receiver_test.py | 4 +- .../oriented_airborne_tem_receiver_test.py | 4 +- 15 files changed, 151 insertions(+), 87 deletions(-) diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index b01898e8..b5643d1e 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -141,8 +141,13 @@ def plates(self) -> list[Plate]: depth_offset=-1 * offset, ) plate = Plate( - self.params.model.plate, - center, + self.params.model.plate.model_copy( + update={ + "easting": center[0], + "northing": center[1], + "elevation": center[2], + } + ), ) self._plates = self.replicate( plate, @@ -272,10 +277,24 @@ def replicate( plates = [] for i in range(number): - center = np.r_[plate.center] + azimuth_to_unit_vector(azimuth) * offsets[i] - new = Plate(plate.params.model_copy(), center) - new.params.name = f"{plate.params.name} offset {i + 1}" - plates.append(new) + center = ( + np.r_[plate.params.geometry.origin] + + azimuth_to_unit_vector(azimuth) * offsets[i] + ) + new_geometry = plate.params.geometry.model_copy( + update={ + "easting": center[0], + "northing": center[1], + "elevation": center[2], + } + ) + new_plate = Plate( + plate.params.model_copy(update={"geometry": new_geometry}) + ) + + new_plate.params.name = f"{plate.params.name} offset {i + 1}" + plates.append(new_plate) + return plates diff --git a/simpeg_drivers/plate_simulation/models/parametric.py b/simpeg_drivers/plate_simulation/models/parametric.py index 6b840595..340066e3 100644 --- a/simpeg_drivers/plate_simulation/models/parametric.py +++ b/simpeg_drivers/plate_simulation/models/parametric.py @@ -68,15 +68,9 @@ class Plate(Parametric): def __init__( self, params: PlateOptions, - center: tuple[float, float, float] = ( - 0.0, - 0.0, - 0.0, - ), workspace: Workspace | None = None, ): self.params = params - self.center = center self._workspace = workspace super().__init__(self._create_surface()) @@ -128,12 +122,16 @@ def triangles(self) -> np.ndarray: def vertices(self) -> np.ndarray: """Vertices for triangulation of a rectangular prism in 3D space.""" - u_1 = self.center[0] - (self.params.geometry.strike_length / 2.0) - u_2 = self.center[0] + (self.params.geometry.strike_length / 2.0) - v_1 = self.center[1] - (self.params.geometry.dip_length / 2.0) - v_2 = self.center[1] + (self.params.geometry.dip_length / 2.0) - w_1 = self.center[2] - (self.params.geometry.width / 2.0) - w_2 = self.center[2] + (self.params.geometry.width / 2.0) + u_1 = self.params.geometry.origin[0] - ( + self.params.geometry.strike_length / 2.0 + ) + u_2 = self.params.geometry.origin[0] + ( + self.params.geometry.strike_length / 2.0 + ) + v_1 = self.params.geometry.origin[1] - (self.params.geometry.dip_length / 2.0) + v_2 = self.params.geometry.origin[1] + (self.params.geometry.dip_length / 2.0) + w_1 = self.params.geometry.origin[2] - (self.params.geometry.width / 2.0) + w_2 = self.params.geometry.origin[2] + (self.params.geometry.width / 2.0) vertices = np.array( [ @@ -161,7 +159,7 @@ def _rotate(self, vertices: np.ndarray) -> np.ndarray: """Rotate vertices and adjust for reference point.""" theta = -1 * self.params.geometry.direction phi = -1 * self.params.geometry.dip - rotated_vertices = rotate_xyz(vertices, self.center, theta, phi) + rotated_vertices = rotate_xyz(vertices, self.params.geometry.origin, theta, phi) return rotated_vertices diff --git a/simpeg_drivers/utils/synthetics/meshes.py b/simpeg_drivers/utils/synthetics/meshes.py index 5e06ac7f..9b9e4947 100644 --- a/simpeg_drivers/utils/synthetics/meshes.py +++ b/simpeg_drivers/utils/synthetics/meshes.py @@ -122,19 +122,20 @@ def get_octree_mesh( ) if plate is not None: - # TODO Consolidate PlateOptions and PlateModel into a single class to avoid this redundancy plate_options = PlateOptions( - plate=1.0, # thickness - width=plate.width, - strike_length=plate.strike_length, - dip_length=plate.dip_length, - dip=plate.dip, - dip_direction=plate.direction, - elevation=0, + plate_property=1.0, # thickness + geometry=PlateModel( + strike_length=plate.strike_length, + dip_length=plate.dip_length, + width=plate.width, + direction=plate.direction, + dip=plate.dip, + easting=plate.origin[0], + northing=plate.origin[1], + elevation=0.0, + ), ) - center = list(plate.origin) - - plate = Plate(plate_options, center=center, workspace=survey.workspace) + plate = Plate(plate_options, workspace=survey.workspace) mesh = OctreeDriver.refine_tree_from_triangulation( mesh, plate.surface, levels=(4,), finalize=False ) diff --git a/tests/plate_simulation/models/events_test.py b/tests/plate_simulation/models/events_test.py index 4c030054..1a80c982 100644 --- a/tests/plate_simulation/models/events_test.py +++ b/tests/plate_simulation/models/events_test.py @@ -90,8 +90,8 @@ def test_anomaly(tmp_path): name="my plate", plate_property=10.0, geometry=PlateModel( - easting=0.0, - northing=0.0, + easting=5.0, + northing=5.0, elevation=-1.5, width=10.0, strike_length=10.0, @@ -100,7 +100,7 @@ def test_anomaly(tmp_path): dip=90, ), ) - plate = Plate(params, center=(5.0, 5.0, -1.5)) + plate = Plate(params) anomaly = Anomaly(body=plate, value=10.0) event_map = {1: ("Background", 1.0)} diff --git a/tests/plate_simulation/models/params_test.py b/tests/plate_simulation/models/params_test.py index 1c0c0366..3f0f0d92 100644 --- a/tests/plate_simulation/models/params_test.py +++ b/tests/plate_simulation/models/params_test.py @@ -9,6 +9,7 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np +from geoapps_utils.modelling.plates import PlateModel from geoh5py import Workspace from geoh5py.objects import Points, Surface @@ -19,19 +20,21 @@ def test_plate_params(tmp_path): workspace = Workspace(tmp_path / "test.geoh5") params = PlateOptions( name="my plate", - plate=1.0, - width=20.0, - strike_length=1500.0, - dip_length=400.0, - dip=90.0, - dip_direction=0.0, + plate_property=1.0, + geometry=PlateModel( + strike_length=1500.0, + dip_length=400.0, + width=20.0, + easting=10.0, + northing=10.0, + elevation=-100.0, + direction=0.0, + dip=90.0, + ), reference="center", number=1, spacing=10.0, relative_locations=True, - easting=10.0, - northing=10.0, - elevation=-100.0, reference_surface="topography", reference_type="mean", ) @@ -60,19 +63,21 @@ def test_plate_params(tmp_path): def test_plate_params_empty_reference(): params = PlateOptions( name="my plate", - plate=1.0, - width=20.0, - strike_length=1500.0, - dip_length=400.0, - dip=90.0, - dip_direction=0.0, + plate_property=1.0, + geometry=PlateModel( + strike_length=1500.0, + dip_length=400.0, + width=20.0, + easting=10.0, + northing=10.0, + elevation=-100.0, + direction=0.0, + dip=90.0, + ), reference="center", number=1, spacing=10.0, relative_locations=True, - easting=10.0, - northing=10.0, - elevation=-100.0, reference_surface=None, reference_type=None, ) diff --git a/tests/plate_simulation/models/plates_test.py b/tests/plate_simulation/models/plates_test.py index 3b3edb23..e1448d37 100644 --- a/tests/plate_simulation/models/plates_test.py +++ b/tests/plate_simulation/models/plates_test.py @@ -9,6 +9,7 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np +from geoapps_utils.modelling.plates import PlateModel from geoapps_utils.utils.transformations import rotate_xyz from geoh5py import Workspace @@ -28,13 +29,17 @@ def are_collocated(pts1, pts2): def vertical_east_striking_plate(): params = PlateOptions( name="my plate", - plate=1.0, - elevation=0.0, - width=10.0, - strike_length=1000.0, - dip_length=500.0, - dip=90.0, - dip_direction=0.0, + plate_property=1.0, + geometry=PlateModel( + strike_length=1000.0, + dip_length=500.0, + width=10.0, + direction=0.0, + dip=90.0, + easting=0.0, + northing=0.0, + elevation=0.0, + ), ) plate = Plate(params) @@ -75,13 +80,17 @@ def test_dipping_plates_all_quadrants(): for dip in [20.0, 70.0]: params = PlateOptions( name=f"plate dipping {dip} at {dip_direction}", - plate=1.0, - elevation=0.0, - width=10.0, - strike_length=1000.0, - dip_length=500.0, - dip=dip, - dip_direction=dip_direction, + plate_property=1.0, + geometry=PlateModel( + strike_length=1000.0, + dip_length=500.0, + width=10.0, + direction=dip_direction, + dip=dip, + easting=0.0, + northing=0.0, + elevation=0.0, + ), reference="center", ) @@ -96,13 +105,19 @@ def test_replicate_even(tmp_path): workspace = Workspace.create(tmp_path / f"{__name__}.geoh5") options = PlateOptions( name="test", - plate=1.0, - width=1.0, - strike_length=1.0, - dip_length=1.0, - elevation=1.0, + plate_property=1.0, + geometry=PlateModel( + strike_length=1.0, + dip_length=1.0, + width=1.0, + direction=0.0, + dip=0.0, + easting=0.0, + northing=0.0, + elevation=0.0, + ), ) - plate = Plate(options, (0, 0, 0), workspace=workspace) + plate = Plate(options, workspace=workspace) plates = PlateSimulationDriver.replicate(plate, 2, 10.0, 90.0) assert plates[0].surface.vertices is not None assert plates[1].surface.vertices is not None @@ -120,13 +135,19 @@ def test_replicate_odd(tmp_path): workspace = Workspace.create(tmp_path / f"{__name__}.geoh5") options = PlateOptions( name="test", - plate=1.0, - width=1.0, - strike_length=1.0, - dip_length=1.0, - elevation=1.0, + plate_property=1.0, + geometry=PlateModel( + strike_length=1.0, + dip_length=1.0, + width=1.0, + direction=0.0, + dip=0.0, + easting=0.0, + northing=0.0, + elevation=0.0, + ), ) - plate = Plate(options, (0, 0, 0), workspace=workspace) + plate = Plate(options, workspace=workspace) plates = PlateSimulationDriver.replicate(plate, 3, 5.0, 0.0) assert plates[0].surface.vertices is not None assert plates[1].surface.vertices is not None diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index 174a1357..1de7ff0f 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -91,7 +91,9 @@ def test_fem_fwr_run( strike_length=40.0, dip_length=40.0, width=40.0, - origin=(0.0, 0.0, -50.0), + easting=0.0, + northing=0.0, + elevation=-50.0, ), ), ) diff --git a/tests/run_tests/driver_app_con_test.py b/tests/run_tests/driver_app_con_test.py index ce67bfad..52979b78 100644 --- a/tests/run_tests/driver_app_con_test.py +++ b/tests/run_tests/driver_app_con_test.py @@ -66,7 +66,9 @@ def test_app_con_fwr_run( dip_length=60.0, width=60.0, dip=90, - origin=(0.0, 0.0, -90.0), + easting=0.0, + northing=0.0, + elevation=-90.0, ), ), ) diff --git a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py index 13f03ec9..f14989e7 100644 --- a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py +++ b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py @@ -63,7 +63,9 @@ def test_dc_rotated_2d_fwr_run(tmp_path: Path, n_electrodes=10, n_lines=3): strike_length=1000.0, dip_length=50.0, width=20.0, - origin=(0.0, 0.0, 0.0), + easting=0.0, + northing=0.0, + elevation=0.0, direction=90, dip=45, ), diff --git a/tests/run_tests/driver_dc_2d_test.py b/tests/run_tests/driver_dc_2d_test.py index 77fd0151..25d35d6f 100644 --- a/tests/run_tests/driver_dc_2d_test.py +++ b/tests/run_tests/driver_dc_2d_test.py @@ -68,7 +68,9 @@ def test_dc_2d_fwr_run( strike_length=1000.0, dip_length=20.0, width=20.0, - origin=(0.0, 0.0, 0.0), + easting=0.0, + northing=0.0, + elevation=0.0, direction=90, dip=90, ), diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index c70fcaaa..8b9cb0f9 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -69,7 +69,9 @@ def test_tiling_ground_tem( strike_length=40.0, dip_length=40.0, width=40.0, - origin=(0.0, 0.0, -50.0), + easting=0.0, + northing=0.0, + elevation=-50.0, ), ), ) @@ -128,7 +130,9 @@ def test_ground_tem_fwr_run( strike_length=40.0, dip_length=40.0, width=40.0, - origin=(0.0, 0.0, -50.0), + easting=0.0, + northing=0.0, + elevation=-50.0, ), ), ) diff --git a/tests/run_tests/driver_ip_2d_test.py b/tests/run_tests/driver_ip_2d_test.py index 30639ed3..0eebe059 100644 --- a/tests/run_tests/driver_ip_2d_test.py +++ b/tests/run_tests/driver_ip_2d_test.py @@ -64,7 +64,9 @@ def test_ip_2d_fwr_run( strike_length=1000.0, dip_length=50.0, width=20.0, - origin=(0.0, 0.0, 0.0), + easting=0.0, + northing=0.0, + elevation=0.0, direction=90, dip=45, ), diff --git a/tests/run_tests/driver_rotated_gradients_test.py b/tests/run_tests/driver_rotated_gradients_test.py index 8d757cf5..30fca309 100644 --- a/tests/run_tests/driver_rotated_gradients_test.py +++ b/tests/run_tests/driver_rotated_gradients_test.py @@ -66,7 +66,9 @@ def test_gravity_rotated_grad_fwr_run( strike_length=500.0, dip_length=150.0, width=20.0, - origin=(0.0, 0.0, -10.0), + easting=0.0, + northing=0.0, + elevation=-10.0, direction=60.0, dip=70.0, ), diff --git a/tests/run_tests/oriented_airborne_fem_receiver_test.py b/tests/run_tests/oriented_airborne_fem_receiver_test.py index b2d4b794..fcaf4583 100644 --- a/tests/run_tests/oriented_airborne_fem_receiver_test.py +++ b/tests/run_tests/oriented_airborne_fem_receiver_test.py @@ -89,7 +89,9 @@ def test_fem_fwr_run(tmp_path: Path, azimuth, dip): strike_length=150.0, dip_length=100.0, width=10.0, - origin=(0.0, 0.0, -60.0), + easting=0.0, + northing=0.0, + elevation=-60.0, direction=azimuth, dip=45.0, ), diff --git a/tests/run_tests/oriented_airborne_tem_receiver_test.py b/tests/run_tests/oriented_airborne_tem_receiver_test.py index a5f328e3..3009a813 100644 --- a/tests/run_tests/oriented_airborne_tem_receiver_test.py +++ b/tests/run_tests/oriented_airborne_tem_receiver_test.py @@ -83,7 +83,9 @@ def test_tem_fwr_run(tmp_path: Path, azimuth, dip): strike_length=150.0, dip_length=100.0, width=10.0, - origin=(0.0, 0.0, -60.0), + easting=0.0, + northing=0.0, + elevation=-60.0, direction=azimuth, dip=45.0, ), From 19342daec944f94fcaac45b2a8953b656d1e4ae9 Mon Sep 17 00:00:00 2001 From: benjamink Date: Wed, 1 Apr 2026 14:52:49 -0700 Subject: [PATCH 03/21] refactor --- simpeg_drivers/plate_simulation/driver.py | 51 ++-- .../plate_simulation/models/parametric.py | 240 +++++++++--------- simpeg_drivers/plate_simulation/options.py | 58 +---- simpeg_drivers/utils/synthetics/driver.py | 14 +- simpeg_drivers/utils/synthetics/meshes.py | 56 +--- simpeg_drivers/utils/synthetics/options.py | 67 ++++- tests/data_test.py | 6 +- tests/plate_simulation/models/events_test.py | 25 +- tests/plate_simulation/models/plates_test.py | 194 +++++++------- .../plate_simulation/runtest/gravity_test.py | 3 + tests/run_tests/driver_airborne_fem_test.py | 20 +- tests/topography_test.py | 4 +- 12 files changed, 356 insertions(+), 382 deletions(-) diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index b5643d1e..89533130 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -16,11 +16,11 @@ import numpy as np from dask.distributed import Client from geoapps_utils.base import Driver, get_logger +from geoapps_utils.modelling.plates import Plate from geoapps_utils.utils.transformations import azimuth_to_unit_vector from geoh5py.data import FloatData, ReferencedData from geoh5py.objects import Octree, Points, Surface from geoh5py.shared.utils import fetch_active_workspace -from grid_apps.octree_creation.driver import OctreeDriver from simpeg_drivers.driver import ( InversionDriver, @@ -30,9 +30,9 @@ ) from simpeg_drivers.options import BaseForwardOptions, ModelTypeEnum from simpeg_drivers.plate_simulation.models.events import Anomaly, Erosion, Overburden -from simpeg_drivers.plate_simulation.models.parametric import Plate from simpeg_drivers.plate_simulation.models.series import DikeSwarm, Geology from simpeg_drivers.plate_simulation.options import PlateSimulationOptions +from simpeg_drivers.utils.synthetics.meshes import get_octree_mesh from simpeg_drivers.utils.utils import validate_out_group @@ -141,7 +141,7 @@ def plates(self) -> list[Plate]: depth_offset=-1 * offset, ) plate = Plate( - self.params.model.plate.model_copy( + self.params.model.plate.geometry.model_copy( update={ "easting": center[0], "northing": center[1], @@ -185,13 +185,21 @@ def make_mesh(self) -> Octree: """ logger.info("making the mesh...") - octree_params = self.params.mesh.octree_params( - self.survey, - self.simulation_parameters.active_cells.topography_object, - [p.surface.copy(parent=self._out_group) for p in self.plates], - ) - octree_driver = OctreeDriver(octree_params) - mesh = octree_driver.run() + with fetch_active_workspace(self.params.geoh5, mode="r+") as geoh5: + surfaces = [p.surface(geoh5) for p in self.plates] + mesh = get_octree_mesh( + opts=self.params.mesh, + survey=self.survey, + topography=self.simulation_parameters.active_cells.topography_object, + plates=surfaces, + ) + # octree_params = self.params.mesh.octree_params( + # self.survey, + # self.simulation_parameters.active_cells.topography_object, + # [p.surface.copy(parent=self._out_group) for p in self.plates], + # ) + # octree_driver = OctreeDriver(octree_params) + # mesh = octree_driver.run() mesh.parent = self._out_group return mesh @@ -208,7 +216,10 @@ def make_model(self) -> FloatData: ) dikes = DikeSwarm( - [Anomaly(plate, plate.params.plate_property) for plate in self.plates], + [ + Anomaly(plate, self.params.model.plate.plate_property) + for plate in self.plates + ], name="plates", ) @@ -278,21 +289,19 @@ def replicate( plates = [] for i in range(number): center = ( - np.r_[plate.params.geometry.origin] + np.r_[plate.params.origin] + azimuth_to_unit_vector(azimuth) * offsets[i] ) - new_geometry = plate.params.geometry.model_copy( - update={ - "easting": center[0], - "northing": center[1], - "elevation": center[2], - } - ) new_plate = Plate( - plate.params.model_copy(update={"geometry": new_geometry}) + plate.params.model_copy( + update={ + "easting": center[0], + "northing": center[1], + "elevation": center[2], + } + ) ) - new_plate.params.name = f"{plate.params.name} offset {i + 1}" plates.append(new_plate) return plates diff --git a/simpeg_drivers/plate_simulation/models/parametric.py b/simpeg_drivers/plate_simulation/models/parametric.py index 340066e3..77fb472c 100644 --- a/simpeg_drivers/plate_simulation/models/parametric.py +++ b/simpeg_drivers/plate_simulation/models/parametric.py @@ -13,20 +13,10 @@ from abc import ABC, abstractmethod import numpy as np -from geoapps_utils.modelling.plates import PlateModel, inside_plate -from geoapps_utils.utils.transformations import ( - rotate_points, - rotate_xyz, - x_rotation_matrix, - z_rotation_matrix, -) from geoh5py.objects import Octree, Surface -from geoh5py.shared.utils import fetch_active_workspace -from geoh5py.workspace import Workspace from trimesh import Trimesh from trimesh.proximity import ProximityQuery -from simpeg_drivers.plate_simulation.models.options import PlateOptions from simpeg_drivers.utils.utils import active_from_xyz @@ -57,121 +47,121 @@ def mask(self, mesh: Octree) -> np.ndarray: """ -class Plate(Parametric): - """ - Define a rotated rectangular block in 3D space - - :param params: Parameters describing the plate. - :param surface: Surface object representing the plate. - """ - - def __init__( - self, - params: PlateOptions, - workspace: Workspace | None = None, - ): - self.params = params - self._workspace = workspace - super().__init__(self._create_surface()) - - def _create_surface(self) -> Surface: - """ - Create a surface object from a plate object. - - :param workspace: Workspace object to create the surface in. - :param out_group: Output group to store the surface. - """ - with fetch_active_workspace(self.workspace) as ws: - surface = Surface.create( - ws, - vertices=self.vertices, - cells=self.triangles, - name=self.params.name, - ) - - return surface - - @property - def surface(self): - """ - A surface object representing the plate. - """ - return self._surface - - @property - def triangles(self) -> np.ndarray: - """Triangulation of the block.""" - return np.vstack( - [ - [0, 2, 1], - [1, 2, 3], - [0, 1, 4], - [4, 1, 5], - [1, 3, 5], - [5, 3, 7], - [2, 6, 3], - [3, 6, 7], - [0, 4, 2], - [2, 4, 6], - [4, 5, 6], - [6, 5, 7], - ] - ) - - @property - def vertices(self) -> np.ndarray: - """Vertices for triangulation of a rectangular prism in 3D space.""" - - u_1 = self.params.geometry.origin[0] - ( - self.params.geometry.strike_length / 2.0 - ) - u_2 = self.params.geometry.origin[0] + ( - self.params.geometry.strike_length / 2.0 - ) - v_1 = self.params.geometry.origin[1] - (self.params.geometry.dip_length / 2.0) - v_2 = self.params.geometry.origin[1] + (self.params.geometry.dip_length / 2.0) - w_1 = self.params.geometry.origin[2] - (self.params.geometry.width / 2.0) - w_2 = self.params.geometry.origin[2] + (self.params.geometry.width / 2.0) - - vertices = np.array( - [ - [u_1, v_1, w_1], - [u_2, v_1, w_1], - [u_1, v_2, w_1], - [u_2, v_2, w_1], - [u_1, v_1, w_2], - [u_2, v_1, w_2], - [u_1, v_2, w_2], - [u_2, v_2, w_2], - ] - ) - - return self._rotate(vertices) - - @property - def workspace(self) -> Workspace: - if self._workspace is None: - self._workspace = Workspace() - - return self._workspace - - def _rotate(self, vertices: np.ndarray) -> np.ndarray: - """Rotate vertices and adjust for reference point.""" - theta = -1 * self.params.geometry.direction - phi = -1 * self.params.geometry.dip - rotated_vertices = rotate_xyz(vertices, self.params.geometry.origin, theta, phi) - - return rotated_vertices - - def mask(self, mesh: Octree) -> np.ndarray: - rotations = [ - z_rotation_matrix(np.deg2rad(self.params.geometry.direction)), - x_rotation_matrix(np.deg2rad(self.params.geometry.dip)), - ] - rotated_centers = rotate_points( - mesh.centroids, origin=self.params.geometry.origin, rotations=rotations - ) - return inside_plate(rotated_centers, self.params.geometry) +# class Plate(Parametric): +# """ +# Define a rotated rectangular block in 3D space +# +# :param params: Parameters describing the plate. +# :param surface: Surface object representing the plate. +# """ +# +# def __init__( +# self, +# params: PlateOptions, +# workspace: Workspace | None = None, +# ): +# self.params = params +# self._workspace = workspace +# super().__init__(self._create_surface()) +# +# def _create_surface(self) -> Surface: +# """ +# Create a surface object from a plate object. +# +# :param workspace: Workspace object to create the surface in. +# :param out_group: Output group to store the surface. +# """ +# with fetch_active_workspace(self.workspace) as ws: +# surface = Surface.create( +# ws, +# vertices=self.vertices, +# cells=self.triangles, +# name=self.params.name, +# ) +# +# return surface +# +# @property +# def surface(self): +# """ +# A surface object representing the plate. +# """ +# return self._surface +# +# @property +# def triangles(self) -> np.ndarray: +# """Triangulation of the block.""" +# return np.vstack( +# [ +# [0, 2, 1], +# [1, 2, 3], +# [0, 1, 4], +# [4, 1, 5], +# [1, 3, 5], +# [5, 3, 7], +# [2, 6, 3], +# [3, 6, 7], +# [0, 4, 2], +# [2, 4, 6], +# [4, 5, 6], +# [6, 5, 7], +# ] +# ) +# +# @property +# def vertices(self) -> np.ndarray: +# """Vertices for triangulation of a rectangular prism in 3D space.""" +# +# u_1 = self.params.geometry.origin[0] - ( +# self.params.geometry.strike_length / 2.0 +# ) +# u_2 = self.params.geometry.origin[0] + ( +# self.params.geometry.strike_length / 2.0 +# ) +# v_1 = self.params.geometry.origin[1] - (self.params.geometry.dip_length / 2.0) +# v_2 = self.params.geometry.origin[1] + (self.params.geometry.dip_length / 2.0) +# w_1 = self.params.geometry.origin[2] - (self.params.geometry.width / 2.0) +# w_2 = self.params.geometry.origin[2] + (self.params.geometry.width / 2.0) +# +# vertices = np.array( +# [ +# [u_1, v_1, w_1], +# [u_2, v_1, w_1], +# [u_1, v_2, w_1], +# [u_2, v_2, w_1], +# [u_1, v_1, w_2], +# [u_2, v_1, w_2], +# [u_1, v_2, w_2], +# [u_2, v_2, w_2], +# ] +# ) +# +# return self._rotate(vertices) +# +# @property +# def workspace(self) -> Workspace: +# if self._workspace is None: +# self._workspace = Workspace() +# +# return self._workspace +# +# def _rotate(self, vertices: np.ndarray) -> np.ndarray: +# """Rotate vertices and adjust for reference point.""" +# theta = -1 * self.params.geometry.direction +# phi = -1 * self.params.geometry.dip +# rotated_vertices = rotate_xyz(vertices, self.params.geometry.origin, theta, phi) +# +# return rotated_vertices +# +# def mask(self, mesh: Octree) -> np.ndarray: +# rotations = [ +# z_rotation_matrix(np.deg2rad(self.params.geometry.direction)), +# x_rotation_matrix(np.deg2rad(self.params.geometry.dip)), +# ] +# rotated_centers = rotate_points( +# mesh.centroids, origin=self.params.geometry.origin, rotations=rotations +# ) +# return inside_plate(rotated_centers, self.params.geometry) class Body(Parametric): diff --git a/simpeg_drivers/plate_simulation/options.py b/simpeg_drivers/plate_simulation/options.py index f09b1cde..ddbe3d32 100644 --- a/simpeg_drivers/plate_simulation/options.py +++ b/simpeg_drivers/plate_simulation/options.py @@ -14,10 +14,7 @@ from geoapps_utils.base import Options from geoh5py.groups import SimPEGGroup, UIJsonGroup -from geoh5py.objects import ObjectBase, Points, Surface from geoh5py.ui_json import InputFile -from grid_apps.octree_creation.options import OctreeOptions -from pydantic import BaseModel from simpeg_drivers import assets_path from simpeg_drivers.electricals.direct_current.three_dimensions.options import ( @@ -41,6 +38,7 @@ from simpeg_drivers.potential_fields.magnetic_vector import ( MagneticVectorForwardOptions, ) +from simpeg_drivers.utils.synthetics.meshes import MeshOptions from .models.options import ModelOptions @@ -57,60 +55,6 @@ } -class MeshOptions(BaseModel): - """Core parameters for octree mesh creation.""" - - u_cell_size: float - v_cell_size: float - w_cell_size: float - padding_distance: float - depth_core: float - max_distance: float - minimum_level: int = 8 - diagonal_balance: bool = False - - def octree_params( - self, survey: ObjectBase, topography: Surface | Points, plates: list[Surface] - ): - refinements = [ - { - "refinement_object": survey, - "levels": [4, 4, 4], - "horizon": False, - }, - { - "refinement_object": topography, - "levels": [0, 2], - "horizon": True, - "distance": 1000.0, - }, - ] - for plate in plates: - refinements.append( - { - "refinement_object": plate, - "levels": [2, 1], - "horizon": False, - } - ) - - octree_params = OctreeOptions( - geoh5=survey.workspace, - objects=survey, - u_cell_size=self.u_cell_size, - v_cell_size=self.v_cell_size, - w_cell_size=self.w_cell_size, - horizontal_padding=self.padding_distance, - vertical_padding=self.padding_distance, - depth_core=self.depth_core, - max_distance=self.max_distance, - minimum_level=self.minimum_level, - diagonal_balance=self.diagonal_balance, - refinements=refinements, - ) - return octree_params - - class PlateSimulationOptions(Options): """ Parameters for the plate simulation driver. diff --git a/simpeg_drivers/utils/synthetics/driver.py b/simpeg_drivers/utils/synthetics/driver.py index 04bf665e..15d5a277 100644 --- a/simpeg_drivers/utils/synthetics/driver.py +++ b/simpeg_drivers/utils/synthetics/driver.py @@ -8,9 +8,9 @@ # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -import numpy as np +from geoapps_utils.modelling.plates import Plate from geoh5py import Workspace -from geoh5py.data import BooleanData, FloatData +from geoh5py.data import FloatData from geoh5py.objects import DrapeModel, ObjectBase, Octree, Surface from simpeg_drivers.utils.synthetics.meshes import get_mesh @@ -69,20 +69,22 @@ def survey(self) -> ObjectBase: self._survey = entity return self._survey + @property + def plate(self) -> Surface | None: + plate = Plate(self.options.model.plate) + return plate.surface(self.geoh5) + @property def mesh(self) -> Octree | DrapeModel: if self._mesh is None: entity = self.geoh5.get_entity("mesh")[0] - if entity is None: entity = get_mesh( self.options.method, survey=self.survey, topography=self.topography, options=self.options.mesh, - plate=self.options.model.plate - if self.options.refine_plate - else None, + plates=[self.plate] if self.options.refine_plate else None, ) self._mesh = entity diff --git a/simpeg_drivers/utils/synthetics/meshes.py b/simpeg_drivers/utils/synthetics/meshes.py index 9b9e4947..a811bd8c 100644 --- a/simpeg_drivers/utils/synthetics/meshes.py +++ b/simpeg_drivers/utils/synthetics/meshes.py @@ -11,15 +11,12 @@ import numpy as np from discretize import TreeMesh from discretize.utils import mesh_builder_xyz -from geoapps_utils.modelling.plates import PlateModel +from geoapps_utils.modelling.plates import Plate, PlateModel from geoh5py.objects import DrapeModel, Octree, Points, Surface from grid_apps.octree_creation.driver import OctreeDriver -from grid_apps.utils import treemesh_2_octree from simpeg_drivers.electricals.base_2d import create_mesh_by_line_id from simpeg_drivers.options import DrapeModelOptions -from simpeg_drivers.plate_simulation.models.options import PlateOptions -from simpeg_drivers.plate_simulation.models.parametric import Plate from simpeg_drivers.utils.synthetics.options import MeshOptions @@ -28,7 +25,7 @@ def get_mesh( survey: Points, topography: Surface, options: MeshOptions | DrapeModelOptions, - plate: PlateModel | None = None, + plates: list[Surface] | None = None, ) -> DrapeModel | Octree: """Factory for mesh creation with behaviour modified by the provided method.""" @@ -44,12 +41,10 @@ def get_mesh( ) return get_octree_mesh( + options, survey=survey, topography=topography, - cell_size=options.cell_size, - refinement=options.refinement, - padding_distance=options.padding_distance, - plate=plate, + plates=plates, name=options.name, ) @@ -91,13 +86,11 @@ def get_base_octree( def get_octree_mesh( + opts: MeshOptions, survey: Points, topography: Surface, - cell_size: tuple[float, float, float], - refinement: tuple | list, - padding_distance: float, - plate: PlateModel | None = None, - name: str = "mesh", + plates: list[Surface] | None = None, + name: str = "octree", ) -> Octree: """Generate a survey centered mesh with topography and survey refinement. @@ -114,33 +107,8 @@ def get_octree_mesh( :return entity: The geoh5py Octree object to store the results of computation in the shared cells of the computational mesh. """ - - mesh = get_base_octree(survey, topography, cell_size, (0, 0, 1), padding_distance) - - mesh = OctreeDriver.refine_tree_from_points( - mesh, survey.vertices, levels=refinement, finalize=False - ) - - if plate is not None: - plate_options = PlateOptions( - plate_property=1.0, # thickness - geometry=PlateModel( - strike_length=plate.strike_length, - dip_length=plate.dip_length, - width=plate.width, - direction=plate.direction, - dip=plate.dip, - easting=plate.origin[0], - northing=plate.origin[1], - elevation=0.0, - ), - ) - plate = Plate(plate_options, workspace=survey.workspace) - mesh = OctreeDriver.refine_tree_from_triangulation( - mesh, plate.surface, levels=(4,), finalize=False - ) - - mesh.finalize() - entity = treemesh_2_octree(survey.workspace, mesh, name=name) - - return entity + octree_params = opts.octree_params(survey, topography, plates) + octree_driver = OctreeDriver(octree_params) + mesh = octree_driver.run() + mesh.name = name + return mesh diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index f37e112a..566f8044 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -12,6 +12,8 @@ from geoapps_utils.modelling.plates import PlateModel from geoapps_utils.utils.locations import gaussian +from geoh5py.objects import ObjectBase, Points, Surface +from grid_apps.octree_creation.options import OctreeOptions from pydantic import BaseModel, ConfigDict from simpeg_drivers.options import DrapeModelOptions @@ -39,14 +41,67 @@ def limits(self) -> list[float]: class MeshOptions(BaseModel): - cell_size: tuple[float, float, float] = (5.0, 5.0, 5.0) - refinement: tuple = (4, 6) + """Core parameters for octree mesh creation.""" + + u_cell_size: float = 5.0 + v_cell_size: float = 5.0 + w_cell_size: float = 5.0 padding_distance: float = 100.0 - name: str = "mesh" depth_core: float = 100.0 - expansion_factor: float = 1.1 - horizontal_padding: float = 1000.0 - vertical_padding: float = 1000.0 + max_distance: float = 100.0 + minimum_level: int = 8 + diagonal_balance: bool = False + survey_refinement: list[int] = [4, 6] + topography_refinement: list[int] = [0, 0, 1] + plate_refinement: list[int] = [4] + name: str = "mesh" + + @property + def cell_size(self) -> tuple[float, float, float]: + return (self.u_cell_size, self.v_cell_size, self.w_cell_size) + + def octree_params( + self, survey: ObjectBase, topography: Points, plates: list[Surface] | None + ): + refinements = [ + { + "refinement_object": survey, + "levels": self.survey_refinement, + "horizon": False, + }, + { + "refinement_object": topography, + "levels": self.topography_refinement, + "horizon": True, + "distance": 1000.0, + }, + ] + + if plates is not None: + for plate in plates: + refinements.append( + { + "refinement_object": plate, + "levels": self.plate_refinement, + "horizon": False, + } + ) + + octree_params = OctreeOptions( + geoh5=survey.workspace, + objects=survey, + u_cell_size=self.u_cell_size, + v_cell_size=self.v_cell_size, + w_cell_size=self.w_cell_size, + horizontal_padding=self.padding_distance, + vertical_padding=self.padding_distance, + depth_core=self.depth_core, + max_distance=self.max_distance, + minimum_level=self.minimum_level, + diagonal_balance=self.diagonal_balance, + refinements=refinements, + ) + return octree_params class ModelOptions(BaseModel): diff --git a/tests/data_test.py b/tests/data_test.py index 6bd9bc15..2098f984 100644 --- a/tests/data_test.py +++ b/tests/data_test.py @@ -44,7 +44,11 @@ def get_mvi_params(tmp_path: Path, **kwargs) -> MagneticVectorInversionOptions: opts = SyntheticsComponentsOptions( method="magnetic_vector", survey=SurveyOptions(n_stations=2, n_lines=2), - mesh=MeshOptions(refinement=(2,)), + mesh=MeshOptions( + survey_refinement=[ + 2, + ] + ), model=ModelOptions(anomaly=0.05), ) components = SyntheticsComponents(geoh5=geoh5, options=opts) diff --git a/tests/plate_simulation/models/events_test.py b/tests/plate_simulation/models/events_test.py index 1a80c982..4a8a5e32 100644 --- a/tests/plate_simulation/models/events_test.py +++ b/tests/plate_simulation/models/events_test.py @@ -9,7 +9,7 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np -from geoapps_utils.modelling.plates import PlateModel +from geoapps_utils.modelling.plates import Plate, PlateModel from geoh5py import Workspace from geoh5py.objects import Surface @@ -20,7 +20,6 @@ Overburden, ) from simpeg_drivers.plate_simulation.models.options import PlateOptions -from simpeg_drivers.plate_simulation.models.parametric import Plate from . import get_topo_mesh @@ -86,19 +85,15 @@ def test_overburden(tmp_path): def test_anomaly(tmp_path): with Workspace(tmp_path / "test.geoh5") as workspace: _, octree = get_topo_mesh(workspace) - params = PlateOptions( - name="my plate", - plate_property=10.0, - geometry=PlateModel( - easting=5.0, - northing=5.0, - elevation=-1.5, - width=10.0, - strike_length=10.0, - dip_length=1.0, - dip_direction=90, - dip=90, - ), + params = PlateModel( + easting=5.0, + northing=5.0, + elevation=-1.5, + width=10.0, + strike_length=10.0, + dip_length=1.0, + dip_direction=90, + dip=90, ) plate = Plate(params) diff --git a/tests/plate_simulation/models/plates_test.py b/tests/plate_simulation/models/plates_test.py index e1448d37..aaecf84b 100644 --- a/tests/plate_simulation/models/plates_test.py +++ b/tests/plate_simulation/models/plates_test.py @@ -9,13 +9,12 @@ # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' import numpy as np -from geoapps_utils.modelling.plates import PlateModel +from geoapps_utils.modelling.plates import Plate, PlateModel from geoapps_utils.utils.transformations import rotate_xyz from geoh5py import Workspace from simpeg_drivers.plate_simulation.driver import PlateSimulationDriver from simpeg_drivers.plate_simulation.models.options import PlateOptions -from simpeg_drivers.plate_simulation.models.parametric import Plate def are_collocated(pts1, pts2): @@ -26,62 +25,58 @@ def are_collocated(pts1, pts2): return np.all(truth) -def vertical_east_striking_plate(): - params = PlateOptions( - name="my plate", - plate_property=1.0, - geometry=PlateModel( - strike_length=1000.0, - dip_length=500.0, - width=10.0, - direction=0.0, - dip=90.0, - easting=0.0, - northing=0.0, - elevation=0.0, - ), +def vertical_east_striking_plate(workspace): + params = PlateModel( + strike_length=1000.0, + dip_length=500.0, + width=10.0, + direction=0.0, + dip=90.0, + easting=0.0, + northing=0.0, + elevation=0.0, ) plate = Plate(params) - return plate.surface - - -def test_vertical_east_striking_plate(): - vertical_east_striking = vertical_east_striking_plate() - assert vertical_east_striking.vertices is not None - assert vertical_east_striking.extent is not None - assert np.isclose( - vertical_east_striking.extent[1, 0] - vertical_east_striking.extent[0, 0], - 1000.0, - ) - assert np.isclose( - vertical_east_striking.extent[1, 1] - vertical_east_striking.extent[0, 1], - 10.0, - ) - assert np.isclose( - vertical_east_striking.extent[1, 2] - vertical_east_striking.extent[0, 2], - 500.0, - ) - assert ( - vertical_east_striking.vertices[:, 0].mean() == 0.0 # pylint: disable=no-member - ) - assert ( - vertical_east_striking.vertices[:, 1].mean() == 0.0 # pylint: disable=no-member - ) - assert ( - vertical_east_striking.vertices[:, 2].mean() == 0.0 # pylint: disable=no-member - ) - - -def test_dipping_plates_all_quadrants(): - reference = vertical_east_striking_plate() - - for dip_direction in np.arange(0.0, 361.0, 45.0): - for dip in [20.0, 70.0]: - params = PlateOptions( - name=f"plate dipping {dip} at {dip_direction}", - plate_property=1.0, - geometry=PlateModel( + return plate.surface(workspace) + + +def test_vertical_east_striking_plate(tmp_path): + with Workspace(tmp_path / "test.geoh5") as workspace: + vertical_east_striking = vertical_east_striking_plate(workspace) + assert vertical_east_striking.vertices is not None + assert vertical_east_striking.extent is not None + assert np.isclose( + vertical_east_striking.extent[1, 0] - vertical_east_striking.extent[0, 0], + 1000.0, + ) + assert np.isclose( + vertical_east_striking.extent[1, 1] - vertical_east_striking.extent[0, 1], + 10.0, + ) + assert np.isclose( + vertical_east_striking.extent[1, 2] - vertical_east_striking.extent[0, 2], + 500.0, + ) + assert ( + vertical_east_striking.vertices[:, 0].mean() == 0.0 # pylint: disable=no-member + ) + assert ( + vertical_east_striking.vertices[:, 1].mean() == 0.0 # pylint: disable=no-member + ) + assert ( + vertical_east_striking.vertices[:, 2].mean() == 0.0 # pylint: disable=no-member + ) + + +def test_dipping_plates_all_quadrants(tmp_path): + + with Workspace(tmp_path / "test.geoh5") as workspace: + reference = vertical_east_striking_plate(workspace) + + for dip_direction in np.arange(0.0, 361.0, 45.0): + for dip in [20.0, 70.0]: + params = PlateModel( strike_length=1000.0, dip_length=500.0, width=10.0, @@ -90,23 +85,18 @@ def test_dipping_plates_all_quadrants(): easting=0.0, northing=0.0, elevation=0.0, - ), - reference="center", - ) + ) - plate = Plate(params) - surface = plate.surface - locs = rotate_xyz(surface.vertices, [0.0, 0.0, 0.0], dip_direction, 0.0) - locs = rotate_xyz(locs, [0.0, 0.0, 0.0], 0.0, dip - 90.0) - assert np.allclose(locs, reference.vertices) + plate = Plate(params) + surface = plate.surface(workspace) + locs = rotate_xyz(surface.vertices, [0.0, 0.0, 0.0], dip_direction, 0.0) + locs = rotate_xyz(locs, [0.0, 0.0, 0.0], 0.0, dip - 90.0) + assert np.allclose(locs, reference.vertices) def test_replicate_even(tmp_path): - workspace = Workspace.create(tmp_path / f"{__name__}.geoh5") - options = PlateOptions( - name="test", - plate_property=1.0, - geometry=PlateModel( + with Workspace(tmp_path / "test.geoh5") as workspace: + options = PlateModel( strike_length=1.0, dip_length=1.0, width=1.0, @@ -115,28 +105,24 @@ def test_replicate_even(tmp_path): easting=0.0, northing=0.0, elevation=0.0, - ), - ) - plate = Plate(options, workspace=workspace) - plates = PlateSimulationDriver.replicate(plate, 2, 10.0, 90.0) - assert plates[0].surface.vertices is not None - assert plates[1].surface.vertices is not None - assert plates[0].params.name == "test offset 1" - assert np.allclose( - plates[0].surface.vertices.mean(axis=0), np.array([-5.0, 0.0, 0.0]) - ) - assert plates[1].params.name == "test offset 2" - assert np.allclose( - plates[1].surface.vertices.mean(axis=0), np.array([5.0, 0.0, 0.0]) - ) + ) + plate = Plate(options) + plates = PlateSimulationDriver.replicate(plate, 2, 10.0, 90.0) + assert plates[0].surface(workspace).vertices is not None + assert plates[1].surface(workspace).vertices is not None + assert np.allclose( + plates[0].surface(workspace).vertices.mean(axis=0), + np.array([-5.0, 0.0, 0.0]), + ) + assert np.allclose( + plates[1].surface(workspace).vertices.mean(axis=0), + np.array([5.0, 0.0, 0.0]), + ) def test_replicate_odd(tmp_path): - workspace = Workspace.create(tmp_path / f"{__name__}.geoh5") - options = PlateOptions( - name="test", - plate_property=1.0, - geometry=PlateModel( + with Workspace(tmp_path / "test.geoh5") as workspace: + options = PlateModel( strike_length=1.0, dip_length=1.0, width=1.0, @@ -145,19 +131,21 @@ def test_replicate_odd(tmp_path): easting=0.0, northing=0.0, elevation=0.0, - ), - ) - plate = Plate(options, workspace=workspace) - plates = PlateSimulationDriver.replicate(plate, 3, 5.0, 0.0) - assert plates[0].surface.vertices is not None - assert plates[1].surface.vertices is not None - assert plates[2].surface.vertices is not None - assert np.allclose( - plates[0].surface.vertices.mean(axis=0), np.array([0.0, -5.0, 0.0]) - ) - assert np.allclose( - plates[1].surface.vertices.mean(axis=0), np.array([0.0, 0.0, 0.0]) - ) - assert np.allclose( - plates[2].surface.vertices.mean(axis=0), np.array([0.0, 5.0, 0.0]) - ) + ) + plate = Plate(options) + plates = PlateSimulationDriver.replicate(plate, 3, 5.0, 0.0) + assert plates[0].surface(workspace).vertices is not None + assert plates[1].surface(workspace).vertices is not None + assert plates[2].surface(workspace).vertices is not None + assert np.allclose( + plates[0].surface(workspace).vertices.mean(axis=0), + np.array([0.0, -5.0, 0.0]), + ) + assert np.allclose( + plates[1].surface(workspace).vertices.mean(axis=0), + np.array([0.0, 0.0, 0.0]), + ) + assert np.allclose( + plates[2].surface(workspace).vertices.mean(axis=0), + np.array([0.0, 5.0, 0.0]), + ) diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 878b4808..174fdfe1 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -50,6 +50,9 @@ def test_gravity_plate_simulation(tmp_path): padding_distance=1500.0, depth_core=600.0, max_distance=200.0, + survey_refinement=[4, 6], + topography_refinement=[0, 1], + plate_refinement=[4, 2], ) overburden_params = OverburdenOptions(thickness=50.0, overburden_property=0.2) diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index 1de7ff0f..95a29c14 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -48,7 +48,16 @@ def test_fem_name_change(tmp_path, caplog): opts = SyntheticsComponentsOptions( method="fdem", survey=SurveyOptions(n_stations=2, n_lines=2, drape=15.0), - mesh=MeshOptions(refinement=(2,), padding_distance=400.0), + mesh=MeshOptions( + survey_refinement=[ + 2, + ], + topography_refinement=[0, 0, 1], + plate_refinement=[ + 4, + ], + padding_distance=400.0, + ), model=ModelOptions(background=1e-3), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: @@ -83,7 +92,12 @@ def test_fem_fwr_run( topography=lambda x, y: np.zeros(x.shape), ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + padding_distance=400.0, ), model=ModelOptions( background=1e-3, @@ -219,7 +233,7 @@ def test_fem_run(tmp_path: Path, max_iterations=1, pytest=True): Path("./"), n_grid_points=5, cell_size=(5.0, 5.0, 5.0), - refinement=(4, 4, 4), + refinement=[4, 4, 4], ) test_fem_run( Path("./"), diff --git a/tests/topography_test.py b/tests/topography_test.py index 90b68c9e..8243eb3f 100644 --- a/tests/topography_test.py +++ b/tests/topography_test.py @@ -34,7 +34,9 @@ def test_get_locations(tmp_path: Path): opts = SyntheticsComponentsOptions( method="magnetic_vector", survey=SurveyOptions(n_stations=2, n_lines=2), - mesh=MeshOptions(refinement=(2,)), + mesh=MeshOptions( + survey_refinement=[2], topography_refinement=[2], padding_distance=100.0 + ), model=ModelOptions(anomaly=0.05), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: From ce6b1518e4223048f0ea937173d3ecf9dce0526f Mon Sep 17 00:00:00 2001 From: benjamink Date: Wed, 1 Apr 2026 15:05:38 -0700 Subject: [PATCH 04/21] copilot suggestions --- simpeg_drivers/plate_simulation/models/options.py | 6 +++--- tests/plate_simulation/models/events_test.py | 2 +- tests/plate_simulation/runtest/gravity_test.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/simpeg_drivers/plate_simulation/models/options.py b/simpeg_drivers/plate_simulation/models/options.py index 7b2dfa9e..318aefc4 100644 --- a/simpeg_drivers/plate_simulation/models/options.py +++ b/simpeg_drivers/plate_simulation/models/options.py @@ -29,9 +29,9 @@ class PlateOptions(BaseModel): """ Parameters describing an anomalous plate. - :param plate: Value given to the plate(s). + :param name: Name given to the plate. + :param plate_property: Value given to the plate(s). :param geometry: Parameters describing the plate geometry. - :param reference: Point of rotation to be 'center' or 'top'. :param number: Number of offset plates to be created. :param spacing: Spacing between plates. :param relative_locations: If True locations are relative to survey in xy and @@ -120,7 +120,7 @@ class OverburdenOptions(BaseModel): Parameters for the overburden layer. :param thickness: Thickness of the overburden layer. - :param overburden: Value given to the overburden layer. + :param overburden_property: Value given to the overburden layer. """ thickness: float diff --git a/tests/plate_simulation/models/events_test.py b/tests/plate_simulation/models/events_test.py index 4a8a5e32..2f386ff7 100644 --- a/tests/plate_simulation/models/events_test.py +++ b/tests/plate_simulation/models/events_test.py @@ -92,7 +92,7 @@ def test_anomaly(tmp_path): width=10.0, strike_length=10.0, dip_length=1.0, - dip_direction=90, + direction=90, dip=90, ) plate = Plate(params) diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 174fdfe1..78501f06 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -67,7 +67,7 @@ def test_gravity_plate_simulation(tmp_path): strike_length=100.0, dip_length=100.0, dip=0.0, - dip_direction=0.0, + direction=0.0, ), plate_property=0.5, reference="center", From 4178c1fbec2cf91d6d2a941bf6164164c25b0d1a Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 07:11:16 -0700 Subject: [PATCH 05/21] padding_distance back to 1000.0 --- tests/run_tests/driver_airborne_fem_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index 95a29c14..fab2e919 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -97,7 +97,7 @@ def test_fem_fwr_run( w_cell_size=cell_size[2], survey_refinement=list(refinement), topography_refinement=[0, 0, 1], - padding_distance=400.0, + padding_distance=1000.0, ), model=ModelOptions( background=1e-3, From 2ecd649b6817377bf50148008c026a94e4bc3fb5 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 07:22:01 -0700 Subject: [PATCH 06/21] nope, revert --- tests/run_tests/driver_airborne_fem_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index fab2e919..95a29c14 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -97,7 +97,7 @@ def test_fem_fwr_run( w_cell_size=cell_size[2], survey_refinement=list(refinement), topography_refinement=[0, 0, 1], - padding_distance=1000.0, + padding_distance=400.0, ), model=ModelOptions( background=1e-3, From 0b5b55e40ea1072162dfcaad377c57272166affa Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 11:29:00 -0700 Subject: [PATCH 07/21] diagonal balance true, topo not a horizon, minimal plate refinement --- simpeg_drivers/utils/synthetics/meshes.py | 10 ++++----- simpeg_drivers/utils/synthetics/options.py | 12 ++++++++-- .../run_tests/driver_airborne_fem_1d_test.py | 9 +++++++- tests/run_tests/driver_airborne_fem_test.py | 3 +++ .../run_tests/driver_airborne_tem_1d_test.py | 9 +++++++- tests/run_tests/driver_airborne_tem_test.py | 17 ++++++++++++-- tests/run_tests/driver_app_con_test.py | 9 +++++++- .../driver_dc_2d_rotated_gradients_test.py | 1 + tests/run_tests/driver_dc_2d_test.py | 1 + tests/run_tests/driver_dc_test.py | 2 ++ tests/run_tests/driver_grav_test.py | 6 ++++- tests/run_tests/driver_ground_tem_test.py | 10 ++++++++- tests/run_tests/driver_ip_2d_test.py | 1 + tests/run_tests/driver_ip_test.py | 1 + .../driver_joint_cross_gradient_test.py | 22 ++++++++++++++++--- .../driver_joint_pgi_homogeneous_test.py | 15 +++++++++++-- tests/run_tests/driver_joint_surveys_test.py | 17 ++++++++++++-- tests/run_tests/driver_mag_automesh_test.py | 7 +++++- tests/run_tests/driver_mag_test.py | 7 +++++- tests/run_tests/driver_mt_test.py | 20 +++++++++++++++-- tests/run_tests/driver_mvi_test.py | 8 ++++++- .../driver_rotated_gradients_test.py | 7 +++++- tests/run_tests/driver_tile_estimator_test.py | 7 +++++- tests/run_tests/driver_tipper_test.py | 10 ++++++++- .../oriented_airborne_fem_receiver_test.py | 8 ++++++- .../oriented_airborne_tem_receiver_test.py | 8 ++++++- tests/run_tests/sensitivity_cutoff_test.py | 7 +++++- 27 files changed, 201 insertions(+), 33 deletions(-) diff --git a/simpeg_drivers/utils/synthetics/meshes.py b/simpeg_drivers/utils/synthetics/meshes.py index a811bd8c..3bb2f21b 100644 --- a/simpeg_drivers/utils/synthetics/meshes.py +++ b/simpeg_drivers/utils/synthetics/meshes.py @@ -14,6 +14,7 @@ from geoapps_utils.modelling.plates import Plate, PlateModel from geoh5py.objects import DrapeModel, Octree, Points, Surface from grid_apps.octree_creation.driver import OctreeDriver +from grid_apps.utils import treemesh_2_octree from simpeg_drivers.electricals.base_2d import create_mesh_by_line_id from simpeg_drivers.options import DrapeModelOptions @@ -94,17 +95,14 @@ def get_octree_mesh( ) -> Octree: """Generate a survey centered mesh with topography and survey refinement. + :param opts: Octree mesh creation options. :param survey: Survey object with vertices that define the core of the tensor mesh and the source refinement for EM methods. :param topography: Surface used to refine the topography. - :param cell_size: Tuple defining the cell size in all directions. - :param refinement: Tuple containing the number of cells to refine at each - level around the topography. - :param padding_distance: Distance to pad the mesh in all directions. - :param plate: Optional PlateModel object to refine the mesh around the plate. + :param plates: Optional plate surfaces to refine. :param name: Name of the Octree object to create in geoh5. Default is "mesh". - :return entity: The geoh5py Octree object to store the results of + :return mesh: The geoh5py Octree object to store the results of computation in the shared cells of the computational mesh. """ octree_params = opts.octree_params(survey, topography, plates) diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index 566f8044..d08dee57 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -10,6 +10,7 @@ from collections.abc import Callable +import numpy as np from geoapps_utils.modelling.plates import PlateModel from geoapps_utils.utils.locations import gaussian from geoh5py.objects import ObjectBase, Points, Surface @@ -50,7 +51,7 @@ class MeshOptions(BaseModel): depth_core: float = 100.0 max_distance: float = 100.0 minimum_level: int = 8 - diagonal_balance: bool = False + diagonal_balance: bool = True survey_refinement: list[int] = [4, 6] topography_refinement: list[int] = [0, 0, 1] plate_refinement: list[int] = [4] @@ -63,16 +64,23 @@ def cell_size(self) -> tuple[float, float, float]: def octree_params( self, survey: ObjectBase, topography: Points, plates: list[Surface] | None ): + shifted_survey = survey.copy() + shifted_survey.vertices = shifted_survey.vertices - np.r_[self.cell_size] / 2.0 refinements = [ { "refinement_object": survey, "levels": self.survey_refinement, "horizon": False, }, + { + "refinement_object": shifted_survey, + "levels": self.survey_refinement, + "horizon": False, + }, { "refinement_object": topography, "levels": self.topography_refinement, - "horizon": True, + "horizon": False, "distance": 1000.0, }, ] diff --git a/tests/run_tests/driver_airborne_fem_1d_test.py b/tests/run_tests/driver_airborne_fem_1d_test.py index e3515b54..88683975 100644 --- a/tests/run_tests/driver_airborne_fem_1d_test.py +++ b/tests/run_tests/driver_airborne_fem_1d_test.py @@ -50,11 +50,18 @@ def test_fem_fwr_1d_run( # Run the forward opts = SyntheticsComponentsOptions( method="fdem 1d", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=10.0 ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=refinement, + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, ), model=ModelOptions(background=1e-4, anomaly=0.1), ) diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index 95a29c14..e9cc3b95 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -47,6 +47,7 @@ def test_fem_name_change(tmp_path, caplog): # Run the forward opts = SyntheticsComponentsOptions( method="fdem", + refine_plate=True, survey=SurveyOptions(n_stations=2, n_lines=2, drape=15.0), mesh=MeshOptions( survey_refinement=[ @@ -85,6 +86,7 @@ def test_fem_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="fdem", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -97,6 +99,7 @@ def test_fem_fwr_run( w_cell_size=cell_size[2], survey_refinement=list(refinement), topography_refinement=[0, 0, 1], + plate_refinement=[1], padding_distance=400.0, ), model=ModelOptions( diff --git a/tests/run_tests/driver_airborne_tem_1d_test.py b/tests/run_tests/driver_airborne_tem_1d_test.py index a907966a..d697d537 100644 --- a/tests/run_tests/driver_airborne_tem_1d_test.py +++ b/tests/run_tests/driver_airborne_tem_1d_test.py @@ -47,11 +47,18 @@ def test_airborne_tem_1d_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="airborne tdem 1d", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=10.0 ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, ), model=ModelOptions(background=0.1), ) diff --git a/tests/run_tests/driver_airborne_tem_test.py b/tests/run_tests/driver_airborne_tem_test.py index 64e74406..b695a532 100644 --- a/tests/run_tests/driver_airborne_tem_test.py +++ b/tests/run_tests/driver_airborne_tem_test.py @@ -46,10 +46,16 @@ def test_bad_waveform(tmp_path: Path): opts = SyntheticsComponentsOptions( method="airborne tdem", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=10.0 ), - mesh=MeshOptions(refinement=refinement, padding_distance=400.0), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, + ), model=ModelOptions(background=0.001), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: @@ -88,11 +94,18 @@ def test_airborne_tem_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="airborne tdem", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=10.0 ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, ), model=ModelOptions(background=0.001), ) diff --git a/tests/run_tests/driver_app_con_test.py b/tests/run_tests/driver_app_con_test.py index 52979b78..2d7ad79e 100644 --- a/tests/run_tests/driver_app_con_test.py +++ b/tests/run_tests/driver_app_con_test.py @@ -49,6 +49,7 @@ def test_app_con_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="apparent conductivity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -56,7 +57,13 @@ def test_app_con_fwr_run( topography=lambda x, y: np.zeros(x.shape), ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=2000 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=2000, ), model=ModelOptions( background=100.0, diff --git a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py index f14989e7..c58c35e6 100644 --- a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py +++ b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py @@ -47,6 +47,7 @@ def test_dc_rotated_2d_fwr_run(tmp_path: Path, n_electrodes=10, n_lines=3): opts = SyntheticsComponentsOptions( method="direct current 2d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=DrapeModelOptions( u_cell_size=5.0, diff --git a/tests/run_tests/driver_dc_2d_test.py b/tests/run_tests/driver_dc_2d_test.py index 25d35d6f..096ca0b3 100644 --- a/tests/run_tests/driver_dc_2d_test.py +++ b/tests/run_tests/driver_dc_2d_test.py @@ -52,6 +52,7 @@ def test_dc_2d_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="direct current 2d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=DrapeModelOptions( u_cell_size=5.0, diff --git a/tests/run_tests/driver_dc_test.py b/tests/run_tests/driver_dc_test.py index ad2f115b..005a61ec 100644 --- a/tests/run_tests/driver_dc_test.py +++ b/tests/run_tests/driver_dc_test.py @@ -48,6 +48,7 @@ def test_dc_3d_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="direct current 3d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=MeshOptions(refinement=refinement), model=ModelOptions(background=0.01, anomaly=10.0), @@ -150,6 +151,7 @@ def test_dc_single_line_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="direct current 3d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=MeshOptions(refinement=refinement), model=ModelOptions(background=0.01, anomaly=10.0), diff --git a/tests/run_tests/driver_grav_test.py b/tests/run_tests/driver_grav_test.py index bc3174dd..624b0907 100644 --- a/tests/run_tests/driver_grav_test.py +++ b/tests/run_tests/driver_grav_test.py @@ -56,7 +56,11 @@ def test_gravity_fwr_run( survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.75), ), ) diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index 8b9cb0f9..9294084d 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -55,6 +55,7 @@ def test_tiling_ground_tem( # Run the forward opts = SyntheticsComponentsOptions( method="ground tdem", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -115,6 +116,7 @@ def test_ground_tem_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="ground tdem", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -122,7 +124,13 @@ def test_ground_tem_fwr_run( topography=lambda x, y: np.zeros(x.shape), ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=1000.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=1000.0, ), model=ModelOptions( background=0.001, diff --git a/tests/run_tests/driver_ip_2d_test.py b/tests/run_tests/driver_ip_2d_test.py index 0eebe059..28010250 100644 --- a/tests/run_tests/driver_ip_2d_test.py +++ b/tests/run_tests/driver_ip_2d_test.py @@ -48,6 +48,7 @@ def test_ip_2d_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="induced polarization 2d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=DrapeModelOptions( u_cell_size=5.0, diff --git a/tests/run_tests/driver_ip_test.py b/tests/run_tests/driver_ip_test.py index ae6f7035..0abf3567 100644 --- a/tests/run_tests/driver_ip_test.py +++ b/tests/run_tests/driver_ip_test.py @@ -47,6 +47,7 @@ def test_ip_3d_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="induced polarization 3d", + refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), mesh=MeshOptions(refinement=refinement), model=ModelOptions(background=1e-6, anomaly=1e-1), diff --git a/tests/run_tests/driver_joint_cross_gradient_test.py b/tests/run_tests/driver_joint_cross_gradient_test.py index b6d5e346..dddea977 100644 --- a/tests/run_tests/driver_joint_cross_gradient_test.py +++ b/tests/run_tests/driver_joint_cross_gradient_test.py @@ -65,10 +65,16 @@ def test_joint_cross_gradient_fwr_run( # Create local problem A opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=15.0, name="survey A" ), - mesh=MeshOptions(refinement=refinement, name="mesh A"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh A", + ), model=ModelOptions(anomaly=0.75, name="model A"), active=SyntheticsActiveCellsOptions(name="active A"), ) @@ -92,7 +98,12 @@ def test_joint_cross_gradient_fwr_run( drape=15.0, name="survey B", ), - mesh=MeshOptions(refinement=refinement, name="mesh B"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh B", + ), model=ModelOptions(anomaly=0.05, name="model B"), active=SyntheticsActiveCellsOptions(name="active B"), ) @@ -115,7 +126,12 @@ def test_joint_cross_gradient_fwr_run( survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_lines, name="survey C" ), - mesh=MeshOptions(refinement=refinement, name="mesh C"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh C", + ), model=ModelOptions(background=0.01, anomaly=10, name="model C"), active=SyntheticsActiveCellsOptions(name="active C"), ) diff --git a/tests/run_tests/driver_joint_pgi_homogeneous_test.py b/tests/run_tests/driver_joint_pgi_homogeneous_test.py index ca69ddd9..6d2d151f 100644 --- a/tests/run_tests/driver_joint_pgi_homogeneous_test.py +++ b/tests/run_tests/driver_joint_pgi_homogeneous_test.py @@ -63,13 +63,19 @@ def test_homogeneous_fwr_run( # Create local problem A opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=15.0, name="survey A", ), - mesh=MeshOptions(refinement=refinement, name="mesh A"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh A", + ), model=ModelOptions(anomaly=0.75, name="model A"), active=SyntheticsActiveCellsOptions(name="active A"), ) @@ -98,7 +104,12 @@ def test_homogeneous_fwr_run( drape=15.0, name="survey B", ), - mesh=MeshOptions(refinement=refinement, name="mesh B"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh B", + ), model=ModelOptions(anomaly=0.05, name="model B"), active=SyntheticsActiveCellsOptions(name="active B"), ) diff --git a/tests/run_tests/driver_joint_surveys_test.py b/tests/run_tests/driver_joint_surveys_test.py index 1ab0ca60..762f663d 100644 --- a/tests/run_tests/driver_joint_surveys_test.py +++ b/tests/run_tests/driver_joint_surveys_test.py @@ -65,10 +65,16 @@ def test_joint_surveys_fwr_run( # Create local problem A opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0, name="survey A" ), - mesh=MeshOptions(refinement=refinement, name="mesh A"), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh A", + ), model=ModelOptions(anomaly=0.75, name="model A"), active=SyntheticsActiveCellsOptions(name="active A"), ) @@ -96,7 +102,12 @@ def test_joint_surveys_fwr_run( drape=10.0, name="survey B", ), - mesh=MeshOptions(refinement=(0, 2), name="mesh B"), + mesh=MeshOptions( + survey_refinement=[0, 2], + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh B", + ), model=ModelOptions(anomaly=0.75, name="model B"), active=SyntheticsActiveCellsOptions(name="active B"), ) @@ -297,6 +308,7 @@ def test_joint_surveys_conductivity_run( ): opts = SyntheticsComponentsOptions( method="direct-current", + refine_plate=True, survey=SurveyOptions(n_stations=4, n_lines=4, name="survey A"), mesh=MeshOptions(refinement=(2, 2, 2), name="mesh A"), model=ModelOptions(anomaly=0.1, background=0.01, name="model A"), @@ -352,6 +364,7 @@ def test_joint_surveys_tem_run( ): opts = SyntheticsComponentsOptions( method="airborne tdem", + refine_plate=True, survey=SurveyOptions(n_stations=4, n_lines=4, name="survey A"), mesh=MeshOptions(refinement=(2, 2, 2), name="mesh A"), model=ModelOptions(anomaly=0.1, background=0.01, name="model A"), diff --git a/tests/run_tests/driver_mag_automesh_test.py b/tests/run_tests/driver_mag_automesh_test.py index 494da8bb..5f3a4ce1 100644 --- a/tests/run_tests/driver_mag_automesh_test.py +++ b/tests/run_tests/driver_mag_automesh_test.py @@ -39,10 +39,15 @@ def test_automesh( # Run the forward opts = SyntheticsComponentsOptions( method="magnetic_scalar", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.05), ) with Workspace.create(tmp_path / "forward_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_mag_test.py b/tests/run_tests/driver_mag_test.py index d9e65e1a..eb642922 100644 --- a/tests/run_tests/driver_mag_test.py +++ b/tests/run_tests/driver_mag_test.py @@ -48,10 +48,15 @@ def test_susceptibility_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="magnetic", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.05), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_mt_test.py b/tests/run_tests/driver_mt_test.py index 92f6f8ba..7fd48d1b 100644 --- a/tests/run_tests/driver_mt_test.py +++ b/tests/run_tests/driver_mt_test.py @@ -97,8 +97,16 @@ def test_magnetotellurics_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="magnetotellurics", + refine_plate=True, survey=SurveyOptions(n_stations=n_grid_points, n_lines=n_grid_points), - mesh=MeshOptions(cell_size=cell_size, refinement=refinement), + mesh=MeshOptions( + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=0.01), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: @@ -199,8 +207,16 @@ def test_magnetotellurics_tiles( workpath = tmp_path / f"{__name__}.geoh5" opts = SyntheticsComponentsOptions( method="magnetotellurics", + refine_plate=True, survey=SurveyOptions(n_stations=n_grid_points, n_lines=n_grid_points), - mesh=MeshOptions(cell_size=cell_size, refinement=refinement), + mesh=MeshOptions( + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=0.01), ) with Workspace.create(workpath) as geoh5: diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py index be3c40af..4597b386 100644 --- a/tests/run_tests/driver_mvi_test.py +++ b/tests/run_tests/driver_mvi_test.py @@ -55,10 +55,15 @@ def test_magnetic_vector_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="magnetic_vector", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.05), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: @@ -188,6 +193,7 @@ def test_magnetic_vector_reference( # Run the forward opts = SyntheticsComponentsOptions( method="magnetic_vector", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), diff --git a/tests/run_tests/driver_rotated_gradients_test.py b/tests/run_tests/driver_rotated_gradients_test.py index 30fca309..043b4678 100644 --- a/tests/run_tests/driver_rotated_gradients_test.py +++ b/tests/run_tests/driver_rotated_gradients_test.py @@ -52,6 +52,7 @@ def test_gravity_rotated_grad_fwr_run( opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -59,7 +60,11 @@ def test_gravity_rotated_grad_fwr_run( drape=5.0, topography=lambda x, y: gaussian(x, y, amplitude=50.0, width=100.0) + 15, ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions( anomaly=0.75, plate=PlateModel( diff --git a/tests/run_tests/driver_tile_estimator_test.py b/tests/run_tests/driver_tile_estimator_test.py index dfe8b560..0b309531 100644 --- a/tests/run_tests/driver_tile_estimator_test.py +++ b/tests/run_tests/driver_tile_estimator_test.py @@ -40,8 +40,13 @@ def test_tile_estimator_run( opts = SyntheticsComponentsOptions( method="magnetic_scalar", + refine_plate=True, survey=SurveyOptions(n_stations=n_grid_points, n_lines=n_grid_points), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.05), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_tipper_test.py b/tests/run_tests/driver_tipper_test.py index 816b3d84..07c30c0d 100644 --- a/tests/run_tests/driver_tipper_test.py +++ b/tests/run_tests/driver_tipper_test.py @@ -48,10 +48,18 @@ def test_tipper_fwr_run( # Run the forward opts = SyntheticsComponentsOptions( method="tipper", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=15.0 ), - mesh=MeshOptions(cell_size=cell_size, refinement=refinement), + mesh=MeshOptions( + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=100.0), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/oriented_airborne_fem_receiver_test.py b/tests/run_tests/oriented_airborne_fem_receiver_test.py index fcaf4583..a7ef54df 100644 --- a/tests/run_tests/oriented_airborne_fem_receiver_test.py +++ b/tests/run_tests/oriented_airborne_fem_receiver_test.py @@ -81,7 +81,13 @@ def test_fem_fwr_run(tmp_path: Path, azimuth, dip): topography=lambda x, y: np.zeros(x.shape), ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, ), model=ModelOptions( background=1e-3, diff --git a/tests/run_tests/oriented_airborne_tem_receiver_test.py b/tests/run_tests/oriented_airborne_tem_receiver_test.py index 3009a813..a2bb03a5 100644 --- a/tests/run_tests/oriented_airborne_tem_receiver_test.py +++ b/tests/run_tests/oriented_airborne_tem_receiver_test.py @@ -75,7 +75,13 @@ def test_tem_fwr_run(tmp_path: Path, azimuth, dip): topography=lambda x, y: np.zeros(x.shape), ), mesh=MeshOptions( - cell_size=cell_size, refinement=refinement, padding_distance=400.0 + u_cell_size=cell_size[0], + v_cell_size=cell_size[1], + w_cell_size=cell_size[2], + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=400.0, ), model=ModelOptions( background=1e-3, diff --git a/tests/run_tests/sensitivity_cutoff_test.py b/tests/run_tests/sensitivity_cutoff_test.py index da695c6a..ae6c1cda 100644 --- a/tests/run_tests/sensitivity_cutoff_test.py +++ b/tests/run_tests/sensitivity_cutoff_test.py @@ -43,10 +43,15 @@ def setup_inversion_results( ): opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.75), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: From ba7c0c8c69807c872788d6224659c45765acc3cc Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 12:03:09 -0700 Subject: [PATCH 08/21] handle naming changes in ui.json files with aliases --- simpeg_drivers/plate_simulation/models/options.py | 5 +++-- tests/plate_simulation/runtest/gravity_test.py | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/simpeg_drivers/plate_simulation/models/options.py b/simpeg_drivers/plate_simulation/models/options.py index 318aefc4..fa85632c 100644 --- a/simpeg_drivers/plate_simulation/models/options.py +++ b/simpeg_drivers/plate_simulation/models/options.py @@ -16,6 +16,7 @@ from pydantic import ( BaseModel, ConfigDict, + Field, ValidationInfo, field_validator, model_validator, @@ -46,7 +47,7 @@ class PlateOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "Plate" - plate_property: float + plate_property: float = Field(validation_alias="plate") geometry: PlateModel number: int = 1 spacing: float = 0.0 @@ -124,7 +125,7 @@ class OverburdenOptions(BaseModel): """ thickness: float - overburden_property: float + overburden_property: float = Field(validation_alias="overburden") class ModelOptions(BaseModel): diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 78501f06..69533225 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -55,7 +55,11 @@ def test_gravity_plate_simulation(tmp_path): plate_refinement=[4, 2], ) - overburden_params = OverburdenOptions(thickness=50.0, overburden_property=0.2) + overburden_params = OverburdenOptions( + thickness=50.0, + overburden=0.2, # tests alias handling + ) + assert overburden_params.overburden_property == 0.2 plate_params = PlateOptions( name="plate", From fee12c3f3ee25fe1115225acc4c6a0de762bc3a0 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 12:05:53 -0700 Subject: [PATCH 09/21] cleanup --- .../plate_simulation/models/parametric.py | 117 ------------------ 1 file changed, 117 deletions(-) diff --git a/simpeg_drivers/plate_simulation/models/parametric.py b/simpeg_drivers/plate_simulation/models/parametric.py index 77fb472c..15f602b6 100644 --- a/simpeg_drivers/plate_simulation/models/parametric.py +++ b/simpeg_drivers/plate_simulation/models/parametric.py @@ -47,123 +47,6 @@ def mask(self, mesh: Octree) -> np.ndarray: """ -# class Plate(Parametric): -# """ -# Define a rotated rectangular block in 3D space -# -# :param params: Parameters describing the plate. -# :param surface: Surface object representing the plate. -# """ -# -# def __init__( -# self, -# params: PlateOptions, -# workspace: Workspace | None = None, -# ): -# self.params = params -# self._workspace = workspace -# super().__init__(self._create_surface()) -# -# def _create_surface(self) -> Surface: -# """ -# Create a surface object from a plate object. -# -# :param workspace: Workspace object to create the surface in. -# :param out_group: Output group to store the surface. -# """ -# with fetch_active_workspace(self.workspace) as ws: -# surface = Surface.create( -# ws, -# vertices=self.vertices, -# cells=self.triangles, -# name=self.params.name, -# ) -# -# return surface -# -# @property -# def surface(self): -# """ -# A surface object representing the plate. -# """ -# return self._surface -# -# @property -# def triangles(self) -> np.ndarray: -# """Triangulation of the block.""" -# return np.vstack( -# [ -# [0, 2, 1], -# [1, 2, 3], -# [0, 1, 4], -# [4, 1, 5], -# [1, 3, 5], -# [5, 3, 7], -# [2, 6, 3], -# [3, 6, 7], -# [0, 4, 2], -# [2, 4, 6], -# [4, 5, 6], -# [6, 5, 7], -# ] -# ) -# -# @property -# def vertices(self) -> np.ndarray: -# """Vertices for triangulation of a rectangular prism in 3D space.""" -# -# u_1 = self.params.geometry.origin[0] - ( -# self.params.geometry.strike_length / 2.0 -# ) -# u_2 = self.params.geometry.origin[0] + ( -# self.params.geometry.strike_length / 2.0 -# ) -# v_1 = self.params.geometry.origin[1] - (self.params.geometry.dip_length / 2.0) -# v_2 = self.params.geometry.origin[1] + (self.params.geometry.dip_length / 2.0) -# w_1 = self.params.geometry.origin[2] - (self.params.geometry.width / 2.0) -# w_2 = self.params.geometry.origin[2] + (self.params.geometry.width / 2.0) -# -# vertices = np.array( -# [ -# [u_1, v_1, w_1], -# [u_2, v_1, w_1], -# [u_1, v_2, w_1], -# [u_2, v_2, w_1], -# [u_1, v_1, w_2], -# [u_2, v_1, w_2], -# [u_1, v_2, w_2], -# [u_2, v_2, w_2], -# ] -# ) -# -# return self._rotate(vertices) -# -# @property -# def workspace(self) -> Workspace: -# if self._workspace is None: -# self._workspace = Workspace() -# -# return self._workspace -# -# def _rotate(self, vertices: np.ndarray) -> np.ndarray: -# """Rotate vertices and adjust for reference point.""" -# theta = -1 * self.params.geometry.direction -# phi = -1 * self.params.geometry.dip -# rotated_vertices = rotate_xyz(vertices, self.params.geometry.origin, theta, phi) -# -# return rotated_vertices -# -# def mask(self, mesh: Octree) -> np.ndarray: -# rotations = [ -# z_rotation_matrix(np.deg2rad(self.params.geometry.direction)), -# x_rotation_matrix(np.deg2rad(self.params.geometry.dip)), -# ] -# rotated_centers = rotate_points( -# mesh.centroids, origin=self.params.geometry.origin, rotations=rotations -# ) -# return inside_plate(rotated_centers, self.params.geometry) - - class Body(Parametric): """ Represents a closed surface in the model. From fb5afb4c616b76269637cde69ba1db0af32f2d06 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 12:07:21 -0700 Subject: [PATCH 10/21] another cleanup --- simpeg_drivers/plate_simulation/driver.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index 89533130..997ff4f3 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -193,13 +193,7 @@ def make_mesh(self) -> Octree: topography=self.simulation_parameters.active_cells.topography_object, plates=surfaces, ) - # octree_params = self.params.mesh.octree_params( - # self.survey, - # self.simulation_parameters.active_cells.topography_object, - # [p.surface.copy(parent=self._out_group) for p in self.plates], - # ) - # octree_driver = OctreeDriver(octree_params) - # mesh = octree_driver.run() + mesh.parent = self._out_group return mesh From d97eba24486cd23698a3fe8924eab0f529c50c90 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 12:17:06 -0700 Subject: [PATCH 11/21] update docstrings --- simpeg_drivers/utils/synthetics/meshes.py | 15 +++++++++++++-- simpeg_drivers/utils/synthetics/options.py | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/simpeg_drivers/utils/synthetics/meshes.py b/simpeg_drivers/utils/synthetics/meshes.py index 3bb2f21b..f1194b41 100644 --- a/simpeg_drivers/utils/synthetics/meshes.py +++ b/simpeg_drivers/utils/synthetics/meshes.py @@ -28,7 +28,18 @@ def get_mesh( options: MeshOptions | DrapeModelOptions, plates: list[Surface] | None = None, ) -> DrapeModel | Octree: - """Factory for mesh creation with behaviour modified by the provided method.""" + """ + Factory for mesh creation with behaviour modified by the provided method. + + :param method: Geophysical method dictating if Octree (3d) or DrapeModel + (2d) mesh is returned. + :param survey: Survey object for point refinement. + :param topography: Topography object for surface refinement. + :param options: Mesh creation options specifying core and refinement options. + :param plates: Optional plate surfaces to refine. + + :return: A DrapeModel for 2D methods, or an Octree for all other methods. + """ if "2d" in method: line_data = survey.get_entity("line_ids")[0] @@ -100,7 +111,7 @@ def get_octree_mesh( tensor mesh and the source refinement for EM methods. :param topography: Surface used to refine the topography. :param plates: Optional plate surfaces to refine. - :param name: Name of the Octree object to create in geoh5. Default is "mesh". + :param name: Name of the Octree object to create in geoh5. :return mesh: The geoh5py Octree object to store the results of computation in the shared cells of the computational mesh. diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index d08dee57..069eed0a 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -64,6 +64,7 @@ def cell_size(self) -> tuple[float, float, float]: def octree_params( self, survey: ObjectBase, topography: Points, plates: list[Surface] | None ): + """Collect parameters for an OctreeDriver run for a synthetic experiment.""" shifted_survey = survey.copy() shifted_survey.vertices = shifted_survey.vertices - np.r_[self.cell_size] / 2.0 refinements = [ From e42b10e17815a01c1c372253842d1ad638580ed9 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 12:23:24 -0700 Subject: [PATCH 12/21] more docstring updates --- simpeg_drivers/utils/synthetics/options.py | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index 069eed0a..da44bf3e 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -13,7 +13,7 @@ import numpy as np from geoapps_utils.modelling.plates import PlateModel from geoapps_utils.utils.locations import gaussian -from geoh5py.objects import ObjectBase, Points, Surface +from geoh5py.objects import ObjectBase, Surface from grid_apps.octree_creation.options import OctreeOptions from pydantic import BaseModel, ConfigDict @@ -21,6 +21,8 @@ class SurveyOptions(BaseModel): + """Parameters for configuring a synthetic survey grid.""" + center: tuple[float, float] = (0.0, 0.0) width: float = 200.0 height: float = 200.0 @@ -33,6 +35,7 @@ class SurveyOptions(BaseModel): @property def limits(self) -> list[float]: + """East-West bounding box of the survey as [xmin, xmax, ymin, ymax].""" return [ self.center[0] - self.width / 2, self.center[0] + self.width / 2, @@ -59,12 +62,21 @@ class MeshOptions(BaseModel): @property def cell_size(self) -> tuple[float, float, float]: + """Cell size in the u, v, and w directions.""" return (self.u_cell_size, self.v_cell_size, self.w_cell_size) def octree_params( - self, survey: ObjectBase, topography: Points, plates: list[Surface] | None - ): - """Collect parameters for an OctreeDriver run for a synthetic experiment.""" + self, survey: ObjectBase, topography: Surface, plates: list[Surface] | None + ) -> OctreeOptions: + """ + Collect parameters for an OctreeDriver run for a synthetic experiment. + + :param survey: Survey object used as the primary refinement source. + :param topography: Surface used for topographic mesh refinement. + :param plates: Optional list of plate surfaces for additional refinement. + + :return: OctreeOptions instance ready to be passed to an OctreeDriver. + """ shifted_survey = survey.copy() shifted_survey.vertices = shifted_survey.vertices - np.r_[self.cell_size] / 2.0 refinements = [ @@ -114,6 +126,8 @@ def octree_params( class ModelOptions(BaseModel): + """Parameters controlling physical properties and plate geometry.""" + background: float = 0.0 anomaly: float = 1.0 plate: PlateModel = PlateModel( @@ -128,10 +142,14 @@ class ModelOptions(BaseModel): class ActiveCellsOptions(BaseModel): + """Options for naming the active cells model.""" + name: str = "active_cells" class SyntheticsComponentsOptions(BaseModel): + """Top-level options for configuring a synthetic inversion experiment.""" + model_config = ConfigDict(arbitrary_types_allowed=True) method: str = "gravity" From db56325d00c44abadfe24558cabfbb825e0ccd9e Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 13:10:44 -0700 Subject: [PATCH 13/21] Set old default cell sizes in runtests where it isn't passed through the cell_size argument --- simpeg_drivers/plate_simulation/driver.py | 3 +- simpeg_drivers/utils/meshes.py | 2 +- tests/run_tests/driver_airborne_fem_test.py | 8 +--- tests/run_tests/driver_airborne_tem_test.py | 3 ++ tests/run_tests/driver_dc_test.py | 18 ++++++++- tests/run_tests/driver_grav_test.py | 4 ++ tests/run_tests/driver_ground_tem_test.py | 10 ++++- tests/run_tests/driver_ip_test.py | 9 ++++- .../driver_joint_cross_gradient_test.py | 11 ++++++ .../driver_joint_pgi_homogeneous_test.py | 7 ++++ tests/run_tests/driver_joint_surveys_test.py | 38 +++++++++++++++++-- tests/run_tests/driver_mag_automesh_test.py | 3 ++ tests/run_tests/driver_mag_test.py | 3 ++ tests/run_tests/driver_mvi_test.py | 12 +++++- .../driver_rotated_gradients_test.py | 3 ++ tests/run_tests/driver_tile_estimator_test.py | 3 ++ tests/run_tests/sensitivity_cutoff_test.py | 3 ++ 17 files changed, 123 insertions(+), 17 deletions(-) diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index 997ff4f3..cfd93f75 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -192,6 +192,7 @@ def make_mesh(self) -> Octree: survey=self.survey, topography=self.simulation_parameters.active_cells.topography_object, plates=surfaces, + name=self.params.mesh.name, ) mesh.parent = self._out_group @@ -271,8 +272,6 @@ def replicate( """ Replicate a plate n times along an azimuth centered at origin. - Plate names will be indexed. - :param plate: models.parametric.Plate to be replicated. :param number: Number of plates returned. :param spacing: Spacing between plates. diff --git a/simpeg_drivers/utils/meshes.py b/simpeg_drivers/utils/meshes.py index 80dc8c84..afd152bd 100644 --- a/simpeg_drivers/utils/meshes.py +++ b/simpeg_drivers/utils/meshes.py @@ -107,7 +107,7 @@ def auto_mesh_parameters( { "refinement_object": topography, "levels": topography_refinement, - "horizon": True, + "horizon": False, }, None, ], diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index e9cc3b95..e2f7d57d 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -50,13 +50,9 @@ def test_fem_name_change(tmp_path, caplog): refine_plate=True, survey=SurveyOptions(n_stations=2, n_lines=2, drape=15.0), mesh=MeshOptions( - survey_refinement=[ - 2, - ], + survey_refinement=[2], topography_refinement=[0, 0, 1], - plate_refinement=[ - 4, - ], + plate_refinement=[1], padding_distance=400.0, ), model=ModelOptions(background=1e-3), diff --git a/tests/run_tests/driver_airborne_tem_test.py b/tests/run_tests/driver_airborne_tem_test.py index b695a532..081bfe25 100644 --- a/tests/run_tests/driver_airborne_tem_test.py +++ b/tests/run_tests/driver_airborne_tem_test.py @@ -51,6 +51,9 @@ def test_bad_waveform(tmp_path: Path): n_stations=n_grid_points, n_lines=n_grid_points, drape=10.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_dc_test.py b/tests/run_tests/driver_dc_test.py index 005a61ec..30c0509b 100644 --- a/tests/run_tests/driver_dc_test.py +++ b/tests/run_tests/driver_dc_test.py @@ -50,7 +50,14 @@ def test_dc_3d_fwr_run( method="direct current 3d", refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=0.01, anomaly=10.0), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: @@ -153,7 +160,14 @@ def test_dc_single_line_fwr_run( method="direct current 3d", refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=0.01, anomaly=10.0), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_grav_test.py b/tests/run_tests/driver_grav_test.py index 624b0907..0d7e7dc0 100644 --- a/tests/run_tests/driver_grav_test.py +++ b/tests/run_tests/driver_grav_test.py @@ -53,10 +53,14 @@ def test_gravity_fwr_run( geoh5=geoh5, options=SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index 9294084d..279e3699 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -63,7 +63,15 @@ def test_tiling_ground_tem( topography=lambda x, y: np.zeros(x.shape), name="ground_tdem_survey", ), - mesh=MeshOptions(refinement=refinement, padding_distance=1000.0), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=list(refinement), + topography_refinement=[0, 0, 1], + plate_refinement=[1], + padding_distance=1000.0, + ), model=ModelOptions( background=0.001, plate=PlateModel( diff --git a/tests/run_tests/driver_ip_test.py b/tests/run_tests/driver_ip_test.py index 0abf3567..ee2cba50 100644 --- a/tests/run_tests/driver_ip_test.py +++ b/tests/run_tests/driver_ip_test.py @@ -49,7 +49,14 @@ def test_ip_3d_fwr_run( method="induced polarization 3d", refine_plate=True, survey=SurveyOptions(n_stations=n_electrodes, n_lines=n_lines), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=refinement, + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(background=1e-6, anomaly=1e-1), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_joint_cross_gradient_test.py b/tests/run_tests/driver_joint_cross_gradient_test.py index dddea977..87b29365 100644 --- a/tests/run_tests/driver_joint_cross_gradient_test.py +++ b/tests/run_tests/driver_joint_cross_gradient_test.py @@ -70,6 +70,9 @@ def test_joint_cross_gradient_fwr_run( n_stations=n_grid_points, n_lines=n_grid_points, drape=15.0, name="survey A" ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -92,6 +95,7 @@ def test_joint_cross_gradient_fwr_run( with geoh5.open(): opts = SyntheticsComponentsOptions( method="magnetic_vector", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -99,6 +103,9 @@ def test_joint_cross_gradient_fwr_run( name="survey B", ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -123,10 +130,14 @@ def test_joint_cross_gradient_fwr_run( with geoh5.open(): opts = SyntheticsComponentsOptions( method="direct current 3d", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_lines, name="survey C" ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_joint_pgi_homogeneous_test.py b/tests/run_tests/driver_joint_pgi_homogeneous_test.py index 6d2d151f..2bfa74b8 100644 --- a/tests/run_tests/driver_joint_pgi_homogeneous_test.py +++ b/tests/run_tests/driver_joint_pgi_homogeneous_test.py @@ -71,6 +71,9 @@ def test_homogeneous_fwr_run( name="survey A", ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -98,6 +101,7 @@ def test_homogeneous_fwr_run( with geoh5.open(): opts = SyntheticsComponentsOptions( method="magnetic_vector", + refine_plate=True, survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, @@ -105,6 +109,9 @@ def test_homogeneous_fwr_run( name="survey B", ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_joint_surveys_test.py b/tests/run_tests/driver_joint_surveys_test.py index 762f663d..ae38d5a6 100644 --- a/tests/run_tests/driver_joint_surveys_test.py +++ b/tests/run_tests/driver_joint_surveys_test.py @@ -70,6 +70,9 @@ def test_joint_surveys_fwr_run( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0, name="survey A" ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -96,6 +99,7 @@ def test_joint_surveys_fwr_run( with geoh5.open(): opts = SyntheticsComponentsOptions( method="gravity", + refine_plate=True, survey=SurveyOptions( n_stations=int(n_grid_points / 2), n_lines=int(n_grid_points / 2), @@ -103,6 +107,9 @@ def test_joint_surveys_fwr_run( name="survey B", ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=[0, 2], topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -227,13 +234,22 @@ def test_joint_surveys_mvi_run(tmp_path, anomaly=0.05): for ii in range(1, 3): opts = SyntheticsComponentsOptions( method="magnetic_vector", + refine_plate=True, survey=SurveyOptions( n_stations=3**ii, n_lines=3**ii, drape=5.0, name=f"Survey Driver[{ii}]", ), - mesh=MeshOptions(refinement=(2**ii, 2, 2), name=f"Mesh Driver[{ii}]"), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=[2**ii, 2, 2], + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name=f"Mesh Driver[{ii}]", + ), model=ModelOptions(anomaly=anomaly), ) components = SyntheticsComponents(geoh5, options=opts) @@ -310,7 +326,15 @@ def test_joint_surveys_conductivity_run( method="direct-current", refine_plate=True, survey=SurveyOptions(n_stations=4, n_lines=4, name="survey A"), - mesh=MeshOptions(refinement=(2, 2, 2), name="mesh A"), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=[2, 2, 2], + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh A", + ), model=ModelOptions(anomaly=0.1, background=0.01, name="model A"), active=SyntheticsActiveCellsOptions(name="active A"), ) @@ -366,7 +390,15 @@ def test_joint_surveys_tem_run( method="airborne tdem", refine_plate=True, survey=SurveyOptions(n_stations=4, n_lines=4, name="survey A"), - mesh=MeshOptions(refinement=(2, 2, 2), name="mesh A"), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=[2, 2, 2], + topography_refinement=[0, 0, 1], + plate_refinement=[1], + name="mesh A", + ), model=ModelOptions(anomaly=0.1, background=0.01, name="model A"), active=SyntheticsActiveCellsOptions(name="active A"), ) diff --git a/tests/run_tests/driver_mag_automesh_test.py b/tests/run_tests/driver_mag_automesh_test.py index 5f3a4ce1..51dda95d 100644 --- a/tests/run_tests/driver_mag_automesh_test.py +++ b/tests/run_tests/driver_mag_automesh_test.py @@ -44,6 +44,9 @@ def test_automesh( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_mag_test.py b/tests/run_tests/driver_mag_test.py index eb642922..185f737e 100644 --- a/tests/run_tests/driver_mag_test.py +++ b/tests/run_tests/driver_mag_test.py @@ -53,6 +53,9 @@ def test_susceptibility_fwr_run( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py index 4597b386..4c67caa6 100644 --- a/tests/run_tests/driver_mvi_test.py +++ b/tests/run_tests/driver_mvi_test.py @@ -60,6 +60,9 @@ def test_magnetic_vector_fwr_run( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], @@ -197,7 +200,14 @@ def test_magnetic_vector_reference( survey=SurveyOptions( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), - mesh=MeshOptions(refinement=refinement), + mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, + survey_refinement=refinement, + topography_refinement=[0, 0, 1], + plate_refinement=[1], + ), model=ModelOptions(anomaly=0.05), ) with get_workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: diff --git a/tests/run_tests/driver_rotated_gradients_test.py b/tests/run_tests/driver_rotated_gradients_test.py index 043b4678..05f0f8a4 100644 --- a/tests/run_tests/driver_rotated_gradients_test.py +++ b/tests/run_tests/driver_rotated_gradients_test.py @@ -61,6 +61,9 @@ def test_gravity_rotated_grad_fwr_run( topography=lambda x, y: gaussian(x, y, amplitude=50.0, width=100.0) + 15, ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/driver_tile_estimator_test.py b/tests/run_tests/driver_tile_estimator_test.py index 0b309531..e4c27bd0 100644 --- a/tests/run_tests/driver_tile_estimator_test.py +++ b/tests/run_tests/driver_tile_estimator_test.py @@ -43,6 +43,9 @@ def test_tile_estimator_run( refine_plate=True, survey=SurveyOptions(n_stations=n_grid_points, n_lines=n_grid_points), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], diff --git a/tests/run_tests/sensitivity_cutoff_test.py b/tests/run_tests/sensitivity_cutoff_test.py index ae6c1cda..0453eff1 100644 --- a/tests/run_tests/sensitivity_cutoff_test.py +++ b/tests/run_tests/sensitivity_cutoff_test.py @@ -48,6 +48,9 @@ def setup_inversion_results( n_stations=n_grid_points, n_lines=n_grid_points, drape=5.0 ), mesh=MeshOptions( + u_cell_size=20.0, + v_cell_size=20.0, + w_cell_size=20.0, survey_refinement=list(refinement), topography_refinement=[0, 0, 1], plate_refinement=[1], From aab91f449ed194b818b8267cd272ba53c136ac22 Mon Sep 17 00:00:00 2001 From: benk-mira <81254271+benk-mira@users.noreply.github.com> Date: Thu, 2 Apr 2026 13:13:29 -0700 Subject: [PATCH 14/21] Update simpeg_drivers/utils/synthetics/meshes.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- simpeg_drivers/utils/synthetics/meshes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/simpeg_drivers/utils/synthetics/meshes.py b/simpeg_drivers/utils/synthetics/meshes.py index f1194b41..8b8c4002 100644 --- a/simpeg_drivers/utils/synthetics/meshes.py +++ b/simpeg_drivers/utils/synthetics/meshes.py @@ -11,10 +11,8 @@ import numpy as np from discretize import TreeMesh from discretize.utils import mesh_builder_xyz -from geoapps_utils.modelling.plates import Plate, PlateModel from geoh5py.objects import DrapeModel, Octree, Points, Surface from grid_apps.octree_creation.driver import OctreeDriver -from grid_apps.utils import treemesh_2_octree from simpeg_drivers.electricals.base_2d import create_mesh_by_line_id from simpeg_drivers.options import DrapeModelOptions From 51ee9b7db2134ecaca1b436fe366a5984da6a5a8 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 13:22:15 -0700 Subject: [PATCH 15/21] create plate on demand --- simpeg_drivers/utils/synthetics/driver.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/simpeg_drivers/utils/synthetics/driver.py b/simpeg_drivers/utils/synthetics/driver.py index 15d5a277..de78bf13 100644 --- a/simpeg_drivers/utils/synthetics/driver.py +++ b/simpeg_drivers/utils/synthetics/driver.py @@ -39,6 +39,7 @@ def __init__( self._topography: Surface | None = None self._survey: ObjectBase | None = None self._mesh: Octree | DrapeModel | None = None + self._plate: Surface | None = None self._active: FloatData | None = None self._model: FloatData | None = None @@ -71,8 +72,10 @@ def survey(self) -> ObjectBase: @property def plate(self) -> Surface | None: - plate = Plate(self.options.model.plate) - return plate.surface(self.geoh5) + if self._plate is None: + plate = Plate(self.options.model.plate) + self._plate = plate.surface(self.geoh5) + return self._plate @property def mesh(self) -> Octree | DrapeModel: From 6160b7f58f7cee08418bf2ba946f4e8411f8c256 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 2 Apr 2026 13:48:42 -0700 Subject: [PATCH 16/21] remove aliasing as it breaks tests since collect_from_dict recurses and finds 'plate' and 'overbuden' fields elsewhere in the model. --- simpeg_drivers/plate_simulation/models/options.py | 4 ++-- simpeg_drivers/utils/synthetics/driver.py | 2 +- simpeg_drivers/utils/synthetics/options.py | 13 +++++++++---- tests/plate_simulation/runtest/gravity_test.py | 6 +----- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/simpeg_drivers/plate_simulation/models/options.py b/simpeg_drivers/plate_simulation/models/options.py index fa85632c..f3248db9 100644 --- a/simpeg_drivers/plate_simulation/models/options.py +++ b/simpeg_drivers/plate_simulation/models/options.py @@ -47,7 +47,7 @@ class PlateOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "Plate" - plate_property: float = Field(validation_alias="plate") + plate_property: float geometry: PlateModel number: int = 1 spacing: float = 0.0 @@ -125,7 +125,7 @@ class OverburdenOptions(BaseModel): """ thickness: float - overburden_property: float = Field(validation_alias="overburden") + overburden_property: float class ModelOptions(BaseModel): diff --git a/simpeg_drivers/utils/synthetics/driver.py b/simpeg_drivers/utils/synthetics/driver.py index de78bf13..0a070e32 100644 --- a/simpeg_drivers/utils/synthetics/driver.py +++ b/simpeg_drivers/utils/synthetics/driver.py @@ -80,7 +80,7 @@ def plate(self) -> Surface | None: @property def mesh(self) -> Octree | DrapeModel: if self._mesh is None: - entity = self.geoh5.get_entity("mesh")[0] + entity = self.geoh5.get_entity(self.options.mesh.name)[0] if entity is None: entity = get_mesh( self.options.method, diff --git a/simpeg_drivers/utils/synthetics/options.py b/simpeg_drivers/utils/synthetics/options.py index da44bf3e..bfcd16c1 100644 --- a/simpeg_drivers/utils/synthetics/options.py +++ b/simpeg_drivers/utils/synthetics/options.py @@ -13,7 +13,8 @@ import numpy as np from geoapps_utils.modelling.plates import PlateModel from geoapps_utils.utils.locations import gaussian -from geoh5py.objects import ObjectBase, Surface +from geoh5py.objects import ObjectBase, Points, Surface +from geoh5py.shared.utils import fetch_active_workspace from grid_apps.octree_creation.options import OctreeOptions from pydantic import BaseModel, ConfigDict @@ -77,8 +78,12 @@ def octree_params( :return: OctreeOptions instance ready to be passed to an OctreeDriver. """ - shifted_survey = survey.copy() - shifted_survey.vertices = shifted_survey.vertices - np.r_[self.cell_size] / 2.0 + + locs = survey.vertices.copy() + locs = np.vstack([locs, locs - np.r_[self.cell_size] / 2]) + with fetch_active_workspace(survey.workspace) as geoh5: + survey = Points.create(geoh5, vertices=locs) + refinements = [ { "refinement_object": survey, @@ -86,7 +91,7 @@ def octree_params( "horizon": False, }, { - "refinement_object": shifted_survey, + "refinement_object": survey, "levels": self.survey_refinement, "horizon": False, }, diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 69533225..78501f06 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -55,11 +55,7 @@ def test_gravity_plate_simulation(tmp_path): plate_refinement=[4, 2], ) - overburden_params = OverburdenOptions( - thickness=50.0, - overburden=0.2, # tests alias handling - ) - assert overburden_params.overburden_property == 0.2 + overburden_params = OverburdenOptions(thickness=50.0, overburden_property=0.2) plate_params = PlateOptions( name="plate", From 1cf8dc36cd69f022f9c409b3c58d1311f4181b6b Mon Sep 17 00:00:00 2001 From: benjamink Date: Mon, 6 Apr 2026 12:16:56 -0700 Subject: [PATCH 17/21] alias plate_property and overburden_property --- simpeg_drivers/plate_simulation/driver.py | 20 ++++++------- .../plate_simulation/match/driver.py | 11 +++---- .../plate_simulation/models/options.py | 13 +++++--- tests/plate_simulation/runtest/driver_test.py | 30 +++++++++---------- .../plate_simulation/runtest/gravity_test.py | 4 +-- tests/plate_simulation/runtest/match_test.py | 4 +-- 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index cfd93f75..f02b4a64 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -131,17 +131,17 @@ def plates(self) -> list[Plate]: """Generate sequence of plates.""" if self._plates is None: offset = ( - self.params.model.overburden.thickness - if self.params.model.plate.reference_surface == "overburden" + self.params.model.overburden_options.thickness + if self.params.model.plate_options.reference_surface == "overburden" else 0.0 ) - center = self.params.model.plate.center( + center = self.params.model.plate_options.center( self.survey, self.topography, depth_offset=-1 * offset, ) plate = Plate( - self.params.model.plate.geometry.model_copy( + self.params.model.plate_options.geometry.model_copy( update={ "easting": center[0], "northing": center[1], @@ -151,9 +151,9 @@ def plates(self) -> list[Plate]: ) self._plates = self.replicate( plate, - self.params.model.plate.number, - self.params.model.plate.spacing, - self.params.model.plate.geometry.direction, + self.params.model.plate_options.number, + self.params.model.plate_options.spacing, + self.params.model.plate_options.geometry.direction, ) return self._plates @@ -206,13 +206,13 @@ def make_model(self) -> FloatData: overburden = Overburden( topography=self.simulation_parameters.active_cells.topography_object, - thickness=self.params.model.overburden.thickness, - value=self.params.model.overburden.overburden_property, + thickness=self.params.model.overburden_options.thickness, + value=self.params.model.overburden_options.overburden_property, ) dikes = DikeSwarm( [ - Anomaly(plate, self.params.model.plate.plate_property) + Anomaly(plate, self.params.model.plate_options.plate_property) for plate in self.plates ], name="plates", diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index ac858873..8db5d588 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -192,7 +192,8 @@ def _create_plate_from_parameters( """ center = self.params.survey.vertices[index_center] center[2] = ( - self._drape_heights[index_center] - model_options.overburden.thickness + self._drape_heights[index_center] + - model_options.overburden_options.thickness ) indices = self.params.survey.get_segment_indices( index_center, self.params.max_distance @@ -208,10 +209,10 @@ def _create_plate_from_parameters( "y": center[1], "z": center[2], }, - "width": model_options.plate.geometry.dip_length, - "thickness": model_options.plate.geometry.width, - "length": model_options.plate.geometry.strike_length, - "dip": model_options.plate.geometry.dip, + "width": model_options.plate_options.geometry.dip_length, + "thickness": model_options.plate_options.geometry.width, + "length": model_options.plate_options.geometry.strike_length, + "dip": model_options.plate_options.geometry.dip, "dip_direction": (azimuth + strike_angle) % 360, } ) diff --git a/simpeg_drivers/plate_simulation/models/options.py b/simpeg_drivers/plate_simulation/models/options.py index f3248db9..0014eded 100644 --- a/simpeg_drivers/plate_simulation/models/options.py +++ b/simpeg_drivers/plate_simulation/models/options.py @@ -14,6 +14,7 @@ from geoapps_utils.modelling.plates import PlateModel from geoh5py.objects import Points from pydantic import ( + AliasChoices, BaseModel, ConfigDict, Field, @@ -47,7 +48,9 @@ class PlateOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "Plate" - plate_property: float + plate_property: float = Field( + validation_alias=AliasChoices("plate_property", "plate") + ) geometry: PlateModel number: int = 1 spacing: float = 0.0 @@ -125,7 +128,9 @@ class OverburdenOptions(BaseModel): """ thickness: float - overburden_property: float + overburden_property: float = Field( + validation_alias=AliasChoices("overburden_property", "overburden") + ) class ModelOptions(BaseModel): @@ -140,5 +145,5 @@ class ModelOptions(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) background: float - overburden: OverburdenOptions - plate: PlateOptions + overburden_options: OverburdenOptions + plate_options: PlateOptions diff --git a/tests/plate_simulation/runtest/driver_test.py b/tests/plate_simulation/runtest/driver_test.py index 1af9fd2e..5d3013a7 100644 --- a/tests/plate_simulation/runtest/driver_test.py +++ b/tests/plate_simulation/runtest/driver_test.py @@ -117,20 +117,20 @@ def test_plate_simulation_params_from_input_file(tmp_path): assert not params.mesh.diagonal_balance assert isinstance(params.model, ModelOptions) - assert params.model.plate.name == "test_gravity_plate_simulation" + assert params.model.plate_options.name == "test_gravity_plate_simulation" assert params.model.background == 1000.0 - assert params.model.overburden.thickness == 50.0 - assert params.model.overburden.overburden_property == 5.0 - assert params.model.plate.plate_property == 2.0 - assert params.model.plate.geometry.width == 100.0 - assert params.model.plate.geometry.strike_length == 100.0 - assert params.model.plate.geometry.dip_length == 100.0 - assert params.model.plate.geometry.dip == 0.0 - assert params.model.plate.geometry.direction == 0.0 + assert params.model.overburden_options.thickness == 50.0 + assert params.model.overburden_options.overburden_property == 5.0 + assert params.model.plate_options.plate_property == 2.0 + assert params.model.plate_options.geometry.width == 100.0 + assert params.model.plate_options.geometry.strike_length == 100.0 + assert params.model.plate_options.geometry.dip_length == 100.0 + assert params.model.plate_options.geometry.dip == 0.0 + assert params.model.plate_options.geometry.direction == 0.0 - assert params.model.plate.number == 9 - assert params.model.plate.spacing == 10.0 - assert params.model.plate.relative_locations - assert params.model.plate.geometry.easting == 10.0 - assert params.model.plate.geometry.northing == 10.0 - assert params.model.plate.geometry.elevation == -250.0 + assert params.model.plate_options.number == 9 + assert params.model.plate_options.spacing == 10.0 + assert params.model.plate_options.relative_locations + assert params.model.plate_options.geometry.easting == 10.0 + assert params.model.plate_options.geometry.northing == 10.0 + assert params.model.plate_options.geometry.elevation == -250.0 diff --git a/tests/plate_simulation/runtest/gravity_test.py b/tests/plate_simulation/runtest/gravity_test.py index 78501f06..94399810 100644 --- a/tests/plate_simulation/runtest/gravity_test.py +++ b/tests/plate_simulation/runtest/gravity_test.py @@ -76,8 +76,8 @@ def test_gravity_plate_simulation(tmp_path): model_params = ModelOptions( name="density", background=0.0, - overburden=overburden_params, - plate=plate_params, + overburden_options=overburden_params, + plate_options=plate_params, ) options = GravityForwardOptions.build( diff --git a/tests/plate_simulation/runtest/match_test.py b/tests/plate_simulation/runtest/match_test.py index 2eb064a1..ce629a41 100644 --- a/tests/plate_simulation/runtest/match_test.py +++ b/tests/plate_simulation/runtest/match_test.py @@ -142,8 +142,8 @@ def test_matching_driver(tmp_path: Path): ifile.data["simulation"] = fwr_driver.out_group plate_options = PlateSimulationOptions.build(ifile.data) - plate_options.model.overburden.thickness = 40.0 - plate_options.model.plate.geometry.dip_length = 300.0 + plate_options.model.overburden_options.thickness = 40.0 + plate_options.model.plate_options.geometry.dip_length = 300.0 driver = PlateSimulationDriver(plate_options) driver.run() From 0dddd0b354b07097d4ec0c2a13047430b3206acc Mon Sep 17 00:00:00 2001 From: benjamink Date: Mon, 6 Apr 2026 12:17:46 -0700 Subject: [PATCH 18/21] relock --- .../py-3.12-linux-64-dev.conda.lock.yml | 16 +- environments/py-3.12-linux-64.conda.lock.yml | 10 +- .../py-3.12-win-64-dev.conda.lock.yml | 14 +- environments/py-3.12-win-64.conda.lock.yml | 8 +- .../py-3.13-linux-64-dev.conda.lock.yml | 16 +- environments/py-3.13-linux-64.conda.lock.yml | 10 +- .../py-3.13-win-64-dev.conda.lock.yml | 14 +- environments/py-3.13-win-64.conda.lock.yml | 8 +- .../py-3.14-linux-64-dev.conda.lock.yml | 16 +- environments/py-3.14-linux-64.conda.lock.yml | 10 +- .../py-3.14-win-64-dev.conda.lock.yml | 14 +- environments/py-3.14-win-64.conda.lock.yml | 8 +- py-3.12.conda-lock.yml | 238 +++++------ py-3.13.conda-lock.yml | 376 +++++++++--------- py-3.14.conda-lock.yml | 376 +++++++++--------- 15 files changed, 567 insertions(+), 567 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index b416da76..21db3393 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -44,7 +44,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py312h460c074_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyh8f84b5b_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -75,7 +75,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py312ha829cd9_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -101,8 +101,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyhc90fa1f_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -155,7 +155,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libuv=1.51.0=hb03c661_1 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 @@ -202,7 +202,7 @@ dependencies: - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - pexpect=4.9.0=pyhd8ed1ab_1 - - pillow=12.1.1=py312h50c33e8_0 + - pillow=12.2.0=py312h50c33e8_0 - pip=26.0.1=pyh8b19718_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -229,7 +229,7 @@ dependencies: - python-gil=3.12.13=hd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_h4762de1 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pyyaml=6.0.3=py312h8a5da7c_1 - pyzmq=27.1.0=py312hda471dd_2 @@ -301,7 +301,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index 56d5584e..54d56e07 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py312h2a48985_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py312ha829cd9_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - icu=75.1=he02047a_0 @@ -92,7 +92,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 @@ -118,7 +118,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py312h8ecdadd_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py312h50c33e8_0 + - pillow=12.2.0=py312h50c33e8_0 - pip=26.0.1=pyh8b19718_0 - psutil=7.2.2=py312h5253ce2_0 - pthread-stubs=0.4=hb9d3cd8_1002 @@ -131,7 +131,7 @@ dependencies: - python=3.12.13=hd63d673_0_cpython - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_h4762de1 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pyyaml=6.0.3=py312h8a5da7c_1 - qhull=2020.2=h434a139_5 @@ -169,7 +169,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 97a301aa..07f8341a 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -43,7 +43,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py312he06e257_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyha7b4d00_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -74,7 +74,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py312h5ddec8c_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -99,8 +99,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyh6dadd2b_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -183,7 +183,7 @@ dependencies: - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py312h31f0997_0 + - pillow=12.2.0=py312h31f0997_0 - pip=26.0.1=pyh8b19718_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -209,7 +209,7 @@ dependencies: - python-gil=3.12.13=hd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_hd0d704b - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pywin32=311=py312h829343e_1 - pywinpty=2.0.15=py312h275cf98_1 @@ -286,7 +286,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index e5064bd7..107d1824 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py312h7c90ba1_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py312h5ddec8c_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - importlib-metadata=8.8.0=pyhcf101f3_0 @@ -102,7 +102,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py312h95189c4_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py312h31f0997_0 + - pillow=12.2.0=py312h31f0997_0 - pip=26.0.1=pyh8b19718_0 - psutil=7.2.2=py312he5662c2_0 - pthread-stubs=0.4=h0e40799_1002 @@ -115,7 +115,7 @@ dependencies: - python=3.12.13=h0159041_0_cpython - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_hd0d704b - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pyyaml=6.0.3=py312h05f76fc_1 - qhull=2020.2=hc790b64_5 @@ -156,7 +156,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index 589e2e1e..f24320eb 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -44,7 +44,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py313hf46b229_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyh8f84b5b_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -75,7 +75,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py313h22c32d4_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -101,8 +101,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyhc90fa1f_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -155,7 +155,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libuv=1.51.0=hb03c661_1 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 @@ -201,7 +201,7 @@ dependencies: - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - pexpect=4.9.0=pyhd8ed1ab_1 - - pillow=12.1.1=py313h80991f8_0 + - pillow=12.2.0=py313h80991f8_0 - pip=26.0.1=pyh145f28c_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -228,7 +228,7 @@ dependencies: - python-gil=3.13.12=h4df99d1_100 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_h2980587 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pyyaml=6.0.3=py313h3dea7bd_1 - pyzmq=27.1.0=py312hda471dd_2 @@ -298,7 +298,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index 7b39839f..a5eebe9f 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py313h0f78c12_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py313h22c32d4_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - icu=75.1=he02047a_0 @@ -92,7 +92,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 - libxml2=2.15.1=h26afc86_0 @@ -117,7 +117,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py313hbfd7664_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py313h80991f8_0 + - pillow=12.2.0=py313h80991f8_0 - pip=26.0.1=pyh145f28c_0 - psutil=7.2.2=py313h54dd161_0 - pthread-stubs=0.4=hb9d3cd8_1002 @@ -130,7 +130,7 @@ dependencies: - python=3.13.12=hc97d973_100_cp313 - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_h2980587 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pyyaml=6.0.3=py313h3dea7bd_1 - qhull=2020.2=h434a139_5 @@ -166,7 +166,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index 224a81e4..3bd6c28e 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -43,7 +43,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py313h5ea7bf4_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyha7b4d00_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -74,7 +74,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py313hd050a09_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -99,8 +99,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyh6dadd2b_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -184,7 +184,7 @@ dependencies: - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py313h38f99e1_0 + - pillow=12.2.0=py313h38f99e1_0 - pip=26.0.1=pyh145f28c_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -210,7 +210,7 @@ dependencies: - python-gil=3.13.12=h4df99d1_100 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_h88661b0 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pywin32=311=py313h40c08fc_1 - pywinpty=2.0.15=py313h5813708_1 @@ -285,7 +285,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index c091a34c..9abd6c31 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py313hedd11bf_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py313hd050a09_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - importlib-metadata=8.8.0=pyhcf101f3_0 @@ -103,7 +103,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py313h26f5e95_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py313h38f99e1_0 + - pillow=12.2.0=py313h38f99e1_0 - pip=26.0.1=pyh145f28c_0 - psutil=7.2.2=py313h5fd188c_0 - pthread-stubs=0.4=h0e40799_1002 @@ -116,7 +116,7 @@ dependencies: - python=3.13.12=h09917c8_100_cp313 - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_h88661b0 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pyyaml=6.0.3=py313hd650c13_1 - qhull=2020.2=hc790b64_5 @@ -155,7 +155,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index b71b4876..790196a6 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -44,7 +44,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py314h4a8dc5f_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyh8f84b5b_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -75,7 +75,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py314hddf7a69_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -101,8 +101,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyhc90fa1f_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -155,7 +155,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libuv=1.51.0=hb03c661_1 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 @@ -201,7 +201,7 @@ dependencies: - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - pexpect=4.9.0=pyhd8ed1ab_1 - - pillow=12.1.1=py314h8ec4b1a_0 + - pillow=12.2.0=py314h8ec4b1a_0 - pip=26.0.1=pyh145f28c_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -228,7 +228,7 @@ dependencies: - python-gil=3.14.3=h4df99d1_101 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_hd9a44b4 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pyyaml=6.0.3=py314h67df5f8_1 - pyzmq=27.1.0=py312hda471dd_2 @@ -299,7 +299,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index f42607f3..7bb0f6db 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py314hb287c12_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py314hddf7a69_101 - - hdf5=2.1.0=nompi_hd4fcb43_103 + - hdf5=2.1.0=nompi_hd4fcb43_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - icu=75.1=he02047a_0 @@ -92,7 +92,7 @@ dependencies: - libstdcxx=15.2.0=h934c35e_18 - libstdcxx-ng=15.2.0=hdf11a46_18 - libtiff=4.7.1=h9d88235_1 - - libuuid=2.41.4=h5347b49_0 + - libuuid=2.42=h5347b49_0 - libwebp-base=1.6.0=hd42ef1d_0 - libxcb=1.17.0=h8a09558_0 - libxml2=2.15.1=h26afc86_0 @@ -117,7 +117,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py314hb4ffadd_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py314h8ec4b1a_0 + - pillow=12.2.0=py314h8ec4b1a_0 - pip=26.0.1=pyh145f28c_0 - psutil=7.2.2=py314h0f05182_0 - pthread-stubs=0.4=hb9d3cd8_1002 @@ -130,7 +130,7 @@ dependencies: - python=3.14.3=h32b2ec7_101_cp314 - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_hd9a44b4 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pyyaml=6.0.3=py314h67df5f8_1 - qhull=2020.2=h434a139_5 @@ -167,7 +167,7 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index 697dae48..b65365f8 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -43,7 +43,7 @@ dependencies: - cached_property=1.5.2=pyha770c72_1 - certifi=2026.2.25=pyhd8ed1ab_0 - cffi=2.0.0=py314h5a2d7ad_1 - - charset-normalizer=3.4.6=pyhd8ed1ab_0 + - charset-normalizer=3.4.7=pyhd8ed1ab_0 - click=8.3.1=pyha7b4d00_1 - cloudpickle=3.1.2=pyhcf101f3_1 - colorama=0.4.6=pyhd8ed1ab_1 @@ -74,7 +74,7 @@ dependencies: - h11=0.16.0=pyhcf101f3_1 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py314h02517ec_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 - httpx=0.28.1=pyhd8ed1ab_0 @@ -99,8 +99,8 @@ dependencies: - jsonschema=4.26.0=pyhcf101f3_0 - jsonschema-specifications=2025.9.1=pyhcf101f3_0 - jsonschema-with-format-nongpl=4.26.0=hcf101f3_0 - - jupyter-book=2.1.2=pyhcf101f3_0 - - jupyter-lsp=2.3.0=pyhcf101f3_0 + - jupyter-book=2.1.4=pyhcf101f3_0 + - jupyter-lsp=2.3.1=pyhcf101f3_0 - jupyter_client=8.8.0=pyhcf101f3_0 - jupyter_core=5.9.1=pyh6dadd2b_0 - jupyter_events=0.12.0=pyhe01879c_0 @@ -184,7 +184,7 @@ dependencies: - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.6=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py314h61b30b5_0 + - pillow=12.2.0=py314h61b30b5_0 - pip=26.0.1=pyh145f28c_0 - platformdirs=4.9.4=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 @@ -210,7 +210,7 @@ dependencies: - python-gil=3.14.3=h4df99d1_101 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.6=nompi_h3182675 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pywin32=311=py314h8f8f202_1 - pywinpty=2.0.15=py314h51f0985_1 @@ -286,7 +286,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 9a9635a8..69991d55 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -45,7 +45,7 @@ dependencies: - geoana=0.8.1=np2py314h1495373_0 - h2=4.3.0=pyhcf101f3_0 - h5py=3.16.0=nompi_py314h02517ec_101 - - hdf5=2.1.0=nompi_hd96b29f_103 + - hdf5=2.1.0=nompi_hd96b29f_104 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - importlib-metadata=8.8.0=pyhcf101f3_0 @@ -103,7 +103,7 @@ dependencies: - packaging=26.0=pyhcf101f3_0 - pandas=3.0.2=py314hf700ef7_0 - partd=1.4.2=pyhd8ed1ab_0 - - pillow=12.1.1=py314h61b30b5_0 + - pillow=12.2.0=py314h61b30b5_0 - pip=26.0.1=pyh145f28c_0 - psutil=7.2.2=py314hc5dbbe4_0 - pthread-stubs=0.4=h0e40799_1002 @@ -116,7 +116,7 @@ dependencies: - python=3.14.3=h4b44e0e_101_cp314 - python-dateutil=2.9.0.post0=pyhe01879c_2 - python-mumps=0.0.6=nompi_h3182675 - - python-tzdata=2025.3=pyhd8ed1ab_0 + - python-tzdata=2026.1=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pyyaml=6.0.3=py314h2359020_1 - qhull=2020.2=hc790b64_5 @@ -156,7 +156,7 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@f5eca3735bbca573f4cac3925c6f4c0c341d8e28 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@0e66e6b7a44ede34563da6a77ccd87a4cc7b5185 - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f7dd0d37aac285dd9ece26396ee39ae72bd6d18d diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 21b86ecd..00cbdfe9 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -152,7 +152,7 @@ package: dependencies: exceptiongroup: '>=1.0.2' idna: '>=2.8' - python: '' + python: '>=3.10' typing_extensions: '>=4.5' url: https://repo.prefix.dev/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda hash: @@ -240,7 +240,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' python-dateutil: '>=2.7.0' python-tzdata: '' url: https://repo.prefix.dev/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda @@ -341,7 +341,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0' url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda hash: @@ -366,7 +366,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -678,7 +678,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda hash: md5: f1976ce927373500cc19d3c0b2c85177 @@ -764,7 +764,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' webencodings: '' url: https://repo.prefix.dev/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda hash: @@ -1107,27 +1107,27 @@ package: category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: click @@ -1150,7 +1150,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda hash: md5: 6cd3ccc98bacfcc92b2bd7f236f01a7e @@ -1174,7 +1174,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda hash: md5: 61b8078a0905b12529abc622406cb62c @@ -1222,7 +1222,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda hash: md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1339,7 +1339,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda hash: md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1542,7 +1542,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda hash: md5: 080a808fce955026bf82107d955d32da @@ -1934,7 +1934,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda hash: @@ -1963,7 +1963,7 @@ package: dependencies: hpack: '>=4.1,<5' hyperframe: '>=6.1,<7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda hash: md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -2027,10 +2027,10 @@ package: libstdcxx: '>=14' libzlib: '>=1.3.2,<2.0a0' openssl: '>=3.5.5,<4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_103.conda + url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda hash: - md5: dcb50cd5fed839129afb25f1061f6b7f - sha256: 79c3592e00ce9974e3d08e4bd28bfbe9f86c03064880efe3cfcff807a633abd1 + md5: 1d92558abd05cea0577f83a5eca38733 + sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235 category: main optional: false - name: hdf5 @@ -2051,10 +2051,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_103.conda + url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda hash: - md5: df70115bbcd247880467466ce665edb2 - sha256: e5af43e16ddd9d75a1f754e022f676dcda51c09dcf2a0bf14541d1ab214773fa + md5: 37c1890c40a1514fa92ba13e27d5b1c3 + sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652 category: main optional: false - name: hpack @@ -2107,7 +2107,7 @@ package: certifi: '' h11: '>=0.16' h2: '>=3,<5' - python: '' + python: '>=3.9' sniffio: 1.* url: https://repo.prefix.dev/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda hash: @@ -2251,7 +2251,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' zipp: '>=3.20' url: https://repo.prefix.dev/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda hash: @@ -2349,7 +2349,7 @@ package: nest-asyncio: '>=1.4' packaging: '>=22' psutil: '>=5.7' - python: '' + python: '>=3.10' pyzmq: '>=25' tornado: '>=6.4.1' traitlets: '>=5.4.0' @@ -2394,7 +2394,7 @@ package: matplotlib-inline: '>=0.1.6' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.14.0' - python: '' + python: '>=3.12' stack_data: '>=0.6.0' traitlets: '>=5.13.0' url: https://repo.prefix.dev/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda @@ -2586,7 +2586,7 @@ package: platform: win-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -2660,7 +2660,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda hash: md5: 89bf346df77603055d3c8fe5811691e6 @@ -2690,7 +2690,7 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2717,7 +2717,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -2768,7 +2768,7 @@ package: category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: linux-64 dependencies: @@ -2778,14 +2778,14 @@ package: nodejs: '>=20' platformdirs: '>=4.2.2' python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: win-64 dependencies: @@ -2794,39 +2794,39 @@ package: jupyter_server: '' nodejs: '>=20' platformdirs: '>=4.2.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter_client @@ -2852,7 +2852,7 @@ package: platform: win-64 dependencies: jupyter_core: '>=5.1' - python: '' + python: '>=3.10' python-dateutil: '>=2.8.2' pyzmq: '>=25.0' tornado: '>=6.4.1' @@ -2885,7 +2885,7 @@ package: dependencies: __win: '' platformdirs: '>=2.5' - python: '' + python: '>=3.10' pywin32: '' traitlets: '>=5.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda @@ -2921,7 +2921,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2981,7 +2981,7 @@ package: overrides: '>=5.0' packaging: '>=22.0' prometheus_client: '>=0.9' - python: '' + python: '>=3.10' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' @@ -3012,7 +3012,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' terminado: '>=0.8.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda hash: @@ -3128,7 +3128,7 @@ package: jsonschema: '>=4.18' jupyter_server: '>=1.21,<3' packaging: '>=21.3' - python: '' + python: '>=3.10' requests: '>=2.31' url: https://repo.prefix.dev/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda hash: @@ -4226,16 +4226,16 @@ package: category: main optional: false - name: libuuid - version: 2.41.4 + version: '2.42' manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.41.4-h5347b49_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda hash: - md5: 2b4d2e6978dd06af374b50abca6d374b - sha256: eeadbc59678103a9405bae26f5251d744a114fcab79e79d9b68fec36c4cdb43b + md5: 38ffe67b78c9d4de527be8315e5ada2c + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 category: main optional: false - name: libuv @@ -4729,7 +4729,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda hash: @@ -4979,7 +4979,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.10' traitlets: '>=5.1' url: https://repo.prefix.dev/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda hash: @@ -5140,7 +5140,7 @@ package: jupyterlab: '>=4.5.6,<4.6' jupyterlab_server: '>=2.28.0,<3' notebook-shim: '>=0.2,<0.3' - python: '' + python: '>=3.10' tornado: '>=6.2.0' url: https://repo.prefix.dev/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda hash: @@ -5390,7 +5390,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.8' url: https://repo.prefix.dev/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda hash: md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -5497,7 +5497,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda hash: md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -5546,14 +5546,14 @@ package: category: dev optional: true - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libgcc: '>=14' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' @@ -5564,20 +5564,20 @@ package: python_abi: 3.12.* tk: '>=8.6.13,<8.7.0a0' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda hash: - md5: c5eff3ada1a829f0bdb780dc4b62bbae - sha256: 782b6b578a0e61f6ef5cca5be993d902db775a2eb3d0328a3c4ff515858e7f2c + md5: 9e5609720e31213d4f39afe377f6217e + sha256: fa291f8915114733dc1df9f1627b8c63c517217c1eee1a6ede2ceb5e368cf27a category: main optional: false - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: win-64 dependencies: lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' libwebp-base: '>=1.6.0,<2.0a0' @@ -5590,10 +5590,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.1.1-py312h31f0997_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.2.0-py312h31f0997_0.conda hash: - md5: 89bf6b6bc60f253ab85a0784417a2547 - sha256: 8d6c865052fec14dcb90b6534393a52bac60e21479ae386db7aa4eced632022d + md5: ba3bcb72a269e7751cadbdd784f84dec + sha256: ab7c254e49d0999bbfc3d3b2c76e7d5f9f831692c864c641cf10c557b727ad7e category: main optional: false - name: pip @@ -5641,7 +5641,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda hash: md5: 82c1787f2a65c0155ef9652466ee98d6 @@ -5665,7 +5665,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda hash: md5: d7585b6550ad04c8c5e21097ada2888e @@ -5833,7 +5833,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5864,7 +5864,7 @@ package: dependencies: annotated-types: '>=0.6.0' pydantic-core: 2.41.5 - python: '' + python: '>=3.10' typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' @@ -5999,7 +5999,7 @@ package: isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' - python: '' + python: '>=3.10' tomli: '>=1.1' tomlkit: '>=0.10.1' url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda @@ -6057,7 +6057,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda hash: md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -6121,7 +6121,7 @@ package: packaging: '>=22' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '' + python: '>=3.10' tomli: '>=1' url: https://repo.prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda hash: @@ -6152,7 +6152,7 @@ package: coverage: '>=7.10.6' pluggy: '>=1.2' pytest: '>=7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda hash: md5: 67d1790eefa81ed305b89d8e314c7923 @@ -6230,7 +6230,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://repo.prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -6255,7 +6255,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda hash: md5: 23029aae904a2ba587daba708208012f @@ -6350,27 +6350,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python_abi @@ -6590,7 +6590,7 @@ package: platform: win-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://repo.prefix.dev/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6623,7 +6623,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://repo.prefix.dev/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda hash: @@ -6700,7 +6700,7 @@ package: platform: win-64 dependencies: lark: '>=1.2.2' - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda hash: md5: 7234f99325263a5af6d4cd195035e8f2 @@ -6880,7 +6880,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywin32: '' url: https://repo.prefix.dev/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda hash: @@ -6929,7 +6929,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -7321,7 +7321,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda hash: md5: f88bb644823094f436792f80fba3207e @@ -7349,7 +7349,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywinpty: '>=1.1.0' tornado: '>=6.1.0' url: https://repo.prefix.dev/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda @@ -7453,7 +7453,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda hash: md5: b5325cf06a000c5b14970462ff5e4d58 @@ -7559,7 +7559,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda hash: md5: af77160f8428924c17db94e04aa69409 @@ -7683,7 +7683,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -8284,7 +8284,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda hash: md5: 30cd29cb87d819caead4d55184c1d115 @@ -8361,7 +8361,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: linux-64 dependencies: @@ -8370,16 +8370,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: win-64 dependencies: @@ -8388,12 +8388,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoh5py @@ -8436,7 +8436,7 @@ package: platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' @@ -8455,7 +8455,7 @@ package: platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index 6eaf66ee..9e25e4fa 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -137,7 +137,7 @@ package: dependencies: exceptiongroup: '>=1.0.2' idna: '>=2.8' - python: '' + python: '>=3.10' typing_extensions: '>=4.5' url: https://repo.prefix.dev/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda hash: @@ -152,7 +152,7 @@ package: dependencies: exceptiongroup: '>=1.0.2' idna: '>=2.8' - python: '' + python: '>=3.10' typing_extensions: '>=4.5' url: https://repo.prefix.dev/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda hash: @@ -226,7 +226,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' python-dateutil: '>=2.7.0' python-tzdata: '' url: https://repo.prefix.dev/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda @@ -240,7 +240,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' python-dateutil: '>=2.7.0' python-tzdata: '' url: https://repo.prefix.dev/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda @@ -328,7 +328,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0' url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda hash: @@ -341,7 +341,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0' url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda hash: @@ -354,7 +354,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -366,7 +366,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -666,7 +666,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda hash: md5: f1976ce927373500cc19d3c0b2c85177 @@ -678,7 +678,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda hash: md5: f1976ce927373500cc19d3c0b2c85177 @@ -751,7 +751,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' webencodings: '' url: https://repo.prefix.dev/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda hash: @@ -764,7 +764,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' webencodings: '' url: https://repo.prefix.dev/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda hash: @@ -1107,27 +1107,27 @@ package: category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: click @@ -1136,7 +1136,7 @@ package: platform: linux-64 dependencies: __unix: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda hash: md5: ea8a6c3256897cc31263de9f455e25d9 @@ -1150,7 +1150,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda hash: md5: 6cd3ccc98bacfcc92b2bd7f236f01a7e @@ -1162,7 +1162,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda hash: md5: 61b8078a0905b12529abc622406cb62c @@ -1174,7 +1174,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda hash: md5: 61b8078a0905b12529abc622406cb62c @@ -1210,7 +1210,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda hash: md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1222,7 +1222,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda hash: md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1327,7 +1327,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda hash: md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1339,7 +1339,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda hash: md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1530,7 +1530,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda hash: md5: 080a808fce955026bf82107d955d32da @@ -1542,7 +1542,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda hash: md5: 080a808fce955026bf82107d955d32da @@ -1557,7 +1557,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -1572,7 +1572,7 @@ package: manager: conda platform: win-64 dependencies: - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -1885,7 +1885,7 @@ package: libdlf: '' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.22' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -1901,7 +1901,7 @@ package: platform: win-64 dependencies: libdlf: '' - numpy: '>=1.23,<3' + numpy: '>=1.22' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -1919,7 +1919,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda hash: @@ -1932,7 +1932,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda hash: @@ -1947,7 +1947,7 @@ package: dependencies: hpack: '>=4.1,<5' hyperframe: '>=6.1,<7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda hash: md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -1961,7 +1961,7 @@ package: dependencies: hpack: '>=4.1,<5' hyperframe: '>=6.1,<7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda hash: md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -2025,10 +2025,10 @@ package: libstdcxx: '>=14' libzlib: '>=1.3.2,<2.0a0' openssl: '>=3.5.5,<4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_103.conda + url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda hash: - md5: dcb50cd5fed839129afb25f1061f6b7f - sha256: 79c3592e00ce9974e3d08e4bd28bfbe9f86c03064880efe3cfcff807a633abd1 + md5: 1d92558abd05cea0577f83a5eca38733 + sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235 category: main optional: false - name: hdf5 @@ -2049,10 +2049,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_103.conda + url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda hash: - md5: df70115bbcd247880467466ce665edb2 - sha256: e5af43e16ddd9d75a1f754e022f676dcda51c09dcf2a0bf14541d1ab214773fa + md5: 37c1890c40a1514fa92ba13e27d5b1c3 + sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652 category: main optional: false - name: hpack @@ -2088,7 +2088,7 @@ package: certifi: '' h11: '>=0.16' h2: '>=3,<5' - python: '' + python: '>=3.9' sniffio: 1.* url: https://repo.prefix.dev/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda hash: @@ -2105,7 +2105,7 @@ package: certifi: '' h11: '>=0.16' h2: '>=3,<5' - python: '' + python: '>=3.9' sniffio: 1.* url: https://repo.prefix.dev/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda hash: @@ -2236,7 +2236,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' zipp: '>=3.20' url: https://repo.prefix.dev/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda hash: @@ -2249,7 +2249,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' zipp: '>=3.20' url: https://repo.prefix.dev/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda hash: @@ -2322,7 +2322,7 @@ package: nest-asyncio: '>=1.4' packaging: '>=22' psutil: '>=5.7' - python: '' + python: '>=3.10' pyzmq: '>=25' tornado: '>=6.4.1' traitlets: '>=5.4.0' @@ -2347,7 +2347,7 @@ package: nest-asyncio: '>=1.4' packaging: '>=22' psutil: '>=5.7' - python: '' + python: '>=3.10' pyzmq: '>=25' tornado: '>=6.4.1' traitlets: '>=5.4.0' @@ -2370,7 +2370,7 @@ package: pexpect: '>4.6' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.14.0' - python: '' + python: '>=3.12' stack_data: '>=0.6.0' traitlets: '>=5.13.0' url: https://repo.prefix.dev/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda @@ -2392,7 +2392,7 @@ package: matplotlib-inline: '>=0.1.6' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.14.0' - python: '' + python: '>=3.12' stack_data: '>=0.6.0' traitlets: '>=5.13.0' url: https://repo.prefix.dev/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda @@ -2571,7 +2571,7 @@ package: platform: linux-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -2584,7 +2584,7 @@ package: platform: win-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -2646,7 +2646,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda hash: md5: 89bf346df77603055d3c8fe5811691e6 @@ -2658,7 +2658,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda hash: md5: 89bf346df77603055d3c8fe5811691e6 @@ -2672,7 +2672,7 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2688,7 +2688,7 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2702,7 +2702,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -2715,7 +2715,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -2766,7 +2766,7 @@ package: category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: linux-64 dependencies: @@ -2775,15 +2775,15 @@ package: jupyter_server: '' nodejs: '>=20' platformdirs: '>=4.2.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: win-64 dependencies: @@ -2792,39 +2792,39 @@ package: jupyter_server: '' nodejs: '>=20' platformdirs: '>=4.2.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter_client @@ -2833,7 +2833,7 @@ package: platform: linux-64 dependencies: jupyter_core: '>=5.1' - python: '' + python: '>=3.10' python-dateutil: '>=2.8.2' pyzmq: '>=25.0' tornado: '>=6.4.1' @@ -2850,7 +2850,7 @@ package: platform: win-64 dependencies: jupyter_core: '>=5.1' - python: '' + python: '>=3.10' python-dateutil: '>=2.8.2' pyzmq: '>=25.0' tornado: '>=6.4.1' @@ -2883,7 +2883,7 @@ package: dependencies: __win: '' platformdirs: '>=2.5' - python: '' + python: '>=3.10' pywin32: '' traitlets: '>=5.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda @@ -2899,7 +2899,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2919,7 +2919,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2949,7 +2949,7 @@ package: overrides: '>=5.0' packaging: '>=22.0' prometheus_client: '>=0.9' - python: '' + python: '>=3.10' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' @@ -2979,7 +2979,7 @@ package: overrides: '>=5.0' packaging: '>=22.0' prometheus_client: '>=0.9' - python: '' + python: '>=3.10' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' @@ -2997,7 +2997,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' terminado: '>=0.8.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda hash: @@ -3010,7 +3010,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' terminado: '>=0.8.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda hash: @@ -3107,7 +3107,7 @@ package: jsonschema: '>=4.18' jupyter_server: '>=1.21,<3' packaging: '>=21.3' - python: '' + python: '>=3.10' requests: '>=2.31' url: https://repo.prefix.dev/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda hash: @@ -3126,7 +3126,7 @@ package: jsonschema: '>=4.18' jupyter_server: '>=1.21,<3' packaging: '>=21.3' - python: '' + python: '>=3.10' requests: '>=2.31' url: https://repo.prefix.dev/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda hash: @@ -4238,16 +4238,16 @@ package: category: main optional: false - name: libuuid - version: 2.41.4 + version: '2.42' manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.41.4-h5347b49_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda hash: - md5: 2b4d2e6978dd06af374b50abca6d374b - sha256: eeadbc59678103a9405bae26f5251d744a114fcab79e79d9b68fec36c4cdb43b + md5: 38ffe67b78c9d4de527be8315e5ada2c + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 category: main optional: false - name: libuv @@ -4553,7 +4553,7 @@ package: libfreetype6: '>=2.14.1' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.23' packaging: '>=20.0' pillow: '>=8' pyparsing: '>=2.3.1' @@ -4580,7 +4580,7 @@ package: kiwisolver: '>=1.3.1' libfreetype: '>=2.14.1' libfreetype6: '>=2.14.1' - numpy: '>=1.23,<3' + numpy: '>=1.23' packaging: '>=20.0' pillow: '>=8' pyparsing: '>=2.3.1' @@ -4716,7 +4716,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda hash: @@ -4729,7 +4729,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda hash: @@ -4743,7 +4743,7 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - _openmp_mutex: '>=4.5' + _openmp_mutex: '*' libgcc: '>=14' libstdcxx: '>=14' llvm-openmp: '>=22.1.1' @@ -4952,7 +4952,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.10' traitlets: '>=5.1' url: https://repo.prefix.dev/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda hash: @@ -4979,7 +4979,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.10' traitlets: '>=5.1' url: https://repo.prefix.dev/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda hash: @@ -5122,7 +5122,7 @@ package: jupyterlab: '>=4.5.6,<4.6' jupyterlab_server: '>=2.28.0,<3' notebook-shim: '>=0.2,<0.3' - python: '' + python: '>=3.10' tornado: '>=6.2.0' url: https://repo.prefix.dev/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda hash: @@ -5140,7 +5140,7 @@ package: jupyterlab: '>=4.5.6,<4.6' jupyterlab_server: '>=2.28.0,<3' notebook-shim: '>=0.2,<0.3' - python: '' + python: '>=3.10' tornado: '>=6.2.0' url: https://repo.prefix.dev/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda hash: @@ -5378,7 +5378,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.8' url: https://repo.prefix.dev/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda hash: md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -5390,7 +5390,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.8' url: https://repo.prefix.dev/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda hash: md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -5405,7 +5405,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.26.0' python: '' python-dateutil: '>=2.8.2' python_abi: 3.13.* @@ -5420,7 +5420,7 @@ package: manager: conda platform: win-64 dependencies: - numpy: '>=1.23,<3' + numpy: '>=1.26.0' python: '' python-dateutil: '>=2.8.2' python-tzdata: '' @@ -5485,7 +5485,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda hash: md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -5497,7 +5497,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda hash: md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -5546,14 +5546,14 @@ package: category: dev optional: true - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libgcc: '>=14' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' @@ -5564,20 +5564,20 @@ package: python_abi: 3.13.* tk: '>=8.6.13,<8.7.0a0' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.1.1-py313h80991f8_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda hash: - md5: 2d5ee4938cdde91a8967f3eea686c546 - sha256: 50738b145a45db78ec12ffebf649127d53e1777166c5c3b006476890250ac265 + md5: 7245f1bbf52ed5e3818d742f51b44a7d + sha256: 55a76548bb003ff6deac9bf209b279d428030f230632fb70f15ae153aed05158 category: main optional: false - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: win-64 dependencies: lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' libwebp-base: '>=1.6.0,<2.0a0' @@ -5590,10 +5590,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.1.1-py313h38f99e1_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.2.0-py313h38f99e1_0.conda hash: - md5: 41b079447f12baa3852549e1f3a072d2 - sha256: ee2384117c93c0386874ba526a12f60b8f2c700b7cb912e899c62f41927c1666 + md5: 72666a34e563494859af5c5fc10364a0 + sha256: 54df76a56eff31deab5e72350ca906c79dfb71f0ac9d84bf2f7420ab2ee00151 category: main optional: false - name: pip @@ -5625,7 +5625,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda hash: md5: 82c1787f2a65c0155ef9652466ee98d6 @@ -5637,7 +5637,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda hash: md5: 82c1787f2a65c0155ef9652466ee98d6 @@ -5649,7 +5649,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda hash: md5: d7585b6550ad04c8c5e21097ada2888e @@ -5661,7 +5661,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda hash: md5: d7585b6550ad04c8c5e21097ada2888e @@ -5817,7 +5817,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5829,7 +5829,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5843,7 +5843,7 @@ package: dependencies: annotated-types: '>=0.6.0' pydantic-core: 2.41.5 - python: '' + python: '>=3.10' typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' @@ -5860,7 +5860,7 @@ package: dependencies: annotated-types: '>=0.6.0' pydantic-core: 2.41.5 - python: '' + python: '>=3.10' typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' @@ -5911,7 +5911,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' mkl: '>=2025.3.0,<2026.0a0' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -5927,7 +5927,7 @@ package: platform: win-64 dependencies: mkl: '>=2025.3.0,<2026.0a0' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.13.* scipy: '>=1.12' @@ -5975,7 +5975,7 @@ package: isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' - python: '' + python: '>=3.10' tomli: '>=1.1' tomlkit: '>=0.10.1' url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda @@ -5995,7 +5995,7 @@ package: isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' - python: '' + python: '>=3.10' tomli: '>=1.1' tomlkit: '>=0.10.1' url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda @@ -6041,7 +6041,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda hash: md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -6053,7 +6053,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda hash: md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -6098,7 +6098,7 @@ package: packaging: '>=22' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '' + python: '>=3.10' tomli: '>=1' url: https://repo.prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda hash: @@ -6117,7 +6117,7 @@ package: packaging: '>=22' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '' + python: '>=3.10' tomli: '>=1' url: https://repo.prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda hash: @@ -6133,7 +6133,7 @@ package: coverage: '>=7.10.6' pluggy: '>=1.2' pytest: '>=7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda hash: md5: 67d1790eefa81ed305b89d8e314c7923 @@ -6148,7 +6148,7 @@ package: coverage: '>=7.10.6' pluggy: '>=1.2' pytest: '>=7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda hash: md5: 67d1790eefa81ed305b89d8e314c7923 @@ -6215,7 +6215,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://repo.prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -6228,7 +6228,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://repo.prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -6241,7 +6241,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda hash: md5: 23029aae904a2ba587daba708208012f @@ -6253,7 +6253,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda hash: md5: 23029aae904a2ba587daba708208012f @@ -6348,27 +6348,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python_abi @@ -6573,7 +6573,7 @@ package: platform: linux-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://repo.prefix.dev/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6588,7 +6588,7 @@ package: platform: win-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://repo.prefix.dev/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6605,7 +6605,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://repo.prefix.dev/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda hash: @@ -6621,7 +6621,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://repo.prefix.dev/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda hash: @@ -6685,7 +6685,7 @@ package: platform: linux-64 dependencies: lark: '>=1.2.2' - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda hash: md5: 7234f99325263a5af6d4cd195035e8f2 @@ -6698,7 +6698,7 @@ package: platform: win-64 dependencies: lark: '>=1.2.2' - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda hash: md5: 7234f99325263a5af6d4cd195035e8f2 @@ -6786,7 +6786,7 @@ package: joblib: '>=1.3.0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.24.1' python: '' python_abi: 3.13.* scipy: '>=1.10.0' @@ -6803,7 +6803,7 @@ package: platform: win-64 dependencies: joblib: '>=1.3.0' - numpy: '>=1.23,<3' + numpy: '>=1.24.1' python: '' python_abi: 3.13.* scipy: '>=1.10.0' @@ -6830,7 +6830,7 @@ package: libgfortran5: '>=14.3.0' liblapack: '>=3.9.0,<4.0a0' libstdcxx: '>=14' - numpy: '>=1.25.2' + numpy: <2.7 python: '>=3.13,<3.14.0a0' python_abi: 3.13.* url: https://repo.prefix.dev/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda @@ -6847,7 +6847,7 @@ package: libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - numpy: '>=1.25.2' + numpy: <2.7 python: '>=3.13,<3.14.0a0' python_abi: 3.13.* ucrt: '>=10.0.20348.0' @@ -6865,7 +6865,7 @@ package: platform: linux-64 dependencies: __linux: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda hash: md5: 28eb91468df04f655a57bcfbb35fc5c5 @@ -6878,7 +6878,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywin32: '' url: https://repo.prefix.dev/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda hash: @@ -6915,7 +6915,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -6927,7 +6927,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -7307,7 +7307,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda hash: md5: f88bb644823094f436792f80fba3207e @@ -7319,7 +7319,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda hash: md5: f88bb644823094f436792f80fba3207e @@ -7333,7 +7333,7 @@ package: dependencies: __unix: '' ptyprocess: '' - python: '' + python: '>=3.10' tornado: '>=6.1.0' url: https://repo.prefix.dev/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda hash: @@ -7347,7 +7347,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywinpty: '>=1.1.0' tornado: '>=6.1.0' url: https://repo.prefix.dev/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda @@ -7439,7 +7439,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda hash: md5: b5325cf06a000c5b14970462ff5e4d58 @@ -7451,7 +7451,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda hash: md5: b5325cf06a000c5b14970462ff5e4d58 @@ -7543,7 +7543,7 @@ package: platform: linux-64 dependencies: __unix: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda hash: md5: e5ce43272193b38c2e9037446c1d9206 @@ -7557,7 +7557,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda hash: md5: af77160f8428924c17db94e04aa69409 @@ -7669,7 +7669,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -7681,7 +7681,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -8213,7 +8213,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda hash: md5: 30cd29cb87d819caead4d55184c1d115 @@ -8225,7 +8225,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda hash: md5: 30cd29cb87d819caead4d55184c1d115 @@ -8302,7 +8302,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: linux-64 dependencies: @@ -8311,16 +8311,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: win-64 dependencies: @@ -8329,12 +8329,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoh5py @@ -8377,7 +8377,7 @@ package: platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' @@ -8396,7 +8396,7 @@ package: platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index 149dfa99..dc67c8f3 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -137,7 +137,7 @@ package: dependencies: exceptiongroup: '>=1.0.2' idna: '>=2.8' - python: '' + python: '>=3.10' typing_extensions: '>=4.5' url: https://repo.prefix.dev/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda hash: @@ -152,7 +152,7 @@ package: dependencies: exceptiongroup: '>=1.0.2' idna: '>=2.8' - python: '' + python: '>=3.10' typing_extensions: '>=4.5' url: https://repo.prefix.dev/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda hash: @@ -226,7 +226,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' python-dateutil: '>=2.7.0' python-tzdata: '' url: https://repo.prefix.dev/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda @@ -240,7 +240,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' python-dateutil: '>=2.7.0' python-tzdata: '' url: https://repo.prefix.dev/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda @@ -328,7 +328,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0' url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda hash: @@ -341,7 +341,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0' url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda hash: @@ -354,7 +354,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -366,7 +366,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -666,7 +666,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda hash: md5: f1976ce927373500cc19d3c0b2c85177 @@ -678,7 +678,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda hash: md5: f1976ce927373500cc19d3c0b2c85177 @@ -742,7 +742,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' webencodings: '' url: https://repo.prefix.dev/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda hash: @@ -755,7 +755,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' webencodings: '' url: https://repo.prefix.dev/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda hash: @@ -1098,27 +1098,27 @@ package: category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: charset-normalizer - version: 3.4.6 + version: 3.4.7 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda hash: - md5: 49ee13eb9b8f44d63879c69b8a40a74b - sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: a9167b9571f3baa9d448faa2139d1089 + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 category: dev optional: true - name: click @@ -1127,7 +1127,7 @@ package: platform: linux-64 dependencies: __unix: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda hash: md5: ea8a6c3256897cc31263de9f455e25d9 @@ -1141,7 +1141,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda hash: md5: 6cd3ccc98bacfcc92b2bd7f236f01a7e @@ -1153,7 +1153,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda hash: md5: 61b8078a0905b12529abc622406cb62c @@ -1165,7 +1165,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda hash: md5: 61b8078a0905b12529abc622406cb62c @@ -1201,7 +1201,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda hash: md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1213,7 +1213,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda hash: md5: 2da13f2b299d8e1995bafbbe9689a2f7 @@ -1318,7 +1318,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda hash: md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1330,7 +1330,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda hash: md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1521,7 +1521,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda hash: md5: 080a808fce955026bf82107d955d32da @@ -1533,7 +1533,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda hash: md5: 080a808fce955026bf82107d955d32da @@ -1548,7 +1548,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -1563,7 +1563,7 @@ package: manager: conda platform: win-64 dependencies: - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -1871,7 +1871,7 @@ package: libdlf: '' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.22' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -1887,7 +1887,7 @@ package: platform: win-64 dependencies: libdlf: '' - numpy: '>=1.23,<3' + numpy: '>=1.22' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -1905,7 +1905,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda hash: @@ -1918,7 +1918,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda hash: @@ -1933,7 +1933,7 @@ package: dependencies: hpack: '>=4.1,<5' hyperframe: '>=6.1,<7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda hash: md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -1947,7 +1947,7 @@ package: dependencies: hpack: '>=4.1,<5' hyperframe: '>=6.1,<7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda hash: md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -2011,10 +2011,10 @@ package: libstdcxx: '>=14' libzlib: '>=1.3.2,<2.0a0' openssl: '>=3.5.5,<4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_103.conda + url: https://repo.prefix.dev/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda hash: - md5: dcb50cd5fed839129afb25f1061f6b7f - sha256: 79c3592e00ce9974e3d08e4bd28bfbe9f86c03064880efe3cfcff807a633abd1 + md5: 1d92558abd05cea0577f83a5eca38733 + sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235 category: main optional: false - name: hdf5 @@ -2035,10 +2035,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_103.conda + url: https://repo.prefix.dev/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda hash: - md5: df70115bbcd247880467466ce665edb2 - sha256: e5af43e16ddd9d75a1f754e022f676dcda51c09dcf2a0bf14541d1ab214773fa + md5: 37c1890c40a1514fa92ba13e27d5b1c3 + sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652 category: main optional: false - name: hpack @@ -2074,7 +2074,7 @@ package: certifi: '' h11: '>=0.16' h2: '>=3,<5' - python: '' + python: '>=3.9' sniffio: 1.* url: https://repo.prefix.dev/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda hash: @@ -2091,7 +2091,7 @@ package: certifi: '' h11: '>=0.16' h2: '>=3,<5' - python: '' + python: '>=3.9' sniffio: 1.* url: https://repo.prefix.dev/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda hash: @@ -2222,7 +2222,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' zipp: '>=3.20' url: https://repo.prefix.dev/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda hash: @@ -2235,7 +2235,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' zipp: '>=3.20' url: https://repo.prefix.dev/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda hash: @@ -2308,7 +2308,7 @@ package: nest-asyncio: '>=1.4' packaging: '>=22' psutil: '>=5.7' - python: '' + python: '>=3.10' pyzmq: '>=25' tornado: '>=6.4.1' traitlets: '>=5.4.0' @@ -2333,7 +2333,7 @@ package: nest-asyncio: '>=1.4' packaging: '>=22' psutil: '>=5.7' - python: '' + python: '>=3.10' pyzmq: '>=25' tornado: '>=6.4.1' traitlets: '>=5.4.0' @@ -2356,7 +2356,7 @@ package: pexpect: '>4.6' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.14.0' - python: '' + python: '>=3.12' stack_data: '>=0.6.0' traitlets: '>=5.13.0' url: https://repo.prefix.dev/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda @@ -2378,7 +2378,7 @@ package: matplotlib-inline: '>=0.1.6' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.14.0' - python: '' + python: '>=3.12' stack_data: '>=0.6.0' traitlets: '>=5.13.0' url: https://repo.prefix.dev/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda @@ -2557,7 +2557,7 @@ package: platform: linux-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -2570,7 +2570,7 @@ package: platform: win-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -2632,7 +2632,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda hash: md5: 89bf346df77603055d3c8fe5811691e6 @@ -2644,7 +2644,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda hash: md5: 89bf346df77603055d3c8fe5811691e6 @@ -2658,7 +2658,7 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2674,7 +2674,7 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2688,7 +2688,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -2701,7 +2701,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://repo.prefix.dev/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -2752,7 +2752,7 @@ package: category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: linux-64 dependencies: @@ -2761,15 +2761,15 @@ package: jupyter_server: '' nodejs: '>=20' platformdirs: '>=4.2.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-book - version: 2.1.2 + version: 2.1.4 manager: conda platform: win-64 dependencies: @@ -2778,39 +2778,39 @@ package: jupyter_server: '' nodejs: '>=20' platformdirs: '>=4.2.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-book-2.1.4-pyhcf101f3_0.conda hash: - md5: e1b35482145a0ad4ff458d5803ebb158 - sha256: 3115312e6658e2b76e55073a0f9f14fe635f778c37aa568dfc6d4fc6a6b970bb + md5: 6466d205c69ad4f33ac9100a93af55b5 + sha256: 19933f74b3dd88aaafb4ee0ee2051c9c1b2db9c77862731a381bc59c800596b4 category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter-lsp - version: 2.3.0 + version: 2.3.1 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.8.3' jupyter_server: '>=1.1.2' - python: '' - url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda hash: - md5: 62b7c96c6cd77f8173cc5cada6a9acaa - sha256: 897ad2e2c2335ef3c2826d7805e16002a1fd0d509b4ae0bc66617f0e0ff07bc2 + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e category: dev optional: true - name: jupyter_client @@ -2819,7 +2819,7 @@ package: platform: linux-64 dependencies: jupyter_core: '>=5.1' - python: '' + python: '>=3.10' python-dateutil: '>=2.8.2' pyzmq: '>=25.0' tornado: '>=6.4.1' @@ -2836,7 +2836,7 @@ package: platform: win-64 dependencies: jupyter_core: '>=5.1' - python: '' + python: '>=3.10' python-dateutil: '>=2.8.2' pyzmq: '>=25.0' tornado: '>=6.4.1' @@ -2869,7 +2869,7 @@ package: dependencies: __win: '' platformdirs: '>=2.5' - python: '' + python: '>=3.10' pywin32: '' traitlets: '>=5.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda @@ -2885,7 +2885,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2905,7 +2905,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2935,7 +2935,7 @@ package: overrides: '>=5.0' packaging: '>=22.0' prometheus_client: '>=0.9' - python: '' + python: '>=3.10' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' @@ -2965,7 +2965,7 @@ package: overrides: '>=5.0' packaging: '>=22.0' prometheus_client: '>=0.9' - python: '' + python: '>=3.10' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' @@ -2983,7 +2983,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' terminado: '>=0.8.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda hash: @@ -2996,7 +2996,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' terminado: '>=0.8.3' url: https://repo.prefix.dev/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda hash: @@ -3093,7 +3093,7 @@ package: jsonschema: '>=4.18' jupyter_server: '>=1.21,<3' packaging: '>=21.3' - python: '' + python: '>=3.10' requests: '>=2.31' url: https://repo.prefix.dev/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda hash: @@ -3112,7 +3112,7 @@ package: jsonschema: '>=4.18' jupyter_server: '>=1.21,<3' packaging: '>=21.3' - python: '' + python: '>=3.10' requests: '>=2.31' url: https://repo.prefix.dev/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda hash: @@ -4224,16 +4224,16 @@ package: category: main optional: false - name: libuuid - version: 2.41.4 + version: '2.42' manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.41.4-h5347b49_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda hash: - md5: 2b4d2e6978dd06af374b50abca6d374b - sha256: eeadbc59678103a9405bae26f5251d744a114fcab79e79d9b68fec36c4cdb43b + md5: 38ffe67b78c9d4de527be8315e5ada2c + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 category: main optional: false - name: libuv @@ -4539,7 +4539,7 @@ package: libfreetype6: '>=2.14.1' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.23' packaging: '>=20.0' pillow: '>=8' pyparsing: '>=2.3.1' @@ -4566,7 +4566,7 @@ package: kiwisolver: '>=1.3.1' libfreetype: '>=2.14.1' libfreetype6: '>=2.14.1' - numpy: '>=1.23,<3' + numpy: '>=1.23' packaging: '>=20.0' pillow: '>=8' pyparsing: '>=2.3.1' @@ -4702,7 +4702,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda hash: @@ -4715,7 +4715,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' typing_extensions: '' url: https://repo.prefix.dev/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda hash: @@ -4729,7 +4729,7 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - _openmp_mutex: '>=4.5' + _openmp_mutex: '*' libgcc: '>=14' libstdcxx: '>=14' llvm-openmp: '>=22.1.1' @@ -4938,7 +4938,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.10' traitlets: '>=5.1' url: https://repo.prefix.dev/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda hash: @@ -4965,7 +4965,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.10' traitlets: '>=5.1' url: https://repo.prefix.dev/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda hash: @@ -5108,7 +5108,7 @@ package: jupyterlab: '>=4.5.6,<4.6' jupyterlab_server: '>=2.28.0,<3' notebook-shim: '>=0.2,<0.3' - python: '' + python: '>=3.10' tornado: '>=6.2.0' url: https://repo.prefix.dev/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda hash: @@ -5126,7 +5126,7 @@ package: jupyterlab: '>=4.5.6,<4.6' jupyterlab_server: '>=2.28.0,<3' notebook-shim: '>=0.2,<0.3' - python: '' + python: '>=3.10' tornado: '>=6.2.0' url: https://repo.prefix.dev/conda-forge/noarch/notebook-7.5.5-pyhcf101f3_0.conda hash: @@ -5364,7 +5364,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.8' url: https://repo.prefix.dev/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda hash: md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -5376,7 +5376,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.8' url: https://repo.prefix.dev/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda hash: md5: b76541e68fea4d511b1ac46a28dcd2c6 @@ -5391,7 +5391,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.26.0' python: '' python-dateutil: '>=2.8.2' python_abi: 3.14.* @@ -5406,7 +5406,7 @@ package: manager: conda platform: win-64 dependencies: - numpy: '>=1.23,<3' + numpy: '>=1.26.0' python: '' python-dateutil: '>=2.8.2' python-tzdata: '' @@ -5471,7 +5471,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda hash: md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -5483,7 +5483,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda hash: md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -5532,14 +5532,14 @@ package: category: dev optional: true - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libgcc: '>=14' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' @@ -5550,20 +5550,20 @@ package: python_abi: 3.14.* tk: '>=8.6.13,<8.7.0a0' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda hash: - md5: 79678378ae235e24b3aa83cee1b38207 - sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee + md5: 76c4757c0ec9d11f969e8eb44899307b + sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e category: main optional: false - name: pillow - version: 12.1.1 + version: 12.2.0 manager: conda platform: win-64 dependencies: lcms2: '>=2.18,<3.0a0' - libfreetype: '>=2.14.1' - libfreetype6: '>=2.14.1' + libfreetype: '>=2.14.3' + libfreetype6: '>=2.14.3' libjpeg-turbo: '>=3.1.2,<4.0a0' libtiff: '>=4.7.1,<4.8.0a0' libwebp-base: '>=1.6.0,<2.0a0' @@ -5576,10 +5576,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zlib-ng: '>=2.3.3,<2.4.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.1.1-py314h61b30b5_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pillow-12.2.0-py314h61b30b5_0.conda hash: - md5: 819c3d15988cea0f2c599b405023f55d - sha256: f4387e480970e0f429a0505d668bc677e84ef118d3db2cba56b547d1bd2c2dbf + md5: 23ce08e46c625eb523ffef8939cb3ca9 + sha256: d122b2a91402d72cf7f9d256e805e3533b2cf307c067e0072d9cc83ae789da48 category: main optional: false - name: pip @@ -5611,7 +5611,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda hash: md5: 82c1787f2a65c0155ef9652466ee98d6 @@ -5623,7 +5623,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda hash: md5: 82c1787f2a65c0155ef9652466ee98d6 @@ -5635,7 +5635,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda hash: md5: d7585b6550ad04c8c5e21097ada2888e @@ -5647,7 +5647,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda hash: md5: d7585b6550ad04c8c5e21097ada2888e @@ -5803,7 +5803,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5815,7 +5815,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5829,7 +5829,7 @@ package: dependencies: annotated-types: '>=0.6.0' pydantic-core: 2.41.5 - python: '' + python: '>=3.10' typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' @@ -5846,7 +5846,7 @@ package: dependencies: annotated-types: '>=0.6.0' pydantic-core: 2.41.5 - python: '' + python: '>=3.10' typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' @@ -5897,7 +5897,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' mkl: '>=2025.3.0,<2026.0a0' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -5913,7 +5913,7 @@ package: platform: win-64 dependencies: mkl: '>=2025.3.0,<2026.0a0' - numpy: '>=1.23,<3' + numpy: '>=1.22.4' python: '' python_abi: 3.14.* scipy: '>=1.12' @@ -5961,7 +5961,7 @@ package: isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' - python: '' + python: '>=3.10' tomli: '>=1.1' tomlkit: '>=0.10.1' url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda @@ -5981,7 +5981,7 @@ package: isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' - python: '' + python: '>=3.10' tomli: '>=1.1' tomlkit: '>=0.10.1' url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda @@ -6027,7 +6027,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda hash: md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -6039,7 +6039,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda hash: md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -6084,7 +6084,7 @@ package: packaging: '>=22' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '' + python: '>=3.10' tomli: '>=1' url: https://repo.prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda hash: @@ -6103,7 +6103,7 @@ package: packaging: '>=22' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '' + python: '>=3.10' tomli: '>=1' url: https://repo.prefix.dev/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda hash: @@ -6119,7 +6119,7 @@ package: coverage: '>=7.10.6' pluggy: '>=1.2' pytest: '>=7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda hash: md5: 67d1790eefa81ed305b89d8e314c7923 @@ -6134,7 +6134,7 @@ package: coverage: '>=7.10.6' pluggy: '>=1.2' pytest: '>=7' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda hash: md5: 67d1790eefa81ed305b89d8e314c7923 @@ -6203,7 +6203,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://repo.prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -6216,7 +6216,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://repo.prefix.dev/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -6229,7 +6229,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda hash: md5: 23029aae904a2ba587daba708208012f @@ -6241,7 +6241,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda hash: md5: 23029aae904a2ba587daba708208012f @@ -6336,27 +6336,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python-tzdata - version: '2025.3' + version: '2026.1' manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/python-tzdata-2026.1-pyhd8ed1ab_0.conda hash: - md5: 7ead57407430ba33f681738905278d03 - sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: d8d30923ccee7525704599efd722aa16 + sha256: b5494ef54bc2394c6c4766ceeafac22507c4fc60de6cbfda45524fc2fcc3c9fc category: main optional: false - name: python_abi @@ -6561,7 +6561,7 @@ package: platform: linux-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://repo.prefix.dev/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6576,7 +6576,7 @@ package: platform: win-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://repo.prefix.dev/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -6593,7 +6593,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://repo.prefix.dev/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda hash: @@ -6609,7 +6609,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://repo.prefix.dev/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda hash: @@ -6673,7 +6673,7 @@ package: platform: linux-64 dependencies: lark: '>=1.2.2' - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda hash: md5: 7234f99325263a5af6d4cd195035e8f2 @@ -6686,7 +6686,7 @@ package: platform: win-64 dependencies: lark: '>=1.2.2' - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda hash: md5: 7234f99325263a5af6d4cd195035e8f2 @@ -6774,7 +6774,7 @@ package: joblib: '>=1.3.0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.24.1' python: '' python_abi: 3.14.* scipy: '>=1.10.0' @@ -6791,7 +6791,7 @@ package: platform: win-64 dependencies: joblib: '>=1.3.0' - numpy: '>=1.23,<3' + numpy: '>=1.24.1' python: '' python_abi: 3.14.* scipy: '>=1.10.0' @@ -6818,7 +6818,7 @@ package: libgfortran5: '>=14.3.0' liblapack: '>=3.9.0,<4.0a0' libstdcxx: '>=14' - numpy: '>=1.25.2' + numpy: <2.7 python: '>=3.14,<3.15.0a0' python_abi: 3.14.* url: https://repo.prefix.dev/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda @@ -6835,7 +6835,7 @@ package: libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - numpy: '>=1.25.2' + numpy: <2.7 python: '>=3.14,<3.15.0a0' python_abi: 3.14.* ucrt: '>=10.0.20348.0' @@ -6853,7 +6853,7 @@ package: platform: linux-64 dependencies: __linux: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda hash: md5: 28eb91468df04f655a57bcfbb35fc5c5 @@ -6866,7 +6866,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywin32: '' url: https://repo.prefix.dev/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda hash: @@ -6903,7 +6903,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -6915,7 +6915,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://repo.prefix.dev/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -7295,7 +7295,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda hash: md5: f88bb644823094f436792f80fba3207e @@ -7307,7 +7307,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda hash: md5: f88bb644823094f436792f80fba3207e @@ -7321,7 +7321,7 @@ package: dependencies: __unix: '' ptyprocess: '' - python: '' + python: '>=3.10' tornado: '>=6.1.0' url: https://repo.prefix.dev/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda hash: @@ -7335,7 +7335,7 @@ package: platform: win-64 dependencies: __win: '' - python: '' + python: '>=3.10' pywinpty: '>=1.1.0' tornado: '>=6.1.0' url: https://repo.prefix.dev/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda @@ -7427,7 +7427,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda hash: md5: b5325cf06a000c5b14970462ff5e4d58 @@ -7439,7 +7439,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda hash: md5: b5325cf06a000c5b14970462ff5e4d58 @@ -7531,7 +7531,7 @@ package: platform: linux-64 dependencies: __unix: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda hash: md5: e5ce43272193b38c2e9037446c1d9206 @@ -7545,7 +7545,7 @@ package: dependencies: __win: '' colorama: '' - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/tqdm-4.67.3-pyha7b4d00_0.conda hash: md5: af77160f8428924c17db94e04aa69409 @@ -7657,7 +7657,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -7669,7 +7669,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -8232,7 +8232,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda hash: md5: 30cd29cb87d819caead4d55184c1d115 @@ -8244,7 +8244,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.10' url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda hash: md5: 30cd29cb87d819caead4d55184c1d115 @@ -8321,7 +8321,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: linux-64 dependencies: @@ -8330,16 +8330,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoapps-utils - version: 0.7.0a3.dev7+eb04741 + version: 0.7.0a3.dev14+f0289a8 manager: pip platform: win-64 dependencies: @@ -8348,12 +8348,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f hash: - sha256: eb0474175000819e93d8dc701ed0fd6101c44451 + sha256: f0289a846edfddcdcc58d44a6c04aae3af10931f source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@eb0474175000819e93d8dc701ed0fd6101c44451 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@f0289a846edfddcdcc58d44a6c04aae3af10931f category: main optional: false - name: geoh5py @@ -8396,7 +8396,7 @@ package: platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' @@ -8415,7 +8415,7 @@ package: platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a3.dev7+eb04741 + geoapps-utils: 0.7.0a3.dev14+f0289a8 geoh5py: 0.12.1rc2.dev296+f5eca373 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' From e347434928a78063a8656102c0426074e01f3e8b Mon Sep 17 00:00:00 2001 From: benjamink Date: Mon, 6 Apr 2026 12:29:23 -0700 Subject: [PATCH 19/21] add name to PlateModelOptions --- simpeg_drivers/options.py | 1 + 1 file changed, 1 insertion(+) diff --git a/simpeg_drivers/options.py b/simpeg_drivers/options.py index 2b2f217b..118a9454 100644 --- a/simpeg_drivers/options.py +++ b/simpeg_drivers/options.py @@ -420,6 +420,7 @@ class DrapeModelOptions(BaseModel): horizontal_padding: float | None = 100.0 vertical_padding: float | None = 100.0 expansion_factor: float | None = 1.1 + name: str = "mesh" class EMDataMixin: From ea780218b1b5590a04da047bece39d5ae3655a5b Mon Sep 17 00:00:00 2001 From: benjamink Date: Mon, 6 Apr 2026 13:14:08 -0700 Subject: [PATCH 20/21] handle caplog assertion for extra logging --- tests/run_tests/driver_ground_tem_test.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index 279e3699..81266539 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -10,6 +10,7 @@ from __future__ import annotations +import re from logging import INFO, getLogger from pathlib import Path @@ -175,12 +176,17 @@ def test_ground_tem_fwr_run( assert fwr_driver.inversion_data.survey.source_list[0].n_segments == 16 if pytest and caplog: - assert len(caplog.records) == 2 - for record in caplog.records: + loop_warnings = [ + k + for k in caplog.records + if re.match(r"Loop \d+ modified", k.message) is not None + ] + assert len(loop_warnings) == 2 + for record in loop_warnings: assert record.levelname == "INFO" assert "counter-clockwise" in record.message - assert "closed" in caplog.records[0].message + assert "closed" in loop_warnings[0].message assert ( fwr_driver.data_misfit.objfcts[0].simulation.simulations[0].solver == Mumps From 7ae05ff2dfaf0ce06ddc07629539a77a0b1ef057 Mon Sep 17 00:00:00 2001 From: benjamink Date: Mon, 6 Apr 2026 15:02:30 -0700 Subject: [PATCH 21/21] update targets --- tests/run_tests/driver_airborne_fem_1d_test.py | 2 +- tests/run_tests/driver_airborne_fem_test.py | 4 ++-- tests/run_tests/driver_airborne_tem_1d_test.py | 2 +- tests/run_tests/driver_airborne_tem_test.py | 2 +- tests/run_tests/driver_app_con_test.py | 2 +- tests/run_tests/driver_dc_2d_rotated_gradients_test.py | 2 +- tests/run_tests/driver_dc_test.py | 4 ++-- tests/run_tests/driver_grav_test.py | 2 +- tests/run_tests/driver_ground_tem_test.py | 2 +- tests/run_tests/driver_ip_test.py | 2 +- tests/run_tests/driver_joint_cross_gradient_test.py | 6 +++--- tests/run_tests/driver_joint_pgi_homogeneous_test.py | 2 +- tests/run_tests/driver_joint_surveys_test.py | 4 ++-- tests/run_tests/driver_mag_automesh_test.py | 2 +- tests/run_tests/driver_mag_test.py | 2 +- tests/run_tests/driver_mt_test.py | 2 +- tests/run_tests/driver_mvi_test.py | 4 ++-- tests/run_tests/driver_rotated_gradients_test.py | 2 +- tests/run_tests/driver_tile_estimator_test.py | 2 +- tests/run_tests/driver_tipper_test.py | 2 +- tests/run_tests/sensitivity_cutoff_test.py | 6 +++--- 21 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/run_tests/driver_airborne_fem_1d_test.py b/tests/run_tests/driver_airborne_fem_1d_test.py index 88683975..f438017a 100644 --- a/tests/run_tests/driver_airborne_fem_1d_test.py +++ b/tests/run_tests/driver_airborne_fem_1d_test.py @@ -38,7 +38,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 804.9849282354428, "phi_d": 64500, "phi_m": 717} +target_run = {"data_norm": 380.3510229653626, "phi_d": 33100, "phi_m": 209} def test_fem_fwr_1d_run( diff --git a/tests/run_tests/driver_airborne_fem_test.py b/tests/run_tests/driver_airborne_fem_test.py index e2f7d57d..c1c7ad77 100644 --- a/tests/run_tests/driver_airborne_fem_test.py +++ b/tests/run_tests/driver_airborne_fem_test.py @@ -40,7 +40,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 91.18814842528005, "phi_d": 4250, "phi_m": 968} +target_run = {"data_norm": 122.63745463149134, "phi_d": 2890, "phi_m": 438} def test_fem_name_change(tmp_path, caplog): @@ -204,7 +204,7 @@ def test_fem_run(tmp_path: Path, max_iterations=1, pytest=True): # Scaling is done evenly on channels np.testing.assert_allclose( driver.data_misfit.multipliers, - [1.0, 1.0, 0.6004, 0.6004, 0.5047, 0.5047], + [1.0, 1.0, 0.5514, 0.5514, 0.5028, 0.5028], atol=1e-3, ) diff --git a/tests/run_tests/driver_airborne_tem_1d_test.py b/tests/run_tests/driver_airborne_tem_1d_test.py index d697d537..38273064 100644 --- a/tests/run_tests/driver_airborne_tem_1d_test.py +++ b/tests/run_tests/driver_airborne_tem_1d_test.py @@ -35,7 +35,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 6.413150955633971e-10, "phi_d": 42.3, "phi_m": 116000} +target_run = {"data_norm": 4.697209832464402e-10, "phi_d": 30.8, "phi_m": 82400} def test_airborne_tem_1d_fwr_run( diff --git a/tests/run_tests/driver_airborne_tem_test.py b/tests/run_tests/driver_airborne_tem_test.py index 081bfe25..194555b9 100644 --- a/tests/run_tests/driver_airborne_tem_test.py +++ b/tests/run_tests/driver_airborne_tem_test.py @@ -37,7 +37,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 7.055418125633924e-08, "phi_d": 185000000, "phi_m": 7270} +target_run = {"data_norm": 7.416844275458644e-10, "phi_d": 98100, "phi_m": 11300} def test_bad_waveform(tmp_path: Path): diff --git a/tests/run_tests/driver_app_con_test.py b/tests/run_tests/driver_app_con_test.py index 2d7ad79e..df962eaa 100644 --- a/tests/run_tests/driver_app_con_test.py +++ b/tests/run_tests/driver_app_con_test.py @@ -37,7 +37,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.018661818427023937, "phi_d": 502, "phi_m": 10900} +target_run = {"data_norm": 0.017182160750439688, "phi_d": 2.69, "phi_m": 1900} def test_app_con_fwr_run( diff --git a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py index cd527335..cbd25eb3 100644 --- a/tests/run_tests/driver_dc_2d_rotated_gradients_test.py +++ b/tests/run_tests/driver_dc_2d_rotated_gradients_test.py @@ -41,7 +41,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 10.37631617283848, "phi_d": 199000, "phi_m": 421} +target_run = {"data_norm": 10.376299815232803, "phi_d": 198000, "phi_m": 421} def test_dc_rotated_2d_fwr_run(tmp_path: Path, n_electrodes=10, n_lines=3): diff --git a/tests/run_tests/driver_dc_test.py b/tests/run_tests/driver_dc_test.py index 30c0509b..8e43e7ea 100644 --- a/tests/run_tests/driver_dc_test.py +++ b/tests/run_tests/driver_dc_test.py @@ -36,7 +36,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.14144509477553324, "phi_d": 4.22, "phi_m": 211} +target_run = {"data_norm": 0.15320935486917722, "phi_d": 25.7, "phi_m": 3580} def test_dc_3d_fwr_run( @@ -181,7 +181,7 @@ def test_dc_single_line_fwr_run( ) fwr_driver = DC3DForwardDriver(params) - assert fwr_driver.inversion_mesh.mesh.n_cells == 13855 + assert fwr_driver.inversion_mesh.mesh.n_cells == 3560 if __name__ == "__main__": diff --git a/tests/run_tests/driver_grav_test.py b/tests/run_tests/driver_grav_test.py index 0d7e7dc0..cd911d97 100644 --- a/tests/run_tests/driver_grav_test.py +++ b/tests/run_tests/driver_grav_test.py @@ -38,7 +38,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.006241342269481059, "phi_d": 0.0024, "phi_m": 0.17} +target_run = {"data_norm": 0.0034873276857765663, "phi_d": 3.06, "phi_m": 0.00137} def test_gravity_fwr_run( diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index 81266539..20adb023 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -43,7 +43,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 9.184569809436836e-07, "phi_d": 311, "phi_m": 4710} +target_run = {"data_norm": 7.547547820042408e-07, "phi_d": 23, "phi_m": 6310} def test_tiling_ground_tem( diff --git a/tests/run_tests/driver_ip_test.py b/tests/run_tests/driver_ip_test.py index ee2cba50..7f4d7680 100644 --- a/tests/run_tests/driver_ip_test.py +++ b/tests/run_tests/driver_ip_test.py @@ -35,7 +35,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.007008809086007593, "phi_d": 1200, "phi_m": 2.59e-05} +target_run = {"data_norm": 0.005219568872697125, "phi_d": 680, "phi_m": 1.01e-6} def test_ip_3d_fwr_run( diff --git a/tests/run_tests/driver_joint_cross_gradient_test.py b/tests/run_tests/driver_joint_cross_gradient_test.py index 87b29365..3a5905bd 100644 --- a/tests/run_tests/driver_joint_cross_gradient_test.py +++ b/tests/run_tests/driver_joint_cross_gradient_test.py @@ -52,7 +52,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 53.295822303985325, "phi_d": 646, "phi_m": 1.84} +target_run = {"data_norm": 53.31483800448377, "phi_d": 558, "phi_m": 0.0574} INDUCING_FIELD = (50000.0, 90.0, 0.0) @@ -310,13 +310,13 @@ def test_joint_cross_gradient_inv_run( # the scaling from its total misfit. np.testing.assert_allclose( driver.directives.scale_misfits.scalings, - [0.52747, 0.5, 0.5, 0.5, 1.0], + [1, 0.7558, 0.5, 0.5, 0.6710], atol=1e-3, ) # Check that scaling * chi factor is reflected in data misfit multipliers np.testing.assert_allclose( driver.data_misfit.multipliers, - [0.421978, 0.4, 0.5, 0.5, 1.0], + [0.8, 0.6046, 0.5, 0.5, 0.6710], atol=1e-3, ) diff --git a/tests/run_tests/driver_joint_pgi_homogeneous_test.py b/tests/run_tests/driver_joint_pgi_homogeneous_test.py index 2bfa74b8..0bae88c3 100644 --- a/tests/run_tests/driver_joint_pgi_homogeneous_test.py +++ b/tests/run_tests/driver_joint_pgi_homogeneous_test.py @@ -51,7 +51,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 429.8877292855237, "phi_d": 1020, "phi_m": 42100} +target_run = {"data_norm": 438.9161113857895, "phi_d": 1450, "phi_m": 24.7} INDUCING_FIELD = (50000.0, 90.0, 0.0) diff --git a/tests/run_tests/driver_joint_surveys_test.py b/tests/run_tests/driver_joint_surveys_test.py index ae38d5a6..b94fea55 100644 --- a/tests/run_tests/driver_joint_surveys_test.py +++ b/tests/run_tests/driver_joint_surveys_test.py @@ -54,7 +54,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.29977916022065554, "phi_d": 1340, "phi_m": 40.5} +target_run = {"data_norm": 438.9161113857895, "phi_d": 1450, "phi_m": 24.7} def test_joint_surveys_fwr_run( @@ -213,7 +213,7 @@ def test_joint_surveys_inv_run( # The rescaling is done evenly on the two tiles for both surveys np.testing.assert_allclose( driver.data_misfit.multipliers, - [1.0, 1.0, 0.92685279, 0.92685279], + [1.0, 1.0, 0.6673, 0.6673], atol=1e-3, ) diff --git a/tests/run_tests/driver_mag_automesh_test.py b/tests/run_tests/driver_mag_automesh_test.py index 51dda95d..d86f83a9 100644 --- a/tests/run_tests/driver_mag_automesh_test.py +++ b/tests/run_tests/driver_mag_automesh_test.py @@ -28,7 +28,7 @@ ) -TARGET = 1132.1998 +TARGET = 2874.854552748384 def test_automesh( diff --git a/tests/run_tests/driver_mag_test.py b/tests/run_tests/driver_mag_test.py index 185f737e..1b63f7b0 100644 --- a/tests/run_tests/driver_mag_test.py +++ b/tests/run_tests/driver_mag_test.py @@ -37,7 +37,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 16.401162431997772, "phi_d": 197, "phi_m": 4.62e-06} +target_run = {"data_norm": 42.21641479029038, "phi_d": 1350, "phi_m": 0.00205} def test_susceptibility_fwr_run( diff --git a/tests/run_tests/driver_mt_test.py b/tests/run_tests/driver_mt_test.py index 7fd48d1b..b22f0f44 100644 --- a/tests/run_tests/driver_mt_test.py +++ b/tests/run_tests/driver_mt_test.py @@ -38,7 +38,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.020080671392974116, "phi_d": 1.7, "phi_m": 23.4} +target_run = {"data_norm": 0.024541056615232898, "phi_d": 38.7, "phi_m": 26.7} def setup_data(workspace, survey): diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py index 4c67caa6..29cf9143 100644 --- a/tests/run_tests/driver_mvi_test.py +++ b/tests/run_tests/driver_mvi_test.py @@ -173,12 +173,12 @@ def test_magnetic_vector_run( inactive_ind = run_ws.get_entity("active_cells")[0].values == 0 assert np.all(nan_ind == inactive_ind) - assert np.nanmin(model.values) <= 1e-5 + assert np.nanmin(model.values) <= 2e-5 assert np.isclose(driver.inversion.opt.upper[0], upper_bound) out_group = run_ws.get_entity("Magnetic Vector Inversion")[0] mesh = out_group.get_entity("mesh")[0] - assert len(mesh.property_groups) == 6 + assert len(mesh.property_groups) == 5 assert len(mesh.fetch_property_group("Iteration_0").properties) == 2 assert len(mesh.fetch_property_group("LP models").properties) == 6 assert ( diff --git a/tests/run_tests/driver_rotated_gradients_test.py b/tests/run_tests/driver_rotated_gradients_test.py index 05f0f8a4..0e5f038b 100644 --- a/tests/run_tests/driver_rotated_gradients_test.py +++ b/tests/run_tests/driver_rotated_gradients_test.py @@ -40,7 +40,7 @@ # Move this file out of the test directory and run. # pylint: disable=no-member -target_run = {"data_norm": 0.4213146000982348, "phi_d": 37000, "phi_m": 3.58} +target_run = {"data_norm": 0.3337151941623077, "phi_d": 23600, "phi_m": 7.54} def test_gravity_rotated_grad_fwr_run( diff --git a/tests/run_tests/driver_tile_estimator_test.py b/tests/run_tests/driver_tile_estimator_test.py index e4c27bd0..39d05c7b 100644 --- a/tests/run_tests/driver_tile_estimator_test.py +++ b/tests/run_tests/driver_tile_estimator_test.py @@ -81,7 +81,7 @@ def test_tile_estimator_run( driver = simpeg_group_to_driver(simpeg_group, geoh5) assert driver.inversion_type == "magnetic scalar" - assert driver.params.compute.tile_spatial == 2 + assert driver.params.compute.tile_spatial == 3 assert ( len(simpeg_group.children) == 2 and simpeg_group.children[0].name == "tile_estimator.png" diff --git a/tests/run_tests/driver_tipper_test.py b/tests/run_tests/driver_tipper_test.py index 07c30c0d..cc82322c 100644 --- a/tests/run_tests/driver_tipper_test.py +++ b/tests/run_tests/driver_tipper_test.py @@ -36,7 +36,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 0.01925412835834313, "phi_d": 0.333, "phi_m": 3.18e-05} +target_run = {"data_norm": 0.011751135402491555, "phi_d": 14.2, "phi_m": 3.4e-5} def test_tipper_fwr_run( diff --git a/tests/run_tests/sensitivity_cutoff_test.py b/tests/run_tests/sensitivity_cutoff_test.py index 0453eff1..5c2b9dfd 100644 --- a/tests/run_tests/sensitivity_cutoff_test.py +++ b/tests/run_tests/sensitivity_cutoff_test.py @@ -126,7 +126,7 @@ def test_sensitivity_percent_cutoff_run(tmp_path): SensitivityCutoffDriver.start(str(tmp_path / "sensitivity_cutoff_percent.ui.json")) with Workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: mask = geoh5.get_entity("5 percent cutoff")[0] - assert mask.values.sum() == 564 + assert mask.values.sum() == 525 def test_sensitivity_cutoff_percentile_run(tmp_path): @@ -154,7 +154,7 @@ def test_sensitivity_cutoff_percentile_run(tmp_path): ) with Workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: mask = geoh5.get_entity("5 percentile cutoff")[0] - assert mask.values.sum() == 2645 + assert mask.values.sum() == 792 def test_sensitivity_cutoff_log_percent_run(tmp_path): @@ -182,4 +182,4 @@ def test_sensitivity_cutoff_log_percent_run(tmp_path): ) with Workspace(tmp_path / "inversion_test.ui.geoh5") as geoh5: mask = geoh5.get_entity("5 percent log cutoff")[0] - assert mask.values.sum() == 2669 + assert mask.values.sum() == 798