def evaluate_hessian(self, markings=False): hessian_input = self.get_outputs()[0].hessian_value if hessian_input is None: return f = backend.Function(backend.VectorFunctionSpace(self.get_outputs()[0].saved_output, "CG", 1)) f.vector()[:] = hessian_input hessian_value = vector_boundary_to_mesh(f, self.get_dependencies()[0].saved_output) self.get_dependencies()[0].add_hessian_output(hessian_value.vector())
def evaluate_adj(self, markings=False): adj_value = self.get_outputs()[0].adj_value if adj_value is None: return f = backend.Function(backend.VectorFunctionSpace(self.get_outputs()[0].saved_output, "CG", 1)) f.vector()[:] = adj_value adj_value = vector_boundary_to_mesh(f, self.get_dependencies()[0].saved_output) self.get_dependencies()[0].add_adj_output(adj_value.vector())
def vector_mesh_to_boundary(func, b_mesh): v_split = func.split(deepcopy=True) v_b = [] for v in v_split: v_b.append(mesh_to_boundary(v, b_mesh)) Vb = backend.VectorFunctionSpace(b_mesh, "CG", 1) vb_out = backend.Function(Vb) scalar_to_vec = backend.FunctionAssigner(Vb, [v.function_space() for v in v_b]) scalar_to_vec.assign(vb_out, v_b) return vb_out
def vector_boundary_to_mesh(boundary_func, mesh): """ Transfer a Vector-CG1 function from a Boundary mesh to a CG-1 function living on the Parent mesh (where all interior values are 0). This function is only meant to be called internally in pyadjoint, or for verification purposes. """ V = backend.VectorFunctionSpace(mesh, "CG", 1) vb_split = boundary_func.split(deepcopy=True) v_vol = [] for vb in vb_split: v_vol.append(boundary_to_mesh(vb, mesh)) scalar_to_vec = backend.FunctionAssigner( V, [v.function_space() for v in v_vol]) v_out = backend.Function(V) scalar_to_vec.assign(v_out, v_vol) return v_out