Source code for opentidalfarm.domains.rectangle_domain

import os.path
import dolfin
from .domain import Domain


[docs] class RectangularDomain(Domain): """ Create a rectangular domain. :param x0: The x coordinate of the bottom-left. :type x0: float :param y0: The y coordinate of the bottom-left. :type y0: float :param x1: The x coordinate of the top-right corner. :type x1: float :param y1: The y coordinate of the top-right corner. :type y1: float :param nx: The number of elements in the x direction :type ny: int :param ny: The number of elements in the y direction :type ny: int """ def __init__(self, x0, y0, x1, y1, nx, ny): #: A :class:`dolfin.Mesh` containing the mesh. mpi_comm = dolfin.mpi_comm_world() self.mesh = dolfin.RectangleMesh(mpi_comm, dolfin.Point(x0, y0), dolfin.Point(x1, y1), nx, ny) class Left(dolfin.SubDomain): def inside(self, x, on_boundary): return on_boundary and dolfin.near(x[0], x0) class Right(dolfin.SubDomain): def inside(self, x, on_boundary): return on_boundary and dolfin.near(x[0], x1) class Sides(dolfin.SubDomain): def inside(self, x, on_boundary): return on_boundary and (dolfin.near(x[1], y0) or dolfin.near(x[1], y1)) # Initialize sub-domain instances left = Left() right = Right() sides = Sides() # Create facet markers #: A :class:`dolfin.MeshFunction` containing the surface markers. self.facet_ids = dolfin.MeshFunction("size_t", self.mesh, self.mesh.topology().dim() - 1) self.facet_ids.set_all(0) left.mark(self.facet_ids, 1) right.mark(self.facet_ids, 2) sides.mark(self.facet_ids, 3) #: A :class:`dolfin.Measure` for the facet parts. self._ds = dolfin.Measure('ds')(subdomain_data=self.facet_ids) #: A :class:`dolfin.CellFunction` containing the area markers. self.cell_ids = dolfin.MeshFunction("size_t", self.mesh, self.mesh.topology().dim()) self.cell_ids.set_all(0) #: A :class:`dolfin.Measure` for the cell cell_ids. self._dx = dolfin.Measure("dx")(subdomain_data=self.cell_ids)