Source code for firedrake.adjoint_utils.mesh
from functools import wraps
from pyadjoint.overloaded_type import OverloadedType
from pyadjoint.tape import no_annotations
[docs]
class MeshGeometryMixin(OverloadedType):
@staticmethod
def _ad_annotate_init(init):
@wraps(init)
def wrapper(self, *args, **kwargs):
OverloadedType.__init__(self, *args, **kwargs)
init(self, *args, **kwargs)
self._ad_coordinate_space = None
return wrapper
@no_annotations
def _ad_create_checkpoint(self):
return self.coordinates.copy(deepcopy=True)
@no_annotations
def _ad_restore_at_checkpoint(self, checkpoint):
self.coordinates.assign(checkpoint)
return self
@staticmethod
def _ad_annotate_coordinates_function(coordinates_function):
@wraps(coordinates_function)
def wrapper(self, *args, **kwargs):
from .blocks import MeshInputBlock, MeshOutputBlock
f = coordinates_function(self)
f.block_class = MeshInputBlock
f._ad_floating_active = True
f._ad_args = [self]
f._ad_output_args = [self]
f.output_block_class = MeshOutputBlock
f._ad_outputs = [self]
return f
return wrapper
def _ad_function_space(self):
if self._ad_coordinate_space is None:
self._ad_coordinate_space = self.coordinates.function_space().ufl_function_space()
return self._ad_coordinate_space