Skip to content

Commit 0a63362

Browse files
refactor: remove material settings from settings class (#1257)
Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent 64a53ac commit 0a63362

File tree

6 files changed

+20
-69
lines changed

6 files changed

+20
-69
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove material settings from settings class

src/ansys/health/heart/settings/defaults/electrophysiology.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,12 @@
5151
"sigma_passive": Quantity(1.0, "mS/mm"), # mS/mm: use for passive conduction (e.g. blood)
5252
"beta": Quantity(140, "1/mm"),
5353
"cm": Quantity(0.01, "uF/mm^2"), # uF/mm^2
54-
# These are not really material properties?
55-
"lambda": Quantity(0.2, "dimensionless"), # activate extracellular potential solve
56-
"percent_endo": Quantity(0.17, "dimensionless"), # thickness of endocardial layer
57-
"percent_mid": Quantity(0.41, "dimensionless"), # thickness of midmyocardial layer
5854
},
5955
"beam": {
6056
"velocity": Quantity(1, "mm/ms"), # mm/ms in case of eikonal model
6157
"sigma": Quantity(1, "mS/mm"), # mS/mm
6258
"beta": Quantity(140, "1/mm"),
6359
"cm": Quantity(0.001, "uF/mm^2"), # uF/mm^2
64-
"lambda": Quantity(0.2, "dimensionless"),
6560
},
6661
}
6762

@@ -72,15 +67,11 @@
7267
"sigma_sheet_normal": Quantity(0.2, "mm/ms"), # mm/ms in case of eikonal model
7368
"beta": Quantity(140, "1/mm"),
7469
"cm": Quantity(0.01, "uF/mm^2"), # uF/mm^2
75-
"lambda": Quantity(0.2, "dimensionless"),
76-
"percent_endo": Quantity(0.17, "dimensionless"),
77-
"percent_mid": Quantity(0.41, "dimensionless"),
7870
}
7971
default_beam_material_eikonal = {
8072
"sigma_fiber": Quantity(1, "mm/ms"), # mm/ms in case of eikonal model
8173
"beta": Quantity(140, "1/mm"),
8274
"cm": Quantity(0.001, "uF/mm^2"), # uF/mm^2
83-
"lambda": Quantity(0.2, "dimensionless"),
8475
}
8576

8677
# Create monodomain defaults by copying eikonal and changing relevant fields

src/ansys/health/heart/settings/settings.py

Lines changed: 11 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -168,33 +168,6 @@ class EPAnalysis(Analysis):
168168
solvertype: Literal["Monodomain", "Eikonal", "ReactionEikonal"] = "Monodomain"
169169

170170

171-
@dataclass(repr=False)
172-
class Material(Settings):
173-
"""Class for storing material settings."""
174-
175-
myocardium: AttrDict = None
176-
"""Myocardium material."""
177-
passive: AttrDict = None
178-
"""Passive material. For example, the vessel wall."""
179-
cap: AttrDict = None
180-
"""Cap material."""
181-
182-
183-
@dataclass(repr=False)
184-
class EpMaterial(Settings):
185-
"""Class for storing EP material settings."""
186-
187-
myocardium: AttrDict = None
188-
"""Myocardium material."""
189-
atrium: AttrDict = None
190-
"""Atrial material."""
191-
cap: AttrDict = None
192-
"""Cap material."""
193-
beam: AttrDict = None
194-
"""Beam material."""
195-
# TODO: consider 'other', e.g passive conductor, soft tissue...?
196-
197-
198171
@dataclass(repr=False)
199172
class BoundaryConditions(Settings):
200173
"""Stores settings/parameters for boundary conditions."""
@@ -226,8 +199,6 @@ class Mechanics(Settings):
226199

227200
analysis: Analysis = field(default_factory=lambda: Analysis())
228201
"""Generic analysis settings."""
229-
material: Material = field(default_factory=lambda: Material())
230-
"""Material settings/configuration."""
231202
boundary_conditions: BoundaryConditions = field(default_factory=lambda: BoundaryConditions())
232203
"""Boundary condition specifications."""
233204
system: SystemModel = field(default_factory=lambda: SystemModel())
@@ -297,13 +268,22 @@ def __setattr__(self, __name: str, __value) -> None:
297268
class Electrophysiology(Settings):
298269
"""Class for keeping track of EP settings."""
299270

300-
material: EpMaterial = field(default_factory=lambda: EpMaterial())
301-
"""Material settings/configuration."""
302271
analysis: EPAnalysis = field(default_factory=lambda: EPAnalysis())
303272
"""Generic analysis settings."""
304273
stimulation: AttrDict[str, Stimulation] = None
305274
"""Stimulation settings."""
306275

276+
_layers: dict = field(
277+
default_factory=lambda: {
278+
"percent_endo": Quantity(0.17, "dimensionless"), # thickness of endocardial layer
279+
"percent_mid": Quantity(0.41, "dimensionless"), # thickness of midmyocardial layer
280+
}
281+
)
282+
"""Layers for material assignment of the myocardium."""
283+
284+
_lambda: Quantity = Quantity(0.2, "dimensionless") # activate extracellular potential solve
285+
"""Intra to extracellular conductivity ratio."""
286+
307287

308288
@dataclass(repr=False)
309289
class Fibers(Settings):
@@ -544,14 +524,11 @@ def load(self, filename: pathlib.Path):
544524
# assign values to each respective attribute
545525
analysis = Analysis()
546526
analysis.set_values(settings[attribute_name]["analysis"])
547-
material = Material()
548-
material.set_values(settings[attribute_name]["material"])
549527
boundary_conditions = BoundaryConditions()
550528
boundary_conditions.set_values(settings[attribute_name]["boundary_conditions"])
551529
system_model = SystemModel()
552530
system_model.set_values(settings[attribute_name]["system"])
553531
self.mechanics.analysis = analysis
554-
self.mechanics.material = material
555532
self.mechanics.boundary_conditions = boundary_conditions
556533
self.mechanics.system = system_model
557534

