1 #ifndef _extrapolated_field_h_
2 #define _extrapolated_field_h_
4 #include <deal.II/base/function.h>
5 #include <deal.II/grid/grid_tools.h>
6 #include <deal.II/numerics/fe_field_function.h>
20 using namespace dealii;
28 field(dof_handler, f),
29 dof_handler_sp(&dof_handler,
"ExtrapolatedField")
31 virtual double value(
const Point<dim> &point,
32 const unsigned int component = 0)
const;
34 Functions::FEFieldFunction<dim>
field;
36 Point<dim> get_nearest_boundary_vertex(
const Point<dim> &point)
const;
41 const unsigned int component)
const
43 Assert(component == 0, ExcInternalError());
47 val = field.value(point, component);
49 catch (GridTools::ExcPointNotFound<dim>)
51 val = field.value(get_nearest_boundary_vertex(point));
59 double arbitrarily_large_number = 1.e32;
60 double nearest_distance = arbitrarily_large_number;
61 Point<dim> nearest_vertex;
62 for (
auto cell : dof_handler_sp->active_cell_iterators())
64 if (!cell->at_boundary())
68 for (
unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
70 if (!cell->face(f)->at_boundary())
74 for (
unsigned int v=0; v < GeometryInfo<dim>::vertices_per_face; ++v)
76 Point<dim> vertex = cell->face(f)->vertex(v);
77 double distance = (point - vertex).norm_square();
78 if (distance < nearest_distance)
80 nearest_vertex = vertex;
81 nearest_distance = distance;
86 return nearest_vertex;