phaseflow
FEM solver for the Navier-Stokes-Boussinesq equations coupled with enthalpy-based phase change
 All Classes Namespaces Files Functions Variables Macros Pages
extrapolated_field.h
Go to the documentation of this file.
1 #ifndef _extrapolated_field_h_
2 #define _extrapolated_field_h_
3 
4 #include <deal.II/base/function.h>
5 #include <deal.II/grid/grid_tools.h>
6 #include <deal.II/numerics/fe_field_function.h>
7 
18 namespace MyFunctions
19 {
20  using namespace dealii;
21 
22  template<int dim>
23  class ExtrapolatedField : public Function<dim>
24  {
25  public:
26  ExtrapolatedField(const DoFHandler<dim> &dof_handler, const Vector<double> &f)
27  : Function<dim>(),
28  field(dof_handler, f),
29  dof_handler_sp(&dof_handler, "ExtrapolatedField")
30  {}
31  virtual double value(const Point<dim> &point,
32  const unsigned int component = 0) const;
33  private:
34  Functions::FEFieldFunction<dim> field;
35  SmartPointer<const DoFHandler<dim>,ExtrapolatedField<dim>> dof_handler_sp;
36  Point<dim> get_nearest_boundary_vertex(const Point<dim> &point) const;
37  };
38 
39  template<int dim>
40  double ExtrapolatedField<dim>::value(const Point<dim> &point,
41  const unsigned int component) const
42  {
43  Assert(component == 0, ExcInternalError());
44  double val;
45  try
46  {
47  val = field.value(point, component);
48  }
49  catch (GridTools::ExcPointNotFound<dim>)
50  {
51  val = field.value(get_nearest_boundary_vertex(point));
52  }
53  return val;
54  }
55 
56  template <int dim>
57  Point<dim> ExtrapolatedField<dim>::get_nearest_boundary_vertex(const Point<dim> &point) const
58  {
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())
63  {
64  if (!cell->at_boundary())
65  {
66  continue;
67  }
68  for (unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
69  {
70  if (!cell->face(f)->at_boundary())
71  {
72  continue;
73  }
74  for (unsigned int v=0; v < GeometryInfo<dim>::vertices_per_face; ++v)
75  {
76  Point<dim> vertex = cell->face(f)->vertex(v);
77  double distance = (point - vertex).norm_square();
78  if (distance < nearest_distance)
79  {
80  nearest_vertex = vertex;
81  nearest_distance = distance;
82  }
83  }
84  }
85  }
86  return nearest_vertex;
87  }
88 
89 }
90 
91 #endif
virtual double value(const Point< dim > &point, const unsigned int component=0) const
Definition: extrapolated_field.h:40
ExtrapolatedField(const DoFHandler< dim > &dof_handler, const Vector< double > &f)
Definition: extrapolated_field.h:26
Definition: extrapolated_field.h:23
Functions::FEFieldFunction< dim > field
Definition: extrapolated_field.h:34
Point< dim > get_nearest_boundary_vertex(const Point< dim > &point) const
Definition: extrapolated_field.h:57
SmartPointer< const DoFHandler< dim >, ExtrapolatedField< dim > > dof_handler_sp
Definition: extrapolated_field.h:35