Source code for pymor.discretizers.builtin.grids.boundaryinfos

# This file is part of the pyMOR project (http://www.pymor.org).
# Copyright 2013-2020 pyMOR developers and contributors. All rights reserved.
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)

import numpy as np

from pymor.discretizers.builtin.grids.interfaces import BoundaryInfo


[docs]class EmptyBoundaryInfo(BoundaryInfo): """|BoundaryInfo| with no boundary types attached to any boundary.""" def __init__(self, grid): self.__auto_init(locals()) self.boundary_types = frozenset()
[docs] def mask(self, boundary_type, codim): assert False, f'Has no boundary_type "{boundary_type}"'
[docs]class GenericBoundaryInfo(BoundaryInfo): """Generic |BoundaryInfo| storing entity masks per boundary type.""" def __init__(self, grid, masks, assert_unique_type=(1,), assert_some_type=()): self.__auto_init(locals()) self.boundary_types = frozenset(masks) self.check_boundary_types(assert_unique_type=self.assert_unique_type, assert_some_type=self.assert_some_type)
[docs] @classmethod def from_indicators(cls, grid, indicators, assert_unique_type=None, assert_some_type=None): """Create |BoundaryInfo| from indicator functions. Parameters ---------- grid The |Grid| to which the |BoundaryInfo| is associated. indicators Dict where each key is a boundary type and the corresponding value is a boolean valued function defined on the analytical domain which indicates if a point belongs to a boundary of the given boundary type (the indicator functions must be vectorized). """ masks = {boundary_type: [np.zeros(grid.size(codim), dtype='bool') for codim in range(1, grid.dim + 1)] for boundary_type in indicators} for boundary_type, codims in masks.items(): for c, mask in enumerate(codims): mask[grid.boundaries(c + 1)] = indicators[boundary_type](grid.centers(c + 1)[grid.boundaries(c + 1)]) return cls(grid, masks, assert_unique_type=assert_unique_type, assert_some_type=assert_some_type)
[docs] def mask(self, boundary_type, codim): assert 1 <= codim <= self.grid.dim return self.masks[boundary_type][codim - 1]
[docs]class AllDirichletBoundaryInfo(BoundaryInfo): """|BoundaryInfo| where the boundary type 'dirichlet' is attached to each boundary entity.""" def __init__(self, grid): self.__auto_init(locals()) self.boundary_types = frozenset({'dirichlet'})
[docs] def mask(self, boundary_type, codim): assert boundary_type == 'dirichlet', f'Has no boundary_type "{boundary_type}"' assert 1 <= codim <= self.grid.dim return np.ones(self.grid.size(codim), dtype='bool') * self.grid.boundary_mask(codim)