17 #ifndef dealii_face_setup_internal_h 18 #define dealii_face_setup_internal_h 20 #include <deal.II/base/memory_consumption.h> 21 #include <deal.II/base/utilities.h> 23 #include <deal.II/grid/tria.h> 24 #include <deal.II/grid/tria_accessor.h> 26 #include <deal.II/matrix_free/face_info.h> 27 #include <deal.II/matrix_free/task_info.h> 32 DEAL_II_NAMESPACE_OPEN
37 namespace MatrixFreeFunctions
48 : n_hanging_faces_smaller_subdomain(0)
49 , n_hanging_faces_larger_subdomain(0)
52 std::vector<std::pair<CellId, CellId>> shared_faces;
53 unsigned int n_hanging_faces_smaller_subdomain;
54 unsigned int n_hanging_faces_larger_subdomain;
80 template <
typename MFAddData>
83 const ::Triangulation<dim> & triangulation,
84 const MFAddData & additional_data,
85 std::vector<std::pair<unsigned int, unsigned int>> &cell_levels);
95 const ::Triangulation<dim> & triangulation,
96 const std::vector<std::pair<unsigned int, unsigned int>> &cell_levels,
107 const unsigned int face_no,
108 const typename ::Triangulation<dim>::cell_iterator &cell,
109 const unsigned int number_cell_interior,
110 const typename ::Triangulation<dim>::cell_iterator &neighbor,
111 const unsigned int number_cell_exterior);
113 bool use_active_cells;
121 locally_active_at_boundary,
122 locally_active_done_here,
123 locally_active_done_elsewhere,
125 multigrid_refinement_edge
128 std::vector<FaceCategory> face_is_owned;
129 std::vector<bool> at_processor_boundary;
130 std::vector<unsigned int> cells_close_to_boundary;
131 std::vector<FaceToCellTopology<1>> inner_faces;
132 std::vector<FaceToCellTopology<1>> boundary_faces;
133 std::vector<FaceToCellTopology<1>> inner_ghost_faces;
134 std::vector<FaceToCellTopology<1>> refinement_edge_faces;
142 template <
int vectorization_w
idth>
144 collect_faces_vectorization(
146 const std::vector<bool> & hard_vectorization_boundary,
147 std::vector<unsigned int> & face_partition_data,
158 : use_active_cells(
true)
164 template <
typename MFAddData>
167 const ::Triangulation<dim> & triangulation,
168 const MFAddData & additional_data,
169 std::vector<std::pair<unsigned int, unsigned int>> &cell_levels)
176 if (use_active_cells)
177 for (
unsigned int i = 0; i < cell_levels.size(); ++i)
179 typename ::Triangulation<dim>::cell_iterator dcell(
180 &triangulation, cell_levels[i].first, cell_levels[i].second);
188 at_processor_boundary.resize(cell_levels.size(),
false);
189 cells_close_to_boundary.clear();
190 face_is_owned.resize(dim > 1 ? triangulation.n_raw_faces() :
191 triangulation.n_vertices(),
192 FaceCategory::locally_active_done_elsewhere);
196 std::map<types::subdomain_id, FaceIdentifier>
197 inner_faces_at_proc_boundary;
201 triangulation.locally_owned_subdomain();
202 for (
unsigned int i = 0; i < cell_levels.size(); ++i)
204 if (i > 0 && cell_levels[i] == cell_levels[i - 1])
206 typename ::Triangulation<dim>::cell_iterator dcell(
207 &triangulation, cell_levels[i].first, cell_levels[i].second);
208 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell;
211 if (dcell->at_boundary(f) && !dcell->has_periodic_neighbor(f))
213 typename ::Triangulation<dim>::cell_iterator neighbor =
214 dcell->neighbor_or_periodic_neighbor(f);
220 const CellId id_mine = dcell->id();
221 if (use_active_cells && neighbor->has_children())
222 for (
unsigned int c = 0; c < dcell->face(f)->n_children();
225 typename ::Triangulation<dim>::cell_iterator
227 dcell->at_boundary(f) ?
228 dcell->periodic_neighbor_child_on_subface(f, c) :
229 dcell->neighbor_child_on_subface(f, c);
231 neighbor_c->subdomain_id();
232 if (my_domain < neigh_domain)
233 inner_faces_at_proc_boundary[neigh_domain]
234 .n_hanging_faces_larger_subdomain++;
235 else if (my_domain > neigh_domain)
236 inner_faces_at_proc_boundary[neigh_domain]
237 .n_hanging_faces_smaller_subdomain++;
242 use_active_cells ? neighbor->subdomain_id() :
243 neighbor->level_subdomain_id();
244 if (neighbor->level() < dcell->level() &&
247 if (my_domain < neigh_domain)
248 inner_faces_at_proc_boundary[neigh_domain]
249 .n_hanging_faces_smaller_subdomain++;
250 else if (my_domain > neigh_domain)
251 inner_faces_at_proc_boundary[neigh_domain]
252 .n_hanging_faces_larger_subdomain++;
254 else if (neighbor->level() == dcell->level() &&
255 my_domain != neigh_domain)
261 const CellId id_neigh = neighbor->id();
262 if (my_domain < neigh_domain)
263 inner_faces_at_proc_boundary[neigh_domain]
264 .shared_faces.emplace_back(id_mine, id_neigh);
266 inner_faces_at_proc_boundary[neigh_domain]
267 .shared_faces.emplace_back(id_neigh, id_mine);
276 for (std::map<types::subdomain_id, FaceIdentifier>::iterator it =
277 inner_faces_at_proc_boundary.begin();
278 it != inner_faces_at_proc_boundary.end();
281 Assert(it->first != my_domain,
283 std::sort(it->second.shared_faces.begin(),
284 it->second.shared_faces.end());
285 it->second.shared_faces.erase(
286 std::unique(it->second.shared_faces.begin(),
287 it->second.shared_faces.end()),
288 it->second.shared_faces.end());
293 # if defined(DEAL_II_WITH_MPI) && defined(DEBUG) 294 MPI_Comm comm = MPI_COMM_SELF;
298 comm = ptria->get_communicator();
301 unsigned int mysize = it->second.shared_faces.size();
303 MPI_Sendrecv(&mysize,
316 mysize = it->second.n_hanging_faces_smaller_subdomain;
317 MPI_Sendrecv(&mysize,
330 mysize = it->second.n_hanging_faces_larger_subdomain;
331 MPI_Sendrecv(&mysize,
361 std::vector<std::tuple<CellId, CellId, unsigned int>> other_range(
362 it->second.shared_faces.size());
363 for (
unsigned int i = 0; i < other_range.size(); ++i)
365 std::make_tuple(it->second.shared_faces[i].second,
366 it->second.shared_faces[i].first,
368 std::sort(other_range.begin(), other_range.end());
376 unsigned int n_faces_lower_proc = 0, n_faces_higher_proc = 0;
377 std::vector<char> assignment(other_range.size(), 0);
378 if (it->second.shared_faces.size() > 0)
382 unsigned int count = 0;
383 for (
unsigned int i = 1; i < it->second.shared_faces.size();
385 if (it->second.shared_faces[i].first ==
386 it->second.shared_faces[i - 1 - count].first)
393 for (
unsigned int k = 0; k <= count; ++k)
394 assignment[i - 1 - k] = 1;
395 n_faces_higher_proc += count + 1;
405 for (
unsigned int i = 1; i < other_range.size(); ++i)
406 if (std::get<0>(other_range[i]) ==
407 std::get<0>(other_range[i - 1 - count]))
414 for (
unsigned int k = 0; k <= count; ++k)
417 .shared_faces[std::get<2>(
421 .shared_faces[std::get<2>(
422 other_range[i - 1 - k])]
427 if (assignment[std::get<2>(
428 other_range[i - 1 - k])] == 0)
430 assignment[std::get<2>(
431 other_range[i - 1 - k])] = -1;
432 ++n_faces_lower_proc;
446 n_faces_lower_proc +=
447 it->second.n_hanging_faces_smaller_subdomain;
448 n_faces_higher_proc +=
449 it->second.n_hanging_faces_larger_subdomain;
450 const unsigned int n_total_faces_at_proc_boundary =
451 (it->second.shared_faces.size() +
452 it->second.n_hanging_faces_smaller_subdomain +
453 it->second.n_hanging_faces_larger_subdomain);
454 unsigned int split_index = n_total_faces_at_proc_boundary / 2;
455 if (split_index < n_faces_lower_proc)
457 else if (split_index <
458 n_total_faces_at_proc_boundary - n_faces_higher_proc)
459 split_index -= n_faces_lower_proc;
461 split_index = n_total_faces_at_proc_boundary -
462 n_faces_higher_proc - n_faces_lower_proc;
465 # if defined(DEAL_II_WITH_MPI) && defined(DEBUG) 466 MPI_Sendrecv(&split_index,
479 MPI_Sendrecv(&n_faces_lower_proc,
492 MPI_Sendrecv(&n_faces_higher_proc,
508 std::vector<std::pair<CellId, CellId>> owned_faces_lower,
510 for (
unsigned int i = 0; i < assignment.size(); ++i)
511 if (assignment[i] < 0)
512 owned_faces_lower.push_back(it->second.shared_faces[i]);
513 else if (assignment[i] > 0)
514 owned_faces_higher.push_back(it->second.shared_faces[i]);
516 it->second.shared_faces.size() + 1 -
517 owned_faces_lower.size() -
518 owned_faces_higher.size());
520 unsigned int i = 0, c = 0;
521 for (; i < assignment.size() && c < split_index; ++i)
522 if (assignment[i] == 0)
524 owned_faces_lower.push_back(it->second.shared_faces[i]);
527 for (; i < assignment.size(); ++i)
528 if (assignment[i] == 0)
530 owned_faces_higher.push_back(it->second.shared_faces[i]);
535 std::vector<std::pair<CellId, CellId>> check_faces;
536 check_faces.insert(check_faces.end(),
537 owned_faces_lower.begin(),
538 owned_faces_lower.end());
539 check_faces.insert(check_faces.end(),
540 owned_faces_higher.begin(),
541 owned_faces_higher.end());
542 std::sort(check_faces.begin(), check_faces.end());
544 it->second.shared_faces.size());
545 for (
unsigned int i = 0; i < check_faces.size(); ++i)
546 Assert(check_faces[i] == it->second.shared_faces[i],
551 if (my_domain < it->first)
552 it->second.shared_faces.swap(owned_faces_lower);
554 it->second.shared_faces.swap(owned_faces_higher);
556 std::sort(it->second.shared_faces.begin(),
557 it->second.shared_faces.end());
563 std::set<std::pair<unsigned int, unsigned int>> ghost_cells;
564 for (
unsigned int i = 0; i < cell_levels.size(); ++i)
566 typename ::Triangulation<dim>::cell_iterator dcell(
567 &triangulation, cell_levels[i].first, cell_levels[i].second);
568 if (use_active_cells)
570 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
572 if (dcell->at_boundary(f) && !dcell->has_periodic_neighbor(f))
573 face_is_owned[dcell->face(f)->index()] =
574 FaceCategory::locally_active_at_boundary;
578 else if ((dcell->at_boundary(f) ==
false ||
579 dcell->has_periodic_neighbor(f)) &&
580 additional_data.level_mg_handler !=
582 dcell->neighbor_or_periodic_neighbor(f)->level() <
585 face_is_owned[dcell->face(f)->index()] =
586 FaceCategory::multigrid_refinement_edge;
590 typename ::Triangulation<dim>::cell_iterator neighbor =
591 dcell->neighbor_or_periodic_neighbor(f);
594 if (use_active_cells && neighbor->has_children() &&
595 additional_data.hold_all_faces_to_owned_cells ==
false)
598 bool add_to_ghost =
false;
600 id1 = use_active_cells ? dcell->subdomain_id() :
601 dcell->level_subdomain_id(),
602 id2 = use_active_cells ?
603 (neighbor->has_children() ?
604 dcell->neighbor_child_on_subface(f, 0)
606 neighbor->subdomain_id()) :
607 neighbor->level_subdomain_id();
614 if ((id1 == id2 && (use_active_cells ==
false ||
615 neighbor->has_children() ==
false)) ||
616 dcell->level() > neighbor->level() ||
618 inner_faces_at_proc_boundary[id2].shared_faces.begin(),
619 inner_faces_at_proc_boundary[id2].shared_faces.end(),
620 std::make_pair(id1 < id2 ? dcell->
id() : neighbor->id(),
621 id1 < id2 ? neighbor->id() :
624 face_is_owned[dcell->face(f)->index()] =
625 FaceCategory::locally_active_done_here;
626 if (dcell->level() == neighbor->level())
629 ->face(dcell->has_periodic_neighbor(f) ?
630 dcell->periodic_neighbor_face_no(f) :
631 dcell->neighbor_face_no(f))
633 FaceCategory::locally_active_done_here;
639 if (use_active_cells)
641 (dcell->subdomain_id() != neighbor->subdomain_id());
643 add_to_ghost = (dcell->level_subdomain_id() !=
644 neighbor->level_subdomain_id());
646 else if (additional_data.hold_all_faces_to_owned_cells ==
650 cells_close_to_boundary.emplace_back(i);
655 face_is_owned[dcell->face(f)->index()] =
656 FaceCategory::ghosted;
657 if (use_active_cells)
659 if (neighbor->has_children())
660 for (
unsigned int s = 0;
661 s < dcell->face(f)->n_children();
663 if (dcell->at_boundary(f))
666 ->periodic_neighbor_child_on_subface(f,
669 dcell->subdomain_id())
674 if (dcell->neighbor_child_on_subface(f, s)
676 dcell->subdomain_id())
680 add_to_ghost = (dcell->subdomain_id() !=
681 neighbor->subdomain_id());
684 add_to_ghost = (dcell->level_subdomain_id() !=
685 neighbor->level_subdomain_id());
690 ghost_cells.insert(std::pair<unsigned int, unsigned int>(
691 neighbor->level(), neighbor->index()));
692 at_processor_boundary[i] =
true;
700 for (std::set<std::pair<unsigned int, unsigned int>>::iterator it =
702 it != ghost_cells.end();
704 cell_levels.push_back(*it);
707 std::sort(cells_close_to_boundary.begin(), cells_close_to_boundary.end());
708 cells_close_to_boundary.erase(std::unique(cells_close_to_boundary.begin(),
709 cells_close_to_boundary.end()),
710 cells_close_to_boundary.end());
711 std::vector<unsigned int> final_cells;
712 final_cells.reserve(cells_close_to_boundary.size());
713 for (
unsigned int i = 0; i < cells_close_to_boundary.size(); ++i)
714 if (at_processor_boundary[cells_close_to_boundary[i]] ==
false)
715 final_cells.push_back(cells_close_to_boundary[i]);
716 cells_close_to_boundary = std::move(final_cells);
724 const ::Triangulation<dim> & triangulation,
725 const std::vector<std::pair<unsigned int, unsigned int>> &cell_levels,
730 std::map<std::pair<unsigned int, unsigned int>,
unsigned int>
732 for (
unsigned int cell = 0; cell < cell_levels.size(); ++cell)
733 if (cell == 0 || cell_levels[cell] != cell_levels[cell - 1])
735 typename ::Triangulation<dim>::cell_iterator dcell(
737 cell_levels[cell].first,
738 cell_levels[cell].second);
739 std::pair<unsigned int, unsigned int> level_index(dcell->level(),
741 map_to_vectorized[level_index] = cell;
750 std::vector<unsigned char> face_visited(face_is_owned.size(), 0);
751 for (
unsigned int partition = 0;
755 unsigned int boundary_counter = 0;
756 unsigned int inner_counter = 0;
758 vectorization_length;
760 vectorization_length;
762 if (cell == 0 || cell_levels[cell] != cell_levels[cell - 1])
764 typename ::Triangulation<dim>::cell_iterator dcell(
766 cell_levels[cell].first,
767 cell_levels[cell].second);
768 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell;
772 if (face_is_owned[dcell->face(f)->index()] ==
773 FaceCategory::locally_active_at_boundary)
785 boundary_faces.push_back(info);
787 face_visited[dcell->face(f)->index()]++;
792 typename ::Triangulation<dim>::cell_iterator
793 neighbor = dcell->neighbor_or_periodic_neighbor(f);
794 if (use_active_cells && neighbor->has_children())
796 for (
unsigned int c = 0;
797 c < dcell->face(f)->n_children();
800 typename ::Triangulation<
801 dim>::cell_iterator neighbor_c =
802 dcell->at_boundary(f) ?
803 dcell->periodic_neighbor_child_on_subface(
805 dcell->neighbor_child_on_subface(f, c);
807 neighbor_c->subdomain_id();
808 const unsigned int neighbor_face_no =
809 dcell->has_periodic_neighbor(f) ?
810 dcell->periodic_neighbor_face_no(f) :
811 dcell->neighbor_face_no(f);
812 if (neigh_domain != dcell->subdomain_id() ||
814 [dcell->face(f)->child(c)->index()] ==
817 std::pair<unsigned int, unsigned int>
818 level_index(neighbor_c->level(),
819 neighbor_c->index());
821 [dcell->face(f)->child(c)->index()] ==
822 FaceCategory::locally_active_done_here)
825 inner_faces.push_back(create_face(
828 map_to_vectorized[level_index],
832 else if (face_is_owned[dcell->face(f)
835 FaceCategory::ghosted)
837 inner_ghost_faces.push_back(create_face(
840 map_to_vectorized[level_index],
845 Assert(face_is_owned[dcell->face(f)
848 locally_active_done_elsewhere,
854 [dcell->face(f)->child(c)->index()] = 1;
861 use_active_cells ? dcell->subdomain_id() :
862 dcell->level_subdomain_id();
864 use_active_cells ? neighbor->subdomain_id() :
865 neighbor->level_subdomain_id();
866 if (neigh_domain != my_domain ||
867 face_visited[dcell->face(f)->index()] == 1)
869 std::pair<unsigned int, unsigned int>
870 level_index(neighbor->level(),
872 if (face_is_owned[dcell->face(f)->index()] ==
873 FaceCategory::locally_active_done_here)
876 inner_faces.push_back(create_face(
881 map_to_vectorized[level_index]));
883 else if (face_is_owned[dcell->face(f)
885 FaceCategory::ghosted)
887 inner_ghost_faces.push_back(create_face(
892 map_to_vectorized[level_index]));
897 face_visited[dcell->face(f)->index()] = 1;
898 if (dcell->has_periodic_neighbor(f))
902 dcell->periodic_neighbor_face_no(f))
905 if (face_is_owned[dcell->face(f)->index()] ==
906 FaceCategory::multigrid_refinement_edge)
908 refinement_edge_faces.push_back(
913 refinement_edge_faces.size()));
930 refinement_edge_faces.size();
938 const unsigned int face_no,
939 const typename ::Triangulation<dim>::cell_iterator &cell,
940 const unsigned int number_cell_interior,
941 const typename ::Triangulation<dim>::cell_iterator &neighbor,
942 const unsigned int number_cell_exterior)
948 if (cell->has_periodic_neighbor(face_no))
955 if (cell->level() > neighbor->level())
957 if (cell->has_periodic_neighbor(face_no))
959 cell->periodic_neighbor_of_coarser_periodic_neighbor(face_no)
963 cell->neighbor_of_coarser_neighbor(face_no).second;
967 const unsigned int left_face_orientation =
968 !cell->face_orientation(face_no) + 2 * cell->face_flip(face_no) +
969 4 * cell->face_rotation(face_no);
970 const unsigned int right_face_orientation =
974 if (left_face_orientation != 0)
977 Assert(right_face_orientation == 0,
979 "Face seems to be wrongly oriented from both sides"));
1017 template <
int length>
1018 struct FaceComparator
1024 for (
unsigned int i = 0; i < length; ++i)
1029 for (
unsigned int i = 0; i < length; ++i)
1055 template <
int vectorization_w
idth>
1057 collect_faces_vectorization(
1059 const std::vector<bool> & hard_vectorization_boundary,
1060 std::vector<unsigned int> & face_partition_data,
1064 std::vector<std::vector<unsigned int>> faces_type;
1066 unsigned int face_start = face_partition_data[0],
1067 face_end = face_partition_data[0];
1069 face_partition_data[0] = faces_out.size();
1070 for (
unsigned int partition = 0;
1071 partition < face_partition_data.size() - 1;
1074 std::vector<std::vector<unsigned int>> new_faces_type;
1077 face_start = face_end;
1078 face_end = face_partition_data[partition + 1];
1081 face_partition_data[partition + 1] = face_partition_data[partition];
1085 for (
unsigned int face = face_start; face < face_end; ++face)
1087 for (
unsigned int type = 0; type < faces_type.size(); ++type)
1090 if (compare_faces_for_vectorization(
1091 faces_in[face], faces_in[faces_type[type][0]]))
1093 faces_type[type].push_back(face);
1097 faces_type.emplace_back(1, face);
1103 std::set<FaceToCellTopology<vectorization_width>,
1104 FaceComparator<vectorization_width>>
1106 for (
unsigned int type = 0; type < faces_type.size(); ++type)
1109 faces_in[faces_type[type][0]].interior_face_no;
1111 faces_in[faces_type[type][0]].exterior_face_no;
1113 faces_in[faces_type[type][0]].subface_index;
1115 faces_in[faces_type[type][0]].face_orientation;
1116 unsigned int no_faces = faces_type[type].size();
1117 std::vector<unsigned char> touched(no_faces, 0);
1123 unsigned int n_vectorized = 0;
1124 for (
unsigned int f = 0; f < no_faces; ++f)
1125 if (faces_in[faces_type[type][f]].cells_interior[0] %
1126 vectorization_width ==
1129 bool is_contiguous =
true;
1130 if (f + vectorization_width > no_faces)
1131 is_contiguous =
false;
1133 for (
unsigned int v = 1; v < vectorization_width; ++v)
1134 if (faces_in[faces_type[type][f + v]]
1135 .cells_interior[0] !=
1136 faces_in[faces_type[type][f]].cells_interior[0] + v)
1137 is_contiguous =
false;
1141 faces_type[type].size() -
1142 vectorization_width + 1);
1143 for (
unsigned int v = 0; v < vectorization_width; ++v)
1146 faces_in[faces_type[type][f + v]]
1149 faces_in[faces_type[type][f + v]]
1153 new_faces.insert(macro_face);
1154 f += vectorization_width - 1;
1155 n_vectorized += vectorization_width;
1159 std::vector<unsigned int> untouched;
1160 untouched.reserve(no_faces - n_vectorized);
1161 for (
unsigned int f = 0; f < no_faces; ++f)
1162 if (touched[f] == 0)
1163 untouched.push_back(f);
1165 for (
auto f : untouched)
1168 faces_in[faces_type[type][f]].cells_interior[0];
1170 faces_in[faces_type[type][f]].cells_exterior[0];
1172 if (v == vectorization_width)
1174 new_faces.insert(macro_face);
1178 if (v > 0 && v < vectorization_width)
1181 if (hard_vectorization_boundary[partition + 1] ||
1182 partition == face_partition_data.size() - 2)
1184 for (; v < vectorization_width; ++v)
1192 new_faces.insert(macro_face);
1197 std::vector<unsigned int> untreated(v);
1198 for (
unsigned int f = 0; f < v; ++f)
1200 faces_type[type][*(untouched.end() - 1 - f)];
1201 new_faces_type.push_back(untreated);
1207 for (
auto it = new_faces.begin(); it != new_faces.end(); ++it)
1208 faces_out.push_back(*it);
1209 face_partition_data[partition + 1] += new_faces.size();
1212 faces_type = std::move(new_faces_type);
1217 for (
unsigned int i = 0; i < faces_type.size(); ++i)
1221 unsigned int nfaces = 0;
1222 for (
unsigned int i = face_partition_data[0];
1223 i < face_partition_data.back();
1225 for (
unsigned int v = 0; v < vectorization_width; ++v)
1230 std::vector<std::pair<unsigned int, unsigned int>> in_faces, out_faces;
1231 for (
unsigned int i = 0; i < faces_in.size(); ++i)
1232 in_faces.emplace_back(faces_in[i].cells_interior[0],
1233 faces_in[i].cells_exterior[0]);
1234 for (
unsigned int i = face_partition_data[0];
1235 i < face_partition_data.back();
1237 for (
unsigned int v = 0;
1238 v < vectorization_width &&
1241 out_faces.emplace_back(faces_out[i].cells_interior[v],
1242 faces_out[i].cells_exterior[v]);
1243 std::sort(in_faces.begin(), in_faces.end());
1244 std::sort(out_faces.begin(), out_faces.end());
1246 for (
unsigned int i = 0; i < in_faces.size(); ++i)
1254 #endif // ifndef DOXYGEN 1260 DEAL_II_NAMESPACE_CLOSE
std::vector< unsigned int > ghost_face_partition_data
static const unsigned int invalid_unsigned_int
#define AssertDimension(dim1, dim2)
unsigned char face_orientation
#define AssertIndexRange(index, range)
std::vector< unsigned int > cell_partition_data
#define AssertThrow(cond, exc)
std::vector< unsigned int > refinement_edge_face_partition_data
unsigned int vectorization_length
unsigned int cells_interior[vectorization_width]
static::ExceptionBase & ExcMessage(std::string arg1)
unsigned int subdomain_id
#define Assert(cond, exc)
std::vector< unsigned int > boundary_partition_data
unsigned char subface_index
std::vector< unsigned int > face_partition_data
unsigned char exterior_face_no
FaceToCellTopology< 1 > create_face(const unsigned int face_no, const typename::Triangulation< dim >::cell_iterator &cell, const unsigned int number_cell_interior, const typename::Triangulation< dim >::cell_iterator &neighbor, const unsigned int number_cell_exterior)
static::ExceptionBase & ExcNotImplemented()
void generate_faces(const ::Triangulation< dim > &triangulation, const std::vector< std::pair< unsigned int, unsigned int >> &cell_levels, TaskInfo &task_info)
unsigned int cells_exterior[vectorization_width]
unsigned char interior_face_no
static::ExceptionBase & ExcInternalError()
void initialize(const ::Triangulation< dim > &triangulation, const MFAddData &additional_data, std::vector< std::pair< unsigned int, unsigned int >> &cell_levels)