52 , fe_collection(&fe_collection)
53 , q_collection_1D(quadrature)
54 , region_update_flags(region_update_flags)
55 , mesh_classifier(&mesh_classifier)
56 , quadrature_generator(q_collection_1D,
83 : mapping_collection(&mapping_collection)
84 , fe_collection(&fe_collection)
85 , q_collection_1D(q_collection_1D)
86 , region_update_flags(region_update_flags)
87 , mesh_classifier(&mesh_classifier)
88 , quadrature_generator(q_collection_1D,
105 Assert(fe_collection->size() > 0,
106 ExcMessage(
"Incoming hp::FECollection can not be empty."));
107 Assert(mapping_collection->size() == fe_collection->size() ||
108 mapping_collection->size() == 1,
109 ExcMessage(
"Size of hp::MappingCollection must be "
110 "the same as hp::FECollection or 1."));
111 Assert(q_collection.
size() == fe_collection->size() ||
112 q_collection.
size() == 1,
113 ExcMessage(
"Size of hp::QCollection<dim> must be the "
114 "same as hp::FECollection or 1."));
115 Assert(q_collection_1D.size() == fe_collection->size() ||
116 q_collection_1D.size() == 1,
117 ExcMessage(
"Size of hp::QCollection<1> must be the "
118 "same as hp::FECollection or 1."));
122 fe_values_inside_full_quadrature.resize(fe_collection->size());
123 fe_values_outside_full_quadrature.resize(fe_collection->size());
124 for (
unsigned int fe_index = 0; fe_index < fe_collection->size();
127 const unsigned int mapping_index =
128 mapping_collection->size() > 1 ? fe_index : 0;
129 const unsigned int q_index = q_collection.
size() > 1 ? fe_index : 0;
131 fe_values_inside_full_quadrature[fe_index].emplace(
132 (*mapping_collection)[mapping_index],
133 (*fe_collection)[fe_index],
134 q_collection[q_index],
135 region_update_flags.inside);
136 fe_values_outside_full_quadrature[fe_index].emplace(
137 (*mapping_collection)[mapping_index],
138 (*fe_collection)[fe_index],
139 q_collection[q_index],
140 region_update_flags.outside);
178 const unsigned int q_index_in,
179 const unsigned int mapping_index_in,
180 const unsigned int fe_index_in)
182 current_cell_location = mesh_classifier->location_to_level_set(cell);
185 this->active_fe_index = 0;
187 this->active_fe_index = fe_index_in;
189 unsigned int mapping_index = mapping_index_in;
190 unsigned int q_index = q_index_in;
191 unsigned int q_index_1D = q_index_in;
195 if (mapping_collection->size() > 1)
196 mapping_index = active_fe_index;
203 if (fe_values_inside_full_quadrature.size() > 1)
204 q_index = active_fe_index;
211 if (q_collection_1D.size() > 1)
212 q_index_1D = active_fe_index;
219 fe_values_inside.reset();
220 fe_values_surface.reset();
221 fe_values_outside.reset();
223 switch (current_cell_location)
227 Assert((active_fe_index == mapping_index) ||
228 ((mapping_collection->size() == 1) &&
229 (mapping_index == 0)),
233 fe_values_inside_full_quadrature.at(q_index)->reinit(cell);
238 Assert((active_fe_index == mapping_index) ||
239 ((mapping_collection->size() == 1) &&
240 (mapping_index == 0)),
244 fe_values_outside_full_quadrature.at(q_index)->reinit(cell);
249 quadrature_generator.set_1D_quadrature(q_index_1D);
250 quadrature_generator.generate(cell);
253 quadrature_generator.get_inside_quadrature();
255 quadrature_generator.get_outside_quadrature();
257 quadrature_generator.get_surface_quadrature();
262 if (inside_quadrature.
size() > 0)
264 fe_values_inside.emplace((*mapping_collection)[mapping_index],
265 (*fe_collection)[active_fe_index],
267 region_update_flags.inside);
269 fe_values_inside->reinit(cell);
272 if (outside_quadrature.
size() > 0)
274 fe_values_outside.emplace((*mapping_collection)[mapping_index],
275 (*fe_collection)[active_fe_index],
277 region_update_flags.outside);
279 fe_values_outside->reinit(cell);
282 if (surface_quadrature.size() > 0)
284 fe_values_surface.emplace((*mapping_collection)[mapping_index],
285 (*fe_collection)[active_fe_index],
287 region_update_flags.surface);
288 fe_values_surface->reinit(cell);
347 , fe_collection(&fe_collection)
348 , q_collection_1D(quadrature)
349 , region_update_flags(region_update_flags)
350 , mesh_classifier(&mesh_classifier)
351 , face_quadrature_generator(q_collection_1D,
379 : mapping_collection(&mapping_collection)
380 , fe_collection(&fe_collection)
381 , q_collection_1D(q_collection_1D)
382 , region_update_flags(region_update_flags)
383 , mesh_classifier(&mesh_classifier)
384 , face_quadrature_generator(q_collection_1D,
401 Assert(fe_collection->size() > 0,
402 ExcMessage(
"Incoming hp::FECollection can not be empty."));
404 mapping_collection->size() == fe_collection->size() ||
405 mapping_collection->size() == 1,
407 "Size of hp::MappingCollection must be the same as hp::FECollection or 1."));
409 q_collection.
size() == fe_collection->size() || q_collection.
size() == 1,
411 "Size of hp::QCollection<dim> must be the same as hp::FECollection or 1."));
413 q_collection_1D.size() == fe_collection->size() ||
414 q_collection_1D.size() == 1,
416 "Size of hp::QCollection<1> must be the same as hp::FECollection or 1."));
418 fe_values_inside_full_quadrature.emplace(*mapping_collection,
421 region_update_flags.inside);
422 fe_values_outside_full_quadrature.emplace(*mapping_collection,
425 region_update_flags.outside);
435 const unsigned int face_no,
436 const unsigned int q_index_in,
437 const unsigned int active_fe_index_in,
439 const unsigned int)> &call_reinit)
441 current_face_location =
442 mesh_classifier->location_to_level_set(cell, face_no);
446 fe_values_inside.reset();
447 fe_values_outside.reset();
449 switch (current_face_location)
453 call_reinit(*fe_values_inside_full_quadrature, q_index_in);
458 call_reinit(*fe_values_outside_full_quadrature, q_index_in);
463 unsigned int q_index = q_index_in;
467 unsigned int active_fe_index = active_fe_index_in;
471 if constexpr (std::is_same_v<
477 active_fe_index = cell->active_fe_index();
482 if (q_collection_1D.size() > 1)
483 q_index = active_fe_index;
490 face_quadrature_generator.set_1D_quadrature(q_index);
491 face_quadrature_generator.generate(cell, face_no);
493 const Quadrature<dim - 1> &inside_quadrature =
494 face_quadrature_generator.get_inside_quadrature();
495 const Quadrature<dim - 1> &outside_quadrature =
496 face_quadrature_generator.get_outside_quadrature();
501 if (inside_quadrature.size() > 0)
503 fe_values_inside.emplace(*mapping_collection,
507 region_update_flags.inside);
509 call_reinit(*fe_values_inside, 0);
512 if (outside_quadrature.size() > 0)
514 fe_values_outside.emplace(*mapping_collection,
518 region_update_flags.outside);
520 call_reinit(*fe_values_outside, 0);
void do_reinit(const TriaIterator< CellAccessorType > &cell, const unsigned int face_no, const unsigned int q_index, const unsigned int active_fe_index, const std::function< void(::FEInterfaceValues< dim > &, const unsigned int)> &call_reinit)
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 ReadVector< Number > &level_set, const AdditionalData &additional_data=AdditionalData())
void reinit(const TriaIterator< DoFCellAccessor< dim, dim, level_dof_access > > &cell, const unsigned int q_index=numbers::invalid_unsigned_int, const unsigned int mapping_index=numbers::invalid_unsigned_int)
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 ReadVector< Number > &level_set, const AdditionalData &additional_data=AdditionalData())