def extend_function_to_3d(func, mesh_extruded): """ Returns a 3D view of a 2D :class:`Function` on the extruded domain. The 3D function resides in V x R function space, where V is the function space of the source function. The 3D function shares the data of the 2D function. """ fs = func.function_space() # assert fs.mesh().geometric_dimension() == 2, 'Function must be in 2D space' ufl_elem = fs.ufl_element() family = ufl_elem.family() degree = ufl_elem.degree() name = func.name() if isinstance(ufl_elem, ufl.VectorElement): # vector function space fs_extended = get_functionspace(mesh_extruded, family, degree, 'R', 0, dim=2, vector=True) else: fs_extended = get_functionspace(mesh_extruded, family, degree, 'R', 0) func_extended = Function(fs_extended, name=name, val=func.dat._data) func_extended.source = func return func_extended