16 #include <deal.II/base/logstream.h> 17 #include <deal.II/base/utilities.h> 18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/quadrature_lib.h> 20 #include <deal.II/base/qprojector.h> 21 #include <deal.II/grid/tria.h> 22 #include <deal.II/grid/tria_iterator.h> 23 #include <deal.II/dofs/dof_accessor.h> 24 #include <deal.II/fe/mapping.h> 25 #include <deal.II/fe/fe_nedelec.h> 26 #include <deal.II/fe/fe_nothing.h> 27 #include <deal.II/fe/fe_values.h> 28 #include <deal.II/fe/fe_tools.h> 29 #include <deal.II/lac/full_matrix.h> 30 #include <deal.II/lac/vector.h> 39 DEAL_II_NAMESPACE_OPEN
53 std::vector<bool> (dim, true)))
59 Assert (dim >= 2, ExcImpossibleInDim(dim));
81 deallog <<
"Face Embedding" << std::endl;
85 for (
unsigned int i = 0; i < GeometryInfo<dim>::max_children_per_face; ++i)
88 FETools::compute_face_embedding_matrices<dim,double>
89 (*
this, face_embeddings, 0, 0);
104 for (
unsigned int i = 0; i < GeometryInfo<2>::max_children_per_face;
109 = face_embeddings[i] (j, k);
119 unsigned int target_row = 0;
121 for (
unsigned int i = 0; i < 2; ++i)
122 for (
unsigned int j = this->
degree; j < 2 * this->
degree;
126 = face_embeddings[2 * i] (j, k);
128 for (
unsigned int i = 0; i < 2; ++i)
129 for (
unsigned int j = 3 * this->degree;
130 j < GeometryInfo<3>::lines_per_face * this->
degree;
134 = face_embeddings[i] (j, k);
136 for (
unsigned int i = 0; i < 2; ++i)
137 for (
unsigned int j = 0; j < 2; ++j)
138 for (
unsigned int k = i * this->degree;
139 k < (i + 1) * this->degree; ++k, ++target_row)
142 = face_embeddings[i + 2 * j] (k, l);
144 for (
unsigned int i = 0; i < 2; ++i)
145 for (
unsigned int j = 0; j < 2; ++j)
146 for (
unsigned int k = (i + 2) * this->
degree;
147 k < (i + 3) * this->degree; ++k, ++target_row)
150 = face_embeddings[2 * i + j] (k, l);
152 for (
unsigned int i = 0; i < GeometryInfo<3>::max_children_per_face;
159 = face_embeddings[i] (j, k);
165 Assert (
false, ExcNotImplemented ());
183 std::ostringstream namebuf;
184 namebuf <<
"FE_Nedelec<" << dim <<
">(" << this->
degree-1 <<
")";
186 return namebuf.str();
213 Assert (
false, ExcNotImplemented ());
225 const std::vector<Polynomials::Polynomial<double> > &lobatto_polynomials
227 std::vector<Polynomials::Polynomial<double> >
228 lobatto_polynomials_grad (degree + 1);
230 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size (); ++i)
231 lobatto_polynomials_grad[i] = lobatto_polynomials[i + 1].derivative ();
235 const QGauss<dim - 1> reference_edge_quadrature (degree + 1);
236 const unsigned int n_edge_points = reference_edge_quadrature.size ();
237 const unsigned int n_boundary_points
245 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
247 = reference_edge_quadrature.point (q_point);
255 const unsigned int &n_interior_points = quadrature.
size ();
258 (n_boundary_points + n_interior_points);
261 for (
unsigned int q_point = 0; q_point < n_edge_points;
264 for (
unsigned int line = 0;
265 line < GeometryInfo<dim>::lines_per_cell; ++line)
268 = edge_quadrature.
point 270 (line,
true,
false,
false, n_edge_points) + q_point);
272 for (
unsigned int i = 0; i <
degree; ++i)
274 = reference_edge_quadrature.weight (q_point)
275 * lobatto_polynomials_grad[i + 1].value
279 for (
unsigned int q_point = 0; q_point < n_interior_points;
282 = quadrature.
point (q_point);
291 for (
unsigned int line = 0;
292 line < GeometryInfo<dim>::lines_per_cell; ++line)
293 for (
unsigned int q_point = 0; q_point < n_edge_points;
297 = edge_quadrature.
point 299 (line,
true,
false,
false, n_edge_points) + q_point);
312 const std::vector<Polynomials::Polynomial<double> > &lobatto_polynomials
314 std::vector<Polynomials::Polynomial<double> >
315 lobatto_polynomials_grad (degree + 1);
317 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size (); ++i)
318 lobatto_polynomials_grad[i] = lobatto_polynomials[i + 1].derivative ();
322 const QGauss<1> reference_edge_quadrature (degree + 1);
323 const unsigned int &n_edge_points = reference_edge_quadrature.
size ();
326 (reference_edge_quadrature);
333 const QGauss<dim - 1> reference_face_quadrature (degree + 1);
334 const unsigned int &n_face_points
335 = reference_face_quadrature.size ();
336 const unsigned int n_boundary_points
340 const unsigned int &n_interior_points = quadrature.
size ();
343 2 * (degree + 1) * degree);
345 (4 * n_edge_points + n_face_points);
347 (n_boundary_points + n_interior_points);
350 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
352 for (
unsigned int line = 0;
356 = edge_quadrature.point
358 (line,
true,
false,
false, n_edge_points) + q_point);
360 for (
unsigned int i = 0; i < 2; ++i)
361 for (
unsigned int j = 0; j < 2; ++j)
364 [q_point + (i + 4 * j) * n_edge_points]
366 (i, reference_edge_quadrature.
point (q_point) (0),
369 [q_point + (i + 4 * j + 2) * n_edge_points]
371 (reference_edge_quadrature.
point (q_point) (0),
374 [q_point + (i + 2 * (j + 4)) * n_edge_points]
377 reference_edge_quadrature.
point (q_point) (0));
380 for (
unsigned int i = 0; i <
degree; ++i)
382 = reference_edge_quadrature.
weight (q_point)
383 * lobatto_polynomials_grad[i + 1].value
388 for (
unsigned int q_point = 0; q_point < n_face_points;
393 = reference_face_quadrature.point (q_point);
395 for (
unsigned int i = 0; i <=
degree; ++i)
396 for (
unsigned int j = 0; j <
degree; ++j)
399 2 * (i * degree + j))
400 = reference_face_quadrature.weight (q_point)
401 * lobatto_polynomials_grad[i].value
403 [q_point + 4 * n_edge_points] (0))
404 * lobatto_polynomials[j + 2].value
406 [q_point + 4 * n_edge_points] (1));
408 2 * (i * degree + j) + 1)
409 = reference_face_quadrature.weight (q_point)
410 * lobatto_polynomials_grad[i].value
412 [q_point + 4 * n_edge_points] (1))
413 * lobatto_polynomials[j + 2].value
415 [q_point + 4 * n_edge_points] (0));
421 (reference_face_quadrature);
423 for (
unsigned int face = 0;
424 face < GeometryInfo<dim>::faces_per_cell; ++face)
425 for (
unsigned int q_point = 0; q_point < n_face_points;
429 [face * n_face_points + q_point
431 = face_quadrature.
point 433 (face,
true,
false,
false, n_face_points) + q_point);
437 for (
unsigned int q_point = 0; q_point < n_interior_points;
440 = quadrature.
point (q_point);
449 for (
unsigned int q_point = 0; q_point < n_edge_points;
452 for (
unsigned int line = 0;
456 = edge_quadrature.point
458 (line,
true,
false,
false, n_edge_points) + q_point);
460 for (
unsigned int i = 0; i < 2; ++i)
461 for (
unsigned int j = 0; j < 2; ++j)
464 [q_point + (i + 4 * j) * n_edge_points]
466 (i, reference_edge_quadrature.
point (q_point) (0),
469 [q_point + (i + 4 * j + 2) * n_edge_points]
471 (reference_edge_quadrature.
point (q_point) (0),
474 [q_point + (i + 2 * (j + 4)) * n_edge_points]
477 reference_edge_quadrature.
point (q_point) (0));
492 for (
unsigned int i = 0; i < GeometryInfo<1>::max_children_per_cell; ++i)
510 const std::vector<Point<1> > &edge_quadrature_points
513 n_edge_quadrature_points = edge_quadrature.
size ();
526 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
529 const double weight = 2.0 * edge_quadrature.
weight (q_point);
531 if (edge_quadrature_points[q_point] (0) < 0.5)
534 2.0 * edge_quadrature_points[q_point] (0));
541 quadrature_point (0) = 1.0;
546 quadrature_point (0) = quadrature_point (1);
547 quadrature_point (1) = 0.0;
552 quadrature_point (1) = 1.0;
562 2.0 * edge_quadrature_points[q_point] (0)
570 quadrature_point (0) = 1.0;
575 quadrature_point (0) = quadrature_point (1);
576 quadrature_point (1) = 0.0;
581 quadrature_point (1) = 1.0;
595 const unsigned int deg = this->
degree-1;
596 const std::vector<Polynomials::Polynomial<double> > &
603 n_edge_quadrature_points);
605 for (
unsigned int q_point = 0;
606 q_point < n_edge_quadrature_points; ++q_point)
609 = std::sqrt (edge_quadrature.
weight (q_point));
611 for (
unsigned int i = 0; i < deg; ++i)
612 assembling_matrix (i, q_point) = weight
613 * legendre_polynomials[i + 1].value
614 (edge_quadrature_points[q_point] (0));
619 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
620 system_matrix_inv.
invert (system_matrix);
628 for (
unsigned int i = 0; i < 2; ++i)
632 for (
unsigned int q_point = 0;
633 q_point < n_edge_quadrature_points; ++q_point)
636 = edge_quadrature.
weight (q_point);
638 edge_quadrature_points[q_point] (0));
640 (edge_quadrature_points[q_point] (0),
643 if (edge_quadrature_points[q_point] (0) < 0.5)
646 2.0 * edge_quadrature_points[q_point] (0));
650 (dof, quadrature_point_2, 1)
655 quadrature_point_0, 1));
656 tmp (1) = -1.0 * weight
661 quadrature_point_0, 1);
663 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0),
667 (dof, quadrature_point_2, 0)
668 - this->restriction[index][2 * i]
669 ((i + 2) * this->degree, dof)
671 ((i + 2) * this->degree,
672 quadrature_point_1, 0));
673 tmp (3) = -1.0 * weight
674 * this->restriction[index][2 * i + 1]
675 ((i + 2) * this->degree, dof)
677 ((i + 2) * this->degree,
678 quadrature_point_1, 0);
683 tmp (0) = -1.0 * weight
688 quadrature_point_0, 1);
691 2.0 * edge_quadrature_points[q_point] (0)
696 (dof, quadrature_point_2, 1)
697 - this->restriction[index][i + 2]
701 quadrature_point_0, 1));
702 tmp (2) = -1.0 * weight
703 * this->restriction[index][2 * i]
704 ((i + 2) * this->degree, dof)
706 ((i + 2) * this->degree,
707 quadrature_point_1, 0);
709 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0)
713 (dof, quadrature_point_2, 0)
714 - this->restriction[index][2 * i + 1]
715 ((i + 2) * this->degree, dof)
717 ((i + 2) * this->degree,
718 quadrature_point_1, 0));
721 for (
unsigned int j = 0; j < this->
degree-1; ++j)
724 = legendre_polynomials[j + 1].value
725 (edge_quadrature_points[q_point] (0));
727 for (
unsigned int k = 0; k < tmp.
size (); ++k)
728 system_rhs (j, k) += tmp (k) * L_j;
732 system_matrix_inv.
mmult (solution, system_rhs);
734 for (
unsigned int j = 0; j < this->
degree-1; ++j)
735 for (
unsigned int k = 0; k < 2; ++k)
737 if (std::abs (solution (j, k)) > 1e-14)
739 (i * this->degree + j + 1, dof)
742 if (std::abs (solution (j, k + 2)) > 1e-14)
744 ((i + 2) * this->degree + j + 1, dof)
745 = solution (j, k + 2);
750 const std::vector<Point<dim> > &
752 const std::vector<Polynomials::Polynomial<double> > &
756 const unsigned int n_boundary_dofs
758 const unsigned int &n_quadrature_points = quadrature.
size ();
762 n_quadrature_points);
764 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
768 = std::sqrt (quadrature.
weight (q_point));
770 for (
unsigned int i = 0; i < this->
degree; ++i)
772 const double L_i = weight
773 * legendre_polynomials[i].value
774 (quadrature_points[q_point] (0));
776 for (
unsigned int j = 0; j < this->degree-1; ++j)
777 assembling_matrix (i * (this->degree-1) + j, q_point)
778 = L_i * lobatto_polynomials[j + 2].value
779 (quadrature_points[q_point] (1));
784 assembling_matrix.
m ());
786 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
787 system_matrix_inv.
reinit (system_matrix.m (), system_matrix.m ());
788 system_matrix_inv.
invert (system_matrix);
791 solution.
reinit (system_matrix_inv.
m (), 8);
792 system_rhs.
reinit (system_matrix_inv.
m (), 8);
799 for (
unsigned int q_point = 0;
800 q_point < n_quadrature_points; ++q_point)
804 if (quadrature_points[q_point] (0) < 0.5)
806 if (quadrature_points[q_point] (1) < 0.5)
809 (2.0 * quadrature_points[q_point] (0),
810 2.0 * quadrature_points[q_point] (1));
813 (dof, quadrature_point, 0);
815 (dof, quadrature_point, 1);
821 (2.0 * quadrature_points[q_point] (0),
822 2.0 * quadrature_points[q_point] (1)
826 (dof, quadrature_point, 0);
828 (dof, quadrature_point, 1);
832 else if (quadrature_points[q_point] (1) < 0.5)
835 (2.0 * quadrature_points[q_point] (0)
837 2.0 * quadrature_points[q_point] (1));
840 (dof, quadrature_point, 0);
842 (dof, quadrature_point, 1);
848 (2.0 * quadrature_points[q_point] (0)
850 2.0 * quadrature_points[q_point] (1)
854 (dof, quadrature_point, 0);
856 (dof, quadrature_point, 1);
859 for (
unsigned int i = 0; i < 2; ++i)
860 for (
unsigned int j = 0; j < this->
degree; ++j)
863 (j + 2 * this->
degree, dof)
865 (j + 2 * this->degree,
866 quadrature_points[q_point], 0);
868 (i * this->degree + j, dof)
870 (i * this->degree + j,
871 quadrature_points[q_point], 1);
872 tmp (2 * (i + 2)) -= this->
restriction[index][i + 2]
873 (j + 3 * this->
degree, dof)
875 (j + 3 * this->degree,
876 quadrature_points[q_point],
879 (i * this->degree + j, dof)
881 (i * this->degree + j,
882 quadrature_points[q_point], 1);
885 tmp *= quadrature.
weight (q_point);
887 for (
unsigned int i = 0; i < this->
degree; ++i)
890 = legendre_polynomials[i].value
891 (quadrature_points[q_point] (0));
893 = legendre_polynomials[i].value
894 (quadrature_points[q_point] (1));
896 for (
unsigned int j = 0; j < this->degree-1; ++j)
899 = L_i_0 * lobatto_polynomials[j + 2].value
900 (quadrature_points[q_point] (1));
902 = L_i_1 * lobatto_polynomials[j + 2].value
903 (quadrature_points[q_point] (0));
905 for (
unsigned int k = 0; k < 4; ++k)
907 system_rhs (i * (this->degree-1) + j, 2 * k)
908 += tmp (2 * k) * l_j_0;
909 system_rhs (i * (this->degree-1) + j, 2 * k + 1)
910 += tmp (2 * k + 1) * l_j_1;
916 system_matrix_inv.
mmult (solution, system_rhs);
918 for (
unsigned int i = 0; i < this->
degree; ++i)
919 for (
unsigned int j = 0; j < this->degree-1; ++j)
920 for (
unsigned int k = 0; k < 4; ++k)
922 if (std::abs (solution (i * (this->degree-1) + j, 2 * k))
925 (i * (this->degree-1) + j + n_boundary_dofs, dof)
926 = solution (i * (this->degree-1) + j, 2 * k);
928 if (std::abs (solution (i * (this->degree-1) + j, 2 * k + 1))
931 (i + (this->degree-1 + j) * this->degree + n_boundary_dofs,
933 = solution (i * (this->degree-1) + j, 2 * k + 1);
948 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
951 const double weight = 2.0 * edge_quadrature.
weight (q_point);
953 if (edge_quadrature_points[q_point] (0) < 0.5)
954 for (
unsigned int i = 0; i < 2; ++i)
955 for (
unsigned int j = 0; j < 2; ++j)
958 2.0 * edge_quadrature_points[q_point] (0),
962 ((i + 4 * j) * this->
degree, dof)
967 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0),
970 ((i + 4 * j + 2) * this->
degree, dof)
971 += weight * this->shape_value_component (dof,
975 2.0 * edge_quadrature_points[q_point] (0));
977 ((i + 2 * (j + 4)) * this->
degree, dof)
978 += weight * this->shape_value_component (dof,
984 for (
unsigned int i = 0; i < 2; ++i)
985 for (
unsigned int j = 0; j < 2; ++j)
988 2.0 * edge_quadrature_points[q_point] (0)
992 ((i + 4 * j) * this->
degree, dof)
997 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0)
1000 ((i + 4 * j + 2) * this->
degree, dof)
1001 += weight * this->shape_value_component (dof,
1005 2.0 * edge_quadrature_points[q_point] (0)
1008 ((i + 2 * (j + 4)) * this->
degree, dof)
1009 += weight * this->shape_value_component (dof,
1021 const unsigned int deg = this->
degree-1;
1022 const std::vector<Polynomials::Polynomial<double> > &
1023 legendre_polynomials
1029 n_edge_quadrature_points);
1031 for (
unsigned int q_point = 0;
1032 q_point < n_edge_quadrature_points; ++q_point)
1034 const double weight = std::sqrt (edge_quadrature.
weight 1037 for (
unsigned int i = 0; i < deg; ++i)
1038 assembling_matrix (i, q_point) = weight
1039 * legendre_polynomials[i + 1].value
1040 (edge_quadrature_points[q_point] (0));
1045 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
1046 system_matrix_inv.
invert (system_matrix);
1053 for (
unsigned int i = 0; i < 2; ++i)
1054 for (
unsigned int j = 0; j < 2; ++j)
1055 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1059 for (
unsigned int q_point = 0;
1060 q_point < n_edge_quadrature_points; ++q_point)
1062 const double weight = edge_quadrature.
weight 1065 edge_quadrature_points[q_point] (0),
1069 (edge_quadrature_points[q_point] (0), i, j);
1071 edge_quadrature_points[q_point] (0));
1073 if (edge_quadrature_points[q_point] (0) < 0.5)
1076 2.0 * edge_quadrature_points[q_point] (0),
1081 (dof, quadrature_point_3, 1)
1083 ((i + 4 * j) * this->
degree,
1086 ((i + 4 * j) * this->
degree,
1087 quadrature_point_0, 1));
1088 tmp (1) = -1.0 * weight
1090 ((i + 4 * j) * this->degree,
1093 ((i + 4 * j) * this->degree,
1094 quadrature_point_0, 1);
1096 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0),
1100 (dof, quadrature_point_3, 0)
1102 ((i + 4 * j + 2) * this->
degree,
1104 * this->shape_value_component
1105 ((i + 4 * j + 2) * this->
degree,
1106 quadrature_point_1, 0));
1107 tmp (3) = -1.0 * weight
1109 ((i + 4 * j + 2) * this->
degree,
1111 * this->shape_value_component
1112 ((i + 4 * j + 2) * this->
degree,
1113 quadrature_point_1, 0);
1115 2.0 * edge_quadrature_points[q_point] (0));
1118 (dof, quadrature_point_3, 2)
1120 ((i + 2 * (j + 4)) * this->
degree,
1122 * this->shape_value_component
1123 ((i + 2 * (j + 4)) * this->degree,
1124 quadrature_point_2, 2));
1125 tmp (5) = -1.0 * weight
1127 ((i + 2 * (j + 4)) * this->
degree,
1129 * this->shape_value_component
1130 ((i + 2 * (j + 4)) * this->
degree,
1131 quadrature_point_2, 2);
1136 tmp (0) = -1.0 * weight
1138 ((i + 4 * j) * this->
degree,
1141 ((i + 4 * j) * this->
degree,
1142 quadrature_point_0, 1);
1145 2.0 * edge_quadrature_points[q_point] (0)
1150 (dof, quadrature_point_3, 1)
1152 ((i + 4 * j) * this->degree,
1155 ((i + 4 * j) * this->degree,
1156 quadrature_point_0, 1));
1157 tmp (2) = -1.0 * weight
1159 ((i + 4 * j + 2) * this->
degree,
1161 * this->shape_value_component
1162 ((i + 4 * j + 2) * this->
degree,
1163 quadrature_point_1, 0);
1165 =
Point<dim> (2.0 * edge_quadrature_points[q_point] (0)
1169 (dof, quadrature_point_3, 0)
1171 ((i + 4 * j + 2) * this->
degree,
1173 * this->shape_value_component
1174 ((i + 4 * j + 2) * this->
degree,
1175 quadrature_point_1, 0));
1176 tmp (4) = -1.0 * weight
1178 ((i + 2 * (j + 4)) * this->
degree,
1180 * this->shape_value_component
1181 ((i + 2 * (j + 4)) * this->degree,
1182 quadrature_point_2, 2);
1184 2.0 * edge_quadrature_points[q_point] (0)
1188 (dof, quadrature_point_3, 2)
1189 - this->restriction[index][i + 2 * (j + 2)]
1190 ((i + 2 * (j + 4)) * this->
degree,
1192 * this->shape_value_component
1193 ((i + 2 * (j + 4)) * this->
degree,
1194 quadrature_point_2, 2));
1197 for (
unsigned int k = 0; k < deg; ++k)
1200 = legendre_polynomials[k + 1].value
1201 (edge_quadrature_points[q_point] (0));
1203 for (
unsigned int l = 0; l < tmp.
size (); ++l)
1204 system_rhs (k, l) += tmp (l) * L_k;
1208 system_matrix_inv.
mmult (solution, system_rhs);
1210 for (
unsigned int k = 0; k < 2; ++k)
1211 for (
unsigned int l = 0; l < deg; ++l)
1213 if (std::abs (solution (l, k)) > 1e-14)
1215 ((i + 4 * j) * this->
degree + l + 1, dof)
1218 if (std::abs (solution (l, k + 2)) > 1e-14)
1220 ((i + 4 * j + 2) * this->
degree + l + 1, dof)
1221 = solution (l, k + 2);
1223 if (std::abs (solution (l, k + 4)) > 1e-14)
1225 ((i + 2 * (j + 4)) * this->
degree + l + 1,
1227 = solution (l, k + 4);
1232 const std::vector<Point<2> > &face_quadrature_points
1234 const std::vector<Polynomials::Polynomial<double> > &
1238 const unsigned int n_edge_dofs
1240 const unsigned int &n_face_quadrature_points
1241 = face_quadrature.
size ();
1245 (deg * this->degree,
1246 n_face_quadrature_points);
1248 for (
unsigned int q_point = 0;
1249 q_point < n_face_quadrature_points; ++q_point)
1252 = std::sqrt (face_quadrature.
weight (q_point));
1254 for (
unsigned int i = 0; i <= deg; ++i)
1256 const double L_i = weight
1257 * legendre_polynomials[i].value
1258 (face_quadrature_points[q_point] (0));
1260 for (
unsigned int j = 0; j < deg; ++j)
1261 assembling_matrix (i * deg + j, q_point)
1262 = L_i * lobatto_polynomials[j + 2].value
1263 (face_quadrature_points[q_point] (1));
1268 assembling_matrix.
m ());
1270 assembling_matrix.
mTmult (system_matrix,
1272 system_matrix_inv.
reinit (system_matrix.m (),
1273 system_matrix.m ());
1274 system_matrix_inv.
invert (system_matrix);
1277 solution.
reinit (system_matrix_inv.
m (), 24);
1278 system_rhs.
reinit (system_matrix_inv.
m (), 24);
1281 for (
unsigned int i = 0; i < 2; ++i)
1282 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1286 for (
unsigned int q_point = 0;
1287 q_point < n_face_quadrature_points; ++q_point)
1291 if (face_quadrature_points[q_point] (0) < 0.5)
1293 if (face_quadrature_points[q_point] (1) < 0.5)
1296 2.0 * face_quadrature_points[q_point] (0),
1297 2.0 * face_quadrature_points[q_point] (1));
1300 (dof, quadrature_point_0, 1);
1302 (dof, quadrature_point_0, 2);
1304 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0),
1306 2.0 * face_quadrature_points[q_point] (1));
1308 (dof, quadrature_point_0, 2);
1310 (dof, quadrature_point_0, 0);
1312 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0),
1313 2.0 * face_quadrature_points[q_point] (1),
1316 (dof, quadrature_point_0, 0);
1318 (dof, quadrature_point_0, 1);
1324 2.0 * face_quadrature_points[q_point] (0),
1325 2.0 * face_quadrature_points[q_point] (1)
1329 (dof, quadrature_point_0, 1);
1331 (dof, quadrature_point_0, 2);
1333 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0),
1335 2.0 * face_quadrature_points[q_point] (1)
1338 (dof, quadrature_point_0, 2);
1340 (dof, quadrature_point_0, 0);
1342 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0),
1343 2.0 * face_quadrature_points[q_point] (1)
1346 (dof, quadrature_point_0, 0);
1348 (dof, quadrature_point_0, 1);
1352 else if (face_quadrature_points[q_point] (1) < 0.5)
1355 2.0 * face_quadrature_points[q_point] (0)
1357 2.0 * face_quadrature_points[q_point] (1));
1360 (dof, quadrature_point_0, 1);
1362 (dof, quadrature_point_0, 2);
1364 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0)
1366 2.0 * face_quadrature_points[q_point] (1));
1368 (dof, quadrature_point_0, 2);
1370 (dof, quadrature_point_0, 0);
1372 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0)
1374 2.0 * face_quadrature_points[q_point] (1),
1377 (dof, quadrature_point_0, 0);
1379 (dof, quadrature_point_0, 1);
1385 2.0 * face_quadrature_points[q_point] (0)
1387 2.0 * face_quadrature_points[q_point] (1)
1391 (dof, quadrature_point_0, 1);
1393 (dof, quadrature_point_0, 2);
1395 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0)
1397 2.0 * face_quadrature_points[q_point] (1)
1400 (dof, quadrature_point_0, 2);
1402 (dof, quadrature_point_0, 0);
1404 =
Point<dim> (2.0 * face_quadrature_points[q_point] (0)
1406 2.0 * face_quadrature_points[q_point] (1)
1409 (dof, quadrature_point_0, 0);
1411 (dof, quadrature_point_0, 1);
1415 face_quadrature_points[q_point] (0),
1416 face_quadrature_points[q_point] (1));
1418 (face_quadrature_points[q_point] (0),
1420 face_quadrature_points[q_point] (1));
1422 (face_quadrature_points[q_point] (0),
1423 face_quadrature_points[q_point] (1),
1426 for (
unsigned int j = 0; j < 2; ++j)
1427 for (
unsigned int k = 0; k < 2; ++k)
1428 for (
unsigned int l = 0; l <= deg; ++l)
1430 tmp (2 * (j + 2 * k))
1432 ((i + 4 * j) * this->degree + l, dof)
1434 ((i + 4 * j) * this->degree + l,
1435 quadrature_point_0, 1);
1436 tmp (2 * (j + 2 * k) + 1)
1438 ((i + 2 * (k + 4)) * this->degree + l,
1441 ((i + 2 * (k + 4)) * this->degree + l,
1442 quadrature_point_0, 2);
1443 tmp (2 * (j + 2 * (k + 2)))
1445 ((2 * (i + 4) + k) * this->degree + l,
1448 ((2 * (i + 4) + k) * this->degree + l,
1449 quadrature_point_1, 2);
1450 tmp (2 * (j + 2 * k) + 9)
1452 ((i + 4 * j + 2) * this->degree + l,
1455 ((i + 4 * j + 2) * this->degree + l,
1456 quadrature_point_1, 0);
1457 tmp (2 * (j + 2 * (k + 4)))
1459 ((4 * i + j + 2) * this->degree + l,
1462 ((4 * i + j + 2) * this->degree + l,
1463 quadrature_point_2, 0);
1464 tmp (2 * (j + 2 * k) + 17)
1466 ((4 * i + k) * this->degree + l, dof)
1468 ((4 * i + k) * this->degree + l,
1469 quadrature_point_2, 1);
1472 tmp *= face_quadrature.
weight (q_point);
1474 for (
unsigned int j = 0; j <= deg; ++j)
1477 = legendre_polynomials[j].value
1478 (face_quadrature_points[q_point] (0));
1480 = legendre_polynomials[j].value
1481 (face_quadrature_points[q_point] (1));
1483 for (
unsigned int k = 0; k < deg; ++k)
1486 = L_j_0 * lobatto_polynomials[k + 2].value
1487 (face_quadrature_points[q_point] (1));
1489 = L_j_1 * lobatto_polynomials[k + 2].value
1490 (face_quadrature_points[q_point] (0));
1492 for (
unsigned int l = 0; l < 4; ++l)
1494 system_rhs (j * deg + k, 2 * l)
1495 += tmp (2 * l) * l_k_0;
1496 system_rhs (j * deg + k, 2 * l + 1)
1497 += tmp (2 * l + 1) * l_k_1;
1498 system_rhs (j * deg + k, 2 * (l + 4))
1499 += tmp (2 * (l + 4)) * l_k_1;
1500 system_rhs (j * deg + k, 2 * l + 9)
1501 += tmp (2 * l + 9) * l_k_0;
1502 system_rhs (j * deg + k, 2 * (l + 8))
1503 += tmp (2 * (l + 8)) * l_k_0;
1504 system_rhs (j * deg + k, 2 * l + 17)
1505 += tmp (2 * l + 17) * l_k_1;
1511 system_matrix_inv.
mmult (solution, system_rhs);
1513 for (
unsigned int j = 0; j < 2; ++j)
1514 for (
unsigned int k = 0; k < 2; ++k)
1515 for (
unsigned int l = 0; l <= deg; ++l)
1516 for (
unsigned int m = 0; m < deg; ++m)
1518 if (std::abs (solution (l * deg + m,
1522 ((2 * i * this->degree + l) * deg + m
1524 dof) = solution (l * deg + m,
1527 if (std::abs (solution (l * deg + m,
1528 2 * (j + 2 * k) + 1))
1531 (((2 * i + 1) * deg + m) * this->degree + l
1533 = solution (l * deg + m,
1534 2 * (j + 2 * k) + 1);
1536 if (std::abs (solution (l * deg + m,
1537 2 * (j + 2 * (k + 2))))
1540 ((2 * (i + 2) * this->degree + l) * deg + m
1542 dof) = solution (l * deg + m,
1543 2 * (j + 2 * (k + 2)));
1545 if (std::abs (solution (l * deg + m,
1546 2 * (j + 2 * k) + 9))
1549 (((2 * i + 5) * deg + m) * this->degree + l
1551 = solution (l * deg + m,
1552 2 * (j + 2 * k) + 9);
1554 if (std::abs (solution (l * deg + m,
1555 2 * (j + 2 * (k + 4))))
1558 ((2 * (i + 4) * this->degree + l) * deg + m
1560 dof) = solution (l * deg + m,
1561 2 * (j + 2 * (k + 4)));
1563 if (std::abs (solution (l * deg + m,
1564 2 * (j + 2 * k) + 17))
1567 (((2 * i + 9) * deg + m) * this->degree + l
1569 = solution (l * deg + m,
1570 2 * (j + 2 * k) + 17);
1575 const std::vector<Point<dim> > &
1576 quadrature_points = quadrature.get_points ();
1577 const unsigned int n_boundary_dofs
1580 const unsigned int &n_quadrature_points = quadrature.size ();
1584 assembling_matrix (deg * deg * this->degree,
1585 n_quadrature_points);
1587 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
1590 const double weight = std::sqrt (quadrature.weight
1593 for (
unsigned int i = 0; i <= deg; ++i)
1595 const double L_i = weight
1596 * legendre_polynomials[i].value
1597 (quadrature_points[q_point] (0));
1599 for (
unsigned int j = 0; j < deg; ++j)
1602 = L_i * lobatto_polynomials[j + 2].value
1603 (quadrature_points[q_point] (1));
1605 for (
unsigned int k = 0; k < deg; ++k)
1606 assembling_matrix ((i * deg + j) * deg + k,
1608 = l_j * lobatto_polynomials[k + 2].value
1609 (quadrature_points[q_point] (2));
1615 assembling_matrix.
m ());
1617 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
1618 system_matrix_inv.
reinit (system_matrix.m (),
1619 system_matrix.m ());
1620 system_matrix_inv.
invert (system_matrix);
1623 solution.
reinit (system_matrix_inv.
m (), 24);
1624 system_rhs.
reinit (system_matrix_inv.
m (), 24);
1627 for (
unsigned int dof = 0; dof < this->
dofs_per_cell; ++dof)
1631 for (
unsigned int q_point = 0;
1632 q_point < n_quadrature_points; ++q_point)
1636 if (quadrature_points[q_point] (0) < 0.5)
1638 if (quadrature_points[q_point] (1) < 0.5)
1640 if (quadrature_points[q_point] (2) < 0.5)
1643 (2.0 * quadrature_points[q_point] (0),
1644 2.0 * quadrature_points[q_point] (1),
1645 2.0 * quadrature_points[q_point] (2));
1648 (dof, quadrature_point, 0);
1650 (dof, quadrature_point, 1);
1652 (dof, quadrature_point, 2);
1658 (2.0 * quadrature_points[q_point] (0),
1659 2.0 * quadrature_points[q_point] (1),
1660 2.0 * quadrature_points[q_point] (2)
1664 (dof, quadrature_point, 0);
1666 (dof, quadrature_point, 1);
1668 (dof, quadrature_point, 2);
1672 else if (quadrature_points[q_point] (2) < 0.5)
1675 (2.0 * quadrature_points[q_point] (0),
1676 2.0 * quadrature_points[q_point] (1)
1678 2.0 * quadrature_points[q_point] (2));
1681 (dof, quadrature_point, 0);
1683 (dof, quadrature_point, 1);
1685 (dof, quadrature_point, 2);
1691 (2.0 * quadrature_points[q_point] (0),
1692 2.0 * quadrature_points[q_point] (1)
1694 2.0 * quadrature_points[q_point] (2)
1698 (dof, quadrature_point, 0);
1700 (dof, quadrature_point, 1);
1702 (dof, quadrature_point, 2);
1706 else if (quadrature_points[q_point] (1) < 0.5)
1708 if (quadrature_points[q_point] (2) < 0.5)
1711 (2.0 * quadrature_points[q_point] (0)
1713 2.0 * quadrature_points[q_point] (1),
1714 2.0 * quadrature_points[q_point] (2));
1717 (dof, quadrature_point, 0);
1719 (dof, quadrature_point, 1);
1721 (dof, quadrature_point, 2);
1727 (2.0 * quadrature_points[q_point] (0)
1729 2.0 * quadrature_points[q_point] (1),
1730 2.0 * quadrature_points[q_point] (2)
1734 (dof, quadrature_point, 0);
1736 (dof, quadrature_point, 1);
1738 (dof, quadrature_point, 2);
1742 else if (quadrature_points[q_point] (2) < 0.5)
1745 (2.0 * quadrature_points[q_point] (0)
1747 2.0 * quadrature_points[q_point] (1)
1749 2.0 * quadrature_points[q_point] (2));
1752 (dof, quadrature_point, 0);
1754 (dof, quadrature_point, 1);
1756 (dof, quadrature_point, 2);
1762 (2.0 * quadrature_points[q_point] (0)
1764 2.0 * quadrature_points[q_point] (1)
1766 2.0 * quadrature_points[q_point] (2)
1770 (dof, quadrature_point, 0);
1772 (dof, quadrature_point, 1);
1774 (dof, quadrature_point, 2);
1777 for (
unsigned int i = 0; i < 2; ++i)
1778 for (
unsigned int j = 0; j < 2; ++j)
1779 for (
unsigned int k = 0; k < 2; ++k)
1780 for (
unsigned int l = 0; l <= deg; ++l)
1782 tmp (3 * (i + 2 * (j + 2 * k)))
1784 ((4 * i + j + 2) * this->degree + l, dof)
1786 ((4 * i + j + 2) * this->degree + l,
1787 quadrature_points[q_point], 0);
1788 tmp (3 * (i + 2 * (j + 2 * k)) + 1)
1790 ((4 * i + k) * this->degree + l, dof)
1792 ((4 * i + k) * this->degree + l,
1793 quadrature_points[q_point], 1);
1794 tmp (3 * (i + 2 * (j + 2 * k)) + 2)
1796 ((2 * (j + 4) + k) * this->degree + l,
1799 ((2 * (j + 4) + k) * this->degree + l,
1800 quadrature_points[q_point], 2);
1802 for (
unsigned int m = 0; m < deg; ++m)
1804 tmp (3 * (i + 2 * (j + 2 * k)))
1806 (((2 * j + 5) * deg + m)
1807 * this->degree + l + n_edge_dofs,
1810 (((2 * j + 5) * deg + m)
1811 * this->degree + l + n_edge_dofs,
1812 quadrature_points[q_point], 0);
1813 tmp (3 * (i + 2 * (j + 2 * k)))
1815 ((2 * (i + 4) * this->degree + l)
1816 * deg + m + n_edge_dofs, dof)
1818 ((2 * (i + 4) * this->degree + l)
1819 * deg + m + n_edge_dofs,
1820 quadrature_points[q_point], 0);
1821 tmp (3 * (i + 2 * (j + 2 * k)) + 1)
1823 ((2 * k * this->degree + l) * deg + m
1827 ((2 * k * this->degree + l) * deg + m
1829 quadrature_points[q_point], 1);
1830 tmp (3 * (i + 2 * (j + 2 * k)) + 1)
1832 (((2 * i + 9) * deg + m)
1833 * this->degree + l + n_edge_dofs,
1836 (((2 * i + 9) * deg + m)
1837 * this->degree + l + n_edge_dofs,
1838 quadrature_points[q_point], 1);
1839 tmp (3 * (i + 2 * (j + 2 * k)) + 2)
1841 (((2 * k + 1) * deg + m)
1842 * this->degree + l + n_edge_dofs,
1845 (((2 * k + 1) * deg + m)
1846 * this->degree + l + n_edge_dofs,
1847 quadrature_points[q_point], 2);
1848 tmp (3 * (i + 2 * (j + 2 * k)) + 2)
1850 ((2 * (j + 2) * this->degree + l)
1851 * deg + m + n_edge_dofs, dof)
1853 ((2 * (j + 2) * this->degree + l)
1854 * deg + m + n_edge_dofs,
1855 quadrature_points[q_point], 2);
1859 tmp *= quadrature.weight (q_point);
1861 for (
unsigned int i = 0; i <= deg; ++i)
1864 = legendre_polynomials[i].value
1865 (quadrature_points[q_point] (0));
1867 = legendre_polynomials[i].value
1868 (quadrature_points[q_point] (1));
1870 = legendre_polynomials[i].value
1871 (quadrature_points[q_point] (2));
1873 for (
unsigned int j = 0; j < deg; ++j)
1876 = L_i_0 * lobatto_polynomials[j + 2].value
1877 (quadrature_points[q_point] (1));
1879 = L_i_1 * lobatto_polynomials[j + 2].value
1880 (quadrature_points[q_point] (0));
1882 = L_i_2 * lobatto_polynomials[j + 2].value
1883 (quadrature_points[q_point] (0));
1885 for (
unsigned int k = 0; k < deg; ++k)
1888 = l_j_0 * lobatto_polynomials[k + 2].value
1889 (quadrature_points[q_point] (2));
1891 = l_j_1 * lobatto_polynomials[k + 2].value
1892 (quadrature_points[q_point] (2));
1894 = l_j_2 * lobatto_polynomials[k + 2].value
1895 (quadrature_points[q_point] (1));
1897 for (
unsigned int l = 0; l < 8; ++l)
1899 system_rhs ((i * deg + j) * deg + k,
1901 += tmp (3 * l) * l_k_0;
1902 system_rhs ((i * deg + j) * deg + k,
1904 += tmp (3 * l + 1) * l_k_1;
1905 system_rhs ((i * deg + j) * deg + k,
1907 += tmp (3 * l + 2) * l_k_2;
1914 system_matrix_inv.
mmult (solution, system_rhs);
1916 for (
unsigned int i = 0; i < 2; ++i)
1917 for (
unsigned int j = 0; j < 2; ++j)
1918 for (
unsigned int k = 0; k < 2; ++k)
1919 for (
unsigned int l = 0; l <= deg; ++l)
1920 for (
unsigned int m = 0; m < deg; ++m)
1921 for (
unsigned int n = 0; n < deg; ++n)
1923 if (std::abs (solution
1924 ((l * deg + m) * deg + n,
1925 3 * (i + 2 * (j + 2 * k))))
1928 ((l * deg + m) * deg + n + n_boundary_dofs,
1929 dof) = solution ((l * deg + m) * deg + n,
1930 3 * (i + 2 * (j + 2 * k)));
1932 if (std::abs (solution
1933 ((l * deg + m) * deg + n,
1934 3 * (i + 2 * (j + 2 * k)) + 1))
1937 ((l + (m + deg) * this->degree) * deg + n
1939 dof) = solution ((l * deg + m) * deg + n,
1940 3 * (i + 2 * (j + 2 * k)) + 1);
1942 if (std::abs (solution
1943 ((l * deg + m) * deg + n,
1944 3 * (i + 2 * (j + 2 * k)) + 2))
1947 (l + ((m + 2 * deg) * deg + n) * this->degree
1948 + n_boundary_dofs, dof)
1949 = solution ((l * deg + m) * deg + n,
1950 3 * (i + 2 * (j + 2 * k)) + 2);
1959 Assert (
false, ExcNotImplemented ());
1966 std::vector<unsigned int>
1969 std::vector<unsigned int> dpo (dim + 1);
1978 dpo[1] = degree + 1;
1979 dpo[2] = 2 * degree * (degree + 1);
1982 dpo[3] = 3 * degree * degree * (degree + 1);
2004 const unsigned int face_index)
const 2007 ExcIndexRange (shape_index, 0, this->dofs_per_cell));
2011 const unsigned int deg = this->
degree-1;
2018 if (!((shape_index > deg) && (shape_index < 2 * this->
degree)))
2025 if ((shape_index > deg) &&
2034 if (shape_index < 3 * this->degree)
2041 if (!((shape_index >= 2 * this->degree) &&
2042 (shape_index < 3 * this->degree)))
2050 Assert (
false, ExcNotImplemented ());
2059 if (((shape_index > deg) && (shape_index < 2 * this->
degree)) ||
2060 ((shape_index >= 5 * this->degree) &&
2061 (shape_index < 6 * this->degree)) ||
2062 ((shape_index >= 9 * this->degree) &&
2063 (shape_index < 10 * this->degree)) ||
2064 ((shape_index >= 11 * this->degree) &&
2097 if (((shape_index > deg) && (shape_index < 4 * this->degree)) ||
2098 ((shape_index >= 5 * this->degree) &&
2099 (shape_index < 8 * this->degree)) ||
2100 ((shape_index >= 9 * this->degree) &&
2101 (shape_index < 10 * this->degree)) ||
2102 ((shape_index >= 11 * this->degree) &&
2135 if ((shape_index < 3 * this->degree) ||
2136 ((shape_index >= 4 * this->degree) &&
2137 (shape_index < 7 * this->degree)) ||
2138 ((shape_index >= 8 * this->degree) &&
2139 (shape_index < 10 * this->degree)) ||
2170 if ((shape_index < 2 * this->degree) ||
2171 ((shape_index >= 3 * this->degree) &&
2172 (shape_index < 6 * this->degree)) ||
2173 ((shape_index >= 7 * this->degree) &&
2174 (shape_index < 8 * this->degree)) ||
2175 ((shape_index >= 10 * this->degree) &&
2208 if ((shape_index < 4 * this->degree) ||
2209 ((shape_index >= 8 * this->degree) &&
2237 if (((shape_index >= 4 * this->degree) &&
2272 Assert (
false, ExcNotImplemented ());
2279 Assert (
false, ExcNotImplemented ());
2292 if (this->degree < fe_nedelec_other->
degree)
2293 return FiniteElementDomination::this_element_dominates;
2294 else if (this->degree == fe_nedelec_other->degree)
2295 return FiniteElementDomination::either_element_can_dominate;
2297 return FiniteElementDomination::other_element_dominates;
2313 if (fe_nothing->is_dominating())
2315 return FiniteElementDomination::other_element_dominates;
2321 return FiniteElementDomination::no_requirements;
2325 Assert (
false, ExcNotImplemented());
2326 return FiniteElementDomination::neither_element_dominates;
2337 std::vector<std::pair<unsigned int, unsigned int> >
2343 return std::vector<std::pair<unsigned int, unsigned int> > ();
2347 std::vector<std::pair<unsigned int, unsigned int> >
2362 std::vector<std::pair<unsigned int, unsigned int> > identities;
2364 for (
unsigned int i = 0;
2365 i < std::min (fe_nedelec_other->degree, this->degree); ++i)
2366 identities.push_back (std::make_pair (i, i));
2377 return std::vector<std::pair<unsigned int, unsigned int> > ();
2382 Assert (
false, ExcNotImplemented ());
2383 return std::vector<std::pair<unsigned int, unsigned int> > ();
2388 std::vector<std::pair<unsigned int, unsigned int> >
2403 const unsigned int p = fe_nedelec_other->degree;
2404 const unsigned int q = this->
degree;
2405 const unsigned int p_min = std::min (p, q);
2406 std::vector<std::pair<unsigned int, unsigned int> > identities;
2408 for (
unsigned int i = 0; i < p_min; ++i)
2409 for (
unsigned int j = 0; j < p_min - 1; ++j)
2411 identities.push_back (std::make_pair (i * (q - 1) + j,
2413 identities.push_back (std::make_pair (i + (j + q - 1) * q,
2414 i + (j + p - 1) * p));
2426 return std::vector<std::pair<unsigned int, unsigned int> > ();
2431 Assert (
false, ExcNotImplemented ());
2432 return std::vector<std::pair<unsigned int, unsigned int> > ();
2456 (dynamic_cast<const FEN *> (&source) != 0),
2457 typename FEL::ExcInterpolationNotImplemented());
2459 ExcDimensionMismatch (interpolation_matrix.
m (),
2462 ExcDimensionMismatch (interpolation_matrix.
n (),
2482 typename FEL::ExcInterpolationNotImplemented ());
2483 interpolation_matrix = 0;
2487 for (
unsigned int i = 0; i <this->
degree; ++i)
2488 interpolation_matrix (i, i) = 1.0;
2498 const unsigned int p = source_fe.
degree;
2499 const unsigned int q = this->
degree;
2501 for (
unsigned int i = 0; i <q; ++i)
2503 for (
int j = 1; j < (int) GeometryInfo<dim>::lines_per_face; ++j)
2504 interpolation_matrix (j * p + i,
2507 for (
unsigned int j = 0; j < q-1; ++j)
2529 Assert (
false, ExcNotImplemented ());
2554 const unsigned int subface,
2564 (dynamic_cast<const FEN *> (&source) != 0),
2565 typename FEL::ExcInterpolationNotImplemented ());
2567 ExcDimensionMismatch (interpolation_matrix.
m (),
2570 ExcDimensionMismatch (interpolation_matrix.
n (),
2590 typename FEL::ExcInterpolationNotImplemented ());
2591 interpolation_matrix = 0.0;
2595 const std::vector<Point<1> > &
2596 edge_quadrature_points = edge_quadrature.
get_points ();
2597 const unsigned int &n_edge_quadrature_points = edge_quadrature.
size ();
2603 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2604 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
2608 0.5 * (edge_quadrature_points[q_point] (0)
2611 interpolation_matrix (0, dof) += 0.5
2612 * edge_quadrature.
weight (q_point)
2614 (dof, quadrature_point, 1);
2617 if (source_fe.
degree > 1)
2619 const std::vector<Polynomials::Polynomial<double> > &
2620 legendre_polynomials
2627 n_edge_quadrature_points);
2629 for (
unsigned int q_point = 0;
2630 q_point < n_edge_quadrature_points; ++q_point)
2633 = std::sqrt (edge_quadrature.
weight (q_point));
2635 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2636 assembling_matrix (i, q_point) = weight
2637 * legendre_polynomials[i + 1].value
2638 (edge_quadrature_points[q_point] (0));
2643 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
2644 system_matrix_inv.
invert (system_matrix);
2650 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2654 for (
unsigned int q_point = 0;
2655 q_point < n_edge_quadrature_points; ++q_point)
2658 0.5 * (edge_quadrature_points[q_point] (0)
2661 edge_quadrature_points[q_point] (0));
2662 const double tmp = edge_quadrature.
weight (q_point)
2664 (dof, quadrature_point_0, 1)
2665 - interpolation_matrix (0,
2668 (0, quadrature_point_1, 1));
2670 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2671 system_rhs (i) += tmp
2672 * legendre_polynomials[i + 1].value
2673 (edge_quadrature_points[q_point] (0));
2676 system_matrix_inv.
vmult (solution, system_rhs);
2678 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2679 if (std::abs (solution (i)) > 1e-14)
2680 interpolation_matrix (i + 1, dof) = solution (i);
2689 const double shifts[4][2] = { { 0.0, 0.0 }, { 1.0, 0.0 },
2690 { 0.0, 1.0 }, { 1.0, 1.0 }
2693 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2694 for (
unsigned int q_point = 0; q_point < n_edge_quadrature_points;
2697 const double weight = 0.5 * edge_quadrature.
weight (q_point);
2699 for (
unsigned int i = 0; i < 2; ++i)
2702 quadrature_point (0.5 * (i + shifts[subface][0]),
2703 0.5 * (edge_quadrature_points[q_point] (0)
2704 + shifts[subface][1]),
2707 interpolation_matrix (i * source_fe.
degree, dof) += weight
2713 =
Point<dim> (0.5 * (edge_quadrature_points[q_point] (0)
2714 + shifts[subface][0]),
2715 0.5 * (i + shifts[subface][1]), 0.0);
2716 interpolation_matrix ((i + 2) * source_fe.
degree, dof)
2719 quadrature_point, 0);
2723 if (source_fe.
degree > 1)
2725 const std::vector<Polynomials::Polynomial<double> > &
2726 legendre_polynomials
2733 n_edge_quadrature_points);
2735 for (
unsigned int q_point = 0;
2736 q_point < n_edge_quadrature_points; ++q_point)
2739 = std::sqrt (edge_quadrature.
weight (q_point));
2741 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2742 assembling_matrix (i, q_point) = weight
2743 * legendre_polynomials[i + 1].value
2744 (edge_quadrature_points[q_point] (0));
2749 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
2750 system_matrix_inv.
invert (system_matrix);
2759 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2763 for (
unsigned int q_point = 0;
2764 q_point < n_edge_quadrature_points; ++q_point)
2766 const double weight = edge_quadrature.
weight (q_point);
2768 for (
unsigned int i = 0; i < 2; ++i)
2772 (0.5 * (i + shifts[subface][0]),
2773 0.5 * (edge_quadrature_points[q_point] (0)
2774 + shifts[subface][1]), 0.0);
2776 edge_quadrature_points[q_point] (0),
2782 quadrature_point_0, 1)
2783 - interpolation_matrix
2784 (i * source_fe.
degree, dof)
2787 quadrature_point_1, 1));
2789 =
Point<dim> (0.5 * (edge_quadrature_points[q_point] (0)
2790 + shifts[subface][0]),
2791 0.5 * (i + shifts[subface][1]),
2794 =
Point<dim> (edge_quadrature_points[q_point] (0),
2796 tmp (i + 2) = weight
2799 quadrature_point_0, 0)
2800 - interpolation_matrix
2801 ((i + 2) * source_fe.
degree,
2804 ((i + 2) * source_fe.
degree,
2805 quadrature_point_1, 0));
2808 for (
unsigned int i = 0; i < source_fe.
degree - 1; ++i)
2811 = legendre_polynomials[i + 1].value
2812 (edge_quadrature_points[q_point] (0));
2814 for (
unsigned int j = 0;
2815 j < GeometryInfo<dim>::lines_per_face; ++j)
2816 system_rhs (i, j) += tmp (j) * L_i;
2820 system_matrix_inv.
mmult (solution, system_rhs);
2822 for (
unsigned int i = 0;
2823 i < GeometryInfo<dim>::lines_per_face; ++i)
2824 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2825 if (std::abs (solution (j, i)) > 1e-14)
2826 interpolation_matrix (i * source_fe.
degree + j + 1,
2827 dof) = solution (j, i);
2831 const std::vector<Point<2> > &
2832 quadrature_points = quadrature.
get_points ();
2833 const std::vector<Polynomials::Polynomial<double> > &
2837 const unsigned int n_boundary_dofs
2839 const unsigned int &n_quadrature_points = quadrature.
size ();
2843 assembling_matrix (source_fe.
degree * (source_fe.
degree - 1),
2844 n_quadrature_points);
2846 for (
unsigned int q_point = 0; q_point < n_quadrature_points;
2849 const double weight = std::sqrt (quadrature.
weight (q_point));
2851 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2853 const double L_i = weight
2854 * legendre_polynomials[i].value
2855 (quadrature_points[q_point] (0));
2857 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2858 assembling_matrix (i * (source_fe.
degree - 1) + j,
2860 = L_i * lobatto_polynomials[j + 2].value
2861 (quadrature_points[q_point] (1));
2866 assembling_matrix.
m ());
2868 assembling_matrix.
mTmult (system_matrix, assembling_matrix);
2869 system_matrix_inv.
reinit (system_matrix.m (),
2870 system_matrix.m ());
2871 system_matrix_inv.
invert (system_matrix);
2874 solution.
reinit (system_matrix_inv.
m (), 2);
2875 system_rhs.
reinit (system_matrix_inv.
m (), 2);
2878 for (
unsigned int dof = 0; dof < this->
dofs_per_face; ++dof)
2882 for (
unsigned int q_point = 0;
2883 q_point < n_quadrature_points; ++q_point)
2887 (0.5 * (quadrature_points[q_point] (0)
2888 + shifts[subface][0]),
2889 0.5 * (quadrature_points[q_point] (1)
2890 + shifts[subface][1]), 0.0);
2893 quadrature_point, 0);
2896 quadrature_point, 1);
2898 =
Point<dim> (quadrature_points[q_point] (0),
2899 quadrature_points[q_point] (1), 0.0);
2901 for (
unsigned int i = 0; i < 2; ++i)
2902 for (
unsigned int j = 0; j < source_fe.
degree; ++j)
2904 tmp (0) -= interpolation_matrix
2905 ((i + 2) * source_fe.
degree + j, dof)
2907 ((i + 2) * source_fe.
degree + j,
2908 quadrature_point, 0);
2909 tmp (1) -= interpolation_matrix
2910 (i * source_fe.
degree + j, dof)
2912 (i * source_fe.
degree + j,
2913 quadrature_point, 1);
2916 tmp *= quadrature.
weight (q_point);
2918 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2920 const double L_i_0 = legendre_polynomials[i].value
2921 (quadrature_points[q_point] (0));
2922 const double L_i_1 = legendre_polynomials[i].value
2923 (quadrature_points[q_point] (1));
2925 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2927 system_rhs (i * (source_fe.
degree - 1) + j, 0)
2929 * lobatto_polynomials[j + 2].value
2930 (quadrature_points[q_point] (1));
2931 system_rhs (i * (source_fe.
degree - 1) + j, 1)
2933 * lobatto_polynomials[j + 2].value
2934 (quadrature_points[q_point] (0));
2939 system_matrix_inv.
mmult (solution, system_rhs);
2941 for (
unsigned int i = 0; i < source_fe.
degree; ++i)
2942 for (
unsigned int j = 0; j < source_fe.
degree - 1; ++j)
2944 if (std::abs (solution (i * (source_fe.
degree - 1) + j, 0))
2946 interpolation_matrix (i * (source_fe.
degree - 1)
2947 + j + n_boundary_dofs, dof)
2948 = solution (i * (source_fe.
degree - 1) + j, 0);
2950 if (std::abs (solution (i * (source_fe.
degree - 1) + j, 1))
2952 interpolation_matrix (i + (j + source_fe.
degree - 1)
2954 + n_boundary_dofs, dof)
2955 = solution (i * (source_fe.
degree - 1) + j, 1);
2964 Assert (
false, ExcNotImplemented ());
2977 ExcMessage(
"Prolongation matrices are only available for refined cells!"));
2982 if (this->
prolongation[refinement_case-1][child].n() == 0)
2987 if (this->
prolongation[refinement_case-1][child].n() ==
3000 #ifdef DEBUG_NEDELEC 3001 deallog <<
"Embedding" << std::endl;
3006 #ifdef DEBUG_NEDELEC 3007 deallog <<
"Restriction" << std::endl;
3027 ExcMessage(
"Restriction matrices are only available for refined cells!"));
3032 if (this->
restriction[refinement_case-1][child].n() == 0)
3037 if (this->
restriction[refinement_case-1][child].n() ==
3039 return this->
restriction[refinement_case-1][child];
3050 #ifdef DEBUG_NEDELEC 3051 deallog <<
"Embedding" << std::endl;
3056 #ifdef DEBUG_NEDELEC 3057 deallog <<
"Restriction" << std::endl;
3065 return this->
restriction[refinement_case-1][child];
3073 Assert(
false, ExcNotImplemented ());
3087 unsigned int offset)
const 3089 const unsigned int deg = this->
degree-1;
3092 ExcDimensionMismatch (values.size (),
3095 ExcDimensionMismatch (local_dofs.size (),this->
dofs_per_cell));
3097 ExcDimensionMismatch (values[0].size (),
3099 std::fill (local_dofs.begin (), local_dofs.end (), 0.);
3107 const unsigned int &n_edge_points
3108 = reference_edge_quadrature.
size ();
3112 for (
unsigned int i = 0; i < 2; ++i)
3114 for (
unsigned int q_point = 0; q_point < n_edge_points;
3116 local_dofs[i * this->
degree]
3117 += reference_edge_quadrature.
weight (q_point)
3118 * values[q_point + i * n_edge_points] (1);
3124 if (std::abs (local_dofs[i * this->
degree]) < 1e-14)
3125 local_dofs[i * this->degree] = 0.0;
3129 for (
unsigned int i = 0; i < 2; ++i)
3131 for (
unsigned int q_point = 0; q_point < n_edge_points;
3133 local_dofs[(i + 2) * this->
degree]
3134 += reference_edge_quadrature.
weight (q_point)
3135 * values[q_point + (i + 2) * n_edge_points] (0);
3137 if (std::abs (local_dofs[(i + 2) * this->
degree]) < 1e-14)
3138 local_dofs[(i + 2) * this->
degree] = 0.0;
3156 const std::vector<Polynomials::Polynomial<double> > &
3163 std::vector<Polynomials::Polynomial<double> >
3164 lobatto_polynomials_grad (this->
degree);
3166 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size ();
3168 lobatto_polynomials_grad[i]
3169 = lobatto_polynomials[i + 1].derivative ();
3176 for (
unsigned int i = 0; i < system_matrix.
m (); ++i)
3177 for (
unsigned int j = 0; j < system_matrix.
n (); ++j)
3178 for (
unsigned int q_point = 0; q_point < n_edge_points;
3180 system_matrix (i, j)
3182 * lobatto_polynomials_grad[i + 1].value
3188 system_matrix_inv.
invert (system_matrix);
3193 for (
unsigned int line = 0;
3194 line < GeometryInfo<dim>::lines_per_cell; ++line)
3195 if ((line < 2) || (offset == 0))
3200 for (
unsigned int q_point = 0; q_point < n_edge_points;
3204 = values[line * n_edge_points + q_point]
3205 (line_coordinate[line])
3206 - local_dofs[line * this->
degree]
3212 line_coordinate[line]);
3214 for (
unsigned int i = 0; i < system_rhs.size ();
3220 system_matrix_inv.
vmult (solution, system_rhs);
3226 for (
unsigned int i = 0; i < solution.size (); ++i)
3227 if (std::abs (solution (i)) > 1e-14)
3228 local_dofs[line * this->
degree + i + 1]
3242 const std::vector<Polynomials::Polynomial<double> > &
3243 legendre_polynomials
3245 const unsigned int &n_interior_points
3246 = reference_quadrature.
size ();
3252 for (
unsigned int i = 0; i < this->
degree; ++i)
3253 for (
unsigned int j = 0; j < this->degree-1; ++j)
3254 for (
unsigned int k = 0; k < this->
degree; ++k)
3255 for (
unsigned int l = 0; l < this->degree-1; ++l)
3256 for (
unsigned int q_point = 0;
3257 q_point < n_interior_points; ++q_point)
3258 system_matrix (i * (this->degree-1) + j, k * (this->degree-1) + l)
3259 += reference_quadrature.
weight (q_point)
3260 * legendre_polynomials[i].value
3265 * lobatto_polynomials[j + 2].value
3270 * lobatto_polynomials_grad[k].value
3275 * lobatto_polynomials[l + 2].value
3281 system_matrix_inv.
reinit (system_matrix.
m (),
3282 system_matrix.
m ());
3283 system_matrix_inv.
invert (system_matrix);
3284 solution.reinit (system_matrix_inv.
m ());
3285 system_rhs.reinit (system_matrix.
m ());
3294 for (
unsigned int q_point = 0;
3295 q_point < n_interior_points; ++q_point)
3299 * n_edge_points] (0);
3301 for (
unsigned int i = 0; i < 2; ++i)
3302 for (
unsigned int j = 0; j < this->
degree; ++j)
3303 tmp -= local_dofs[(i + 2) * this->degree + j]
3305 ((i + 2) * this->degree + j,
3311 for (
unsigned int i = 0; i < this->
degree; ++i)
3312 for (
unsigned int j = 0; j < this->degree-1; ++j)
3313 system_rhs (i * (this->degree-1) + j)
3314 += reference_quadrature.
weight (q_point) * tmp
3315 * lobatto_polynomials_grad[i].value
3320 * lobatto_polynomials[j + 2].value
3327 system_matrix_inv.
vmult (solution, system_rhs);
3333 for (
unsigned int i = 0; i < this->
degree; ++i)
3334 for (
unsigned int j = 0; j < this->degree-1; ++j)
3335 if (std::abs (solution (i * (this->degree-1) + j)) > 1e-14)
3337 * (this->degree-1) + j
3339 = solution (i * (this->degree-1) + j);
3347 for (
unsigned int q_point = 0; q_point < n_interior_points;
3352 * n_edge_points] (1);
3354 for (
unsigned int i = 0; i < 2; ++i)
3355 for (
unsigned int j = 0; j < this->
degree; ++j)
3356 tmp -= local_dofs[i * this->degree + j]
3358 (i * this->degree + j,
3364 for (
unsigned int i = 0; i < this->
degree; ++i)
3365 for (
unsigned int j = 0; j < this->degree-1; ++j)
3366 system_rhs (i * (this->degree-1) + j)
3367 += reference_quadrature.
weight (q_point) * tmp
3368 * lobatto_polynomials_grad[i].value
3373 * lobatto_polynomials[j + 2].value
3380 system_matrix_inv.
vmult (solution, system_rhs);
3386 for (
unsigned int i = 0; i < this->
degree; ++i)
3387 for (
unsigned int j = 0; j < this->degree-1; ++j)
3388 if (std::abs (solution (i * (this->degree-1) + j)) > 1e-14)
3390 + this->degree-1) * this->degree]
3391 = solution (i * (this->degree-1) + j);
3400 reference_edge_quadrature (this->
degree);
3401 const unsigned int &
3402 n_edge_points = reference_edge_quadrature.
size ();
3406 for (
unsigned int i = 0; i < 4; ++i)
3408 for (
unsigned int q_point = 0; q_point < n_edge_points;
3410 local_dofs[(i + 8) * this->
degree]
3411 += reference_edge_quadrature.
weight (q_point)
3412 * values[q_point + (i + 8) * n_edge_points] (2);
3418 if (std::abs (local_dofs[(i + 8) * this->
degree]) < 1e-14)
3419 local_dofs[(i + 8) * this->
degree] = 0.0;
3422 if (offset + 1 < dim)
3424 for (
unsigned int i = 0; i < 2; ++i)
3425 for (
unsigned int j = 0; j < 2; ++j)
3427 for (
unsigned int q_point = 0; q_point < n_edge_points;
3429 local_dofs[(i + 4 * j) * this->
degree]
3430 += reference_edge_quadrature.
weight (q_point)
3431 * values[q_point + (i + 4 * j) * n_edge_points]
3438 if (std::abs (local_dofs[(i + 4 * j) * this->
degree])
3440 local_dofs[(i + 4 * j) * this->degree] = 0.0;
3444 for (
unsigned int i = 0; i < 2; ++i)
3445 for (
unsigned int j = 0; j < 2; ++j)
3447 for (
unsigned int q_point = 0;
3448 q_point < n_edge_points; ++q_point)
3449 local_dofs[(i + 4 * j + 2) * this->
degree]
3450 += reference_edge_quadrature.
weight (q_point)
3451 * values[q_point + (i + 4 * j + 2)
3452 * n_edge_points] (0);
3458 if (std::abs (local_dofs[(i + 4 * j + 2)
3459 * this->
degree]) < 1e-14)
3460 local_dofs[(i + 4 * j + 2) * this->
degree] = 0.0;
3478 const std::vector<Polynomials::Polynomial<double> > &
3484 = {1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2};
3487 std::vector<Polynomials::Polynomial<double> >
3488 lobatto_polynomials_grad (this->
degree);
3490 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size ();
3492 lobatto_polynomials_grad[i]
3493 = lobatto_polynomials[i + 1].derivative ();
3501 for (
unsigned int i = 0; i < system_matrix.
m (); ++i)
3502 for (
unsigned int j = 0; j < system_matrix.
n (); ++j)
3503 for (
unsigned int q_point = 0; q_point < n_edge_points;
3505 system_matrix (i, j)
3507 * lobatto_polynomials_grad[i + 1].value
3511 system_matrix_inv.
invert (system_matrix);
3513 for (
unsigned int line = 0;
3514 line < GeometryInfo<dim>::lines_per_cell; ++line)
3519 if ((((line == 0) || (line == 1) || (line == 4) ||
3520 (line == 5)) && (offset + 1 < dim)) ||
3521 (((line == 2) || (line == 3) || (line == 6) ||
3522 (line == 7)) && (offset == 0)) || (line > 7))
3524 for (
unsigned int q_point = 0; q_point < n_edge_points;
3528 = values[line * n_edge_points + q_point]
3529 (line_coordinate[line])
3530 - local_dofs[line * this->
degree]
3536 line_coordinate[line]);
3538 for (
unsigned int i = 0; i < system_rhs.size ();
3544 system_matrix_inv.
vmult (solution, system_rhs);
3550 for (
unsigned int i = 0; i < solution.size (); ++i)
3551 if (std::abs (solution (i)) > 1e-14)
3552 local_dofs[line * this->
degree + i + 1]
3565 const std::vector<Polynomials::Polynomial<double> > &
3566 legendre_polynomials
3569 n_face_points = n_edge_points * n_edge_points;
3575 for (
unsigned int i = 0; i < this->
degree; ++i)
3576 for (
unsigned int j = 0; j < this->degree-1; ++j)
3577 for (
unsigned int k = 0; k < this->
degree; ++k)
3578 for (
unsigned int l = 0; l < this->degree-1; ++l)
3579 for (
unsigned int q_point = 0; q_point < n_face_points;
3581 system_matrix (i * (this->degree-1) + j, k * (this->degree-1) + l)
3583 2 * (k * (this->degree-1) + l))
3584 * legendre_polynomials[i].value
3589 * lobatto_polynomials[j + 2].value
3595 system_matrix_inv.
reinit (system_matrix.
m (),
3596 system_matrix.
n ());
3597 system_matrix_inv.
invert (system_matrix);
3598 solution.reinit (system_matrix.
m ());
3599 system_rhs.reinit (system_matrix.
m ());
3601 for (
unsigned int face = 0;
3602 face < GeometryInfo<dim>::faces_per_cell; ++face)
3608 if (offset + 1 < dim)
3615 for (
unsigned int q_point = 0;
3616 q_point < n_face_points; ++q_point)
3621 * n_edge_points] (1);
3623 for (
unsigned int i = 0; i < 2; ++i)
3624 for (
unsigned int j = 0; j < this->
degree; ++j)
3626 -= local_dofs[4 * i * this->degree
3629 (4 * i * this->degree + j,
3635 for (
unsigned int i = 0; i < this->
degree; ++i)
3636 for (
unsigned int j = 0; j < this->degree-1; ++j)
3637 system_rhs (i * (this->degree-1) + j)
3639 (q_point + n_edge_points,
3640 2 * (i * (this->degree-1) + j)) * tmp;
3643 system_matrix_inv.
vmult (solution, system_rhs);
3649 for (
unsigned int i = 0; i < this->
degree; ++i)
3650 for (
unsigned int j = 0; j < this->degree-1; ++j)
3651 if (std::abs (solution (i * (this->degree-1) + j))
3655 * (this->degree-1) + j
3657 = solution (i * (this->degree-1) + j);
3665 for (
unsigned int q_point = 0;
3666 q_point < n_face_points; ++q_point)
3671 * n_edge_points] (2);
3673 for (
unsigned int i = 0; i < 2; ++i)
3674 for (
unsigned int j = 0; j < this->
degree; ++j)
3675 tmp -= local_dofs[2 * (i + 4)
3678 (2 * (i + 4) * this->degree + j,
3684 for (
unsigned int i = 0; i < this->
degree; ++i)
3685 for (
unsigned int j = 0; j < this->degree-1; ++j)
3686 system_rhs (i * (this->degree-1) + j)
3688 (q_point + n_edge_points,
3689 2 * (i * (this->degree-1) + j) + 1)
3693 system_matrix_inv.
vmult (solution, system_rhs);
3699 for (
unsigned int i = 0; i < this->
degree; ++i)
3700 for (
unsigned int j = 0; j < this->degree-1; ++j)
3701 if (std::abs (solution (i * (this->degree-1) + j)) > 1e-14)
3705 = solution (i * (this->degree-1) + j);
3712 if (offset + 1 < dim)
3719 for (
unsigned int q_point = 0;
3720 q_point < n_face_points; ++q_point)
3726 + n_face_points] (1);
3728 for (
unsigned int i = 0; i < 2; ++i)
3729 for (
unsigned int j = 0; j <= deg; ++j)
3730 tmp -= local_dofs[(4 * i + 1)
3733 ((4 * i + 1) * this->degree
3741 for (
unsigned int i = 0; i <= deg; ++i)
3742 for (
unsigned int j = 0; j < deg; ++j)
3743 system_rhs (i * deg + j)
3745 (q_point + n_edge_points,
3746 2 * (i * deg + j)) * tmp;
3749 system_matrix_inv.
vmult (solution, system_rhs);
3755 for (
unsigned int i = 0; i <= deg; ++i)
3756 for (
unsigned int j = 0; j < deg; ++j)
3757 if (std::abs (solution (i * deg + j))
3760 + 2 * this->
degree) * deg + j
3762 = solution (i * deg + j);
3770 for (
unsigned int q_point = 0;
3771 q_point < n_face_points; ++q_point)
3776 * n_edge_points + n_face_points]
3779 for (
unsigned int i = 0; i < 2; ++i)
3780 for (
unsigned int j = 0; j <= deg; ++j)
3781 tmp -= local_dofs[(2 * (i + 4) + 1)
3784 ((2 * (i + 4) + 1) * this->degree
3792 for (
unsigned int i = 0; i <= deg; ++i)
3793 for (
unsigned int j = 0; j < deg; ++j)
3794 system_rhs (i * deg + j)
3796 (q_point + n_edge_points,
3797 2 * (i * deg + j) + 1) * tmp;
3800 system_matrix_inv.
vmult (solution, system_rhs);
3806 for (
unsigned int i = 0; i <= deg; ++i)
3807 for (
unsigned int j = 0; j < deg; ++j)
3808 if (std::abs (solution (i * deg + j)) > 1e-14)
3812 = solution (i * deg + j);
3826 for (
unsigned int q_point = 0;
3827 q_point < n_face_points; ++q_point)
3832 * n_edge_points + 2 * n_face_points]
3835 for (
unsigned int i = 0; i < 2; ++i)
3836 for (
unsigned int j = 0; j <= deg; ++j)
3837 tmp -= local_dofs[(i + 8) * this->degree
3840 ((i + 8) * this->degree + j,
3848 for (
unsigned int i = 0; i <= deg; ++i)
3849 for (
unsigned int j = 0; j < deg; ++j)
3850 system_rhs (i * deg + j)
3852 (q_point + n_edge_points,
3853 2 * (i * deg + j)) * tmp;
3856 system_matrix_inv.
vmult (solution, system_rhs);
3862 for (
unsigned int i = 0; i <= deg; ++i)
3863 for (
unsigned int j = 0; j < deg; ++j)
3864 if (std::abs (solution (i * deg + j))
3867 + 4 * this->
degree) * deg
3870 = solution (i * deg + j);
3878 for (
unsigned int q_point = 0;
3879 q_point < n_face_points; ++q_point)
3885 + 2 * n_face_points] (0);
3887 for (
unsigned int i = 0; i < 2; ++i)
3888 for (
unsigned int j = 0; j <= deg; ++j)
3889 tmp -= local_dofs[(4 * i + 2)
3892 ((4 * i + 2) * this->degree
3901 for (
unsigned int i = 0; i <= deg; ++i)
3902 for (
unsigned int j = 0; j < deg; ++j)
3903 system_rhs (i * deg + j)
3905 (q_point + n_edge_points,
3906 2 * (i * deg + j) + 1) * tmp;
3909 system_matrix_inv.
vmult (solution, system_rhs);
3915 for (
unsigned int i = 0; i <= deg; ++i)
3916 for (
unsigned int j = 0; j < deg; ++j)
3917 if (std::abs (solution (i * deg + j)) > 1e-14)
3919 + 5 * deg) * this->degree]
3920 = solution (i * deg + j);
3934 for (
unsigned int q_point = 0;
3935 q_point < n_face_points; ++q_point)
3940 * n_edge_points + 3 * n_face_points]
3943 for (
unsigned int i = 0; i < 2; ++i)
3944 for (
unsigned int j = 0; j <= deg; ++j)
3945 tmp -= local_dofs[(i + 10) * this->degree
3948 ((i + 10) * this->degree + j,
3956 for (
unsigned int i = 0; i <= deg; ++i)
3957 for (
unsigned int j = 0; j < deg; ++j)
3958 system_rhs (i * deg + j)
3960 (q_point + n_edge_points,
3961 2 * (i * deg + j)) * tmp;
3964 system_matrix_inv.
vmult (solution, system_rhs);
3970 for (
unsigned int i = 0; i <= deg; ++i)
3971 for (
unsigned int j = 0; j < deg; ++j)
3972 if (std::abs (solution (i * deg + j))
3975 + 6 * this->
degree) * deg + j
3977 = solution (i * deg + j);
3985 for (
unsigned int q_point = 0;
3986 q_point < n_face_points; ++q_point)
3992 * n_face_points] (0);
3994 for (
unsigned int i = 0; i < 2; ++i)
3995 for (
unsigned int j = 0; j <= deg; ++j)
3996 tmp -= local_dofs[(4 * i + 3)
3999 ((4 * i + 3) * this->degree
4008 for (
unsigned int i = 0; i <= deg; ++i)
4009 for (
unsigned int j = 0; j < deg; ++j)
4010 system_rhs (i * deg + j)
4012 (q_point + n_edge_points,
4013 2 * (i * deg + j) + 1) * tmp;
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 if (std::abs (solution (i * deg + j)) > 1e-14)
4026 + 7 * deg) * this->degree]
4027 = solution (i * deg + j);
4034 if (offset + 1 < dim)
4043 for (
unsigned int q_point = 0;
4044 q_point < n_face_points; ++q_point)
4050 * n_face_points] (0);
4052 for (
unsigned int i = 0; i < 2; ++i)
4053 for (
unsigned int j = 0; j <= deg; ++j)
4054 tmp -= local_dofs[(i + 2)
4058 ((i + 2) * this->degree
4067 for (
unsigned int i = 0; i <= deg; ++i)
4068 for (
unsigned int j = 0; j < deg; ++j)
4069 system_rhs (i * deg + j)
4071 (q_point + n_edge_points,
4072 2 * (i * deg + j)) * tmp;
4075 system_matrix_inv.
vmult 4076 (solution, system_rhs);
4082 for (
unsigned int i = 0; i <= deg; ++i)
4083 for (
unsigned int j = 0; j < deg; ++j)
4084 if (std::abs (solution (i * deg + j))
4087 + 8 * this->
degree) * deg
4090 = solution (i * deg + j);
4098 for (
unsigned int q_point = 0;
4099 q_point < n_face_points; ++q_point)
4105 * n_face_points] (1);
4107 for (
unsigned int i = 0; i < 2; ++i)
4108 for (
unsigned int j = 0; j <= deg; ++j)
4109 tmp -= local_dofs[i * this->degree + j]
4111 (i * this->degree + j,
4119 for (
unsigned int i = 0; i <= deg; ++i)
4120 for (
unsigned int j = 0; j < deg; ++j)
4121 system_rhs (i * deg + j)
4123 (q_point + n_edge_points,
4124 2 * (i * deg + j) + 1) * tmp;
4127 system_matrix_inv.
vmult (solution, system_rhs);
4133 for (
unsigned int i = 0; i <= deg; ++i)
4134 for (
unsigned int j = 0; j < deg; ++j)
4135 if (std::abs (solution (i * deg + j))
4140 = solution (i * deg + j);
4147 if (offset + 1 < dim)
4156 for (
unsigned int q_point = 0;
4157 q_point < n_face_points; ++q_point)
4163 + 5 * n_face_points] (0);
4165 for (
unsigned int i = 0; i < 2; ++i)
4166 for (
unsigned int j = 0; j <= deg; ++j)
4167 tmp -= local_dofs[(i + 6)
4170 ((i + 6) * this->degree + j,
4178 for (
unsigned int i = 0; i <= deg; ++i)
4179 for (
unsigned int j = 0; j < deg; ++j)
4180 system_rhs (i * deg + j)
4182 (q_point + n_edge_points,
4183 2 * (i * deg + j)) * tmp;
4186 system_matrix_inv.
vmult 4187 (solution, system_rhs);
4193 for (
unsigned int i = 0; i <= deg; ++i)
4194 for (
unsigned int j = 0; j < deg; ++j)
4195 if (std::abs (solution (i * deg + j))
4201 = solution (i * deg + j);
4209 for (
unsigned int q_point = 0;
4210 q_point < n_face_points; ++q_point)
4216 * n_face_points] (1);
4218 for (
unsigned int i = 0; i < 2; ++i)
4219 for (
unsigned int j = 0; j <= deg; ++j)
4220 tmp -= local_dofs[(i + 4)
4223 ((i + 4) * this->degree + j,
4231 for (
unsigned int i = 0; i <= deg; ++i)
4232 for (
unsigned int j = 0; j < deg; ++j)
4233 system_rhs (i * deg + j)
4235 (q_point + n_edge_points,
4236 2 * (i * deg + j) + 1) * tmp;
4239 system_matrix_inv.
vmult (solution, system_rhs);
4245 for (
unsigned int i = 0; i <= deg; ++i)
4246 for (
unsigned int j = 0; j < deg; ++j)
4247 if (std::abs (solution (i * deg + j))
4250 + 11 * deg) * this->degree]
4251 = solution (i * deg + j);
4261 const QGauss<dim> reference_quadrature (this->degree);
4262 const unsigned int &
4263 n_interior_points = reference_quadrature.
size ();
4267 system_matrix.
reinit (this->degree * deg * deg,
4268 this->degree * deg * deg);
4271 for (
unsigned int i = 0; i <= deg; ++i)
4272 for (
unsigned int j = 0; j < deg; ++j)
4273 for (
unsigned int k = 0; k < deg; ++k)
4274 for (
unsigned int l = 0; l <= deg; ++l)
4275 for (
unsigned int m = 0; m < deg; ++m)
4276 for (
unsigned int n = 0; n < deg; ++n)
4277 for (
unsigned int q_point = 0;
4278 q_point < n_interior_points; ++q_point)
4279 system_matrix ((i * deg + j) * deg + k,
4280 (l * deg + m) * deg + n)
4281 += reference_quadrature.
weight (q_point)
4282 * legendre_polynomials[i].value
4288 (0)) * lobatto_polynomials[j + 2].value
4295 * lobatto_polynomials[k + 2].value
4302 * lobatto_polynomials_grad[l].value
4309 * lobatto_polynomials[m + 2].value
4316 * lobatto_polynomials[n + 2].value
4324 system_matrix_inv.
reinit (system_matrix.
m (),
4325 system_matrix.
m ());
4326 system_matrix_inv.
invert (system_matrix);
4327 system_rhs.reinit (system_matrix_inv.
m ());
4328 solution.reinit (system_matrix.
m ());
4330 if (offset + 1 < dim)
4337 for (
unsigned int q_point = 0;
4338 q_point < n_interior_points; ++q_point)
4345 * n_face_points] (0);
4347 for (
unsigned int i = 0; i <= deg; ++i)
4349 for (
unsigned int j = 0; j < 2; ++j)
4350 for (
unsigned int k = 0; k < 2; ++k)
4351 tmp -= local_dofs[i + (j + 4 * k + 2)
4354 (i + (j + 4 * k + 2)
4363 for (
unsigned int j = 0; j < deg; ++j)
4364 for (
unsigned int k = 0; k < 4; ++k)
4365 tmp -= local_dofs[(i + 2 * (k + 2)
4371 ((i + 2 * (k + 2) * this->degree
4383 for (
unsigned int i = 0; i <= deg; ++i)
4384 for (
unsigned int j = 0; j < deg; ++j)
4385 for (
unsigned int k = 0; k < deg; ++k)
4386 system_rhs ((i * deg + j) * deg + k)
4387 += reference_quadrature.
weight (q_point)
4389 * lobatto_polynomials_grad[i].value
4396 * lobatto_polynomials[j + 2].value
4403 * lobatto_polynomials[k + 2].value
4412 system_matrix_inv.
vmult (solution, system_rhs);
4418 for (
unsigned int i = 0; i <= deg; ++i)
4419 for (
unsigned int j = 0; j < deg; ++j)
4420 for (
unsigned int k = 0; k < deg; ++k)
4421 if (std::abs (solution ((i * deg + j) * deg + k))
4431 = solution ((i * deg + j) * deg + k);
4437 for (
unsigned int q_point = 0; q_point < n_interior_points;
4444 * n_face_points] (1);
4446 for (
unsigned int i = 0; i <= deg; ++i)
4447 for (
unsigned int j = 0; j < 2; ++j)
4449 for (
unsigned int k = 0; k < 2; ++k)
4450 tmp -= local_dofs[i + (4 * j + k)
4453 (i + (4 * j + k) * this->degree,
4461 for (
unsigned int k = 0; k < deg; ++k)
4462 tmp -= local_dofs[(i + 2 * j * this->degree
4467 ((i + 2 * j * this->degree
4477 + local_dofs[i + ((2 * j + 9) * deg + k
4481 (i + ((2 * j + 9) * deg + k
4492 for (
unsigned int i = 0; i <= deg; ++i)
4493 for (
unsigned int j = 0; j < deg; ++j)
4494 for (
unsigned int k = 0; k < deg; ++k)
4495 system_rhs ((i * deg + j) * deg + k)
4496 += reference_quadrature.
weight (q_point) * tmp
4497 * lobatto_polynomials_grad[i].value
4504 * lobatto_polynomials[j + 2].value
4511 * lobatto_polynomials[k + 2].value
4520 system_matrix_inv.
vmult (solution, system_rhs);
4526 for (
unsigned int i = 0; i <= deg; ++i)
4527 for (
unsigned int j = 0; j < deg; ++j)
4528 for (
unsigned int k = 0; k < deg; ++k)
4529 if (std::abs (solution ((i * deg + j) * deg + k))
4531 local_dofs[((i + this->degree + 2
4538 = solution ((i * deg + j) * deg + k);
4544 for (
unsigned int q_point = 0; q_point < n_interior_points;
4551 * n_face_points] (2);
4553 for (
unsigned int i = 0; i <= deg; ++i)
4554 for (
unsigned int j = 0; j < 4; ++j)
4556 tmp -= local_dofs[i + (j + 8) * this->degree]
4558 (i + (j + 8) * this->
degree,
4566 for (
unsigned int k = 0; k < deg; ++k)
4567 tmp -= local_dofs[i + ((2 * j + 1) * deg + k
4571 (i + ((2 * j + 1) * deg + k
4574 this->generalized_support_points[q_point
4582 for (
unsigned int i = 0; i <= deg; ++i)
4583 for (
unsigned int j = 0; j < deg; ++j)
4584 for (
unsigned int k = 0; k < deg; ++k)
4585 system_rhs ((i * deg + j) * deg + k)
4586 += reference_quadrature.
weight (q_point) * tmp
4587 * lobatto_polynomials_grad[i].value
4594 * lobatto_polynomials[j + 2].value
4601 * lobatto_polynomials[k + 2].value
4610 system_matrix_inv.
vmult (solution, system_rhs);
4616 for (
unsigned int i = 0; i <= deg; ++i)
4617 for (
unsigned int j = 0; j < deg; ++j)
4618 for (
unsigned int k = 0; k < deg; ++k)
4619 if (std::abs (solution ((i * deg + j) * deg + k))
4621 local_dofs[i + ((j + 2
4626 = solution ((i * deg + j) * deg + k);
4633 Assert (
false, ExcNotImplemented ());
4647 const VectorSlice<
const std::vector<std::vector<double> > > &values)
4650 const unsigned int deg = this->
degree-1;
4652 ExcDimensionMismatch (values.size (), this->
n_components ()));
4654 ExcDimensionMismatch (values[0].size (),
4657 ExcDimensionMismatch (local_dofs.size (), this->
dofs_per_cell));
4658 std::fill (local_dofs.begin (), local_dofs.end (), 0.0);
4666 const QGauss<dim - 1> reference_edge_quadrature (this->
degree);
4667 const unsigned int &
4668 n_edge_points = reference_edge_quadrature.size ();
4670 for (
unsigned int i = 0; i < 2; ++i)
4671 for (
unsigned int j = 0; j < 2; ++j)
4673 for (
unsigned int q_point = 0; q_point < n_edge_points;
4675 local_dofs[(i + 2 * j) * this->
degree]
4676 += reference_edge_quadrature.weight (q_point)
4677 * values[1 - j][q_point + (i + 2 * j) * n_edge_points];
4683 if (std::abs (local_dofs[(i + 2 * j) * this->
degree]) < 1e-14)
4684 local_dofs[(i + 2 * j) * this->
degree] = 0.0;
4702 const std::vector<Polynomials::Polynomial<double> > &
4707 std::vector<Polynomials::Polynomial<double> >
4708 lobatto_polynomials_grad (this->
degree);
4710 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size ();
4712 lobatto_polynomials_grad[i]
4713 = lobatto_polynomials[i + 1].derivative ();
4718 for (
unsigned int i = 0; i < system_matrix.
m (); ++i)
4719 for (
unsigned int j = 0; j < system_matrix.
n (); ++j)
4720 for (
unsigned int q_point = 0; q_point < n_edge_points;
4722 system_matrix (i, j)
4724 * lobatto_polynomials_grad[i + 1].value
4730 system_matrix_inv.
invert (system_matrix);
4738 for (
unsigned int line = 0;
4739 line < GeometryInfo<dim>::lines_per_cell; ++line)
4744 for (
unsigned int q_point = 0; q_point < n_edge_points;
4748 = values[line_coordinate[line]][line * n_edge_points
4750 - local_dofs[line * this->
degree]
4756 line_coordinate[line]);
4758 for (
unsigned int i = 0; i < system_rhs.size (); ++i)
4762 system_matrix_inv.
vmult (solution, system_rhs);
4768 for (
unsigned int i = 0; i < solution.size (); ++i)
4769 if (std::abs (solution (i)) > 1e-14)
4770 local_dofs[line * this->
degree + i + 1] = solution (i);
4783 const unsigned int &
4784 n_interior_points = reference_quadrature.
size ();
4785 const std::vector<Polynomials::Polynomial<double> > &
4786 legendre_polynomials
4793 for (
unsigned int i = 0; i < this->
degree; ++i)
4794 for (
unsigned int j = 0; j < this->degree-1; ++j)
4795 for (
unsigned int k = 0; k < this->
degree; ++k)
4796 for (
unsigned int l = 0; l < this->degree-1; ++l)
4797 for (
unsigned int q_point = 0;
4798 q_point < n_interior_points; ++q_point)
4799 system_matrix (i * (this->degree-1) + j, k * (this->degree-1) + l)
4800 += reference_quadrature.
weight (q_point)
4801 * legendre_polynomials[i].value
4806 * lobatto_polynomials[j + 2].value
4811 * lobatto_polynomials_grad[k].value
4816 * lobatto_polynomials[l + 2].value
4822 system_matrix_inv.
reinit (system_matrix.
m (),
4823 system_matrix.
m ());
4824 system_matrix_inv.
invert (system_matrix);
4828 system_rhs.reinit (system_matrix_inv.
m ());
4831 for (
unsigned int q_point = 0; q_point < n_interior_points;
4838 for (
unsigned int i = 0; i < 2; ++i)
4839 for (
unsigned int j = 0; j <= deg; ++j)
4840 tmp -= local_dofs[(i + 2) * this->degree + j]
4842 ((i + 2) * this->degree + j,
4848 for (
unsigned int i = 0; i <= deg; ++i)
4849 for (
unsigned int j = 0; j < deg; ++j)
4850 system_rhs (i * deg + j)
4851 += reference_quadrature.
weight (q_point) * tmp
4852 * lobatto_polynomials_grad[i].value
4857 * lobatto_polynomials[j + 2].value
4864 solution.reinit (system_matrix.
m ());
4865 system_matrix_inv.
vmult (solution, system_rhs);
4871 for (
unsigned int i = 0; i <= deg; ++i)
4872 for (
unsigned int j = 0; j < deg; ++j)
4873 if (std::abs (solution (i * deg + j)) > 1e-14)
4876 = solution (i * deg + j);
4883 for (
unsigned int q_point = 0; q_point < n_interior_points;
4890 for (
unsigned int i = 0; i < 2; ++i)
4891 for (
unsigned int j = 0; j <= deg; ++j)
4892 tmp -= local_dofs[i * this->degree + j]
4894 (i * this->degree + j,
4900 for (
unsigned int i = 0; i <= deg; ++i)
4901 for (
unsigned int j = 0; j < deg; ++j)
4902 system_rhs (i * deg + j)
4903 += reference_quadrature.
weight (q_point) * tmp
4904 * lobatto_polynomials_grad[i].value
4909 * lobatto_polynomials[j + 2].value
4916 system_matrix_inv.
vmult (solution, system_rhs);
4922 for (
unsigned int i = 0; i <= deg; ++i)
4923 for (
unsigned int j = 0; j < deg; ++j)
4924 if (std::abs (solution (i * deg + j)) > 1e-14)
4926 + deg) * this->degree]
4927 = solution (i * deg + j);
4938 const unsigned int &
4939 n_edge_points = reference_edge_quadrature.
size ();
4941 for (
unsigned int q_point = 0; q_point < n_edge_points; ++q_point)
4943 for (
unsigned int i = 0; i < 4; ++i)
4944 local_dofs[(i + 8) * this->
degree]
4945 += reference_edge_quadrature.
weight (q_point)
4946 * values[2][q_point + (i + 8) * n_edge_points];
4948 for (
unsigned int i = 0; i < 2; ++i)
4949 for (
unsigned int j = 0; j < 2; ++j)
4950 for (
unsigned int k = 0; k < 2; ++k)
4951 local_dofs[(i + 2 * (2 * j + k)) * this->
degree]
4952 += reference_edge_quadrature.
weight (q_point)
4953 * values[1 - k][q_point + (i + 2 * (2 * j + k))
4961 for (
unsigned int i = 0; i < 4; ++i)
4962 if (std::abs (local_dofs[(i + 8) * this->
degree]) < 1e-14)
4963 local_dofs[(i + 8) * this->
degree] = 0.0;
4965 for (
unsigned int i = 0; i < 2; ++i)
4966 for (
unsigned int j = 0; j < 2; ++j)
4967 for (
unsigned int k = 0; k < 2; ++k)
4968 if (std::abs (local_dofs[(i + 2 * (2 * j + k)) * this->
degree])
4970 local_dofs[(i + 2 * (2 * j + k)) * this->degree] = 0.0;
4981 if (this->degree > 1)
4986 const std::vector<Polynomials::Polynomial<double> > &
4991 std::vector<Polynomials::Polynomial<double> >
4992 lobatto_polynomials_grad (this->degree);
4994 for (
unsigned int i = 0; i < lobatto_polynomials_grad.size ();
4996 lobatto_polynomials_grad[i]
4997 = lobatto_polynomials[i + 1].derivative ();
5002 for (
unsigned int i = 0; i < system_matrix.
m (); ++i)
5003 for (
unsigned int j = 0; j < system_matrix.
n (); ++j)
5004 for (
unsigned int q_point = 0; q_point < n_edge_points;
5006 system_matrix (i, j)
5008 * lobatto_polynomials_grad[i + 1].value
5014 system_matrix_inv.
invert (system_matrix);
5018 = {1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2};
5022 for (
unsigned int line = 0;
5023 line < GeometryInfo<dim>::lines_per_cell; ++line)
5028 for (
unsigned int q_point = 0; q_point < this->
degree; ++q_point)
5031 = values[line_coordinate[line]][line * this->degree
5033 - local_dofs[line * this->
degree]
5035 (line * this->degree,
5039 line_coordinate[line]);
5041 for (
unsigned int i = 0; i < system_rhs.size (); ++i)
5046 system_matrix_inv.
vmult (solution, system_rhs);
5052 for (
unsigned int i = 0; i < solution.size (); ++i)
5053 if (std::abs (solution (i)) > 1e-14)
5054 local_dofs[line * this->degree + i + 1] = solution (i);
5065 const std::vector<Polynomials::Polynomial<double> > &
5066 legendre_polynomials
5068 const unsigned int n_face_points = n_edge_points * n_edge_points;
5070 system_matrix.
reinit ((this->degree-1) * this->degree,
5071 (this->degree-1) * this->degree);
5074 for (
unsigned int i = 0; i < this->
degree; ++i)
5075 for (
unsigned int j = 0; j < this->degree-1; ++j)
5076 for (
unsigned int k = 0; k < this->
degree; ++k)
5077 for (
unsigned int l = 0; l < this->degree-1; ++l)
5078 for (
unsigned int q_point = 0; q_point < n_face_points;
5080 system_matrix (i * (this->degree-1) + j, k * (this->degree-1) + l)
5082 2 * (k * (this->degree-1) + l))
5083 * legendre_polynomials[i].value
5088 * lobatto_polynomials[j + 2].value
5094 system_matrix_inv.
reinit (system_matrix.
m (),
5095 system_matrix.
m ());
5096 system_matrix_inv.
invert (system_matrix);
5097 solution.reinit (system_matrix.
m ());
5098 system_rhs.reinit (system_matrix.
m ());
5102 = {{1, 2}, {1, 2}, {2, 0}, {2, 0}, {0, 1}, {0, 1}};
5105 = {{0, 4, 8, 10}, {1, 5, 9, 11}, {8, 9, 2, 6},
5106 {10, 11, 3, 7}, {2, 3, 0, 1}, {6, 7, 4, 5}
5109 for (
unsigned int face = 0;
5110 face < GeometryInfo<dim>::faces_per_cell; ++face)
5117 for (
unsigned int q_point = 0; q_point < n_face_points;
5121 = values[face_coordinates[face][0]][q_point
5125 for (
unsigned int i = 0; i < 2; ++i)
5126 for (
unsigned int j = 0; j <= deg; ++j)
5127 tmp -= local_dofs[edge_indices[face][i]
5130 (edge_indices[face][i] * this->degree + j,
5134 face_coordinates[face][0]);
5136 for (
unsigned int i = 0; i <= deg; ++i)
5137 for (
unsigned int j = 0; j < deg; ++j)
5138 system_rhs (i * deg + j)
5140 2 * (i * deg + j)) * tmp;
5143 system_matrix_inv.
vmult (solution, system_rhs);
5149 for (
unsigned int i = 0; i <= deg; ++i)
5150 for (
unsigned int j = 0; j < deg; ++j)
5151 if (std::abs (solution (i * deg + j)) > 1e-14)
5152 local_dofs[(2 * face * this->degree + i
5155 = solution (i * deg + j);
5162 for (
unsigned int q_point = 0; q_point < n_face_points;
5166 = values[face_coordinates[face][1]][q_point
5170 for (
int i = 2; i < (int) GeometryInfo<dim>::lines_per_face; ++i)
5171 for (
unsigned int j = 0; j <= deg; ++j)
5172 tmp -= local_dofs[edge_indices[face][i]
5175 (edge_indices[face][i] * this->degree + j,
5179 face_coordinates[face][1]);
5181 for (
unsigned int i = 0; i <= deg; ++i)
5182 for (
unsigned int j = 0; j < deg; ++j)
5183 system_rhs (i * deg + j)
5185 2 * (i * deg + j) + 1)
5189 system_matrix_inv.
vmult (solution, system_rhs);
5195 for (
unsigned int i = 0; i <= deg; ++i)
5196 for (
unsigned int j = 0; j < deg; ++j)
5197 if (std::abs (solution (i * deg + j)) > 1e-14)
5200 = solution (i * deg + j);
5208 const QGauss<dim> reference_quadrature (this->degree);
5210 n_interior_points = reference_quadrature.
size ();
5214 system_matrix.
reinit (this->degree * deg * deg,
5215 this->degree * deg * deg);
5218 for (
unsigned int i = 0; i <= deg; ++i)
5219 for (
unsigned int j = 0; j < deg; ++j)
5220 for (
unsigned int k = 0; k < deg; ++k)
5221 for (
unsigned int l = 0; l <= deg; ++l)
5222 for (
unsigned int m = 0; m < deg; ++m)
5223 for (
unsigned int n = 0; n < deg; ++n)
5224 for (
unsigned int q_point = 0;
5225 q_point < n_interior_points; ++q_point)
5226 system_matrix ((i * deg + j) * deg + k,
5227 (l * deg + m) * deg + n)
5228 += reference_quadrature.
weight (q_point)
5229 * legendre_polynomials[i].value
5236 * lobatto_polynomials[j + 2].value
5243 * lobatto_polynomials[k + 2].value
5250 * lobatto_polynomials_grad[l].value
5257 * lobatto_polynomials[m + 2].value
5264 * lobatto_polynomials[n + 2].value
5272 system_matrix_inv.
reinit (system_matrix.
m (),
5273 system_matrix.
m ());
5274 system_matrix_inv.
invert (system_matrix);
5276 system_rhs.reinit (system_matrix.
m ());
5279 for (
unsigned int q_point = 0; q_point < n_interior_points;
5288 for (
unsigned int i = 0; i <= deg; ++i)
5290 for (
unsigned int j = 0; j < 2; ++j)
5291 for (
unsigned int k = 0; k < 2; ++k)
5292 tmp -= local_dofs[i + (j + 4 * k + 2) * this->
degree]
5294 (i + (j + 4 * k + 2) * this->degree,
5302 for (
unsigned int j = 0; j < deg; ++j)
5303 for (
unsigned int k = 0; k < 4; ++k)
5304 tmp -= local_dofs[(i + 2 * (k + 2) * this->degree
5309 ((i + 2 * (k + 2) * this->degree
5321 for (
unsigned int i = 0; i <= deg; ++i)
5322 for (
unsigned int j = 0; j < deg; ++j)
5323 for (
unsigned int k = 0; k < deg; ++k)
5324 system_rhs ((i * deg + j) * deg + k)
5325 += reference_quadrature.
weight (q_point) * tmp
5326 * lobatto_polynomials_grad[i].value
5333 * lobatto_polynomials[j + 2].value
5340 * lobatto_polynomials[k + 2].value
5349 solution.reinit (system_rhs.size ());
5350 system_matrix_inv.
vmult (solution, system_rhs);
5356 for (
unsigned int i = 0; i <= deg; ++i)
5357 for (
unsigned int j = 0; j < deg; ++j)
5358 for (
unsigned int k = 0; k < deg; ++k)
5359 if (std::abs (solution ((i * deg + j) * deg + k)) > 1e-14)
5364 = solution ((i * deg + j) * deg + k);
5369 for (
unsigned int q_point = 0; q_point < n_interior_points;
5378 for (
unsigned int i = 0; i <= deg; ++i)
5379 for (
unsigned int j = 0; j < 2; ++j)
5381 for (
unsigned int k = 0; k < 2; ++k)
5382 tmp -= local_dofs[i + (4 * j + k) * this->
degree]
5384 (i + (4 * j + k) * this->degree,
5392 for (
unsigned int k = 0; k < deg; ++k)
5393 tmp -= local_dofs[(i + 2 * j * this->degree
5398 ((i + 2 * j * this->degree
5408 + local_dofs[i + ((2 * j + 9) * deg + k
5412 (i + ((2 * j + 9) * deg + k
5423 for (
unsigned int i = 0; i <= deg; ++i)
5424 for (
unsigned int j = 0; j < deg; ++j)
5425 for (
unsigned int k = 0; k < deg; ++k)
5426 system_rhs ((i * deg + j) * deg + k)
5427 += reference_quadrature.
weight (q_point) * tmp
5428 * lobatto_polynomials_grad[i].value
5435 * lobatto_polynomials[j + 2].value
5442 * lobatto_polynomials[k + 2].value
5451 system_matrix_inv.
vmult (solution, system_rhs);
5457 for (
unsigned int i = 0; i <= deg; ++i)
5458 for (
unsigned int j = 0; j < deg; ++j)
5459 for (
unsigned int k = 0; k < deg; ++k)
5460 if (std::abs (solution ((i * deg + j) * deg + k)) > 1e-14)
5461 local_dofs[((i + this->degree + 2
5466 = solution ((i * deg + j) * deg + k);
5471 for (
unsigned int q_point = 0; q_point < n_interior_points;
5480 for (
unsigned int i = 0; i <= deg; ++i)
5481 for (
unsigned int j = 0; j < 4; ++j)
5483 tmp -= local_dofs[i + (j + 8) * this->degree]
5485 (i + (j + 8) * this->
degree,
5493 for (
unsigned int k = 0; k < deg; ++k)
5494 tmp -= local_dofs[i + ((2 * j + 1) * deg + k
5498 (i + ((2 * j + 1) * deg + k
5501 this->generalized_support_points[q_point
5509 for (
unsigned int i = 0; i <= deg; ++i)
5510 for (
unsigned int j = 0; j < deg; ++j)
5511 for (
unsigned int k = 0; k < deg; ++k)
5512 system_rhs ((i * deg + j) * deg + k)
5513 += reference_quadrature.
weight (q_point) * tmp
5514 * lobatto_polynomials_grad[i].value
5521 * lobatto_polynomials[j + 2].value
5528 * lobatto_polynomials[k + 2].value
5537 system_matrix_inv.
vmult (solution, system_rhs);
5543 for (
unsigned int i = 0; i <= deg; ++i)
5544 for (
unsigned int j = 0; j < deg; ++j)
5545 for (
unsigned int k = 0; k < deg; ++k)
5546 if (std::abs (solution ((i * deg + j) * deg + k)) > 1e-14)
5547 local_dofs[i + ((j + 2 * (deg
5552 = solution ((i * deg + j) * deg + k);
5559 Assert (
false, ExcNotImplemented ());
5566 std::pair<Table<2,bool>, std::vector<unsigned int> >
5570 for (
unsigned int d=0; d<dim; ++d)
5572 constant_modes(d,i) =
true;
5574 for (
unsigned int d=0; d<dim; ++d)
5575 components.push_back(d);
5576 return std::pair<Table<2,bool>, std::vector<unsigned int> >
5585 Assert (
false, ExcNotImplemented ());
5594 #include "fe_nedelec.inst" 5597 DEAL_II_NAMESPACE_CLOSE
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
std::vector< std::vector< FullMatrix< double > > > restriction
const unsigned int components
std::vector< Point< dim > > generalized_support_points
FullMatrix< double > interface_constraints
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim > &fe_other) const
static std::vector< Polynomial< double > > generate_complete_basis(const unsigned int p)
const std::vector< Point< dim > > & get_points() const
static std::vector< Polynomial< double > > generate_complete_basis(const unsigned int degree)
::ExceptionBase & ExcMessage(std::string arg1)
virtual std::size_t memory_consumption() const
const unsigned int degree
const Point< dim > & point(const unsigned int i) const
virtual void get_subface_interpolation_matrix(const FiniteElement< dim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
void invert(const FullMatrix< number2 > &M)
#define AssertThrow(cond, exc)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim > &fe_other) const
void mTmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree, bool dg=false)
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
virtual std::string get_name() const
std::vector< std::vector< FullMatrix< double > > > prolongation
Table< 2, double > boundary_weights
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
void mmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
virtual std::string get_name() const =0
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 const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim > &fe_other) const
static unsigned int compute_n_pols(unsigned int degree)
unsigned int size() const
const unsigned int dofs_per_cell
std::vector< Point< dim-1 > > generalized_face_support_points
static Quadrature< dim > project_to_all_faces(const SubQuadrature &quadrature)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim > &fe_other) const
unsigned int n_components() const
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
const unsigned int dofs_per_face
virtual FiniteElement< dim > * clone() const
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual bool hp_constraints_are_implemented() const
void initialize_restriction()
virtual void interpolate(std::vector< double > &local_dofs, const std::vector< double > &values) const
void initialize_support_points(const unsigned int degree)
FullMatrix< double > inverse_node_matrix
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 std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
virtual void get_face_interpolation_matrix(const FiniteElement< dim > &source, FullMatrix< double > &matrix) const
double weight(const unsigned int i) const