14#ifndef dealii_non_matching_mapping_info_h
15#define dealii_non_matching_mapping_info_h
43 template <
int dim,
int spacedim = dim>
56 return mapping->requires_update_flags(update_flags);
66 &internal_mapping_data,
70 internal_mapping_data->reinit(update_flags_mapping, quadrature);
75 mapping->fill_fe_values(cell,
78 *internal_mapping_data,
91 &internal_mapping_data,
94 mapping_data.
initialize(quadrature.size(), update_flags_mapping);
96 internal_mapping_data->reinit(update_flags_mapping, quadrature);
98 mapping->fill_fe_immersed_surface_values(cell,
100 *internal_mapping_data,
111 const unsigned int face_no,
114 &internal_mapping_data,
125 *internal_mapping_data);
128 cell->reference_cell(),
131 cell->combined_face_orientation(face_no)),
134 mapping_q->fill_mapping_data_for_face_quadrature(
135 cell, face_no, quadrature, *internal_mapping_data, mapping_data);
139 auto internal_mapping_data =
140 mapping->get_face_data(update_flags_mapping,
143 mapping->fill_fe_face_values(cell,
146 *internal_mapping_data,
152 template <
int dim,
int spacedim = dim>
155 const double diameter,
159 const auto jac_0 = inverse_jacobians[0];
160 const double zero_tolerance_double =
161 1e4 / diameter * std::numeric_limits<double>::epsilon() * 1024.;
162 bool jacobian_constant =
true;
163 for (
unsigned int q = 1; q < inverse_jacobians.size(); ++q)
166 for (
unsigned int d = 0; d < dim; ++d)
167 for (
unsigned int e = 0; e < spacedim; ++e)
168 if (std::fabs(jac_0[d][e] - jac[d][e]) > zero_tolerance_double)
169 jacobian_constant =
false;
170 if (!jacobian_constant)
176 bool cell_cartesian = jacobian_constant && dim == spacedim;
177 for (
unsigned int d = 0; d < dim; ++d)
178 for (
unsigned int e = 0; e < dim; ++e)
180 if (std::fabs(jac_0[d][e]) > zero_tolerance_double)
182 cell_cartesian =
false;
188 return ::internal::MatrixFreeFunctions::GeometryType::cartesian;
189 else if (jacobian_constant)
190 return ::internal::MatrixFreeFunctions::GeometryType::affine;
192 return ::internal::MatrixFreeFunctions::GeometryType::general;
218 template <
int dim,
int spacedim = dim,
typename Number =
double>
226 Number>::vectorized_value_type;
322 template <
typename ContainerType>
325 const ContainerType &cell_iterator_range,
326 const std::vector<std::vector<
Point<dim>>> &unit_points_vector,
335 template <
typename ContainerType>
338 const ContainerType &cell_iterator_range,
346 template <
typename ContainerType>
349 const ContainerType &cell_iterator_range,
357 template <
typename ContainerType>
360 const ContainerType &cell_iterator_range,
368 template <
typename CellIteratorType>
370 reinit_faces(
const std::vector<std::pair<CellIteratorType, unsigned int>>
371 &face_iterator_range_interior,
407 const bool is_interior =
true)
const;
415 const bool is_interior =
true)
const;
459 template <
bool is_face>
481 const unsigned int geometry_index)
const;
517 template <
typename NumberType>
544 const bool is_face_centric =
false);
551 const unsigned int n_q_points,
560 const unsigned int n_q_points,
569 const unsigned int n_q_points,
572 const std::vector<double> &weights,
573 const unsigned int compressed_unit_point_index_offset,
574 const bool affine_cell,
575 const bool is_interior =
true);
586 template <
typename ContainerType,
typename QuadratureType>
589 const ContainerType &cell_iterator_range,
590 const std::vector<QuadratureType> &quadrature_vector,
591 const unsigned int n_unfiltered_cells,
637 std::unique_ptr<typename Mapping<dim, spacedim>::InternalDataBase>
678 std::vector<::internal::MatrixFreeFunctions::GeometryType>
cell_type;
711 std::array<AlignedVector<DerivativeForm<1, dim, spacedim, Number>>, 2>
721 std::array<AlignedVector<DerivativeForm<1, spacedim, dim, Number>>, 2>
773 template <
int dim,
int spacedim,
typename Number>
776 const unsigned int offset,
777 const bool is_interior)
const
779 const auto &face_pair = face_number[offset];
780 return is_interior ? face_pair.first : face_pair.second;
786 template <
int dim,
int spacedim,
typename Number>
792 , update_flags(update_flags)
794 , additional_data(additional_data)
821 template <
int dim,
int spacedim,
typename Number>
825 n_q_points_unvectorized.
clear();
826 unit_points_index.clear();
827 data_index_offsets.clear();
828 compressed_data_index_offsets.clear();
834 template <
int dim,
int spacedim,
typename Number>
838 const std::vector<
Point<dim>> &unit_points_in)
845 template <
int dim,
int spacedim,
typename Number>
851 quadrature.initialize(unit_points_in);
852 reinit(cell, quadrature);
857 template <
int dim,
int spacedim,
typename Number>
863 n_q_points_unvectorized.resize(1);
864 n_q_points_unvectorized[0] = quadrature.
size();
866 const unsigned int n_q_points =
867 compute_n_q_points<VectorizedArrayType>(n_q_points_unvectorized[0]);
869 const unsigned int n_q_points_data =
870 compute_n_q_points<Number>(n_q_points_unvectorized[0]);
873 resize_unit_points(n_q_points);
874 resize_data_fields(n_q_points_data);
879 n_q_points_unvectorized[0],
885 update_flags_mapping,
888 internal_mapping_data,
900 n_q_points_unvectorized[0],
907 unit_points_index = {0};
908 data_index_offsets = {0};
909 compressed_data_index_offsets = {0};
911 state = State::single_cell;
916 template <
int dim,
int spacedim,
typename Number>
917 template <
typename ContainerType>
920 const ContainerType &cell_iterator_range,
921 const std::vector<std::vector<
Point<dim>>> &unit_points_vector,
922 const unsigned int n_unfiltered_cells)
924 const unsigned int n_cells = unit_points_vector.size();
926 std::distance(cell_iterator_range.begin(),
927 cell_iterator_range.end()));
929 std::vector<Quadrature<dim>> quadrature_vector(n_cells);
934 reinit_cells(cell_iterator_range, quadrature_vector, n_unfiltered_cells);
939 template <
int dim,
int spacedim,
typename Number>
940 template <
typename ContainerType,
typename QuadratureType>
943 const ContainerType &cell_iterator_range,
944 const std::vector<QuadratureType> &quadrature_vector,
945 const unsigned int n_unfiltered_cells,
948 const QuadratureType &quadrature,
953 do_cell_index_compression =
956 const unsigned int n_cells = quadrature_vector.size();
958 std::distance(cell_iterator_range.begin(),
959 cell_iterator_range.end()));
961 n_q_points_unvectorized.reserve(n_cells);
963 cell_type.reserve(n_cells);
965 if (additional_data.store_cells)
966 cell_level_and_indices.resize(n_cells);
969 unit_points_index.reserve(n_cells + 1);
970 unit_points_index.push_back(0);
971 data_index_offsets.reserve(n_cells + 1);
972 data_index_offsets.push_back(0);
973 for (
const auto &quadrature : quadrature_vector)
975 const unsigned int n_points = quadrature.size();
976 n_q_points_unvectorized.push_back(n_points);
978 const unsigned int n_q_points =
979 compute_n_q_points<VectorizedArrayType>(n_points);
980 unit_points_index.push_back(unit_points_index.back() + n_q_points);
982 const unsigned int n_q_points_data =
983 compute_n_q_points<Number>(n_points);
984 data_index_offsets.push_back(data_index_offsets.back() +
988 const unsigned int n_unit_points = unit_points_index.back();
989 const unsigned int n_data_points = data_index_offsets.back();
992 resize_unit_points(n_unit_points);
993 resize_data_fields(n_data_points);
995 if (do_cell_index_compression)
996 cell_index_to_compressed_cell_index.resize(n_unfiltered_cells,
1000 unsigned int size_compressed_data = 0;
1002 for (
const auto &cell : cell_iterator_range)
1004 if (additional_data.store_cells)
1006 this->triangulation = &cell->get_triangulation();
1007 cell_level_and_indices[
cell_index] = {cell->level(), cell->index()};
1010 const auto &quadrature = quadrature_vector[
cell_index];
1011 const bool empty = quadrature.empty();
1014 const unsigned int n_q_points = compute_n_q_points<VectorizedArrayType>(
1016 store_unit_points(unit_points_index[
cell_index],
1019 quadrature.get_points());
1022 compute_mapping_data(cell, quadrature, mapping_data);
1025 const unsigned int n_q_points_data =
1026 compute_n_q_points<Number>(n_q_points_unvectorized[
cell_index]);
1032 cell_type.push_back(
1037 cell_type.push_back(
1043 const bool affine_cells =
1052 1e4 / cell->diameter() * std::numeric_limits<double>::epsilon() *
1057 const auto comparison_result =
1068 comparison_result ==
1071 compressed_data_index_offsets.push_back(
1072 compressed_data_index_offsets.back());
1076 const unsigned int n_compressed_data_last_cell =
1080 compute_n_q_points<Number>(
1083 compressed_data_index_offsets.push_back(
1084 compressed_data_index_offsets.back() +
1085 n_compressed_data_last_cell);
1089 compressed_data_index_offsets.push_back(0);
1092 mapping_data_previous_cell = mapping_data;
1094 store_mapping_data(data_index_offsets[
cell_index],
1098 quadrature.get_weights(),
1107 size_compressed_data = compressed_data_index_offsets.back() + 1;
1109 size_compressed_data =
1111 compressed_data_index_offsets.back() + n_q_points_data);
1113 if (do_cell_index_compression)
1114 cell_index_to_compressed_cell_index[cell->active_cell_index()] =
1122 jacobians[0].resize(size_compressed_data);
1123 jacobians[0].shrink_to_fit();
1127 inverse_jacobians[0].resize(size_compressed_data);
1128 inverse_jacobians[0].shrink_to_fit();
1131 state = State::cell_vector;
1136 template <
int dim,
int spacedim,
typename Number>
1137 template <
typename ContainerType>
1140 const ContainerType &cell_iterator_range,
1142 const unsigned int n_unfiltered_cells)
1144 auto compute_mapping_data_for_cells =
1150 update_flags_mapping,
1153 internal_mapping_data,
1157 do_reinit_cells<ContainerType, Quadrature<dim>>(
1158 cell_iterator_range,
1161 compute_mapping_data_for_cells);
1166 template <
int dim,
int spacedim,
typename Number>
1167 template <
typename ContainerType>
1170 const ContainerType &cell_iterator_range,
1172 const unsigned int n_unfiltered_cells)
1175 additional_data.use_global_weights ==
false,
1177 "There is no known use-case for AdditionalData::use_global_weights=true and reinit_surface()"));
1184 auto compute_mapping_data_for_surface =
1191 update_flags_mapping,
1194 internal_mapping_data,
1198 do_reinit_cells<ContainerType, ImmersedSurfaceQuadrature<dim>>(
1199 cell_iterator_range,
1202 compute_mapping_data_for_surface);
1207 template <
int dim,
int spacedim,
typename Number>
1208 template <
typename ContainerType>
1211 const ContainerType &cell_iterator_range,
1213 const unsigned int n_unfiltered_cells)
1219 do_cell_index_compression =
1222 const unsigned int n_cells = quadrature_vector.size();
1224 std::distance(cell_iterator_range.begin(),
1225 cell_iterator_range.end()));
1228 cell_index_offset.resize(n_cells);
1229 unsigned int n_faces = 0;
1231 for (
const auto &cell : cell_iterator_range)
1234 n_faces += cell->n_faces();
1238 n_q_points_unvectorized.reserve(n_faces);
1240 cell_type.reserve(n_faces);
1243 unit_points_index.resize(n_faces + 1);
1244 data_index_offsets.resize(n_faces + 1);
1246 unsigned int n_unit_points = 0;
1247 unsigned int n_data_points = 0;
1248 for (
const auto &cell : cell_iterator_range)
1250 for (
const auto &f : cell->face_indices())
1252 const unsigned int current_face_index =
1255 unit_points_index[current_face_index] = n_unit_points;
1256 data_index_offsets[current_face_index] = n_data_points;
1258 const unsigned int n_points =
1260 n_q_points_unvectorized.push_back(n_points);
1262 const unsigned int n_q_points =
1263 compute_n_q_points<VectorizedArrayType>(n_points);
1264 n_unit_points += n_q_points;
1266 const unsigned int n_q_points_data =
1267 compute_n_q_points<Number>(n_points);
1268 n_data_points += n_q_points_data;
1273 unit_points_index[n_faces] = n_unit_points;
1274 data_index_offsets[n_faces] = n_data_points;
1277 if (do_cell_index_compression)
1278 cell_index_to_compressed_cell_index.resize(n_unfiltered_cells,
1283 resize_unit_points_faces(n_unit_points);
1284 resize_data_fields(n_data_points);
1288 bool first_set =
false;
1289 unsigned int size_compressed_data = 0;
1291 for (
const auto &cell : cell_iterator_range)
1293 const auto &quadratures_on_faces = quadrature_vector[
cell_index];
1295 Assert(quadratures_on_faces.size() == cell->n_faces(),
1299 for (
const auto &f : cell->face_indices())
1301 const auto &quadrature_on_face = quadratures_on_faces[f];
1302 const bool empty = quadrature_on_face.empty();
1304 const unsigned int current_face_index =
1308 const unsigned int n_q_points =
1309 compute_n_q_points<VectorizedArrayType>(
1310 n_q_points_unvectorized[current_face_index]);
1311 store_unit_points_faces(unit_points_index[current_face_index],
1313 n_q_points_unvectorized[current_face_index],
1314 quadrature_on_face.get_points());
1318 update_flags_mapping,
1322 internal_mapping_data,
1330 cell->diameter(), mapping_data.inverse_jacobians));
1334 mapping_data_first = mapping_data;
1339 cell_type.push_back(
1342 if (current_face_index > 0)
1345 const bool affine_cells =
1346 cell_type[current_face_index] <=
1348 cell_type[current_face_index - 1] <=
1354 1e4 / cell->diameter() *
1355 std::numeric_limits<double>::epsilon() * 1024.);
1359 const auto comparison_result =
1360 (!affine_cells || mapping_data.inverse_jacobians.empty() ||
1364 mapping_data.inverse_jacobians[0],
1370 comparison_result ==
1373 compressed_data_index_offsets.push_back(
1374 compressed_data_index_offsets.back());
1376 else if (first_set &&
1377 (cell_type[current_face_index] <=
1380 mapping_data.inverse_jacobians[0],
1383 double>::ComparisonResult::equal))
1385 compressed_data_index_offsets.push_back(0);
1389 const unsigned int n_compressed_data_last_cell =
1390 cell_type[current_face_index - 1] <=
1393 compute_n_q_points<Number>(
1394 n_q_points_unvectorized[current_face_index - 1]);
1396 compressed_data_index_offsets.push_back(
1397 compressed_data_index_offsets.back() +
1398 n_compressed_data_last_cell);
1402 compressed_data_index_offsets.push_back(0);
1405 mapping_data_previous_cell = mapping_data;
1407 const unsigned int n_q_points_data = compute_n_q_points<Number>(
1408 n_q_points_unvectorized[current_face_index]);
1409 store_mapping_data(data_index_offsets[current_face_index],
1411 n_q_points_unvectorized[current_face_index],
1413 quadrature_on_face.get_weights(),
1414 data_index_offsets[current_face_index],
1415 cell_type[current_face_index] <=
1420 if (cell_type[current_face_index] <=
1422 size_compressed_data = compressed_data_index_offsets.back() + 1;
1424 size_compressed_data =
1426 compressed_data_index_offsets.back() +
1429 if (do_cell_index_compression)
1430 cell_index_to_compressed_cell_index[cell->active_cell_index()] =
1438 jacobians[0].resize(size_compressed_data);
1439 jacobians[0].shrink_to_fit();
1443 inverse_jacobians[0].resize(size_compressed_data);
1444 inverse_jacobians[0].shrink_to_fit();
1447 state = State::faces_on_cells_in_vector;
1452 template <
int dim,
int spacedim,
typename Number>
1453 template <
typename CellIteratorType>
1456 const std::vector<std::pair<CellIteratorType, unsigned int>>
1457 &face_iterator_range_interior,
1462 do_cell_index_compression =
false;
1467 const unsigned int n_faces = quadrature_vector.size();
1469 std::distance(face_iterator_range_interior.begin(),
1470 face_iterator_range_interior.end()));
1472 n_q_points_unvectorized.reserve(n_faces);
1474 cell_type.reserve(n_faces);
1475 face_number.reserve(n_faces);
1478 unit_points_index.reserve(n_faces + 1);
1479 unit_points_index.push_back(0);
1480 data_index_offsets.reserve(n_faces + 1);
1481 data_index_offsets.push_back(0);
1482 for (
const auto &quadrature : quadrature_vector)
1484 const unsigned int n_points = quadrature.size();
1485 n_q_points_unvectorized.push_back(n_points);
1487 const unsigned int n_q_points =
1488 compute_n_q_points<VectorizedArrayType>(n_points);
1489 unit_points_index.push_back(unit_points_index.back() + n_q_points);
1491 const unsigned int n_q_points_data =
1492 compute_n_q_points<Number>(n_points);
1493 data_index_offsets.push_back(data_index_offsets.back() +
1497 const unsigned int n_unit_points = unit_points_index.back();
1498 const unsigned int n_data_points = data_index_offsets.back();
1501 resize_unit_points_faces(n_unit_points);
1502 resize_data_fields(n_data_points,
true);
1504 std::array<MappingData, 2> mapping_data;
1505 std::array<MappingData, 2> mapping_data_previous_cell;
1506 std::array<MappingData, 2> mapping_data_first;
1507 bool first_set =
false;
1508 unsigned int size_compressed_data = 0;
1509 unsigned int face_index = 0;
1510 for (
const auto &cell_and_f : face_iterator_range_interior)
1512 const auto &quadrature_on_face = quadrature_vector[face_index];
1513 const bool empty = quadrature_on_face.empty();
1516 const auto &cell_m = cell_and_f.first;
1517 const auto f_m = cell_and_f.second;
1520 const auto &cell_p =
1521 cell_m->at_boundary(f_m) ? cell_m : cell_m->neighbor(f_m);
1523 cell_m->at_boundary(f_m) ? f_m : cell_m->neighbor_face_no(f_m);
1526 empty || (cell_m->level() == cell_p->level()),
1528 "Intersected faces with quadrature points need to have the same "
1529 "refinement level!"));
1531 face_number.emplace_back(f_m, f_p);
1534 cell_m->combined_face_orientation(f_m) ==
1536 cell_p->combined_face_orientation(f_p) ==
1539 "Non standard face orientation is currently not implemented."));
1542 const unsigned int n_q_points = compute_n_q_points<VectorizedArrayType>(
1543 n_q_points_unvectorized[face_index]);
1544 store_unit_points_faces(unit_points_index[face_index],
1546 n_q_points_unvectorized[face_index],
1547 quadrature_on_face.get_points());
1552 update_flags_mapping,
1556 internal_mapping_data,
1562 update_flags_mapping,
1566 internal_mapping_data,
1576 cell_m->diameter(), mapping_data[0].inverse_jacobians),
1578 cell_m->diameter(), mapping_data[1].inverse_jacobians)));
1584 mapping_data_first = mapping_data;
1589 cell_type.push_back(
1595 const bool affine_cells =
1596 cell_type[face_index] <=
1598 cell_type[face_index - 1] <=
1604 1e4 / cell_m->diameter() *
1605 std::numeric_limits<double>::epsilon() * 1024.);
1609 const auto comparison_result_m =
1610 (!affine_cells || mapping_data[0].inverse_jacobians.empty() ||
1611 mapping_data_previous_cell[0].inverse_jacobians.empty()) ?
1614 mapping_data[0].inverse_jacobians[0],
1615 mapping_data_previous_cell[0].inverse_jacobians[0]);
1617 const auto comparison_result_p =
1618 (!affine_cells || mapping_data[1].inverse_jacobians.empty() ||
1619 mapping_data_previous_cell[1].inverse_jacobians.empty()) ?
1622 mapping_data[1].inverse_jacobians[0],
1623 mapping_data_previous_cell[1].inverse_jacobians[0]);
1628 comparison_result_m ==
1630 comparison_result_p ==
1633 compressed_data_index_offsets.push_back(
1634 compressed_data_index_offsets.back());
1636 else if (first_set &&
1637 (cell_type[face_index] <=
1640 mapping_data[0].inverse_jacobians[0],
1641 mapping_data_first[0].inverse_jacobians[0]) ==
1643 double>::ComparisonResult::equal) &&
1645 mapping_data[1].inverse_jacobians[0],
1646 mapping_data_first[1].inverse_jacobians[0]) ==
1649 compressed_data_index_offsets.push_back(0);
1653 const unsigned int n_compressed_data_last_cell =
1654 cell_type[face_index - 1] <=
1657 compute_n_q_points<Number>(
1658 n_q_points_unvectorized[face_index - 1]);
1660 compressed_data_index_offsets.push_back(
1661 compressed_data_index_offsets.back() +
1662 n_compressed_data_last_cell);
1666 compressed_data_index_offsets.push_back(0);
1669 mapping_data_previous_cell = mapping_data;
1671 const unsigned int n_q_points_data =
1672 compute_n_q_points<Number>(n_q_points_unvectorized[face_index]);
1675 store_mapping_data(data_index_offsets[face_index],
1677 n_q_points_unvectorized[face_index],
1679 quadrature_on_face.get_weights(),
1680 data_index_offsets[face_index],
1681 cell_type[face_index] <=
1687 store_mapping_data(data_index_offsets[face_index],
1689 n_q_points_unvectorized[face_index],
1691 quadrature_on_face.get_weights(),
1692 data_index_offsets[face_index],
1693 cell_type[face_index] <=
1699 if (cell_type[face_index] <=
1701 size_compressed_data = compressed_data_index_offsets.back() + 1;
1703 size_compressed_data =
1705 compressed_data_index_offsets.back() + n_q_points_data);
1712 jacobians[0].resize(size_compressed_data);
1713 jacobians[0].shrink_to_fit();
1714 jacobians[1].resize(size_compressed_data);
1715 jacobians[1].shrink_to_fit();
1719 inverse_jacobians[0].resize(size_compressed_data);
1720 inverse_jacobians[0].shrink_to_fit();
1721 inverse_jacobians[1].resize(size_compressed_data);
1722 inverse_jacobians[1].shrink_to_fit();
1725 state = State::face_vector;
1730 template <
int dim,
int spacedim,
typename Number>
1734 return state == State::faces_on_cells_in_vector;
1739 template <
int dim,
int spacedim,
typename Number>
1742 const unsigned int geometry_index)
const
1744 return n_q_points_unvectorized[geometry_index];
1748 template <
int dim,
int spacedim,
typename Number>
1751 const unsigned int geometry_index)
const
1754 return cell_type[geometry_index];
1759 template <
int dim,
int spacedim,
typename Number>
1765 additional_data.store_cells,
1767 "Cells have been not stored. You can enable this by Additional::store_cells."));
1768 return {triangulation.get(),
1775 template <
int dim,
int spacedim,
typename Number>
1776 template <
typename NumberType>
1779 const unsigned int n_q_points_unvectorized)
1781 const unsigned int n_lanes =
1783 const unsigned int n_filled_lanes_last_batch =
1784 n_q_points_unvectorized % n_lanes;
1785 unsigned int n_q_points = n_q_points_unvectorized / n_lanes;
1786 if (n_filled_lanes_last_batch > 0)
1793 template <
int dim,
int spacedim,
typename Number>
1794 template <
bool is_face>
1798 const unsigned int face_number)
const
1803 const unsigned int compressed_cell_index =
1807 Assert(state == State::cell_vector,
1809 "This mapping info is not reinitialized for a cell vector!"));
1810 return compressed_cell_index;
1816 "cell_index has to be set if face_number is specified!"));
1817 Assert(state == State::faces_on_cells_in_vector ||
1818 state == State::face_vector,
1819 ExcMessage(
"This mapping info is not reinitialized for faces"
1820 " on cells in a vector!"));
1821 if (state == State::faces_on_cells_in_vector)
1822 return cell_index_offset[compressed_cell_index] + face_number;
1823 else if (state == State::face_vector)
1830 template <
int dim,
int spacedim,
typename Number>
1835 if (do_cell_index_compression)
1839 ExcMessage(
"Mapping info object was not initialized for this"
1840 " active cell index!"));
1841 return cell_index_to_compressed_cell_index[
cell_index];
1848 template <
int dim,
int spacedim,
typename Number>
1851 const unsigned int unit_points_index_offset,
1852 const unsigned int n_q_points,
1853 const unsigned int n_q_points_unvectorized,
1856 const unsigned int n_lanes =
1859 for (
unsigned int q = 0; q < n_q_points; ++q)
1861 const unsigned int offset = unit_points_index_offset + q;
1862 for (
unsigned int v = 0;
1863 v < n_lanes && q * n_lanes + v < n_q_points_unvectorized;
1865 for (
unsigned int d = 0; d < dim; ++d)
1867 unit_points[offset][d], v) = points[q * n_lanes + v][d];
1873 template <
int dim,
int spacedim,
typename Number>
1876 const unsigned int unit_points_index_offset,
1877 const unsigned int n_q_points,
1878 const unsigned int n_q_points_unvectorized,
1881 const unsigned int n_lanes =
1884 for (
unsigned int q = 0; q < n_q_points; ++q)
1886 const unsigned int offset = unit_points_index_offset + q;
1887 for (
unsigned int v = 0;
1888 v < n_lanes && q * n_lanes + v < n_q_points_unvectorized;
1890 for (
unsigned int d = 0; d < dim - 1; ++d)
1892 unit_points_faces[offset][d], v) = points[q * n_lanes + v][d];
1898 template <
int dim,
int spacedim,
typename Number>
1901 const unsigned int unit_points_index_offset,
1902 const unsigned int n_q_points,
1903 const unsigned int n_q_points_unvectorized,
1905 const std::vector<double> &weights,
1906 const unsigned int compressed_unit_point_index_offset,
1907 const bool affine_cell,
1908 const bool is_interior)
1910 const unsigned int n_lanes =
1913 for (
unsigned int q = 0; q < n_q_points; ++q)
1915 const unsigned int offset = unit_points_index_offset + q;
1916 const unsigned int compressed_offset =
1917 compressed_unit_point_index_offset + q;
1918 for (
unsigned int v = 0;
1919 v < n_lanes && q * n_lanes + v < n_q_points_unvectorized;
1922 if (q == 0 || !affine_cell)
1925 for (
unsigned int d = 0; d < dim; ++d)
1926 for (
unsigned int s = 0; s < spacedim; ++s)
1928 jacobians[is_interior ? 0 : 1][compressed_offset][d][s],
1929 v) = mapping_data.
jacobians[q * n_lanes + v][d][s];
1930 if (update_flags_mapping &
1932 for (
unsigned int d = 0; d < dim; ++d)
1933 for (
unsigned int s = 0; s < spacedim; ++s)
1935 inverse_jacobians[is_interior ? 0 : 1]
1936 [compressed_offset][d][s],
1945 if (additional_data.use_global_weights)
1948 JxW_values[offset], v) = weights[q * n_lanes + v];
1953 JxW_values[offset], v) =
1958 for (
unsigned int s = 0; s < spacedim; ++s)
1960 normal_vectors[offset][s], v) =
1962 if (update_flags_mapping &
1964 for (
unsigned int s = 0; s < spacedim; ++s)
1966 real_points[offset][s], v) =
1975 template <
int dim,
int spacedim,
typename Number>
1978 const unsigned int n_unit_point_batches)
1980 unit_points.resize(n_unit_point_batches);
1985 template <
int dim,
int spacedim,
typename Number>
1988 const unsigned int n_unit_point_batches)
1990 unit_points_faces.resize(n_unit_point_batches);
1995 template <
int dim,
int spacedim,
typename Number>
1998 const unsigned int n_data_point_batches,
1999 const bool is_face_centric)
2003 jacobians[0].resize(n_data_point_batches);
2004 if (is_face_centric)
2005 jacobians[1].resize(n_data_point_batches);
2009 inverse_jacobians[0].resize(n_data_point_batches);
2010 if (is_face_centric)
2011 inverse_jacobians[1].resize(n_data_point_batches);
2014 JxW_values.resize(n_data_point_batches);
2016 normal_vectors.resize(n_data_point_batches);
2018 real_points.resize(n_data_point_batches);
2023 template <
int dim,
int spacedim,
typename Number>
2028 const unsigned int offset)
const
2030 return unit_points.data() + offset;
2035 template <
int dim,
int spacedim,
typename Number>
2040 const unsigned int offset)
const
2042 return unit_points_faces.data() + offset;
2047 template <
int dim,
int spacedim,
typename Number>
2050 const unsigned int offset)
const
2052 return real_points.data() + offset;
2057 template <
int dim,
int spacedim,
typename Number>
2060 const unsigned int geometry_index)
const
2062 return unit_points_index[geometry_index];
2067 template <
int dim,
int spacedim,
typename Number>
2070 const unsigned int geometry_index)
const
2072 return data_index_offsets[geometry_index];
2076 template <
int dim,
int spacedim,
typename Number>
2079 const unsigned int geometry_index)
const
2081 return compressed_data_index_offsets[geometry_index];
2086 template <
int dim,
int spacedim,
typename Number>
2089 const bool is_interior)
const
2091 return jacobians[is_interior ? 0 : 1].data() + offset;
2096 template <
int dim,
int spacedim,
typename Number>
2099 const unsigned int offset,
2100 const bool is_interior)
const
2102 return inverse_jacobians[is_interior ? 0 : 1].data() + offset;
2107 template <
int dim,
int spacedim,
typename Number>
2110 const unsigned int offset)
const
2112 return normal_vectors.data() + offset;
2117 template <
int dim,
int spacedim,
typename Number>
2118 inline const Number *
2121 return JxW_values.data() + offset;
2126 template <
int dim,
int spacedim,
typename Number>
2135 template <
int dim,
int spacedim,
typename Number>
2139 return update_flags;
2144 template <
int dim,
int spacedim,
typename Number>
2148 return update_flags_mapping;
2153 template <
int dim,
int spacedim,
typename Number>
2160 memory += cell_type.capacity() *
2173 cell_index_to_compressed_cell_index);
2175 memory +=
sizeof(*this);
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
Abstract base class for mapping classes.
const UpdateFlags update_flags
unsigned int compute_compressed_data_index_offset(const unsigned int geometry_index) const
const DerivativeForm< 1, spacedim, dim, Number > * get_inverse_jacobian(const unsigned int offset, const bool is_interior=true) const
AlignedVector< Point< dim, VectorizedArrayType > > unit_points
std::array< AlignedVector< DerivativeForm< 1, dim, spacedim, Number > >, 2 > jacobians
AlignedVector< Number > JxW_values
::internal::MatrixFreeFunctions::GeometryType get_cell_type(const unsigned int geometry_index) const
unsigned int get_face_number(const unsigned int offset, const bool is_interior) const
const Mapping< dim, spacedim > & get_mapping() const
void reinit_faces(const ContainerType &cell_iterator_range, const std::vector< std::vector< Quadrature< dim - 1 > > > &quadrature_vector, const unsigned int n_unfiltered_cells=numbers::invalid_unsigned_int)
std::array< AlignedVector< DerivativeForm< 1, spacedim, dim, Number > >, 2 > inverse_jacobians
const Point< dim, VectorizedArrayType > * get_unit_point(const unsigned int offset) const
unsigned int get_n_q_points_unvectorized(const unsigned int geometry_index) const
const ObserverPointer< const Mapping< dim, spacedim > > mapping
unsigned int compute_compressed_cell_index(const unsigned int cell_index) const
const Point< dim - 1, VectorizedArrayType > * get_unit_point_faces(const unsigned int offset) const
Quadrature< dim > quadrature
std::vector< unsigned int > cell_index_offset
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Quadrature< dim > &quadrature)
void store_mapping_data(const unsigned int unit_points_index_offset, const unsigned int n_q_points, const unsigned int n_q_points_unvectorized, const MappingData &mapping_data, const std::vector< double > &weights, const unsigned int compressed_unit_point_index_offset, const bool affine_cell, const bool is_interior=true)
AlignedVector< Tensor< 1, spacedim, Number > > normal_vectors
unsigned int compute_geometry_index_offset(const unsigned int cell_index, const unsigned int face_number) const
std::vector<::internal::MatrixFreeFunctions::GeometryType > cell_type
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< dim > > &unit_points)
void reinit_cells(const ContainerType &cell_iterator_range, const std::vector< Quadrature< dim > > &quadrature_vector, const unsigned int n_unfiltered_cells=numbers::invalid_unsigned_int)
MappingInfo & operator=(const MappingInfo &)=delete
ObserverPointer< const Triangulation< dim, spacedim > > triangulation
std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > internal_mapping_data
void reinit_surface(const ContainerType &cell_iterator_range, const std::vector< ImmersedSurfaceQuadrature< dim > > &quadrature_vector, const unsigned int n_unfiltered_cells=numbers::invalid_unsigned_int)
void resize_unit_points_faces(const unsigned int n_unit_point_batches)
const Tensor< 1, spacedim, Number > * get_normal_vector(const unsigned int offset) const
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const std::vector< Point< dim > > &unit_points)
const DerivativeForm< 1, dim, spacedim, Number > * get_jacobian(const unsigned int offset, const bool is_interior=true) const
typename ::internal::VectorizedArrayTrait< Number >::vectorized_value_type VectorizedArrayType
void reinit_cells(const ContainerType &cell_iterator_range, const std::vector< std::vector< Point< dim > > > &unit_points_vector, const unsigned int n_unfiltered_cells=numbers::invalid_unsigned_int)
void resize_data_fields(const unsigned int n_data_point_batches, const bool is_face_centric=false)
void resize_unit_points(const unsigned int n_unit_point_batches)
std::size_t memory_consumption() const
UpdateFlags get_update_flags() const
void store_unit_points_faces(const unsigned int unit_points_index_offset, const unsigned int n_q_points, const unsigned int n_q_points_unvectorized, const std::vector< Point< dim - 1 > > &points)
unsigned int compute_unit_point_index_offset(const unsigned int geometry_index) const
std::vector< unsigned int > cell_index_to_compressed_cell_index
AlignedVector< Point< spacedim, Number > > real_points
unsigned int compute_data_index_offset(const unsigned int geometry_index) const
@ faces_on_cells_in_vector
std::vector< std::pair< unsigned char, unsigned char > > face_number
MappingInfo(const Mapping< dim, spacedim > &mapping, const UpdateFlags update_flags, const AdditionalData additional_data=AdditionalData())
std::vector< unsigned int > unit_points_index
std::vector< std::pair< int, int > > cell_level_and_indices
std::vector< unsigned int > compressed_data_index_offsets
bool do_cell_index_compression
std::vector< unsigned int > data_index_offsets
bool is_face_state() const
std::vector< unsigned int > n_q_points_unvectorized
const Number * get_JxW(const unsigned int offset) const
const Point< spacedim, Number > * get_real_point(const unsigned int offset) const
void store_unit_points(const unsigned int unit_points_index_offset, const unsigned int n_q_points, const unsigned int n_q_points_unvectorized, const std::vector< Point< dim > > &points)
const AdditionalData additional_data
AlignedVector< Point< dim - 1, VectorizedArrayType > > unit_points_faces
unsigned int compute_n_q_points(const unsigned int n_q_points_unvectorized)
MappingInfo(const MappingInfo &)=delete
void reinit_faces(const std::vector< std::pair< CellIteratorType, unsigned int > > &face_iterator_range_interior, const std::vector< Quadrature< dim - 1 > > &quadrature_vector)
UpdateFlags update_flags_mapping
void do_reinit_cells(const ContainerType &cell_iterator_range, const std::vector< QuadratureType > &quadrature_vector, const unsigned int n_unfiltered_cells, const std::function< void(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const QuadratureType &quadrature, MappingData &mapping_data)> &compute_mapping_data)
UpdateFlags get_update_flags_mapping() const
Triangulation< dim, spacedim >::cell_iterator get_cell_iterator(const unsigned int cell_index) const
static void compute_mapping_data_for_immersed_surface_quadrature(const ObserverPointer< const Mapping< dim, spacedim > > &mapping, const UpdateFlags &update_flags_mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ImmersedSurfaceQuadrature< dim > &quadrature, std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > &internal_mapping_data, MappingData &mapping_data)
static void compute_mapping_data_for_face_quadrature(const ObserverPointer< const Mapping< dim, spacedim > > &mapping, const UpdateFlags &update_flags_mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim - 1 > &quadrature, std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > &internal_mapping_data, MappingData &mapping_data)
static void compute_mapping_data_for_quadrature(const ObserverPointer< const Mapping< dim, spacedim > > &mapping, const UpdateFlags &update_flags_mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Quadrature< dim > &quadrature, std::unique_ptr< typename Mapping< dim, spacedim >::InternalDataBase > &internal_mapping_data, MappingData &mapping_data)
static UpdateFlags required_update_flags(const ObserverPointer< const Mapping< dim, spacedim > > &mapping, const UpdateFlags &update_flags)
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
const std::vector< double > & get_weights() const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_covariant_transformation
Covariant transformation.
@ update_jacobians
Volume element.
@ update_inverse_jacobians
Volume element.
@ update_gradients
Shape function gradients.
@ update_quadrature_points
Transformed quadrature points.
@ update_default
No update.
std::vector< index_type > data
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
::internal::MatrixFreeFunctions::GeometryType compute_geometry_type(const double diameter, const std::vector< DerivativeForm< 1, spacedim, dim, double > > &inverse_jacobians)
constexpr unsigned int invalid_unsigned_int
constexpr types::geometric_orientation default_geometric_orientation
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
ComparisonResult compare(const std::vector< T > &v1, const std::vector< T > &v2) const
AdditionalData(const bool use_global_weights=false, const bool store_cells=false)
static constexpr std::size_t width()
static value_type & get(value_type &value, unsigned int c)