Source code for pyadjoint_utils.solving.equation
from ..reduced_function import ReducedFunction
from pyadjoint.enlisting import Enlist
from functools import partial
def _default_apply_bc(bc, u):
if hasattr(u, "vector"):
bc.apply(u.vector())
else:
bc.apply(u)
return u
def _is_valid_bc(bc):
return hasattr(bc, "apply")
[docs]class ReducedEquation(object):
"""A class that encapsulates all the information required to formulate a
reduced equation solve problem."""
"""
reduced_function: a ReducedFunction that calculates the residual as a function of x.
bcs: a function or list of functions that apply boundary conditions.
h_bcs: a function or list of functions that apply homogenenous boundary conditions.
"""
def __init__(self, reduced_function, bcs=None, h_bcs=None):
bcs = [] if bcs is None else Enlist(bcs)
h_bcs = [] if h_bcs is None else Enlist(h_bcs)
bcs, h_bcs = self._validate_arguments(reduced_function, bcs, h_bcs)
self.reduced_function = reduced_function
self.bcs = bcs
self.h_bcs = h_bcs
def _validate_arguments(self, reduced_function, bcs, h_bcs):
if not isinstance(reduced_function, ReducedFunction):
raise TypeError("reduced_function should be a ReducedFunction")
for i, bc in enumerate(bcs):
if not callable(bc):
if not _is_valid_bc(bc):
raise TypeError("Boundary conditions must have an 'apply' method!")
else:
bcs[i] = partial(_default_apply_bc, bc)
for i, h_bc in enumerate(h_bcs):
if not callable(bc):
if not _is_valid_bc(h_bc):
raise TypeError(
"Homogenized boundary conditions must have an 'apply' method!"
)
else:
h_bcs[i] = partial(_default_apply_bc, h_bc)
return bcs, h_bcs