44 template <
typename VectorType>
50 const VectorType &level_set,
53 , fe_collection(&fe_collection)
54 , q_collection_1D(quadrature)
55 , region_update_flags(region_update_flags)
56 , mesh_classifier(&mesh_classifier)
57 , quadrature_generator(q_collection_1D,
74 template <
typename VectorType>
82 const VectorType &level_set,
84 : mapping_collection(&mapping_collection)
85 , fe_collection(&fe_collection)
86 , q_collection_1D(q_collection_1D)
87 , region_update_flags(region_update_flags)
88 , mesh_classifier(&mesh_classifier)
89 , quadrature_generator(q_collection_1D,
106 Assert(fe_collection->size() > 0,
107 ExcMessage(
"Incoming hp::FECollection can not be empty."));
108 Assert(mapping_collection->size() == fe_collection->size() ||
109 mapping_collection->size() == 1,
110 ExcMessage(
"Size of hp::MappingCollection must be "
111 "the same as hp::FECollection or 1."));
112 Assert(q_collection.
size() == fe_collection->size() ||
113 q_collection.
size() == 1,
114 ExcMessage(
"Size of hp::QCollection<dim> must be the "
115 "same as hp::FECollection or 1."));
116 Assert(q_collection_1D.size() == fe_collection->size() ||
117 q_collection_1D.size() == 1,
118 ExcMessage(
"Size of hp::QCollection<1> must be the "
119 "same as hp::FECollection or 1."));
123 fe_values_inside_full_quadrature.resize(fe_collection->size());
124 fe_values_outside_full_quadrature.resize(fe_collection->size());
125 for (
unsigned int fe_index = 0; fe_index < fe_collection->size();
128 const unsigned int mapping_index =
129 mapping_collection->size() > 1 ? fe_index : 0;
130 const unsigned int q_index = q_collection.
size() > 1 ? fe_index : 0;
132 fe_values_inside_full_quadrature[fe_index].emplace(
133 (*mapping_collection)[mapping_index],
134 (*fe_collection)[fe_index],
135 q_collection[q_index],
136 region_update_flags.inside);
137 fe_values_outside_full_quadrature[fe_index].emplace(
138 (*mapping_collection)[mapping_index],
139 (*fe_collection)[fe_index],
140 q_collection[q_index],
141 region_update_flags.outside);
148 template <
bool level_dof_access>
153 current_cell_location = mesh_classifier->location_to_level_set(cell);
154 active_fe_index = cell->active_fe_index();
158 fe_values_inside.reset();
159 fe_values_surface.reset();
160 fe_values_outside.reset();
162 switch (current_cell_location)
166 fe_values_inside_full_quadrature.at(active_fe_index)->reinit(cell);
171 fe_values_outside_full_quadrature.at(active_fe_index)->reinit(cell);
176 const unsigned int mapping_index =
177 mapping_collection->size() > 1 ? active_fe_index : 0;
179 const unsigned int q1D_index =
180 q_collection_1D.size() > 1 ? active_fe_index : 0;
181 quadrature_generator.set_1D_quadrature(q1D_index);
182 quadrature_generator.generate(cell);
185 quadrature_generator.get_inside_quadrature();
187 quadrature_generator.get_outside_quadrature();
189 quadrature_generator.get_surface_quadrature();
194 if (inside_quadrature.
size() > 0)
196 fe_values_inside.emplace((*mapping_collection)[mapping_index],
197 (*fe_collection)[active_fe_index],
199 region_update_flags.inside);
201 fe_values_inside->reinit(cell);
204 if (outside_quadrature.
size() > 0)
206 fe_values_outside.emplace((*mapping_collection)[mapping_index],
207 (*fe_collection)[active_fe_index],
209 region_update_flags.outside);
211 fe_values_outside->reinit(cell);
214 if (surface_quadrature.
size() > 0)
216 fe_values_surface.emplace((*mapping_collection)[mapping_index],
217 (*fe_collection)[active_fe_index],
219 region_update_flags.surface);
220 fe_values_surface->reinit(cell);
236 const std::optional<::FEValues<dim>> &
240 return fe_values_inside_full_quadrature.at(active_fe_index);
242 return fe_values_inside;
248 const std::optional<::FEValues<dim>> &
252 return fe_values_outside_full_quadrature.at(active_fe_index);
254 return fe_values_outside;
260 const std::optional<FEImmersedSurfaceValues<dim>> &
263 return fe_values_surface;
269 template <
typename VectorType>
276 const VectorType &level_set,
279 , fe_collection(&fe_collection)
280 , q_collection_1D(quadrature)
281 , region_update_flags(region_update_flags)
282 , mesh_classifier(&mesh_classifier)
283 , face_quadrature_generator(q_collection_1D,
300 template <
typename VectorType>
309 const VectorType &level_set,
311 : mapping_collection(&mapping_collection)
312 , fe_collection(&fe_collection)
313 , q_collection_1D(q_collection_1D)
314 , region_update_flags(region_update_flags)
315 , mesh_classifier(&mesh_classifier)
316 , face_quadrature_generator(q_collection_1D,
334 Assert(fe_collection->size() > 0,
335 ExcMessage(
"Incoming hp::FECollection can not be empty."));
337 mapping_collection->size() == fe_collection->size() ||
338 mapping_collection->size() == 1,
340 "Size of hp::MappingCollection must be the same as hp::FECollection or 1."));
342 q_collection.
size() == fe_collection->size() || q_collection.
size() == 1,
344 "Size of hp::QCollection<dim> must be the same as hp::FECollection or 1."));
346 q_collection_1D.size() == fe_collection->size() ||
347 q_collection_1D.size() == 1,
349 "Size of hp::QCollection<1> must be the same as hp::FECollection or 1."));
353 fe_values_inside_full_quadrature.resize(fe_collection->size());
354 fe_values_outside_full_quadrature.resize(fe_collection->size());
355 for (
unsigned int fe_index = 0; fe_index < fe_collection->size();
358 const unsigned int mapping_index =
359 mapping_collection->size() > 1 ? fe_index : 0;
360 const unsigned int q_index = q_collection.
size() > 1 ? fe_index : 0;
362 fe_values_inside_full_quadrature[fe_index].emplace(
363 (*mapping_collection)[mapping_index],
364 (*fe_collection)[fe_index],
365 q_collection[q_index],
366 region_update_flags.inside);
367 fe_values_outside_full_quadrature[fe_index].emplace(
368 (*mapping_collection)[mapping_index],
369 (*fe_collection)[fe_index],
370 q_collection[q_index],
371 region_update_flags.outside);
378 template <
bool level_dof_access>
382 const unsigned int face_no,
385 current_face_location =
386 mesh_classifier->location_to_level_set(cell, face_no);
387 active_fe_index = cell->active_fe_index();
391 fe_values_inside.reset();
392 fe_values_outside.reset();
394 switch (current_face_location)
398 call_reinit(*fe_values_inside_full_quadrature.at(active_fe_index));
403 call_reinit(*fe_values_outside_full_quadrature.at(active_fe_index));
408 const unsigned int mapping_index =
409 mapping_collection->size() > 1 ? active_fe_index : 0;
410 const unsigned int q1D_index =
411 q_collection_1D.size() > 1 ? active_fe_index : 0;
413 face_quadrature_generator.set_1D_quadrature(q1D_index);
414 face_quadrature_generator.generate(cell, face_no);
416 const Quadrature<dim - 1> &inside_quadrature =
417 face_quadrature_generator.get_inside_quadrature();
418 const Quadrature<dim - 1> &outside_quadrature =
419 face_quadrature_generator.get_outside_quadrature();
424 if (inside_quadrature.size() > 0)
426 fe_values_inside.emplace((*mapping_collection)[mapping_index],
427 (*fe_collection)[active_fe_index],
429 region_update_flags.inside);
431 call_reinit(*fe_values_inside);
434 if (outside_quadrature.size() > 0)
436 fe_values_outside.emplace((*mapping_collection)[mapping_index],
437 (*fe_collection)[active_fe_index],
439 region_update_flags.outside);
441 call_reinit(*fe_values_outside);
456 const std::optional<::FEInterfaceValues<dim>> &
460 return fe_values_inside_full_quadrature.at(active_fe_index);
462 return fe_values_inside;
468 const std::optional<::FEInterfaceValues<dim>> &
472 return fe_values_outside_full_quadrature.at(active_fe_index);
474 return fe_values_outside;
478#include "fe_values.inst"
const std::optional<::FEInterfaceValues< dim > > & get_outside_fe_values() const
void initialize(const hp::QCollection< dim - 1 > &q_collection)
const hp::QCollection< 1 > q_collection_1D
typename FaceQuadratureGenerator< dim >::AdditionalData AdditionalData
const std::optional<::FEInterfaceValues< dim > > & get_inside_fe_values() const
FEInterfaceValues(const hp::FECollection< dim > &fe_collection, const Quadrature< 1 > &quadrature, const RegionUpdateFlags region_update_flags, const MeshClassifier< dim > &mesh_classifier, const DoFHandler< dim > &dof_handler, const VectorType &level_set, const AdditionalData &additional_data=AdditionalData())
void do_reinit(const TriaIterator< DoFCellAccessor< dim, dim, level_dof_access > > &cell, const unsigned int face_no, const std::function< void(::FEInterfaceValues< dim > &)> &call_reinit)
const std::optional<::FEValues< dim > > & get_outside_fe_values() const
void initialize(const hp::QCollection< dim > &q_collection)
const std::optional< FEImmersedSurfaceValues< dim > > & get_surface_fe_values() const
const hp::QCollection< 1 > q_collection_1D
void reinit(const TriaIterator< DoFCellAccessor< dim, dim, level_dof_access > > &cell)
typename QuadratureGenerator< dim >::AdditionalData AdditionalData
FEValues(const hp::FECollection< dim > &fe_collection, const Quadrature< 1 > &quadrature, const RegionUpdateFlags region_update_flags, const MeshClassifier< dim > &mesh_classifier, const DoFHandler< dim > &dof_handler, const VectorType &level_set, const AdditionalData &additional_data=AdditionalData())
const std::optional<::FEValues< dim > > & get_inside_fe_values() const
unsigned int size() const
unsigned int size() const
void push_back(const Quadrature< dim_in > &new_quadrature)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)
@ update_default
No update.
#define DEAL_II_ASSERT_UNREACHABLE()
static const unsigned int invalid_unsigned_int