Skip to content

Commit 843a029

Browse files
committed
PlateOptions composed of PlateModel
1 parent faf805d commit 843a029

11 files changed

Lines changed: 92 additions & 100 deletions

File tree

simpeg_drivers-assets/uijson/plate_simulation.ui.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"tooltip": "Value of the basement resisitivity (ohm-m), density (g/cc) or susceptibility (SI)",
3434
"enabled": true
3535
},
36-
"overburden": {
36+
"overburden_property": {
3737
"main": true,
3838
"group": "Overburden",
3939
"label": "Physical property (SI)",
@@ -65,7 +65,7 @@
6565
"enabled": true,
6666
"tooltip": "Spacing between plates"
6767
},
68-
"plate": {
68+
"plate_property": {
6969
"main": true,
7070
"group": "Plate",
7171
"label": "Physical property (SI)",

simpeg_drivers/plate_simulation/driver.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,24 +131,24 @@ def plates(self) -> list[Plate]:
131131
"""Generate sequence of plates."""
132132
if self._plates is None:
133133
offset = (
134-
self.params.model.overburden_model.thickness
135-
if self.params.model.plate_model.reference_surface == "overburden"
134+
self.params.model.overburden.thickness
135+
if self.params.model.plate.reference_surface == "overburden"
136136
else 0.0
137137
)
138-
center = self.params.model.plate_model.center(
138+
center = self.params.model.plate.center(
139139
self.survey,
140140
self.topography,
141141
depth_offset=-1 * offset,
142142
)
143143
plate = Plate(
144-
self.params.model.plate_model,
144+
self.params.model.plate,
145145
center,
146146
)
147147
self._plates = self.replicate(
148148
plate,
149-
self.params.model.plate_model.number,
150-
self.params.model.plate_model.spacing,
151-
self.params.model.plate_model.dip_direction,
149+
self.params.model.plate.number,
150+
self.params.model.plate.spacing,
151+
self.params.model.plate.geometry.direction,
152152
)
153153
return self._plates
154154

@@ -198,12 +198,12 @@ def make_model(self) -> FloatData:
198198

199199
overburden = Overburden(
200200
topography=self.simulation_parameters.active_cells.topography_object,
201-
thickness=self.params.model.overburden_model.thickness,
202-
value=self.params.model.overburden_model.overburden,
201+
thickness=self.params.model.overburden.thickness,
202+
value=self.params.model.overburden.overburden_property,
203203
)
204204

205205
dikes = DikeSwarm(
206-
[Anomaly(plate, plate.params.plate) for plate in self.plates],
206+
[Anomaly(plate, plate.params.plate_property) for plate in self.plates],
207207
name="plates",
208208
)
209209

simpeg_drivers/plate_simulation/match/driver.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def _create_plate_from_parameters(
192192
"""
193193
center = self.params.survey.vertices[index_center]
194194
center[2] = (
195-
self._drape_heights[index_center] - model_options.overburden_model.thickness
195+
self._drape_heights[index_center] - model_options.overburden.thickness
196196
)
197197
indices = self.params.survey.get_segment_indices(
198198
index_center, self.params.max_distance
@@ -208,10 +208,10 @@ def _create_plate_from_parameters(
208208
"y": center[1],
209209
"z": center[2],
210210
},
211-
"width": model_options.plate_model.dip_length,
212-
"thickness": model_options.plate_model.width,
213-
"length": model_options.plate_model.strike_length,
214-
"dip": model_options.plate_model.dip,
211+
"width": model_options.plate.geometry.dip_length,
212+
"thickness": model_options.plate.geometry.width,
213+
"length": model_options.plate.geometry.strike_length,
214+
"dip": model_options.plate.geometry.dip,
215215
"dip_direction": (azimuth + strike_angle) % 360,
216216
}
217217
)

simpeg_drivers/plate_simulation/models/options.py

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from typing import TypeVar
1212

1313
import numpy as np
14+
from geoapps_utils.modelling.plates import PlateModel
1415
from geoh5py.objects import Points
1516
from pydantic import (
1617
BaseModel,
@@ -29,20 +30,12 @@ class PlateOptions(BaseModel):
2930
Parameters describing an anomalous plate.
3031
3132
:param plate: Value given to the plate(s).
32-
:param width: V-size of the plate.
33-
:param strike_length: U-size of the plate.
34-
:param dip_length: W-size of the plate.
35-
:param dip: Orientation of the v-axis in degree from horizontal.
36-
:param dip_direction: Orientation of the u axis in degree from north.
33+
:param geometry: Parameters describing the plate geometry.
3734
:param reference: Point of rotation to be 'center' or 'top'.
3835
:param number: Number of offset plates to be created.
3936
:param spacing: Spacing between plates.
4037
:param relative_locations: If True locations are relative to survey in xy and
4138
mean topography in z.
42-
:param easting: Easting offset relative to survey.
43-
:param northing: Northing offset relative to survey.
44-
:param elevation: plate(s) elevation. May be true elevation or relative to
45-
overburden or topography.
4639
:param reference_surface: Switches between using topography and overburden as
4740
elevation reference of the plate.
4841
:param reference_type: Type of reference for plate elevation. Can be 'mean'
@@ -53,18 +46,11 @@ class PlateOptions(BaseModel):
5346
model_config = ConfigDict(arbitrary_types_allowed=True)
5447

5548
name: str = "Plate"
56-
plate: float
57-
width: float
58-
strike_length: float
59-
dip_length: float
60-
dip: float = 90.0
61-
dip_direction: float = 90.0
49+
plate_property: float
50+
geometry: PlateModel
6251
number: int = 1
6352
spacing: float = 0.0
6453
relative_locations: bool = False
65-
easting: float = 0.0
66-
northing: float = 0.0
67-
elevation: float
6854
reference_surface: str = "topography"
6955
reference_type: str = "mean"
7056

@@ -82,7 +68,7 @@ def single_plate(self):
8268
@property
8369
def halfplate(self):
8470
"""Compute half the z-projection length of the plate."""
85-
return 0.5 * self.dip_length * np.sin(np.deg2rad(self.dip))
71+
return 0.5 * self.geometry.dip_length * np.sin(np.deg2rad(self.geometry.dip))
8672

8773
def center(
8874
self,
@@ -104,11 +90,11 @@ def _get_xy(self, survey: Points) -> tuple[float, float]:
10490

10591
if self.relative_locations:
10692
return (
107-
survey.vertices[:, 0].mean() + self.easting,
108-
survey.vertices[:, 1].mean() + self.northing,
93+
survey.vertices[:, 0].mean() + self.geometry.origin[0],
94+
survey.vertices[:, 1].mean() + self.geometry.origin[1],
10995
)
11096

111-
return self.easting, self.northing
97+
return self.geometry.origin[0], self.geometry.origin[1]
11298

11399
def _get_z(self, surface: Points, offset: float = 0.0) -> float:
114100
"""
@@ -122,9 +108,9 @@ def _get_z(self, surface: Points, offset: float = 0.0) -> float:
122108
raise ValueError("Topography object has no vertices.")
123109
if self.relative_locations:
124110
z = getattr(surface.vertices[:, 2], self.reference_type)()
125-
z += offset + self.elevation - self.halfplate
111+
z += offset + self.geometry.elevation - self.halfplate
126112
else:
127-
z = self.elevation
113+
z = self.geometry.elevation
128114

129115
return z
130116

@@ -138,7 +124,7 @@ class OverburdenOptions(BaseModel):
138124
"""
139125

140126
thickness: float
141-
overburden: float
127+
overburden_property: float
142128

143129

144130
class ModelOptions(BaseModel):
@@ -153,5 +139,5 @@ class ModelOptions(BaseModel):
153139
model_config = ConfigDict(arbitrary_types_allowed=True)
154140

155141
background: float
156-
overburden_model: OverburdenOptions
157-
plate_model: PlateOptions
142+
overburden: OverburdenOptions
143+
plate: PlateOptions

simpeg_drivers/plate_simulation/models/parametric.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ def triangles(self) -> np.ndarray:
128128
def vertices(self) -> np.ndarray:
129129
"""Vertices for triangulation of a rectangular prism in 3D space."""
130130

131-
u_1 = self.center[0] - (self.params.strike_length / 2.0)
132-
u_2 = self.center[0] + (self.params.strike_length / 2.0)
133-
v_1 = self.center[1] - (self.params.dip_length / 2.0)
134-
v_2 = self.center[1] + (self.params.dip_length / 2.0)
135-
w_1 = self.center[2] - (self.params.width / 2.0)
136-
w_2 = self.center[2] + (self.params.width / 2.0)
131+
u_1 = self.center[0] - (self.params.geometry.strike_length / 2.0)
132+
u_2 = self.center[0] + (self.params.geometry.strike_length / 2.0)
133+
v_1 = self.center[1] - (self.params.geometry.dip_length / 2.0)
134+
v_2 = self.center[1] + (self.params.geometry.dip_length / 2.0)
135+
w_1 = self.center[2] - (self.params.geometry.width / 2.0)
136+
w_2 = self.center[2] + (self.params.geometry.width / 2.0)
137137

138138
vertices = np.array(
139139
[
@@ -159,29 +159,21 @@ def workspace(self) -> Workspace:
159159

160160
def _rotate(self, vertices: np.ndarray) -> np.ndarray:
161161
"""Rotate vertices and adjust for reference point."""
162-
theta = -1 * self.params.dip_direction
163-
phi = -1 * self.params.dip
162+
theta = -1 * self.params.geometry.direction
163+
phi = -1 * self.params.geometry.dip
164164
rotated_vertices = rotate_xyz(vertices, self.center, theta, phi)
165165

166166
return rotated_vertices
167167

168168
def mask(self, mesh: Octree) -> np.ndarray:
169-
plate = PlateModel(
170-
strike_length=self.params.strike_length,
171-
dip_length=self.params.dip_length,
172-
width=self.params.width,
173-
direction=self.params.dip_direction,
174-
dip=self.params.dip,
175-
origin=self.center,
176-
)
177169
rotations = [
178-
z_rotation_matrix(np.deg2rad(self.params.dip_direction)),
179-
x_rotation_matrix(np.deg2rad(self.params.dip)),
170+
z_rotation_matrix(np.deg2rad(self.params.geometry.direction)),
171+
x_rotation_matrix(np.deg2rad(self.params.geometry.dip)),
180172
]
181173
rotated_centers = rotate_points(
182-
mesh.centroids, origin=plate.origin, rotations=rotations
174+
mesh.centroids, origin=self.params.geometry.origin, rotations=rotations
183175
)
184-
return inside_plate(rotated_centers, plate)
176+
return inside_plate(rotated_centers, self.params.geometry)
185177

186178

187179
class Body(Parametric):

simpeg_drivers/utils/synthetics/options.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ class ModelOptions(BaseModel):
5656
strike_length=40.0,
5757
dip_length=40.0,
5858
width=40.0,
59-
origin=(0.0, 0.0, 10.0),
59+
easting=0.0,
60+
northing=0.0,
61+
elevation=10.0,
6062
)
6163
name: str = "model"
6264

tests/plate_simulation/models/events_test.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1010

1111
import numpy as np
12+
from geoapps_utils.modelling.plates import PlateModel
1213
from geoh5py import Workspace
1314
from geoh5py.objects import Surface
1415

@@ -87,11 +88,17 @@ def test_anomaly(tmp_path):
8788
_, octree = get_topo_mesh(workspace)
8889
params = PlateOptions(
8990
name="my plate",
90-
plate=10.0,
91-
elevation=-1.5,
92-
width=10.0,
93-
strike_length=10.0,
94-
dip_length=1.0,
91+
plate_property=10.0,
92+
geometry=PlateModel(
93+
easting=0.0,
94+
northing=0.0,
95+
elevation=-1.5,
96+
width=10.0,
97+
strike_length=10.0,
98+
dip_length=1.0,
99+
dip_direction=90,
100+
dip=90,
101+
),
95102
)
96103
plate = Plate(params, center=(5.0, 5.0, -1.5))
97104

tests/plate_simulation/runtest/driver_test.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ def test_plate_simulation_params_from_input_file(tmp_path):
7575

7676
# Add model parameters
7777
ifile.data["background"] = 1000.0
78-
ifile.data["overburden"] = 5.0
78+
ifile.data["overburden_property"] = 5.0
7979
ifile.data["thickness"] = 50.0
80-
ifile.data["plate"] = 2.0
80+
ifile.data["plate_property"] = 2.0
8181
ifile.data["width"] = 100.0
8282
ifile.data["strike_length"] = 100.0
8383
ifile.data["dip_length"] = 100.0
@@ -117,20 +117,20 @@ def test_plate_simulation_params_from_input_file(tmp_path):
117117
assert not params.mesh.diagonal_balance
118118

119119
assert isinstance(params.model, ModelOptions)
120-
assert params.model.plate_model.name == "test_gravity_plate_simulation"
120+
assert params.model.plate.name == "test_gravity_plate_simulation"
121121
assert params.model.background == 1000.0
122-
assert params.model.overburden_model.thickness == 50.0
123-
assert params.model.overburden_model.overburden == 5.0
124-
assert params.model.plate_model.plate == 2.0
125-
assert params.model.plate_model.width == 100.0
126-
assert params.model.plate_model.strike_length == 100.0
127-
assert params.model.plate_model.dip_length == 100.0
128-
assert params.model.plate_model.dip == 0.0
129-
assert params.model.plate_model.dip_direction == 0.0
122+
assert params.model.overburden.thickness == 50.0
123+
assert params.model.overburden.overburden_property == 5.0
124+
assert params.model.plate.plate_property == 2.0
125+
assert params.model.plate.geometry.width == 100.0
126+
assert params.model.plate.geometry.strike_length == 100.0
127+
assert params.model.plate.geometry.dip_length == 100.0
128+
assert params.model.plate.geometry.dip == 0.0
129+
assert params.model.plate.geometry.direction == 0.0
130130

131-
assert params.model.plate_model.number == 9
132-
assert params.model.plate_model.spacing == 10.0
133-
assert params.model.plate_model.relative_locations
134-
assert params.model.plate_model.easting == 10.0
135-
assert params.model.plate_model.northing == 10.0
136-
assert params.model.plate_model.elevation == -250.0
131+
assert params.model.plate.number == 9
132+
assert params.model.plate.spacing == 10.0
133+
assert params.model.plate.relative_locations
134+
assert params.model.plate.geometry.easting == 10.0
135+
assert params.model.plate.geometry.northing == 10.0
136+
assert params.model.plate.geometry.elevation == -250.0

tests/plate_simulation/runtest/gravity_test.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1010

1111
import numpy as np
12+
from geoapps_utils.modelling.plates import PlateModel
1213
from geoh5py.groups import SimPEGGroup
1314

1415
from simpeg_drivers.plate_simulation.driver import PlateSimulationDriver
@@ -51,25 +52,29 @@ def test_gravity_plate_simulation(tmp_path):
5152
max_distance=200.0,
5253
)
5354

54-
overburden_params = OverburdenOptions(thickness=50.0, overburden=0.2)
55+
overburden_params = OverburdenOptions(thickness=50.0, overburden_property=0.2)
5556

5657
plate_params = PlateOptions(
5758
name="plate",
58-
plate=0.5,
59-
elevation=-250.0,
60-
width=100.0,
61-
strike_length=100.0,
62-
dip_length=100.0,
63-
dip=0.0,
64-
dip_direction=0.0,
59+
geometry=PlateModel(
60+
easting=0.0,
61+
northing=0.0,
62+
elevation=-250.0,
63+
width=100.0,
64+
strike_length=100.0,
65+
dip_length=100.0,
66+
dip=0.0,
67+
dip_direction=0.0,
68+
),
69+
plate_property=0.5,
6570
reference="center",
6671
)
6772

6873
model_params = ModelOptions(
6974
name="density",
7075
background=0.0,
71-
overburden_model=overburden_params,
72-
plate_model=plate_params,
76+
overburden=overburden_params,
77+
plate=plate_params,
7378
)
7479

7580
options = GravityForwardOptions.build(

tests/plate_simulation/runtest/match_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ def test_matching_driver(tmp_path: Path):
142142
ifile.data["simulation"] = fwr_driver.out_group
143143

144144
plate_options = PlateSimulationOptions.build(ifile.data)
145-
plate_options.model.overburden_model.thickness = 40.0
146-
plate_options.model.plate_model.dip_length = 300.0
145+
plate_options.model.overburden.thickness = 40.0
146+
plate_options.model.plate.geometry.dip_length = 300.0
147147
driver = PlateSimulationDriver(plate_options)
148148
driver.run()
149149

0 commit comments

Comments
 (0)