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,
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);
179 const unsigned int q_index_in,
180 const unsigned int mapping_index_in,
181 const unsigned int fe_index_in)
183 current_cell_location = mesh_classifier->location_to_level_set(cell);
186 this->active_fe_index = 0;
188 this->active_fe_index = fe_index_in;
190 unsigned int mapping_index = mapping_index_in;
191 unsigned int q_index = q_index_in;
192 unsigned int q_index_1D = q_index_in;
196 if (mapping_collection->size() > 1)
197 mapping_index = active_fe_index;
204 if (fe_values_inside_full_quadrature.size() > 1)
205 q_index = active_fe_index;
212 if (q_collection_1D.size() > 1)
213 q_index_1D = active_fe_index;
220 fe_values_inside.reset();
221 fe_values_surface.reset();
222 fe_values_outside.reset();
224 switch (current_cell_location)
228 Assert((active_fe_index == mapping_index) ||
229 ((mapping_collection->size() == 1) &&
230 (mapping_index == 0)),
234 fe_values_inside_full_quadrature.at(q_index)->reinit(cell);
239 Assert((active_fe_index == mapping_index) ||
240 ((mapping_collection->size() == 1) &&
241 (mapping_index == 0)),
245 fe_values_outside_full_quadrature.at(q_index)->reinit(cell);
250 quadrature_generator.set_1D_quadrature(q_index_1D);
251 quadrature_generator.generate(cell);
254 quadrature_generator.get_inside_quadrature();
256 quadrature_generator.get_outside_quadrature();
258 quadrature_generator.get_surface_quadrature();
263 if (inside_quadrature.
size() > 0)
265 fe_values_inside.emplace((*mapping_collection)[mapping_index],
266 (*fe_collection)[active_fe_index],
268 region_update_flags.inside);
270 fe_values_inside->reinit(cell);
273 if (outside_quadrature.
size() > 0)
275 fe_values_outside.emplace((*mapping_collection)[mapping_index],
276 (*fe_collection)[active_fe_index],
278 region_update_flags.outside);
280 fe_values_outside->reinit(cell);
283 if (surface_quadrature.size() > 0)
285 fe_values_surface.emplace((*mapping_collection)[mapping_index],
286 (*fe_collection)[active_fe_index],
288 region_update_flags.surface);
289 fe_values_surface->reinit(cell);
345 const VectorType &level_set,
348 , fe_collection(&fe_collection)
349 , q_collection_1D(quadrature)
350 , region_update_flags(region_update_flags)
351 , mesh_classifier(&mesh_classifier)
352 , face_quadrature_generator(q_collection_1D,
378 const VectorType &level_set,
380 : mapping_collection(&mapping_collection)
381 , fe_collection(&fe_collection)
382 , q_collection_1D(q_collection_1D)
383 , region_update_flags(region_update_flags)
384 , mesh_classifier(&mesh_classifier)
385 , face_quadrature_generator(q_collection_1D,
403 Assert(fe_collection->size() > 0,
404 ExcMessage(
"Incoming hp::FECollection can not be empty."));
406 mapping_collection->size() == fe_collection->size() ||
407 mapping_collection->size() == 1,
409 "Size of hp::MappingCollection must be the same as hp::FECollection or 1."));
411 q_collection.
size() == fe_collection->size() || q_collection.
size() == 1,
413 "Size of hp::QCollection<dim> must be the same as hp::FECollection or 1."));
415 q_collection_1D.size() == fe_collection->size() ||
416 q_collection_1D.size() == 1,
418 "Size of hp::QCollection<1> must be the same as hp::FECollection or 1."));
422 fe_values_inside_full_quadrature.resize(fe_collection->size());
423 fe_values_outside_full_quadrature.resize(fe_collection->size());
424 for (
unsigned int fe_index = 0; fe_index < fe_collection->size();
427 const unsigned int mapping_index =
428 mapping_collection->size() > 1 ? fe_index : 0;
429 const unsigned int q_index = q_collection.
size() > 1 ? fe_index : 0;
431 fe_values_inside_full_quadrature[fe_index].emplace(
432 (*mapping_collection)[mapping_index],
433 (*fe_collection)[fe_index],
434 q_collection[q_index],
435 region_update_flags.inside);
436 fe_values_outside_full_quadrature[fe_index].emplace(
437 (*mapping_collection)[mapping_index],
438 (*fe_collection)[fe_index],
439 q_collection[q_index],
440 region_update_flags.outside);
451 const unsigned int face_no,
454 current_face_location =
455 mesh_classifier->location_to_level_set(cell, face_no);
456 active_fe_index = cell->active_fe_index();
460 fe_values_inside.reset();
461 fe_values_outside.reset();
463 switch (current_face_location)
467 call_reinit(*fe_values_inside_full_quadrature.at(active_fe_index));
472 call_reinit(*fe_values_outside_full_quadrature.at(active_fe_index));
477 const unsigned int mapping_index =
478 mapping_collection->size() > 1 ? active_fe_index : 0;
479 const unsigned int q1D_index =
480 q_collection_1D.size() > 1 ? active_fe_index : 0;
482 face_quadrature_generator.set_1D_quadrature(q1D_index);
483 face_quadrature_generator.generate(cell, face_no);
485 const Quadrature<dim - 1> &inside_quadrature =
486 face_quadrature_generator.get_inside_quadrature();
487 const Quadrature<dim - 1> &outside_quadrature =
488 face_quadrature_generator.get_outside_quadrature();
493 if (inside_quadrature.size() > 0)
495 fe_values_inside.emplace((*mapping_collection)[mapping_index],
496 (*fe_collection)[active_fe_index],
498 region_update_flags.inside);
500 call_reinit(*fe_values_inside);
503 if (outside_quadrature.size() > 0)
505 fe_values_outside.emplace((*mapping_collection)[mapping_index],
506 (*fe_collection)[active_fe_index],
508 region_update_flags.outside);
510 call_reinit(*fe_values_outside);
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)
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 VectorType &level_set, const AdditionalData &additional_data=AdditionalData())