def dolfin_adjoint_interpolate(self, other, annotate=None): out = dolfin_interpolate(self, other) if annotate is True: assignment.register_assign(self, other, op=backend.interpolate) adjglobals.adjointer.record_variable(adjglobals.adj_variables[self], libadjoint.MemoryStorage(adjlinalg.Vector(self))) return out
def __init__(self, *args, **kwargs): annotate = kwargs.pop("annotate", None) to_annotate = utils.to_annotate(annotate) if "name" in kwargs: self.adj_name = kwargs["name"] #if self.adj_name in adjglobals.function_names and to_annotate: # backend.info_red("Warning: got duplicate function name %s" % self.adj_name) adjglobals.function_names.add(self.adj_name) del kwargs["name"] backend.Function.__init__(self, *args, **kwargs) if hasattr(self, 'adj_name'): if backend.__name__ == "dolfin": self.rename(self.adj_name, "a Function from dolfin-adjoint") else: self.name = self.__str__ if to_annotate: if not isinstance(args[0], compatibility.function_space_type): if isinstance(args[0], backend.Function): known = adjglobals.adjointer.variable_known(adjglobals.adj_variables[args[0]]) else: known = True if known or (annotate is True): assignment.register_assign(self, args[0]) else: adjglobals.adj_variables.forget(args[0])
def copy(self, *args, **kwargs): name = kwargs.pop("name", None) annotate = kwargs.pop("annotate", None) to_annotate = utils.to_annotate(annotate) with misc.annotations(False): copy = backend.Function.copy(self, *args, **kwargs) copy = utils.function_to_da_function(copy) if name is not None: copy.adj_name = name copy.rename(name, "a Function from dolfin-adjoint") adjglobals.function_names.add(name) if to_annotate: assignment.register_assign(copy, self) return copy