Source code for cbcbeat.markerwisefield

# Copyright (C) 2014 Marie E. Rognes (meg@simula.no)
# Use and modify at will
# Last changed: 2016-10-19

__all__ = ["Markerwise", "handle_markerwise", "rhs_with_markerwise_field"]

from dolfinimport import dx, Measure, error

[docs]def handle_markerwise(g, classtype): # Handle stimulus if (g is None \ or isinstance(g, classtype) \ or isinstance(g, Markerwise) \ or isinstance(g, object)): ## HAHAHA return g else: msg = "Expecting stimulus to be a %s or Markerwise, not %r " \ % (str(classtype), g) error(msg)
[docs]def rhs_with_markerwise_field(g, mesh, v): if g is None: dz = dx rhs = 0.0 elif isinstance(g, Markerwise): markers = g.markers() dz = Measure("dx", domain=mesh, subdomain_data=markers) rhs = sum([g*v*dz(i) for (i, g) in zip(g.keys(), g.values())]) else: dz = dx rhs = g*v*dz() return (dz, rhs)
[docs]class Markerwise(object): """A container class representing an object defined by a number of objects combined with a mesh function defining mesh domains and a map between the these. *Arguments* objects (tuple) the different objects keys (tuple of ints) a map from the objects to the domains marked in markers markers (:py:class:`dolfin.MeshFunction`) a mesh function mapping which domains the mesh consist of *Example of usage* Given (g0, g1), (2, 5) and markers, let g = g0 on domains marked by 2 in markers g = g1 on domains marked by 5 in markers letting:: g = Markerwise((g0, g1), (2, 5), markers) """ def __init__(self, objects, keys, markers): "Create Markerwise from given input." # Check input assert len(objects) == len(keys), \ "Expecting the number of objects to equal the number of keys" # Store attributes: self._objects = dict(zip(keys, objects)) self._markers = markers
[docs] def values(self): "The objects" return self._objects.values()
[docs] def keys(self): "The keys or domain numbers" return self._objects.keys()
[docs] def markers(self): "The markers" return self._markers
def __getitem__(self, key): "The objects" return self._objects[key]
if __name__ == "__main__": from dolfin import * g1 = Expression("1.0", degree=1) g5 = Expression("sin(pi*x[0])", degree=3) mesh = UnitSquareMesh(16, 16) class SampleDomain(SubDomain): def inside(self, x, on_boundary): return all(x <= 0.5 + DOLFIN_EPS) markers = MeshFunction("size_t", mesh, mesh.topology().dim(), 1) domain = SampleDomain() domain.mark(markers, 5) g = Markerwise((g1, g5), (1, 5), markers) plot(g.markers()) for v in g.values(): plot(v, mesh=mesh) interactive()