@@ -593,15 +570,12 @@ def load_defaults(self):
593570
if isinstance(getattr(self, attr), Mechanics):
594571
analysis = Analysis()
595572
analysis.set_values(mech_defaults.analysis)
596-
material = Material()
597-
material.set_values(mech_defaults.material)
598573
boundary_conditions = BoundaryConditions()
599574
boundary_conditions.set_values(mech_defaults.boundary_conditions)
600575
system_model = SystemModel()
601576
system_model.set_values(mech_defaults.system_model)
602577

603578
self.mechanics.analysis = analysis
604-
self.mechanics.material = material
605579
self.mechanics.boundary_conditions = boundary_conditions
606580
self.mechanics.system = system_model
607581

@@ -613,12 +587,7 @@ def load_defaults(self):
613587
if isinstance(getattr(self, attr), Electrophysiology):
614588
analysis = EPAnalysis()
615589
analysis.set_values(ep_defaults.analysis)
616-
# TODO: Deprecate this way of handling default materials
617-
material = EpMaterial()
618-
material.set_values(ep_defaults.material)
619-
620590
self.electrophysiology.analysis = analysis
621-
self.electrophysiology.material = material
622591
self.electrophysiology.stimulation: AttrDict[str, Stimulation] = AttrDict()
623592
for key in ep_defaults.stimulation.keys():
624593
system_model = Stimulation()

src/ansys/health/heart/writer/ep_writer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,8 @@ def _update_parts_cellmodels(self) -> None:
425425

426426
def _create_myocardial_nodeset_layers(self) -> tuple[int, int, int]:
427427
"""Create myocardial node set layers."""
428-
percent_endo = self.settings.electrophysiology.material.myocardium["percent_endo"]
429-
percent_mid = self.settings.electrophysiology.material.myocardium["percent_mid"]
428+
percent_endo = self.settings.electrophysiology._layers["percent_endo"].m
429+
percent_mid = self.settings.electrophysiology._layers["percent_mid"].m
430430
values = self.model.mesh.point_data["transmural"]
431431
# Values from experimental data. See:
432432
# https://www.frontiersin.org/articles/10.3389/fphys.2019.00580/full
@@ -699,7 +699,7 @@ def _update_blood_settings(self) -> None:
699699
for kw in deck.keywords:
700700
# activate extracellular potential solve
701701
if "EM_MAT" in kw.get_title():
702-
kw.lambda_ = self.settings.electrophysiology.material.myocardium["lambda"].m
702+
kw.lambda_ = self.settings.electrophysiology._lambda.m
703703

704704
def _update_ECG_coordinates(self) -> None: # noqa N802
705705
"""Add ECG computation content."""

src/ansys/health/heart/writer/mechanics_writer.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
Mat295,
3939
NeoHookean,
4040
)
41-
import ansys.health.heart.settings.settings as sett
4241
from ansys.health.heart.settings.settings import SimulationSettings
4342
from ansys.health.heart.utils.vtk_utils import compute_surface_nodal_area_pyvista
4443
from ansys.health.heart.writer import custom_keywords as custom_keywords
@@ -81,8 +80,6 @@ def __init__(
8180
self.set_flow_area: bool = True
8281
"""Flag indicating if the flow area is set for control volume."""
8382

84-
if sett.Mechanics not in self._get_subsettings():
85-
raise ValueError("Expecting mechanics settings.")
8683
return
8784

8885
def update(self, dynain_name: Optional[str] = None, robin_bcs: list[Callable] = None) -> None:

tests/heart/settings/test_settings.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@
5151
" dt_icvout: 5 millisecond\n"
5252
" global_damping: 0.33 / second\n"
5353
" stiffness_damping: 0.1 second\n"
54-
" material:\n"
55-
" myocardium: null\n"
56-
" passive: null\n"
57-
" cap: null\n"
5854
" boundary_conditions:\n"
5955
" robin: null\n"
6056
" valve: null\n"
@@ -68,11 +64,6 @@
6864
REF_STRING_SETTINGS_YML_EP = (
6965
"Simulation Settings:\n"
7066
" electrophysiology:\n"
71-
" material:\n"
72-
" myocardium: null\n"
73-
" atrium: null\n"
74-
" cap: null\n"
75-
" beam: null\n"
7667
" analysis:\n"
7768
" end_time: 1 second\n"
7869
" dtmin: 2 second\n"
@@ -89,6 +80,10 @@
8980
" period: 800 millisecond\n"
9081
" duration: 20 millisecond\n"
9182
" amplitude: 50 microfarad / millimeter ** 3\n"
83+
" _layers:\n"
84+
" percent_endo: 0.17 dimensionless\n"
85+
" percent_mid: 0.41 dimensionless\n"
86+
" _lambda: 0.2 dimensionless\n"
9287
)
9388

9489

@@ -279,9 +274,7 @@ def default_allsettings():
279274
def test_load_defaults(default_settings):
280275
default_settings.to_consistent_unit_system()
281276

282-
assert default_settings.mechanics.material.myocardium["isotropic"]["rho"].m == pytest.approx(
283-
0.001, 1e-9
284-
)
277+
assert default_settings.mechanics.analysis.end_time.m == 800.0
285278

286279

287280
def test_purkinje_settings(default_allsettings: SimulationSettings):

0 commit comments

Comments
 (0)