class devito.types.SubDomain(*args, **kwargs)[source]

Bases: AbstractSubDomain

Base class to define Grid subdomains.

To create a new SubDomain, all one needs to do is overriding define(). This method takes as input a set of Dimensions and produce a mapper

M : Dimensions -> {d, ('left', N), ('middle', N, M), ('right', N)}

so that:

  • If M(d) = d, then the SubDomain spans the entire Dimension d.

  • If M(d) = ('left', N), then the SubDomain spans a contiguous region of N points starting at d’s left extreme.

  • M(d) = ('right', N) is analogous to the case above.

  • If M(d) = ('middle', N, M), then the SubDomain spans a contiguous region of d_size - (N + M) points starting at N and finishing at d_sizeM - M.


An “Inner” SubDomain, which spans the entire domain except for an exterior boundary region of thickness=3, can be implemented as follows

>>> from devito import SubDomain
>>> class Inner(SubDomain):
...     name = 'inner'
...     def define(self, dimensions):
...         return {d: ('middle', 3, 3) for d in dimensions}

Like before, but now spanning the entire y Dimension of a three-dimensional grid

>>> class InnerY(SubDomain):
...     name = 'inner_y'
...     def define(self, dimensions):
...         x, y, z = dimensions
...         return {x: ('middle', 3, 3), y: y, z: ('middle', 3, 3)}

See also


An example of preset SubDomain.


An example of preset Subdomain.


Parametrically describe the SubDomain w.r.t. a generic Grid.


This method should be overridden by each SubDomain subclass. For more information, refer to SubDomain.__doc__.