16 #include <deal.II/base/std_cxx14/memory.h> 18 #include <deal.II/fe/fe_nedelec_sz.h> 20 DEAL_II_NAMESPACE_OPEN
23 template <
int dim,
int spacedim>
30 std::vector<bool>(compute_num_dofs(degree), true),
32 std::vector<bool>(dim, true)))
40 for (
unsigned int comp = 0; comp < this->
n_components(); ++comp)
52 template <
int dim,
int spacedim>
63 template <
int dim,
int spacedim>
68 const unsigned int )
const 77 template <
int dim,
int spacedim>
88 template <
int dim,
int spacedim>
93 const unsigned int )
const 101 template <
int dim,
int spacedim>
112 template <
int dim,
int spacedim>
117 const unsigned int )
const 124 template <
int dim,
int spacedim>
125 std::unique_ptr<typename ::FiniteElement<dim, spacedim>::InternalDataBase>
135 typename ::FiniteElement<dim, spacedim>::InternalDataBase>
136 data_ptr = std_cxx14::make_unique<InternalData>();
138 data.
update_each = update_each(update_flags) | update_once(update_flags);
141 const unsigned int degree(this->degree - 1);
147 const unsigned int n_line_dofs = this->dofs_per_line * lines_per_cell;
148 const unsigned int n_face_dofs = this->dofs_per_quad * faces_per_cell;
151 const unsigned int n_q_points = quadrature.
size();
154 data.sigma_imj_values.resize(
156 std::vector<std::vector<double>>(vertices_per_cell,
157 std::vector<double>(vertices_per_cell)));
159 data.sigma_imj_grads.resize(vertices_per_cell,
160 std::vector<std::vector<double>>(
161 vertices_per_cell, std::vector<double>(dim)));
166 data.shape_values.resize(this->dofs_per_cell,
172 data.shape_grads.resize(this->dofs_per_cell,
182 std::vector<Point<dim>> p_list(n_q_points);
192 std::vector<std::vector<double>> sigma(
193 n_q_points, std::vector<double>(lines_per_cell));
194 std::vector<std::vector<double>> lambda(
195 n_q_points, std::vector<double>(lines_per_cell));
197 for (
unsigned int q = 0; q < n_q_points; ++q)
199 sigma[q][0] = (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]);
200 sigma[q][1] = p_list[q][0] + (1.0 - p_list[q][1]);
201 sigma[q][2] = (1.0 - p_list[q][0]) + p_list[q][1];
202 sigma[q][3] = p_list[q][0] + p_list[q][1];
204 lambda[q][0] = (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]);
205 lambda[q][1] = p_list[q][0] * (1.0 - p_list[q][1]);
206 lambda[q][2] = (1.0 - p_list[q][0]) * p_list[q][1];
207 lambda[q][3] = p_list[q][0] * p_list[q][1];
208 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
210 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
212 data.sigma_imj_values[q][i][j] =
213 sigma[q][i] - sigma[q][j];
226 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
227 int sigma_imj_sign[vertices_per_cell][vertices_per_cell];
228 unsigned int sigma_imj_component[vertices_per_cell]
231 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
233 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
240 sigma_imj_sign[i][j] = (i < j) ? -1 : 1;
241 sigma_imj_sign[i][j] = (i == j) ? 0 : sigma_imj_sign[i][j];
245 sigma_imj_component[i][j] = 0;
246 for (
unsigned int d = 0; d < dim; ++d)
249 sigma_comp_signs[i][d] - sigma_comp_signs[j][d];
254 sigma_imj_component[i][j] = d;
261 data.sigma_imj_grads[i][j][sigma_imj_component[i][j]] =
262 2.0 * sigma_imj_sign[i][j];
270 data.edge_sigma_values.resize(lines_per_cell);
271 data.edge_sigma_grads.resize(lines_per_cell);
272 for (
unsigned int m = 0; m < lines_per_cell; ++m)
274 data.edge_sigma_values[m].resize(n_q_points);
277 data.edge_sigma_grads[m].resize(dim);
287 data.edge_lambda_values.resize(lines_per_cell,
288 std::vector<double>(n_q_points));
289 data.edge_lambda_grads_2d.resize(lines_per_cell,
290 std::vector<double>(dim));
291 for (
unsigned int m = 0; m < lines_per_cell; ++m)
296 const unsigned int e1(
298 const unsigned int e2(
300 for (
unsigned int q = 0; q < n_q_points; ++q)
302 data.edge_sigma_values[m][q] =
303 data.sigma_imj_values[q][e2][e1];
304 data.edge_lambda_values[m][q] = lambda[q][e1] + lambda[q][e2];
307 data.edge_sigma_grads[m][edge_sigma_direction[m]] = -2.0;
309 data.edge_lambda_grads_2d[0] = {-1.0, 0.0};
310 data.edge_lambda_grads_2d[1] = {1.0, 0.0};
311 data.edge_lambda_grads_2d[2] = {0.0, -1.0};
312 data.edge_lambda_grads_2d[3] = {0.0, 1.0};
380 const unsigned int cell_type1_offset = n_line_dofs;
387 const unsigned int cell_type2_offset =
388 cell_type1_offset + degree * degree;
396 const unsigned int cell_type3_offset1 =
397 cell_type2_offset + degree * degree;
398 const unsigned int cell_type3_offset2 = cell_type3_offset1 + degree;
403 std::vector<Point<dim>> cell_points(n_q_points);
404 for (
unsigned int q = 0; q < n_q_points; ++q)
406 for (
unsigned int d = 0; d < dim; ++d)
408 cell_points[q][d] = 2.0 * p_list[q][d] - 1.0;
413 for (
unsigned int q = 0; q < n_q_points; ++q)
427 const unsigned int poly_length(
430 std::vector<std::vector<double>> polyx(
431 degree, std::vector<double>(poly_length));
432 std::vector<std::vector<double>> polyy(
433 degree, std::vector<double>(poly_length));
434 for (
unsigned int i = 0; i < degree; ++i)
439 IntegratedLegendrePolynomials[i + 2].value(
440 cell_points[q][0], polyx[i]);
441 IntegratedLegendrePolynomials[i + 2].value(
442 cell_points[q][1], polyy[i]);
447 for (
unsigned int j = 0; j < degree; ++j)
449 const unsigned int shift_j(j * degree);
450 for (
unsigned int i = 0; i < degree; ++i)
452 const unsigned int shift_ij(i + shift_j);
455 const unsigned int dof_index1(cell_type1_offset +
457 data.shape_values[dof_index1][q][0] =
458 2.0 * polyx[i][1] * polyy[j][0];
459 data.shape_values[dof_index1][q][1] =
460 2.0 * polyx[i][0] * polyy[j][1];
463 const unsigned int dof_index2(cell_type2_offset +
465 data.shape_values[dof_index2][q][0] =
466 data.shape_values[dof_index1][q][0];
467 data.shape_values[dof_index2][q][1] =
468 -1.0 * data.shape_values[dof_index1][q][1];
471 const unsigned int dof_index3_1(cell_type3_offset1 +
473 data.shape_values[dof_index3_1][q][0] = polyy[j][0];
474 data.shape_values[dof_index3_1][q][1] = 0.0;
476 const unsigned int dof_index3_2(cell_type3_offset2 +
478 data.shape_values[dof_index3_2][q][0] = 0.0;
479 data.shape_values[dof_index3_2][q][1] = polyx[j][0];
484 for (
unsigned int j = 0; j < degree; ++j)
486 const unsigned int shift_j(j * degree);
487 for (
unsigned int i = 0; i < degree; ++i)
489 const unsigned int shift_ij(i + shift_j);
492 const unsigned int dof_index1(cell_type1_offset +
494 data.shape_grads[dof_index1][q][0][0] =
495 4.0 * polyx[i][2] * polyy[j][0];
496 data.shape_grads[dof_index1][q][0][1] =
497 4.0 * polyx[i][1] * polyy[j][1];
498 data.shape_grads[dof_index1][q][1][0] =
499 data.shape_grads[dof_index1][q][0][1];
500 data.shape_grads[dof_index1][q][1][1] =
501 4.0 * polyx[i][0] * polyy[j][2];
504 const unsigned int dof_index2(cell_type2_offset +
506 data.shape_grads[dof_index2][q][0][0] =
507 data.shape_grads[dof_index1][q][0][0];
508 data.shape_grads[dof_index2][q][0][1] =
509 data.shape_grads[dof_index1][q][0][1];
510 data.shape_grads[dof_index2][q][1][0] =
511 -1.0 * data.shape_grads[dof_index1][q][1][0];
512 data.shape_grads[dof_index2][q][1][1] =
513 -1.0 * data.shape_grads[dof_index1][q][1][1];
516 const unsigned int dof_index3_1(cell_type3_offset1 +
518 data.shape_grads[dof_index3_1][q][0][0] = 0.0;
519 data.shape_grads[dof_index3_1][q][0][1] =
521 data.shape_grads[dof_index3_1][q][1][0] = 0.0;
522 data.shape_grads[dof_index3_1][q][1][1] = 0.0;
524 const unsigned int dof_index3_2(cell_type3_offset2 +
526 data.shape_grads[dof_index3_2][q][0][0] = 0.0;
527 data.shape_grads[dof_index3_2][q][0][1] = 0.0;
528 data.shape_grads[dof_index3_2][q][1][0] =
530 data.shape_grads[dof_index3_2][q][1][1] = 0.0;
541 std::vector<std::vector<double>> sigma(
542 n_q_points, std::vector<double>(lines_per_cell));
543 std::vector<std::vector<double>> lambda(
544 n_q_points, std::vector<double>(lines_per_cell));
545 for (
unsigned int q = 0; q < n_q_points; ++q)
547 sigma[q][0] = (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]) +
550 p_list[q][0] + (1.0 - p_list[q][1]) + (1 - p_list[q][2]);
552 (1.0 - p_list[q][0]) + p_list[q][1] + (1 - p_list[q][2]);
553 sigma[q][3] = p_list[q][0] + p_list[q][1] + (1 - p_list[q][2]);
555 (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]) + p_list[q][2];
556 sigma[q][5] = p_list[q][0] + (1.0 - p_list[q][1]) + p_list[q][2];
557 sigma[q][6] = (1.0 - p_list[q][0]) + p_list[q][1] + p_list[q][2];
558 sigma[q][7] = p_list[q][0] + p_list[q][1] + p_list[q][2];
560 lambda[q][0] = (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]) *
561 (1.0 - p_list[q][2]);
563 p_list[q][0] * (1.0 - p_list[q][1]) * (1.0 - p_list[q][2]);
565 (1.0 - p_list[q][0]) * p_list[q][1] * (1.0 - p_list[q][2]);
566 lambda[q][3] = p_list[q][0] * p_list[q][1] * (1.0 - p_list[q][2]);
568 (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]) * p_list[q][2];
569 lambda[q][5] = p_list[q][0] * (1.0 - p_list[q][1]) * p_list[q][2];
570 lambda[q][6] = (1.0 - p_list[q][0]) * p_list[q][1] * p_list[q][2];
571 lambda[q][7] = p_list[q][0] * p_list[q][1] * p_list[q][2];
575 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
577 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
579 data.sigma_imj_values[q][i][j] =
580 sigma[q][i] - sigma[q][j];
613 int sigma_imj_sign[vertices_per_cell][vertices_per_cell];
614 unsigned int sigma_imj_component[vertices_per_cell]
617 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
619 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
626 sigma_imj_sign[i][j] = (i < j) ? -1 : 1;
627 sigma_imj_sign[i][j] = (i == j) ? 0 : sigma_imj_sign[i][j];
631 sigma_imj_component[i][j] = 0;
632 for (
unsigned int d = 0; d < dim; ++d)
635 sigma_comp_signs[i][d] - sigma_comp_signs[j][d];
640 sigma_imj_component[i][j] = d;
647 data.sigma_imj_grads[i][j][sigma_imj_component[i][j]] =
648 2.0 * sigma_imj_sign[i][j];
655 data.edge_sigma_values.resize(lines_per_cell);
656 data.edge_lambda_values.resize(lines_per_cell);
657 data.edge_sigma_grads.resize(lines_per_cell);
658 data.edge_lambda_grads_3d.resize(lines_per_cell);
659 data.edge_lambda_gradgrads_3d.resize(lines_per_cell);
660 for (
unsigned int m = 0; m < lines_per_cell; ++m)
662 data.edge_sigma_values[m].resize(n_q_points);
663 data.edge_lambda_values[m].resize(n_q_points);
666 data.edge_sigma_grads[m].resize(dim);
668 data.edge_lambda_grads_3d[m].resize(n_q_points);
669 for (
unsigned int q = 0; q < n_q_points; ++q)
671 data.edge_lambda_grads_3d[m][q].resize(dim);
675 data.edge_lambda_gradgrads_3d[m].resize(dim);
676 for (
unsigned int d = 0; d < dim; ++d)
678 data.edge_lambda_gradgrads_3d[m][d].resize(dim);
685 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2};
687 for (
unsigned int m = 0; m < lines_per_cell; ++m)
692 const unsigned int e1(
694 const unsigned int e2(
697 for (
unsigned int q = 0; q < n_q_points; ++q)
699 data.edge_sigma_values[m][q] =
700 data.sigma_imj_values[q][e2][e1];
701 data.edge_lambda_values[m][q] = lambda[q][e1] + lambda[q][e2];
704 data.edge_sigma_grads[m][edge_sigma_direction[m]] = -2.0;
707 for (
unsigned int q = 0; q < n_q_points; ++q)
709 double x(p_list[q][0]);
710 double y(p_list[q][1]);
711 double z(p_list[q][2]);
712 data.edge_lambda_grads_3d[0][q] = {z - 1.0, 0.0, x - 1.0};
713 data.edge_lambda_grads_3d[1][q] = {1.0 - z, 0.0, -x};
714 data.edge_lambda_grads_3d[2][q] = {0.0, z - 1.0, y - 1.0};
715 data.edge_lambda_grads_3d[3][q] = {0.0, 1.0 - z, -y};
716 data.edge_lambda_grads_3d[4][q] = {-z, 0.0, 1.0 - x};
717 data.edge_lambda_grads_3d[5][q] = {z, 0.0, x};
718 data.edge_lambda_grads_3d[6][q] = {0.0, -z, 1.0 - y};
719 data.edge_lambda_grads_3d[7][q] = {0.0, z, y};
720 data.edge_lambda_grads_3d[8][q] = {y - 1.0, x - 1.0, 0.0};
721 data.edge_lambda_grads_3d[9][q] = {1.0 - y, -x, 0.0};
722 data.edge_lambda_grads_3d[10][q] = {-y, 1.0 - x, 0.0};
723 data.edge_lambda_grads_3d[11][q] = {y, x, 0.0};
753 for (
unsigned int m = 0; m < lines_per_cell; ++m)
755 data.edge_lambda_gradgrads_3d[m][edge_lambda_directions[m][0]]
756 [edge_lambda_directions[m][1]] =
758 data.edge_lambda_gradgrads_3d[m][edge_lambda_directions[m][1]]
759 [edge_lambda_directions[m][0]] =
767 data.face_lambda_values.resize(faces_per_cell);
768 data.face_lambda_grads.resize(faces_per_cell);
770 for (
unsigned int m = 0; m < faces_per_cell; ++m)
772 data.face_lambda_values[m].resize(n_q_points);
773 data.face_lambda_grads[m].resize(3);
776 for (
unsigned int q = 0; q < n_q_points; ++q)
778 double x(p_list[q][0]);
779 double y(p_list[q][1]);
780 double z(p_list[q][2]);
781 data.face_lambda_values[0][q] = 1.0 - x;
782 data.face_lambda_values[1][q] = x;
783 data.face_lambda_values[2][q] = 1.0 - y;
784 data.face_lambda_values[3][q] = y;
785 data.face_lambda_values[4][q] = 1.0 - z;
786 data.face_lambda_values[5][q] = z;
789 data.face_lambda_grads[0] = {-1.0, 0.0, 0.0};
790 data.face_lambda_grads[1] = {1.0, 0.0, 0.0};
791 data.face_lambda_grads[2] = {0.0, -1.0, 0.0};
792 data.face_lambda_grads[3] = {0.0, 1.0, 0.0};
793 data.face_lambda_grads[4] = {0.0, 0.0, -1.0};
794 data.face_lambda_grads[5] = {0.0, 0.0, 1.0};
807 const unsigned int cell_type1_offset(n_line_dofs +
820 const unsigned int cell_type2_offset1(
821 cell_type1_offset + degree * degree * degree);
822 const unsigned int cell_type2_offset2(
823 cell_type2_offset1 + degree * degree * degree);
833 const unsigned int cell_type3_offset1(
834 cell_type2_offset2 + degree * degree * degree);
835 const unsigned int cell_type3_offset2(cell_type3_offset1 +
837 const unsigned int cell_type3_offset3(cell_type3_offset2 +
841 std::vector<Point<dim>> cell_points(n_q_points);
842 for (
unsigned int q = 0; q < n_q_points; ++q)
844 for (
unsigned int d = 0; d < dim; ++d)
846 cell_points[q][d] = 2.0 * p_list[q][d] - 1.0;
853 const unsigned int poly_length(
856 for (
unsigned int q = 0; q < n_q_points; ++q)
864 std::vector<std::vector<double>> polyx(
865 degree, std::vector<double>(poly_length));
866 std::vector<std::vector<double>> polyy(
867 degree, std::vector<double>(poly_length));
868 std::vector<std::vector<double>> polyz(
869 degree, std::vector<double>(poly_length));
870 for (
unsigned int i = 0; i < degree; ++i)
873 IntegratedLegendrePolynomials[i + 2].value(
874 cell_points[q][0], polyx[i]);
875 IntegratedLegendrePolynomials[i + 2].value(
876 cell_points[q][1], polyy[i]);
877 IntegratedLegendrePolynomials[i + 2].value(
878 cell_points[q][2], polyz[i]);
883 for (
unsigned int k = 0; k < degree; ++k)
885 const unsigned int shift_k(k * degree * degree);
886 const unsigned int shift_j(
889 for (
unsigned int j = 0; j < degree; ++j)
891 const unsigned int shift_jk(j * degree +
893 for (
unsigned int i = 0; i < degree; ++i)
895 const unsigned int shift_ijk(shift_jk +
899 const unsigned int dof_index1(
900 cell_type1_offset + shift_ijk);
902 data.shape_values[dof_index1][q][0] =
903 2.0 * polyx[i][1] * polyy[j][0] *
905 data.shape_values[dof_index1][q][1] =
906 2.0 * polyx[i][0] * polyy[j][1] *
908 data.shape_values[dof_index1][q][2] =
909 2.0 * polyx[i][0] * polyy[j][0] *
913 const unsigned int dof_index2_1(
914 cell_type2_offset1 + shift_ijk);
915 const unsigned int dof_index2_2(
916 cell_type2_offset2 + shift_ijk);
918 data.shape_values[dof_index2_1][q][0] =
919 data.shape_values[dof_index1][q][0];
920 data.shape_values[dof_index2_1][q][1] =
922 data.shape_values[dof_index1][q][1];
923 data.shape_values[dof_index2_1][q][2] =
924 data.shape_values[dof_index1][q][2];
926 data.shape_values[dof_index2_2][q][0] =
927 data.shape_values[dof_index1][q][0];
928 data.shape_values[dof_index2_2][q][1] =
930 data.shape_values[dof_index1][q][1];
931 data.shape_values[dof_index2_2][q][2] =
933 data.shape_values[dof_index1][q][2];
937 const unsigned int shift_ij(
940 const unsigned int dof_index3_1(
941 cell_type3_offset1 + shift_ij);
942 const unsigned int dof_index3_2(
943 cell_type3_offset2 + shift_ij);
944 const unsigned int dof_index3_3(
945 cell_type3_offset3 + shift_ij);
947 data.shape_values[dof_index3_1][q][0] =
948 polyy[j][0] * polyz[k][0];
949 data.shape_values[dof_index3_1][q][1] = 0.0;
950 data.shape_values[dof_index3_1][q][2] = 0.0;
952 data.shape_values[dof_index3_2][q][0] = 0.0;
953 data.shape_values[dof_index3_2][q][1] =
954 polyx[j][0] * polyz[k][0];
955 data.shape_values[dof_index3_2][q][2] = 0.0;
957 data.shape_values[dof_index3_3][q][0] = 0.0;
958 data.shape_values[dof_index3_3][q][1] = 0.0;
959 data.shape_values[dof_index3_3][q][2] =
960 polyx[j][0] * polyy[k][0];
966 for (
unsigned int k = 0; k < degree; ++k)
968 const unsigned int shift_k(k * degree * degree);
969 const unsigned int shift_j(
972 for (
unsigned int j = 0; j < degree; ++j)
974 const unsigned int shift_jk(j * degree +
976 for (
unsigned int i = 0; i < degree; ++i)
978 const unsigned int shift_ijk(shift_jk +
982 const unsigned int dof_index1(
983 cell_type1_offset + shift_ijk);
985 data.shape_grads[dof_index1][q][0][0] =
986 4.0 * polyx[i][2] * polyy[j][0] *
988 data.shape_grads[dof_index1][q][0][1] =
989 4.0 * polyx[i][1] * polyy[j][1] *
991 data.shape_grads[dof_index1][q][0][2] =
992 4.0 * polyx[i][1] * polyy[j][0] *
995 data.shape_grads[dof_index1][q][1][0] =
996 data.shape_grads[dof_index1][q][0][1];
997 data.shape_grads[dof_index1][q][1][1] =
998 4.0 * polyx[i][0] * polyy[j][2] *
1000 data.shape_grads[dof_index1][q][1][2] =
1001 4.0 * polyx[i][0] * polyy[j][1] *
1004 data.shape_grads[dof_index1][q][2][0] =
1005 data.shape_grads[dof_index1][q][0][2];
1006 data.shape_grads[dof_index1][q][2][1] =
1007 data.shape_grads[dof_index1][q][1][2];
1008 data.shape_grads[dof_index1][q][2][2] =
1009 4.0 * polyx[i][0] * polyy[j][0] *
1013 const unsigned int dof_index2_1(
1014 cell_type2_offset1 + shift_ijk);
1015 const unsigned int dof_index2_2(
1016 cell_type2_offset2 + shift_ijk);
1018 for (
unsigned int d = 0; d < dim; ++d)
1020 data.shape_grads[dof_index2_1][q][0]
1023 .shape_grads[dof_index1][q][0][d];
1024 data.shape_grads[dof_index2_1][q][1]
1028 .shape_grads[dof_index1][q][1][d];
1029 data.shape_grads[dof_index2_1][q][2]
1032 .shape_grads[dof_index1][q][2][d];
1034 data.shape_grads[dof_index2_2][q][0]
1037 .shape_grads[dof_index1][q][0][d];
1038 data.shape_grads[dof_index2_2][q][1]
1042 .shape_grads[dof_index1][q][1][d];
1043 data.shape_grads[dof_index2_2][q][2]
1047 .shape_grads[dof_index1][q][2][d];
1052 const unsigned int shift_ij(
1055 const unsigned int dof_index3_1(
1056 cell_type3_offset1 + shift_ij);
1057 const unsigned int dof_index3_2(
1058 cell_type3_offset2 + shift_ij);
1059 const unsigned int dof_index3_3(
1060 cell_type3_offset3 + shift_ij);
1061 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1063 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1065 data.shape_grads[dof_index3_1][q][d1]
1067 data.shape_grads[dof_index3_2][q][d1]
1069 data.shape_grads[dof_index3_3][q][d1]
1073 data.shape_grads[dof_index3_1][q][0][1] =
1074 2.0 * polyy[j][1] * polyz[k][0];
1075 data.shape_grads[dof_index3_1][q][0][2] =
1076 2.0 * polyy[j][0] * polyz[k][1];
1078 data.shape_grads[dof_index3_2][q][1][0] =
1079 2.0 * polyx[j][1] * polyz[k][0];
1080 data.shape_grads[dof_index3_2][q][1][2] =
1081 2.0 * polyx[j][0] * polyz[k][1];
1083 data.shape_grads[dof_index3_3][q][2][0] =
1084 2.0 * polyx[j][1] * polyy[k][0];
1085 data.shape_grads[dof_index3_3][q][2][1] =
1086 2.0 * polyx[j][0] * polyy[k][1];
1103 template <
int dim,
int spacedim>
1124 const unsigned int n_q_points = quadrature.
size();
1129 this->dofs_per_cell));
1135 const unsigned int degree(
1140 const unsigned int vertices_per_line(2);
1144 std::vector<std::vector<unsigned int>> edge_order(
1145 lines_per_cell, std::vector<unsigned int>(vertices_per_line));
1157 std::vector<int> edge_sign(lines_per_cell);
1158 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1160 unsigned int v0_loc =
1162 unsigned int v1_loc =
1164 unsigned int v0_glob = cell->vertex_index(v0_loc);
1165 unsigned int v1_glob = cell->vertex_index(v1_loc);
1167 if (v0_glob > v1_glob)
1170 edge_sign[m] = -1.0;
1214 std::vector<std::vector<double>> edge_sigma_values(
1216 std::vector<std::vector<double>> edge_sigma_grads(
1219 std::vector<std::vector<double>> edge_lambda_values(
1221 std::vector<std::vector<double>> edge_lambda_grads(
1225 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1227 std::transform(edge_sigma_values[m].begin(),
1228 edge_sigma_values[m].end(),
1229 edge_sigma_values[m].begin(),
1230 [&](
const double edge_sigma_value) {
1231 return edge_sign[m] * edge_sigma_value;
1234 std::transform(edge_sigma_grads[m].begin(),
1235 edge_sigma_grads[m].end(),
1236 edge_sigma_grads[m].begin(),
1237 [&](
const double edge_sigma_grad) {
1238 return edge_sign[m] * edge_sigma_grad;
1248 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1250 const unsigned int shift_m(m * this->dofs_per_line);
1251 for (
unsigned int q = 0; q < n_q_points; ++q)
1254 std::vector<std::vector<double>> poly(
1255 degree, std::vector<double>(poly_length));
1256 for (
unsigned int i = 1; i < degree + 1; ++i)
1261 IntegratedLegendrePolynomials[i + 1].value(
1262 edge_sigma_values[m][q], poly[i - 1]);
1267 for (
unsigned int d = 0; d < dim; ++d)
1270 0.5 * edge_sigma_grads[m][d] *
1271 edge_lambda_values[m][q];
1274 for (
unsigned int i = 1; i < degree + 1; ++i)
1276 const unsigned int poly_index = i - 1;
1277 const unsigned int dof_index(i + shift_m);
1278 for (
unsigned int d = 0; d < dim; ++d)
1281 edge_sigma_grads[m][d] *
1282 poly[poly_index][1] *
1283 edge_lambda_values[m][q] +
1284 poly[poly_index][0] *
1285 edge_lambda_grads[m][d];
1292 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1294 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1299 0.5 * edge_sigma_grads[m][d1] *
1300 edge_lambda_grads[m][d2];
1304 for (
unsigned int i = 1; i < degree + 1; ++i)
1306 const unsigned int poly_index = i - 1;
1307 const unsigned int dof_index(i + shift_m);
1310 edge_sigma_grads[m][0] *
1311 edge_sigma_grads[m][0] *
1312 edge_lambda_values[m][q] * poly[poly_index][2];
1315 (edge_sigma_grads[m][0] *
1316 edge_lambda_grads[m][1] +
1317 edge_sigma_grads[m][1] *
1318 edge_lambda_grads[m][0]) *
1319 poly[poly_index][1];
1325 edge_sigma_grads[m][1] *
1326 edge_sigma_grads[m][1] *
1327 edge_lambda_values[m][q] * poly[poly_index][2];
1342 std::vector<int> edge_sign(lines_per_cell);
1343 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1345 unsigned int v0_loc =
1347 unsigned int v1_loc =
1349 unsigned int v0_glob = cell->vertex_index(v0_loc);
1350 unsigned int v1_glob = cell->vertex_index(v1_loc);
1352 if (v0_glob > v1_glob)
1355 edge_sign[m] = -1.0;
1401 std::vector<std::vector<double>> edge_sigma_values(
1403 std::vector<std::vector<double>> edge_lambda_values(
1405 std::vector<std::vector<double>> edge_sigma_grads(
1407 std::vector<std::vector<std::vector<double>>> edge_lambda_grads(
1409 std::vector<std::vector<std::vector<double>>>
1413 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1415 std::transform(edge_sigma_values[m].begin(),
1416 edge_sigma_values[m].end(),
1417 edge_sigma_values[m].begin(),
1418 [&](
const double edge_sigma_value) {
1419 return edge_sign[m] * edge_sigma_value;
1421 std::transform(edge_sigma_grads[m].begin(),
1422 edge_sigma_grads[m].end(),
1423 edge_sigma_grads[m].begin(),
1424 [&](
const double edge_sigma_grad) {
1425 return edge_sign[m] * edge_sigma_grad;
1435 std::vector<std::vector<double>> poly(
1436 degree, std::vector<double>(poly_length));
1437 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1439 const unsigned int shift_m(m * this->dofs_per_line);
1440 for (
unsigned int q = 0; q < n_q_points; ++q)
1445 for (
unsigned int i = 0; i < degree; ++i)
1447 IntegratedLegendrePolynomials[i + 2].value(
1448 edge_sigma_values[m][q], poly[i]);
1454 for (
unsigned int d = 0; d < dim; ++d)
1457 0.5 * edge_sigma_grads[m][d] *
1458 edge_lambda_values[m][q];
1462 for (
unsigned int i = 0; i < degree; ++i)
1464 const unsigned int dof_index(i + 1 + shift_m);
1465 for (
unsigned int d = 0; d < dim; ++d)
1468 edge_sigma_grads[m][d] * poly[i][1] *
1469 edge_lambda_values[m][q] +
1470 poly[i][0] * edge_lambda_grads[m][q][d];
1478 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1480 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1483 0.5 * edge_sigma_grads[m][d1] *
1484 edge_lambda_grads[m][q][d2];
1489 for (
unsigned int i = 0; i < degree; ++i)
1491 const unsigned int dof_index(i + 1 + shift_m);
1493 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1495 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1499 edge_sigma_grads[m][d1] *
1500 edge_sigma_grads[m][d2] *
1502 edge_lambda_values[m][q] +
1503 (edge_sigma_grads[m][d1] *
1504 edge_lambda_grads[m][q][d2] +
1505 edge_sigma_grads[m][d2] *
1506 edge_lambda_grads[m][q][d1]) *
1508 edge_lambda_gradgrads_3d[m][d1]
1528 template <
int dim,
int spacedim>
1548 const unsigned int degree(
1559 const unsigned int n_q_points = quadrature.
size();
1564 this->dofs_per_cell));
1571 const unsigned int vertices_per_face(
1576 const unsigned int n_line_dofs =
1580 std::vector<std::vector<unsigned int>> face_orientation(
1581 faces_per_cell, std::vector<unsigned int>(vertices_per_face));
1591 {1, 2}, {0, 3}, {0, 3}, {1, 2}};
1593 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1597 unsigned int current_max = 0;
1598 unsigned int current_glob = cell->vertex_index(
1600 for (
unsigned int v = 1; v < vertices_per_face; ++v)
1607 current_glob = cell->vertex_index(
1611 face_orientation[m][0] =
1616 m, vertex_opposite_on_face[current_max]);
1621 m, vertices_adjacent_on_face[current_max][0])) >
1623 m, vertices_adjacent_on_face[current_max][1])))
1625 face_orientation[m][1] =
1627 m, vertices_adjacent_on_face[current_max][0]);
1628 face_orientation[m][3] =
1630 m, vertices_adjacent_on_face[current_max][1]);
1634 face_orientation[m][1] =
1636 m, vertices_adjacent_on_face[current_max][1]);
1637 face_orientation[m][3] =
1639 m, vertices_adjacent_on_face[current_max][0]);
1645 std::vector<std::vector<double>> face_xi_values(
1646 faces_per_cell, std::vector<double>(n_q_points));
1647 std::vector<std::vector<double>> face_xi_grads(
1648 faces_per_cell, std::vector<double>(dim));
1649 std::vector<std::vector<double>> face_eta_values(
1650 faces_per_cell, std::vector<double>(n_q_points));
1651 std::vector<std::vector<double>> face_eta_grads(
1652 faces_per_cell, std::vector<double>(dim));
1654 std::vector<std::vector<double>> face_lambda_values(
1655 faces_per_cell, std::vector<double>(n_q_points));
1656 std::vector<std::vector<double>> face_lambda_grads(
1657 faces_per_cell, std::vector<double>(dim));
1658 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1660 for (
unsigned int q = 0; q < n_q_points; ++q)
1662 face_xi_values[m][q] =
1664 [face_orientation[m][1]];
1665 face_eta_values[m][q] =
1667 [face_orientation[m][3]];
1670 for (
unsigned int d = 0; d < dim; ++d)
1672 face_xi_grads[m][d] =
1674 [face_orientation[m][1]][d];
1675 face_eta_grads[m][d] =
1677 [face_orientation[m][3]][d];
1684 std::vector<std::vector<double>> polyxi(
1685 degree, std::vector<double>(poly_length));
1686 std::vector<std::vector<double>> polyeta(
1687 degree, std::vector<double>(poly_length));
1690 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1692 const unsigned int shift_m(m * this->dofs_per_quad);
1700 const unsigned int face_type1_offset(n_line_dofs + shift_m);
1710 const unsigned int face_type2_offset(face_type1_offset +
1722 const unsigned int face_type3_offset1(face_type2_offset +
1724 const unsigned int face_type3_offset2(face_type3_offset1 +
1728 for (
unsigned int q = 0; q < n_q_points; ++q)
1737 for (
unsigned int i = 0; i < degree; ++i)
1740 IntegratedLegendrePolynomials[i + 2].value(
1741 face_xi_values[m][q], polyxi[i]);
1742 IntegratedLegendrePolynomials[i + 2].value(
1743 face_eta_values[m][q], polyeta[i]);
1748 for (
unsigned int j = 0; j < degree; ++j)
1750 const unsigned int shift_j(j * degree);
1751 for (
unsigned int i = 0; i < degree; ++i)
1753 const unsigned int shift_ij(shift_j + i);
1755 const unsigned int dof_index1(face_type1_offset +
1757 for (
unsigned int d = 0; d < dim; ++d)
1760 (face_xi_grads[m][d] * polyxi[i][1] *
1762 face_eta_grads[m][d] * polyxi[i][0] *
1764 face_lambda_values[m][q] +
1765 face_lambda_grads[m][d] * polyxi[i][0] *
1769 const unsigned int dof_index2(face_type2_offset +
1771 for (
unsigned int d = 0; d < dim; ++d)
1774 (face_xi_grads[m][d] * polyxi[i][1] *
1776 face_eta_grads[m][d] * polyxi[i][0] *
1778 face_lambda_values[m][q];
1782 const unsigned int dof_index3_1(face_type3_offset1 +
1784 const unsigned int dof_index3_2(face_type3_offset2 +
1786 for (
unsigned int d = 0; d < dim; ++d)
1789 face_xi_grads[m][d] * polyeta[j][0] *
1790 face_lambda_values[m][q];
1793 face_eta_grads[m][d] * polyxi[j][0] *
1794 face_lambda_values[m][q];
1800 for (
unsigned int j = 0; j < degree; ++j)
1802 const unsigned int shift_j(j * degree);
1803 for (
unsigned int i = 0; i < degree; ++i)
1805 const unsigned int shift_ij(shift_j + i);
1807 const unsigned int dof_index1(face_type1_offset +
1809 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1811 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1815 (face_xi_grads[m][d1] *
1816 face_xi_grads[m][d2] * polyxi[i][2] *
1818 (face_xi_grads[m][d1] *
1819 face_eta_grads[m][d2] +
1820 face_xi_grads[m][d2] *
1821 face_eta_grads[m][d1]) *
1822 polyxi[i][1] * polyeta[j][1] +
1823 face_eta_grads[m][d1] *
1824 face_eta_grads[m][d2] *
1825 polyxi[i][0] * polyeta[j][2]) *
1826 face_lambda_values[m][q] +
1827 (face_xi_grads[m][d2] * polyxi[i][1] *
1829 face_eta_grads[m][d2] * polyxi[i][0] *
1831 face_lambda_grads[m][d1] +
1832 (face_xi_grads[m][d1] * polyxi[i][1] *
1834 face_eta_grads[m][d1] * polyxi[i][0] *
1836 face_lambda_grads[m][d2];
1840 const unsigned int dof_index2(face_type2_offset +
1842 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1844 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1848 (face_xi_grads[m][d1] *
1849 face_xi_grads[m][d2] * polyxi[i][2] *
1851 (face_xi_grads[m][d1] *
1852 face_eta_grads[m][d2] -
1853 face_xi_grads[m][d2] *
1854 face_eta_grads[m][d1]) *
1855 polyxi[i][1] * polyeta[j][1] -
1856 face_eta_grads[m][d1] *
1857 face_eta_grads[m][d2] *
1858 polyxi[i][0] * polyeta[j][2]) *
1859 face_lambda_values[m][q] +
1860 (face_xi_grads[m][d1] * polyxi[i][1] *
1862 face_eta_grads[m][d1] * polyxi[i][0] *
1864 face_lambda_grads[m][d2];
1869 const unsigned int dof_index3_1(face_type3_offset1 +
1871 const unsigned int dof_index3_2(face_type3_offset2 +
1873 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1875 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1878 face_xi_grads[m][d1] *
1879 (face_eta_grads[m][d2] * polyeta[j][1] *
1880 face_lambda_values[m][q] +
1881 face_lambda_grads[m][d2] * polyeta[j][0]);
1884 face_eta_grads[m][d1] *
1885 (face_xi_grads[m][d2] * polyxi[j][1] *
1886 face_lambda_values[m][q] +
1887 face_lambda_grads[m][d2] * polyxi[j][0]);
1902 template <
int dim,
int spacedim>
1910 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
1917 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
1924 fill_edge_values(cell, quadrature, fe_data);
1925 if (dim == 3 && this->degree > 1)
1927 fill_face_values(cell, quadrature, fe_data);
1931 const unsigned int n_q_points = quadrature.
size();
1936 this->dofs_per_cell));
1945 std::vector<Tensor<1, dim>> transformed_shape_values(n_q_points);
1946 for (
unsigned int dof = 0; dof < this->dofs_per_cell; ++dof)
1948 const unsigned int first =
1950 this->get_nonzero_components(dof)
1951 .first_selected_component()];
1957 for (
unsigned int q = 0; q < n_q_points; ++q)
1959 for (
unsigned int d = 0; d < dim; ++d)
1962 transformed_shape_values[q][d];
1971 std::vector<Tensor<2, dim>> input(n_q_points);
1972 std::vector<Tensor<2, dim>> transformed_shape_grads(n_q_points);
1973 for (
unsigned int dof = 0; dof < this->dofs_per_cell; ++dof)
1975 for (
unsigned int q = 0; q < n_q_points; ++q)
1984 const unsigned int first =
1986 this->get_nonzero_components(dof)
1987 .first_selected_component()];
1989 for (
unsigned int q = 0; q < n_q_points; ++q)
1991 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1993 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1995 transformed_shape_grads[q][d1] -=
1997 mapping_data.jacobian_pushed_forward_grads[q][d2][d1];
2002 for (
unsigned int q = 0; q < n_q_points; ++q)
2004 for (
unsigned int d = 0; d < dim; ++d)
2007 transformed_shape_grads[q][d];
2014 template <
int dim,
int spacedim>
2018 const unsigned int face_no,
2022 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
2041 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
2048 fill_edge_values(cell,
2051 if (dim == 3 && this->degree > 1)
2053 fill_face_values(cell,
2059 const unsigned int n_q_points = quadrature.
size();
2062 cell->face_orientation(face_no),
2063 cell->face_flip(face_no),
2064 cell->face_rotation(face_no),
2071 std::vector<Tensor<1, dim>> transformed_shape_values(n_q_points);
2072 for (
unsigned int dof = 0; dof < this->dofs_per_cell; ++dof)
2081 const unsigned int first =
2083 this->get_nonzero_components(dof)
2084 .first_selected_component()];
2086 for (
unsigned int q = 0; q < n_q_points; ++q)
2088 for (
unsigned int d = 0; d < dim; ++d)
2091 transformed_shape_values[q][d];
2100 std::vector<Tensor<2, dim>> input(n_q_points);
2101 std::vector<Tensor<2, dim>> transformed_shape_grads(n_q_points);
2102 for (
unsigned int dof = 0; dof < this->dofs_per_cell; ++dof)
2104 for (
unsigned int q = 0; q < n_q_points; ++q)
2113 const unsigned int first =
2115 this->get_nonzero_components(dof)
2116 .first_selected_component()];
2118 for (
unsigned int q = 0; q < n_q_points; ++q)
2120 for (
unsigned int d1 = 0; d1 < dim; ++d1)
2122 for (
unsigned int d2 = 0; d2 < dim; ++d2)
2124 transformed_shape_grads[q][d1] -=
2126 mapping_data.jacobian_pushed_forward_grads[q][d2][d1];
2131 for (
unsigned int q = 0; q < n_q_points; ++q)
2133 for (
unsigned int d = 0; d < dim; ++d)
2136 transformed_shape_grads[q][d];
2143 template <
int dim,
int spacedim>
2147 const unsigned int ,
2148 const unsigned int ,
2152 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
2161 template <
int dim,
int spacedim>
2166 return update_once(flags) | update_each(flags);
2169 template <
int dim,
int spacedim>
2173 const bool values_once = (mapping_type ==
mapping_none);
2182 template <
int dim,
int spacedim>
2206 template <
int dim,
int spacedim>
2217 std::ostringstream namebuf;
2218 namebuf <<
"FE_NedelecSZ<" << dim <<
">(" << this->degree - 1 <<
")";
2220 return namebuf.str();
2223 template <
int dim,
int spacedim>
2224 std::unique_ptr<FiniteElement<dim, dim>>
2227 return std_cxx14::make_unique<FE_NedelecSZ<dim, spacedim>>(*this);
2230 template <
int dim,
int spacedim>
2231 std::vector<unsigned int>
2240 std::vector<unsigned int> dpo(dim + 1);
2242 dpo[1] = degree + 1;
2243 dpo[2] = 2 * degree * (degree + 1);
2246 dpo[3] = 3 * degree * degree * (degree + 1);
2251 template <
int dim,
int spacedim>
2260 return 2 * (degree + 1) * (degree + 2);
2263 return 3 * (degree + 1) * (degree + 2) * (degree + 2);
2273 template <
int dim,
int spacedim>
2278 IntegratedLegendrePolynomials =
2283 #include "fe_nedelec_sz.inst" 2285 DEAL_II_NAMESPACE_CLOSE
static std::vector< Polynomials::Polynomial< double > > generate_complete_basis(const unsigned int degree)
virtual void fill_fe_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const Mapping< dim, dim > &mapping, const typename Mapping< dim, dim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, dim > &mapping_data, const typename FiniteElement< dim, dim >::InternalDataBase &fedata, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, dim > &data) const override
std::vector< std::vector< double > > edge_lambda_grads_2d
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
static unsigned int face_to_cell_vertices(const unsigned int face, const unsigned int vertex, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false)
UpdateFlags update_once(const UpdateFlags flags) const
const std::vector< Point< dim > > & get_points() const
std::vector< std::vector< double > > face_lambda_values
void fill_edge_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const Quadrature< dim > &quadrature, const InternalData &fedata) const
static unsigned int line_to_cell_vertices(const unsigned int line, const unsigned int vertex)
std::vector< std::vector< double > > edge_sigma_values
const unsigned int degree
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
virtual void transform(const ArrayView< const Tensor< 1, dim >> &input, const MappingType type, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim >> &output) const =0
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
void fill_face_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const Quadrature< dim > &quadrature, const InternalData &fedata) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
virtual std::string get_name() const override
virtual void fill_fe_face_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, dim > &mapping, const typename Mapping< dim, dim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, dim > &mapping_data, const typename FiniteElement< dim, dim >::InternalDataBase &fedata, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, dim > &data) const override
std::vector< std::vector< DerivativeForm< 1, dim, dim > > > shape_grads
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
std::vector< std::vector< std::vector< double > > > edge_lambda_gradgrads_3d
#define Assert(cond, exc)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual void fill_fe_subface_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, dim > &mapping, const typename Mapping< dim, dim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, dim > &mapping_data, const typename FiniteElement< dim, dim >::InternalDataBase &fedata, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, dim > &data) const override
Abstract base class for mapping classes.
std::vector< std::vector< Tensor< 1, dim > > > shape_values
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
Second derivatives of shape functions.
virtual std::unique_ptr< FiniteElement< dim, dim > > clone() const override
unsigned int size() const
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
void create_polynomials(const unsigned int degree)
std::vector< std::vector< double > > edge_lambda_values
UpdateFlags update_each(const UpdateFlags flags) const
unsigned int n_components() const
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
Shape function gradients.
std::vector< std::vector< std::vector< double > > > edge_lambda_grads_3d
FE_NedelecSZ(const unsigned int degree)
std::vector< std::vector< double > > edge_sigma_grads
std::vector< std::vector< std::vector< double > > > sigma_imj_values
static ::ExceptionBase & ExcNotImplemented()
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
unsigned int n_components(const DoFHandler< dim, spacedim > &dh)
std::vector< std::vector< double > > face_lambda_grads
virtual std::unique_ptr< typename ::FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
std::vector< std::vector< std::vector< double > > > sigma_imj_grads
Covariant transformation.
unsigned int compute_num_dofs(const unsigned int degree) const
static ::ExceptionBase & ExcInternalError()
static DataSetDescriptor face(const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points)