16 #include <deal.II/base/logstream.h> 17 #include <deal.II/base/qprojector.h> 18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/quadrature_lib.h> 20 #include <deal.II/base/std_cxx14/memory.h> 21 #include <deal.II/base/utilities.h> 23 #include <deal.II/dofs/dof_accessor.h> 25 #include <deal.II/fe/fe_nedelec.h> 26 #include <deal.II/fe/fe_nothing.h> 27 #include <deal.II/fe/fe_tools.h> 28 #include <deal.II/fe/fe_values.h> 29 #include <deal.II/fe/mapping.h> 31 #include <deal.II/grid/tria.h> 32 #include <deal.II/grid/tria_iterator.h> 34 #include <deal.II/lac/full_matrix.h> 35 #include <deal.II/lac/vector.h> 45 DEAL_II_NAMESPACE_OPEN
56 get_embedding_computation_tolerance(
const unsigned int p)
63 return 1.e-15 * std::exp(std::pow(p, 1.075));
80 std::vector<bool>(dim, true)))
107 deallog <<
"Face Embedding" << std::endl;
111 for (
unsigned int i = 0; i < GeometryInfo<dim>::max_children_per_face; ++i)
114 FETools::compute_face_embedding_matrices<dim, double>(
119 internal::FE_Nedelec::get_embedding_computation_tolerance(order));
134 for (
unsigned int i = 0; i < GeometryInfo<2>::max_children_per_face;
139 face_embeddings[i](j, k);
150 unsigned int target_row = 0;
152 for (
unsigned int i = 0; i < 2; ++i)
153 for (
unsigned int j = this->
degree; j < 2 * this->
degree;
157 face_embeddings[2 * i](j, k);
159 for (
unsigned int i = 0; i < 2; ++i)
160 for (
unsigned int j = 3 * this->degree;
161 j < GeometryInfo<3>::lines_per_face * this->
degree;
165 face_embeddings[i](j, k);
167 for (
unsigned int i = 0; i < 2; ++i)
168 for (
unsigned int j = 0; j < 2; ++j)
169 for (
unsigned int k = i * this->degree;
170 k < (i + 1) * this->degree;
174 face_embeddings[i + 2 * j](k, l);
176 for (
unsigned int i = 0; i < 2; ++i)
177 for (
unsigned int j = 0; j < 2; ++j)
178 for (
unsigned int k = (i + 2) * this->
degree;
179 k < (i + 3) * this->degree;
183 face_embeddings[2 * i + j](k, l);
185 for (
unsigned int i = 0; i < GeometryInfo<3>::max_children_per_face;
187 for (
unsigned int j =
193 face_embeddings[i](j, k);
216 std::ostringstream namebuf;
217 namebuf <<
"FE_Nedelec<" << dim <<
">(" << this->
degree - 1 <<
")";
219 return namebuf.str();
224 std::unique_ptr<FiniteElement<dim, dim>>
227 return std_cxx14::make_unique<FE_Nedelec<dim>>(*this);
258 const std::vector<Polynomials::Polynomial<double>> &lobatto_polynomials =
260 std::vector<Polynomials::Polynomial<double>> lobatto_polynomials_grad(order +
263 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size(); ++i)
264 lobatto_polynomials_grad[i] = lobatto_polynomials[i + 1].derivative();
268 const QGauss<dim - 1> reference_edge_quadrature(order + 1);
269 const unsigned int n_edge_points = reference_edge_quadrature.size();
270 const unsigned int n_boundary_points =
278 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
280 reference_edge_quadrature.point(q_point);
288 const unsigned int &n_interior_points = quadrature.
size();
294 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
296 for (
unsigned int line = 0; line < GeometryInfo<dim>::lines_per_cell;
300 line,
true,
false,
false, n_edge_points) +
303 for (
unsigned int i = 0; i < order; ++i)
305 reference_edge_quadrature.weight(q_point) *
306 lobatto_polynomials_grad[i + 1].value(
310 for (
unsigned int q_point = 0; q_point < n_interior_points; ++q_point)
312 quadrature.
point(q_point);
321 for (
unsigned int line = 0; line < GeometryInfo<dim>::lines_per_cell;
323 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
326 line,
true,
false,
false, n_edge_points) +
340 const std::vector<Polynomials::Polynomial<double>> &lobatto_polynomials =
342 std::vector<Polynomials::Polynomial<double>> lobatto_polynomials_grad(order +
345 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size(); ++i)
346 lobatto_polynomials_grad[i] = lobatto_polynomials[i + 1].derivative();
350 const QGauss<1> reference_edge_quadrature(order + 1);
351 const unsigned int & n_edge_points = reference_edge_quadrature.
size();
360 const QGauss<dim - 1> reference_face_quadrature(order + 1);
361 const unsigned int & n_face_points = reference_face_quadrature.size();
362 const unsigned int n_boundary_points =
366 const unsigned int &n_interior_points = quadrature.
size();
369 2 * (order + 1) * order);
376 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
378 for (
unsigned int line = 0;
383 edge_quadrature.point(
385 line,
true,
false,
false, n_edge_points) +
388 for (
unsigned int i = 0; i < 2; ++i)
389 for (
unsigned int j = 0; j < 2; ++j)
392 (i + 4 * j) * n_edge_points] =
402 for (
unsigned int i = 0; i < order; ++i)
404 reference_edge_quadrature.
weight(q_point) *
405 lobatto_polynomials_grad[i + 1].value(
410 for (
unsigned int q_point = 0; q_point < n_face_points; ++q_point)
413 reference_face_quadrature.point(q_point);
415 for (
unsigned int i = 0; i <= order; ++i)
416 for (
unsigned int j = 0; j < order; ++j)
419 reference_face_quadrature.weight(q_point) *
420 lobatto_polynomials_grad[i].value(
424 lobatto_polynomials[j + 2].value(
429 2 * (i * order + j) + 1) =
430 reference_face_quadrature.weight(q_point) *
431 lobatto_polynomials_grad[i].value(
435 lobatto_polynomials[j + 2].value(
445 for (
unsigned int face = 0; face < GeometryInfo<dim>::faces_per_cell;
447 for (
unsigned int q_point = 0; q_point < n_face_points; ++q_point)
453 face,
true,
false,
false, n_face_points) +
458 for (
unsigned int q_point = 0; q_point < n_interior_points; ++q_point)
460 quadrature.
point(q_point);
469 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
471 for (
unsigned int line = 0;
476 edge_quadrature.point(
478 line,
true,
false,
false, n_edge_points) +
481 for (
unsigned int i = 0; i < 2; ++i)
482 for (
unsigned int j = 0; j < 2; ++j)
485 (i + 4 * j) * n_edge_points] =
507 for (
unsigned int i = 0; i < GeometryInfo<1>::max_children_per_cell; ++i)
525 const std::vector<Point<1>> &edge_quadrature_points =
527 const unsigned int &n_edge_quadrature_points = edge_quadrature.
size();
539 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
542 const double weight = 2.0 * edge_quadrature.
weight(q_point);
544 if (edge_quadrature_points[q_point](0) < 0.5)
547 0.0, 2.0 * edge_quadrature_points[q_point](0));
552 quadrature_point(0) = 1.0;
556 quadrature_point(0) = quadrature_point(1);
557 quadrature_point(1) = 0.0;
561 quadrature_point(1) = 1.0;
570 0.0, 2.0 * edge_quadrature_points[q_point](0) - 1.0);
575 quadrature_point(0) = 1.0;
579 quadrature_point(0) = quadrature_point(1);
580 quadrature_point(1) = 0.0;
584 quadrature_point(1) = 1.0;
597 const unsigned int deg = this->
degree - 1;
598 const std::vector<Polynomials::Polynomial<double>>
599 &legendre_polynomials =
605 n_edge_quadrature_points);
607 for (
unsigned int q_point = 0;
608 q_point < n_edge_quadrature_points;
611 const double weight =
612 std::sqrt(edge_quadrature.
weight(q_point));
614 for (
unsigned int i = 0; i < deg; ++i)
615 assembling_matrix(i, q_point) =
616 weight * legendre_polynomials[i + 1].value(
617 edge_quadrature_points[q_point](0));
622 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
623 system_matrix_inv.
invert(system_matrix);
631 for (
unsigned int i = 0; i < 2; ++i)
635 for (
unsigned int q_point = 0;
636 q_point < n_edge_quadrature_points;
639 const double weight = edge_quadrature.
weight(q_point);
641 i, edge_quadrature_points[q_point](0));
643 edge_quadrature_points[q_point](0), i);
645 if (edge_quadrature_points[q_point](0) < 0.5)
648 i, 2.0 * edge_quadrature_points[q_point](0));
653 dof, quadrature_point_2, 1) -
667 2.0 * edge_quadrature_points[q_point](0), i);
671 dof, quadrature_point_2, 0) -
672 this->restriction[index][2 * i]((i + 2) *
681 this->restriction[index][2 * i + 1](
682 (i + 2) * this->degree, dof) *
684 (i + 2) * this->degree, quadrature_point_1, 0);
699 2.0 * edge_quadrature_points[q_point](0) - 1.0);
704 dof, quadrature_point_2, 1) -
705 this->restriction[index][i + 2](i * this->
degree,
712 this->restriction[index][2 * i]((i + 2) *
716 (i + 2) * this->degree, quadrature_point_1, 0);
718 2.0 * edge_quadrature_points[q_point](0) - 1.0,
723 dof, quadrature_point_2, 0) -
724 this->restriction[index][2 * i + 1](
725 (i + 2) * this->degree, dof) *
732 for (
unsigned int j = 0; j < this->
degree - 1; ++j)
735 legendre_polynomials[j + 1].value(
736 edge_quadrature_points[q_point](0));
738 for (
unsigned int k = 0; k < tmp.
size(); ++k)
739 system_rhs(j, k) += tmp(k) * L_j;
743 system_matrix_inv.
mmult(solution, system_rhs);
745 for (
unsigned int j = 0; j < this->
degree - 1; ++j)
746 for (
unsigned int k = 0; k < 2; ++k)
748 if (std::abs(solution(j, k)) > 1e-14)
750 i * this->degree + j + 1, dof) = solution(j, k);
752 if (std::abs(solution(j, k + 2)) > 1e-14)
754 (i + 2) * this->degree + j + 1, dof) =
760 const std::vector<Point<dim>> &quadrature_points =
762 const std::vector<Polynomials::Polynomial<double>>
763 &lobatto_polynomials =
765 const unsigned int n_boundary_dofs =
767 const unsigned int &n_quadrature_points = quadrature.
size();
772 n_quadrature_points);
774 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
777 const double weight = std::sqrt(quadrature.
weight(q_point));
779 for (
unsigned int i = 0; i < this->
degree; ++i)
782 weight * legendre_polynomials[i].value(
783 quadrature_points[q_point](0));
785 for (
unsigned int j = 0; j < this->degree - 1; ++j)
786 assembling_matrix(i * (this->degree - 1) + j,
788 L_i * lobatto_polynomials[j + 2].value(
789 quadrature_points[q_point](1));
794 assembling_matrix.
m());
796 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
797 system_matrix_inv.
reinit(system_matrix.m(), system_matrix.m());
798 system_matrix_inv.
invert(system_matrix);
801 solution.
reinit(system_matrix_inv.
m(), 8);
802 system_rhs.
reinit(system_matrix_inv.
m(), 8);
809 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
814 if (quadrature_points[q_point](0) < 0.5)
816 if (quadrature_points[q_point](1) < 0.5)
819 2.0 * quadrature_points[q_point](0),
820 2.0 * quadrature_points[q_point](1));
823 dof, quadrature_point, 0);
825 dof, quadrature_point, 1);
831 2.0 * quadrature_points[q_point](0),
832 2.0 * quadrature_points[q_point](1) - 1.0);
835 dof, quadrature_point, 0);
837 dof, quadrature_point, 1);
841 else if (quadrature_points[q_point](1) < 0.5)
844 2.0 * quadrature_points[q_point](0) - 1.0,
845 2.0 * quadrature_points[q_point](1));
860 2.0 * quadrature_points[q_point](0) - 1.0,
861 2.0 * quadrature_points[q_point](1) - 1.0);
873 for (
unsigned int i = 0; i < 2; ++i)
874 for (
unsigned int j = 0; j < this->
degree; ++j)
880 j + 2 * this->degree,
881 quadrature_points[q_point],
887 i * this->degree + j,
888 quadrature_points[q_point],
890 tmp(2 * (i + 2)) -= this->
restriction[index][i + 2](
891 j + 3 * this->
degree, dof) *
893 j + 3 * this->degree,
894 quadrature_points[q_point],
897 i * this->degree + j, dof) *
899 i * this->degree + j,
900 quadrature_points[q_point],
904 tmp *= quadrature.
weight(q_point);
906 for (
unsigned int i = 0; i < this->
degree; ++i)
908 const double L_i_0 = legendre_polynomials[i].value(
909 quadrature_points[q_point](0));
910 const double L_i_1 = legendre_polynomials[i].value(
911 quadrature_points[q_point](1));
913 for (
unsigned int j = 0; j < this->degree - 1; ++j)
916 L_i_0 * lobatto_polynomials[j + 2].value(
917 quadrature_points[q_point](1));
919 L_i_1 * lobatto_polynomials[j + 2].value(
920 quadrature_points[q_point](0));
922 for (
unsigned int k = 0; k < 4; ++k)
924 system_rhs(i * (this->degree - 1) + j,
925 2 * k) += tmp(2 * k) * l_j_0;
926 system_rhs(i * (this->degree - 1) + j,
928 tmp(2 * k + 1) * l_j_1;
934 system_matrix_inv.
mmult(solution, system_rhs);
936 for (
unsigned int i = 0; i < this->
degree; ++i)
937 for (
unsigned int j = 0; j < this->degree - 1; ++j)
938 for (
unsigned int k = 0; k < 4; ++k)
940 if (std::abs(solution(i * (this->degree - 1) + j,
942 this->
restriction[index][k](i * (this->degree - 1) +
945 solution(i * (this->degree - 1) + j, 2 * k);
947 if (std::abs(solution(i * (this->degree - 1) + j,
950 i + (this->degree - 1 + j) * this->degree +
953 solution(i * (this->degree - 1) + j, 2 * k + 1);
968 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
971 const double weight = 2.0 * edge_quadrature.
weight(q_point);
973 if (edge_quadrature_points[q_point](0) < 0.5)
974 for (
unsigned int i = 0; i < 2; ++i)
975 for (
unsigned int j = 0; j < 2; ++j)
978 i, 2.0 * edge_quadrature_points[q_point](0), j);
986 Point<dim>(2.0 * edge_quadrature_points[q_point](0),
990 (i + 4 * j + 2) * this->
degree, dof) +=
996 2.0 * edge_quadrature_points[q_point](0));
997 this->
restriction[index][i + 2 * j]((i + 2 * (j + 4)) *
1005 for (
unsigned int i = 0; i < 2; ++i)
1006 for (
unsigned int j = 0; j < 2; ++j)
1009 i, 2.0 * edge_quadrature_points[q_point](0) - 1.0, j);
1011 this->
restriction[index][i + 4 * j + 2]((i + 4 * j) *
1017 2.0 * edge_quadrature_points[q_point](0) - 1.0, i, j);
1019 (i + 4 * j + 2) * this->
degree, dof) +=
1023 i, j, 2.0 * edge_quadrature_points[q_point](0) - 1.0);
1025 (i + 2 * (j + 4)) * this->
degree, dof) +=
1037 const unsigned int deg = this->
degree - 1;
1038 const std::vector<Polynomials::Polynomial<double>>
1039 &legendre_polynomials =
1045 n_edge_quadrature_points);
1047 for (
unsigned int q_point = 0;
1048 q_point < n_edge_quadrature_points;
1051 const double weight =
1052 std::sqrt(edge_quadrature.
weight(q_point));
1054 for (
unsigned int i = 0; i < deg; ++i)
1055 assembling_matrix(i, q_point) =
1056 weight * legendre_polynomials[i + 1].value(
1057 edge_quadrature_points[q_point](0));
1062 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
1063 system_matrix_inv.
invert(system_matrix);
1070 for (
unsigned int i = 0; i < 2; ++i)
1071 for (
unsigned int j = 0; j < 2; ++j)
1072 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1076 for (
unsigned int q_point = 0;
1077 q_point < n_edge_quadrature_points;
1080 const double weight = edge_quadrature.
weight(q_point);
1082 i, edge_quadrature_points[q_point](0), j);
1084 edge_quadrature_points[q_point](0), i, j);
1086 i, j, edge_quadrature_points[q_point](0));
1088 if (edge_quadrature_points[q_point](0) < 0.5)
1091 i, 2.0 * edge_quadrature_points[q_point](0), j);
1095 dof, quadrature_point_3, 1) -
1097 (i + 4 * j) * this->
degree, dof) *
1099 (i + 4 * j) * this->
degree,
1105 (i + 4 * j) * this->degree, dof) *
1111 2.0 * edge_quadrature_points[q_point](0), i, j);
1115 dof, quadrature_point_3, 0) -
1117 (i + 4 * j + 2) * this->
degree, dof) *
1119 (i + 4 * j + 2) * this->
degree,
1125 (i + 4 * j + 2) * this->
degree, dof) *
1131 i, j, 2.0 * edge_quadrature_points[q_point](0));
1135 dof, quadrature_point_3, 2) -
1137 (i + 2 * (j + 4)) * this->
degree, dof) *
1139 (i + 2 * (j + 4)) * this->degree,
1145 (i + 2 * (j + 4)) * this->
degree, dof) *
1157 (i + 4 * j) * this->
degree, dof) *
1165 2.0 * edge_quadrature_points[q_point](0) - 1.0,
1170 dof, quadrature_point_3, 1) -
1172 (i + 4 * j) * this->degree, dof) *
1174 (i + 4 * j) * this->degree,
1180 (i + 4 * j + 2) * this->
degree, dof) *
1186 2.0 * edge_quadrature_points[q_point](0) - 1.0,
1192 dof, quadrature_point_3, 0) -
1194 (i + 4 * j + 2) * this->
degree, dof) *
1196 (i + 4 * j + 2) * this->
degree,
1202 (i + 2 * (j + 4)) * this->
degree, dof) *
1210 2.0 * edge_quadrature_points[q_point](0) - 1.0);
1214 dof, quadrature_point_3, 2) -
1215 this->restriction[index][i + 2 * (j + 2)](
1216 (i + 2 * (j + 4)) * this->
degree, dof) *
1218 (i + 2 * (j + 4)) * this->
degree,
1223 for (
unsigned int k = 0; k < deg; ++k)
1226 legendre_polynomials[k + 1].value(
1227 edge_quadrature_points[q_point](0));
1229 for (
unsigned int l = 0; l < tmp.
size(); ++l)
1230 system_rhs(k, l) += tmp(l) * L_k;
1234 system_matrix_inv.
mmult(solution, system_rhs);
1236 for (
unsigned int k = 0; k < 2; ++k)
1237 for (
unsigned int l = 0; l < deg; ++l)
1239 if (std::abs(solution(l, k)) > 1e-14)
1241 (i + 4 * j) * this->
degree + l + 1, dof) =
1244 if (std::abs(solution(l, k + 2)) > 1e-14)
1246 (i + 4 * j + 2) * this->
degree + l + 1, dof) =
1249 if (std::abs(solution(l, k + 4)) > 1e-14)
1251 (i + 2 * (j + 4)) * this->
degree + l + 1, dof) =
1257 const std::vector<Point<2>> &face_quadrature_points =
1259 const std::vector<Polynomials::Polynomial<double>>
1260 &lobatto_polynomials =
1262 const unsigned int n_edge_dofs =
1264 const unsigned int &n_face_quadrature_points =
1265 face_quadrature.
size();
1269 n_face_quadrature_points);
1271 for (
unsigned int q_point = 0;
1272 q_point < n_face_quadrature_points;
1275 const double weight =
1276 std::sqrt(face_quadrature.
weight(q_point));
1278 for (
unsigned int i = 0; i <= deg; ++i)
1281 weight * legendre_polynomials[i].value(
1282 face_quadrature_points[q_point](0));
1284 for (
unsigned int j = 0; j < deg; ++j)
1285 assembling_matrix(i * deg + j, q_point) =
1286 L_i * lobatto_polynomials[j + 2].value(
1287 face_quadrature_points[q_point](1));
1292 assembling_matrix.
m());
1294 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
1295 system_matrix_inv.
reinit(system_matrix.m(), system_matrix.m());
1296 system_matrix_inv.
invert(system_matrix);
1299 solution.
reinit(system_matrix_inv.
m(), 24);
1300 system_rhs.
reinit(system_matrix_inv.
m(), 24);
1303 for (
unsigned int i = 0; i < 2; ++i)
1304 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1308 for (
unsigned int q_point = 0;
1309 q_point < n_face_quadrature_points;
1314 if (face_quadrature_points[q_point](0) < 0.5)
1316 if (face_quadrature_points[q_point](1) < 0.5)
1320 2.0 * face_quadrature_points[q_point](0),
1321 2.0 * face_quadrature_points[q_point](1));
1324 dof, quadrature_point_0, 1);
1326 dof, quadrature_point_0, 2);
1328 2.0 * face_quadrature_points[q_point](0),
1330 2.0 * face_quadrature_points[q_point](1));
1332 dof, quadrature_point_0, 2);
1334 dof, quadrature_point_0, 0);
1336 2.0 * face_quadrature_points[q_point](0),
1337 2.0 * face_quadrature_points[q_point](1),
1340 dof, quadrature_point_0, 0);
1342 dof, quadrature_point_0, 1);
1349 2.0 * face_quadrature_points[q_point](0),
1350 2.0 * face_quadrature_points[q_point](1) -
1354 dof, quadrature_point_0, 1);
1356 dof, quadrature_point_0, 2);
1358 2.0 * face_quadrature_points[q_point](0),
1360 2.0 * face_quadrature_points[q_point](1) -
1363 dof, quadrature_point_0, 2);
1365 dof, quadrature_point_0, 0);
1367 2.0 * face_quadrature_points[q_point](0),
1368 2.0 * face_quadrature_points[q_point](1) -
1372 dof, quadrature_point_0, 0);
1374 dof, quadrature_point_0, 1);
1378 else if (face_quadrature_points[q_point](1) < 0.5)
1382 2.0 * face_quadrature_points[q_point](0) - 1.0,
1383 2.0 * face_quadrature_points[q_point](1));
1386 dof, quadrature_point_0, 1);
1388 dof, quadrature_point_0, 2);
1390 2.0 * face_quadrature_points[q_point](0) - 1.0,
1392 2.0 * face_quadrature_points[q_point](1));
1394 dof, quadrature_point_0, 2);
1396 dof, quadrature_point_0, 0);
1398 2.0 * face_quadrature_points[q_point](0) - 1.0,
1399 2.0 * face_quadrature_points[q_point](1),
1402 dof, quadrature_point_0, 0);
1404 dof, quadrature_point_0, 1);
1411 2.0 * face_quadrature_points[q_point](0) - 1.0,
1412 2.0 * face_quadrature_points[q_point](1) - 1.0);
1415 dof, quadrature_point_0, 1);
1417 dof, quadrature_point_0, 2);
1419 2.0 * face_quadrature_points[q_point](0) - 1.0,
1421 2.0 * face_quadrature_points[q_point](1) - 1.0);
1423 dof, quadrature_point_0, 2);
1425 dof, quadrature_point_0, 0);
1427 2.0 * face_quadrature_points[q_point](0) - 1.0,
1428 2.0 * face_quadrature_points[q_point](1) - 1.0,
1431 dof, quadrature_point_0, 0);
1433 dof, quadrature_point_0, 1);
1438 face_quadrature_points[q_point](0),
1439 face_quadrature_points[q_point](1));
1441 face_quadrature_points[q_point](0),
1443 face_quadrature_points[q_point](1));
1445 face_quadrature_points[q_point](0),
1446 face_quadrature_points[q_point](1),
1449 for (
unsigned int j = 0; j < 2; ++j)
1450 for (
unsigned int k = 0; k < 2; ++k)
1451 for (
unsigned int l = 0; l <= deg; ++l)
1453 tmp(2 * (j + 2 * k)) -=
1455 (i + 4 * j) * this->degree + l, dof) *
1457 (i + 4 * j) * this->degree + l,
1460 tmp(2 * (j + 2 * k) + 1) -=
1462 (i + 2 * (k + 4)) * this->degree + l, dof) *
1464 (i + 2 * (k + 4)) * this->degree + l,
1467 tmp(2 * (j + 2 * (k + 2))) -=
1469 (2 * (i + 4) + k) * this->degree + l, dof) *
1471 (2 * (i + 4) + k) * this->degree + l,
1474 tmp(2 * (j + 2 * k) + 9) -=
1476 (i + 4 * j + 2) * this->degree + l, dof) *
1478 (i + 4 * j + 2) * this->degree + l,
1481 tmp(2 * (j + 2 * (k + 4))) -=
1483 (4 * i + j + 2) * this->degree + l, dof) *
1485 (4 * i + j + 2) * this->degree + l,
1488 tmp(2 * (j + 2 * k) + 17) -=
1490 (4 * i + k) * this->degree + l, dof) *
1492 (4 * i + k) * this->degree + l,
1497 tmp *= face_quadrature.
weight(q_point);
1499 for (
unsigned int j = 0; j <= deg; ++j)
1501 const double L_j_0 = legendre_polynomials[j].value(
1502 face_quadrature_points[q_point](0));
1503 const double L_j_1 = legendre_polynomials[j].value(
1504 face_quadrature_points[q_point](1));
1506 for (
unsigned int k = 0; k < deg; ++k)
1508 const double l_k_0 =
1509 L_j_0 * lobatto_polynomials[k + 2].value(
1510 face_quadrature_points[q_point](1));
1511 const double l_k_1 =
1512 L_j_1 * lobatto_polynomials[k + 2].value(
1513 face_quadrature_points[q_point](0));
1515 for (
unsigned int l = 0; l < 4; ++l)
1517 system_rhs(j * deg + k, 2 * l) +=
1519 system_rhs(j * deg + k, 2 * l + 1) +=
1520 tmp(2 * l + 1) * l_k_1;
1521 system_rhs(j * deg + k, 2 * (l + 4)) +=
1522 tmp(2 * (l + 4)) * l_k_1;
1523 system_rhs(j * deg + k, 2 * l + 9) +=
1524 tmp(2 * l + 9) * l_k_0;
1525 system_rhs(j * deg + k, 2 * (l + 8)) +=
1526 tmp(2 * (l + 8)) * l_k_0;
1527 system_rhs(j * deg + k, 2 * l + 17) +=
1528 tmp(2 * l + 17) * l_k_1;
1534 system_matrix_inv.
mmult(solution, system_rhs);
1536 for (
unsigned int j = 0; j < 2; ++j)
1537 for (
unsigned int k = 0; k < 2; ++k)
1538 for (
unsigned int l = 0; l <= deg; ++l)
1539 for (
unsigned int m = 0; m < deg; ++m)
1541 if (std::abs(solution(l * deg + m,
1542 2 * (j + 2 * k))) > 1e-14)
1544 (2 * i * this->degree + l) * deg + m +
1546 dof) = solution(l * deg + m, 2 * (j + 2 * k));
1548 if (std::abs(solution(l * deg + m,
1549 2 * (j + 2 * k) + 1)) >
1552 ((2 * i + 1) * deg + m) * this->degree + l +
1555 solution(l * deg + m, 2 * (j + 2 * k) + 1);
1557 if (std::abs(solution(l * deg + m,
1558 2 * (j + 2 * (k + 2)))) >
1561 (2 * (i + 2) * this->degree + l) * deg + m +
1564 solution(l * deg + m, 2 * (j + 2 * (k + 2)));
1566 if (std::abs(solution(l * deg + m,
1567 2 * (j + 2 * k) + 9)) >
1570 ((2 * i + 5) * deg + m) * this->degree + l +
1573 solution(l * deg + m, 2 * (j + 2 * k) + 9);
1575 if (std::abs(solution(l * deg + m,
1576 2 * (j + 2 * (k + 4)))) >
1579 (2 * (i + 4) * this->degree + l) * deg + m +
1582 solution(l * deg + m, 2 * (j + 2 * (k + 4)));
1584 if (std::abs(solution(l * deg + m,
1585 2 * (j + 2 * k) + 17)) >
1588 ((2 * i + 9) * deg + m) * this->degree + l +
1591 solution(l * deg + m, 2 * (j + 2 * k) + 17);
1596 const std::vector<Point<dim>> &quadrature_points =
1597 quadrature.get_points();
1598 const unsigned int n_boundary_dofs =
1601 const unsigned int &n_quadrature_points = quadrature.size();
1605 n_quadrature_points);
1607 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1610 const double weight = std::sqrt(quadrature.weight(q_point));
1612 for (
unsigned int i = 0; i <= deg; ++i)
1615 weight * legendre_polynomials[i].value(
1616 quadrature_points[q_point](0));
1618 for (
unsigned int j = 0; j < deg; ++j)
1621 L_i * lobatto_polynomials[j + 2].value(
1622 quadrature_points[q_point](1));
1624 for (
unsigned int k = 0; k < deg; ++k)
1625 assembling_matrix((i * deg + j) * deg + k,
1627 l_j * lobatto_polynomials[k + 2].value(
1628 quadrature_points[q_point](2));
1634 assembling_matrix.
m());
1636 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
1637 system_matrix_inv.
reinit(system_matrix.m(), system_matrix.m());
1638 system_matrix_inv.
invert(system_matrix);
1641 solution.
reinit(system_matrix_inv.
m(), 24);
1642 system_rhs.
reinit(system_matrix_inv.
m(), 24);
1645 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1649 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1654 if (quadrature_points[q_point](0) < 0.5)
1656 if (quadrature_points[q_point](1) < 0.5)
1658 if (quadrature_points[q_point](2) < 0.5)
1661 2.0 * quadrature_points[q_point](0),
1662 2.0 * quadrature_points[q_point](1),
1663 2.0 * quadrature_points[q_point](2));
1666 dof, quadrature_point, 0);
1668 dof, quadrature_point, 1);
1670 dof, quadrature_point, 2);
1676 2.0 * quadrature_points[q_point](0),
1677 2.0 * quadrature_points[q_point](1),
1678 2.0 * quadrature_points[q_point](2) - 1.0);
1681 dof, quadrature_point, 0);
1683 dof, quadrature_point, 1);
1685 dof, quadrature_point, 2);
1689 else if (quadrature_points[q_point](2) < 0.5)
1692 2.0 * quadrature_points[q_point](0),
1693 2.0 * quadrature_points[q_point](1) - 1.0,
1694 2.0 * quadrature_points[q_point](2));
1697 dof, quadrature_point, 0);
1699 dof, quadrature_point, 1);
1701 dof, quadrature_point, 2);
1707 2.0 * quadrature_points[q_point](0),
1708 2.0 * quadrature_points[q_point](1) - 1.0,
1709 2.0 * quadrature_points[q_point](2) - 1.0);
1712 dof, quadrature_point, 0);
1714 dof, quadrature_point, 1);
1716 dof, quadrature_point, 2);
1720 else if (quadrature_points[q_point](1) < 0.5)
1722 if (quadrature_points[q_point](2) < 0.5)
1725 2.0 * quadrature_points[q_point](0) - 1.0,
1726 2.0 * quadrature_points[q_point](1),
1727 2.0 * quadrature_points[q_point](2));
1730 dof, quadrature_point, 0);
1732 dof, quadrature_point, 1);
1734 dof, quadrature_point, 2);
1740 2.0 * quadrature_points[q_point](0) - 1.0,
1741 2.0 * quadrature_points[q_point](1),
1742 2.0 * quadrature_points[q_point](2) - 1.0);
1745 dof, quadrature_point, 0);
1747 dof, quadrature_point, 1);
1749 dof, quadrature_point, 2);
1753 else if (quadrature_points[q_point](2) < 0.5)
1756 2.0 * quadrature_points[q_point](0) - 1.0,
1757 2.0 * quadrature_points[q_point](1) - 1.0,
1758 2.0 * quadrature_points[q_point](2));
1777 2.0 * quadrature_points[q_point](0) - 1.0,
1778 2.0 * quadrature_points[q_point](1) - 1.0,
1779 2.0 * quadrature_points[q_point](2) - 1.0);
1795 for (
unsigned int i = 0; i < 2; ++i)
1796 for (
unsigned int j = 0; j < 2; ++j)
1797 for (
unsigned int k = 0; k < 2; ++k)
1798 for (
unsigned int l = 0; l <= deg; ++l)
1800 tmp(3 * (i + 2 * (j + 2 * k))) -=
1802 (4 * i + j + 2) * this->degree + l, dof) *
1804 (4 * i + j + 2) * this->degree + l,
1805 quadrature_points[q_point],
1807 tmp(3 * (i + 2 * (j + 2 * k)) + 1) -=
1809 (4 * i + k) * this->degree + l, dof) *
1811 (4 * i + k) * this->degree + l,
1812 quadrature_points[q_point],
1814 tmp(3 * (i + 2 * (j + 2 * k)) + 2) -=
1816 (2 * (j + 4) + k) * this->degree + l, dof) *
1818 (2 * (j + 4) + k) * this->degree + l,
1819 quadrature_points[q_point],
1822 for (
unsigned int m = 0; m < deg; ++m)
1824 tmp(3 * (i + 2 * (j + 2 * k))) -=
1827 ((2 * j + 5) * deg + m) * this->degree +
1831 ((2 * j + 5) * deg + m) * this->degree +
1833 quadrature_points[q_point],
1835 tmp(3 * (i + 2 * (j + 2 * k))) -=
1838 (2 * (i + 4) * this->degree + l) * deg +
1842 (2 * (i + 4) * this->degree + l) * deg +
1844 quadrature_points[q_point],
1846 tmp(3 * (i + 2 * (j + 2 * k)) + 1) -=
1849 (2 * k * this->degree + l) * deg + m +
1853 (2 * k * this->degree + l) * deg + m +
1855 quadrature_points[q_point],
1857 tmp(3 * (i + 2 * (j + 2 * k)) + 1) -=
1860 ((2 * i + 9) * deg + m) * this->degree +
1864 ((2 * i + 9) * deg + m) * this->degree +
1866 quadrature_points[q_point],
1868 tmp(3 * (i + 2 * (j + 2 * k)) + 2) -=
1871 ((2 * k + 1) * deg + m) * this->degree +
1875 ((2 * k + 1) * deg + m) * this->degree +
1877 quadrature_points[q_point],
1879 tmp(3 * (i + 2 * (j + 2 * k)) + 2) -=
1882 (2 * (j + 2) * this->degree + l) * deg +
1886 (2 * (j + 2) * this->degree + l) * deg +
1888 quadrature_points[q_point],
1893 tmp *= quadrature.weight(q_point);
1895 for (
unsigned int i = 0; i <= deg; ++i)
1897 const double L_i_0 = legendre_polynomials[i].value(
1898 quadrature_points[q_point](0));
1899 const double L_i_1 = legendre_polynomials[i].value(
1900 quadrature_points[q_point](1));
1901 const double L_i_2 = legendre_polynomials[i].value(
1902 quadrature_points[q_point](2));
1904 for (
unsigned int j = 0; j < deg; ++j)
1906 const double l_j_0 =
1907 L_i_0 * lobatto_polynomials[j + 2].value(
1908 quadrature_points[q_point](1));
1909 const double l_j_1 =
1910 L_i_1 * lobatto_polynomials[j + 2].value(
1911 quadrature_points[q_point](0));
1912 const double l_j_2 =
1913 L_i_2 * lobatto_polynomials[j + 2].value(
1914 quadrature_points[q_point](0));
1916 for (
unsigned int k = 0; k < deg; ++k)
1918 const double l_k_0 =
1919 l_j_0 * lobatto_polynomials[k + 2].value(
1920 quadrature_points[q_point](2));
1921 const double l_k_1 =
1922 l_j_1 * lobatto_polynomials[k + 2].value(
1923 quadrature_points[q_point](2));
1924 const double l_k_2 =
1925 l_j_2 * lobatto_polynomials[k + 2].value(
1926 quadrature_points[q_point](1));
1928 for (
unsigned int l = 0; l < 8; ++l)
1930 system_rhs((i * deg + j) * deg + k,
1931 3 * l) += tmp(3 * l) * l_k_0;
1932 system_rhs((i * deg + j) * deg + k,
1934 tmp(3 * l + 1) * l_k_1;
1935 system_rhs((i * deg + j) * deg + k,
1937 tmp(3 * l + 2) * l_k_2;
1944 system_matrix_inv.
mmult(solution, system_rhs);
1946 for (
unsigned int i = 0; i < 2; ++i)
1947 for (
unsigned int j = 0; j < 2; ++j)
1948 for (
unsigned int k = 0; k < 2; ++k)
1949 for (
unsigned int l = 0; l <= deg; ++l)
1950 for (
unsigned int m = 0; m < deg; ++m)
1951 for (
unsigned int n = 0; n < deg; ++n)
1954 solution((l * deg + m) * deg + n,
1955 3 * (i + 2 * (j + 2 * k)))) >
1958 (l * deg + m) * deg + n + n_boundary_dofs,
1959 dof) = solution((l * deg + m) * deg + n,
1960 3 * (i + 2 * (j + 2 * k)));
1963 solution((l * deg + m) * deg + n,
1964 3 * (i + 2 * (j + 2 * k)) + 1)) >
1967 (l + (m + deg) * this->degree) * deg + n +
1970 solution((l * deg + m) * deg + n,
1971 3 * (i + 2 * (j + 2 * k)) + 1);
1974 solution((l * deg + m) * deg + n,
1975 3 * (i + 2 * (j + 2 * k)) + 2)) >
1979 ((m + 2 * deg) * deg + n) * this->degree +
1982 solution((l * deg + m) * deg + n,
1983 3 * (i + 2 * (j + 2 * k)) + 2);
1999 std::vector<unsigned int>
2002 std::vector<unsigned int> dpo(dim + 1);
2011 dpo[1] = degree + 1;
2012 dpo[2] = 2 * degree * (degree + 1);
2015 dpo[3] = 3 * degree * degree * (degree + 1);
2037 const unsigned int face_index)
const 2044 const unsigned int deg = this->
degree - 1;
2051 if (!((shape_index > deg) && (shape_index < 2 * this->
degree)))
2058 if ((shape_index > deg) &&
2067 if (shape_index < 3 * this->degree)
2074 if (!((shape_index >= 2 * this->degree) &&
2075 (shape_index < 3 * this->degree)))
2092 if (((shape_index > deg) && (shape_index < 2 * this->
degree)) ||
2093 ((shape_index >= 5 * this->degree) &&
2094 (shape_index < 6 * this->degree)) ||
2095 ((shape_index >= 9 * this->degree) &&
2096 (shape_index < 10 * this->degree)) ||
2097 ((shape_index >= 11 * this->degree) &&
2123 if (((shape_index > deg) && (shape_index < 4 * this->degree)) ||
2124 ((shape_index >= 5 * this->degree) &&
2125 (shape_index < 8 * this->degree)) ||
2126 ((shape_index >= 9 * this->degree) &&
2127 (shape_index < 10 * this->degree)) ||
2128 ((shape_index >= 11 * this->degree) &&
2154 if ((shape_index < 3 * this->degree) ||
2155 ((shape_index >= 4 * this->degree) &&
2156 (shape_index < 7 * this->degree)) ||
2157 ((shape_index >= 8 * this->degree) &&
2158 (shape_index < 10 * this->degree)) ||
2182 if ((shape_index < 2 * this->degree) ||
2183 ((shape_index >= 3 * this->degree) &&
2184 (shape_index < 6 * this->degree)) ||
2185 ((shape_index >= 7 * this->degree) &&
2186 (shape_index < 8 * this->degree)) ||
2187 ((shape_index >= 10 * this->degree) &&
2213 if ((shape_index < 4 * this->degree) ||
2214 ((shape_index >= 8 * this->degree) &&
2235 if (((shape_index >= 4 * this->degree) &&
2283 if (this->degree < fe_nedelec_other->
degree)
2285 else if (this->degree == fe_nedelec_other->degree)
2305 if (fe_nothing->is_dominating())
2330 std::vector<std::pair<unsigned int, unsigned int>>
2335 return std::vector<std::pair<unsigned int, unsigned int>>();
2339 std::vector<std::pair<unsigned int, unsigned int>>
2354 std::vector<std::pair<unsigned int, unsigned int>> identities;
2356 for (
unsigned int i = 0;
2357 i < std::min(fe_nedelec_other->degree, this->degree);
2359 identities.emplace_back(i, i);
2370 return std::vector<std::pair<unsigned int, unsigned int>>();
2376 return std::vector<std::pair<unsigned int, unsigned int>>();
2381 std::vector<std::pair<unsigned int, unsigned int>>
2396 const unsigned int p = fe_nedelec_other->degree;
2397 const unsigned int q = this->
degree;
2398 const unsigned int p_min = std::min(p, q);
2399 std::vector<std::pair<unsigned int, unsigned int>> identities;
2401 for (
unsigned int i = 0; i < p_min; ++i)
2402 for (
unsigned int j = 0; j < p_min - 1; ++j)
2404 identities.emplace_back(i * (q - 1) + j, i * (p - 1) + j);
2405 identities.emplace_back(i + (j + q - 1) * q, i + (j + p - 1) * p);
2417 return std::vector<std::pair<unsigned int, unsigned int>>();
2423 return std::vector<std::pair<unsigned int, unsigned int>>();
2469 interpolation_matrix = 0;
2473 for (
unsigned int i = 0; i < this->
degree; ++i)
2474 interpolation_matrix(i, i) = 1.0;
2484 const unsigned int p = source_fe.
degree;
2485 const unsigned int q = this->
degree;
2487 for (
unsigned int i = 0; i < q; ++i)
2489 for (
int j = 1; j < (int)GeometryInfo<dim>::lines_per_face; ++j)
2490 interpolation_matrix(j * p + i, j * q + i) = 1.0;
2492 for (
unsigned int j = 0; j < q - 1; ++j)
2497 i * (q - 1) + j) = 1.0;
2501 (j + q - 1) * q) = 1.0;
2540 const unsigned int subface,
2572 interpolation_matrix = 0.0;
2576 const std::vector<Point<1>> &edge_quadrature_points =
2578 const unsigned int &n_edge_quadrature_points = edge_quadrature.
size();
2584 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2585 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
2589 0.0, 0.5 * (edge_quadrature_points[q_point](0) + subface));
2591 interpolation_matrix(0, dof) +=
2592 0.5 * edge_quadrature.
weight(q_point) *
2596 if (source_fe.
degree > 1)
2598 const std::vector<Polynomials::Polynomial<double>>
2599 &legendre_polynomials =
2607 n_edge_quadrature_points);
2609 for (
unsigned int q_point = 0;
2610 q_point < n_edge_quadrature_points;
2613 const double weight =
2614 std::sqrt(edge_quadrature.
weight(q_point));
2616 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2617 assembling_matrix(i, q_point) =
2618 weight * legendre_polynomials[i + 1].value(
2619 edge_quadrature_points[q_point](0));
2625 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
2626 system_matrix_inv.
invert(system_matrix);
2632 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2636 for (
unsigned int q_point = 0;
2637 q_point < n_edge_quadrature_points;
2642 0.5 * (edge_quadrature_points[q_point](0) + subface));
2644 0.0, edge_quadrature_points[q_point](0));
2646 edge_quadrature.
weight(q_point) *
2650 interpolation_matrix(0, dof) *
2655 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2657 tmp * legendre_polynomials[i + 1].value(
2658 edge_quadrature_points[q_point](0));
2661 system_matrix_inv.
vmult(solution, system_rhs);
2663 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2664 if (std::abs(solution(i)) > 1e-14)
2665 interpolation_matrix(i + 1, dof) = solution(i);
2674 const double shifts[4][2] = {{0.0, 0.0},
2679 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2680 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
2683 const double weight = 0.5 * edge_quadrature.
weight(q_point);
2685 for (
unsigned int i = 0; i < 2; ++i)
2688 0.5 * (i + shifts[subface][0]),
2689 0.5 * (edge_quadrature_points[q_point](0) +
2690 shifts[subface][1]),
2693 interpolation_matrix(i * source_fe.
degree, dof) +=
2698 Point<dim>(0.5 * (edge_quadrature_points[q_point](0) +
2699 shifts[subface][0]),
2700 0.5 * (i + shifts[subface][1]),
2702 interpolation_matrix((i + 2) * source_fe.
degree, dof) +=
2709 if (source_fe.
degree > 1)
2711 const std::vector<Polynomials::Polynomial<double>>
2712 &legendre_polynomials =
2720 n_edge_quadrature_points);
2722 for (
unsigned int q_point = 0;
2723 q_point < n_edge_quadrature_points;
2726 const double weight =
2727 std::sqrt(edge_quadrature.
weight(q_point));
2729 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2730 assembling_matrix(i, q_point) =
2731 weight * legendre_polynomials[i + 1].value(
2732 edge_quadrature_points[q_point](0));
2738 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
2739 system_matrix_inv.
invert(system_matrix);
2748 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2752 for (
unsigned int q_point = 0;
2753 q_point < n_edge_quadrature_points;
2756 const double weight = edge_quadrature.
weight(q_point);
2758 for (
unsigned int i = 0; i < 2; ++i)
2761 0.5 * (i + shifts[subface][0]),
2762 0.5 * (edge_quadrature_points[q_point](0) +
2763 shifts[subface][1]),
2766 i, edge_quadrature_points[q_point](0), 0.0);
2774 interpolation_matrix(i * source_fe.
degree, dof) *
2776 i * source_fe.
degree, quadrature_point_1, 1));
2777 quadrature_point_0 =
2779 (edge_quadrature_points[q_point](0) +
2780 shifts[subface][0]),
2781 0.5 * (i + shifts[subface][1]),
2783 quadrature_point_1 =
2784 Point<dim>(edge_quadrature_points[q_point](0),
2793 interpolation_matrix((i + 2) * source_fe.
degree,
2796 (i + 2) * source_fe.
degree,
2801 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2803 const double L_i = legendre_polynomials[i + 1].value(
2804 edge_quadrature_points[q_point](0));
2806 for (
unsigned int j = 0;
2807 j < GeometryInfo<dim>::lines_per_face;
2809 system_rhs(i, j) += tmp(j) * L_i;
2813 system_matrix_inv.
mmult(solution, system_rhs);
2815 for (
unsigned int i = 0;
2816 i < GeometryInfo<dim>::lines_per_face;
2818 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2819 if (std::abs(solution(j, i)) > 1e-14)
2820 interpolation_matrix(i * source_fe.
degree + j + 1,
2821 dof) = solution(j, i);
2825 const std::vector<Point<2>> &quadrature_points =
2827 const std::vector<Polynomials::Polynomial<double>>
2828 &lobatto_polynomials =
2831 const unsigned int n_boundary_dofs =
2833 const unsigned int &n_quadrature_points = quadrature.
size();
2838 n_quadrature_points);
2840 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
2843 const double weight = std::sqrt(quadrature.
weight(q_point));
2845 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2848 weight * legendre_polynomials[i].value(
2849 quadrature_points[q_point](0));
2851 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2852 assembling_matrix(i * (source_fe.
degree - 1) + j,
2854 L_i * lobatto_polynomials[j + 2].value(
2855 quadrature_points[q_point](1));
2860 assembling_matrix.
m());
2862 assembling_matrix.
mTmult(system_matrix, assembling_matrix);
2863 system_matrix_inv.
reinit(system_matrix.m(), system_matrix.m());
2864 system_matrix_inv.
invert(system_matrix);
2867 solution.
reinit(system_matrix_inv.
m(), 2);
2868 system_rhs.
reinit(system_matrix_inv.
m(), 2);
2871 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2875 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
2880 (quadrature_points[q_point](0) + shifts[subface][0]),
2882 (quadrature_points[q_point](1) + shifts[subface][1]),
2894 quadrature_points[q_point](1),
2897 for (
unsigned int i = 0; i < 2; ++i)
2898 for (
unsigned int j = 0; j < source_fe.
degree; ++j)
2900 tmp(0) -= interpolation_matrix(
2901 (i + 2) * source_fe.
degree + j, dof) *
2903 (i + 2) * source_fe.
degree + j,
2907 interpolation_matrix(i * source_fe.
degree + j,
2910 i * source_fe.
degree + j, quadrature_point, 1);
2913 tmp *= quadrature.
weight(q_point);
2915 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2917 const double L_i_0 = legendre_polynomials[i].value(
2918 quadrature_points[q_point](0));
2919 const double L_i_1 = legendre_polynomials[i].value(
2920 quadrature_points[q_point](1));
2922 for (
unsigned int j = 0; j < source_fe.
degree - 1;
2925 system_rhs(i * (source_fe.
degree - 1) + j, 0) +=
2927 lobatto_polynomials[j + 2].value(
2928 quadrature_points[q_point](1));
2929 system_rhs(i * (source_fe.
degree - 1) + j, 1) +=
2931 lobatto_polynomials[j + 2].value(
2932 quadrature_points[q_point](0));
2937 system_matrix_inv.
mmult(solution, system_rhs);
2939 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2940 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2942 if (std::abs(solution(i * (source_fe.
degree - 1) + j,
2944 interpolation_matrix(i * (source_fe.
degree - 1) + j +
2947 solution(i * (source_fe.
degree - 1) + j, 0);
2949 if (std::abs(solution(i * (source_fe.
degree - 1) + j,
2951 interpolation_matrix(
2954 dof) = solution(i * (source_fe.
degree - 1) + j, 1);
2970 const unsigned int child,
2979 "Prolongation matrices are only available for refined cells!"));
2986 if (this->
prolongation[refinement_case - 1][child].n() == 0)
2991 if (this->
prolongation[refinement_case - 1][child].n() ==
3004 #ifdef DEBUG_NEDELEC 3005 deallog <<
"Embedding" << std::endl;
3013 internal::FE_Nedelec::get_embedding_computation_tolerance(
3015 #ifdef DEBUG_NEDELEC 3016 deallog <<
"Restriction" << std::endl;
3030 const unsigned int child,
3039 "Restriction matrices are only available for refined cells!"));
3048 if (this->
restriction[refinement_case - 1][child].n() == 0)
3053 if (this->
restriction[refinement_case - 1][child].n() ==
3055 return this->
restriction[refinement_case - 1][child];
3066 #ifdef DEBUG_NEDELEC 3067 deallog <<
"Embedding" << std::endl;
3075 internal::FE_Nedelec::get_embedding_computation_tolerance(
3077 #ifdef DEBUG_NEDELEC 3078 deallog <<
"Restriction" << std::endl;
3086 return this->
restriction[refinement_case - 1][child];
3100 std::vector<double> & nodal_values)
const 3102 const unsigned int deg = this->
degree - 1;
3111 std::fill(nodal_values.begin(), nodal_values.end(), 0.0);
3119 const QGauss<dim - 1> reference_edge_quadrature(this->
degree);
3120 const unsigned int &n_edge_points = reference_edge_quadrature.size();
3122 for (
unsigned int i = 0; i < 2; ++i)
3123 for (
unsigned int j = 0; j < 2; ++j)
3125 for (
unsigned int q_point = 0; q_point < n_edge_points;
3127 nodal_values[(i + 2 * j) * this->
degree] +=
3128 reference_edge_quadrature.weight(q_point) *
3129 support_point_values[q_point + (i + 2 * j) * n_edge_points]
3135 if (std::abs(nodal_values[(i + 2 * j) * this->
degree]) < 1e-14)
3136 nodal_values[(i + 2 * j) * this->
degree] = 0.0;
3149 if (this->
degree - 1 > 1)
3154 const std::vector<Polynomials::Polynomial<double>>
3155 &lobatto_polynomials =
3159 std::vector<Polynomials::Polynomial<double>>
3160 lobatto_polynomials_grad(this->
degree);
3162 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size(); ++i)
3163 lobatto_polynomials_grad[i] =
3164 lobatto_polynomials[i + 1].derivative();
3169 for (
unsigned int i = 0; i < system_matrix.
m(); ++i)
3170 for (
unsigned int j = 0; j < system_matrix.
n(); ++j)
3171 for (
unsigned int q_point = 0; q_point < n_edge_points;
3173 system_matrix(i, j) +=
3175 lobatto_polynomials_grad[i + 1].value(
3181 system_matrix_inv.
invert(system_matrix);
3188 for (
unsigned int line = 0;
3189 line < GeometryInfo<dim>::lines_per_cell;
3195 for (
unsigned int q_point = 0; q_point < n_edge_points;
3199 support_point_values[line * n_edge_points + q_point]
3200 [line_coordinate[line]] -
3201 nodal_values[line * this->
degree] *
3207 line_coordinate[line]);
3209 for (
unsigned int i = 0; i < system_rhs.size(); ++i)
3213 system_matrix_inv.
vmult(solution, system_rhs);
3219 for (
unsigned int i = 0; i < solution.size(); ++i)
3220 if (std::abs(solution(i)) > 1e-14)
3221 nodal_values[line * this->
degree + i + 1] = solution(i);
3234 const unsigned int &n_interior_points =
3235 reference_quadrature.
size();
3236 const std::vector<Polynomials::Polynomial<double>>
3237 &legendre_polynomials =
3245 for (
unsigned int i = 0; i < this->
degree; ++i)
3246 for (
unsigned int j = 0; j < this->degree - 1; ++j)
3247 for (
unsigned int k = 0; k < this->
degree; ++k)
3248 for (
unsigned int l = 0; l < this->degree - 1; ++l)
3249 for (
unsigned int q_point = 0;
3250 q_point < n_interior_points;
3252 system_matrix(i * (this->degree - 1) + j,
3253 k * (this->degree - 1) + l) +=
3254 reference_quadrature.
weight(q_point) *
3255 legendre_polynomials[i].value(
3258 n_edge_points](0)) *
3259 lobatto_polynomials[j + 2].value(
3262 n_edge_points](1)) *
3263 lobatto_polynomials_grad[k].value(
3266 n_edge_points](0)) *
3267 lobatto_polynomials[l + 2].value(
3272 system_matrix_inv.
reinit(system_matrix.
m(), system_matrix.
m());
3273 system_matrix_inv.
invert(system_matrix);
3277 system_rhs.reinit(system_matrix_inv.
m());
3280 for (
unsigned int q_point = 0; q_point < n_interior_points;
3284 support_point_values[q_point +
3288 for (
unsigned int i = 0; i < 2; ++i)
3289 for (
unsigned int j = 0; j <= deg; ++j)
3290 tmp -= nodal_values[(i + 2) * this->degree + j] *
3292 (i + 2) * this->degree + j,
3298 for (
unsigned int i = 0; i <= deg; ++i)
3299 for (
unsigned int j = 0; j < deg; ++j)
3300 system_rhs(i * deg + j) +=
3301 reference_quadrature.
weight(q_point) * tmp *
3302 lobatto_polynomials_grad[i].value(
3305 n_edge_points](0)) *
3306 lobatto_polynomials[j + 2].value(
3312 solution.reinit(system_matrix.
m());
3313 system_matrix_inv.
vmult(solution, system_rhs);
3319 for (
unsigned int i = 0; i <= deg; ++i)
3320 for (
unsigned int j = 0; j < deg; ++j)
3321 if (std::abs(solution(i * deg + j)) > 1e-14)
3324 solution(i * deg + j);
3331 for (
unsigned int q_point = 0; q_point < n_interior_points;
3335 support_point_values[q_point +
3339 for (
unsigned int i = 0; i < 2; ++i)
3340 for (
unsigned int j = 0; j <= deg; ++j)
3341 tmp -= nodal_values[i * this->degree + j] *
3343 i * this->degree + j,
3349 for (
unsigned int i = 0; i <= deg; ++i)
3350 for (
unsigned int j = 0; j < deg; ++j)
3351 system_rhs(i * deg + j) +=
3352 reference_quadrature.
weight(q_point) * tmp *
3353 lobatto_polynomials_grad[i].value(
3356 n_edge_points](1)) *
3357 lobatto_polynomials[j + 2].value(
3363 system_matrix_inv.
vmult(solution, system_rhs);
3369 for (
unsigned int i = 0; i <= deg; ++i)
3370 for (
unsigned int j = 0; j < deg; ++j)
3371 if (std::abs(solution(i * deg + j)) > 1e-14)
3374 this->degree] = solution(i * deg + j);
3385 const unsigned int &n_edge_points = reference_edge_quadrature.
size();
3387 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
3389 for (
unsigned int i = 0; i < 4; ++i)
3390 nodal_values[(i + 8) * this->
degree] +=
3391 reference_edge_quadrature.
weight(q_point) *
3392 support_point_values[q_point + (i + 8) * n_edge_points][2];
3394 for (
unsigned int i = 0; i < 2; ++i)
3395 for (
unsigned int j = 0; j < 2; ++j)
3396 for (
unsigned int k = 0; k < 2; ++k)
3397 nodal_values[(i + 2 * (2 * j + k)) * this->
degree] +=
3398 reference_edge_quadrature.
weight(q_point) *
3399 support_point_values[q_point + (i + 2 * (2 * j + k)) *
3400 n_edge_points][1 - k];
3407 for (
unsigned int i = 0; i < 4; ++i)
3408 if (std::abs(nodal_values[(i + 8) * this->
degree]) < 1e-14)
3409 nodal_values[(i + 8) * this->
degree] = 0.0;
3411 for (
unsigned int i = 0; i < 2; ++i)
3412 for (
unsigned int j = 0; j < 2; ++j)
3413 for (
unsigned int k = 0; k < 2; ++k)
3415 nodal_values[(i + 2 * (2 * j + k)) * this->
degree]) <
3417 nodal_values[(i + 2 * (2 * j + k)) * this->degree] = 0.0;
3428 if (this->degree > 1)
3433 const std::vector<Polynomials::Polynomial<double>>
3434 &lobatto_polynomials =
3438 std::vector<Polynomials::Polynomial<double>>
3439 lobatto_polynomials_grad(this->degree);
3441 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size(); ++i)
3442 lobatto_polynomials_grad[i] =
3443 lobatto_polynomials[i + 1].derivative();
3448 for (
unsigned int i = 0; i < system_matrix.
m(); ++i)
3449 for (
unsigned int j = 0; j < system_matrix.
n(); ++j)
3450 for (
unsigned int q_point = 0; q_point < n_edge_points;
3452 system_matrix(i, j) +=
3454 lobatto_polynomials_grad[i + 1].value(
3460 system_matrix_inv.
invert(system_matrix);
3464 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2};
3468 for (
unsigned int line = 0;
3469 line < GeometryInfo<dim>::lines_per_cell;
3475 for (
unsigned int q_point = 0; q_point < this->
degree;
3479 support_point_values[line * this->degree + q_point]
3480 [line_coordinate[line]] -
3481 nodal_values[line * this->
degree] *
3483 line * this->degree,
3487 line_coordinate[line]);
3489 for (
unsigned int i = 0; i < system_rhs.size(); ++i)
3493 system_matrix_inv.
vmult(solution, system_rhs);
3499 for (
unsigned int i = 0; i < solution.size(); ++i)
3500 if (std::abs(solution(i)) > 1e-14)
3501 nodal_values[line * this->degree + i + 1] = solution(i);
3512 const std::vector<Polynomials::Polynomial<double>>
3513 &legendre_polynomials =
3516 const unsigned int n_face_points = n_edge_points * n_edge_points;
3518 system_matrix.
reinit((this->degree - 1) * this->degree,
3519 (this->degree - 1) * this->degree);
3522 for (
unsigned int i = 0; i < this->
degree; ++i)
3523 for (
unsigned int j = 0; j < this->degree - 1; ++j)
3524 for (
unsigned int k = 0; k < this->
degree; ++k)
3525 for (
unsigned int l = 0; l < this->degree - 1; ++l)
3526 for (
unsigned int q_point = 0; q_point < n_face_points;
3528 system_matrix(i * (this->degree - 1) + j,
3529 k * (this->degree - 1) + l) +=
3531 2 * (k * (this->degree - 1) + l)) *
3532 legendre_polynomials[i].value(
3534 [q_point + 4 * n_edge_points](0)) *
3535 lobatto_polynomials[j + 2].value(
3537 [q_point + 4 * n_edge_points](1));
3539 system_matrix_inv.
reinit(system_matrix.
m(), system_matrix.
m());
3540 system_matrix_inv.
invert(system_matrix);
3541 solution.reinit(system_matrix.
m());
3542 system_rhs.reinit(system_matrix.
m());
3546 {1, 2}, {1, 2}, {2, 0}, {2, 0}, {0, 1}, {0, 1}};
3556 for (
unsigned int face = 0;
3557 face < GeometryInfo<dim>::faces_per_cell;
3565 for (
unsigned int q_point = 0; q_point < n_face_points;
3569 support_point_values[q_point +
3572 [face_coordinates[face][0]];
3574 for (
unsigned int i = 0; i < 2; ++i)
3575 for (
unsigned int j = 0; j <= deg; ++j)
3577 nodal_values[edge_indices[face][i] * this->degree +
3580 edge_indices[face][i] * this->degree + j,
3584 face_coordinates[face][0]);
3586 for (
unsigned int i = 0; i <= deg; ++i)
3587 for (
unsigned int j = 0; j < deg; ++j)
3588 system_rhs(i * deg + j) +=
3590 2 * (i * deg + j)) *
3594 system_matrix_inv.
vmult(solution, system_rhs);
3600 for (
unsigned int i = 0; i <= deg; ++i)
3601 for (
unsigned int j = 0; j < deg; ++j)
3602 if (std::abs(solution(i * deg + j)) > 1e-14)
3603 nodal_values[(2 * face * this->degree + i +
3607 solution(i * deg + j);
3614 for (
unsigned int q_point = 0; q_point < n_face_points;
3618 support_point_values[q_point +
3621 [face_coordinates[face][1]];
3624 i < (int)GeometryInfo<dim>::lines_per_face;
3626 for (
unsigned int j = 0; j <= deg; ++j)
3628 nodal_values[edge_indices[face][i] * this->degree +
3631 edge_indices[face][i] * this->degree + j,
3635 face_coordinates[face][1]);
3637 for (
unsigned int i = 0; i <= deg; ++i)
3638 for (
unsigned int j = 0; j < deg; ++j)
3639 system_rhs(i * deg + j) +=
3641 2 * (i * deg + j) + 1) *
3645 system_matrix_inv.
vmult(solution, system_rhs);
3651 for (
unsigned int i = 0; i <= deg; ++i)
3652 for (
unsigned int j = 0; j < deg; ++j)
3653 if (std::abs(solution(i * deg + j)) > 1e-14)
3654 nodal_values[((2 * face + 1) * deg + j +
3657 i] = solution(i * deg + j);
3665 const QGauss<dim> reference_quadrature(this->degree);
3666 const unsigned int n_interior_points =
3667 reference_quadrature.
size();
3671 system_matrix.
reinit(this->degree * deg * deg,
3672 this->degree * deg * deg);
3675 for (
unsigned int i = 0; i <= deg; ++i)
3676 for (
unsigned int j = 0; j < deg; ++j)
3677 for (
unsigned int k = 0; k < deg; ++k)
3678 for (
unsigned int l = 0; l <= deg; ++l)
3679 for (
unsigned int m = 0; m < deg; ++m)
3680 for (
unsigned int n = 0; n < deg; ++n)
3681 for (
unsigned int q_point = 0;
3682 q_point < n_interior_points;
3684 system_matrix((i * deg + j) * deg + k,
3685 (l * deg + m) * deg + n) +=
3686 reference_quadrature.
weight(q_point) *
3687 legendre_polynomials[i].value(
3693 n_face_points](0)) *
3694 lobatto_polynomials[j + 2].value(
3700 n_face_points](1)) *
3701 lobatto_polynomials[k + 2].value(
3707 n_face_points](2)) *
3708 lobatto_polynomials_grad[l].value(
3714 n_face_points](0)) *
3715 lobatto_polynomials[m + 2].value(
3721 n_face_points](1)) *
3722 lobatto_polynomials[n + 2].value(
3730 system_matrix_inv.
reinit(system_matrix.
m(), system_matrix.
m());
3731 system_matrix_inv.
invert(system_matrix);
3733 system_rhs.reinit(system_matrix.
m());
3736 for (
unsigned int q_point = 0; q_point < n_interior_points;
3740 support_point_values[q_point +
3746 for (
unsigned int i = 0; i <= deg; ++i)
3748 for (
unsigned int j = 0; j < 2; ++j)
3749 for (
unsigned int k = 0; k < 2; ++k)
3751 nodal_values[i + (j + 4 * k + 2) * this->
degree] *
3753 i + (j + 4 * k + 2) * this->degree,
3762 for (
unsigned int j = 0; j < deg; ++j)
3763 for (
unsigned int k = 0; k < 4; ++k)
3765 nodal_values[(i + 2 * (k + 2) * this->degree +
3771 (i + 2 * (k + 2) * this->degree +
3784 for (
unsigned int i = 0; i <= deg; ++i)
3785 for (
unsigned int j = 0; j < deg; ++j)
3786 for (
unsigned int k = 0; k < deg; ++k)
3787 system_rhs((i * deg + j) * deg + k) +=
3788 reference_quadrature.
weight(q_point) * tmp *
3789 lobatto_polynomials_grad[i].value(
3795 n_face_points](0)) *
3796 lobatto_polynomials[j + 2].value(
3802 n_face_points](1)) *
3803 lobatto_polynomials[k + 2].value(
3812 solution.reinit(system_rhs.size());
3813 system_matrix_inv.
vmult(solution, system_rhs);
3819 for (
unsigned int i = 0; i <= deg; ++i)
3820 for (
unsigned int j = 0; j < deg; ++j)
3821 for (
unsigned int k = 0; k < deg; ++k)
3822 if (std::abs(solution((i * deg + j) * deg + k)) > 1e-14)
3829 solution((i * deg + j) * deg + k);
3834 for (
unsigned int q_point = 0; q_point < n_interior_points;
3838 support_point_values[q_point +
3844 for (
unsigned int i = 0; i <= deg; ++i)
3845 for (
unsigned int j = 0; j < 2; ++j)
3847 for (
unsigned int k = 0; k < 2; ++k)
3848 tmp -= nodal_values[i + (4 * j + k) * this->
degree] *
3850 i + (4 * j + k) * this->degree,
3859 for (
unsigned int k = 0; k < deg; ++k)
3861 nodal_values[(i + 2 * j * this->degree +
3867 (i + 2 * j * this->degree +
3879 ((2 * j + 9) * deg + k +
3883 i + ((2 * j + 9) * deg + k +
3895 for (
unsigned int i = 0; i <= deg; ++i)
3896 for (
unsigned int j = 0; j < deg; ++j)
3897 for (
unsigned int k = 0; k < deg; ++k)
3898 system_rhs((i * deg + j) * deg + k) +=
3899 reference_quadrature.
weight(q_point) * tmp *
3900 lobatto_polynomials_grad[i].value(
3906 n_face_points](1)) *
3907 lobatto_polynomials[j + 2].value(
3913 n_face_points](0)) *
3914 lobatto_polynomials[k + 2].value(
3923 system_matrix_inv.
vmult(solution, system_rhs);
3929 for (
unsigned int i = 0; i <= deg; ++i)
3930 for (
unsigned int j = 0; j < deg; ++j)
3931 for (
unsigned int k = 0; k < deg; ++k)
3932 if (std::abs(solution((i * deg + j) * deg + k)) > 1e-14)
3933 nodal_values[((i + this->degree +
3940 solution((i * deg + j) * deg + k);
3945 for (
unsigned int q_point = 0; q_point < n_interior_points;
3949 support_point_values[q_point +
3955 for (
unsigned int i = 0; i <= deg; ++i)
3956 for (
unsigned int j = 0; j < 4; ++j)
3958 tmp -= nodal_values[i + (j + 8) * this->degree] *
3960 i + (j + 8) * this->
degree,
3969 for (
unsigned int k = 0; k < deg; ++k)
3972 ((2 * j + 1) * deg + k +
3976 i + ((2 * j + 1) * deg + k +
3979 this->generalized_support_points
3988 for (
unsigned int i = 0; i <= deg; ++i)
3989 for (
unsigned int j = 0; j < deg; ++j)
3990 for (
unsigned int k = 0; k < deg; ++k)
3991 system_rhs((i * deg + j) * deg + k) +=
3992 reference_quadrature.
weight(q_point) * tmp *
3993 lobatto_polynomials_grad[i].value(
3999 n_face_points](2)) *
4000 lobatto_polynomials[j + 2].value(
4006 n_face_points](0)) *
4007 lobatto_polynomials[k + 2].value(
4016 system_matrix_inv.
vmult(solution, system_rhs);
4022 for (
unsigned int i = 0; i <= deg; ++i)
4023 for (
unsigned int j = 0; j < deg; ++j)
4024 for (
unsigned int k = 0; k < deg; ++k)
4025 if (std::abs(solution((i * deg + j) * deg + k)) > 1e-14)
4031 this->degree] = solution((i * deg + j) * deg + k);
4045 std::pair<Table<2, bool>, std::vector<unsigned int>>
4049 for (
unsigned int d = 0; d < dim; ++d)
4051 constant_modes(d, i) =
true;
4053 for (
unsigned int d = 0; d < dim; ++d)
4054 components.push_back(d);
4055 return std::pair<Table<2, bool>, std::vector<unsigned int>>(constant_modes,
4073 #include "fe_nedelec.inst" 4076 DEAL_II_NAMESPACE_CLOSE
virtual void get_subface_interpolation_matrix(const FiniteElement< dim > &source, const unsigned int subface, FullMatrix< double > &matrix) const override
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim > &source, FullMatrix< double > &matrix) const override
std::vector< std::vector< FullMatrix< double > > > restriction
virtual bool hp_constraints_are_implemented() const override
const unsigned int components
std::vector< Point< dim > > generalized_support_points
FullMatrix< double > interface_constraints
static std::vector< Polynomial< double > > generate_complete_basis(const unsigned int p)
static std::vector< Polynomial< double > > generate_complete_basis(const unsigned int degree)
const unsigned int degree
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
#define AssertThrow(cond, exc)
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
std::vector< Point< dim-1 > > generalized_face_support_points
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
const Point< dim > & point(const unsigned int i) const
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &nodal_values) const override
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree, bool dg=false)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim > &fe_other) const override
void initialize_support_points(const unsigned int order)
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
static::ExceptionBase & ExcMessage(std::string arg1)
static::ExceptionBase & ExcImpossibleInDim(int arg1)
std::vector< std::vector< FullMatrix< double > > > prolongation
void invert(const FullMatrix< number2 > &M)
Table< 2, double > boundary_weights
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim > &fe_other) const override
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
double weight(const unsigned int i) const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
void mTmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
virtual std::string get_name() const =0
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim > &fe_other) const override
void mmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
unsigned int n_components() const
static unsigned int compute_n_pols(unsigned int degree)
const unsigned int dofs_per_cell
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim > &fe_other) const override
static Quadrature< dim > project_to_all_faces(const SubQuadrature &quadrature)
virtual unsigned int face_to_cell_index(const unsigned int face_dof_index, const unsigned int face, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false) const
virtual std::size_t memory_consumption() const override
virtual std::string get_name() const override
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
const unsigned int dofs_per_face
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
static::ExceptionBase & ExcNotImplemented()
void initialize_restriction()
FullMatrix< double > inverse_node_matrix
virtual std::unique_ptr< FiniteElement< dim, dim > > clone() const override
void fill(const FullMatrix< number2 > &src, const size_type dst_offset_i=0, const size_type dst_offset_j=0, const size_type src_offset_i=0, const size_type src_offset_j=0)
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override