Skip to content

Commit f92749b

Browse files
author
Lachlan Grose
committed
fix: ✨ faults/fault builder now store the fault geometry parameters
1 parent 16d16d7 commit f92749b

File tree

2 files changed

+71
-11
lines changed

2 files changed

+71
-11
lines changed

LoopStructural/modelling/fault/fault_builder.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ def __init__(
4848
] + fault_bounding_box_buffer * (
4949
self.model.bounding_box[1, :] - self.model.bounding_box[0, :]
5050
)
51+
self.fault_normal_vector = None
52+
self.fault_slip_vector = None
53+
self.fault_strike_vector = None
54+
self.fault_minor_axis = None
55+
self.fault_major_axis = None
56+
self.fault_intermediate_axis = None
57+
self.fault_centre = None
5158

5259
def update_geometry(self, points):
5360
self.origin = np.nanmin(np.array([np.min(points, axis=0), self.origin]), axis=0)
@@ -95,6 +102,12 @@ def create_data_from_geometry(
95102
intermediate_axis : double
96103
fault volume radius in the slip direction
97104
"""
105+
self.fault_normal_vector = normal_vector
106+
self.fault_slip_vector = slip_vector
107+
self.fault_minor_axis = minor_axis
108+
self.fault_major_axis = major_axis
109+
self.fault_intermediate_axis = intermediate_axis
110+
self.fault_centre = fault_center
98111
if major_axis is None:
99112
fault_trace = data.loc[
100113
np.logical_and(data["coord"] == 0, data["val"] == 0), ["X", "Y"]
@@ -125,6 +138,8 @@ def create_data_from_geometry(
125138
# logger.info("{} : projecting slip vector onto fault plane".format(self.name))
126139
# slip_vector = np.cross(normal_vector, np.cross(slip_vector ,normal_vector))
127140
strike_vector = np.cross(normal_vector, slip_vector)
141+
self.fault_strike_vector = strike_vector
142+
128143
fault_edges = np.zeros((2, 3))
129144
fault_tips = np.zeros((2, 3))
130145
fault_depth = np.zeros((2, 3))
@@ -160,7 +175,7 @@ def create_data_from_geometry(
160175
0,
161176
w,
162177
]
163-
logger.warning("Converting fault norm data to gradient data")
178+
logger.info("Converting fault norm data to gradient data")
164179
mask = np.logical_and(data["coord"] == 0, ~np.isnan(data["nx"]))
165180
data.loc[mask, ["gx", "gy", "gz"]] = data.loc[
166181
mask, ["nx", "ny", "nz"]

LoopStructural/modelling/fault/fault_segment.py

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,48 @@ def __init__(
5454
self.splay = {}
5555
self.abut = {}
5656

57+
@property
58+
def fault_normal_vector(self):
59+
if self.builder == None:
60+
raise ValueError("Fault builder not set")
61+
return self.builder.fault_normal_vector
62+
63+
@property
64+
def fault_slip_vector(self):
65+
if self.builder == None:
66+
raise ValueError("Fault builder not set")
67+
return self.builder.fault_slip_vector
68+
69+
@property
70+
def fault_strike_vector(self):
71+
if self.builder == None:
72+
raise ValueError("Fault builder not set")
73+
return self.builder.fault_strike_vector
74+
75+
@property
76+
def fault_minor_axis(self):
77+
if self.builder == None:
78+
raise ValueError("Fault builder not set")
79+
return self.builder.fault_minor_axis
80+
81+
@property
82+
def fault_major_axis(self):
83+
if self.builder == None:
84+
raise ValueError("Fault builder not set")
85+
return self.builder.fault_major_axis
86+
87+
@property
88+
def fault_intermediate_axis(self):
89+
if self.builder == None:
90+
raise ValueError("Fault builder not set")
91+
return self.builder.fault_intermediate_axis
92+
93+
@property
94+
def fault_centre(self):
95+
if self.builder == None:
96+
raise ValueError("Fault builder not set")
97+
return self.builder.fault_centre
98+
5799
def __str__(self):
58100
_str = "FaultSegment - {} \n".format(self.name)
59101
_str += "Interpolator: {} \n".format(self.faultframe[0].interpolator.type)
@@ -381,17 +423,20 @@ def add_abutting_fault(self, abutting_fault_feature, positive=None):
381423
) # get_value_constraints()
382424
abut_value = np.nanmedian(abutting_fault_feature.evaluate_value(pts))
383425
positive = abut_value > 0
426+
# we want to crop the fault by the abutting fault so create a positive/neg region and include the fault centre and normal vector to help
427+
# outside of the fault interpolation support
428+
384429
if positive:
385-
abutting_region = PositiveRegion(abutting_fault_feature)
430+
abutting_region = PositiveRegion(
431+
abutting_fault_feature,
432+
vector=abutting_fault_feature.fault_normal_vector,
433+
point=abutting_fault_feature.fault_centre,
434+
)
386435
if positive == False:
387-
abutting_region = NegativeRegion(abutting_fault_feature)
388-
# if positive == True:
389-
# ## adding the nan check avoids truncating the fault at the edge of the abutting fault bounding box.
390-
# ## it makes the assumption that the abutted fault is not drawn across the abutting fault... but this should be ok
391-
# return np.logical_or(abutting_fault_feature.evaluate_value(pos) > 0,
392-
# np.isnan(abutting_fault_feature.evaluate_value(pos)))
393-
# if positive == False:
394-
# return np.logical_or(abutting_fault_feature.evaluate_value(pos) < 0,
395-
# np.isnan(abutting_fault_feature.evaluate_value(pos)))
436+
abutting_region = NegativeRegion(
437+
abutting_fault_feature,
438+
vector=abutting_fault_feature.fault_normal_vector,
439+
point=abutting_fault_feature.fault_centre,
440+
)
396441
self.abut[abutting_fault_feature.name] = abutting_region
397442
self.faultframe[0].add_region(abutting_region)

0 commit comments

Comments
 (0)