Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions simpeg_drivers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,27 +45,45 @@ def assets_path() -> Path:
DRIVER_MAP = {
"direct current 3d": (
"simpeg_drivers.electricals.direct_current.three_dimensions.driver",
{"inversion": "DirectCurrent3DDriver"},
{
"forward": "DirectCurrent3DForwardDriver",
"inversion": "DirectCurrent3DInversionDriver",
},
),
"direct current 2d": (
"simpeg_drivers.electricals.direct_current.two_dimensions.driver",
{"inversion": "DirectCurrent2DDriver"},
{
"forward": "DirectCurrent2DForwardDriver",
"inversion": "DirectCurrent2DInversionDriver",
},
),
"direct current pseudo 3d": (
"simpeg_drivers.electricals.direct_current.pseudo_three_dimensions.driver",
{"inversion": "DirectCurrentPseudo3DDriver"},
{
"forward": "DirectCurrentPseudo3DForwardDriver",
"inversion": "DirectCurrentPseudo3DInversionDriver",
},
),
"induced polarization 3d": (
"simpeg_drivers.electricals.induced_polarization.three_dimensions.driver",
{"inversion": "InducedPolarization3DDriver"},
{
"forward": "InducedPolarization3DForwardDriver",
"inversion": "InducedPolarization3DInversionDriver",
},
),
"induced polarization 2d": (
"simpeg_drivers.electricals.induced_polarization.two_dimensions.driver",
{"inversion": "InducedPolarization2DDriver"},
{
"forward": "InducedPolarization2DForwardDriver",
"inversion": "InducedPolarization2DInversionDriver",
},
),
"induced polarization pseudo 3d": (
"simpeg_drivers.electricals.induced_polarization.pseudo_three_dimensions.driver",
{"inversion": "InducedPolarizationPseudo3DDriver"},
{
"forward": "InducedPolarizationPseudo3DForwardDriver",
"inversion": "InducedPolarizationPseudo3DInversionDriver",
},
),
"joint surveys": (
"simpeg_drivers.joint.joint_surveys.driver",
Expand Down
19 changes: 10 additions & 9 deletions simpeg_drivers/components/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,11 @@ def _initialize(self) -> None:
self.has_tensor = InversionData.check_tensor(self.components)
self.locations = super().get_locations(self.params.data_object)

if (
getattr(self.params, "line_id", None) is not None
and getattr(self.params, "line_object", None) is not None
):
self.mask = self.params.line_object.values == self.params.line_id
if "2d" in self.params.inversion_type:
self.mask = (
self.params.line_selection.line_object.values
== self.params.line_selection.line_id
)
else:
self.mask = np.ones(len(self.locations), dtype=bool)

Expand Down Expand Up @@ -471,11 +471,12 @@ def update_params(self, data_dict, uncert_dict):
setattr(self.params, f"{comp}_channel", data_dict[comp])
setattr(self.params, f"{comp}_uncertainty", uncert_dict[comp])

if getattr(self.params, "line_object", None) is not None:
new_line = self.params.line_object.copy(
parent=self.entity, values=self.params.line_object.values[self.mask]
if getattr(self.params, "line_selection", None) is not None:
new_line = self.params.line_selection.line_object.copy(
parent=self.entity,
values=self.params.line_selection.line_object.values[self.mask],
)
self.params.line_object = new_line
self.params.line_selection.line_object = new_line

@property
def survey(self):
Expand Down
10 changes: 8 additions & 2 deletions simpeg_drivers/electricals/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@

from __future__ import annotations

from .direct_current.three_dimensions import DirectCurrent3DParams
from .induced_polarization.three_dimensions.params import InducedPolarization3DParams
from .direct_current.three_dimensions import (
DirectCurrent3DForwardParams,
DirectCurrent3DInversionParams,
)
from .induced_polarization.three_dimensions.params import (
InducedPolarization3DForwardParams,
InducedPolarization3DInversionParams,
)

# pylint: disable=unused-import
# flake8: noqa
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,23 @@
validations,
)
from simpeg_drivers.electricals.direct_current.pseudo_three_dimensions.params import (
DirectCurrentPseudo3DParams,
DirectCurrentPseudo3DForwardParams,
DirectCurrentPseudo3DInversionParams,
)
from simpeg_drivers.electricals.direct_current.two_dimensions.params import (
DirectCurrent2DParams,
DirectCurrent2DForwardParams,
DirectCurrent2DInversionParams,
)
from simpeg_drivers.electricals.driver import BasePseudo3DDriver


class DirectCurrentPseudo3DDriver(BasePseudo3DDriver):
_params_class = DirectCurrentPseudo3DParams
_params_2d_class = DirectCurrent2DParams
class DirectCurrentPseudo3DForwardDriver(BasePseudo3DDriver):
_params_class = DirectCurrentPseudo3DForwardParams
_params_2d_class = DirectCurrent2DForwardParams
_validations = validations


class DirectCurrentPseudo3DInversionDriver(BasePseudo3DDriver):
_params_class = DirectCurrentPseudo3DInversionParams
_params_2d_class = DirectCurrent2DInversionParams
_validations = validations
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,95 @@
from __future__ import annotations

from copy import deepcopy
from typing import ClassVar

from geoh5py.data import FloatData
from geoh5py.objects import Octree, PotentialElectrode

from simpeg_drivers import assets_path
from simpeg_drivers.electricals.direct_current.pseudo_three_dimensions.constants import (
default_ui_json,
forward_defaults,
inversion_defaults,
validations,
)
from simpeg_drivers.electricals.params import BasePseudo3DParams
from simpeg_drivers.electricals.params import (
BasePseudo3DParams,
DrapeModelData,
FileControlData,
LineSelectionData,
)
from simpeg_drivers.params import BaseForwardData, BaseInversionData


class DirectCurrentPseudo3DForwardParams(BaseForwardData):
"""
Parameter class for three dimensional direct current forward simulation.

:param data_object: DC survey object.
:param potential_channel_bool: Potential channel boolean.
:param line_selection: Line selection parameters.
:param mesh: Optional mesh object if providing a heterogeneous model.
:param drape_model: Drape model parameters common to all 2D simulations.
:param model_type: Specify whether the models are provided in resistivity
or conductivity.
:param file_control: File control parameters.
"""

name: ClassVar[str] = "Direct Current Pseudo 3D Forward"
title: ClassVar[str] = "Direct Current (DC) 2D Batch Forward"
default_ui_json: ClassVar[str] = (
assets_path() / "uijson/direct_current_pseudo3d_forward.ui.json"
)

inversion_type: str = "direct current pseudo 3d"
physical_property: str = "conductivity"

data_object: PotentialElectrode
potential_channel_bool: bool = True
line_selection: LineSelectionData
mesh: Octree | None = None
drape_model: DrapeModelData = DrapeModelData()
model_type: str = "Conductivity (S/m)"
file_control: FileControlData = FileControlData()


class DirectCurrentPseudo3DInversionParams(BaseInversionData):
"""
Parameter class for three dimensional direct current inversion.

:param data_object: DC survey object.
:param potential_channel: Potential data channel.
:param potential_uncertainty: Potential data uncertainty channel.
:param line_selection: Line selection parameters.
:param mesh: Optional mesh object if providing a heterogeneous model.
:param drape_model: Drape model parameters.
:param model_type: Specify whether the models are provided in resistivity
or conductivity.
:param file_control: File control parameters.
:param length_scale_y: Inactive length scale for y direction.
:param y_norm: Inactive y normalization factor.
"""

name: ClassVar[str] = "Direct Current Pseudo 3D Inversion"
title: ClassVar[str] = "Direct Current (DC) 2D Batch Inversion"
default_ui_json: ClassVar[str] = (
assets_path() / "uijson/direct_current_pseudo3d_inversion.ui.json"
)

inversion_type: str = "direct current pseudo 3d"
physical_property: str = "conductivity"

data_object: PotentialElectrode
potential_channel: FloatData
potential_uncertainty: float | FloatData
line_selection: LineSelectionData
mesh: Octree | None = None
drape_model: DrapeModelData = DrapeModelData()
model_type: str = "Conductivity (S/m)"
file_control: FileControlData = FileControlData()
length_scale_y: None = None
y_norm: None = None


class DirectCurrentPseudo3DParams(BasePseudo3DParams):
Expand All @@ -41,6 +122,10 @@

super().__init__(input_file=input_file, forward_only=forward_only, **kwargs)

@property
def line_selection(self):
return LineSelectionData(line_object=self.line_object, line_id=1)

Check warning on line 128 in simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py

View check run for this annotation

Codecov / codecov/patch

simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py#L127-L128

Added lines #L127 - L128 were not covered by tests
@property
def potential_channel_bool(self):
return self._potential_channel_bool
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


from .params import DirectCurrent3DParams
from .params import DirectCurrent3DForwardParams, DirectCurrent3DInversionParams

# pylint: disable=unused-import
# flake8: noqa
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@
from simpeg_drivers.driver import InversionDriver

from .constants import validations
from .params import DirectCurrent3DParams
from .params import DirectCurrent3DForwardParams, DirectCurrent3DInversionParams


class DirectCurrent3DDriver(InversionDriver):
_params_class = DirectCurrent3DParams
_validations = validations
class DirectCurrent3DForwardDriver(InversionDriver):
_params_class = DirectCurrent3DForwardParams
_validation = validations

def __init__(self, params: DirectCurrent3DParams):
super().__init__(params)

class DirectCurrent3DInversionDriver(InversionDriver):
_params_class = DirectCurrent3DInversionParams
_validation = validations
111 changes: 46 additions & 65 deletions simpeg_drivers/electricals/direct_current/three_dimensions/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,75 +11,56 @@

from __future__ import annotations

from copy import deepcopy
from pathlib import Path
from typing import ClassVar

from simpeg_drivers.params import InversionBaseParams
from geoh5py.data import FloatData

from .constants import (
default_ui_json,
forward_defaults,
inversion_defaults,
validations,
)
from simpeg_drivers import assets_path
from simpeg_drivers.params import BaseForwardData, BaseInversionData


class DirectCurrent3DParams(InversionBaseParams):
class DirectCurrent3DForwardParams(BaseForwardData):
"""
Parameter class for electrical->conductivity inversion.
Direct current 3D forward parameters.

:param potential_channel_bool: Potential channel boolean.
:param model_type: Specify whether the models are provided in
resistivity or conductivity.
"""

_physical_property = "conductivity"

def __init__(self, input_file=None, forward_only=False, **kwargs):
self._default_ui_json = deepcopy(default_ui_json)
self._forward_defaults = deepcopy(forward_defaults)
self._inversion_defaults = deepcopy(inversion_defaults)
self._inversion_type = "direct current 3d"
self._validations = validations
self._potential_channel_bool = None
self._potential_channel = None
self._potential_uncertainty = None
self._model_type = "Conductivity (S/m)"

super().__init__(input_file=input_file, forward_only=forward_only, **kwargs)

@property
def inversion_type(self):
return self._inversion_type

@inversion_type.setter
def inversion_type(self, val):
self.setter_validator("inversion_type", val)

@property
def model_type(self):
"""Model units."""
return self._model_type

@model_type.setter
def model_type(self, val):
self.setter_validator("model_type", val)

@property
def potential_channel_bool(self):
return self._potential_channel_bool

@potential_channel_bool.setter
def potential_channel_bool(self, val):
self.setter_validator("potential_channel_bool", val)

@property
def potential_channel(self):
return self._potential_channel

@potential_channel.setter
def potential_channel(self, val):
self.setter_validator("potential_channel", val, fun=self._uuid_promoter)

@property
def potential_uncertainty(self):
return self._potential_uncertainty

@potential_uncertainty.setter
def potential_uncertainty(self, val):
self.setter_validator("potential_uncertainty", val, fun=self._uuid_promoter)
name: ClassVar[str] = "Direct Current 3D Forward"
title: ClassVar[str] = "Direct Current 3D Forward"
default_ui_json: ClassVar[Path] = (
assets_path() / "uijson/direct_current_3d_forward.ui.json"
)

inversion_type: str = "direct current 3d"
physical_property: str = "conductivity"

potential_channel_bool: bool = True
model_type: str = "Conductivity (S/m)"


class DirectCurrent3DInversionParams(BaseInversionData):
"""
Direct current 3D inversion parameters.

:param potential_channel: Potential data channel.
:param potential_uncertainty: Potential data uncertainty channel.
:param model_type: Specify whether the models are provided in
resistivity or conductivity.
"""

name: ClassVar[str] = "Direct Current 3D Inversion"
title: ClassVar[str] = "Direct Current 3D Inversion"
default_ui_json: ClassVar[Path] = (
assets_path() / "uijson/direct_current_3d_inversion.ui.json"
)

inversion_type: str = "direct current 3d"
physical_property: str = "conductivity"

potential_channel: FloatData
potential_uncertainty: float | FloatData | None = None
model_type: str = "Conductivity (S/m)"
Loading