Skip to content

Commit d886e81

Browse files
committed
fix: interpolator support is rescaled for fault displacement.
1 parent 8f89b2b commit d886e81

File tree

5 files changed

+36
-12
lines changed

5 files changed

+36
-12
lines changed

LoopStructural/datatypes/_bounding_box.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ def __init__(
3636
origin = np.zeros(3)
3737
if maximum is None and nsteps is not None and step_vector is not None:
3838
maximum = origin + nsteps * step_vector
39-
39+
if origin is not None and global_origin is None:
40+
global_origin = origin
4041
self._origin = np.array(origin)
4142
self._maximum = np.array(maximum)
4243
if global_origin is None:
@@ -248,7 +249,9 @@ def with_buffer(self, buffer: float = 0.2) -> BoundingBox:
248249
# local coordinates, rescale into the original bounding boxes global coordinates
249250
origin = self.origin - buffer * (self.maximum - self.origin)
250251
maximum = self.maximum + buffer * (self.maximum - self.origin)
251-
return BoundingBox(origin=origin, maximum=maximum, global_origin=self.global_origin)
252+
return BoundingBox(
253+
origin=origin, maximum=maximum, global_origin=self.global_origin + origin
254+
)
252255

253256
def get_value(self, name):
254257
ix, iy = self.name_map.get(name, (-1, -1))

LoopStructural/modelling/core/geological_model.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,7 @@ def create_and_add_foliation(
692692
interpolatortype=interpolatortype,
693693
nelements=nelements,
694694
name=series_surface_data,
695+
model=self,
695696
**kwargs,
696697
)
697698
# add data
@@ -706,6 +707,9 @@ def create_and_add_foliation(
706707
# series_feature = series_builder.build(**kwargs)
707708
series_feature = series_builder.feature
708709
series_builder.build_arguments = kwargs
710+
# this support is built for the entire model domain? Possibly would
711+
# could just pass a regular grid of points - mask by any above unconformities??
712+
series_builder.build_arguments['domain'] = True
709713
series_builder.build_arguments["tol"] = tol
710714
series_feature.type = FeatureType.INTERPOLATED
711715
self._add_feature(series_feature)
@@ -746,6 +750,7 @@ def create_and_add_fold_frame(
746750
name=foldframe_data,
747751
frame=FoldFrame,
748752
nelements=nelements,
753+
model=self,
749754
**kwargs,
750755
)
751756
# add data
@@ -827,6 +832,7 @@ def create_and_add_folded_foliation(
827832
fold=fold,
828833
name=foliation_data,
829834
svario=svario,
835+
model=self,
830836
**kwargs,
831837
)
832838

@@ -912,6 +918,7 @@ def create_and_add_folded_fold_frame(
912918
name=fold_frame_data,
913919
fold=fold,
914920
frame=FoldFrame,
921+
model=self,
915922
**kwargs,
916923
)
917924
fold_frame_builder.add_data_from_data_frame(
@@ -1237,6 +1244,7 @@ def create_and_add_domain_fault(
12371244
interpolatortype=interpolatortype,
12381245
nelements=nelements,
12391246
name=fault_surface_data,
1247+
model=self,
12401248
**kwargs,
12411249
)
12421250

LoopStructural/modelling/features/builders/_base_builder.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
class BaseBuilder:
7-
def __init__(self, name="Feature"):
7+
def __init__(self, model, name: str = "Feature"):
88
"""Base builder that provides a template for
99
implementing different builders.
1010
@@ -23,11 +23,16 @@ def __init__(self, name="Feature"):
2323
If the build arguments are changed, this will flag that the feature needs to be rebuilt
2424
"""
2525
self._name = name
26+
self._model = model
2627
self._feature = None
2728
self._up_to_date = False
2829
self._build_arguments = {}
2930
self.faults = []
3031

32+
@property
33+
def model(self):
34+
return self._model
35+
3136
@property
3237
def feature(self):
3338
return self._feature

LoopStructural/modelling/features/builders/_geological_feature_builder.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def __init__(
3939
nelements: int = 1000,
4040
name="Feature",
4141
interpolation_region=None,
42+
model=None,
4243
**kwargs,
4344
):
4445
"""
@@ -52,7 +53,7 @@ def __init__(
5253
defining whether the location (xyz) should be included in the
5354
kwargs - name of the feature, region to interpolate the feature
5455
"""
55-
BaseBuilder.__init__(self, name)
56+
BaseBuilder.__init__(self, model, name)
5657
interpolator = InterpolatorFactory.create_interpolator(
5758
interpolatortype=interpolatortype,
5859
boundingbox=bounding_box,
@@ -451,16 +452,21 @@ def set_interpolation_geometry(self, origin, maximum, rotation=None):
451452
while self.interpolator.nx < 100:
452453
self.interpolator.support.step_vector = self.interpolator.support.step_vector * 0.9
453454

454-
def check_interpolation_geometry(self, data):
455+
def check_interpolation_geometry(self, data, buffer=0.3):
455456
"""Check the interpolation support geometry
456-
to data to make sure everything fits"""
457+
to data to make sure everything fits
458+
Apply the fault to the model grid to ensure that the support
459+
is big enough to capture the faulted feature.
460+
"""
461+
457462
origin = self.interpolator.support.origin
458463
maximum = self.interpolator.support.maximum
459-
origin[origin < np.min(data, axis=0)] = np.min(data, axis=0)[origin < np.min(data, axis=0)]
460-
maximum[maximum < np.max(data, axis=0)] = np.max(data, axis=0)[
461-
maximum < np.max(data, axis=0)
462-
]
464+
pts = self.model.bounding_box.with_buffer(buffer).regular_grid(local=True)
465+
for f in self.faults:
466+
pts = f.apply_to_points(pts)
463467

468+
origin[origin > np.min(pts, axis=0)] = np.min(pts, axis=0)[origin > np.min(pts, axis=0)]
469+
maximum[maximum < np.max(pts, axis=0)] = np.max(pts, axis=0)[maximum < np.max(pts, axis=0)]
464470
self.interpolator.support.origin = origin
465471
self.interpolator.support.maximum = maximum
466472

@@ -485,6 +491,9 @@ def build(self, fold=None, fold_weights={}, data_region=None, **kwargs):
485491
# self.get_interpolator(**kwargs)
486492
for f in self.faults:
487493
f.builder.update()
494+
domain = kwargs.get("domain", None)
495+
if domain:
496+
self.check_interpolation_geometry(None)
488497
self.add_data_to_interpolator(**kwargs)
489498
if data_region is not None:
490499
xyz = self.interpolator.get_data_locations()

LoopStructural/modelling/intrusions/intrusion_builder.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ def __init__(
3838
a geological interpolator, by default None
3939
"""
4040

41-
BaseBuilder.__init__(self, name=name)
41+
BaseBuilder.__init__(self, model, name=name)
4242

4343
self.intrusion_frame = frame
4444
self._up_to_date = False
45-
self.model = model
4645
self._feature = IntrusionFeature(
4746
frame=frame,
4847
builder=self,

0 commit comments

Comments
 (0)