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
45 changes: 41 additions & 4 deletions geoapps/octree_creation/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,23 @@

from geoapps.base.application import BaseApplication
from geoapps.base.selection import ObjectDataSelection
from geoapps.octree_creation.constants import app_initializer
from geoapps.octree_creation.driver import OctreeDriver
from geoapps.octree_creation.params import OctreeParams
from geoapps.utils import warn_module_not_found

from . import OctreeParams, app_initializer
from .driver import OctreeDriver

with warn_module_not_found():
from ipywidgets import Dropdown, FloatText, Label, Layout, Text, VBox, Widget
from ipywidgets import (
Checkbox,
Dropdown,
FloatText,
IntText,
Label,
Layout,
Text,
VBox,
Widget,
)
from ipywidgets.widgets.widget_selection import TraitError


Expand All @@ -46,6 +56,8 @@ class OctreeMesh(ObjectDataSelection):
_depth_core = None
_horizontal_padding = None
_vertical_padding = None
_diagonal_balance = None
_minimum_level = None

def __init__(self, ui_json=None, **kwargs):
app_initializer.update(kwargs)
Expand Down Expand Up @@ -79,6 +91,9 @@ def __init__(self, ui_json=None, **kwargs):
Label("Padding distance"),
self.horizontal_padding,
self.vertical_padding,
Label("Basic"),
self.diagonal_balance,
self.minimum_level,
],
layout=Layout(border="solid"),
),
Expand Down Expand Up @@ -180,6 +195,28 @@ def vertical_padding(self) -> FloatText:
)
return self._vertical_padding

@property
def diagonal_balance(self) -> Checkbox:
"""
Widget controlling the diagonal balance.
"""
if getattr(self, "_diagonal_balance", None) is None:
self._diagonal_balance = Checkbox(
description="UBC compatible",
)
return self._diagonal_balance

@property
def minimum_level(self) -> IntText:
"""
Widget controlling the minimum refinement level.
"""
if getattr(self, "_minimum_level", None) is None:
self._minimum_level = IntText(
description="Minimum refinement level",
)
return self._minimum_level

