Skip to content

Commit 418e576

Browse files
authored
Merge pull request #55 from gonuke/group_refactor
First attempt to generalize unique metadata group interactions
2 parents ab4fba8 + b382289 commit 418e576

2 files changed

Lines changed: 42 additions & 40 deletions

File tree

src/pydagmc/dagnav.py

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,31 @@ def category(self, category: str):
407407
def groups(self) -> list[Group]:
408408
"""Get list of groups containing this DAGMC set."""
409409
return [group for group in self.model.groups if self in group]
410+
411+
def _metadata_group(self, prefix: str) -> list[Group]:
412+
"""Get single group containing this DAGMC set, with matching prefix."""
413+
for group in self.model.groups:
414+
if self in group and prefix in group.name:
415+
return group
416+
return None
417+
418+
def _metadata_group_name(self, prefix: str) -> Optional[str]:
419+
group = self._metadata_group(prefix)
420+
if group is not None:
421+
return group.name.removeprefix(prefix)
422+
return None
423+
424+
def _set_metadata_group(self, prefix: str, name: str):
425+
group = self._metadata_group(prefix)
426+
427+
if group is not None:
428+
# remove surface from existing group
429+
group.remove_set(self)
430+
431+
# create a new group or get an existing group
432+
if name is not None:
433+
group = Group.create(self.model, name = prefix + name)
434+
group.add_set(self)
410435

411436
@abstractmethod
412437
def _get_triangle_sets(self):
@@ -539,8 +564,9 @@ def create(cls, model: Model, global_id: Optional[int] = None) -> GeometrySet:
539564

540565
class Surface(GeometrySet):
541566

542-
_category = 'Surface'
543-
_geom_dimension = 2
567+
_category: str = 'Surface'
568+
_geom_dimension: int = 2
569+
_boundary_prefix: str = "boundary:"
544570

545571
def __init__(self, model: Model, handle: np.uint64):
546572
super().__init__(model, handle)
@@ -590,32 +616,17 @@ def reverse_volume(self, volume: Volume):
590616
self.senses = [self.forward_volume, volume]
591617

592618
@property
593-
def _boundary_group(self) -> Optional[Group]:
594-
for group in self.groups:
595-
if "boundary:" in group.name:
596-
return group
597-
return None
619+
def boundary_group(self) -> Optional[Group]:
620+
return self._metadata_group(self._boundary_prefix)
598621

599622
@property
600623
def boundary(self) -> Optional[str]:
601624
"""Name of the boundary assigned to this surface."""
602-
group = self._boundary_group
603-
if group is not None:
604-
return group.name.removeprefix('boundary:')
605-
return None
606-
625+
return self._metadata_group_name(self._boundary_prefix)
626+
607627
@boundary.setter
608628
def boundary(self, name: Optional[str]):
609-
group = self._boundary_group
610-
611-
if group is not None:
612-
# Remove surface from existing group
613-
group.remove_set(self)
614-
615-
# create a new group or get an existing group
616-
if name is not None:
617-
group = Group.create(self.model, name=f"boundary:{name}")
618-
group.add_set(self)
629+
self._set_metadata_group(self._boundary_prefix, name)
619630

620631
@property
621632
def volumes(self) -> list[Volume]:
@@ -646,37 +657,24 @@ class Volume(GeometrySet):
646657

647658
_category: str = 'Volume'
648659
_geom_dimension: int = 3
660+
_material_prefix: str = 'mat:'
649661

650662
def __init__(self, model: Model, handle: np.uint64):
651663
super().__init__(model, handle)
652664
self._check_category_and_dimension()
653665

654666
@property
655-
def _material_group(self) -> Optional[Group]:
656-
for group in self.groups:
657-
if "mat:" in group.name:
658-
return group
659-
return None
667+
def material_group(self) -> Optional[Group]:
668+
return self._metadata_group(self._material_prefix)
660669

661670
@property
662671
def material(self) -> Optional[str]:
663672
"""Name of the material assigned to this volume."""
664-
group = self._material_group
665-
if group is not None:
666-
return group.name[4:]
667-
return None
673+
return self._metadata_group_name(self._material_prefix)
668674

669675
@material.setter
670676
def material(self, name: str):
671-
group = self._material_group
672-
673-
if group is not None:
674-
# Remove volume from existing group
675-
group.remove_set(self)
676-
677-
# create a new group or get an existing group
678-
group = Group.create(self.model, name=f"mat:{name}")
679-
group.add_set(self)
677+
self._set_metadata_group(self._material_prefix, name)
680678

681679
@property
682680
def surfaces(self) -> list[Surface]:

test/test_dagnav.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,12 @@ def test_initial_volume_properties_and_groups(fuel_pin_model, fuel_pin_volumes):
301301
# Check initial material via volume property and group membership
302302
assert vol1.material == 'fuel'
303303
assert vol1 in model.groups_by_name['mat:fuel']
304+
assert vol1.material_group == model.groups_by_name['mat:fuel']
304305
assert vol2.material == 'fuel'
305306
assert vol2 in model.groups_by_name['mat:fuel']
306307
assert vol3.material == '41'
307308
assert vol3 in model.groups_by_name['mat:41']
309+
assert vol3.material_group == model.groups_by_name['mat:41']
308310
assert vol4.material == 'Graveyard'
309311
assert vol4 in model.groups_by_name['mat:Graveyard']
310312

@@ -959,11 +961,13 @@ def test_surface_boundary():
959961
# Set a valid boundary condition
960962
surf.boundary = 'Reflecting'
961963
assert surf.boundary == 'Reflecting'
964+
assert surf.boundary_group == model.groups_by_name['boundary:Reflecting']
962965
assert [1] == sorted(model.groups_by_name['boundary:Reflecting'].surface_ids)
963966

964967
# Change the boundary condition
965968
surf.boundary = 'Vacuum'
966969
assert surf.boundary == 'Vacuum'
970+
assert surf.boundary_group == model.groups_by_name['boundary:Vacuum']
967971
assert [1] == sorted(model.groups_by_name['boundary:Vacuum'].surface_ids)
968972
assert [] == sorted(model.groups_by_name['boundary:Reflecting'].surface_ids)
969973

0 commit comments

Comments
 (0)