Source code for geocode.field.faults
"""Faults component."""
from itertools import product
import numpy as np
from .base_component import Attribute
from .base_tree import BaseTree, BaseTreeNode
from .utils.decorators import apply_to_each_node
FACES = {'X': [1, 3, 5, 7], 'Y': [2, 3, 6, 7], 'Z': [4, 5, 6, 7]}
[docs]
class FaultsNode(BaseTreeNode):
"""Faults node."""
FAULTS_ATTRIBUTES = ['FAULTS', 'MULTFLT']
[docs]
class Faults(BaseTree):
"""Faults component."""
_attributes_to_load: list[Attribute] = [
Attribute(attr, 'GRID', attr) for attr in FAULTS_ATTRIBUTES]
def __init__(self, **kwargs):
root = FaultsNode(name='FIELD', is_group=True)
super().__init__(root=root, **kwargs)
[docs]
def build_tree(self):
"""Build tree from component's data."""
if 'FAULTS' in self:
faults = self.faults
else:
return self
for name in faults.NAME.unique():
FaultsNode(parent=self.root, name=name, key='NAME')
return self
[docs]
@apply_to_each_node
def get_blocks(self, segment, **kwargs):
"""Calculate grid blocks for the tree of faults."""
_ = kwargs
blocks_fault = []
xyz_fault = []
grid = self.field.grid
for _, cells in segment.faults.iterrows():
x_range = range(cells['I1']-1, cells['I2'])
y_range = range(cells['J1']-1, cells['J2'])
z_range = range(cells['K1']-1, cells['K2'])
blocks_segment = np.array(list(product(x_range, y_range, z_range)))
xyz_segment = grid.get_xyz(blocks_segment)[:, FACES[cells['FACE']]]
blocks_fault.extend(blocks_segment)
xyz_fault.extend(xyz_segment)
segment.blocks = np.array(blocks_fault)
segment.faces_verts = np.array(xyz_fault)
return self