@property
def workspace(self):
"""
Expand Down
6 changes: 6 additions & 0 deletions geoapps/octree_creation/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@
"main": True,
"value": 500.0,
},
"diagonal_balance": {
"group": "Basic",
"label": "UBC Compatible",
"main": True,
"value": True,
},
"minimum_level": {
"enabled": True,
"group": "Basic",
Expand Down
35 changes: 29 additions & 6 deletions geoapps/octree_creation/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ def octree_from_params(params: OctreeParams):
depth_core=params.depth_core,
)
minimum_level = OctreeDriver.minimum_level(mesh, params.minimum_level)
mesh.refine(minimum_level, finalize=False)
mesh.refine(
minimum_level, finalize=False, diagonal_balance=params.diagonal_balance
)

for label, value in params.free_parameter_dict.items():
refinement_object = getattr(params, value["object"])
Expand All @@ -77,19 +79,20 @@ def octree_from_params(params: OctreeParams):

if isinstance(refinement_object, Curve):
mesh = OctreeDriver.refine_tree_from_curve(
mesh, refinement_object, levels
mesh, refinement_object, levels, params.diagonal_balance
)

elif isinstance(refinement_object, Surface):
mesh = OctreeDriver.refine_tree_from_triangulation(
mesh, refinement_object, levels
mesh, refinement_object, levels, params.diagonal_balance
)

elif getattr(params, value["type"]) == "surface":
mesh = OctreeDriver.refine_tree_from_surface(
mesh,
refinement_object,
levels,
params.diagonal_balance,
max_distance=getattr(params, value["distance"]),
)

Expand All @@ -98,6 +101,7 @@ def octree_from_params(params: OctreeParams):
mesh,
refinement_object,
levels,
diagonal_balance=params.diagonal_balance,
)

else:
Expand All @@ -116,6 +120,7 @@ def refine_tree_from_curve(
mesh: TreeMesh,
curve: Curve,
levels: list[int] | np.ndarray,
diagonal_balance: bool = True,
finalize: bool = False,
) -> TreeMesh:
"""
Expand All @@ -126,6 +131,7 @@ def refine_tree_from_curve(
:param curve: Curve object to use for refinement.
:param levels: Number of cells requested at each refinement level.
Defined in reversed order from the highest octree to lowest.
:param diagonal_balance: Whether to balance cells along the diagonal of the tree during construction.
:param finalize: Finalize the tree mesh after refinement.

"""
Expand All @@ -137,7 +143,7 @@ def refine_tree_from_curve(

locations = densify_curve(curve, mesh.h[0][0])
mesh = OctreeDriver.refine_tree_from_points(
mesh, locations, levels, finalize=False
mesh, locations, levels, diagonal_balance=diagonal_balance, finalize=False
)

if finalize:
Expand All @@ -150,6 +156,7 @@ def refine_tree_from_points(
mesh: TreeMesh,
points: ObjectBase | np.ndarray,
levels: list[int] | np.ndarray,
diagonal_balance: bool = True,
finalize: bool = False,
) -> TreeMesh:
"""
Expand All @@ -159,6 +166,7 @@ def refine_tree_from_points(
:param points: Object to use for refinement.
:param levels: Number of cells requested at each refinement level.
Defined in reversed order from the highest octree to lowest.
:param diagonal_balance: Whether to balance cells along the diagonal of the tree during construction.
:param finalize: Finalize the tree mesh after refinement.

:return: Refined tree mesh.
Expand All @@ -177,7 +185,13 @@ def refine_tree_from_points(
distance = 0
for ii, n_cells in enumerate(levels):
distance += n_cells * OctreeDriver.cell_size_from_level(mesh, ii)
mesh.refine_ball(locations, distance, mesh.max_level - ii, finalize=False)
mesh.refine_ball(
locations,
distance,
mesh.max_level - ii,
diagonal_balance=diagonal_balance,
finalize=False,
)

if finalize:
mesh.finalize()
Expand All @@ -189,6 +203,7 @@ def refine_tree_from_surface(
mesh: TreeMesh,
surface: ObjectBase,
levels: list[int] | np.ndarray,
diagonal_balance: bool = True,
max_distance: float = np.inf,
finalize: bool = False,
) -> TreeMesh:
Expand All @@ -200,6 +215,7 @@ def refine_tree_from_surface(
:param levels: Number of cells requested at each refinement level.
Defined in reversed order from the highest octree to lowest.
:param max_distance: Maximum distance from the surface to refine.
:param diagonal_balance: Whether to balance cells along the diagonal of the tree during construction.
:param finalize: Finalize the tree mesh after refinement.

:return: Refined tree mesh.
Expand Down Expand Up @@ -247,6 +263,7 @@ def refine_tree_from_surface(
mesh.insert_cells(
np.c_[xy[keeper], elevation - depth],
np.ones(nnz) * mesh.max_level - ind,
diagonal_balance=diagonal_balance,
finalize=False,
)

Expand All @@ -257,7 +274,11 @@ def refine_tree_from_surface(

@staticmethod
def refine_tree_from_triangulation(
mesh: TreeMesh, surface, levels: list[int] | np.ndarray, finalize=False
mesh: TreeMesh,
surface,
levels: list[int] | np.ndarray,
diagonal_balance: bool = True,
finalize=False,
) -> TreeMesh:
"""
Refine a tree mesh along the simplicies of a surface.
Expand All @@ -266,6 +287,7 @@ def refine_tree_from_triangulation(
:param surface: Surface object to use for refinement.
:param levels: Number of cells requested at each refinement level.
Defined in reversed order from highest octree to lowest.
:param diagonal_balance: Whether to balance cells along the diagonal of the tree during construction.
:param finalize: Finalize the tree mesh after refinement.

:return: Refined tree mesh.
Expand All @@ -290,6 +312,7 @@ def refine_tree_from_triangulation(
(surface.vertices, surface.cells),
-ind[0] - 1,
paddings,
diagonal_balance=diagonal_balance,
finalize=finalize,
)
return mesh
Expand Down
9 changes: 9 additions & 0 deletions geoapps/octree_creation/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def __init__(self, input_file=None, **kwargs):
self._u_cell_size = None
self._v_cell_size = None
self._w_cell_size = None
self._diagonal_balance = None
self._minimum_level = None
self._horizontal_padding = None
self._vertical_padding = None
Expand Down Expand Up @@ -143,6 +144,14 @@ def depth_core(self):
def depth_core(self, val):
self.setter_validator("depth_core", val)

@property
def diagonal_balance(self):
return self._diagonal_balance

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

@property
def minimum_level(self):
return self._minimum_level
Expand Down
2 changes: 2 additions & 0 deletions geoapps/utils/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,7 @@ def topo_drape(x, y):
mesh,
topography,
levels=refinement,
diagonal_balance=False,
Comment thread
jamiefb marked this conversation as resolved.
finalize=False,
)

Expand All @@ -425,6 +426,7 @@ def topo_drape(x, y):
mesh,
vertices,
levels=[2],
diagonal_balance=False,
finalize=False,
)

Expand Down
1 change: 1 addition & 0 deletions tests/data_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ def test_survey_data(tmp_path: Path):
mesh,
test_topo_object,
levels=[2],
diagonal_balance=False,
finalize=True,
)

Expand Down
Loading