diff --git a/boundaries/__init__.py b/boundaries/__init__.py index afce6f99c69a8581cafb61c22ff6f6357bf302c3..cf94f330fbf384d075886aca1abd8aaf05dc29f0 100644 --- a/boundaries/__init__.py +++ b/boundaries/__init__.py @@ -1,5 +1,5 @@ from pystencils.boundaries.boundaryhandling import BoundaryHandling -from pystencils.boundaries.boundaryconditions import Neumann +from pystencils.boundaries.boundaryconditions import Neumann, Dirichlet from pystencils.boundaries.inkernel import add_neumann_boundary -__all__ = ['BoundaryHandling', 'Neumann', 'add_neumann_boundary'] +__all__ = ['BoundaryHandling', 'Neumann', 'Dirichlet', 'add_neumann_boundary'] diff --git a/boundaries/boundaryconditions.py b/boundaries/boundaryconditions.py index db898d98278b5848f6173f2310acc86d5814a894..f1e99e04f4d565a9f5d81ef02e7546010a533269 100644 --- a/boundaries/boundaryconditions.py +++ b/boundaries/boundaryconditions.py @@ -1,6 +1,7 @@ +from typing import List, Tuple, Any from pystencils import Assignment from pystencils.boundaries.boundaryhandling import BoundaryOffsetInfo -from typing import List, Tuple, Any +from pystencils.data_types import create_type class Boundary: @@ -68,3 +69,27 @@ class Neumann(Boundary): def __eq__(self, other): return type(other) == Neumann + + +class Dirichlet(Boundary): + def __init__(self, value, name="Dirchlet"): + super().__init__(name) + self._value = value + + @property + def additional_data(self): + if callable(self._value): + return [('value', create_type("double"))] + else: + return [] + + @property + def additional_data_init_callback(self): + if callable(self._value): + return self._value + + def __call__(self, field, direction_symbol, index_field, **kwargs): + if self.additional_data: + return [Assignment(field.center, index_field("value"))] + if field.index_dimensions == 0: + return [Assignment(field.center, self._value)]